Token Diamond Hands

 

Overview ERC-721

Total Supply:
99 DMND

Holders:
42 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DiamondHands

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-14
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

// Sources flattened with hardhat v2.9.4 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/IERC165.sol

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

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

// File @openzeppelin/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

// File @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

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

// File @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

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

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

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

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

// File @openzeppelin/contracts/utils/Address.sol

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

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

        return account.code.length > 0;
    }

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

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return 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/Context.sol

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

/**
 * @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/utils/Strings.sol

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

/**
 * @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/utils/introspection/ERC165.sol

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

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

// File @openzeppelin/contracts/token/ERC721/ERC721.sol

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string internal _name;

    // Token symbol
    string internal _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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 Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _beforeApprove(to, tokenId);
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
        _afterApprove(to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _beforeApprovalForAll(owner, operator, approved);
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
        _afterApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

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

    function _beforeApprove(address to, uint256 tokenId) internal virtual {}

    function _afterApprove(address to, uint256 tokenId) internal virtual {}

    function _beforeApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {}

    function _afterApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {}
}

// File @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

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

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

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

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

// File @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol

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

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File @openzeppelin/contracts/interfaces/IERC2981.sol

// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File @openzeppelin/contracts/token/common/ERC2981.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol

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

/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}

// File @openzeppelin/contracts/security/Pausable.sol

// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool internal _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Modifier to make a function override the current pause state
     */
    modifier overridePause() {
        bool wasPaused = paused();
        if (wasPaused) {
            _unpause();
        }
        _;
        if (wasPaused) {
            _pause();
        }
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol

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

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

// File @openzeppelin/contracts/access/IOwnable.sol

// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

interface IOwnable {
    function owner() external view returns (address);

    function pushOwnership(address newOwner) external;

    function pullOwnership() external;

    function renounceOwnership() external;

    function transferOwnership(address newOwner) external;
}

// File @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

/**
 * @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 IOwnable, Context {
    address private _owner;
    address private _newOwner;

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

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

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual override 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 Sets up a push of the ownership of the contract to the specified
     * address which must subsequently pull the ownership to accept it.
     */
    function pushOwnership(address newOwner) public virtual override onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipPushed(_owner, newOwner);
        _newOwner = newOwner;
    }

    /**
     * @dev Accepts the push of ownership of the contract. Must be called by
     * the new owner.
     */
    function pullOwnership() public virtual override {
        require(msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled(_owner, _newOwner);
        _owner = _newOwner;
    }

    /**
     * @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 override onlyOwner {
        _transferOwnership(address(0));
    }

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

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

// File contracts/libraries/Random.sol

// Brandon Lehmann <[email protected]>

library Random {
    /**
     * @dev Generates a random value within the range of the value
     */
    function randomize(uint256 value) internal view returns (uint256) {
        return randomizeWithEntropy(value, getEntropy(), value);
    }

    /**
     * @dev Generates a random value within the range of the specified maximum value
     */
    function randomize(uint256 value, uint256 maximumValue) internal view returns (uint256) {
        return randomizeWithEntropy(value, getEntropy(), maximumValue);
    }

    /**
     * @dev Generates a random value within the range of the value using the supplied entropy
     */
    function randomizeWithEntropy(uint256 value, bytes32 entropy) internal view returns (uint256) {
        return randomizeWithEntropy(value, entropy, value);
    }

    /**
     * @dev Generates a random value within the range of the specified maximum value using the supplied entropy
     */
    function randomizeWithEntropy(
        uint256 value,
        bytes32 entropy,
        uint256 maximumValue
    ) internal view returns (uint256) {
        return _getEntropy(value, entropy) % maximumValue;
    }

    /**
     * @dev Generates simple on-chain entropy
     */
    function getEntropy() internal view returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    address(this),
                    msg.sender,
                    block.coinbase,
                    block.number,
                    block.timestamp,
                    block.difficulty,
                    msg.data
                )
            );
    }

    /**
     * @dev Generates simple on-chain entropy that is seeded with the supplied entropy
     */
    function _getEntropy(uint256 value, bytes32 entropy) private view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(getEntropy(), value, entropy)));
    }
}

// File contracts/ClampedRandomizer/ClampedRandomizer.sol

abstract contract ClampedRandomizer {
    using Random for uint256;

    uint256 private _scopeIndex = 0; //Clamping cache for random TokenID generation in the anti-sniping algo
    uint256 private _scopeCap; //Size of initial randomized number pool & max generated value (zero indexed)
    mapping(uint256 => uint256) private _swappedIDs; //TokenID cache for random TokenID generation in the anti-sniping algo

    constructor(uint256 scopeCap) {
        _scopeCap = scopeCap;
    }

    function _setClampedScope(uint256 scopeCap) internal {
        require(scopeCap >= _scopeCap, "ClampedRandomizer: scopeCap must be >= currentScopeCap");
        _scopeCap = scopeCap;
    }

    function _generateClampedNonce() internal returns (uint256) {
        uint256 scope = _scopeCap - _scopeIndex;
        uint256 swap;
        uint256 result;
        // get random number bound by 2^256-2;
        uint256 i = type(uint256).max.randomize() % scope;
        //Setup the value to swap in for the selected number
        if (_swappedIDs[scope - 1] == 0) {
            swap = scope - 1;
        } else {
            swap = _swappedIDs[scope - 1];
        }
        //Select a random number, swap it out with an unselected one then shorten the selection range by 1
        if (_swappedIDs[i] == 0) {
            result = i;
            _swappedIDs[i] = swap;
        } else {
            result = _swappedIDs[i];
            _swappedIDs[i] = swap;
        }
        _scopeIndex++;
        return result;
    }
}

// File @openzeppelin/contracts/token/ERC20/IERC20.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File @openzeppelin/contracts/proxy/Clones.sol

// OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol)

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
        internal
        view
        returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

// File @openzeppelin/contracts/proxy/utils/Initializable.sol

// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol)

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
 * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
 * case an upgrade adds a module that needs to be initialized.
 *
 * For example:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * contract MyToken is ERC20Upgradeable {
 *     function initialize() initializer public {
 *         __ERC20_init("MyToken", "MTK");
 *     }
 * }
 * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
 *     function initializeV2() reinitializer(2) public {
 *         __ERC20Permit_init("MyToken");
 *     }
 * }
 * ```
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
 * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() {
 *     _disableInitializers();
 * }
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     * @custom:oz-retyped-from bool
     */
    uint8 private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Triggered when the contract has been initialized or reinitialized.
     */
    event Initialized(uint8 version);

    /**
     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
     */
    modifier initializer() {
        bool isTopLevelCall = _setInitializedVersion(1);
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(1);
        }
    }

    /**
     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
     * used to initialize parent contracts.
     *
     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
     * initialization step. This is essential to configure modules that are added through upgrades and that require
     * initialization.
     *
     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
     * a contract, executing them in the right order is up to the developer or operator.
     */
    modifier reinitializer(uint8 version) {
        bool isTopLevelCall = _setInitializedVersion(version);
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(version);
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} and {reinitializer} modifiers, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    /**
     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
     * through proxies.
     */
    function _disableInitializers() internal virtual {
        _setInitializedVersion(type(uint8).max);
    }

    function _setInitializedVersion(uint8 version) private returns (bool) {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level
        // of initializers, because in other contexts the contract may have been reentered.
        if (_initializing) {
            require(
                version == 1 && !Address.isContract(address(this)),
                "Initializable: contract is already initialized"
            );
            return false;
        } else {
            require(_initialized < version, "Initializable: contract is already initialized");
            _initialized = version;
            return true;
        }
    }

    modifier whenNotInitialized() {
        require(_initialized == 0, "Initializable: contract has been initialized");
        _;
    }

    modifier whenInitialized() {
        require(_initialized != 0, "Initializable: contract has not been initialized");
        _;
    }
}

// File contracts/interfaces/ICloneable.sol

interface ICloneable {
    function clone() external returns (address);

    function cloneDeterministic(bytes32 salt) external returns (address);

    function isClone() external view returns (bool);

    function predictDeterministicAddress(bytes32 salt) external view returns (address);

    function progenitor() external view returns (address);
}

// File contracts/Cloneable/Cloneable.sol

// Brandon Lehmann <[email protected]>

abstract contract Cloneable is ICloneable, Initializable {
    using Clones for address;

    event CloneDeployed(address indexed deployer, address indexed progenitor, address indexed clone, bytes32 salt);

    address public immutable progenitor;

    modifier isCloned() {
        require(address(this) != progenitor, "Cloneable: Contract is not a clone");
        _;
    }

    constructor() {
        progenitor = address(this);
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function _clone() internal returns (address instance) {
        instance = progenitor.clone();
        emit CloneDeployed(msg.sender, progenitor, instance, 0x0);
        _afterClone(msg.sender, progenitor, instance, 0x0);
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone() public virtual returns (address instance) {
        return _clone();
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function _cloneDeterministic(bytes32 salt) internal returns (address instance) {
        instance = progenitor.cloneDeterministic(salt);
        emit CloneDeployed(msg.sender, progenitor, instance, salt);
        _afterClone(msg.sender, progenitor, instance, salt);
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(bytes32 salt) public virtual returns (address instance) {
        return _cloneDeterministic(salt);
    }

    /**
     * @dev Returns if this contract is a clone
     */
    function isClone() public view returns (bool) {
        return address(this) != progenitor;
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(bytes32 salt) public view returns (address instance) {
        instance = progenitor.predictDeterministicAddress(salt);
    }

    /**
     * @dev hook that is ran after cloning
     */
    function _afterClone(
        address deployer,
        address _progenitor,
        address clone_,
        bytes32 salt
    ) internal virtual {}
}

// File contracts/interfaces/IPaymentSplitter.sol

interface IPaymentSplitter is ICloneable {
    struct PayeeInformation {
        address account;
        uint256 shares;
    }

    function initialize() external;

    function initialize(address[] memory payees, uint256[] memory shares_) external;

    function addPayee(address payee_, uint256 shares_) external;

    function count() external view returns (uint256);

    function totalShares() external view returns (uint256);

    function totalReleased() external view returns (uint256);

    function totalReleased(address token) external view returns (uint256);

    function shares(address account) external view returns (uint256);

    function released(address account) external view returns (uint256);

    function released(address token, address account) external view returns (uint256);

    function payee(uint256 index) external view returns (address);

    function payees() external view returns (PayeeInformation[] memory);

    function pending(address account) external view returns (uint256);

    function pending(address token, address account) external view returns (uint256);

    function releaseAll() external;

    function releaseAll(address token) external;

    function release(address account) external;

    function release(address token, address account) external;

    function transferOwnership(address newOwner) external;

    function VERSION() external view returns (uint256);
}

// File contracts/PaymentSplitter/PaymentSplitter.sol

// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is IPaymentSplitter, Cloneable, Ownable {
    using SafeERC20 for IERC20;

    uint256 public constant VERSION = 2022042601;

    event PayeeAdded(address account, uint256 shares);
    event PayeeUpdated(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(address indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(address => uint256) private _erc20TotalReleased;
    mapping(address => mapping(address => uint256)) private _erc20Released;

    constructor() {
        _transferOwnership(address(0));
    }

    /**
     * @dev Initializes the instance of `PaymentSplitter`
     *
     * Payees must be added via {addPayee} later
     */
    function initialize() public initializer {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Initializes the instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    function initialize(address[] memory payees_, uint256[] memory shares_) public initializer {
        require(payees_.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees_.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees_.length; i++) {
            _addOrUpdatePayee(payees_[i], shares_[i]);
        }

        _transferOwnership(_msgSender());
    }

    /**
     * @dev Adds another payee to the `PaymentSplitter` with the specified number of `shares`
     * for the `payee`
     *
     * `payee` must be non-zero and the payee must not already exist
     */
    function addPayee(address payee_, uint256 shares_) public onlyOwner whenInitialized {
        _addOrUpdatePayee(payee_, shares_);
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Returns the number of payees in the PaymentSplitter
     */
    function count() public view returns (uint256) {
        return _payees.length;
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(address token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(address token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Returns a list of the payees and their number of shares in the PaymentSplitter
     */
    function payees() public view returns (PayeeInformation[] memory) {
        PayeeInformation[] memory payees_ = new PayeeInformation[](_payees.length);

        for (uint256 i = 0; i < _payees.length; i++) {
            payees_[i] = PayeeInformation({ account: _payees[i], shares: _shares[_payees[i]] });
        }

        return payees_;
    }

    /**
     * @dev Returns amount currently pending distribution for the specified account
     */
    function pending(address account) public view returns (uint256) {
        if (_shares[account] == 0) {
            return 0;
        }

        uint256 totalReceived = address(this).balance + totalReleased();

        return _pendingPayment(account, totalReceived, released(account));
    }

    /**
     * @dev Returns amount of token currently pending distribution for the specified account
     */
    function pending(address token, address account) public view returns (uint256) {
        if (_shares[account] == 0) {
            return 0;
        }

        uint256 totalReceived = IERC20(token).balanceOf(address(this)) + totalReleased(token);

        return _pendingPayment(account, totalReceived, released(token, account));
    }

    /**
     * @dev Releases all funds due to all accounts in the PaymentSplitter
     */
    function releaseAll() public virtual {
        for (uint8 i = 0; i < _payees.length; i++) {
            release(_payees[i]);
        }
    }

    /**
     * @dev Releases all token funds due to all accounts in the PaymentSplitter
     */
    function releaseAll(address token) public {
        for (uint8 i = 0; i < _payees.length; i++) {
            release(token, _payees[i]);
        }
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address account) public {
        if (_shares[account] == 0) {
            return;
        }

        uint256 payment = pending(account);

        if (payment == 0) {
            return;
        }

        _released[account] += payment;
        _totalReleased += payment;

        (bool sent, ) = account.call{ value: payment }("");

        if (sent) {
            emit PaymentReleased(account, payment);
        }
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(address token, address account) public {
        if (_shares[account] == 0) {
            return;
        }

        uint256 payment = pending(token, account);

        if (payment == 0) {
            return;
        }

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        IERC20(token).safeTransfer(account, payment);

        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract or update an existing one
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addOrUpdatePayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        // changed to add or update
        // require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        if (_shares[account] == 0) {
            _payees.push(account);
            _shares[account] += shares_;
            _totalShares = _totalShares + shares_;
            emit PayeeAdded(account, shares_);
        } else {
            _shares[account] += shares_;
            _totalShares = _totalShares + shares_;
            emit PayeeUpdated(account, _shares[account]);
        }
    }

    /**
     * @dev Transfers the ownership of the instance to the specified address
     */
    function transferOwnership(address newOwner) public override(IPaymentSplitter, Ownable) onlyOwner {
        super._transferOwnership(newOwner);
    }
}

// File contracts/DiamondHandedKids/DiamondHandedKids.sol

contract DiamondHands is ERC721Enumerable, ERC721Royalty, ERC721Pausable, ClampedRandomizer, Ownable {
    using Strings for uint256;

    event ChangeMaxMint(uint256 indexed old, uint256 indexed _new);
    event ChangeMintPrice(uint256 indexed old, uint256 indexed _new);

    uint256 public constant MAX_SUPPLY = 99;
    uint96 public constant WHITELIST_DISCOUNT = 1500;
    uint256 public MAX_MINTS = 1;

    uint256 private _MINT_PRICE = 50 ether;
    string private BASE_URI = "ipfs://QmWvT1rUGeXp8keJuRdwNoMgcf56TERQ4QpKNZG5rdSXoj/";
    string private URI_EXTENSION = ".json";

    IERC721Enumerable public constant TOKEN = IERC721Enumerable(0x23767E07Dd081E2723964D8aBD65E425791155C5);
    IPaymentSplitter public immutable ROYALTIES_RECEIVER;

    /****** CONSTRUCTOR METHOD ******/

    constructor() ERC721("Diamond Hands", "DMND") ClampedRandomizer(MAX_SUPPLY) {
        ROYALTIES_RECEIVER = new PaymentSplitter();
        ROYALTIES_RECEIVER.initialize();
        ROYALTIES_RECEIVER.addPayee(_msgSender(), 20); // 20% to deployer
        ROYALTIES_RECEIVER.addPayee(0xd7b9076019656496474EC681D002b6A1582FE02a, 80); // 80% to owner
        ROYALTIES_RECEIVER.transferOwnership(address(0));

        _setDefaultRoyalty(address(ROYALTIES_RECEIVER), 500); // 5% royalties

        _pause();
    }

    receive() external payable {}

    /****** PUBLIC METHODS ******/

    function mint(uint256 count) public payable whenNotPaused {
        require(count != 0, "must mint at least one");
        require(count <= MAX_MINTS, "cannot mint more than max");
        require(count * MINT_PRICE() == msg.value, "caller supplied incorrect value");

        payable(0xd7b9076019656496474EC681D002b6A1582FE02a).transfer(msg.value);

        for (uint256 i = 0; i < count; i++) {
            _mintERC721(_msgSender());
        }
    }

    function MINT_PRICE() public view returns (uint256) {
        if (TOKEN.balanceOf(_msgSender()) > 0) {
            return _MINT_PRICE - ((_MINT_PRICE * WHITELIST_DISCOUNT) / 10_000);
        } else {
            return _MINT_PRICE;
        }
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return string(abi.encodePacked(BASE_URI, tokenId.toString(), URI_EXTENSION));
    }

    /****** MANAGEMENT METHODS ******/

    function mintPrice() public view onlyOwner returns (uint256) {
        return _MINT_PRICE;
    }

    function setBaseURI(string memory _base_uri) public onlyOwner {
        BASE_URI = _base_uri;
    }

    function setMaxMint(uint256 max) public onlyOwner {
        require(max >= 1, "maximum must be >= 1");
        uint256 old = MAX_MINTS;
        MAX_MINTS = max;
        emit ChangeMaxMint(old, max);
    }

    function setMintPrice(uint256 price) public onlyOwner {
        uint256 old = _MINT_PRICE;
        _MINT_PRICE = price;
        emit ChangeMintPrice(old, price);
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function withdraw() public onlyOwner {
        require(address(this).balance != 0, "contract has no balance");
        payable(0xd7b9076019656496474EC681D002b6A1582FE02a).transfer(address(this).balance);
    }

    /****** INTERNAL METHODS ******/

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        ROYALTIES_RECEIVER.releaseAll();

        super._afterTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721Royalty) {
        super._burn(tokenId);
    }

    function _mintERC721(address _to) internal returns (uint256) {
        require(totalSupply() + 1 <= MAX_SUPPLY, "mint completed");

        uint256 tokenId = _generateClampedNonce() + 1;

        _safeMint(_to, tokenId);

        return tokenId;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721Enumerable, ERC721Royalty, ERC721)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

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":"uint256","name":"old","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeMaxMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"old","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeMintPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTIES_RECEIVER","outputs":[{"internalType":"contract IPaymentSplitter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_DISCOUNT","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"pushOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_base_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600d5560016012556802b5e3af16b1880000601355610100604052603660a08181529062005c4360c0398051620000419160149160209091019062000507565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620000709160159162000507565b503480156200007e57600080fd5b50604080518082018252600d81526c4469616d6f6e642048616e647360981b6020808301918252835180850190945260048452631113539160e21b90840152815160639391620000d2916002919062000507565b508051620000e890600390602084019062000507565b5050600c805460ff1916905550600e55620001033362000315565b604051620001119062000596565b604051809103906000f0801580156200012e573d6000803e3d6000fd5b506001600160a01b031660808190526040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b1580156200017557600080fd5b505af11580156200018a573d6000803e3d6000fd5b505050506080516001600160a01b03166318f9b023620001af6200031160201b60201c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260146024820152604401600060405180830381600087803b158015620001f857600080fd5b505af11580156200020d573d6000803e3d6000fd5b50506080516040516318f9b02360e01b815273d7b9076019656496474ec681d002b6a1582fe02a6004820152605060248201526001600160a01b0390911692506318f9b0239150604401600060405180830381600087803b1580156200027257600080fd5b505af115801562000287573d6000803e3d6000fd5b505060805160405163f2fde38b60e01b8152600060048201526001600160a01b03909116925063f2fde38b9150602401600060405180830381600087803b158015620002d257600080fd5b505af1158015620002e7573d6000803e3d6000fd5b50505050620003016080516101f46200036760201b60201c565b6200030b6200046c565b620005f7565b3390565b601080546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620003db5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620004335760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620003d2565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b600c5460ff1615620004b45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620003d2565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620004ea3390565b6040516001600160a01b03909116815260200160405180910390a1565b8280546200051590620005bb565b90600052602060002090601f01602090048101928262000539576000855562000584565b82601f106200055457805160ff191683800117855562000584565b8280016001018555821562000584579182015b828111156200058457825182559160200191906001019062000567565b5062000592929150620005a4565b5090565b6122f7806200394c83390190565b5b80821115620005925760008155600101620005a5565b600181811c90821680620005d057607f821691505b602082108103620005f157634e487b7160e01b600052602260045260246000fd5b50919050565b6080516133326200061a6000396000818161060c01526120d801526133326000f3fe6080604052600436106102535760003560e01c806370a0823111610138578063b88d4fde116100b0578063cce132d11161007f578063e985e9c511610064578063e985e9c514610684578063f2fde38b146106cd578063f4a0a528146106ed57600080fd5b8063cce132d11461064e578063d39ce77c1461066457600080fd5b8063b88d4fde146105c5578063c002d23d146105e5578063c80c6c7f146105fa578063c87b56dd1461062e57600080fd5b806382fb4f221161010757806395d89b41116100ec57806395d89b411461057d578063a0712d6814610592578063a22cb465146105a557600080fd5b806382fb4f221461052c5780638da5cb5b1461055f57600080fd5b806370a08231146104ba578063715018a6146104da5780637ff28d3a146104ef57806382bfefc81461050457600080fd5b80633ccfd60b116101cb578063547520fe1161019a5780635c975abb1161017f5780635c975abb1461046d5780636352211e146104855780636817c76c146104a557600080fd5b8063547520fe1461042d57806355f804b31461044d57600080fd5b80633ccfd60b146103c35780633f4ba83a146103d857806342842e0e146103ed5780634f6ccce71461040d57600080fd5b806318160ddd116102225780632a55205a116102075780632a55205a1461034f5780632f745c591461038e57806332cb6b0c146103ae57600080fd5b806318160ddd1461031057806323b872dd1461032f57600080fd5b806301ffc9a71461025f57806306fdde0314610294578063081812fc146102b6578063095ea7b3146102ee57600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004612bbf565b61070d565b60405190151581526020015b60405180910390f35b3480156102a057600080fd5b506102a961071e565b60405161028b9190612c59565b3480156102c257600080fd5b506102d66102d1366004612c6c565b6107b0565b6040516001600160a01b03909116815260200161028b565b3480156102fa57600080fd5b5061030e610309366004612ca1565b61085b565b005b34801561031c57600080fd5b50600a545b60405190815260200161028b565b34801561033b57600080fd5b5061030e61034a366004612ccb565b61098c565b34801561035b57600080fd5b5061036f61036a366004612d07565b610a13565b604080516001600160a01b03909316835260208301919091520161028b565b34801561039a57600080fd5b506103216103a9366004612ca1565b610af0565b3480156103ba57600080fd5b50610321606381565b3480156103cf57600080fd5b5061030e610b98565b3480156103e457600080fd5b5061030e610c85565b3480156103f957600080fd5b5061030e610408366004612ccb565b610ce9565b34801561041957600080fd5b50610321610428366004612c6c565b610d04565b34801561043957600080fd5b5061030e610448366004612c6c565b610da8565b34801561045957600080fd5b5061030e610468366004612dec565b610e8c565b34801561047957600080fd5b50600c5460ff1661027f565b34801561049157600080fd5b506102d66104a0366004612c6c565b610efd565b3480156104b157600080fd5b50610321610f88565b3480156104c657600080fd5b506103216104d5366004612e35565b610fec565b3480156104e657600080fd5b5061030e611086565b3480156104fb57600080fd5b5061030e6110ea565b34801561051057600080fd5b506102d67323767e07dd081e2723964d8abd65e425791155c581565b34801561053857600080fd5b506105426105dc81565b6040516bffffffffffffffffffffffff909116815260200161028b565b34801561056b57600080fd5b506010546001600160a01b03166102d6565b34801561058957600080fd5b506102a96111e5565b61030e6105a0366004612c6c565b6111f4565b3480156105b157600080fd5b5061030e6105c0366004612e50565b6113b1565b3480156105d157600080fd5b5061030e6105e0366004612e8c565b6113bc565b3480156105f157600080fd5b5061032161144a565b34801561060657600080fd5b506102d67f000000000000000000000000000000000000000000000000000000000000000081565b34801561063a57600080fd5b506102a9610649366004612c6c565b61151e565b34801561065a57600080fd5b5061032160125481565b34801561067057600080fd5b5061030e61067f366004612e35565b6115e0565b34801561069057600080fd5b5061027f61069f366004612f08565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106d957600080fd5b5061030e6106e8366004612e35565b61172a565b3480156106f957600080fd5b5061030e610708366004612c6c565b611809565b60006107188261189c565b92915050565b60606002805461072d90612f3b565b80601f016020809104026020016040519081016040528092919081815260200182805461075990612f3b565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b031661083f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061086682610efd565b9050806001600160a01b0316836001600160a01b0316036108ef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610836565b336001600160a01b038216148061090b575061090b813361069f565b61097d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610836565b61098783836118a7565b505050565b610996338261192d565b610a085760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610836565b610987838383611a35565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16928201929092528291610ab45750604080518082019091526000546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b602081015160009061271090610ad8906bffffffffffffffffffffffff1687612fbd565b610ae29190613029565b915196919550909350505050565b6000610afb83610fec565b8210610b6f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610836565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b6010546001600160a01b03163314610bf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b47600003610c425760405162461bcd60e51b815260206004820152601760248201527f636f6e747261637420686173206e6f2062616c616e63650000000000000000006044820152606401610836565b60405173d7b9076019656496474ec681d002b6a1582fe02a904780156108fc02916000818181858888f19350505050158015610c82573d6000803e3d6000fd5b50565b6010546001600160a01b03163314610cdf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b610ce7611c2b565b565b610987838383604051806020016040528060008152506113bc565b6000610d0f600a5490565b8210610d835760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610836565b600a8281548110610d9657610d9661303d565b90600052602060002001549050919050565b6010546001600160a01b03163314610e025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b6001811015610e535760405162461bcd60e51b815260206004820152601460248201527f6d6178696d756d206d757374206265203e3d20310000000000000000000000006044820152606401610836565b6012805490829055604051829082907f44f9d330ebfd8cfd16d5120dbe7f84ba1c7a16ac742fb65ee99a0bb6c6c289ab90600090a35050565b6010546001600160a01b03163314610ee65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b8051610ef9906014906020840190612af8565b5050565b6000818152600460205260408120546001600160a01b0316806107185760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610836565b6010546000906001600160a01b03163314610fe55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b5060135490565b60006001600160a01b03821661106a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610836565b506001600160a01b031660009081526005602052604090205490565b6010546001600160a01b031633146110e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b610ce76000611cda565b6011546001600160a01b0316331461116a5760405162461bcd60e51b815260206004820152602260248201527f4f776e61626c653a206d757374206265206e6577206f776e657220746f20707560448201527f6c6c0000000000000000000000000000000000000000000000000000000000006064820152608401610836565b6011546010546040516001600160a01b0392831692909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d90600090a3601154601080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b60606003805461072d90612f3b565b600c5460ff16156112475760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610836565b806000036112975760405162461bcd60e51b815260206004820152601660248201527f6d757374206d696e74206174206c65617374206f6e65000000000000000000006044820152606401610836565b6012548111156112e95760405162461bcd60e51b815260206004820152601960248201527f63616e6e6f74206d696e74206d6f7265207468616e206d6178000000000000006044820152606401610836565b346112f261144a565b6112fc9083612fbd565b146113495760405162461bcd60e51b815260206004820152601f60248201527f63616c6c657220737570706c69656420696e636f72726563742076616c7565006044820152606401610836565b60405173d7b9076019656496474ec681d002b6a1582fe02a903480156108fc02916000818181858888f19350505050158015611389573d6000803e3d6000fd5b5060005b81811015610ef95761139e33611d44565b50806113a98161306c565b91505061138d565b610ef9338383611dcb565b6113c6338361192d565b6114385760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610836565b61144484848484611eb7565b50505050565b6000807323767e07dd081e2723964d8abd65e425791155c56370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e891906130a4565b1115610fe55760135461271090611502906105dc90612fbd565b61150c9190613029565b60135461151991906130bd565b905090565b6000818152600460205260409020546060906001600160a01b03166115ab5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610836565b60146115b683611f40565b60156040516020016115ca939291906131a4565b6040516020818303038152906040529050919050565b6010546001600160a01b0316331461163a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b6001600160a01b0381166116b65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610836565b6010546040516001600160a01b038084169216907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba90600090a3601180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6010546001600160a01b031633146117845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b6001600160a01b0381166118005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610836565b610c8281611cda565b6010546001600160a01b031633146118635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b6013805490829055604051829082907fc2f23fefd57d703960199118d1e818f3779d125bad455c2ef01e6a415b5c43bb90600090a35050565b600061071882612075565b600081815260066020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906118f482610efd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166119b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610836565b60006119c283610efd565b9050806001600160a01b0316846001600160a01b03161480611a0957506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b80611a2d5750836001600160a01b0316611a22846107b0565b6001600160a01b0316145b949350505050565b826001600160a01b0316611a4882610efd565b6001600160a01b031614611ac45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610836565b6001600160a01b038216611b3f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610836565b611b4a8383836120cb565b611b556000826118a7565b6001600160a01b0383166000908152600560205260408120805460019290611b7e9084906130bd565b90915550506001600160a01b0382166000908152600560205260408120805460019290611bac9084906131d7565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46109878383836120d6565b600c5460ff16611c7d5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610836565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b601080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006063611d51600a5490565b611d5c9060016131d7565b1115611daa5760405162461bcd60e51b815260206004820152600e60248201527f6d696e7420636f6d706c657465640000000000000000000000000000000000006044820152606401610836565b6000611db461214e565b611dbf9060016131d7565b90506107188382612259565b816001600160a01b0316836001600160a01b031603611e2c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610836565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ec2848484611a35565b611ece84848484612273565b6114445760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610836565b606081600003611f8357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611fad5780611f978161306c565b9150611fa69050600a83613029565b9150611f87565b60008167ffffffffffffffff811115611fc857611fc8612d29565b6040519080825280601f01601f191660200182016040528015611ff2576020820181803683370190505b5090505b8415611a2d576120076001836130bd565b9150612014600a866131ef565b61201f9060306131d7565b60f81b8183815181106120345761203461303d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061206e600a86613029565b9450611ff6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610718575061071882612432565b6109878383836124d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635be7fde86040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561213157600080fd5b505af1158015612145573d6000803e3d6000fd5b50505050505050565b600080600d54600e5461216191906130bd565b90506000806000836121927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612558565b61219c91906131ef565b9050600f60006121ad6001876130bd565b8152602001908152602001600020546000036121d5576121ce6001856130bd565b92506121f6565b600f60006121e46001876130bd565b81526020019081526020016000205492505b6000818152600f60205260408120549003612224576000818152600f6020526040902083905590508061223b565b6000818152600f6020526040902080549084905591505b600d805490600061224b8361306c565b909155509195945050505050565b610ef982826040518060200160405280600081525061256c565b60006001600160a01b0384163b15612427576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906122d0903390899088908890600401613203565b6020604051808303816000875af1925050508015612329575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123269181019061323f565b60015b6123dc573d808015612357576040519150601f19603f3d011682016040523d82523d6000602084013e61235c565b606091505b5080516000036123d45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610836565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611a2d565b506001949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806124c557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107185750610718826125f5565b6124df83838361268c565b600c5460ff16156109875760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c65207061757365640000000000000000000000000000000000000000006064820152608401610836565b600061071882612566612744565b84612781565b6125768383612798565b6125836000848484612273565b6109875760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610836565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061071857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610718565b6001600160a01b0383166126e7576126e281600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61270a565b816001600160a01b0316836001600160a01b03161461270a5761270a8382612906565b6001600160a01b03821661272157610987816129a3565b826001600160a01b0316826001600160a01b031614610987576109878282612a52565b600030334143424460003660405160200161276698979695949392919061325c565b60405160208183030381529060405280519060200120905090565b60008161278e8585612a96565b611a2d91906131ef565b6001600160a01b0382166127ee5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610836565b6000818152600460205260409020546001600160a01b0316156128535760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610836565b61285f600083836120cb565b6001600160a01b03821660009081526005602052604081208054600192906128889084906131d7565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610ef9600083836120d6565b6000600161291384610fec565b61291d91906130bd565b600083815260096020526040902054909150808214612970576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906129b5906001906130bd565b6000838152600b6020526040812054600a80549394509092849081106129dd576129dd61303d565b9060005260206000200154905080600a83815481106129fe576129fe61303d565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a805480612a3657612a366132cd565b6001900381819060005260206000200160009055905550505050565b6000612a5d83610fec565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6000612aa0612744565b604080516020810192909252810184905260608101839052608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b828054612b0490612f3b565b90600052602060002090601f016020900481019282612b265760008555612b6c565b82601f10612b3f57805160ff1916838001178555612b6c565b82800160010185558215612b6c579182015b82811115612b6c578251825591602001919060010190612b51565b50612b78929150612b7c565b5090565b5b80821115612b785760008155600101612b7d565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610c8257600080fd5b600060208284031215612bd157600080fd5b8135612bdc81612b91565b9392505050565b60005b83811015612bfe578181015183820152602001612be6565b838111156114445750506000910152565b60008151808452612c27816020860160208601612be3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612bdc6020830184612c0f565b600060208284031215612c7e57600080fd5b5035919050565b80356001600160a01b0381168114612c9c57600080fd5b919050565b60008060408385031215612cb457600080fd5b612cbd83612c85565b946020939093013593505050565b600080600060608486031215612ce057600080fd5b612ce984612c85565b9250612cf760208501612c85565b9150604084013590509250925092565b60008060408385031215612d1a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612d7357612d73612d29565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612db957612db9612d29565b81604052809350858152868686011115612dd257600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612dfe57600080fd5b813567ffffffffffffffff811115612e1557600080fd5b8201601f81018413612e2657600080fd5b611a2d84823560208401612d58565b600060208284031215612e4757600080fd5b612bdc82612c85565b60008060408385031215612e6357600080fd5b612e6c83612c85565b915060208301358015158114612e8157600080fd5b809150509250929050565b60008060008060808587031215612ea257600080fd5b612eab85612c85565b9350612eb960208601612c85565b925060408501359150606085013567ffffffffffffffff811115612edc57600080fd5b8501601f81018713612eed57600080fd5b612efc87823560208401612d58565b91505092959194509250565b60008060408385031215612f1b57600080fd5b612f2483612c85565b9150612f3260208401612c85565b90509250929050565b600181811c90821680612f4f57607f821691505b602082108103612f88577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ff557612ff5612f8e565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261303857613038612ffa565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361309d5761309d612f8e565b5060010190565b6000602082840312156130b657600080fd5b5051919050565b6000828210156130cf576130cf612f8e565b500390565b8054600090600181811c90808316806130ee57607f831692505b60208084108203613128577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561313c576001811461316b57613198565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613198565b60008881526020902060005b868110156131905781548b820152908501908301613177565b505084890196505b50505050505092915050565b60006131b082866130d4565b84516131c0818360208901612be3565b6131cc818301866130d4565b979650505050505050565b600082198211156131ea576131ea612f8e565b500190565b6000826131fe576131fe612ffa565b500690565b60006001600160a01b038087168352808616602084015250836040830152608060608301526132356080830184612c0f565b9695505050505050565b60006020828403121561325157600080fd5b8151612bdc81612b91565b60007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808b60601b168352808a60601b166014840152808960601b1660288401525086603c83015285605c83015284607c8301528284609c8401375060009101609c01908152979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207dc4dabc834843f270508004a7406d63628224fbaa5b3a6c1fd84c4ccba84b0b64736f6c634300080d003360a060405234801561001057600080fd5b503060805261001e3361002d565b610028600061002d565b610088565b600080546001600160a01b038381166201000081810262010000600160b01b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b608051612229620000ce600039600081816102d9015281816105c201528181610ba4015281816112d00152818161130b015281816118e6015261191a01526122296000f3fe6080604052600436106101c65760003560e01c8063715018a6116100f7578063ce7c2ac211610095578063e33b7de311610064578063e33b7de314610592578063f05b3bff146105a7578063f2fde38b146105ee578063ffa1ad741461060e57600080fd5b8063ce7c2ac2146104e6578063d39ce77c1461051c578063d79779b21461053c578063daaa360c1461057257600080fd5b80638129fc1c116100d15780638129fc1c146104575780638b83209b1461046c5780638da5cb5b1461048c5780639852595c146104b057600080fd5b8063715018a61461040d5780637fbbe46f146104225780637ff28d3a1461044257600080fd5b8063406072a9116101645780635414dff01161013e5780635414dff014610398578063580fc80a146103b85780635be7fde8146103d85780635eebea20146103ed57600080fd5b8063406072a91461031057806348b75044146103565780634e8086aa1461037657600080fd5b806319165587116101a0578063191655871461028757806319bc9ae8146102a75780632e181e32146102c75780633a98ef39146102fb57600080fd5b806306661abd1461021457806309ed46071461023857806318f9b0231461026557600080fd5b3661020f577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561022057600080fd5b506006545b6040519081526020015b60405180910390f35b34801561024457600080fd5b5061024d610626565b6040516001600160a01b03909116815260200161022f565b34801561027157600080fd5b50610285610280366004611d0d565b610635565b005b34801561029357600080fd5b506102856102a2366004611d37565b610724565b3480156102b357600080fd5b506102256102c2366004611d52565b610848565b3480156102d357600080fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561030757600080fd5b50600254610225565b34801561031c57600080fd5b5061022561032b366004611d52565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561036257600080fd5b50610285610371366004611d52565b610958565b34801561038257600080fd5b5061038b610a5f565b60405161022f9190611d85565b3480156103a457600080fd5b5061024d6103b3366004611ddd565b610b95565b3480156103c457600080fd5b506102856103d3366004611d37565b610bca565b3480156103e457600080fd5b50610285610c20565b3480156103f957600080fd5b50610225610408366004611d37565b610c78565b34801561041957600080fd5b50610285610ce1565b34801561042e57600080fd5b5061028561043d366004611f03565b610d4e565b34801561044e57600080fd5b50610285610f1a565b34801561046357600080fd5b5061028561101f565b34801561047857600080fd5b5061024d610487366004611ddd565b6110ce565b34801561049857600080fd5b506000546201000090046001600160a01b031661024d565b3480156104bc57600080fd5b506102256104cb366004611d37565b6001600160a01b031660009081526005602052604090205490565b3480156104f257600080fd5b50610225610501366004611d37565b6001600160a01b031660009081526004602052604090205490565b34801561052857600080fd5b50610285610537366004611d37565b6110fe565b34801561054857600080fd5b50610225610557366004611d37565b6001600160a01b031660009081526007602052604090205490565b34801561057e57600080fd5b5061024d61058d366004611ddd565b611254565b34801561059e57600080fd5b50600354610225565b3480156105b357600080fd5b50604051306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415815260200161022f565b3480156105fa57600080fd5b50610285610609366004611d37565b61125f565b34801561061a57600080fd5b50610225637885ebe981565b60006106306112c9565b905090565b6000546001600160a01b036201000090910416331461069b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000805460ff1690036107165760405162461bcd60e51b815260206004820152603060248201527f496e697469616c697a61626c653a20636f6e747261637420686173206e6f742060448201527f6265656e20696e697469616c697a6564000000000000000000000000000000006064820152608401610692565b610720828261137a565b5050565b6001600160a01b03811660009081526004602052604081205490036107465750565b600061075182610c78565b90508060000361075f575050565b6001600160a01b03821660009081526005602052604081208054839290610787908490611ff2565b9250508190555080600360008282546107a09190611ff2565b90915550506040516000906001600160a01b0384169083908381818185875af1925050503d80600081146107f0576040519150601f19603f3d011682016040523d82523d6000602084013e6107f5565b606091505b50509050801561084357604080516001600160a01b0385168152602081018490527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a15b505050565b6001600160a01b038116600090815260046020526040812054810361086f57506000610952565b6001600160a01b0383166000908152600760205260408120546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa1580156108e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610909919061200a565b6109139190611ff2565b6001600160a01b0380861660009081526008602090815260408083209388168352929052205490915061094e90849083906115cd565b6115cd565b9150505b92915050565b6001600160a01b038116600090815260046020526040812054900361097b575050565b60006109878383610848565b90508060000361099657505050565b6001600160a01b038084166000908152600860209081526040808320938616835292905290812080548392906109cd908490611ff2565b90915550506001600160a01b038316600090815260076020526040812080548392906109fa908490611ff2565b90915550610a1490506001600160a01b0384168383611613565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b60065460609060009067ffffffffffffffff811115610a8057610a80611df6565b604051908082528060200260200182016040528015610ac557816020015b6040805180820190915260008082526020820152815260200190600190039081610a9e5790505b50905060005b600654811015610b8f57604051806040016040528060068381548110610af357610af3612023565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031681526020016004600060068581548110610b3657610b36612023565b60009182526020808320909101546001600160a01b0316835282019290925260400190205490528251839083908110610b7157610b71612023565b60200260200101819052508080610b8790612052565b915050610acb565b50919050565b60006109526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001683611693565b60005b60065460ff8216101561072057610c0e8260068360ff1681548110610bf457610bf4612023565b6000918252602090912001546001600160a01b0316610958565b80610c188161208a565b915050610bcd565b60005b60065460ff82161015610c7557610c6360068260ff1681548110610c4957610c49612023565b6000918252602090912001546001600160a01b0316610724565b80610c6d8161208a565b915050610c23565b50565b6001600160a01b0381166000908152600460205260408120548103610c9f57506000919050565b6000610caa60035490565b610cb49047611ff2565b9050610cda8382610949866001600160a01b031660009081526005602052604090205490565b9392505050565b6000546001600160a01b0362010000909104163314610d425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610692565b610d4c600061170f565b565b6000610d5a6001611780565b90508015610d8f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b8151835114610e065760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e64207368617260448201527f6573206c656e677468206d69736d6174636800000000000000000000000000006064820152608401610692565b6000835111610e575760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401610692565b60005b8351811015610eb157610e9f848281518110610e7857610e78612023565b6020026020010151848381518110610e9257610e92612023565b602002602001015161137a565b80610ea981612052565b915050610e5a565b50610ebb3361170f565b801561084357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200161083a565b6001546001600160a01b03163314610f9a5760405162461bcd60e51b815260206004820152602260248201527f4f776e61626c653a206d757374206265206e6577206f776e657220746f20707560448201527f6c6c0000000000000000000000000000000000000000000000000000000000006064820152608401610692565b600154600080546040516001600160a01b039384169362010000909204909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166001600160a01b039092166201000002919091179055565b600061102b6001611780565b9050801561106057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6110693361170f565b8015610c7557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000600682815481106110e3576110e3612023565b6000918252602090912001546001600160a01b031692915050565b6000546001600160a01b036201000090910416331461115f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610692565b6001600160a01b0381166111db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610692565b600080546040516001600160a01b03808516936201000090930416917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000610952826118d7565b6000546001600160a01b03620100009091041633146112c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610692565b610c758161170f565b60006112fd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661198a565b9050806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316336001600160a01b03167fd64439e08c1b01a555bbbbb0ae43010ec863b6280c9dae54ad824a77a99422e0600060405161136f91815260200190565b60405180910390a490565b6001600160a01b0382166113f65760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201527f7a65726f206164647265737300000000000000000000000000000000000000006064820152608401610692565b600081116114465760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401610692565b6001600160a01b03821660009081526004602052604081205490036115415760068054600181019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155600090815260046020526040812080548392906114e4908490611ff2565b90915550506002546114f7908290611ff2565b600255604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac91015b60405180910390a15050565b6001600160a01b03821660009081526004602052604081208054839290611569908490611ff2565b909155505060025461157c908290611ff2565b6002556001600160a01b038216600081815260046020908152604091829020548251938452908301527f16a858c8482e196ae62e1a6c9241d378a70905affd9f2e9ab395bd74b163c3299101611535565b6002546001600160a01b038416600090815260046020526040812054909183916115f790866120a9565b61160191906120e6565b61160b9190612121565b949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610843908490611a46565b6000610cda8383306040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606093841b60148201527f5af43d82803e903d91602b57fd5bf3ff000000000000000000000000000000006028820152921b6038830152604c8201526037808220606c830152605591012090565b600080546001600160a01b03838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60008054610100900460ff161561181d578160ff1660011480156117a35750303b155b6118155760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610692565b506000919050565b60005460ff80841691161061189a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610692565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600061190c6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001683611b2b565b9050806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316336001600160a01b03167fd64439e08c1b01a555bbbbb0ae43010ec863b6280c9dae54ad824a77a99422e08560405161197d91815260200190565b60405180910390a4919050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b0381166118d25760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c6564000000000000000000006044820152606401610692565b50505050565b6000611a9b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611be29092919063ffffffff16565b8051909150156108435780806020019051810190611ab99190612138565b6108435760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610692565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b0381166109525760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152606401610692565b606061160b8484600085856001600160a01b0385163b611c445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610692565b600080866001600160a01b03168587604051611c609190612186565b60006040518083038185875af1925050503d8060008114611c9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ca2565b606091505b5091509150611cb2828286611cbd565b979650505050505050565b60608315611ccc575081610cda565b825115611cdc5782518084602001fd5b8160405162461bcd60e51b815260040161069291906121a2565b80356001600160a01b03811681146118d257600080fd5b60008060408385031215611d2057600080fd5b611d2983611cf6565b946020939093013593505050565b600060208284031215611d4957600080fd5b610cda82611cf6565b60008060408385031215611d6557600080fd5b611d6e83611cf6565b9150611d7c60208401611cf6565b90509250929050565b602080825282518282018190526000919060409081850190868401855b82811015611dd057815180516001600160a01b03168552860151868501529284019290850190600101611da2565b5091979650505050505050565b600060208284031215611def57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e6c57611e6c611df6565b604052919050565b600067ffffffffffffffff821115611e8e57611e8e611df6565b5060051b60200190565b600082601f830112611ea957600080fd5b81356020611ebe611eb983611e74565b611e25565b82815260059290921b84018101918181019086841115611edd57600080fd5b8286015b84811015611ef85780358352918301918301611ee1565b509695505050505050565b60008060408385031215611f1657600080fd5b823567ffffffffffffffff80821115611f2e57600080fd5b818501915085601f830112611f4257600080fd5b81356020611f52611eb983611e74565b82815260059290921b84018101918181019089841115611f7157600080fd5b948201945b83861015611f9657611f8786611cf6565b82529482019490820190611f76565b96505086013592505080821115611fac57600080fd5b50611fb985828601611e98565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561200557612005611fc3565b500190565b60006020828403121561201c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361208357612083611fc3565b5060010190565b600060ff821660ff81036120a0576120a0611fc3565b60010192915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120e1576120e1611fc3565b500290565b60008261211c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561213357612133611fc3565b500390565b60006020828403121561214a57600080fd5b81518015158114610cda57600080fd5b60005b8381101561217557818101518382015260200161215d565b83811115611a405750506000910152565b6000825161219881846020870161215a565b9190910192915050565b60208152600082518060208401526121c181604085016020870161215a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212200db7d979c6d9a39fd7433bb4f98e542f682831f8751cf1a3ab0d96f9b2754d3a64736f6c634300080d0033697066733a2f2f516d57765431725547655870386b654a755264774e6f4d6763663536544552513451704b4e5a4735726453586f6a2f

Deployed ByteCode Sourcemap

93859:4499:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98128:227;;;;;;;;;;-1:-1:-1;98128:227:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;98128:227:0;;;;;;;;22373:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23933:221::-;;;;;;;;;;-1:-1:-1;23933:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1797:55:1;;;1779:74;;1767:2;1752:18;23933:221:0;1633:226:1;23456:411:0;;;;;;;;;;-1:-1:-1;23456:411:0;;;;;:::i;:::-;;:::i;:::-;;37838:113;;;;;;;;;;-1:-1:-1;37926:10:0;:17;37838:113;;;2470:25:1;;;2458:2;2443:18;37838:113:0;2324:177:1;24683:339:0;;;;;;;;;;-1:-1:-1;24683:339:0;;;;;:::i;:::-;;:::i;45834:494::-;;;;;;;;;;-1:-1:-1;45834:494:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3284:55:1;;;3266:74;;3371:2;3356:18;;3349:34;;;;3239:18;45834:494:0;3092:297:1;37506:256:0;;;;;;;;;;-1:-1:-1;37506:256:0;;;;;:::i;:::-;;:::i;94143:39::-;;;;;;;;;;;;94180:2;94143:39;;97003:212;;;;;;;;;;;;;:::i;96930:65::-;;;;;;;;;;;;;:::i;25093:185::-;;;;;;;;;;-1:-1:-1;25093:185:0;;;;;:::i;:::-;;:::i;38028:233::-;;;;;;;;;;-1:-1:-1;38028:233:0;;;;;:::i;:::-;;:::i;96534:209::-;;;;;;;;;;-1:-1:-1;96534:209:0;;;;;:::i;:::-;;:::i;96425:101::-;;;;;;;;;;-1:-1:-1;96425:101:0;;;;;:::i;:::-;;:::i;51000:86::-;;;;;;;;;;-1:-1:-1;51071:7:0;;;;51000:86;;22067:239;;;;;;;;;;-1:-1:-1;22067:239:0;;;;;:::i;:::-;;:::i;96319:98::-;;;;;;;;;;;;;:::i;21797:208::-;;;;;;;;;;-1:-1:-1;21797:208:0;;;;;:::i;:::-;;:::i;56487:112::-;;;;;;;;;;;;;:::i;55919:217::-;;;;;;;;;;;;;:::i;94462:103::-;;;;;;;;;;;;94522:42;94462:103;;94189:48;;;;;;;;;;;;94233:4;94189:48;;;;;5357:26:1;5345:39;;;5327:58;;5315:2;5300:18;94189:48:0;5183:208:1;55059:96:0;;;;;;;;;;-1:-1:-1;55141:6:0;;-1:-1:-1;;;;;55141:6:0;55059:96;;22542:104;;;;;;;;;;;;;:::i;95275:461::-;;;;;;:::i;:::-;;:::i;24226:155::-;;;;;;;;;;-1:-1:-1;24226:155:0;;;;;:::i;:::-;;:::i;25349:328::-;;;;;;;;;;-1:-1:-1;25349:328:0;;;;;:::i;:::-;;:::i;95744:253::-;;;;;;;;;;;;;:::i;94572:52::-;;;;;;;;;;;;;;;96005:264;;;;;;;;;;-1:-1:-1;96005:264:0;;;;;:::i;:::-;;:::i;94244:28::-;;;;;;;;;;;;;;;;55545:247;;;;;;;;;;-1:-1:-1;55545:247:0;;;;;:::i;:::-;;:::i;24452:164::-;;;;;;;;;;-1:-1:-1;24452:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24573:25:0;;;24549:4;24573:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24452:164;56754:210;;;;;;;;;;-1:-1:-1;56754:210:0;;;;;:::i;:::-;;:::i;96751:171::-;;;;;;;;;;-1:-1:-1;96751:171:0;;;;;:::i;:::-;;:::i;98128:227::-;98282:4;98311:36;98335:11;98311:23;:36::i;:::-;98304:43;98128:227;-1:-1:-1;;98128:227:0:o;22373:100::-;22427:13;22460:5;22453:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22373:100;:::o;23933:221::-;24009:7;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;24029:73;;;;-1:-1:-1;;;24029:73:0;;7585:2:1;24029:73:0;;;7567:21:1;7624:2;7604:18;;;7597:30;7663:34;7643:18;;;7636:62;7734:14;7714:18;;;7707:42;7766:19;;24029:73:0;;;;;;;;;-1:-1:-1;24122:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24122:24:0;;23933:221::o;23456:411::-;23537:13;23553:23;23568:7;23553:14;:23::i;:::-;23537:39;;23601:5;-1:-1:-1;;;;;23595:11:0;:2;-1:-1:-1;;;;;23595:11:0;;23587:57;;;;-1:-1:-1;;;23587:57:0;;7998:2:1;23587:57:0;;;7980:21:1;8037:2;8017:18;;;8010:30;8076:34;8056:18;;;8049:62;8147:3;8127:18;;;8120:31;8168:19;;23587:57:0;7796:397:1;23587:57:0;16838:10;-1:-1:-1;;;;;23679:21:0;;;;:62;;-1:-1:-1;23704:37:0;23721:5;16838:10;24452:164;:::i;23704:37::-;23657:168;;;;-1:-1:-1;;;23657:168:0;;8400:2:1;23657:168:0;;;8382:21:1;8439:2;8419:18;;;8412:30;8478:34;8458:18;;;8451:62;8549:26;8529:18;;;8522:54;8593:19;;23657:168:0;8198:420:1;23657:168:0;23838:21;23847:2;23851:7;23838:8;:21::i;:::-;23526:341;23456:411;;:::o;24683:339::-;24878:41;16838:10;24911:7;24878:18;:41::i;:::-;24870:103;;;;-1:-1:-1;;;24870:103:0;;8825:2:1;24870:103:0;;;8807:21:1;8864:2;8844:18;;;8837:30;8903:34;8883:18;;;8876:62;8974:19;8954:18;;;8947:47;9011:19;;24870:103:0;8623:413:1;24870:103:0;24986:28;24996:4;25002:2;25006:7;24986:9;:28::i;45834:494::-;45978:7;46041:27;;;:17;:27;;;;;;;;46012:56;;;;;;;;;-1:-1:-1;;;;;46012:56:0;;;;;;;;;;;;;;;;;;45978:7;;46081:92;;-1:-1:-1;46132:29:0;;;;;;;;;-1:-1:-1;46132:29:0;-1:-1:-1;;;;;46132:29:0;;;;;;;;;;;;;46081:92;46223:23;;;;46185:21;;46694:5;;46210:36;;46209:58;46210:36;:10;:36;:::i;:::-;46209:58;;;;:::i;:::-;46288:16;;;;;-1:-1:-1;45834:494:0;;-1:-1:-1;;;;45834:494:0:o;37506:256::-;37603:7;37639:23;37656:5;37639:16;:23::i;:::-;37631:5;:31;37623:87;;;;-1:-1:-1;;;37623:87:0;;9979:2:1;37623:87:0;;;9961:21:1;10018:2;9998:18;;;9991:30;10057:34;10037:18;;;10030:62;10128:13;10108:18;;;10101:41;10159:19;;37623:87:0;9777:407:1;37623:87:0;-1:-1:-1;;;;;;37728:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37506:256::o;97003:212::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;97059:21:::1;97084:1;97059:26:::0;97051:62:::1;;;::::0;-1:-1:-1;;;97051:62:0;;10752:2:1;97051:62:0::1;::::0;::::1;10734:21:1::0;10791:2;10771:18;;;10764:30;10830:25;10810:18;;;10803:53;10873:18;;97051:62:0::1;10550:347:1::0;97051:62:0::1;97124:83;::::0;97132:42:::1;::::0;97185:21:::1;97124:83:::0;::::1;;;::::0;::::1;::::0;;;97185:21;97132:42;97124:83;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;97003:212::o:0;96930:65::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;96977:10:::1;:8;:10::i;:::-;96930:65::o:0;25093:185::-;25231:39;25248:4;25254:2;25258:7;25231:39;;;;;;;;;;;;:16;:39::i;38028:233::-;38103:7;38139:30;37926:10;:17;;37838:113;38139:30;38131:5;:38;38123:95;;;;-1:-1:-1;;;38123:95:0;;11104:2:1;38123:95:0;;;11086:21:1;11143:2;11123:18;;;11116:30;11182:34;11162:18;;;11155:62;11253:14;11233:18;;;11226:42;11285:19;;38123:95:0;10902:408:1;38123:95:0;38236:10;38247:5;38236:17;;;;;;;;:::i;:::-;;;;;;;;;38229:24;;38028:233;;;:::o;96534:209::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;96610:1:::1;96603:3;:8;;96595:41;;;::::0;-1:-1:-1;;;96595:41:0;;11706:2:1;96595:41:0::1;::::0;::::1;11688:21:1::0;11745:2;11725:18;;;11718:30;11784:22;11764:18;;;11757:50;11824:18;;96595:41:0::1;11504:344:1::0;96595:41:0::1;96661:9;::::0;;96681:15;;;;96712:23:::1;::::0;96693:3;;96661:9;;96712:23:::1;::::0;96647:11:::1;::::0;96712:23:::1;96584:159;96534:209:::0;:::o;96425:101::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;96498:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;96425:101:::0;:::o;22067:239::-;22139:7;22175:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22175:16:0;;22202:73;;;;-1:-1:-1;;;22202:73:0;;12055:2:1;22202:73:0;;;12037:21:1;12094:2;12074:18;;;12067:30;12133:34;12113:18;;;12106:62;12204:11;12184:18;;;12177:39;12233:19;;22202:73:0;11853:405:1;96319:98:0;55141:6;;96371:7;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;-1:-1:-1;96398:11:0::1;::::0;96319:98;:::o;21797:208::-;21869:7;-1:-1:-1;;;;;21897:19:0;;21889:74;;;;-1:-1:-1;;;21889:74:0;;12465:2:1;21889:74:0;;;12447:21:1;12504:2;12484:18;;;12477:30;12543:34;12523:18;;;12516:62;12614:12;12594:18;;;12587:40;12644:19;;21889:74:0;12263:406:1;21889:74:0;-1:-1:-1;;;;;;21981:16:0;;;;;:9;:16;;;;;;;21797:208::o;56487:112::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;56561:30:::1;56588:1;56561:18;:30::i;55919:217::-:0;56001:9;;-1:-1:-1;;;;;56001:9:0;55987:10;:23;55979:70;;;;-1:-1:-1;;;55979:70:0;;12876:2:1;55979:70:0;;;12858:21:1;12915:2;12895:18;;;12888:30;12954:34;12934:18;;;12927:62;13025:4;13005:18;;;12998:32;13047:19;;55979:70:0;12674:398:1;55979:70:0;56089:9;;56081:6;;56065:34;;-1:-1:-1;;;;;56089:9:0;;;;56081:6;;;;56065:34;;56089:9;;56065:34;56119:9;;56110:6;:18;;;;-1:-1:-1;;;;;56119:9:0;;;56110:18;;;;;;55919:217::o;22542:104::-;22598:13;22631:7;22624:14;;;;;:::i;95275:461::-;51071:7;;;;51325:9;51317:38;;;;-1:-1:-1;;;51317:38:0;;13279:2:1;51317:38:0;;;13261:21:1;13318:2;13298:18;;;13291:30;13357:18;13337;;;13330:46;13393:18;;51317:38:0;13077:340:1;51317:38:0;95352:5:::1;95361:1;95352:10:::0;95344:45:::1;;;::::0;-1:-1:-1;;;95344:45:0;;13624:2:1;95344:45:0::1;::::0;::::1;13606:21:1::0;13663:2;13643:18;;;13636:30;13702:24;13682:18;;;13675:52;13744:18;;95344:45:0::1;13422:346:1::0;95344:45:0::1;95417:9;;95408:5;:18;;95400:56;;;::::0;-1:-1:-1;;;95400:56:0;;13975:2:1;95400:56:0::1;::::0;::::1;13957:21:1::0;14014:2;13994:18;;;13987:30;14053:27;14033:18;;;14026:55;14098:18;;95400:56:0::1;13773:349:1::0;95400:56:0::1;95499:9;95483:12;:10;:12::i;:::-;95475:20;::::0;:5;:20:::1;:::i;:::-;:33;95467:77;;;::::0;-1:-1:-1;;;95467:77:0;;14329:2:1;95467:77:0::1;::::0;::::1;14311:21:1::0;14368:2;14348:18;;;14341:30;14407:33;14387:18;;;14380:61;14458:18;;95467:77:0::1;14127:355:1::0;95467:77:0::1;95557:71;::::0;95565:42:::1;::::0;95618:9:::1;95557:71:::0;::::1;;;::::0;::::1;::::0;;;95618:9;95565:42;95557:71;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;95646:9;95641:88;95665:5;95661:1;:9;95641:88;;;95692:25;16838:10:::0;95692:11:::1;:25::i;:::-;-1:-1:-1::0;95672:3:0;::::1;::::0;::::1;:::i;:::-;;;;95641:88;;24226:155:::0;24321:52;16838:10;24354:8;24364;24321:18;:52::i;25349:328::-;25524:41;16838:10;25557:7;25524:18;:41::i;:::-;25516:103;;;;-1:-1:-1;;;25516:103:0;;8825:2:1;25516:103:0;;;8807:21:1;8864:2;8844:18;;;8837:30;8903:34;8883:18;;;8876:62;8974:19;8954:18;;;8947:47;9011:19;;25516:103:0;8623:413:1;25516:103:0;25630:39;25644:4;25650:2;25654:7;25663:5;25630:13;:39::i;:::-;25349:328;;;;:::o;95744:253::-;95787:7;;94522:42;95811:15;16838:10;95811:29;;;;;;;;;;-1:-1:-1;;;;;1797:55:1;;;95811:29:0;;;1779:74:1;1752:18;;95811:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;95807:183;;;95884:11;;95920:6;;95884:32;;94233:4;;95884:32;:::i;:::-;95883:43;;;;:::i;:::-;95868:11;;:59;;;;:::i;:::-;95861:66;;95744:253;:::o;96005:264::-;27252:4;27276:16;;;:7;:16;;;;;;96070:13;;-1:-1:-1;;;;;27276:16:0;96096:76;;;;-1:-1:-1;;;96096:76:0;;15208:2:1;96096:76:0;;;15190:21:1;15247:2;15227:18;;;15220:30;15286:34;15266:18;;;15259:62;15357:17;15337:18;;;15330:45;15392:19;;96096:76:0;15006:411:1;96096:76:0;96216:8;96226:18;:7;:16;:18::i;:::-;96246:13;96199:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96185:76;;96005:264;;;:::o;55545:247::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;-1:-1:-1;;;;;55639:22:0;::::1;55631:73;;;::::0;-1:-1:-1;;;55631:73:0;;17304:2:1;55631:73:0::1;::::0;::::1;17286:21:1::0;17343:2;17323:18;;;17316:30;17382:34;17362:18;;;17355:62;17453:8;17433:18;;;17426:36;17479:19;;55631:73:0::1;17102:402:1::0;55631:73:0::1;55736:6;::::0;55720:33:::1;::::0;-1:-1:-1;;;;;55720:33:0;;::::1;::::0;55736:6:::1;::::0;55720:33:::1;::::0;55736:6:::1;::::0;55720:33:::1;55764:9;:20:::0;;;::::1;-1:-1:-1::0;;;;;55764:20:0;;;::::1;::::0;;;::::1;::::0;;55545:247::o;56754:210::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;-1:-1:-1;;;;;56852:22:0;::::1;56844:73;;;::::0;-1:-1:-1;;;56844:73:0;;17304:2:1;56844:73:0::1;::::0;::::1;17286:21:1::0;17343:2;17323:18;;;17316:30;17382:34;17362:18;;;17355:62;17453:8;17433:18;;;17426:36;17479:19;;56844:73:0::1;17102:402:1::0;56844:73:0::1;56928:28;56947:8;56928:18;:28::i;96751:171::-:0;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;96830:11:::1;::::0;;96852:19;;;;96887:27:::1;::::0;96866:5;;96830:11;;96887:27:::1;::::0;96816:11:::1;::::0;96887:27:::1;96805:117;96751:171:::0;:::o;49455:170::-;49557:4;49581:36;49605:11;49581:23;:36::i;31333:249::-;31446:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;31446:29:0;;;;;;;;:24;;31500:23;31446:24;31500:14;:23::i;:::-;-1:-1:-1;;;;;31491:46:0;;;;;;;;;;;96498:20:::1;96425:101:::0;:::o;27481:348::-;27574:4;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;27591:73;;;;-1:-1:-1;;;27591:73:0;;17711:2:1;27591:73:0;;;17693:21:1;17750:2;17730:18;;;17723:30;17789:34;17769:18;;;17762:62;17860:14;17840:18;;;17833:42;17892:19;;27591:73:0;17509:408:1;27591:73:0;27675:13;27691:23;27706:7;27691:14;:23::i;:::-;27675:39;;27744:5;-1:-1:-1;;;;;27733:16:0;:7;-1:-1:-1;;;;;27733:16:0;;:52;;;-1:-1:-1;;;;;;24573:25:0;;;24549:4;24573:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27753:32;27733:87;;;;27813:7;-1:-1:-1;;;;;27789:31:0;:20;27801:7;27789:11;:20::i;:::-;-1:-1:-1;;;;;27789:31:0;;27733:87;27725:96;27481:348;-1:-1:-1;;;;27481:348:0:o;30590:625::-;30749:4;-1:-1:-1;;;;;30722:31:0;:23;30737:7;30722:14;:23::i;:::-;-1:-1:-1;;;;;30722:31:0;;30714:81;;;;-1:-1:-1;;;30714:81:0;;18124:2:1;30714:81:0;;;18106:21:1;18163:2;18143:18;;;18136:30;18202:34;18182:18;;;18175:62;18273:7;18253:18;;;18246:35;18298:19;;30714:81:0;17922:401:1;30714:81:0;-1:-1:-1;;;;;30814:16:0;;30806:65;;;;-1:-1:-1;;;30806:65:0;;18530:2:1;30806:65:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;18679:6;18659:18;;;18652:34;18703:19;;30806:65:0;18328:400:1;30806:65:0;30884:39;30905:4;30911:2;30915:7;30884:20;:39::i;:::-;30988:29;31005:1;31009:7;30988:8;:29::i;:::-;-1:-1:-1;;;;;31030:15:0;;;;;;:9;:15;;;;;:20;;31049:1;;31030:15;:20;;31049:1;;31030:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31061:13:0;;;;;;:9;:13;;;;;:18;;31078:1;;31061:13;:18;;31078:1;;31061:18;:::i;:::-;;;;-1:-1:-1;;31090:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;31090:21:0;;;;;;;;;31129:27;;31090:16;;31129:27;;;;;;;31169:38;31189:4;31195:2;31199:7;31169:19;:38::i;52362:120::-;51071:7;;;;51595:41;;;;-1:-1:-1;;;51595:41:0;;19068:2:1;51595:41:0;;;19050:21:1;19107:2;19087:18;;;19080:30;19146:22;19126:18;;;19119:50;19186:18;;51595:41:0;18866:344:1;51595:41:0;52421:7:::1;:15:::0;;;::::1;::::0;;52452:22:::1;::::0;;16838:10;1779:74:1;;52452:22:0;;::::1;::::0;;;;1767:2:1;52452:22:0;;::::1;52362:120::o:0;57124:191::-;57217:6;;;-1:-1:-1;;;;;57234:17:0;;;;;;;;;;;57267:40;;57217:6;;;57234:17;57217:6;;57267:40;;57198:16;;57267:40;57187:128;57124:191;:::o;97861:259::-;97913:7;94180:2;97941:13;37926:10;:17;;37838:113;97941:13;:17;;97957:1;97941:17;:::i;:::-;:31;;97933:58;;;;-1:-1:-1;;;97933:58:0;;19417:2:1;97933:58:0;;;19399:21:1;19456:2;19436:18;;;19429:30;19495:16;19475:18;;;19468:44;19529:18;;97933:58:0;19215:338:1;97933:58:0;98004:15;98022:23;:21;:23::i;:::-;:27;;98048:1;98022:27;:::i;:::-;98004:45;;98062:23;98072:3;98077:7;98062:9;:23::i;31724:432::-;31879:8;-1:-1:-1;;;;;31870:17:0;:5;-1:-1:-1;;;;;31870:17:0;;31862:55;;;;-1:-1:-1;;;31862:55:0;;19760:2:1;31862:55:0;;;19742:21:1;19799:2;19779:18;;;19772:30;19838:27;19818:18;;;19811:55;19883:18;;31862:55:0;19558:349:1;31862:55:0;-1:-1:-1;;;;;31987:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;32049:41;;586::1;;;32049::0;;559:18:1;32049:41:0;;;;;;;23526:341;23456:411;;:::o;26559:315::-;26716:28;26726:4;26732:2;26736:7;26716:9;:28::i;:::-;26763:48;26786:4;26792:2;26796:7;26805:5;26763:22;:48::i;:::-;26755:111;;;;-1:-1:-1;;;26755:111:0;;20114:2:1;26755:111:0;;;20096:21:1;20153:2;20133:18;;;20126:30;20192:34;20172:18;;;20165:62;20263:20;20243:18;;;20236:48;20301:19;;26755:111:0;19912:414:1;17307:723:0;17363:13;17584:5;17593:1;17584:10;17580:53;;-1:-1:-1;;17611:10:0;;;;;;;;;;;;;;;;;;17307:723::o;17580:53::-;17658:5;17643:12;17699:78;17706:9;;17699:78;;17732:8;;;;:::i;:::-;;-1:-1:-1;17755:10:0;;-1:-1:-1;17763:2:0;17755:10;;:::i;:::-;;;17699:78;;;17787:19;17819:6;17809:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17809:17:0;;17787:39;;17837:154;17844:10;;17837:154;;17871:11;17881:1;17871:11;;:::i;:::-;;-1:-1:-1;17940:10:0;17948:2;17940:5;:10;:::i;:::-;17927:24;;:2;:24;:::i;:::-;17914:39;;17897:6;17904;17897:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;17968:11:0;17977:2;17968:11;;:::i;:::-;;;17837:154;;37198:224;37300:4;37324:50;;;37339:35;37324:50;;:90;;;37378:36;37402:11;37378:23;:36::i;97263:231::-;97441:45;97468:4;97474:2;97478:7;97441:26;:45::i;97502:231::-;97637:18;-1:-1:-1;;;;;97637:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23526:341;23456:411;;:::o;60133:840::-;60184:7;60204:13;60232:11;;60220:9;;:23;;;;:::i;:::-;60204:39;;60254:12;60277:14;60350:9;60394:5;60362:29;:17;:27;:29::i;:::-;:37;;;;:::i;:::-;60350:49;-1:-1:-1;60476:11:0;:22;60488:9;60496:1;60488:5;:9;:::i;:::-;60476:22;;;;;;;;;;;;60502:1;60476:27;60472:138;;60527:9;60535:1;60527:5;:9;:::i;:::-;60520:16;;60472:138;;;60576:11;:22;60588:9;60596:1;60588:5;:9;:::i;:::-;60576:22;;;;;;;;;;;;60569:29;;60472:138;60732:14;;;;:11;:14;;;;;;:19;;60728:190;;60793:14;;;;:11;:14;;;;;:21;;;60777:1;-1:-1:-1;60777:1:0;60728:190;;;60856:14;;;;:11;:14;;;;;;;60885:21;;;;60856:14;-1:-1:-1;60728:190:0;60928:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;60959:6:0;;60133:840;-1:-1:-1;;;;;60133:840:0:o;28171:110::-;28247:26;28257:2;28261:7;28247:26;;;;;;;;;;;;:9;:26::i;32721:799::-;32876:4;-1:-1:-1;;;;;32897:13:0;;9130:19;:23;32893:620;;32933:72;;;;;-1:-1:-1;;;;;32933:36:0;;;;;:72;;16838:10;;32984:4;;32990:7;;32999:5;;32933:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32933:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32929:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33175:6;:13;33192:1;33175:18;33171:272;;33218:60;;-1:-1:-1;;;33218:60:0;;20114:2:1;33218:60:0;;;20096:21:1;20153:2;20133:18;;;20126:30;20192:34;20172:18;;;20165:62;20263:20;20243:18;;;20236:48;20301:19;;33218:60:0;19912:414:1;33171:272:0;33393:6;33387:13;33378:6;33374:2;33370:15;33363:38;32929:529;33056:51;;33066:41;33056:51;;-1:-1:-1;33049:58:0;;32893:620;-1:-1:-1;33497:4:0;32721:799;;;;;;:::o;21428:305::-;21530:4;21567:40;;;21582:25;21567:40;;:105;;-1:-1:-1;21624:48:0;;;21639:33;21624:48;21567:105;:158;;;;21689:36;21713:11;21689:23;:36::i;53133:275::-;53277:45;53304:4;53310:2;53314:7;53277:26;:45::i;:::-;51071:7;;;;53343:9;53335:65;;;;-1:-1:-1;;;53335:65:0;;21421:2:1;53335:65:0;;;21403:21:1;21460:2;21440:18;;;21433:30;21499:34;21479:18;;;21472:62;21570:13;21550:18;;;21543:41;21601:19;;53335:65:0;21219:407:1;57521:140:0;57578:7;57605:48;57626:5;57633:12;:10;:12::i;:::-;57647:5;57605:20;:48::i;28508:321::-;28638:18;28644:2;28648:7;28638:5;:18::i;:::-;28689:54;28720:1;28724:2;28728:7;28737:5;28689:22;:54::i;:::-;28667:154;;;;-1:-1:-1;;;28667:154:0;;20114:2:1;28667:154:0;;;20096:21:1;20153:2;20133:18;;;20126:30;20192:34;20172:18;;;20165:62;20263:20;20243:18;;;20236:48;20301:19;;28667:154:0;19912:414:1;45564:215:0;45666:4;45690:41;;;45705:26;45690:41;;:81;;-1:-1:-1;20023:25:0;20008:40;;;;45735:36;19899:157;38874:589;-1:-1:-1;;;;;39080:18:0;;39076:187;;39115:40;39147:7;40290:10;:17;;40263:24;;;;:15;:24;;;;;:44;;;40318:24;;;;;;;;;;;;40186:164;39115:40;39076:187;;;39185:2;-1:-1:-1;;;;;39177:10:0;:4;-1:-1:-1;;;;;39177:10:0;;39173:90;;39204:47;39237:4;39243:7;39204:32;:47::i;:::-;-1:-1:-1;;;;;39277:16:0;;39273:183;;39310:45;39347:7;39310:36;:45::i;39273:183::-;39383:4;-1:-1:-1;;;;;39377:10:0;:2;-1:-1:-1;;;;;39377:10:0;;39373:83;;39404:40;39432:2;39436:7;39404:27;:40::i;58656:420::-;58701:7;58816:4;58844:10;58877:14;58914:12;58949:15;58987:16;59026:8;;58769:284;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58741:327;;;;;;58721:347;;58656:420;:::o;58365:218::-;58506:7;58563:12;58533:27;58545:5;58552:7;58533:11;:27::i;:::-;:42;;;;:::i;29165:439::-;-1:-1:-1;;;;;29245:16:0;;29237:61;;;;-1:-1:-1;;;29237:61:0;;22666:2:1;29237:61:0;;;22648:21:1;;;22685:18;;;22678:30;22744:34;22724:18;;;22717:62;22796:18;;29237:61:0;22464:356:1;29237:61:0;27252:4;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;:30;29309:58;;;;-1:-1:-1;;;29309:58:0;;23027:2:1;29309:58:0;;;23009:21:1;23066:2;23046:18;;;23039:30;23105;23085:18;;;23078:58;23153:18;;29309:58:0;22825:352:1;29309:58:0;29380:45;29409:1;29413:2;29417:7;29380:20;:45::i;:::-;-1:-1:-1;;;;;29438:13:0;;;;;;:9;:13;;;;;:18;;29455:1;;29438:13;:18;;29455:1;;29438:18;:::i;:::-;;;;-1:-1:-1;;29467:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29467:21:0;;;;;;;;29506:33;;29467:16;;;29506:33;;29467:16;;29506:33;29552:44;29580:1;29584:2;29588:7;29552:19;:44::i;40977:988::-;41243:22;41293:1;41268:22;41285:4;41268:16;:22::i;:::-;:26;;;;:::i;:::-;41305:18;41326:26;;;:17;:26;;;;;;41243:51;;-1:-1:-1;41459:28:0;;;41455:328;;-1:-1:-1;;;;;41526:18:0;;41504:19;41526:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41577:30;;;;;;:44;;;41694:30;;:17;:30;;;;;:43;;;41455:328;-1:-1:-1;41879:26:0;;;;:17;:26;;;;;;;;41872:33;;;-1:-1:-1;;;;;41923:18:0;;;;;:12;:18;;;;;:34;;;;;;;41916:41;40977:988::o;42260:1079::-;42538:10;:17;42513:22;;42538:21;;42558:1;;42538:21;:::i;:::-;42570:18;42591:24;;;:15;:24;;;;;;42964:10;:26;;42513:46;;-1:-1:-1;42591:24:0;;42513:46;;42964:26;;;;;;:::i;:::-;;;;;;;;;42942:48;;43028:11;43003:10;43014;43003:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43108:28;;;:15;:28;;;;;;;:41;;;43280:24;;;;;43273:31;43315:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42331:1008;;;42260:1079;:::o;39764:221::-;39849:14;39866:20;39883:2;39866:16;:20::i;:::-;-1:-1:-1;;;;;39897:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39942:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39764:221:0:o;59190:176::-;59265:7;59327:12;:10;:12::i;:::-;59310:46;;;;;;23556:19:1;;;;23591:12;;23584:28;;;23628:12;;;23621:28;;;23665:12;;59310:46:0;;;;;;;;;;;;;59300:57;;59310:46;59300:57;;;;;59190:176;-1:-1:-1;;;59190:176:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:196::-;1932:20;;-1:-1:-1;;;;;1981:54:1;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:1:o;2506:328::-;2583:6;2591;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2691:29;2710:9;2691:29;:::i;:::-;2681:39;;2739:38;2773:2;2762:9;2758:18;2739:38;:::i;:::-;2729:48;;2824:2;2813:9;2809:18;2796:32;2786:42;;2506:328;;;;;:::o;2839:248::-;2907:6;2915;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;-1:-1:-1;;3007:23:1;;;3077:2;3062:18;;;3049:32;;-1:-1:-1;2839:248:1:o;3394:184::-;3446:77;3443:1;3436:88;3543:4;3540:1;3533:15;3567:4;3564:1;3557:15;3583:691;3648:5;3678:18;3719:2;3711:6;3708:14;3705:40;;;3725:18;;:::i;:::-;3859:2;3853:9;3925:2;3913:15;;3764:66;3909:24;;;3935:2;3905:33;3901:42;3889:55;;;3959:18;;;3979:22;;;3956:46;3953:72;;;4005:18;;:::i;:::-;4045:10;4041:2;4034:22;4074:6;4065:15;;4104:6;4096;4089:22;4144:3;4135:6;4130:3;4126:16;4123:25;4120:45;;;4161:1;4158;4151:12;4120:45;4211:6;4206:3;4199:4;4191:6;4187:17;4174:44;4266:1;4259:4;4250:6;4242;4238:19;4234:30;4227:41;;;;3583:691;;;;;:::o;4279:451::-;4348:6;4401:2;4389:9;4380:7;4376:23;4372:32;4369:52;;;4417:1;4414;4407:12;4369:52;4457:9;4444:23;4490:18;4482:6;4479:30;4476:50;;;4522:1;4519;4512:12;4476:50;4545:22;;4598:4;4590:13;;4586:27;-1:-1:-1;4576:55:1;;4627:1;4624;4617:12;4576:55;4650:74;4716:7;4711:2;4698:16;4693:2;4689;4685:11;4650:74;:::i;4735:186::-;4794:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;4886:29;4905:9;4886:29;:::i;5396:347::-;5461:6;5469;5522:2;5510:9;5501:7;5497:23;5493:32;5490:52;;;5538:1;5535;5528:12;5490:52;5561:29;5580:9;5561:29;:::i;:::-;5551:39;;5640:2;5629:9;5625:18;5612:32;5687:5;5680:13;5673:21;5666:5;5663:32;5653:60;;5709:1;5706;5699:12;5653:60;5732:5;5722:15;;;5396:347;;;;;:::o;5748:667::-;5843:6;5851;5859;5867;5920:3;5908:9;5899:7;5895:23;5891:33;5888:53;;;5937:1;5934;5927:12;5888:53;5960:29;5979:9;5960:29;:::i;:::-;5950:39;;6008:38;6042:2;6031:9;6027:18;6008:38;:::i;:::-;5998:48;;6093:2;6082:9;6078:18;6065:32;6055:42;;6148:2;6137:9;6133:18;6120:32;6175:18;6167:6;6164:30;6161:50;;;6207:1;6204;6197:12;6161:50;6230:22;;6283:4;6275:13;;6271:27;-1:-1:-1;6261:55:1;;6312:1;6309;6302:12;6261:55;6335:74;6401:7;6396:2;6383:16;6378:2;6374;6370:11;6335:74;:::i;:::-;6325:84;;;5748:667;;;;;;;:::o;6676:260::-;6744:6;6752;6805:2;6793:9;6784:7;6780:23;6776:32;6773:52;;;6821:1;6818;6811:12;6773:52;6844:29;6863:9;6844:29;:::i;:::-;6834:39;;6892:38;6926:2;6915:9;6911:18;6892:38;:::i;:::-;6882:48;;6676:260;;;;;:::o;6941:437::-;7020:1;7016:12;;;;7063;;;7084:61;;7138:4;7130:6;7126:17;7116:27;;7084:61;7191:2;7183:6;7180:14;7160:18;7157:38;7154:218;;7228:77;7225:1;7218:88;7329:4;7326:1;7319:15;7357:4;7354:1;7347:15;7154:218;;6941:437;;;:::o;9041:184::-;9093:77;9090:1;9083:88;9190:4;9187:1;9180:15;9214:4;9211:1;9204:15;9230:228;9270:7;9396:1;9328:66;9324:74;9321:1;9318:81;9313:1;9306:9;9299:17;9295:105;9292:131;;;9403:18;;:::i;:::-;-1:-1:-1;9443:9:1;;9230:228::o;9463:184::-;9515:77;9512:1;9505:88;9612:4;9609:1;9602:15;9636:4;9633:1;9626:15;9652:120;9692:1;9718;9708:35;;9723:18;;:::i;:::-;-1:-1:-1;9757:9:1;;9652:120::o;11315:184::-;11367:77;11364:1;11357:88;11464:4;11461:1;11454:15;11488:4;11485:1;11478:15;14487:195;14526:3;14557:66;14550:5;14547:77;14544:103;;14627:18;;:::i;:::-;-1:-1:-1;14674:1:1;14663:13;;14487:195::o;14687:184::-;14757:6;14810:2;14798:9;14789:7;14785:23;14781:32;14778:52;;;14826:1;14823;14816:12;14778:52;-1:-1:-1;14849:16:1;;14687:184;-1:-1:-1;14687:184:1:o;14876:125::-;14916:4;14944:1;14941;14938:8;14935:34;;;14949:18;;:::i;:::-;-1:-1:-1;14986:9:1;;14876:125::o;15548:1088::-;15633:12;;15598:3;;15688:1;15708:18;;;;15761;;;;15788:61;;15842:4;15834:6;15830:17;15820:27;;15788:61;15868:2;15916;15908:6;15905:14;15885:18;15882:38;15879:218;;15953:77;15950:1;15943:88;16054:4;16051:1;16044:15;16082:4;16079:1;16072:15;15879:218;16113:18;16140:162;;;;16316:1;16311:319;;;;16106:524;;16140:162;16188:66;16177:9;16173:82;16168:3;16161:95;16285:6;16280:3;16276:16;16269:23;;16140:162;;16311:319;15495:1;15488:14;;;15532:4;15519:18;;16405:1;16419:165;16433:6;16430:1;16427:13;16419:165;;;16511:14;;16498:11;;;16491:35;16554:16;;;;16448:10;;16419:165;;;16423:3;;16613:6;16608:3;16604:16;16597:23;;16106:524;;;;;;;15548:1088;;;;:::o;16641:456::-;16862:3;16890:38;16924:3;16916:6;16890:38;:::i;:::-;16957:6;16951:13;16973:52;17018:6;17014:2;17007:4;16999:6;16995:17;16973:52;:::i;:::-;17041:50;17083:6;17079:2;17075:15;17067:6;17041:50;:::i;:::-;17034:57;16641:456;-1:-1:-1;;;;;;;16641:456:1:o;18733:128::-;18773:3;18804:1;18800:6;18797:1;18794:13;18791:39;;;18810:18;;:::i;:::-;-1:-1:-1;18846:9:1;;18733:128::o;20331:112::-;20363:1;20389;20379:35;;20394:18;;:::i;:::-;-1:-1:-1;20428:9:1;;20331:112::o;20448:512::-;20642:4;-1:-1:-1;;;;;20752:2:1;20744:6;20740:15;20729:9;20722:34;20804:2;20796:6;20792:15;20787:2;20776:9;20772:18;20765:43;;20844:6;20839:2;20828:9;20824:18;20817:34;20887:3;20882:2;20871:9;20867:18;20860:31;20908:46;20949:3;20938:9;20934:19;20926:6;20908:46;:::i;:::-;20900:54;20448:512;-1:-1:-1;;;;;;20448:512:1:o;20965:249::-;21034:6;21087:2;21075:9;21066:7;21062:23;21058:32;21055:52;;;21103:1;21100;21093:12;21055:52;21135:9;21129:16;21154:30;21178:5;21154:30;:::i;21631:828::-;21954:3;21982:66;22090:2;22081:6;22077:2;22073:15;22069:24;22064:3;22057:37;22145:2;22136:6;22132:2;22128:15;22124:24;22119:2;22114:3;22110:12;22103:46;22200:2;22191:6;22187:2;22183:15;22179:24;22174:2;22169:3;22165:12;22158:46;;22234:6;22229:2;22224:3;22220:12;22213:28;22271:6;22266:2;22261:3;22257:12;22250:28;22309:6;22303:3;22298;22294:13;22287:29;22361:6;22353;22347:3;22342;22338:13;22325:43;-1:-1:-1;22433:1:1;22391:16;;22409:3;22387:26;22422:13;;;22387:26;21631:828;-1:-1:-1;;;;;;;21631:828:1:o;23182:184::-;23234:77;23231:1;23224:88;23331:4;23328:1;23321:15;23355:4;23352:1;23345:15

Swarm Source

ipfs://0db7d979c6d9a39fd7433bb4f98e542f682831f8751cf1a3ab0d96f9b2754d3a
Loading