ETH Price: $3,617.04 (-2.50%)

Token

ERC-20: Skullies Club (SKULLIES)
 

Overview

Max Total Supply

215 SKULLIES

Holders

102

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SKULLIES
0x734cD106E18A334fB2ecCCE8Ceb2e53610AaDF29
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SkulliesClub

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at FtmScan.com on 2022-01-31
 */

/**
 *Submitted for verification at FtmScan.com on 2022-01-19
 */

/**
 *Submitted for verification at snowtrace.io on 2021-12-31
 */

/**
 *Submitted for verification at testnet.snowtrace.io on 2021-12-23
 */

/**
 *Submitted for verification at testnet.snowtrace.io on 2021-12-09
 */

/**
 *Submitted for verification at snowtrace.io on 2021-11-30
 */

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity 0.8.4;

/**
 * @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
pragma solidity 0.8.4;

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity 0.8.4;

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity 0.8.4;

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

// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.4;

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

pragma solidity 0.8.4;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

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

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

pragma solidity 0.8.4;

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

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

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

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

pragma solidity 0.8.4;

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

// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity 0.8.4;

/**
 * @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/token/ERC721/ERC721.sol
pragma solidity 0.8.4;

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

    // Token symbol
    string private _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 overriden 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
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public 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 ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, 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);
    }

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

    /**
     * @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 of token that is not own"
        );
        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);
    }

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

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

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

pragma solidity 0.8.4;

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

    // Original minter details
    mapping(uint256 => address) internal _originalMinter;

    /**
     * @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)) {
            // mint
            _addTokenToAllTokensEnumeration(tokenId);
            _insertOriginalMinter(to, tokenId);
        } else if (from != to) {
            // transfer - remove token from 'from' enum
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }

        if (to == address(0)) {
            // burn
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            // transfer - add token to 'to' enum
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _insertOriginalMinter(address addr, uint256 tokenId) private {
        _originalMinter[tokenId] = addr;
    }

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

// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity 0.8.4;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity 0.8.4;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

pragma solidity 0.8.4;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

pragma solidity 0.8.4;

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981PerTokenRoyalties is ERC165, IERC2981Royalties {  

    constructor(address _royaltyAddress) {
        royaltyAddress_ = _royaltyAddress;
    } 

    uint256 internal royaltyAmount_ = 0;
    address internal royaltyAddress_;

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256 tokenId, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (royaltyAddress_, (value * royaltyAmount_) / 10000);
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function sqrrt(uint256 a) internal pure returns (uint256 c) {
        if (a > 3) {
            c = a;
            uint256 b = add(div(a, 2), 1);
            while (b < c) {
                c = b;
                b = div(add(div(a, b), b), 2);
            }
        } else if (a != 0) {
            c = 1;
        }
    }

    function percentageAmount(uint256 total_, uint8 percentage_)
        internal
        pure
        returns (uint256 percentAmount_)
    {
        return div(mul(total_, percentage_), 1000);
    }

    function substractPercentage(uint256 total_, uint8 percentageToSub_)
        internal
        pure
        returns (uint256 result_)
    {
        return sub(total_, div(mul(total_, percentageToSub_), 1000));
    }

    function percentageOfTotal(uint256 part_, uint256 total_)
        internal
        pure
        returns (uint256 percent_)
    {
        return div(mul(part_, 100), total_);
    }

    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
    }

    function quadraticPricing(uint256 payment_, uint256 multiplier_)
        internal
        pure
        returns (uint256)
    {
        return sqrrt(mul(multiplier_, payment_));
    }

    function bondingCurve(uint256 supply_, uint256 multiplier_)
        internal
        pure
        returns (uint256)
    {
        return mul(multiplier_, supply_);
    }
}


pragma solidity 0.8.4;

contract SkulliesClub is ERC721Enumerable, Ownable, ERC2981PerTokenRoyalties(msg.sender) {
    using Strings for uint256;
    using SafeMath for uint256;

    string public baseURI;
    string public baseExtension = ".json";
    
    uint256 public maxSupply = 10000;
    uint256 public maxMintForTx = 10;
    uint256 public maxMintsForAddress = 10;
    uint256 public nextTokenId = 1;
    
    bool public paused = false;

    mapping(address => uint256) private addressMints;

    constructor(string memory _initBaseURI)
        ERC721("Skullies Club", "SKULLIES")
    {
        setBaseURI(_initBaseURI);
        royaltyAmount_ = 500; // start at 5%
    }

    function setRoyalties(uint256 _royaltyAmount) external onlyOwner {
        royaltyAmount_ = _royaltyAmount;
    }

    function ownerMint(uint _amount) external onlyOwner {
         for (uint i = 0; i <= _amount; i++) {
            _safeMint(owner(), nextTokenId);
            nextTokenId += 1;
        }
    }

    /*
    @function _baseURI()
    @description - Gets the current base URI for nft metadata
    @returns <string>
  */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

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


    /*
    @function mint(_mintAmount)
    @description - Mints _mintAmount of NFTs for sender address.
    @param <uint256> _mintAmount - The number of NFTs to mint.
  */
    function mint(uint256 _mintAmount) public {
        uint256 supply = (nextTokenId - 1);
        uint256 ownerCanMintCount = (maxMintsForAddress - addressMints[msg.sender]);

        require(
            ownerCanMintCount >= _mintAmount,
            "ERROR: You cant mint that many"
        );

        require(!paused, "ERROR: Contract paused. Please check discord.");

        require(
            _mintAmount <= maxMintForTx,
            "ERROR: The max no mints per transaction exceeded"
        );

        require(
            supply + _mintAmount <= maxSupply,
            "ERROR: Not enough left to mint!"
        );

        uint256 tokenId = nextTokenId;

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, tokenId);

            addressMints[msg.sender]++;
            tokenId += 1;
        }

        nextTokenId += _mintAmount;
    }


    /*
    @function walletOfOwner(_owner)
    @description - Gets the list ok NFT tokenIds that owner has.
  */
    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    /*
    @function tokenURL(tokenId)
    @description - Gets the metadata URI for a NFT tokenId
    @param <uint256> tokenId - The id ok the NFT token
    @returns <string> - The URI for the NFT metadata file
  */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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


    /*
    @function setBaseURI(_newBaseURI)
    @description - Sets the base URI for the meta data files
    @param <string> _newBaseURI - The new base URI for the metadata files
  */
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    /*
    @function setBaseExtension(_newBaseExtension)
    @description - Sets the extension for the meta data file (default .json)
    @param <string> _newBaseExtension - The new file extension to use.
  */
    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    /*
    @function pause(_state)
    @description - Pauses the contract.
    @param <bool> _state - true/false
  */
    function pause(bool _state) public onlyOwner {
        paused = _state;
    }


    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(owner()).call{value: address(this).balance}(
            ""
        );

        require(success);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintForTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltyAmount","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600c556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f90805190602001906200005692919062000381565b50612710601055600a601155600a60125560016013556000601460006101000a81548160ff0219169083151502179055503480156200009457600080fd5b5060405162004e0738038062004e078339818101604052810190620000ba9190620004a3565b336040518060400160405280600d81526020017f536b756c6c69657320436c7562000000000000000000000000000000000000008152506040518060400160405280600881526020017f534b554c4c49455300000000000000000000000000000000000000000000000081525081600090805190602001906200013f92919062000381565b5080600190805190602001906200015892919062000381565b5050506200017b6200016f620001de60201b60201c565b620001e660201b60201c565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001ce81620002ac60201b60201c565b6101f4600c8190555050620006db565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002bc620001de60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e26200035760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200033b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000332906200050f565b60405180910390fd5b80600e90805190602001906200035392919062000381565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200038f90620005d7565b90600052602060002090601f016020900481019282620003b35760008555620003ff565b82601f10620003ce57805160ff1916838001178555620003ff565b82800160010185558215620003ff579182015b82811115620003fe578251825591602001919060010190620003e1565b5b5090506200040e919062000412565b5090565b5b808211156200042d57600081600090555060010162000413565b5090565b60006200044862000442846200055a565b62000531565b9050828152602081018484840111156200046157600080fd5b6200046e848285620005a1565b509392505050565b600082601f8301126200048857600080fd5b81516200049a84826020860162000431565b91505092915050565b600060208284031215620004b657600080fd5b600082015167ffffffffffffffff811115620004d157600080fd5b620004df8482850162000476565b91505092915050565b6000620004f760208362000590565b91506200050482620006b2565b602082019050919050565b600060208201905081810360008301526200052a81620004e8565b9050919050565b60006200053d62000550565b90506200054b82826200060d565b919050565b6000604051905090565b600067ffffffffffffffff82111562000578576200057762000672565b5b6200058382620006a1565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005c1578082015181840152602081019050620005a4565b83811115620005d1576000848401525b50505050565b60006002820490506001821680620005f057607f821691505b6020821081141562000607576200060662000643565b5b50919050565b6200061882620006a1565b810181811067ffffffffffffffff821117156200063a576200063962000672565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61471c80620006eb6000396000f3fe6080604052600436106102045760003560e01c80636c0360eb11610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb011461076f578063da3ef23f1461079a578063e985e9c5146107c3578063f19e75d414610800578063f2fde38b1461082957610204565b8063a22cb465146106b5578063b88d4fde146106de578063c668286214610707578063c87b56dd1461073257610204565b8063891ef238116100e7578063891ef238146105e05780638da5cb5b1461060b57806395d89b4114610636578063a0712d6814610661578063a11ce1001461068a57610204565b80636c0360eb1461053657806370a0823114610561578063715018a61461059e57806375794a3c146105b557610204565b80632b80183f1161019b578063438b63001161016a578063438b63001461042b5780634f6ccce71461046857806355f804b3146104a55780635c975abb146104ce5780636352211e146104f957610204565b80632b80183f146103925780632f745c59146103bb5780633ccfd60b146103f857806342842e0e1461040257610204565b8063095ea7b3116101d7578063095ea7b3146102d757806318160ddd1461030057806323b872dd1461032b5780632a55205a1461035457610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613208565b610852565b60405161023d91906138f1565b60405180910390f35b34801561025257600080fd5b5061026d600480360381019061026891906131df565b610864565b005b34801561027b57600080fd5b506102846108fd565b604051610291919061390c565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc919061329b565b61098f565b6040516102ce919061383f565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f991906131a3565b610a14565b005b34801561030c57600080fd5b50610315610b2c565b6040516103229190613bee565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d919061309d565b610b39565b005b34801561036057600080fd5b5061037b600480360381019061037691906132c4565b610b99565b6040516103899291906138a6565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b4919061329b565b610be5565b005b3480156103c757600080fd5b506103e260048036038101906103dd91906131a3565b610c6b565b6040516103ef9190613bee565b60405180910390f35b610400610d10565b005b34801561040e57600080fd5b506104296004803603810190610424919061309d565b610e0c565b005b34801561043757600080fd5b50610452600480360381019061044d9190613038565b610e2c565b60405161045f91906138cf565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a919061329b565b610f26565b60405161049c9190613bee565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c7919061325a565b610fbd565b005b3480156104da57600080fd5b506104e3611053565b6040516104f091906138f1565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b919061329b565b611066565b60405161052d919061383f565b60405180910390f35b34801561054257600080fd5b5061054b611118565b604051610558919061390c565b60405180910390f35b34801561056d57600080fd5b5061058860048036038101906105839190613038565b6111a6565b6040516105959190613bee565b60405180910390f35b3480156105aa57600080fd5b506105b361125e565b005b3480156105c157600080fd5b506105ca6112e6565b6040516105d79190613bee565b60405180910390f35b3480156105ec57600080fd5b506105f56112ec565b6040516106029190613bee565b60405180910390f35b34801561061757600080fd5b506106206112f2565b60405161062d919061383f565b60405180910390f35b34801561064257600080fd5b5061064b61131c565b604051610658919061390c565b60405180910390f35b34801561066d57600080fd5b506106886004803603810190610683919061329b565b6113ae565b005b34801561069657600080fd5b5061069f6115f0565b6040516106ac9190613bee565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190613167565b6115f6565b005b3480156106ea57600080fd5b50610705600480360381019061070091906130ec565b611777565b005b34801561071357600080fd5b5061071c6117d9565b604051610729919061390c565b60405180910390f35b34801561073e57600080fd5b506107596004803603810190610754919061329b565b611867565b604051610766919061390c565b60405180910390f35b34801561077b57600080fd5b50610784611912565b6040516107919190613bee565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc919061325a565b611918565b005b3480156107cf57600080fd5b506107ea60048036038101906107e59190613061565b6119ae565b6040516107f791906138f1565b60405180910390f35b34801561080c57600080fd5b506108276004803603810190610822919061329b565b611a42565b005b34801561083557600080fd5b50610850600480360381019061084b9190613038565b611b0c565b005b600061085d82611c04565b9050919050565b61086c611c7e565b73ffffffffffffffffffffffffffffffffffffffff1661088a6112f2565b73ffffffffffffffffffffffffffffffffffffffff16146108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d790613ace565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b60606000805461090c90613ef7565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613ef7565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b5050505050905090565b600061099a82611c86565b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d090613aae565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1f82611066565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8790613b4e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aaf611c7e565b73ffffffffffffffffffffffffffffffffffffffff161480610ade5750610add81610ad8611c7e565b6119ae565b5b610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490613a0e565b60405180910390fd5b610b278383611cf2565b505050565b6000600880549050905090565b610b4a610b44611c7e565b82611dab565b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8090613b6e565b60405180910390fd5b610b94838383611e89565b505050565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600c5485610bd09190613db3565b610bda9190613d82565b915091509250929050565b610bed611c7e565b73ffffffffffffffffffffffffffffffffffffffff16610c0b6112f2565b73ffffffffffffffffffffffffffffffffffffffff1614610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890613ace565b60405180910390fd5b80600c8190555050565b6000610c76836111a6565b8210610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae9061392e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d18611c7e565b73ffffffffffffffffffffffffffffffffffffffff16610d366112f2565b73ffffffffffffffffffffffffffffffffffffffff1614610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390613ace565b60405180910390fd5b6000610d966112f2565b73ffffffffffffffffffffffffffffffffffffffff1647604051610db99061382a565b60006040518083038185875af1925050503d8060008114610df6576040519150601f19603f3d011682016040523d82523d6000602084013e610dfb565b606091505b5050905080610e0957600080fd5b50565b610e2783838360405180602001604052806000815250611777565b505050565b60606000610e39836111a6565b905060008167ffffffffffffffff811115610e7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610eab5781602001602082028036833780820191505090505b50905060005b82811015610f1b57610ec38582610c6b565b828281518110610efc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f1390613f5a565b915050610eb1565b508092505050919050565b6000610f30610b2c565b8210610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613b8e565b60405180910390fd5b60088281548110610fab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610fc5611c7e565b73ffffffffffffffffffffffffffffffffffffffff16610fe36112f2565b73ffffffffffffffffffffffffffffffffffffffff1614611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090613ace565b60405180910390fd5b80600e908051906020019061104f929190612e5c565b5050565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110690613a4e565b60405180910390fd5b80915050919050565b600e805461112590613ef7565b80601f016020809104026020016040519081016040528092919081815260200182805461115190613ef7565b801561119e5780601f106111735761010080835404028352916020019161119e565b820191906000526020600020905b81548152906001019060200180831161118157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90613a2e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611266611c7e565b73ffffffffffffffffffffffffffffffffffffffff166112846112f2565b73ffffffffffffffffffffffffffffffffffffffff16146112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d190613ace565b60405180910390fd5b6112e460006120e5565b565b60135481565b60125481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132b90613ef7565b80601f016020809104026020016040519081016040528092919081815260200182805461135790613ef7565b80156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050905090565b600060016013546113bf9190613e0d565b90506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546012546114109190613e0d565b905082811015611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90613b2e565b60405180910390fd5b601460009054906101000a900460ff16156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90613bce565b60405180910390fd5b6011548311156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613bae565b60405180910390fd5b60105483836114f99190613d2c565b111561153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190613a8e565b60405180910390fd5b600060135490506000600190505b8481116115d05761155933836121ab565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906115a990613f5a565b91905055506001826115bb9190613d2c565b915080806115c890613f5a565b915050611548565b5083601360008282546115e39190613d2c565b9250508190555050505050565b60115481565b6115fe611c7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906139ce565b60405180910390fd5b8060056000611679611c7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611726611c7e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161176b91906138f1565b60405180910390a35050565b611788611782611c7e565b83611dab565b6117c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117be90613b6e565b60405180910390fd5b6117d3848484846121c9565b50505050565b600f80546117e690613ef7565b80601f016020809104026020016040519081016040528092919081815260200182805461181290613ef7565b801561185f5780601f106118345761010080835404028352916020019161185f565b820191906000526020600020905b81548152906001019060200180831161184257829003601f168201915b505050505081565b606061187282611c86565b6118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890613b0e565b60405180910390fd5b6000600e80546118c090613ef7565b9050116118dc576040518060200160405280600081525061190b565b600e6118e783612225565b600f6040516020016118fb939291906137f9565b6040516020818303038152906040525b9050919050565b60105481565b611920611c7e565b73ffffffffffffffffffffffffffffffffffffffff1661193e6112f2565b73ffffffffffffffffffffffffffffffffffffffff1614611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198b90613ace565b60405180910390fd5b80600f90805190602001906119aa929190612e5c565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a4a611c7e565b73ffffffffffffffffffffffffffffffffffffffff16611a686112f2565b73ffffffffffffffffffffffffffffffffffffffff1614611abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab590613ace565b60405180910390fd5b60005b818111611b0857611adb611ad36112f2565b6013546121ab565b600160136000828254611aee9190613d2c565b925050819055508080611b0090613f5a565b915050611ac1565b5050565b611b14611c7e565b73ffffffffffffffffffffffffffffffffffffffff16611b326112f2565b73ffffffffffffffffffffffffffffffffffffffff1614611b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7f90613ace565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef9061396e565b60405180910390fd5b611c01816120e5565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c775750611c76826123d2565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d6583611066565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611db682611c86565b611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec906139ee565b60405180910390fd5b6000611e0083611066565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e6f57508373ffffffffffffffffffffffffffffffffffffffff16611e578461098f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e805750611e7f81856119ae565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ea982611066565b73ffffffffffffffffffffffffffffffffffffffff1614611eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef690613aee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f66906139ae565b60405180910390fd5b611f7a83838361244c565b611f85600082611cf2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd59190613e0d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461202c9190613d2c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121c582826040518060200160405280600081525061256a565b5050565b6121d4848484611e89565b6121e0848484846125c5565b61221f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122169061394e565b60405180910390fd5b50505050565b6060600082141561226d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123cd565b600082905060005b6000821461229f57808061228890613f5a565b915050600a826122989190613d82565b9150612275565b60008167ffffffffffffffff8111156122e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123135781602001600182028036833780820191505090505b5090505b600085146123c65760018261232c9190613e0d565b9150600a8561233b9190613fa3565b60306123479190613d2c565b60f81b818381518110612383577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123bf9190613d82565b9450612317565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061244557506124448261275c565b5b9050919050565b61245783838361283e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124a45761249581612843565b61249f828261288c565b6124e3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e2576124e183826128e2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125265761252181612a4f565b612565565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612564576125638282612b92565b5b5b505050565b6125748383612c11565b61258160008484846125c5565b6125c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b79061394e565b60405180910390fd5b505050565b60006125e68473ffffffffffffffffffffffffffffffffffffffff16612ddf565b1561274f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261260f611c7e565b8786866040518563ffffffff1660e01b8152600401612631949392919061385a565b602060405180830381600087803b15801561264b57600080fd5b505af192505050801561267c57506040513d601f19601f820116820180604052508101906126799190613231565b60015b6126ff573d80600081146126ac576040519150601f19603f3d011682016040523d82523d6000602084013e6126b1565b606091505b506000815114156126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee9061394e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612754565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061282757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612837575061283682612df2565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600060016128ef846111a6565b6128f99190613e0d565b90506000600760008481526020019081526020016000205490508181146129de576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a639190613e0d565b9050600060096000848152602001908152602001600020549050600060088381548110612ab9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b9d836111a6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7890613a6e565b60405180910390fd5b612c8a81611c86565b15612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc19061398e565b60405180910390fd5b612cd66000838361244c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d269190613d2c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612e6890613ef7565b90600052602060002090601f016020900481019282612e8a5760008555612ed1565b82601f10612ea357805160ff1916838001178555612ed1565b82800160010185558215612ed1579182015b82811115612ed0578251825591602001919060010190612eb5565b5b509050612ede9190612ee2565b5090565b5b80821115612efb576000816000905550600101612ee3565b5090565b6000612f12612f0d84613c2e565b613c09565b905082815260208101848484011115612f2a57600080fd5b612f35848285613eb5565b509392505050565b6000612f50612f4b84613c5f565b613c09565b905082815260208101848484011115612f6857600080fd5b612f73848285613eb5565b509392505050565b600081359050612f8a8161468a565b92915050565b600081359050612f9f816146a1565b92915050565b600081359050612fb4816146b8565b92915050565b600081519050612fc9816146b8565b92915050565b600082601f830112612fe057600080fd5b8135612ff0848260208601612eff565b91505092915050565b600082601f83011261300a57600080fd5b813561301a848260208601612f3d565b91505092915050565b600081359050613032816146cf565b92915050565b60006020828403121561304a57600080fd5b600061305884828501612f7b565b91505092915050565b6000806040838503121561307457600080fd5b600061308285828601612f7b565b925050602061309385828601612f7b565b9150509250929050565b6000806000606084860312156130b257600080fd5b60006130c086828701612f7b565b93505060206130d186828701612f7b565b92505060406130e286828701613023565b9150509250925092565b6000806000806080858703121561310257600080fd5b600061311087828801612f7b565b945050602061312187828801612f7b565b935050604061313287828801613023565b925050606085013567ffffffffffffffff81111561314f57600080fd5b61315b87828801612fcf565b91505092959194509250565b6000806040838503121561317a57600080fd5b600061318885828601612f7b565b925050602061319985828601612f90565b9150509250929050565b600080604083850312156131b657600080fd5b60006131c485828601612f7b565b92505060206131d585828601613023565b9150509250929050565b6000602082840312156131f157600080fd5b60006131ff84828501612f90565b91505092915050565b60006020828403121561321a57600080fd5b600061322884828501612fa5565b91505092915050565b60006020828403121561324357600080fd5b600061325184828501612fba565b91505092915050565b60006020828403121561326c57600080fd5b600082013567ffffffffffffffff81111561328657600080fd5b61329284828501612ff9565b91505092915050565b6000602082840312156132ad57600080fd5b60006132bb84828501613023565b91505092915050565b600080604083850312156132d757600080fd5b60006132e585828601613023565b92505060206132f685828601613023565b9150509250929050565b600061330c83836137db565b60208301905092915050565b61332181613e41565b82525050565b600061333282613cb5565b61333c8185613ce3565b935061334783613c90565b8060005b8381101561337857815161335f8882613300565b975061336a83613cd6565b92505060018101905061334b565b5085935050505092915050565b61338e81613e53565b82525050565b600061339f82613cc0565b6133a98185613cf4565b93506133b9818560208601613ec4565b6133c281614090565b840191505092915050565b60006133d882613ccb565b6133e28185613d10565b93506133f2818560208601613ec4565b6133fb81614090565b840191505092915050565b600061341182613ccb565b61341b8185613d21565b935061342b818560208601613ec4565b80840191505092915050565b6000815461344481613ef7565b61344e8186613d21565b94506001821660008114613469576001811461347a576134ad565b60ff198316865281860193506134ad565b61348385613ca0565b60005b838110156134a557815481890152600182019150602081019050613486565b838801955050505b50505092915050565b60006134c3602b83613d10565b91506134ce826140a1565b604082019050919050565b60006134e6603283613d10565b91506134f1826140f0565b604082019050919050565b6000613509602683613d10565b91506135148261413f565b604082019050919050565b600061352c601c83613d10565b91506135378261418e565b602082019050919050565b600061354f602483613d10565b915061355a826141b7565b604082019050919050565b6000613572601983613d10565b915061357d82614206565b602082019050919050565b6000613595602c83613d10565b91506135a08261422f565b604082019050919050565b60006135b8603883613d10565b91506135c38261427e565b604082019050919050565b60006135db602a83613d10565b91506135e6826142cd565b604082019050919050565b60006135fe602983613d10565b91506136098261431c565b604082019050919050565b6000613621602083613d10565b915061362c8261436b565b602082019050919050565b6000613644601f83613d10565b915061364f82614394565b602082019050919050565b6000613667602c83613d10565b9150613672826143bd565b604082019050919050565b600061368a602083613d10565b91506136958261440c565b602082019050919050565b60006136ad602983613d10565b91506136b882614435565b604082019050919050565b60006136d0602f83613d10565b91506136db82614484565b604082019050919050565b60006136f3601e83613d10565b91506136fe826144d3565b602082019050919050565b6000613716602183613d10565b9150613721826144fc565b604082019050919050565b6000613739600083613d05565b91506137448261454b565b600082019050919050565b600061375c603183613d10565b91506137678261454e565b604082019050919050565b600061377f602c83613d10565b915061378a8261459d565b604082019050919050565b60006137a2603083613d10565b91506137ad826145ec565b604082019050919050565b60006137c5602d83613d10565b91506137d08261463b565b604082019050919050565b6137e481613eab565b82525050565b6137f381613eab565b82525050565b60006138058286613437565b91506138118285613406565b915061381d8284613437565b9150819050949350505050565b60006138358261372c565b9150819050919050565b60006020820190506138546000830184613318565b92915050565b600060808201905061386f6000830187613318565b61387c6020830186613318565b61388960408301856137ea565b818103606083015261389b8184613394565b905095945050505050565b60006040820190506138bb6000830185613318565b6138c860208301846137ea565b9392505050565b600060208201905081810360008301526138e98184613327565b905092915050565b60006020820190506139066000830184613385565b92915050565b6000602082019050818103600083015261392681846133cd565b905092915050565b60006020820190508181036000830152613947816134b6565b9050919050565b60006020820190508181036000830152613967816134d9565b9050919050565b60006020820190508181036000830152613987816134fc565b9050919050565b600060208201905081810360008301526139a78161351f565b9050919050565b600060208201905081810360008301526139c781613542565b9050919050565b600060208201905081810360008301526139e781613565565b9050919050565b60006020820190508181036000830152613a0781613588565b9050919050565b60006020820190508181036000830152613a27816135ab565b9050919050565b60006020820190508181036000830152613a47816135ce565b9050919050565b60006020820190508181036000830152613a67816135f1565b9050919050565b60006020820190508181036000830152613a8781613614565b9050919050565b60006020820190508181036000830152613aa781613637565b9050919050565b60006020820190508181036000830152613ac78161365a565b9050919050565b60006020820190508181036000830152613ae78161367d565b9050919050565b60006020820190508181036000830152613b07816136a0565b9050919050565b60006020820190508181036000830152613b27816136c3565b9050919050565b60006020820190508181036000830152613b47816136e6565b9050919050565b60006020820190508181036000830152613b6781613709565b9050919050565b60006020820190508181036000830152613b878161374f565b9050919050565b60006020820190508181036000830152613ba781613772565b9050919050565b60006020820190508181036000830152613bc781613795565b9050919050565b60006020820190508181036000830152613be7816137b8565b9050919050565b6000602082019050613c0360008301846137ea565b92915050565b6000613c13613c24565b9050613c1f8282613f29565b919050565b6000604051905090565b600067ffffffffffffffff821115613c4957613c48614061565b5b613c5282614090565b9050602081019050919050565b600067ffffffffffffffff821115613c7a57613c79614061565b5b613c8382614090565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d3782613eab565b9150613d4283613eab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d7757613d76613fd4565b5b828201905092915050565b6000613d8d82613eab565b9150613d9883613eab565b925082613da857613da7614003565b5b828204905092915050565b6000613dbe82613eab565b9150613dc983613eab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e0257613e01613fd4565b5b828202905092915050565b6000613e1882613eab565b9150613e2383613eab565b925082821015613e3657613e35613fd4565b5b828203905092915050565b6000613e4c82613e8b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ee2578082015181840152602081019050613ec7565b83811115613ef1576000848401525b50505050565b60006002820490506001821680613f0f57607f821691505b60208210811415613f2357613f22614032565b5b50919050565b613f3282614090565b810181811067ffffffffffffffff82111715613f5157613f50614061565b5b80604052505050565b6000613f6582613eab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f9857613f97613fd4565b5b600182019050919050565b6000613fae82613eab565b9150613fb983613eab565b925082613fc957613fc8614003565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552524f523a204e6f7420656e6f756768206c65667420746f206d696e742100600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552524f523a20596f752063616e74206d696e742074686174206d616e790000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552524f523a20546865206d6178206e6f206d696e747320706572207472616e60008201527f73616374696f6e20657863656564656400000000000000000000000000000000602082015250565b7f4552524f523a20436f6e7472616374207061757365642e20506c65617365206360008201527f6865636b20646973636f72642e00000000000000000000000000000000000000602082015250565b61469381613e41565b811461469e57600080fd5b50565b6146aa81613e53565b81146146b557600080fd5b50565b6146c181613e5f565b81146146cc57600080fd5b50565b6146d881613eab565b81146146e357600080fd5b5056fea2646970667358221220ccefa04e38ec819abb81627085743ccc0f83bf8fad0312b6e57560af878dba5e64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d583732633274394874705641754d76594c344a7554506e4e55547563645a3632375476684477674d766532662f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636c0360eb11610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb011461076f578063da3ef23f1461079a578063e985e9c5146107c3578063f19e75d414610800578063f2fde38b1461082957610204565b8063a22cb465146106b5578063b88d4fde146106de578063c668286214610707578063c87b56dd1461073257610204565b8063891ef238116100e7578063891ef238146105e05780638da5cb5b1461060b57806395d89b4114610636578063a0712d6814610661578063a11ce1001461068a57610204565b80636c0360eb1461053657806370a0823114610561578063715018a61461059e57806375794a3c146105b557610204565b80632b80183f1161019b578063438b63001161016a578063438b63001461042b5780634f6ccce71461046857806355f804b3146104a55780635c975abb146104ce5780636352211e146104f957610204565b80632b80183f146103925780632f745c59146103bb5780633ccfd60b146103f857806342842e0e1461040257610204565b8063095ea7b3116101d7578063095ea7b3146102d757806318160ddd1461030057806323b872dd1461032b5780632a55205a1461035457610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613208565b610852565b60405161023d91906138f1565b60405180910390f35b34801561025257600080fd5b5061026d600480360381019061026891906131df565b610864565b005b34801561027b57600080fd5b506102846108fd565b604051610291919061390c565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc919061329b565b61098f565b6040516102ce919061383f565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f991906131a3565b610a14565b005b34801561030c57600080fd5b50610315610b2c565b6040516103229190613bee565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d919061309d565b610b39565b005b34801561036057600080fd5b5061037b600480360381019061037691906132c4565b610b99565b6040516103899291906138a6565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b4919061329b565b610be5565b005b3480156103c757600080fd5b506103e260048036038101906103dd91906131a3565b610c6b565b6040516103ef9190613bee565b60405180910390f35b610400610d10565b005b34801561040e57600080fd5b506104296004803603810190610424919061309d565b610e0c565b005b34801561043757600080fd5b50610452600480360381019061044d9190613038565b610e2c565b60405161045f91906138cf565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a919061329b565b610f26565b60405161049c9190613bee565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c7919061325a565b610fbd565b005b3480156104da57600080fd5b506104e3611053565b6040516104f091906138f1565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b919061329b565b611066565b60405161052d919061383f565b60405180910390f35b34801561054257600080fd5b5061054b611118565b604051610558919061390c565b60405180910390f35b34801561056d57600080fd5b5061058860048036038101906105839190613038565b6111a6565b6040516105959190613bee565b60405180910390f35b3480156105aa57600080fd5b506105b361125e565b005b3480156105c157600080fd5b506105ca6112e6565b6040516105d79190613bee565b60405180910390f35b3480156105ec57600080fd5b506105f56112ec565b6040516106029190613bee565b60405180910390f35b34801561061757600080fd5b506106206112f2565b60405161062d919061383f565b60405180910390f35b34801561064257600080fd5b5061064b61131c565b604051610658919061390c565b60405180910390f35b34801561066d57600080fd5b506106886004803603810190610683919061329b565b6113ae565b005b34801561069657600080fd5b5061069f6115f0565b6040516106ac9190613bee565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190613167565b6115f6565b005b3480156106ea57600080fd5b50610705600480360381019061070091906130ec565b611777565b005b34801561071357600080fd5b5061071c6117d9565b604051610729919061390c565b60405180910390f35b34801561073e57600080fd5b506107596004803603810190610754919061329b565b611867565b604051610766919061390c565b60405180910390f35b34801561077b57600080fd5b50610784611912565b6040516107919190613bee565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc919061325a565b611918565b005b3480156107cf57600080fd5b506107ea60048036038101906107e59190613061565b6119ae565b6040516107f791906138f1565b60405180910390f35b34801561080c57600080fd5b506108276004803603810190610822919061329b565b611a42565b005b34801561083557600080fd5b50610850600480360381019061084b9190613038565b611b0c565b005b600061085d82611c04565b9050919050565b61086c611c7e565b73ffffffffffffffffffffffffffffffffffffffff1661088a6112f2565b73ffffffffffffffffffffffffffffffffffffffff16146108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d790613ace565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b60606000805461090c90613ef7565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613ef7565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b5050505050905090565b600061099a82611c86565b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d090613aae565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1f82611066565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8790613b4e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aaf611c7e565b73ffffffffffffffffffffffffffffffffffffffff161480610ade5750610add81610ad8611c7e565b6119ae565b5b610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490613a0e565b60405180910390fd5b610b278383611cf2565b505050565b6000600880549050905090565b610b4a610b44611c7e565b82611dab565b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8090613b6e565b60405180910390fd5b610b94838383611e89565b505050565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600c5485610bd09190613db3565b610bda9190613d82565b915091509250929050565b610bed611c7e565b73ffffffffffffffffffffffffffffffffffffffff16610c0b6112f2565b73ffffffffffffffffffffffffffffffffffffffff1614610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890613ace565b60405180910390fd5b80600c8190555050565b6000610c76836111a6565b8210610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae9061392e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d18611c7e565b73ffffffffffffffffffffffffffffffffffffffff16610d366112f2565b73ffffffffffffffffffffffffffffffffffffffff1614610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390613ace565b60405180910390fd5b6000610d966112f2565b73ffffffffffffffffffffffffffffffffffffffff1647604051610db99061382a565b60006040518083038185875af1925050503d8060008114610df6576040519150601f19603f3d011682016040523d82523d6000602084013e610dfb565b606091505b5050905080610e0957600080fd5b50565b610e2783838360405180602001604052806000815250611777565b505050565b60606000610e39836111a6565b905060008167ffffffffffffffff811115610e7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610eab5781602001602082028036833780820191505090505b50905060005b82811015610f1b57610ec38582610c6b565b828281518110610efc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f1390613f5a565b915050610eb1565b508092505050919050565b6000610f30610b2c565b8210610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613b8e565b60405180910390fd5b60088281548110610fab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610fc5611c7e565b73ffffffffffffffffffffffffffffffffffffffff16610fe36112f2565b73ffffffffffffffffffffffffffffffffffffffff1614611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090613ace565b60405180910390fd5b80600e908051906020019061104f929190612e5c565b5050565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110690613a4e565b60405180910390fd5b80915050919050565b600e805461112590613ef7565b80601f016020809104026020016040519081016040528092919081815260200182805461115190613ef7565b801561119e5780601f106111735761010080835404028352916020019161119e565b820191906000526020600020905b81548152906001019060200180831161118157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90613a2e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611266611c7e565b73ffffffffffffffffffffffffffffffffffffffff166112846112f2565b73ffffffffffffffffffffffffffffffffffffffff16146112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d190613ace565b60405180910390fd5b6112e460006120e5565b565b60135481565b60125481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132b90613ef7565b80601f016020809104026020016040519081016040528092919081815260200182805461135790613ef7565b80156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050905090565b600060016013546113bf9190613e0d565b90506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546012546114109190613e0d565b905082811015611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90613b2e565b60405180910390fd5b601460009054906101000a900460ff16156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90613bce565b60405180910390fd5b6011548311156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613bae565b60405180910390fd5b60105483836114f99190613d2c565b111561153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190613a8e565b60405180910390fd5b600060135490506000600190505b8481116115d05761155933836121ab565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906115a990613f5a565b91905055506001826115bb9190613d2c565b915080806115c890613f5a565b915050611548565b5083601360008282546115e39190613d2c565b9250508190555050505050565b60115481565b6115fe611c7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906139ce565b60405180910390fd5b8060056000611679611c7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611726611c7e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161176b91906138f1565b60405180910390a35050565b611788611782611c7e565b83611dab565b6117c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117be90613b6e565b60405180910390fd5b6117d3848484846121c9565b50505050565b600f80546117e690613ef7565b80601f016020809104026020016040519081016040528092919081815260200182805461181290613ef7565b801561185f5780601f106118345761010080835404028352916020019161185f565b820191906000526020600020905b81548152906001019060200180831161184257829003601f168201915b505050505081565b606061187282611c86565b6118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890613b0e565b60405180910390fd5b6000600e80546118c090613ef7565b9050116118dc576040518060200160405280600081525061190b565b600e6118e783612225565b600f6040516020016118fb939291906137f9565b6040516020818303038152906040525b9050919050565b60105481565b611920611c7e565b73ffffffffffffffffffffffffffffffffffffffff1661193e6112f2565b73ffffffffffffffffffffffffffffffffffffffff1614611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198b90613ace565b60405180910390fd5b80600f90805190602001906119aa929190612e5c565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a4a611c7e565b73ffffffffffffffffffffffffffffffffffffffff16611a686112f2565b73ffffffffffffffffffffffffffffffffffffffff1614611abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab590613ace565b60405180910390fd5b60005b818111611b0857611adb611ad36112f2565b6013546121ab565b600160136000828254611aee9190613d2c565b925050819055508080611b0090613f5a565b915050611ac1565b5050565b611b14611c7e565b73ffffffffffffffffffffffffffffffffffffffff16611b326112f2565b73ffffffffffffffffffffffffffffffffffffffff1614611b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7f90613ace565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef9061396e565b60405180910390fd5b611c01816120e5565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c775750611c76826123d2565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d6583611066565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611db682611c86565b611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec906139ee565b60405180910390fd5b6000611e0083611066565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e6f57508373ffffffffffffffffffffffffffffffffffffffff16611e578461098f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e805750611e7f81856119ae565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ea982611066565b73ffffffffffffffffffffffffffffffffffffffff1614611eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef690613aee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f66906139ae565b60405180910390fd5b611f7a83838361244c565b611f85600082611cf2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd59190613e0d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461202c9190613d2c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121c582826040518060200160405280600081525061256a565b5050565b6121d4848484611e89565b6121e0848484846125c5565b61221f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122169061394e565b60405180910390fd5b50505050565b6060600082141561226d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123cd565b600082905060005b6000821461229f57808061228890613f5a565b915050600a826122989190613d82565b9150612275565b60008167ffffffffffffffff8111156122e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123135781602001600182028036833780820191505090505b5090505b600085146123c65760018261232c9190613e0d565b9150600a8561233b9190613fa3565b60306123479190613d2c565b60f81b818381518110612383577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123bf9190613d82565b9450612317565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061244557506124448261275c565b5b9050919050565b61245783838361283e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124a45761249581612843565b61249f828261288c565b6124e3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e2576124e183826128e2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125265761252181612a4f565b612565565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612564576125638282612b92565b5b5b505050565b6125748383612c11565b61258160008484846125c5565b6125c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b79061394e565b60405180910390fd5b505050565b60006125e68473ffffffffffffffffffffffffffffffffffffffff16612ddf565b1561274f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261260f611c7e565b8786866040518563ffffffff1660e01b8152600401612631949392919061385a565b602060405180830381600087803b15801561264b57600080fd5b505af192505050801561267c57506040513d601f19601f820116820180604052508101906126799190613231565b60015b6126ff573d80600081146126ac576040519150601f19603f3d011682016040523d82523d6000602084013e6126b1565b606091505b506000815114156126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee9061394e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612754565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061282757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612837575061283682612df2565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600060016128ef846111a6565b6128f99190613e0d565b90506000600760008481526020019081526020016000205490508181146129de576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a639190613e0d565b9050600060096000848152602001908152602001600020549050600060088381548110612ab9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b9d836111a6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7890613a6e565b60405180910390fd5b612c8a81611c86565b15612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc19061398e565b60405180910390fd5b612cd66000838361244c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d269190613d2c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612e6890613ef7565b90600052602060002090601f016020900481019282612e8a5760008555612ed1565b82601f10612ea357805160ff1916838001178555612ed1565b82800160010185558215612ed1579182015b82811115612ed0578251825591602001919060010190612eb5565b5b509050612ede9190612ee2565b5090565b5b80821115612efb576000816000905550600101612ee3565b5090565b6000612f12612f0d84613c2e565b613c09565b905082815260208101848484011115612f2a57600080fd5b612f35848285613eb5565b509392505050565b6000612f50612f4b84613c5f565b613c09565b905082815260208101848484011115612f6857600080fd5b612f73848285613eb5565b509392505050565b600081359050612f8a8161468a565b92915050565b600081359050612f9f816146a1565b92915050565b600081359050612fb4816146b8565b92915050565b600081519050612fc9816146b8565b92915050565b600082601f830112612fe057600080fd5b8135612ff0848260208601612eff565b91505092915050565b600082601f83011261300a57600080fd5b813561301a848260208601612f3d565b91505092915050565b600081359050613032816146cf565b92915050565b60006020828403121561304a57600080fd5b600061305884828501612f7b565b91505092915050565b6000806040838503121561307457600080fd5b600061308285828601612f7b565b925050602061309385828601612f7b565b9150509250929050565b6000806000606084860312156130b257600080fd5b60006130c086828701612f7b565b93505060206130d186828701612f7b565b92505060406130e286828701613023565b9150509250925092565b6000806000806080858703121561310257600080fd5b600061311087828801612f7b565b945050602061312187828801612f7b565b935050604061313287828801613023565b925050606085013567ffffffffffffffff81111561314f57600080fd5b61315b87828801612fcf565b91505092959194509250565b6000806040838503121561317a57600080fd5b600061318885828601612f7b565b925050602061319985828601612f90565b9150509250929050565b600080604083850312156131b657600080fd5b60006131c485828601612f7b565b92505060206131d585828601613023565b9150509250929050565b6000602082840312156131f157600080fd5b60006131ff84828501612f90565b91505092915050565b60006020828403121561321a57600080fd5b600061322884828501612fa5565b91505092915050565b60006020828403121561324357600080fd5b600061325184828501612fba565b91505092915050565b60006020828403121561326c57600080fd5b600082013567ffffffffffffffff81111561328657600080fd5b61329284828501612ff9565b91505092915050565b6000602082840312156132ad57600080fd5b60006132bb84828501613023565b91505092915050565b600080604083850312156132d757600080fd5b60006132e585828601613023565b92505060206132f685828601613023565b9150509250929050565b600061330c83836137db565b60208301905092915050565b61332181613e41565b82525050565b600061333282613cb5565b61333c8185613ce3565b935061334783613c90565b8060005b8381101561337857815161335f8882613300565b975061336a83613cd6565b92505060018101905061334b565b5085935050505092915050565b61338e81613e53565b82525050565b600061339f82613cc0565b6133a98185613cf4565b93506133b9818560208601613ec4565b6133c281614090565b840191505092915050565b60006133d882613ccb565b6133e28185613d10565b93506133f2818560208601613ec4565b6133fb81614090565b840191505092915050565b600061341182613ccb565b61341b8185613d21565b935061342b818560208601613ec4565b80840191505092915050565b6000815461344481613ef7565b61344e8186613d21565b94506001821660008114613469576001811461347a576134ad565b60ff198316865281860193506134ad565b61348385613ca0565b60005b838110156134a557815481890152600182019150602081019050613486565b838801955050505b50505092915050565b60006134c3602b83613d10565b91506134ce826140a1565b604082019050919050565b60006134e6603283613d10565b91506134f1826140f0565b604082019050919050565b6000613509602683613d10565b91506135148261413f565b604082019050919050565b600061352c601c83613d10565b91506135378261418e565b602082019050919050565b600061354f602483613d10565b915061355a826141b7565b604082019050919050565b6000613572601983613d10565b915061357d82614206565b602082019050919050565b6000613595602c83613d10565b91506135a08261422f565b604082019050919050565b60006135b8603883613d10565b91506135c38261427e565b604082019050919050565b60006135db602a83613d10565b91506135e6826142cd565b604082019050919050565b60006135fe602983613d10565b91506136098261431c565b604082019050919050565b6000613621602083613d10565b915061362c8261436b565b602082019050919050565b6000613644601f83613d10565b915061364f82614394565b602082019050919050565b6000613667602c83613d10565b9150613672826143bd565b604082019050919050565b600061368a602083613d10565b91506136958261440c565b602082019050919050565b60006136ad602983613d10565b91506136b882614435565b604082019050919050565b60006136d0602f83613d10565b91506136db82614484565b604082019050919050565b60006136f3601e83613d10565b91506136fe826144d3565b602082019050919050565b6000613716602183613d10565b9150613721826144fc565b604082019050919050565b6000613739600083613d05565b91506137448261454b565b600082019050919050565b600061375c603183613d10565b91506137678261454e565b604082019050919050565b600061377f602c83613d10565b915061378a8261459d565b604082019050919050565b60006137a2603083613d10565b91506137ad826145ec565b604082019050919050565b60006137c5602d83613d10565b91506137d08261463b565b604082019050919050565b6137e481613eab565b82525050565b6137f381613eab565b82525050565b60006138058286613437565b91506138118285613406565b915061381d8284613437565b9150819050949350505050565b60006138358261372c565b9150819050919050565b60006020820190506138546000830184613318565b92915050565b600060808201905061386f6000830187613318565b61387c6020830186613318565b61388960408301856137ea565b818103606083015261389b8184613394565b905095945050505050565b60006040820190506138bb6000830185613318565b6138c860208301846137ea565b9392505050565b600060208201905081810360008301526138e98184613327565b905092915050565b60006020820190506139066000830184613385565b92915050565b6000602082019050818103600083015261392681846133cd565b905092915050565b60006020820190508181036000830152613947816134b6565b9050919050565b60006020820190508181036000830152613967816134d9565b9050919050565b60006020820190508181036000830152613987816134fc565b9050919050565b600060208201905081810360008301526139a78161351f565b9050919050565b600060208201905081810360008301526139c781613542565b9050919050565b600060208201905081810360008301526139e781613565565b9050919050565b60006020820190508181036000830152613a0781613588565b9050919050565b60006020820190508181036000830152613a27816135ab565b9050919050565b60006020820190508181036000830152613a47816135ce565b9050919050565b60006020820190508181036000830152613a67816135f1565b9050919050565b60006020820190508181036000830152613a8781613614565b9050919050565b60006020820190508181036000830152613aa781613637565b9050919050565b60006020820190508181036000830152613ac78161365a565b9050919050565b60006020820190508181036000830152613ae78161367d565b9050919050565b60006020820190508181036000830152613b07816136a0565b9050919050565b60006020820190508181036000830152613b27816136c3565b9050919050565b60006020820190508181036000830152613b47816136e6565b9050919050565b60006020820190508181036000830152613b6781613709565b9050919050565b60006020820190508181036000830152613b878161374f565b9050919050565b60006020820190508181036000830152613ba781613772565b9050919050565b60006020820190508181036000830152613bc781613795565b9050919050565b60006020820190508181036000830152613be7816137b8565b9050919050565b6000602082019050613c0360008301846137ea565b92915050565b6000613c13613c24565b9050613c1f8282613f29565b919050565b6000604051905090565b600067ffffffffffffffff821115613c4957613c48614061565b5b613c5282614090565b9050602081019050919050565b600067ffffffffffffffff821115613c7a57613c79614061565b5b613c8382614090565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d3782613eab565b9150613d4283613eab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d7757613d76613fd4565b5b828201905092915050565b6000613d8d82613eab565b9150613d9883613eab565b925082613da857613da7614003565b5b828204905092915050565b6000613dbe82613eab565b9150613dc983613eab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e0257613e01613fd4565b5b828202905092915050565b6000613e1882613eab565b9150613e2383613eab565b925082821015613e3657613e35613fd4565b5b828203905092915050565b6000613e4c82613e8b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ee2578082015181840152602081019050613ec7565b83811115613ef1576000848401525b50505050565b60006002820490506001821680613f0f57607f821691505b60208210811415613f2357613f22614032565b5b50919050565b613f3282614090565b810181811067ffffffffffffffff82111715613f5157613f50614061565b5b80604052505050565b6000613f6582613eab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f9857613f97613fd4565b5b600182019050919050565b6000613fae82613eab565b9150613fb983613eab565b925082613fc957613fc8614003565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552524f523a204e6f7420656e6f756768206c65667420746f206d696e742100600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552524f523a20596f752063616e74206d696e742074686174206d616e790000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552524f523a20546865206d6178206e6f206d696e747320706572207472616e60008201527f73616374696f6e20657863656564656400000000000000000000000000000000602082015250565b7f4552524f523a20436f6e7472616374207061757365642e20506c65617365206360008201527f6865636b20646973636f72642e00000000000000000000000000000000000000602082015250565b61469381613e41565b811461469e57600080fd5b50565b6146aa81613e53565b81146146b557600080fd5b50565b6146c181613e5f565b81146146cc57600080fd5b50565b6146d881613eab565b81146146e357600080fd5b5056fea2646970667358221220ccefa04e38ec819abb81627085743ccc0f83bf8fad0312b6e57560af878dba5e64736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d583732633274394874705641754d76594c344a7554506e4e55547563645a3632375476684477674d766532662f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://ipfs.io/ipfs/QmX72c2t9HtpVAuMvYL4JuTPnNUTucdZ627TvhDwgMve2f/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [2] : 68747470733a2f2f697066732e696f2f697066732f516d583732633274394874
Arg [3] : 705641754d76594c344a7554506e4e55547563645a3632375476684477674d76
Arg [4] : 6532662f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53797:5016:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55052:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58530:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23935:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25628:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25151:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37674:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26687:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50311:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;54483:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37255:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58619:191;;;:::i;:::-;;27134:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56525:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37864:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57921:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54204:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23542:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53960:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23185:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48189:94;;;;;;;;;;;;;:::i;:::-;;54161:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54116:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47538:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24104:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55486:912;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54077:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26008:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27390:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53988:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57145:576;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54038:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58248:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26406:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54606:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48438:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55052:247;55226:4;55255:36;55279:11;55255:23;:36::i;:::-;55248:43;;55052:247;;;:::o;58530:79::-;47769:12;:10;:12::i;:::-;47758:23;;:7;:5;:7::i;:::-;:23;;;47750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58595:6:::1;58586;;:15;;;;;;;;;;;;;;;;;;58530:79:::0;:::o;23935:100::-;23989:13;24022:5;24015:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23935:100;:::o;25628:308::-;25749:7;25796:16;25804:7;25796;:16::i;:::-;25774:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25904:15;:24;25920:7;25904:24;;;;;;;;;;;;;;;;;;;;;25897:31;;25628:308;;;:::o;25151:411::-;25232:13;25248:23;25263:7;25248:14;:23::i;:::-;25232:39;;25296:5;25290:11;;:2;:11;;;;25282:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25390:5;25374:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25399:37;25416:5;25423:12;:10;:12::i;:::-;25399:16;:37::i;:::-;25374:62;25352:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25533:21;25542:2;25546:7;25533:8;:21::i;:::-;25151:411;;;:::o;37674:113::-;37735:7;37762:10;:17;;;;37755:24;;37674:113;:::o;26687:376::-;26896:41;26915:12;:10;:12::i;:::-;26929:7;26896:18;:41::i;:::-;26874:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27027:28;27037:4;27043:2;27047:7;27027:9;:28::i;:::-;26687:376;;;:::o;50311:244::-;50432:16;50450:21;50497:15;;;;;;;;;;;50541:5;50523:14;;50515:5;:22;;;;:::i;:::-;50514:32;;;;:::i;:::-;50489:58;;;;50311:244;;;;;:::o;54483:115::-;47769:12;:10;:12::i;:::-;47758:23;;:7;:5;:7::i;:::-;:23;;;47750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54576:14:::1;54559;:31;;;;54483:115:::0;:::o;37255:343::-;37397:7;37452:23;37469:5;37452:16;:23::i;:::-;37444:5;:31;37422:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37564:12;:19;37577:5;37564:19;;;;;;;;;;;;;;;:26;37584:5;37564:26;;;;;;;;;;;;37557:33;;37255:343;;;;:::o;58619:191::-;47769:12;:10;:12::i;:::-;47758:23;;:7;:5;:7::i;:::-;:23;;;47750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58676:12:::1;58702:7;:5;:7::i;:::-;58694:21;;58723;58694:79;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58675:98;;;58794:7;58786:16;;;::::0;::::1;;47829:1;58619:191::o:0;27134:185::-;27272:39;27289:4;27295:2;27299:7;27272:39;;;;;;;;;;;;:16;:39::i;:::-;27134:185;;;:::o;56525:390::-;56612:16;56646:23;56672:17;56682:6;56672:9;:17::i;:::-;56646:43;;56700:25;56742:15;56728:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56700:58;;56774:9;56769:113;56789:15;56785:1;:19;56769:113;;;56840:30;56860:6;56868:1;56840:19;:30::i;:::-;56826:8;56835:1;56826:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;56806:3;;;;;:::i;:::-;;;;56769:113;;;;56899:8;56892:15;;;;56525:390;;;:::o;37864:320::-;37984:7;38039:30;:28;:30::i;:::-;38031:5;:38;38009:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;38159:10;38170:5;38159:17;;;;;;;;;;;;;;;;;;;;;;;;38152:24;;37864:320;;;:::o;57921:104::-;47769:12;:10;:12::i;:::-;47758:23;;:7;:5;:7::i;:::-;:23;;;47750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58006:11:::1;57996:7;:21;;;;;;;;;;;;:::i;:::-;;57921:104:::0;:::o;54204:26::-;;;;;;;;;;;;;:::o;23542:326::-;23659:7;23684:13;23700:7;:16;23708:7;23700:16;;;;;;;;;;;;;;;;;;;;;23684:32;;23766:1;23749:19;;:5;:19;;;;23727:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;23855:5;23848:12;;;23542:326;;;:::o;53960:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23185:295::-;23302:7;23366:1;23349:19;;:5;:19;;;;23327:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23456:9;:16;23466:5;23456:16;;;;;;;;;;;;;;;;23449:23;;23185:295;;;:::o;48189:94::-;47769:12;:10;:12::i;:::-;47758:23;;:7;:5;:7::i;:::-;:23;;;47750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48254:21:::1;48272:1;48254:9;:21::i;:::-;48189:94::o:0;54161:30::-;;;;:::o;54116:38::-;;;;:::o;47538:87::-;47584:7;47611:6;;;;;;;;;;;47604:13;;47538:87;:::o;24104:104::-;24160:13;24193:7;24186:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24104:104;:::o;55486:912::-;55539:14;55571:1;55557:11;;:15;;;;:::i;:::-;55539:34;;55584:25;55634:12;:24;55647:10;55634:24;;;;;;;;;;;;;;;;55613:18;;:45;;;;:::i;:::-;55584:75;;55715:11;55694:17;:32;;55672:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;55806:6;;;;;;;;;;;55805:7;55797:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55912:12;;55897:11;:27;;55875:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;56059:9;;56044:11;56035:6;:20;;;;:::i;:::-;:33;;56013:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;56140:15;56158:11;;56140:29;;56187:9;56199:1;56187:13;;56182:170;56207:11;56202:1;:16;56182:170;;56240:30;56250:10;56262:7;56240:9;:30::i;:::-;56287:12;:24;56300:10;56287:24;;;;;;;;;;;;;;;;:26;;;;;;;;;:::i;:::-;;;;;;56339:1;56328:12;;;;;:::i;:::-;;;56220:3;;;;;:::i;:::-;;;;56182:170;;;;56379:11;56364;;:26;;;;;;;:::i;:::-;;;;;;;;55486:912;;;;:::o;54077:32::-;;;;:::o;26008:327::-;26155:12;:10;:12::i;:::-;26143:24;;:8;:24;;;;26135:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26255:8;26210:18;:32;26229:12;:10;:12::i;:::-;26210:32;;;;;;;;;;;;;;;:42;26243:8;26210:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26308:8;26279:48;;26294:12;:10;:12::i;:::-;26279:48;;;26318:8;26279:48;;;;;;:::i;:::-;;;;;;;;26008:327;;:::o;27390:365::-;27579:41;27598:12;:10;:12::i;:::-;27612:7;27579:18;:41::i;:::-;27557:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27708:39;27722:4;27728:2;27732:7;27741:5;27708:13;:39::i;:::-;27390:365;;;;:::o;53988:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57145:576::-;57263:13;57316:16;57324:7;57316;:16::i;:::-;57294:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;57464:1;57446:7;57440:21;;;;;:::i;:::-;;;:25;:273;;;;;;;;;;;;;;;;;57557:7;57591:18;:7;:16;:18::i;:::-;57636:13;57514:158;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57440:273;57420:293;;57145:576;;;:::o;54038:32::-;;;;:::o;58248:151::-;47769:12;:10;:12::i;:::-;47758:23;;:7;:5;:7::i;:::-;:23;;;47750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58374:17:::1;58358:13;:33;;;;;;;;;;;;:::i;:::-;;58248:151:::0;:::o;26406:214::-;26548:4;26577:18;:25;26596:5;26577:25;;;;;;;;;;;;;;;:35;26603:8;26577:35;;;;;;;;;;;;;;;;;;;;;;;;;26570:42;;26406:214;;;;:::o;54606:196::-;47769:12;:10;:12::i;:::-;47758:23;;:7;:5;:7::i;:::-;:23;;;47750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54675:6:::1;54670:125;54692:7;54687:1;:12;54670:125;;54721:31;54731:7;:5;:7::i;:::-;54740:11;;54721:9;:31::i;:::-;54782:1;54767:11;;:16;;;;;;;:::i;:::-;;;;;;;;54701:3;;;;;:::i;:::-;;;;54670:125;;;;54606:196:::0;:::o;48438:229::-;47769:12;:10;:12::i;:::-;47758:23;;:7;:5;:7::i;:::-;:23;;;47750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48561:1:::1;48541:22;;:8;:22;;;;48519:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;48640:19;48650:8;48640:9;:19::i;:::-;48438:229:::0;:::o;49981:283::-;50111:4;50168:35;50153:50;;;:11;:50;;;;:103;;;;50220:36;50244:11;50220:23;:36::i;:::-;50153:103;50133:123;;49981:283;;;:::o;21241:98::-;21294:7;21321:10;21314:17;;21241:98;:::o;29302:127::-;29367:4;29419:1;29391:30;;:7;:16;29399:7;29391:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29384:37;;29302:127;;;:::o;33425:174::-;33527:2;33500:15;:24;33516:7;33500:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33583:7;33579:2;33545:46;;33554:23;33569:7;33554:14;:23::i;:::-;33545:46;;;;;;;;;;;;33425:174;;:::o;29596:452::-;29725:4;29769:16;29777:7;29769;:16::i;:::-;29747:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29868:13;29884:23;29899:7;29884:14;:23::i;:::-;29868:39;;29937:5;29926:16;;:7;:16;;;:64;;;;29983:7;29959:31;;:20;29971:7;29959:11;:20::i;:::-;:31;;;29926:64;:113;;;;30007:32;30024:5;30031:7;30007:16;:32::i;:::-;29926:113;29918:122;;;29596:452;;;;:::o;32692:615::-;32865:4;32838:31;;:23;32853:7;32838:14;:23::i;:::-;:31;;;32816:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;32971:1;32957:16;;:2;:16;;;;32949:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33027:39;33048:4;33054:2;33058:7;33027:20;:39::i;:::-;33131:29;33148:1;33152:7;33131:8;:29::i;:::-;33192:1;33173:9;:15;33183:4;33173:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33221:1;33204:9;:13;33214:2;33204:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33252:2;33233:7;:16;33241:7;33233:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33291:7;33287:2;33272:27;;33281:4;33272:27;;;;;;;;;;;;32692:615;;;:::o;48675:173::-;48731:16;48750:6;;;;;;;;;;;48731:25;;48776:8;48767:6;;:17;;;;;;;;;;;;;;;;;;48831:8;48800:40;;48821:8;48800:40;;;;;;;;;;;;48675:173;;:::o;30390:110::-;30466:26;30476:2;30480:7;30466:26;;;;;;;;;;;;:9;:26::i;:::-;30390:110;;:::o;28637:352::-;28794:28;28804:4;28810:2;28814:7;28794:9;:28::i;:::-;28855:48;28878:4;28884:2;28888:7;28897:5;28855:22;:48::i;:::-;28833:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;28637:352;;;;:::o;8590:723::-;8646:13;8876:1;8867:5;:10;8863:53;;;8894:10;;;;;;;;;;;;;;;;;;;;;8863:53;8926:12;8941:5;8926:20;;8957:14;8982:78;8997:1;8989:4;:9;8982:78;;9015:8;;;;;:::i;:::-;;;;9046:2;9038:10;;;;;:::i;:::-;;;8982:78;;;9070:19;9102:6;9092:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9070:39;;9120:154;9136:1;9127:5;:10;9120:154;;9164:1;9154:11;;;;;:::i;:::-;;;9231:2;9223:5;:10;;;;:::i;:::-;9210:2;:24;;;;:::i;:::-;9197:39;;9180:6;9187;9180:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;9260:2;9251:11;;;;;:::i;:::-;;;9120:154;;;9298:6;9284:21;;;;;8590:723;;;;:::o;36871:300::-;37018:4;37075:35;37060:50;;;:11;:50;;;;:103;;;;37127:36;37151:11;37127:23;:36::i;:::-;37060:103;37040:123;;36871:300;;;:::o;38797:789::-;38941:45;38968:4;38974:2;38978:7;38941:26;:45::i;:::-;39019:1;39003:18;;:4;:18;;;38999:314;;;39059:40;39091:7;39059:31;:40::i;:::-;39114:34;39136:2;39140:7;39114:21;:34::i;:::-;38999:314;;;39178:2;39170:10;;:4;:10;;;39166:147;;39254:47;39287:4;39293:7;39254:32;:47::i;:::-;39166:147;38999:314;39343:1;39329:16;;:2;:16;;;39325:254;;;39383:45;39420:7;39383:36;:45::i;:::-;39325:254;;;39456:4;39450:10;;:2;:10;;;39446:133;;39527:40;39555:2;39559:7;39527:27;:40::i;:::-;39446:133;39325:254;38797:789;;;:::o;30727:321::-;30857:18;30863:2;30867:7;30857:5;:18::i;:::-;30908:54;30939:1;30943:2;30947:7;30956:5;30908:22;:54::i;:::-;30886:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30727:321;;;:::o;34164:980::-;34319:4;34340:15;:2;:13;;;:15::i;:::-;34336:801;;;34409:2;34393:36;;;34452:12;:10;:12::i;:::-;34487:4;34514:7;34544:5;34393:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34372:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34768:1;34751:6;:13;:18;34747:320;;;34794:108;;;;;;;;;;:::i;:::-;;;;;;;;34747:320;35017:6;35011:13;35002:6;34998:2;34994:15;34987:38;34372:710;34642:41;;;34632:51;;;:6;:51;;;;34625:58;;;;;34336:801;35121:4;35114:11;;34164:980;;;;;;;:::o;22766:355::-;22913:4;22970:25;22955:40;;;:11;:40;;;;:105;;;;23027:33;23012:48;;;:11;:48;;;;22955:105;:158;;;;23077:36;23101:11;23077:23;:36::i;:::-;22955:158;22935:178;;22766:355;;;:::o;35716:126::-;;;;:::o;40437:164::-;40541:10;:17;;;;40514:15;:24;40530:7;40514:24;;;;;;;;;;;:44;;;;40569:10;40585:7;40569:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40437:164;:::o;39594:120::-;39702:4;39675:15;:24;39691:7;39675:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;39594:120;;:::o;41228:1002::-;41508:22;41558:1;41533:22;41550:4;41533:16;:22::i;:::-;:26;;;;:::i;:::-;41508:51;;41570:18;41591:17;:26;41609:7;41591:26;;;;;;;;;;;;41570:47;;41738:14;41724:10;:28;41720:328;;41769:19;41791:12;:18;41804:4;41791:18;;;;;;;;;;;;;;;:34;41810:14;41791:34;;;;;;;;;;;;41769:56;;41875:11;41842:12;:18;41855:4;41842:18;;;;;;;;;;;;;;;:30;41861:10;41842:30;;;;;;;;;;;:44;;;;41992:10;41959:17;:30;41977:11;41959:30;;;;;;;;;;;:43;;;;41720:328;;42144:17;:26;42162:7;42144:26;;;;;;;;;;;42137:33;;;42188:12;:18;42201:4;42188:18;;;;;;;;;;;;;;;:34;42207:14;42188:34;;;;;;;;;;;42181:41;;;41228:1002;;;;:::o;42525:1079::-;42778:22;42823:1;42803:10;:17;;;;:21;;;;:::i;:::-;42778:46;;42835:18;42856:15;:24;42872:7;42856:24;;;;;;;;;;;;42835:45;;43207:19;43229:10;43240:14;43229:26;;;;;;;;;;;;;;;;;;;;;;;;43207:48;;43293:11;43268:10;43279;43268:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;43404:10;43373:15;:28;43389:11;43373:28;;;;;;;;;;;:41;;;;43545:15;:24;43561:7;43545:24;;;;;;;;;;;43538:31;;;43580:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42525:1079;;;;:::o;40015:221::-;40100:14;40117:20;40134:2;40117:16;:20::i;:::-;40100:37;;40175:7;40148:12;:16;40161:2;40148:16;;;;;;;;;;;;;;;:24;40165:6;40148:24;;;;;;;;;;;:34;;;;40222:6;40193:17;:26;40211:7;40193:26;;;;;;;;;;;:35;;;;40015:221;;;:::o;31384:382::-;31478:1;31464:16;;:2;:16;;;;31456:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31537:16;31545:7;31537;:16::i;:::-;31536:17;31528:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31599:45;31628:1;31632:2;31636:7;31599:20;:45::i;:::-;31674:1;31657:9;:13;31667:2;31657:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31705:2;31686:7;:16;31694:7;31686:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31750:7;31746:2;31725:33;;31742:1;31725:33;;;;;;;;;;;;31384:382;;:::o;11142:387::-;11202:4;11410:12;11477:7;11465:20;11457:28;;11520:1;11513:4;:8;11506:15;;;11142:387;;;:::o;8069:207::-;8199:4;8243:25;8228:40;;;:11;:40;;;;8221:47;;8069:207;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:256::-;4939:6;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:50;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;:::-;5062:60;;5018:114;4946:193;;;;:::o;5145:260::-;5203:6;5252:2;5240:9;5231:7;5227:23;5223:32;5220:2;;;5268:1;5265;5258:12;5220:2;5311:1;5336:52;5380:7;5371:6;5360:9;5356:22;5336:52;:::i;:::-;5326:62;;5282:116;5210:195;;;;:::o;5411:282::-;5480:6;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;5545:1;5542;5535:12;5497:2;5588:1;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5559:127;5487:206;;;;:::o;5699:375::-;5768:6;5817:2;5805:9;5796:7;5792:23;5788:32;5785:2;;;5833:1;5830;5823:12;5785:2;5904:1;5893:9;5889:17;5876:31;5934:18;5926:6;5923:30;5920:2;;;5966:1;5963;5956:12;5920:2;5994:63;6049:7;6040:6;6029:9;6025:22;5994:63;:::i;:::-;5984:73;;5847:220;5775:299;;;;:::o;6080:262::-;6139:6;6188:2;6176:9;6167:7;6163:23;6159:32;6156:2;;;6204:1;6201;6194:12;6156:2;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6146:196;;;;:::o;6348:407::-;6416:6;6424;6473:2;6461:9;6452:7;6448:23;6444:32;6441:2;;;6489:1;6486;6479:12;6441:2;6532:1;6557:53;6602:7;6593:6;6582:9;6578:22;6557:53;:::i;:::-;6547:63;;6503:117;6659:2;6685:53;6730:7;6721:6;6710:9;6706:22;6685:53;:::i;:::-;6675:63;;6630:118;6431:324;;;;;:::o;6761:179::-;6830:10;6851:46;6893:3;6885:6;6851:46;:::i;:::-;6929:4;6924:3;6920:14;6906:28;;6841:99;;;;:::o;6946:118::-;7033:24;7051:5;7033:24;:::i;:::-;7028:3;7021:37;7011:53;;:::o;7100:732::-;7219:3;7248:54;7296:5;7248:54;:::i;:::-;7318:86;7397:6;7392:3;7318:86;:::i;:::-;7311:93;;7428:56;7478:5;7428:56;:::i;:::-;7507:7;7538:1;7523:284;7548:6;7545:1;7542:13;7523:284;;;7624:6;7618:13;7651:63;7710:3;7695:13;7651:63;:::i;:::-;7644:70;;7737:60;7790:6;7737:60;:::i;:::-;7727:70;;7583:224;7570:1;7567;7563:9;7558:14;;7523:284;;;7527:14;7823:3;7816:10;;7224:608;;;;;;;:::o;7838:109::-;7919:21;7934:5;7919:21;:::i;:::-;7914:3;7907:34;7897:50;;:::o;7953:360::-;8039:3;8067:38;8099:5;8067:38;:::i;:::-;8121:70;8184:6;8179:3;8121:70;:::i;:::-;8114:77;;8200:52;8245:6;8240:3;8233:4;8226:5;8222:16;8200:52;:::i;:::-;8277:29;8299:6;8277:29;:::i;:::-;8272:3;8268:39;8261:46;;8043:270;;;;;:::o;8319:364::-;8407:3;8435:39;8468:5;8435:39;:::i;:::-;8490:71;8554:6;8549:3;8490:71;:::i;:::-;8483:78;;8570:52;8615:6;8610:3;8603:4;8596:5;8592:16;8570:52;:::i;:::-;8647:29;8669:6;8647:29;:::i;:::-;8642:3;8638:39;8631:46;;8411:272;;;;;:::o;8689:377::-;8795:3;8823:39;8856:5;8823:39;:::i;:::-;8878:89;8960:6;8955:3;8878:89;:::i;:::-;8871:96;;8976:52;9021:6;9016:3;9009:4;9002:5;8998:16;8976:52;:::i;:::-;9053:6;9048:3;9044:16;9037:23;;8799:267;;;;;:::o;9096:845::-;9199:3;9236:5;9230:12;9265:36;9291:9;9265:36;:::i;:::-;9317:89;9399:6;9394:3;9317:89;:::i;:::-;9310:96;;9437:1;9426:9;9422:17;9453:1;9448:137;;;;9599:1;9594:341;;;;9415:520;;9448:137;9532:4;9528:9;9517;9513:25;9508:3;9501:38;9568:6;9563:3;9559:16;9552:23;;9448:137;;9594:341;9661:38;9693:5;9661:38;:::i;:::-;9721:1;9735:154;9749:6;9746:1;9743:13;9735:154;;;9823:7;9817:14;9813:1;9808:3;9804:11;9797:35;9873:1;9864:7;9860:15;9849:26;;9771:4;9768:1;9764:12;9759:17;;9735:154;;;9918:6;9913:3;9909:16;9902:23;;9601:334;;9415:520;;9203:738;;;;;;:::o;9947:366::-;10089:3;10110:67;10174:2;10169:3;10110:67;:::i;:::-;10103:74;;10186:93;10275:3;10186:93;:::i;:::-;10304:2;10299:3;10295:12;10288:19;;10093:220;;;:::o;10319:366::-;10461:3;10482:67;10546:2;10541:3;10482:67;:::i;:::-;10475:74;;10558:93;10647:3;10558:93;:::i;:::-;10676:2;10671:3;10667:12;10660:19;;10465:220;;;:::o;10691:366::-;10833:3;10854:67;10918:2;10913:3;10854:67;:::i;:::-;10847:74;;10930:93;11019:3;10930:93;:::i;:::-;11048:2;11043:3;11039:12;11032:19;;10837:220;;;:::o;11063:366::-;11205:3;11226:67;11290:2;11285:3;11226:67;:::i;:::-;11219:74;;11302:93;11391:3;11302:93;:::i;:::-;11420:2;11415:3;11411:12;11404:19;;11209:220;;;:::o;11435:366::-;11577:3;11598:67;11662:2;11657:3;11598:67;:::i;:::-;11591:74;;11674:93;11763:3;11674:93;:::i;:::-;11792:2;11787:3;11783:12;11776:19;;11581:220;;;:::o;11807:366::-;11949:3;11970:67;12034:2;12029:3;11970:67;:::i;:::-;11963:74;;12046:93;12135:3;12046:93;:::i;:::-;12164:2;12159:3;12155:12;12148:19;;11953:220;;;:::o;12179:366::-;12321:3;12342:67;12406:2;12401:3;12342:67;:::i;:::-;12335:74;;12418:93;12507:3;12418:93;:::i;:::-;12536:2;12531:3;12527:12;12520:19;;12325:220;;;:::o;12551:366::-;12693:3;12714:67;12778:2;12773:3;12714:67;:::i;:::-;12707:74;;12790:93;12879:3;12790:93;:::i;:::-;12908:2;12903:3;12899:12;12892:19;;12697:220;;;:::o;12923:366::-;13065:3;13086:67;13150:2;13145:3;13086:67;:::i;:::-;13079:74;;13162:93;13251:3;13162:93;:::i;:::-;13280:2;13275:3;13271:12;13264:19;;13069:220;;;:::o;13295:366::-;13437:3;13458:67;13522:2;13517:3;13458:67;:::i;:::-;13451:74;;13534:93;13623:3;13534:93;:::i;:::-;13652:2;13647:3;13643:12;13636:19;;13441:220;;;:::o;13667:366::-;13809:3;13830:67;13894:2;13889:3;13830:67;:::i;:::-;13823:74;;13906:93;13995:3;13906:93;:::i;:::-;14024:2;14019:3;14015:12;14008:19;;13813:220;;;:::o;14039:366::-;14181:3;14202:67;14266:2;14261:3;14202:67;:::i;:::-;14195:74;;14278:93;14367:3;14278:93;:::i;:::-;14396:2;14391:3;14387:12;14380:19;;14185:220;;;:::o;14411:366::-;14553:3;14574:67;14638:2;14633:3;14574:67;:::i;:::-;14567:74;;14650:93;14739:3;14650:93;:::i;:::-;14768:2;14763:3;14759:12;14752:19;;14557:220;;;:::o;14783:366::-;14925:3;14946:67;15010:2;15005:3;14946:67;:::i;:::-;14939:74;;15022:93;15111:3;15022:93;:::i;:::-;15140:2;15135:3;15131:12;15124:19;;14929:220;;;:::o;15155:366::-;15297:3;15318:67;15382:2;15377:3;15318:67;:::i;:::-;15311:74;;15394:93;15483:3;15394:93;:::i;:::-;15512:2;15507:3;15503:12;15496:19;;15301:220;;;:::o;15527:366::-;15669:3;15690:67;15754:2;15749:3;15690:67;:::i;:::-;15683:74;;15766:93;15855:3;15766:93;:::i;:::-;15884:2;15879:3;15875:12;15868:19;;15673:220;;;:::o;15899:366::-;16041:3;16062:67;16126:2;16121:3;16062:67;:::i;:::-;16055:74;;16138:93;16227:3;16138:93;:::i;:::-;16256:2;16251:3;16247:12;16240:19;;16045:220;;;:::o;16271:366::-;16413:3;16434:67;16498:2;16493:3;16434:67;:::i;:::-;16427:74;;16510:93;16599:3;16510:93;:::i;:::-;16628:2;16623:3;16619:12;16612:19;;16417:220;;;:::o;16643:398::-;16802:3;16823:83;16904:1;16899:3;16823:83;:::i;:::-;16816:90;;16915:93;17004:3;16915:93;:::i;:::-;17033:1;17028:3;17024:11;17017:18;;16806:235;;;:::o;17047:366::-;17189:3;17210:67;17274:2;17269:3;17210:67;:::i;:::-;17203:74;;17286:93;17375:3;17286:93;:::i;:::-;17404:2;17399:3;17395:12;17388:19;;17193:220;;;:::o;17419:366::-;17561:3;17582:67;17646:2;17641:3;17582:67;:::i;:::-;17575:74;;17658:93;17747:3;17658:93;:::i;:::-;17776:2;17771:3;17767:12;17760:19;;17565:220;;;:::o;17791:366::-;17933:3;17954:67;18018:2;18013:3;17954:67;:::i;:::-;17947:74;;18030:93;18119:3;18030:93;:::i;:::-;18148:2;18143:3;18139:12;18132:19;;17937:220;;;:::o;18163:366::-;18305:3;18326:67;18390:2;18385:3;18326:67;:::i;:::-;18319:74;;18402:93;18491:3;18402:93;:::i;:::-;18520:2;18515:3;18511:12;18504:19;;18309:220;;;:::o;18535:108::-;18612:24;18630:5;18612:24;:::i;:::-;18607:3;18600:37;18590:53;;:::o;18649:118::-;18736:24;18754:5;18736:24;:::i;:::-;18731:3;18724:37;18714:53;;:::o;18773:583::-;18995:3;19017:92;19105:3;19096:6;19017:92;:::i;:::-;19010:99;;19126:95;19217:3;19208:6;19126:95;:::i;:::-;19119:102;;19238:92;19326:3;19317:6;19238:92;:::i;:::-;19231:99;;19347:3;19340:10;;18999:357;;;;;;:::o;19362:379::-;19546:3;19568:147;19711:3;19568:147;:::i;:::-;19561:154;;19732:3;19725:10;;19550:191;;;:::o;19747:222::-;19840:4;19878:2;19867:9;19863:18;19855:26;;19891:71;19959:1;19948:9;19944:17;19935:6;19891:71;:::i;:::-;19845:124;;;;:::o;19975:640::-;20170:4;20208:3;20197:9;20193:19;20185:27;;20222:71;20290:1;20279:9;20275:17;20266:6;20222:71;:::i;:::-;20303:72;20371:2;20360:9;20356:18;20347:6;20303:72;:::i;:::-;20385;20453:2;20442:9;20438:18;20429:6;20385:72;:::i;:::-;20504:9;20498:4;20494:20;20489:2;20478:9;20474:18;20467:48;20532:76;20603:4;20594:6;20532:76;:::i;:::-;20524:84;;20175:440;;;;;;;:::o;20621:332::-;20742:4;20780:2;20769:9;20765:18;20757:26;;20793:71;20861:1;20850:9;20846:17;20837:6;20793:71;:::i;:::-;20874:72;20942:2;20931:9;20927:18;20918:6;20874:72;:::i;:::-;20747:206;;;;;:::o;20959:373::-;21102:4;21140:2;21129:9;21125:18;21117:26;;21189:9;21183:4;21179:20;21175:1;21164:9;21160:17;21153:47;21217:108;21320:4;21311:6;21217:108;:::i;:::-;21209:116;;21107:225;;;;:::o;21338:210::-;21425:4;21463:2;21452:9;21448:18;21440:26;;21476:65;21538:1;21527:9;21523:17;21514:6;21476:65;:::i;:::-;21430:118;;;;:::o;21554:313::-;21667:4;21705:2;21694:9;21690:18;21682:26;;21754:9;21748:4;21744:20;21740:1;21729:9;21725:17;21718:47;21782:78;21855:4;21846:6;21782:78;:::i;:::-;21774:86;;21672:195;;;;:::o;21873:419::-;22039:4;22077:2;22066:9;22062:18;22054:26;;22126:9;22120:4;22116:20;22112:1;22101:9;22097:17;22090:47;22154:131;22280:4;22154:131;:::i;:::-;22146:139;;22044:248;;;:::o;22298:419::-;22464:4;22502:2;22491:9;22487:18;22479:26;;22551:9;22545:4;22541:20;22537:1;22526:9;22522:17;22515:47;22579:131;22705:4;22579:131;:::i;:::-;22571:139;;22469:248;;;:::o;22723:419::-;22889:4;22927:2;22916:9;22912:18;22904:26;;22976:9;22970:4;22966:20;22962:1;22951:9;22947:17;22940:47;23004:131;23130:4;23004:131;:::i;:::-;22996:139;;22894:248;;;:::o;23148:419::-;23314:4;23352:2;23341:9;23337:18;23329:26;;23401:9;23395:4;23391:20;23387:1;23376:9;23372:17;23365:47;23429:131;23555:4;23429:131;:::i;:::-;23421:139;;23319:248;;;:::o;23573:419::-;23739:4;23777:2;23766:9;23762:18;23754:26;;23826:9;23820:4;23816:20;23812:1;23801:9;23797:17;23790:47;23854:131;23980:4;23854:131;:::i;:::-;23846:139;;23744:248;;;:::o;23998:419::-;24164:4;24202:2;24191:9;24187:18;24179:26;;24251:9;24245:4;24241:20;24237:1;24226:9;24222:17;24215:47;24279:131;24405:4;24279:131;:::i;:::-;24271:139;;24169:248;;;:::o;24423:419::-;24589:4;24627:2;24616:9;24612:18;24604:26;;24676:9;24670:4;24666:20;24662:1;24651:9;24647:17;24640:47;24704:131;24830:4;24704:131;:::i;:::-;24696:139;;24594:248;;;:::o;24848:419::-;25014:4;25052:2;25041:9;25037:18;25029:26;;25101:9;25095:4;25091:20;25087:1;25076:9;25072:17;25065:47;25129:131;25255:4;25129:131;:::i;:::-;25121:139;;25019:248;;;:::o;25273:419::-;25439:4;25477:2;25466:9;25462:18;25454:26;;25526:9;25520:4;25516:20;25512:1;25501:9;25497:17;25490:47;25554:131;25680:4;25554:131;:::i;:::-;25546:139;;25444:248;;;:::o;25698:419::-;25864:4;25902:2;25891:9;25887:18;25879:26;;25951:9;25945:4;25941:20;25937:1;25926:9;25922:17;25915:47;25979:131;26105:4;25979:131;:::i;:::-;25971:139;;25869:248;;;:::o;26123:419::-;26289:4;26327:2;26316:9;26312:18;26304:26;;26376:9;26370:4;26366:20;26362:1;26351:9;26347:17;26340:47;26404:131;26530:4;26404:131;:::i;:::-;26396:139;;26294:248;;;:::o;26548:419::-;26714:4;26752:2;26741:9;26737:18;26729:26;;26801:9;26795:4;26791:20;26787:1;26776:9;26772:17;26765:47;26829:131;26955:4;26829:131;:::i;:::-;26821:139;;26719:248;;;:::o;26973:419::-;27139:4;27177:2;27166:9;27162:18;27154:26;;27226:9;27220:4;27216:20;27212:1;27201:9;27197:17;27190:47;27254:131;27380:4;27254:131;:::i;:::-;27246:139;;27144:248;;;:::o;27398:419::-;27564:4;27602:2;27591:9;27587:18;27579:26;;27651:9;27645:4;27641:20;27637:1;27626:9;27622:17;27615:47;27679:131;27805:4;27679:131;:::i;:::-;27671:139;;27569:248;;;:::o;27823:419::-;27989:4;28027:2;28016:9;28012:18;28004:26;;28076:9;28070:4;28066:20;28062:1;28051:9;28047:17;28040:47;28104:131;28230:4;28104:131;:::i;:::-;28096:139;;27994:248;;;:::o;28248:419::-;28414:4;28452:2;28441:9;28437:18;28429:26;;28501:9;28495:4;28491:20;28487:1;28476:9;28472:17;28465:47;28529:131;28655:4;28529:131;:::i;:::-;28521:139;;28419:248;;;:::o;28673:419::-;28839:4;28877:2;28866:9;28862:18;28854:26;;28926:9;28920:4;28916:20;28912:1;28901:9;28897:17;28890:47;28954:131;29080:4;28954:131;:::i;:::-;28946:139;;28844:248;;;:::o;29098:419::-;29264:4;29302:2;29291:9;29287:18;29279:26;;29351:9;29345:4;29341:20;29337:1;29326:9;29322:17;29315:47;29379:131;29505:4;29379:131;:::i;:::-;29371:139;;29269:248;;;:::o;29523:419::-;29689:4;29727:2;29716:9;29712:18;29704:26;;29776:9;29770:4;29766:20;29762:1;29751:9;29747:17;29740:47;29804:131;29930:4;29804:131;:::i;:::-;29796:139;;29694:248;;;:::o;29948:419::-;30114:4;30152:2;30141:9;30137:18;30129:26;;30201:9;30195:4;30191:20;30187:1;30176:9;30172:17;30165:47;30229:131;30355:4;30229:131;:::i;:::-;30221:139;;30119:248;;;:::o;30373:419::-;30539:4;30577:2;30566:9;30562:18;30554:26;;30626:9;30620:4;30616:20;30612:1;30601:9;30597:17;30590:47;30654:131;30780:4;30654:131;:::i;:::-;30646:139;;30544:248;;;:::o;30798:419::-;30964:4;31002:2;30991:9;30987:18;30979:26;;31051:9;31045:4;31041:20;31037:1;31026:9;31022:17;31015:47;31079:131;31205:4;31079:131;:::i;:::-;31071:139;;30969:248;;;:::o;31223:222::-;31316:4;31354:2;31343:9;31339:18;31331:26;;31367:71;31435:1;31424:9;31420:17;31411:6;31367:71;:::i;:::-;31321:124;;;;:::o;31451:129::-;31485:6;31512:20;;:::i;:::-;31502:30;;31541:33;31569:4;31561:6;31541:33;:::i;:::-;31492:88;;;:::o;31586:75::-;31619:6;31652:2;31646:9;31636:19;;31626:35;:::o;31667:307::-;31728:4;31818:18;31810:6;31807:30;31804:2;;;31840:18;;:::i;:::-;31804:2;31878:29;31900:6;31878:29;:::i;:::-;31870:37;;31962:4;31956;31952:15;31944:23;;31733:241;;;:::o;31980:308::-;32042:4;32132:18;32124:6;32121:30;32118:2;;;32154:18;;:::i;:::-;32118:2;32192:29;32214:6;32192:29;:::i;:::-;32184:37;;32276:4;32270;32266:15;32258:23;;32047:241;;;:::o;32294:132::-;32361:4;32384:3;32376:11;;32414:4;32409:3;32405:14;32397:22;;32366:60;;;:::o;32432:141::-;32481:4;32504:3;32496:11;;32527:3;32524:1;32517:14;32561:4;32558:1;32548:18;32540:26;;32486:87;;;:::o;32579:114::-;32646:6;32680:5;32674:12;32664:22;;32653:40;;;:::o;32699:98::-;32750:6;32784:5;32778:12;32768:22;;32757:40;;;:::o;32803:99::-;32855:6;32889:5;32883:12;32873:22;;32862:40;;;:::o;32908:113::-;32978:4;33010;33005:3;33001:14;32993:22;;32983:38;;;:::o;33027:184::-;33126:11;33160:6;33155:3;33148:19;33200:4;33195:3;33191:14;33176:29;;33138:73;;;;:::o;33217:168::-;33300:11;33334:6;33329:3;33322:19;33374:4;33369:3;33365:14;33350:29;;33312:73;;;;:::o;33391:147::-;33492:11;33529:3;33514:18;;33504:34;;;;:::o;33544:169::-;33628:11;33662:6;33657:3;33650:19;33702:4;33697:3;33693:14;33678:29;;33640:73;;;;:::o;33719:148::-;33821:11;33858:3;33843:18;;33833:34;;;;:::o;33873:305::-;33913:3;33932:20;33950:1;33932:20;:::i;:::-;33927:25;;33966:20;33984:1;33966:20;:::i;:::-;33961:25;;34120:1;34052:66;34048:74;34045:1;34042:81;34039:2;;;34126:18;;:::i;:::-;34039:2;34170:1;34167;34163:9;34156:16;;33917:261;;;;:::o;34184:185::-;34224:1;34241:20;34259:1;34241:20;:::i;:::-;34236:25;;34275:20;34293:1;34275:20;:::i;:::-;34270:25;;34314:1;34304:2;;34319:18;;:::i;:::-;34304:2;34361:1;34358;34354:9;34349:14;;34226:143;;;;:::o;34375:348::-;34415:7;34438:20;34456:1;34438:20;:::i;:::-;34433:25;;34472:20;34490:1;34472:20;:::i;:::-;34467:25;;34660:1;34592:66;34588:74;34585:1;34582:81;34577:1;34570:9;34563:17;34559:105;34556:2;;;34667:18;;:::i;:::-;34556:2;34715:1;34712;34708:9;34697:20;;34423:300;;;;:::o;34729:191::-;34769:4;34789:20;34807:1;34789:20;:::i;:::-;34784:25;;34823:20;34841:1;34823:20;:::i;:::-;34818:25;;34862:1;34859;34856:8;34853:2;;;34867:18;;:::i;:::-;34853:2;34912:1;34909;34905:9;34897:17;;34774:146;;;;:::o;34926:96::-;34963:7;34992:24;35010:5;34992:24;:::i;:::-;34981:35;;34971:51;;;:::o;35028:90::-;35062:7;35105:5;35098:13;35091:21;35080:32;;35070:48;;;:::o;35124:149::-;35160:7;35200:66;35193:5;35189:78;35178:89;;35168:105;;;:::o;35279:126::-;35316:7;35356:42;35349:5;35345:54;35334:65;;35324:81;;;:::o;35411:77::-;35448:7;35477:5;35466:16;;35456:32;;;:::o;35494:154::-;35578:6;35573:3;35568;35555:30;35640:1;35631:6;35626:3;35622:16;35615:27;35545:103;;;:::o;35654:307::-;35722:1;35732:113;35746:6;35743:1;35740:13;35732:113;;;35831:1;35826:3;35822:11;35816:18;35812:1;35807:3;35803:11;35796:39;35768:2;35765:1;35761:10;35756:15;;35732:113;;;35863:6;35860:1;35857:13;35854:2;;;35943:1;35934:6;35929:3;35925:16;35918:27;35854:2;35703:258;;;;:::o;35967:320::-;36011:6;36048:1;36042:4;36038:12;36028:22;;36095:1;36089:4;36085:12;36116:18;36106:2;;36172:4;36164:6;36160:17;36150:27;;36106:2;36234;36226:6;36223:14;36203:18;36200:38;36197:2;;;36253:18;;:::i;:::-;36197:2;36018:269;;;;:::o;36293:281::-;36376:27;36398:4;36376:27;:::i;:::-;36368:6;36364:40;36506:6;36494:10;36491:22;36470:18;36458:10;36455:34;36452:62;36449:2;;;36517:18;;:::i;:::-;36449:2;36557:10;36553:2;36546:22;36336:238;;;:::o;36580:233::-;36619:3;36642:24;36660:5;36642:24;:::i;:::-;36633:33;;36688:66;36681:5;36678:77;36675:2;;;36758:18;;:::i;:::-;36675:2;36805:1;36798:5;36794:13;36787:20;;36623:190;;;:::o;36819:176::-;36851:1;36868:20;36886:1;36868:20;:::i;:::-;36863:25;;36902:20;36920:1;36902:20;:::i;:::-;36897:25;;36941:1;36931:2;;36946:18;;:::i;:::-;36931:2;36987:1;36984;36980:9;36975:14;;36853:142;;;;:::o;37001:180::-;37049:77;37046:1;37039:88;37146:4;37143:1;37136:15;37170:4;37167:1;37160:15;37187:180;37235:77;37232:1;37225:88;37332:4;37329:1;37322:15;37356:4;37353:1;37346:15;37373:180;37421:77;37418:1;37411:88;37518:4;37515:1;37508:15;37542:4;37539:1;37532:15;37559:180;37607:77;37604:1;37597:88;37704:4;37701:1;37694:15;37728:4;37725:1;37718:15;37745:102;37786:6;37837:2;37833:7;37828:2;37821:5;37817:14;37813:28;37803:38;;37793:54;;;:::o;37853:230::-;37993:34;37989:1;37981:6;37977:14;37970:58;38062:13;38057:2;38049:6;38045:15;38038:38;37959:124;:::o;38089:237::-;38229:34;38225:1;38217:6;38213:14;38206:58;38298:20;38293:2;38285:6;38281:15;38274:45;38195:131;:::o;38332:225::-;38472:34;38468:1;38460:6;38456:14;38449:58;38541:8;38536:2;38528:6;38524:15;38517:33;38438:119;:::o;38563:178::-;38703:30;38699:1;38691:6;38687:14;38680:54;38669:72;:::o;38747:223::-;38887:34;38883:1;38875:6;38871:14;38864:58;38956:6;38951:2;38943:6;38939:15;38932:31;38853:117;:::o;38976:175::-;39116:27;39112:1;39104:6;39100:14;39093:51;39082:69;:::o;39157:231::-;39297:34;39293:1;39285:6;39281:14;39274:58;39366:14;39361:2;39353:6;39349:15;39342:39;39263:125;:::o;39394:243::-;39534:34;39530:1;39522:6;39518:14;39511:58;39603:26;39598:2;39590:6;39586:15;39579:51;39500:137;:::o;39643:229::-;39783:34;39779:1;39771:6;39767:14;39760:58;39852:12;39847:2;39839:6;39835:15;39828:37;39749:123;:::o;39878:228::-;40018:34;40014:1;40006:6;40002:14;39995:58;40087:11;40082:2;40074:6;40070:15;40063:36;39984:122;:::o;40112:182::-;40252:34;40248:1;40240:6;40236:14;40229:58;40218:76;:::o;40300:181::-;40440:33;40436:1;40428:6;40424:14;40417:57;40406:75;:::o;40487:231::-;40627:34;40623:1;40615:6;40611:14;40604:58;40696:14;40691:2;40683:6;40679:15;40672:39;40593:125;:::o;40724:182::-;40864:34;40860:1;40852:6;40848:14;40841:58;40830:76;:::o;40912:228::-;41052:34;41048:1;41040:6;41036:14;41029:58;41121:11;41116:2;41108:6;41104:15;41097:36;41018:122;:::o;41146:234::-;41286:34;41282:1;41274:6;41270:14;41263:58;41355:17;41350:2;41342:6;41338:15;41331:42;41252:128;:::o;41386:180::-;41526:32;41522:1;41514:6;41510:14;41503:56;41492:74;:::o;41572:220::-;41712:34;41708:1;41700:6;41696:14;41689:58;41781:3;41776:2;41768:6;41764:15;41757:28;41678:114;:::o;41798:::-;41904:8;:::o;41918:236::-;42058:34;42054:1;42046:6;42042:14;42035:58;42127:19;42122:2;42114:6;42110:15;42103:44;42024:130;:::o;42160:231::-;42300:34;42296:1;42288:6;42284:14;42277:58;42369:14;42364:2;42356:6;42352:15;42345:39;42266:125;:::o;42397:235::-;42537:34;42533:1;42525:6;42521:14;42514:58;42606:18;42601:2;42593:6;42589:15;42582:43;42503:129;:::o;42638:232::-;42778:34;42774:1;42766:6;42762:14;42755:58;42847:15;42842:2;42834:6;42830:15;42823:40;42744:126;:::o;42876:122::-;42949:24;42967:5;42949:24;:::i;:::-;42942:5;42939:35;42929:2;;42988:1;42985;42978:12;42929:2;42919:79;:::o;43004:116::-;43074:21;43089:5;43074:21;:::i;:::-;43067:5;43064:32;43054:2;;43110:1;43107;43100:12;43054:2;43044:76;:::o;43126:120::-;43198:23;43215:5;43198:23;:::i;:::-;43191:5;43188:34;43178:2;;43236:1;43233;43226:12;43178:2;43168:78;:::o;43252:122::-;43325:24;43343:5;43325:24;:::i;:::-;43318:5;43315:35;43305:2;;43364:1;43361;43354:12;43305:2;43295:79;:::o

Swarm Source

ipfs://ccefa04e38ec819abb81627085743ccc0f83bf8fad0312b6e57560af878dba5e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.