ETH Price: $3,456.15 (+1.69%)

Token

Dosdles (DOS)
 

Overview

Max Total Supply

111 DOS

Holders

40

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
0xminter.eth
Balance
4 DOS
0xd38fbaaab882852276cf81a11d22ef586b76b8b7
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:
Dosdles

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-04
*/

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;







/**
 * @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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || 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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts/ERC721Tradable.sol



pragma solidity >=0.7.0 <0.9.0;





contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is ERC721, Ownable {
    using SafeMath for uint256;
    string public baseExtension = ".json";

    address proxyRegistryAddress;
    uint256 public currentTokenId = 0;

    constructor(
        string memory _name,
        string memory _symbol,
        address _proxyRegistryAddress
    ) ERC721(_name, _symbol) {
        proxyRegistryAddress = _proxyRegistryAddress;
    }

    /**
    * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function _mintTo(address _to) internal virtual {
        uint256 newTokenId = _getNextTokenId();
        _safeMint(_to, newTokenId);
        _incrementTokenId();
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenId
     * @return uint256 for the next token ID
     */
    function _getNextTokenId() private view returns (uint256) {
        return currentTokenId.add(1);
    }

    /**
     * @dev increments the value of _currentTokenId
     */
    function _incrementTokenId() private {
        currentTokenId++;
    }

    function baseTokenURI() virtual public pure returns (string memory);

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId), baseExtension));
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator) override public view returns (bool){
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }
}

// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

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


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

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

// File: contracts/Dosdles.sol



pragma solidity >=0.7.0 <0.9.0;


contract Dosdles is ERC721Tradable, IERC2981 {
    using Strings for uint256;
    string public baseURI;
    string public notRevealedUri;
    uint256 public cost = 0.00 ether;
    uint256 public maxSupply = 2000;
    uint256 public maxMintAmount = 4;
    uint256 public nftPerAddressLimit = 25;
    bool public paused = false;
    bool public revealed = false;
    bool public onlyWhitelisted = true;
    address[] public whitelistedAddresses;
    mapping(address => uint256) public addressMintedBalance;

    // ======== Royalties =========
    address public royaltyAddress;
    uint256 public royaltyPercent;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        string memory _initNotRevealedUri,
        address _proxyRegistryAddress

    ) ERC721Tradable(_name, _symbol, _proxyRegistryAddress) {
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_initNotRevealedUri);
        royaltyAddress = owner();
        royaltyPercent = 5;
    }

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

    function baseTokenURI() override public pure returns (string memory) {
        return "";
    }

    // ======== Minting =========
    function mint(uint256 _mintAmount) public payable {
        require(!paused, "the contract is paused");
        uint256 supply = totalSupply();
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
        require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

        if (msg.sender != owner()) {
            if (onlyWhitelisted == true) {
                require(isWhitelisted(msg.sender), "user is not whitelisted");
                uint256 ownerMintedCount = addressMintedBalance[msg.sender];
                require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
            }
            require(msg.value >= cost * _mintAmount, "insufficient funds");
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _mintTo(msg.sender);
        }
    }

    function isWhitelisted(address _user) public view returns (bool) {
        for (uint i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    function getWhitelist() public view returns (address  [] memory){
        return whitelistedAddresses;
    }

    function deleteWhitelistUsers() public onlyOwner {
        delete whitelistedAddresses;
    }

    function totalSupply() public view returns (uint256) {
        return currentTokenId;
    }

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

        if (revealed == false) {
            return notRevealedUri;
        }

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

    //only owner
    function reveal() public onlyOwner {
        revealed = true;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setMaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner {
        maxMintAmount = _newMaxMintAmount;
    }

    function setMaxSupply(uint256 _newMaxSupply) public onlyOwner {
        maxSupply = _newMaxSupply;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    // ======== Royalties =========
    function setRoyaltyReceiver(address royaltyReceiver) public onlyOwner {
        royaltyAddress = royaltyReceiver;
    }

    function setRoyaltyPercentage(uint256 royaltyPercentage) public onlyOwner {
        royaltyPercent = royaltyPercentage;
    }

    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount) {
        require(_exists(tokenId), "Non-existent token");
        return (royaltyAddress, salePrice * royaltyPercent / 100);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, IERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"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":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteWhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelist","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","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":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercent","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":"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":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltyPercentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyReceiver","type":"address"}],"name":"setRoyaltyReceiver","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":"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":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600790805190602001906200005192919062000460565b5060006009556000600c556107d0600d556004600e556019600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506001601060026101000a81548160ff021916908315150217905550348015620000ca57600080fd5b506040516200589b3803806200589b8339818101604052810190620000f0919062000599565b848482828281600090805190602001906200010d92919062000460565b5080600190805190602001906200012692919062000460565b505050620001496200013d6200021260201b60201c565b6200021a60201b60201c565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200019e83620002e060201b60201c565b620001af826200038b60201b60201c565b620001bf6200043660201b60201c565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005601481905550505050505062000873565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f06200021260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003166200043660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200036f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036690620006c1565b60405180910390fd5b80600a90805190602001906200038792919062000460565b5050565b6200039b6200021260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003c16200043660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200041a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041190620006c1565b60405180910390fd5b80600b90805190602001906200043292919062000460565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200046e90620007c5565b90600052602060002090601f016020900481019282620004925760008555620004de565b82601f10620004ad57805160ff1916838001178555620004de565b82800160010185558215620004de579182015b82811115620004dd578251825591602001919060010190620004c0565b5b509050620004ed9190620004f1565b5090565b5b808211156200050c576000816000905550600101620004f2565b5090565b600062000527620005218462000717565b620006e3565b9050828152602081018484840111156200054057600080fd5b6200054d8482856200078f565b509392505050565b600081519050620005668162000859565b92915050565b600082601f8301126200057e57600080fd5b81516200059084826020860162000510565b91505092915050565b600080600080600060a08688031215620005b257600080fd5b600086015167ffffffffffffffff811115620005cd57600080fd5b620005db888289016200056c565b955050602086015167ffffffffffffffff811115620005f957600080fd5b62000607888289016200056c565b945050604086015167ffffffffffffffff8111156200062557600080fd5b62000633888289016200056c565b935050606086015167ffffffffffffffff8111156200065157600080fd5b6200065f888289016200056c565b9250506080620006728882890162000555565b9150509295509295909350565b60006200068e6020836200074a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620006dc816200067f565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200070d576200070c6200082a565b5b8060405250919050565b600067ffffffffffffffff8211156200073557620007346200082a565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b600062000768826200076f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620007af57808201518184015260208101905062000792565b83811115620007bf576000848401525b50505050565b60006002820490506001821680620007de57607f821691505b60208210811415620007f557620007f4620007fb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000864816200075b565b81146200087057600080fd5b50565b61501880620008836000396000f3fe6080604052600436106102fe5760003560e01c80636f8b44b011610190578063ba4e5c49116100dc578063d547cfb711610095578063e985e9c51161006f578063e985e9c514610b39578063edec5f2714610b76578063f2c4ce1e14610b9f578063f2fde38b14610bc8576102fe565b8063d547cfb714610aba578063d5abeb0114610ae5578063da3ef23f14610b10576102fe565b8063ba4e5c4914610996578063ba7d2c76146109d3578063c6682862146109fe578063c87b56dd14610a29578063d01f63f514610a66578063d0eb26b014610a91576102fe565b80639c70b51211610149578063a22cb46511610123578063a22cb46514610902578063a475b5dd1461092b578063ad2f852a14610942578063b88d4fde1461096d576102fe565b80639c70b512146108905780639f67756d146108bb578063a0712d68146108e6576102fe565b80636f8b44b01461079457806370a08231146107bd578063715018a6146107fa5780638da5cb5b146108115780638dc251e31461083c57806395d89b4114610865576102fe565b806323b872dd1161024f57806344a0d68a116102085780635c975abb116101e25780635c975abb146106d857806361ba27da146107035780636352211e1461072c5780636c0360eb14610769576102fe565b806344a0d68a1461065b578063518302271461068457806355f804b3146106af576102fe565b806323b872dd1461054e5780632a55205a146105775780633af32abf146105b55780633c952764146105f25780633ccfd60b1461061b57806342842e0e14610632576102fe565b8063088a4ed0116102bc57806313faede61161029657806313faede61461049057806318160ddd146104bb57806318cae269146104e6578063239c70ae14610523576102fe565b8063088a4ed014610427578063095ea7b31461045057806312ee0d7014610479576102fe565b80629a9b7b1461030357806301ffc9a71461032e57806302329a291461036b57806306fdde0314610394578063081812fc146103bf578063081c8c44146103fc575b600080fd5b34801561030f57600080fd5b50610318610bf1565b6040516103259190614ad1565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613b3f565b610bf7565b6040516103629190614774565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190613b16565b610c71565b005b3480156103a057600080fd5b506103a9610d0a565b6040516103b6919061478f565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190613bfb565b610d9c565b6040516103f391906146c2565b60405180910390f35b34801561040857600080fd5b50610411610e21565b60405161041e919061478f565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613bfb565b610eaf565b005b34801561045c57600080fd5b5061047760048036038101906104729190613a95565b610f35565b005b34801561048557600080fd5b5061048e61104d565b005b34801561049c57600080fd5b506104a56110d9565b6040516104b29190614ad1565b60405180910390f35b3480156104c757600080fd5b506104d06110df565b6040516104dd9190614ad1565b60405180910390f35b3480156104f257600080fd5b5061050d6004803603810190610508919061392a565b6110e9565b60405161051a9190614ad1565b60405180910390f35b34801561052f57600080fd5b50610538611101565b6040516105459190614ad1565b60405180910390f35b34801561055a57600080fd5b506105756004803603810190610570919061398f565b611107565b005b34801561058357600080fd5b5061059e60048036038101906105999190613c24565b611167565b6040516105ac929190614729565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d7919061392a565b6111fa565b6040516105e99190614774565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613b16565b6112cf565b005b34801561062757600080fd5b50610630611368565b005b34801561063e57600080fd5b506106596004803603810190610654919061398f565b61149a565b005b34801561066757600080fd5b50610682600480360381019061067d9190613bfb565b6114ba565b005b34801561069057600080fd5b50610699611540565b6040516106a69190614774565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190613bba565b611553565b005b3480156106e457600080fd5b506106ed6115e9565b6040516106fa9190614774565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190613bfb565b6115fc565b005b34801561073857600080fd5b50610753600480360381019061074e9190613bfb565b611682565b60405161076091906146c2565b60405180910390f35b34801561077557600080fd5b5061077e611734565b60405161078b919061478f565b60405180910390f35b3480156107a057600080fd5b506107bb60048036038101906107b69190613bfb565b6117c2565b005b3480156107c957600080fd5b506107e460048036038101906107df919061392a565b611848565b6040516107f19190614ad1565b60405180910390f35b34801561080657600080fd5b5061080f611900565b005b34801561081d57600080fd5b50610826611988565b60405161083391906146c2565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e919061392a565b6119b2565b005b34801561087157600080fd5b5061087a611a72565b604051610887919061478f565b60405180910390f35b34801561089c57600080fd5b506108a5611b04565b6040516108b29190614774565b60405180910390f35b3480156108c757600080fd5b506108d0611b17565b6040516108dd9190614ad1565b60405180910390f35b61090060048036038101906108fb9190613bfb565b611b1d565b005b34801561090e57600080fd5b5061092960048036038101906109249190613a59565b611e5a565b005b34801561093757600080fd5b50610940611e70565b005b34801561094e57600080fd5b50610957611f09565b60405161096491906146c2565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f91906139de565b611f2f565b005b3480156109a257600080fd5b506109bd60048036038101906109b89190613bfb565b611f91565b6040516109ca91906146c2565b60405180910390f35b3480156109df57600080fd5b506109e8611fd0565b6040516109f59190614ad1565b60405180910390f35b348015610a0a57600080fd5b50610a13611fd6565b604051610a20919061478f565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b9190613bfb565b612064565b604051610a5d919061478f565b60405180910390f35b348015610a7257600080fd5b50610a7b6121bd565b604051610a889190614752565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab39190613bfb565b61224b565b005b348015610ac657600080fd5b50610acf6122d1565b604051610adc919061478f565b60405180910390f35b348015610af157600080fd5b50610afa6122e8565b604051610b079190614ad1565b60405180910390f35b348015610b1c57600080fd5b50610b376004803603810190610b329190613bba565b6122ee565b005b348015610b4557600080fd5b50610b606004803603810190610b5b9190613953565b612384565b604051610b6d9190614774565b60405180910390f35b348015610b8257600080fd5b50610b9d6004803603810190610b989190613ad1565b612486565b005b348015610bab57600080fd5b50610bc66004803603810190610bc19190613bba565b612526565b005b348015610bd457600080fd5b50610bef6004803603810190610bea919061392a565b6125bc565b005b60095481565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c6a5750610c69826126b4565b5b9050919050565b610c79612796565b73ffffffffffffffffffffffffffffffffffffffff16610c97611988565b73ffffffffffffffffffffffffffffffffffffffff1614610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce4906149b1565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060008054610d1990614df6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4590614df6565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b5050505050905090565b6000610da78261279e565b610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90614991565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b8054610e2e90614df6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5a90614df6565b8015610ea75780601f10610e7c57610100808354040283529160200191610ea7565b820191906000526020600020905b815481529060010190602001808311610e8a57829003601f168201915b505050505081565b610eb7612796565b73ffffffffffffffffffffffffffffffffffffffff16610ed5611988565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f22906149b1565b60405180910390fd5b80600e8190555050565b6000610f4082611682565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890614a31565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fd0612796565b73ffffffffffffffffffffffffffffffffffffffff161480610fff5750610ffe81610ff9612796565b612384565b5b61103e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611035906148b1565b60405180910390fd5b611048838361280a565b505050565b611055612796565b73ffffffffffffffffffffffffffffffffffffffff16611073611988565b73ffffffffffffffffffffffffffffffffffffffff16146110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906149b1565b60405180910390fd5b601160006110d7919061362e565b565b600c5481565b6000600954905090565b60126020528060005260406000206000915090505481565b600e5481565b611118611112612796565b826128c3565b611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90614a71565b60405180910390fd5b6111628383836129a1565b505050565b6000806111738461279e565b6111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990614951565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601454856111e59190614ca0565b6111ef9190614c6f565b915091509250929050565b600080600090505b6011805490508110156112c4578273ffffffffffffffffffffffffffffffffffffffff1660118281548110611260577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112b15760019150506112ca565b80806112bc90614e28565b915050611202565b50600090505b919050565b6112d7612796565b73ffffffffffffffffffffffffffffffffffffffff166112f5611988565b73ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611342906149b1565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b611370612796565b73ffffffffffffffffffffffffffffffffffffffff1661138e611988565b73ffffffffffffffffffffffffffffffffffffffff16146113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db906149b1565b60405180910390fd5b60006113ee611988565b73ffffffffffffffffffffffffffffffffffffffff1647604051611411906146ad565b60006040518083038185875af1925050503d806000811461144e576040519150601f19603f3d011682016040523d82523d6000602084013e611453565b606091505b5050905080611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90614811565b60405180910390fd5b50565b6114b583838360405180602001604052806000815250611f2f565b505050565b6114c2612796565b73ffffffffffffffffffffffffffffffffffffffff166114e0611988565b73ffffffffffffffffffffffffffffffffffffffff1614611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906149b1565b60405180910390fd5b80600c8190555050565b601060019054906101000a900460ff1681565b61155b612796565b73ffffffffffffffffffffffffffffffffffffffff16611579611988565b73ffffffffffffffffffffffffffffffffffffffff16146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906149b1565b60405180910390fd5b80600a90805190602001906115e592919061364f565b5050565b601060009054906101000a900460ff1681565b611604612796565b73ffffffffffffffffffffffffffffffffffffffff16611622611988565b73ffffffffffffffffffffffffffffffffffffffff1614611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f906149b1565b60405180910390fd5b8060148190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561172b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611722906148f1565b60405180910390fd5b80915050919050565b600a805461174190614df6565b80601f016020809104026020016040519081016040528092919081815260200182805461176d90614df6565b80156117ba5780601f1061178f576101008083540402835291602001916117ba565b820191906000526020600020905b81548152906001019060200180831161179d57829003601f168201915b505050505081565b6117ca612796565b73ffffffffffffffffffffffffffffffffffffffff166117e8611988565b73ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611835906149b1565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b0906148d1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611908612796565b73ffffffffffffffffffffffffffffffffffffffff16611926611988565b73ffffffffffffffffffffffffffffffffffffffff161461197c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611973906149b1565b60405180910390fd5b6119866000612bfd565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119ba612796565b73ffffffffffffffffffffffffffffffffffffffff166119d8611988565b73ffffffffffffffffffffffffffffffffffffffff1614611a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a25906149b1565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611a8190614df6565b80601f0160208091040260200160405190810160405280929190818152602001828054611aad90614df6565b8015611afa5780601f10611acf57610100808354040283529160200191611afa565b820191906000526020600020905b815481529060010190602001808311611add57829003601f168201915b5050505050905090565b601060029054906101000a900460ff1681565b60145481565b601060009054906101000a900460ff1615611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b64906149d1565b60405180910390fd5b6000611b776110df565b905060008211611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb390614ab1565b60405180910390fd5b600e54821115611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614931565b60405180910390fd5b600d548282611c109190614c19565b1115611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4890614911565b60405180910390fd5b611c59611988565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dd65760011515601060029054906101000a900460ff1615151415611d8557611cb0336111fa565b611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690614a91565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548382611d429190614c19565b1115611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90614831565b60405180910390fd5b505b81600c54611d939190614ca0565b341015611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc90614a51565b60405180910390fd5b5b6000600190505b828111611e5557601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611e3490614e28565b9190505550611e4233612cc3565b8080611e4d90614e28565b915050611ddd565b505050565b611e6c611e65612796565b8383612ce5565b5050565b611e78612796565b73ffffffffffffffffffffffffffffffffffffffff16611e96611988565b73ffffffffffffffffffffffffffffffffffffffff1614611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee3906149b1565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f40611f3a612796565b836128c3565b611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690614a71565b60405180910390fd5b611f8b84848484612e52565b50505050565b60118181548110611fa157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60078054611fe390614df6565b80601f016020809104026020016040519081016040528092919081815260200182805461200f90614df6565b801561205c5780601f106120315761010080835404028352916020019161205c565b820191906000526020600020905b81548152906001019060200180831161203f57829003601f168201915b505050505081565b606061206f8261279e565b6120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590614a11565b60405180910390fd5b60001515601060019054906101000a900460ff161515141561215c57600b80546120d790614df6565b80601f016020809104026020016040519081016040528092919081815260200182805461210390614df6565b80156121505780601f1061212557610100808354040283529160200191612150565b820191906000526020600020905b81548152906001019060200180831161213357829003601f168201915b505050505090506121b8565b6000612166612eae565b9050600081511161218657604051806020016040528060008152506121b4565b8061219084612f40565b60076040516020016121a49392919061467c565b6040516020818303038152906040525b9150505b919050565b6060601180548060200260200160405190810160405280929190818152602001828054801561224157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116121f7575b5050505050905090565b612253612796565b73ffffffffffffffffffffffffffffffffffffffff16612271611988565b73ffffffffffffffffffffffffffffffffffffffff16146122c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122be906149b1565b60405180910390fd5b80600f8190555050565b606060405180602001604052806000815250905090565b600d5481565b6122f6612796565b73ffffffffffffffffffffffffffffffffffffffff16612314611988565b73ffffffffffffffffffffffffffffffffffffffff161461236a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612361906149b1565b60405180910390fd5b806007908051906020019061238092919061364f565b5050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016123fc91906146c2565b60206040518083038186803b15801561241457600080fd5b505afa158015612428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244c9190613b91565b73ffffffffffffffffffffffffffffffffffffffff161415612472576001915050612480565b61247c84846130ed565b9150505b92915050565b61248e612796565b73ffffffffffffffffffffffffffffffffffffffff166124ac611988565b73ffffffffffffffffffffffffffffffffffffffff1614612502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f9906149b1565b60405180910390fd5b60116000612510919061362e565b8181601191906125219291906136d5565b505050565b61252e612796565b73ffffffffffffffffffffffffffffffffffffffff1661254c611988565b73ffffffffffffffffffffffffffffffffffffffff16146125a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612599906149b1565b60405180910390fd5b80600b90805190602001906125b892919061364f565b5050565b6125c4612796565b73ffffffffffffffffffffffffffffffffffffffff166125e2611988565b73ffffffffffffffffffffffffffffffffffffffff1614612638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262f906149b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269f906147d1565b60405180910390fd5b6126b181612bfd565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061277f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061278f575061278e82613181565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661287d83611682565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128ce8261279e565b61290d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290490614891565b60405180910390fd5b600061291883611682565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061298757508373ffffffffffffffffffffffffffffffffffffffff1661296f84610d9c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061299857506129978185612384565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129c182611682565b73ffffffffffffffffffffffffffffffffffffffff1614612a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0e906149f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7e90614851565b60405180910390fd5b612a928383836131eb565b612a9d60008261280a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aed9190614cfa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b449190614c19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ccd6131f0565b9050612cd9828261320d565b612ce161322b565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b90614871565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e459190614774565b60405180910390a3505050565b612e5d8484846129a1565b612e6984848484613245565b612ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9f906147b1565b60405180910390fd5b50505050565b6060600a8054612ebd90614df6565b80601f0160208091040260200160405190810160405280929190818152602001828054612ee990614df6565b8015612f365780601f10612f0b57610100808354040283529160200191612f36565b820191906000526020600020905b815481529060010190602001808311612f1957829003601f168201915b5050505050905090565b60606000821415612f88576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130e8565b600082905060005b60008214612fba578080612fa390614e28565b915050600a82612fb39190614c6f565b9150612f90565b60008167ffffffffffffffff811115612ffc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561302e5781602001600182028036833780820191505090505b5090505b600085146130e1576001826130479190614cfa565b9150600a856130569190614e71565b60306130629190614c19565b60f81b81838151811061309e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130da9190614c6f565b9450613032565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600061320860016009546133dc90919063ffffffff16565b905090565b6132278282604051806020016040528060008152506133f2565b5050565b6009600081548092919061323e90614e28565b9190505550565b60006132668473ffffffffffffffffffffffffffffffffffffffff1661344d565b156133cf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261328f612796565b8786866040518563ffffffff1660e01b81526004016132b194939291906146dd565b602060405180830381600087803b1580156132cb57600080fd5b505af19250505080156132fc57506040513d601f19601f820116820180604052508101906132f99190613b68565b60015b61337f573d806000811461332c576040519150601f19603f3d011682016040523d82523d6000602084013e613331565b606091505b50600081511415613377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336e906147b1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133d4565b600190505b949350505050565b600081836133ea9190614c19565b905092915050565b6133fc8383613460565b6134096000848484613245565b613448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343f906147b1565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c790614971565b60405180910390fd5b6134d98161279e565b15613519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613510906147f1565b60405180910390fd5b613525600083836131eb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135759190614c19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b508054600082559060005260206000209081019061364c9190613775565b50565b82805461365b90614df6565b90600052602060002090601f01602090048101928261367d57600085556136c4565b82601f1061369657805160ff19168380011785556136c4565b828001600101855582156136c4579182015b828111156136c35782518255916020019190600101906136a8565b5b5090506136d19190613775565b5090565b828054828255906000526020600020908101928215613764579160200282015b8281111561376357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906136f5565b5b5090506137719190613775565b5090565b5b8082111561378e576000816000905550600101613776565b5090565b60006137a56137a084614b1d565b614aec565b9050828152602081018484840111156137bd57600080fd5b6137c8848285614db4565b509392505050565b60006137e36137de84614b4d565b614aec565b9050828152602081018484840111156137fb57600080fd5b613806848285614db4565b509392505050565b60008135905061381d81614f6f565b92915050565b60008083601f84011261383557600080fd5b8235905067ffffffffffffffff81111561384e57600080fd5b60208301915083602082028301111561386657600080fd5b9250929050565b60008135905061387c81614f86565b92915050565b60008135905061389181614f9d565b92915050565b6000815190506138a681614f9d565b92915050565b600082601f8301126138bd57600080fd5b81356138cd848260208601613792565b91505092915050565b6000815190506138e581614fb4565b92915050565b600082601f8301126138fc57600080fd5b813561390c8482602086016137d0565b91505092915050565b60008135905061392481614fcb565b92915050565b60006020828403121561393c57600080fd5b600061394a8482850161380e565b91505092915050565b6000806040838503121561396657600080fd5b60006139748582860161380e565b92505060206139858582860161380e565b9150509250929050565b6000806000606084860312156139a457600080fd5b60006139b28682870161380e565b93505060206139c38682870161380e565b92505060406139d486828701613915565b9150509250925092565b600080600080608085870312156139f457600080fd5b6000613a028782880161380e565b9450506020613a138782880161380e565b9350506040613a2487828801613915565b925050606085013567ffffffffffffffff811115613a4157600080fd5b613a4d878288016138ac565b91505092959194509250565b60008060408385031215613a6c57600080fd5b6000613a7a8582860161380e565b9250506020613a8b8582860161386d565b9150509250929050565b60008060408385031215613aa857600080fd5b6000613ab68582860161380e565b9250506020613ac785828601613915565b9150509250929050565b60008060208385031215613ae457600080fd5b600083013567ffffffffffffffff811115613afe57600080fd5b613b0a85828601613823565b92509250509250929050565b600060208284031215613b2857600080fd5b6000613b368482850161386d565b91505092915050565b600060208284031215613b5157600080fd5b6000613b5f84828501613882565b91505092915050565b600060208284031215613b7a57600080fd5b6000613b8884828501613897565b91505092915050565b600060208284031215613ba357600080fd5b6000613bb1848285016138d6565b91505092915050565b600060208284031215613bcc57600080fd5b600082013567ffffffffffffffff811115613be657600080fd5b613bf2848285016138eb565b91505092915050565b600060208284031215613c0d57600080fd5b6000613c1b84828501613915565b91505092915050565b60008060408385031215613c3757600080fd5b6000613c4585828601613915565b9250506020613c5685828601613915565b9150509250929050565b6000613c6c8383613c78565b60208301905092915050565b613c8181614d2e565b82525050565b613c9081614d2e565b82525050565b6000613ca182614ba2565b613cab8185614bd0565b9350613cb683614b7d565b8060005b83811015613ce7578151613cce8882613c60565b9750613cd983614bc3565b925050600181019050613cba565b5085935050505092915050565b613cfd81614d40565b82525050565b6000613d0e82614bad565b613d188185614be1565b9350613d28818560208601614dc3565b613d3181614f5e565b840191505092915050565b6000613d4782614bb8565b613d518185614bfd565b9350613d61818560208601614dc3565b613d6a81614f5e565b840191505092915050565b6000613d8082614bb8565b613d8a8185614c0e565b9350613d9a818560208601614dc3565b80840191505092915050565b60008154613db381614df6565b613dbd8186614c0e565b94506001821660008114613dd85760018114613de957613e1c565b60ff19831686528186019350613e1c565b613df285614b8d565b60005b83811015613e1457815481890152600182019150602081019050613df5565b838801955050505b50505092915050565b6000613e32603283614bfd565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613e98602683614bfd565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613efe601c83614bfd565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613f3e600f83614bfd565b91507f5769746864726177206661696c656400000000000000000000000000000000006000830152602082019050919050565b6000613f7e601c83614bfd565b91507f6d6178204e4654207065722061646472657373206578636565646564000000006000830152602082019050919050565b6000613fbe602483614bfd565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614024601983614bfd565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614064602c83614bfd565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006140ca603883614bfd565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614130602a83614bfd565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614196602983614bfd565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006141fc601683614bfd565b91507f6d6178204e4654206c696d6974206578636565646564000000000000000000006000830152602082019050919050565b600061423c602483614bfd565b91507f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008301527f65646564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142a2601283614bfd565b91507f4e6f6e2d6578697374656e7420746f6b656e00000000000000000000000000006000830152602082019050919050565b60006142e2602083614bfd565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614322602c83614bfd565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614388602083614bfd565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006143c8601683614bfd565b91507f74686520636f6e747261637420697320706175736564000000000000000000006000830152602082019050919050565b6000614408602983614bfd565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061446e602f83614bfd565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006144d4602183614bfd565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061453a600083614bf2565b9150600082019050919050565b6000614554601283614bfd565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000614594603183614bfd565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006145fa601783614bfd565b91507f75736572206973206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b600061463a601b83614bfd565b91507f6e65656420746f206d696e74206174206c656173742031204e465400000000006000830152602082019050919050565b61467681614daa565b82525050565b60006146888286613d75565b91506146948285613d75565b91506146a08284613da6565b9150819050949350505050565b60006146b88261452d565b9150819050919050565b60006020820190506146d76000830184613c87565b92915050565b60006080820190506146f26000830187613c87565b6146ff6020830186613c87565b61470c604083018561466d565b818103606083015261471e8184613d03565b905095945050505050565b600060408201905061473e6000830185613c87565b61474b602083018461466d565b9392505050565b6000602082019050818103600083015261476c8184613c96565b905092915050565b60006020820190506147896000830184613cf4565b92915050565b600060208201905081810360008301526147a98184613d3c565b905092915050565b600060208201905081810360008301526147ca81613e25565b9050919050565b600060208201905081810360008301526147ea81613e8b565b9050919050565b6000602082019050818103600083015261480a81613ef1565b9050919050565b6000602082019050818103600083015261482a81613f31565b9050919050565b6000602082019050818103600083015261484a81613f71565b9050919050565b6000602082019050818103600083015261486a81613fb1565b9050919050565b6000602082019050818103600083015261488a81614017565b9050919050565b600060208201905081810360008301526148aa81614057565b9050919050565b600060208201905081810360008301526148ca816140bd565b9050919050565b600060208201905081810360008301526148ea81614123565b9050919050565b6000602082019050818103600083015261490a81614189565b9050919050565b6000602082019050818103600083015261492a816141ef565b9050919050565b6000602082019050818103600083015261494a8161422f565b9050919050565b6000602082019050818103600083015261496a81614295565b9050919050565b6000602082019050818103600083015261498a816142d5565b9050919050565b600060208201905081810360008301526149aa81614315565b9050919050565b600060208201905081810360008301526149ca8161437b565b9050919050565b600060208201905081810360008301526149ea816143bb565b9050919050565b60006020820190508181036000830152614a0a816143fb565b9050919050565b60006020820190508181036000830152614a2a81614461565b9050919050565b60006020820190508181036000830152614a4a816144c7565b9050919050565b60006020820190508181036000830152614a6a81614547565b9050919050565b60006020820190508181036000830152614a8a81614587565b9050919050565b60006020820190508181036000830152614aaa816145ed565b9050919050565b60006020820190508181036000830152614aca8161462d565b9050919050565b6000602082019050614ae6600083018461466d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b1357614b12614f2f565b5b8060405250919050565b600067ffffffffffffffff821115614b3857614b37614f2f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b6857614b67614f2f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c2482614daa565b9150614c2f83614daa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c6457614c63614ea2565b5b828201905092915050565b6000614c7a82614daa565b9150614c8583614daa565b925082614c9557614c94614ed1565b5b828204905092915050565b6000614cab82614daa565b9150614cb683614daa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cef57614cee614ea2565b5b828202905092915050565b6000614d0582614daa565b9150614d1083614daa565b925082821015614d2357614d22614ea2565b5b828203905092915050565b6000614d3982614d8a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614d8382614d2e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614de1578082015181840152602081019050614dc6565b83811115614df0576000848401525b50505050565b60006002820490506001821680614e0e57607f821691505b60208210811415614e2257614e21614f00565b5b50919050565b6000614e3382614daa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e6657614e65614ea2565b5b600182019050919050565b6000614e7c82614daa565b9150614e8783614daa565b925082614e9757614e96614ed1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614f7881614d2e565b8114614f8357600080fd5b50565b614f8f81614d40565b8114614f9a57600080fd5b50565b614fa681614d4c565b8114614fb157600080fd5b50565b614fbd81614d78565b8114614fc857600080fd5b50565b614fd481614daa565b8114614fdf57600080fd5b5056fea26469706673582212209a3087e0f67af6acf24da00f0ae260b604a44859ad4ccca5a971d3cb6a11077464736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000007446f73646c6573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003444f5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d53397a62796b754b56703664384b7648416768543564586b58336552644d547235654147736167695a4d7a6d2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d4e6e7541383655385167727953316d51636b48734e333279424a544133387461556666333179703673745a512f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102fe5760003560e01c80636f8b44b011610190578063ba4e5c49116100dc578063d547cfb711610095578063e985e9c51161006f578063e985e9c514610b39578063edec5f2714610b76578063f2c4ce1e14610b9f578063f2fde38b14610bc8576102fe565b8063d547cfb714610aba578063d5abeb0114610ae5578063da3ef23f14610b10576102fe565b8063ba4e5c4914610996578063ba7d2c76146109d3578063c6682862146109fe578063c87b56dd14610a29578063d01f63f514610a66578063d0eb26b014610a91576102fe565b80639c70b51211610149578063a22cb46511610123578063a22cb46514610902578063a475b5dd1461092b578063ad2f852a14610942578063b88d4fde1461096d576102fe565b80639c70b512146108905780639f67756d146108bb578063a0712d68146108e6576102fe565b80636f8b44b01461079457806370a08231146107bd578063715018a6146107fa5780638da5cb5b146108115780638dc251e31461083c57806395d89b4114610865576102fe565b806323b872dd1161024f57806344a0d68a116102085780635c975abb116101e25780635c975abb146106d857806361ba27da146107035780636352211e1461072c5780636c0360eb14610769576102fe565b806344a0d68a1461065b578063518302271461068457806355f804b3146106af576102fe565b806323b872dd1461054e5780632a55205a146105775780633af32abf146105b55780633c952764146105f25780633ccfd60b1461061b57806342842e0e14610632576102fe565b8063088a4ed0116102bc57806313faede61161029657806313faede61461049057806318160ddd146104bb57806318cae269146104e6578063239c70ae14610523576102fe565b8063088a4ed014610427578063095ea7b31461045057806312ee0d7014610479576102fe565b80629a9b7b1461030357806301ffc9a71461032e57806302329a291461036b57806306fdde0314610394578063081812fc146103bf578063081c8c44146103fc575b600080fd5b34801561030f57600080fd5b50610318610bf1565b6040516103259190614ad1565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613b3f565b610bf7565b6040516103629190614774565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190613b16565b610c71565b005b3480156103a057600080fd5b506103a9610d0a565b6040516103b6919061478f565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190613bfb565b610d9c565b6040516103f391906146c2565b60405180910390f35b34801561040857600080fd5b50610411610e21565b60405161041e919061478f565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613bfb565b610eaf565b005b34801561045c57600080fd5b5061047760048036038101906104729190613a95565b610f35565b005b34801561048557600080fd5b5061048e61104d565b005b34801561049c57600080fd5b506104a56110d9565b6040516104b29190614ad1565b60405180910390f35b3480156104c757600080fd5b506104d06110df565b6040516104dd9190614ad1565b60405180910390f35b3480156104f257600080fd5b5061050d6004803603810190610508919061392a565b6110e9565b60405161051a9190614ad1565b60405180910390f35b34801561052f57600080fd5b50610538611101565b6040516105459190614ad1565b60405180910390f35b34801561055a57600080fd5b506105756004803603810190610570919061398f565b611107565b005b34801561058357600080fd5b5061059e60048036038101906105999190613c24565b611167565b6040516105ac929190614729565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d7919061392a565b6111fa565b6040516105e99190614774565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613b16565b6112cf565b005b34801561062757600080fd5b50610630611368565b005b34801561063e57600080fd5b506106596004803603810190610654919061398f565b61149a565b005b34801561066757600080fd5b50610682600480360381019061067d9190613bfb565b6114ba565b005b34801561069057600080fd5b50610699611540565b6040516106a69190614774565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190613bba565b611553565b005b3480156106e457600080fd5b506106ed6115e9565b6040516106fa9190614774565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190613bfb565b6115fc565b005b34801561073857600080fd5b50610753600480360381019061074e9190613bfb565b611682565b60405161076091906146c2565b60405180910390f35b34801561077557600080fd5b5061077e611734565b60405161078b919061478f565b60405180910390f35b3480156107a057600080fd5b506107bb60048036038101906107b69190613bfb565b6117c2565b005b3480156107c957600080fd5b506107e460048036038101906107df919061392a565b611848565b6040516107f19190614ad1565b60405180910390f35b34801561080657600080fd5b5061080f611900565b005b34801561081d57600080fd5b50610826611988565b60405161083391906146c2565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e919061392a565b6119b2565b005b34801561087157600080fd5b5061087a611a72565b604051610887919061478f565b60405180910390f35b34801561089c57600080fd5b506108a5611b04565b6040516108b29190614774565b60405180910390f35b3480156108c757600080fd5b506108d0611b17565b6040516108dd9190614ad1565b60405180910390f35b61090060048036038101906108fb9190613bfb565b611b1d565b005b34801561090e57600080fd5b5061092960048036038101906109249190613a59565b611e5a565b005b34801561093757600080fd5b50610940611e70565b005b34801561094e57600080fd5b50610957611f09565b60405161096491906146c2565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f91906139de565b611f2f565b005b3480156109a257600080fd5b506109bd60048036038101906109b89190613bfb565b611f91565b6040516109ca91906146c2565b60405180910390f35b3480156109df57600080fd5b506109e8611fd0565b6040516109f59190614ad1565b60405180910390f35b348015610a0a57600080fd5b50610a13611fd6565b604051610a20919061478f565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b9190613bfb565b612064565b604051610a5d919061478f565b60405180910390f35b348015610a7257600080fd5b50610a7b6121bd565b604051610a889190614752565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab39190613bfb565b61224b565b005b348015610ac657600080fd5b50610acf6122d1565b604051610adc919061478f565b60405180910390f35b348015610af157600080fd5b50610afa6122e8565b604051610b079190614ad1565b60405180910390f35b348015610b1c57600080fd5b50610b376004803603810190610b329190613bba565b6122ee565b005b348015610b4557600080fd5b50610b606004803603810190610b5b9190613953565b612384565b604051610b6d9190614774565b60405180910390f35b348015610b8257600080fd5b50610b9d6004803603810190610b989190613ad1565b612486565b005b348015610bab57600080fd5b50610bc66004803603810190610bc19190613bba565b612526565b005b348015610bd457600080fd5b50610bef6004803603810190610bea919061392a565b6125bc565b005b60095481565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c6a5750610c69826126b4565b5b9050919050565b610c79612796565b73ffffffffffffffffffffffffffffffffffffffff16610c97611988565b73ffffffffffffffffffffffffffffffffffffffff1614610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce4906149b1565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060008054610d1990614df6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4590614df6565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b5050505050905090565b6000610da78261279e565b610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90614991565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b8054610e2e90614df6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5a90614df6565b8015610ea75780601f10610e7c57610100808354040283529160200191610ea7565b820191906000526020600020905b815481529060010190602001808311610e8a57829003601f168201915b505050505081565b610eb7612796565b73ffffffffffffffffffffffffffffffffffffffff16610ed5611988565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f22906149b1565b60405180910390fd5b80600e8190555050565b6000610f4082611682565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890614a31565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fd0612796565b73ffffffffffffffffffffffffffffffffffffffff161480610fff5750610ffe81610ff9612796565b612384565b5b61103e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611035906148b1565b60405180910390fd5b611048838361280a565b505050565b611055612796565b73ffffffffffffffffffffffffffffffffffffffff16611073611988565b73ffffffffffffffffffffffffffffffffffffffff16146110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906149b1565b60405180910390fd5b601160006110d7919061362e565b565b600c5481565b6000600954905090565b60126020528060005260406000206000915090505481565b600e5481565b611118611112612796565b826128c3565b611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90614a71565b60405180910390fd5b6111628383836129a1565b505050565b6000806111738461279e565b6111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990614951565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601454856111e59190614ca0565b6111ef9190614c6f565b915091509250929050565b600080600090505b6011805490508110156112c4578273ffffffffffffffffffffffffffffffffffffffff1660118281548110611260577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112b15760019150506112ca565b80806112bc90614e28565b915050611202565b50600090505b919050565b6112d7612796565b73ffffffffffffffffffffffffffffffffffffffff166112f5611988565b73ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611342906149b1565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b611370612796565b73ffffffffffffffffffffffffffffffffffffffff1661138e611988565b73ffffffffffffffffffffffffffffffffffffffff16146113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db906149b1565b60405180910390fd5b60006113ee611988565b73ffffffffffffffffffffffffffffffffffffffff1647604051611411906146ad565b60006040518083038185875af1925050503d806000811461144e576040519150601f19603f3d011682016040523d82523d6000602084013e611453565b606091505b5050905080611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90614811565b60405180910390fd5b50565b6114b583838360405180602001604052806000815250611f2f565b505050565b6114c2612796565b73ffffffffffffffffffffffffffffffffffffffff166114e0611988565b73ffffffffffffffffffffffffffffffffffffffff1614611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906149b1565b60405180910390fd5b80600c8190555050565b601060019054906101000a900460ff1681565b61155b612796565b73ffffffffffffffffffffffffffffffffffffffff16611579611988565b73ffffffffffffffffffffffffffffffffffffffff16146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906149b1565b60405180910390fd5b80600a90805190602001906115e592919061364f565b5050565b601060009054906101000a900460ff1681565b611604612796565b73ffffffffffffffffffffffffffffffffffffffff16611622611988565b73ffffffffffffffffffffffffffffffffffffffff1614611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f906149b1565b60405180910390fd5b8060148190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561172b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611722906148f1565b60405180910390fd5b80915050919050565b600a805461174190614df6565b80601f016020809104026020016040519081016040528092919081815260200182805461176d90614df6565b80156117ba5780601f1061178f576101008083540402835291602001916117ba565b820191906000526020600020905b81548152906001019060200180831161179d57829003601f168201915b505050505081565b6117ca612796565b73ffffffffffffffffffffffffffffffffffffffff166117e8611988565b73ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611835906149b1565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b0906148d1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611908612796565b73ffffffffffffffffffffffffffffffffffffffff16611926611988565b73ffffffffffffffffffffffffffffffffffffffff161461197c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611973906149b1565b60405180910390fd5b6119866000612bfd565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119ba612796565b73ffffffffffffffffffffffffffffffffffffffff166119d8611988565b73ffffffffffffffffffffffffffffffffffffffff1614611a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a25906149b1565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611a8190614df6565b80601f0160208091040260200160405190810160405280929190818152602001828054611aad90614df6565b8015611afa5780601f10611acf57610100808354040283529160200191611afa565b820191906000526020600020905b815481529060010190602001808311611add57829003601f168201915b5050505050905090565b601060029054906101000a900460ff1681565b60145481565b601060009054906101000a900460ff1615611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b64906149d1565b60405180910390fd5b6000611b776110df565b905060008211611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb390614ab1565b60405180910390fd5b600e54821115611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614931565b60405180910390fd5b600d548282611c109190614c19565b1115611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4890614911565b60405180910390fd5b611c59611988565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dd65760011515601060029054906101000a900460ff1615151415611d8557611cb0336111fa565b611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690614a91565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548382611d429190614c19565b1115611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90614831565b60405180910390fd5b505b81600c54611d939190614ca0565b341015611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc90614a51565b60405180910390fd5b5b6000600190505b828111611e5557601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611e3490614e28565b9190505550611e4233612cc3565b8080611e4d90614e28565b915050611ddd565b505050565b611e6c611e65612796565b8383612ce5565b5050565b611e78612796565b73ffffffffffffffffffffffffffffffffffffffff16611e96611988565b73ffffffffffffffffffffffffffffffffffffffff1614611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee3906149b1565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f40611f3a612796565b836128c3565b611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690614a71565b60405180910390fd5b611f8b84848484612e52565b50505050565b60118181548110611fa157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60078054611fe390614df6565b80601f016020809104026020016040519081016040528092919081815260200182805461200f90614df6565b801561205c5780601f106120315761010080835404028352916020019161205c565b820191906000526020600020905b81548152906001019060200180831161203f57829003601f168201915b505050505081565b606061206f8261279e565b6120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590614a11565b60405180910390fd5b60001515601060019054906101000a900460ff161515141561215c57600b80546120d790614df6565b80601f016020809104026020016040519081016040528092919081815260200182805461210390614df6565b80156121505780601f1061212557610100808354040283529160200191612150565b820191906000526020600020905b81548152906001019060200180831161213357829003601f168201915b505050505090506121b8565b6000612166612eae565b9050600081511161218657604051806020016040528060008152506121b4565b8061219084612f40565b60076040516020016121a49392919061467c565b6040516020818303038152906040525b9150505b919050565b6060601180548060200260200160405190810160405280929190818152602001828054801561224157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116121f7575b5050505050905090565b612253612796565b73ffffffffffffffffffffffffffffffffffffffff16612271611988565b73ffffffffffffffffffffffffffffffffffffffff16146122c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122be906149b1565b60405180910390fd5b80600f8190555050565b606060405180602001604052806000815250905090565b600d5481565b6122f6612796565b73ffffffffffffffffffffffffffffffffffffffff16612314611988565b73ffffffffffffffffffffffffffffffffffffffff161461236a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612361906149b1565b60405180910390fd5b806007908051906020019061238092919061364f565b5050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016123fc91906146c2565b60206040518083038186803b15801561241457600080fd5b505afa158015612428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244c9190613b91565b73ffffffffffffffffffffffffffffffffffffffff161415612472576001915050612480565b61247c84846130ed565b9150505b92915050565b61248e612796565b73ffffffffffffffffffffffffffffffffffffffff166124ac611988565b73ffffffffffffffffffffffffffffffffffffffff1614612502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f9906149b1565b60405180910390fd5b60116000612510919061362e565b8181601191906125219291906136d5565b505050565b61252e612796565b73ffffffffffffffffffffffffffffffffffffffff1661254c611988565b73ffffffffffffffffffffffffffffffffffffffff16146125a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612599906149b1565b60405180910390fd5b80600b90805190602001906125b892919061364f565b5050565b6125c4612796565b73ffffffffffffffffffffffffffffffffffffffff166125e2611988565b73ffffffffffffffffffffffffffffffffffffffff1614612638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262f906149b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269f906147d1565b60405180910390fd5b6126b181612bfd565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061277f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061278f575061278e82613181565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661287d83611682565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128ce8261279e565b61290d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290490614891565b60405180910390fd5b600061291883611682565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061298757508373ffffffffffffffffffffffffffffffffffffffff1661296f84610d9c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061299857506129978185612384565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129c182611682565b73ffffffffffffffffffffffffffffffffffffffff1614612a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0e906149f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7e90614851565b60405180910390fd5b612a928383836131eb565b612a9d60008261280a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aed9190614cfa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b449190614c19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ccd6131f0565b9050612cd9828261320d565b612ce161322b565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b90614871565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e459190614774565b60405180910390a3505050565b612e5d8484846129a1565b612e6984848484613245565b612ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9f906147b1565b60405180910390fd5b50505050565b6060600a8054612ebd90614df6565b80601f0160208091040260200160405190810160405280929190818152602001828054612ee990614df6565b8015612f365780601f10612f0b57610100808354040283529160200191612f36565b820191906000526020600020905b815481529060010190602001808311612f1957829003601f168201915b5050505050905090565b60606000821415612f88576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130e8565b600082905060005b60008214612fba578080612fa390614e28565b915050600a82612fb39190614c6f565b9150612f90565b60008167ffffffffffffffff811115612ffc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561302e5781602001600182028036833780820191505090505b5090505b600085146130e1576001826130479190614cfa565b9150600a856130569190614e71565b60306130629190614c19565b60f81b81838151811061309e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130da9190614c6f565b9450613032565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600061320860016009546133dc90919063ffffffff16565b905090565b6132278282604051806020016040528060008152506133f2565b5050565b6009600081548092919061323e90614e28565b9190505550565b60006132668473ffffffffffffffffffffffffffffffffffffffff1661344d565b156133cf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261328f612796565b8786866040518563ffffffff1660e01b81526004016132b194939291906146dd565b602060405180830381600087803b1580156132cb57600080fd5b505af19250505080156132fc57506040513d601f19601f820116820180604052508101906132f99190613b68565b60015b61337f573d806000811461332c576040519150601f19603f3d011682016040523d82523d6000602084013e613331565b606091505b50600081511415613377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336e906147b1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133d4565b600190505b949350505050565b600081836133ea9190614c19565b905092915050565b6133fc8383613460565b6134096000848484613245565b613448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343f906147b1565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c790614971565b60405180910390fd5b6134d98161279e565b15613519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613510906147f1565b60405180910390fd5b613525600083836131eb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135759190614c19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b508054600082559060005260206000209081019061364c9190613775565b50565b82805461365b90614df6565b90600052602060002090601f01602090048101928261367d57600085556136c4565b82601f1061369657805160ff19168380011785556136c4565b828001600101855582156136c4579182015b828111156136c35782518255916020019190600101906136a8565b5b5090506136d19190613775565b5090565b828054828255906000526020600020908101928215613764579160200282015b8281111561376357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906136f5565b5b5090506137719190613775565b5090565b5b8082111561378e576000816000905550600101613776565b5090565b60006137a56137a084614b1d565b614aec565b9050828152602081018484840111156137bd57600080fd5b6137c8848285614db4565b509392505050565b60006137e36137de84614b4d565b614aec565b9050828152602081018484840111156137fb57600080fd5b613806848285614db4565b509392505050565b60008135905061381d81614f6f565b92915050565b60008083601f84011261383557600080fd5b8235905067ffffffffffffffff81111561384e57600080fd5b60208301915083602082028301111561386657600080fd5b9250929050565b60008135905061387c81614f86565b92915050565b60008135905061389181614f9d565b92915050565b6000815190506138a681614f9d565b92915050565b600082601f8301126138bd57600080fd5b81356138cd848260208601613792565b91505092915050565b6000815190506138e581614fb4565b92915050565b600082601f8301126138fc57600080fd5b813561390c8482602086016137d0565b91505092915050565b60008135905061392481614fcb565b92915050565b60006020828403121561393c57600080fd5b600061394a8482850161380e565b91505092915050565b6000806040838503121561396657600080fd5b60006139748582860161380e565b92505060206139858582860161380e565b9150509250929050565b6000806000606084860312156139a457600080fd5b60006139b28682870161380e565b93505060206139c38682870161380e565b92505060406139d486828701613915565b9150509250925092565b600080600080608085870312156139f457600080fd5b6000613a028782880161380e565b9450506020613a138782880161380e565b9350506040613a2487828801613915565b925050606085013567ffffffffffffffff811115613a4157600080fd5b613a4d878288016138ac565b91505092959194509250565b60008060408385031215613a6c57600080fd5b6000613a7a8582860161380e565b9250506020613a8b8582860161386d565b9150509250929050565b60008060408385031215613aa857600080fd5b6000613ab68582860161380e565b9250506020613ac785828601613915565b9150509250929050565b60008060208385031215613ae457600080fd5b600083013567ffffffffffffffff811115613afe57600080fd5b613b0a85828601613823565b92509250509250929050565b600060208284031215613b2857600080fd5b6000613b368482850161386d565b91505092915050565b600060208284031215613b5157600080fd5b6000613b5f84828501613882565b91505092915050565b600060208284031215613b7a57600080fd5b6000613b8884828501613897565b91505092915050565b600060208284031215613ba357600080fd5b6000613bb1848285016138d6565b91505092915050565b600060208284031215613bcc57600080fd5b600082013567ffffffffffffffff811115613be657600080fd5b613bf2848285016138eb565b91505092915050565b600060208284031215613c0d57600080fd5b6000613c1b84828501613915565b91505092915050565b60008060408385031215613c3757600080fd5b6000613c4585828601613915565b9250506020613c5685828601613915565b9150509250929050565b6000613c6c8383613c78565b60208301905092915050565b613c8181614d2e565b82525050565b613c9081614d2e565b82525050565b6000613ca182614ba2565b613cab8185614bd0565b9350613cb683614b7d565b8060005b83811015613ce7578151613cce8882613c60565b9750613cd983614bc3565b925050600181019050613cba565b5085935050505092915050565b613cfd81614d40565b82525050565b6000613d0e82614bad565b613d188185614be1565b9350613d28818560208601614dc3565b613d3181614f5e565b840191505092915050565b6000613d4782614bb8565b613d518185614bfd565b9350613d61818560208601614dc3565b613d6a81614f5e565b840191505092915050565b6000613d8082614bb8565b613d8a8185614c0e565b9350613d9a818560208601614dc3565b80840191505092915050565b60008154613db381614df6565b613dbd8186614c0e565b94506001821660008114613dd85760018114613de957613e1c565b60ff19831686528186019350613e1c565b613df285614b8d565b60005b83811015613e1457815481890152600182019150602081019050613df5565b838801955050505b50505092915050565b6000613e32603283614bfd565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613e98602683614bfd565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613efe601c83614bfd565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613f3e600f83614bfd565b91507f5769746864726177206661696c656400000000000000000000000000000000006000830152602082019050919050565b6000613f7e601c83614bfd565b91507f6d6178204e4654207065722061646472657373206578636565646564000000006000830152602082019050919050565b6000613fbe602483614bfd565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614024601983614bfd565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614064602c83614bfd565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006140ca603883614bfd565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614130602a83614bfd565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614196602983614bfd565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006141fc601683614bfd565b91507f6d6178204e4654206c696d6974206578636565646564000000000000000000006000830152602082019050919050565b600061423c602483614bfd565b91507f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008301527f65646564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142a2601283614bfd565b91507f4e6f6e2d6578697374656e7420746f6b656e00000000000000000000000000006000830152602082019050919050565b60006142e2602083614bfd565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614322602c83614bfd565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614388602083614bfd565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006143c8601683614bfd565b91507f74686520636f6e747261637420697320706175736564000000000000000000006000830152602082019050919050565b6000614408602983614bfd565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061446e602f83614bfd565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006144d4602183614bfd565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061453a600083614bf2565b9150600082019050919050565b6000614554601283614bfd565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000614594603183614bfd565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006145fa601783614bfd565b91507f75736572206973206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b600061463a601b83614bfd565b91507f6e65656420746f206d696e74206174206c656173742031204e465400000000006000830152602082019050919050565b61467681614daa565b82525050565b60006146888286613d75565b91506146948285613d75565b91506146a08284613da6565b9150819050949350505050565b60006146b88261452d565b9150819050919050565b60006020820190506146d76000830184613c87565b92915050565b60006080820190506146f26000830187613c87565b6146ff6020830186613c87565b61470c604083018561466d565b818103606083015261471e8184613d03565b905095945050505050565b600060408201905061473e6000830185613c87565b61474b602083018461466d565b9392505050565b6000602082019050818103600083015261476c8184613c96565b905092915050565b60006020820190506147896000830184613cf4565b92915050565b600060208201905081810360008301526147a98184613d3c565b905092915050565b600060208201905081810360008301526147ca81613e25565b9050919050565b600060208201905081810360008301526147ea81613e8b565b9050919050565b6000602082019050818103600083015261480a81613ef1565b9050919050565b6000602082019050818103600083015261482a81613f31565b9050919050565b6000602082019050818103600083015261484a81613f71565b9050919050565b6000602082019050818103600083015261486a81613fb1565b9050919050565b6000602082019050818103600083015261488a81614017565b9050919050565b600060208201905081810360008301526148aa81614057565b9050919050565b600060208201905081810360008301526148ca816140bd565b9050919050565b600060208201905081810360008301526148ea81614123565b9050919050565b6000602082019050818103600083015261490a81614189565b9050919050565b6000602082019050818103600083015261492a816141ef565b9050919050565b6000602082019050818103600083015261494a8161422f565b9050919050565b6000602082019050818103600083015261496a81614295565b9050919050565b6000602082019050818103600083015261498a816142d5565b9050919050565b600060208201905081810360008301526149aa81614315565b9050919050565b600060208201905081810360008301526149ca8161437b565b9050919050565b600060208201905081810360008301526149ea816143bb565b9050919050565b60006020820190508181036000830152614a0a816143fb565b9050919050565b60006020820190508181036000830152614a2a81614461565b9050919050565b60006020820190508181036000830152614a4a816144c7565b9050919050565b60006020820190508181036000830152614a6a81614547565b9050919050565b60006020820190508181036000830152614a8a81614587565b9050919050565b60006020820190508181036000830152614aaa816145ed565b9050919050565b60006020820190508181036000830152614aca8161462d565b9050919050565b6000602082019050614ae6600083018461466d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b1357614b12614f2f565b5b8060405250919050565b600067ffffffffffffffff821115614b3857614b37614f2f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b6857614b67614f2f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c2482614daa565b9150614c2f83614daa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c6457614c63614ea2565b5b828201905092915050565b6000614c7a82614daa565b9150614c8583614daa565b925082614c9557614c94614ed1565b5b828204905092915050565b6000614cab82614daa565b9150614cb683614daa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cef57614cee614ea2565b5b828202905092915050565b6000614d0582614daa565b9150614d1083614daa565b925082821015614d2357614d22614ea2565b5b828203905092915050565b6000614d3982614d8a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614d8382614d2e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614de1578082015181840152602081019050614dc6565b83811115614df0576000848401525b50505050565b60006002820490506001821680614e0e57607f821691505b60208210811415614e2257614e21614f00565b5b50919050565b6000614e3382614daa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e6657614e65614ea2565b5b600182019050919050565b6000614e7c82614daa565b9150614e8783614daa565b925082614e9757614e96614ed1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614f7881614d2e565b8114614f8357600080fd5b50565b614f8f81614d40565b8114614f9a57600080fd5b50565b614fa681614d4c565b8114614fb157600080fd5b50565b614fbd81614d78565b8114614fc857600080fd5b50565b614fd481614daa565b8114614fdf57600080fd5b5056fea26469706673582212209a3087e0f67af6acf24da00f0ae260b604a44859ad4ccca5a971d3cb6a11077464736f6c63430008000033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000007446f73646c6573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003444f5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d53397a62796b754b56703664384b7648416768543564586b58336552644d547235654147736167695a4d7a6d2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d4e6e7541383655385167727953316d51636b48734e333279424a544133387461556666333179703673745a512f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Dosdles
Arg [1] : _symbol (string): DOS
Arg [2] : _initBaseURI (string): ipfs://QmS9zbykuKVp6d8KvHAghT5dXkX3eRdMTr5eAGsagiZMzm/
Arg [3] : _initNotRevealedUri (string): ipfs://QmNnuA86U8QgryS1mQckHsN32yBJTA38taUff31yp6stZQ/hidden.json
Arg [4] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 446f73646c657300000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 444f530000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d53397a62796b754b56703664384b764841676854356458
Arg [11] : 6b58336552644d547235654147736167695a4d7a6d2f00000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [13] : 697066733a2f2f516d4e6e7541383655385167727953316d51636b48734e3332
Arg [14] : 79424a544133387461556666333179703673745a512f68696464656e2e6a736f
Arg [15] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54821:5678:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51991:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60078:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59147:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22184:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23743:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54933:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58521:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23266:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57549:95;;;;;;;;;;;;;:::i;:::-;;54968:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57652:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55282:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55045:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24493:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59806:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;57152:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59234:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60329:167;;;;;;;;;;;;;:::i;:::-;;24903:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58427:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55162:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58765:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55129:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59671:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21878:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54905:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58651:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21608:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43618:103;;;;;;;;;;;;;:::i;:::-;;42967:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59542:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22353:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55197:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55419:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56152:992;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24036:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58232:69;;;;;;;;;;;;;:::i;:::-;;55383:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25159:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55238:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55084:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51910:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57753:453;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57431:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56012:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55007:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58877:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53372:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59343:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59013:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43876:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51991:33;;;;:::o;60078:207::-;60172:4;60211:26;60196:41;;;:11;:41;;;;:81;;;;60241:36;60265:11;60241:23;:36::i;:::-;60196:81;60189:88;;60078:207;;;:::o;59147:79::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59212:6:::1;59203;;:15;;;;;;;;;;;;;;;;;;59147:79:::0;:::o;22184:100::-;22238:13;22271:5;22264:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22184:100;:::o;23743:221::-;23819:7;23847:16;23855:7;23847;:16::i;:::-;23839:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23932:15;:24;23948:7;23932:24;;;;;;;;;;;;;;;;;;;;;23925:31;;23743:221;;;:::o;54933:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58521:122::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58618:17:::1;58602:13;:33;;;;58521:122:::0;:::o;23266:411::-;23347:13;23363:23;23378:7;23363:14;:23::i;:::-;23347:39;;23411:5;23405:11;;:2;:11;;;;23397:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23505:5;23489:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23514:37;23531:5;23538:12;:10;:12::i;:::-;23514:16;:37::i;:::-;23489:62;23467:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23648:21;23657:2;23661:7;23648:8;:21::i;:::-;23266:411;;;:::o;57549:95::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57616:20:::1;;57609:27;;;;:::i;:::-;57549:95::o:0;54968:32::-;;;;:::o;57652:93::-;57696:7;57723:14;;57716:21;;57652:93;:::o;55282:55::-;;;;;;;;;;;;;;;;;:::o;55045:32::-;;;;:::o;24493:339::-;24688:41;24707:12;:10;:12::i;:::-;24721:7;24688:18;:41::i;:::-;24680:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24796:28;24806:4;24812:2;24816:7;24796:9;:28::i;:::-;24493:339;;;:::o;59806:264::-;59895:16;59913:21;59955:16;59963:7;59955;:16::i;:::-;59947:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;60013:14;;;;;;;;;;;60058:3;60041:14;;60029:9;:26;;;;:::i;:::-;:32;;;;:::i;:::-;60005:57;;;;59806:264;;;;;:::o;57152:271::-;57211:4;57233:6;57242:1;57233:10;;57228:165;57249:20;:27;;;;57245:1;:31;57228:165;;;57329:5;57302:32;;:20;57323:1;57302:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;57298:84;;;57362:4;57355:11;;;;;57298:84;57278:3;;;;;:::i;:::-;;;;57228:165;;;;57410:5;57403:12;;57152:271;;;;:::o;59234:101::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59321:6:::1;59303:15;;:24;;;;;;;;;;;;;;;;;;59234:101:::0;:::o;60329:167::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60378:12:::1;60395:7;:5;:7::i;:::-;:12;;60416:21;60395:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60377:65;;;60461:7;60453:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;43258:1;60329:167::o:0;24903:185::-;25041:39;25058:4;25064:2;25068:7;25041:39;;;;;;;;;;;;:16;:39::i;:::-;24903:185;;;:::o;58427:86::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58497:8:::1;58490:4;:15;;;;58427:86:::0;:::o;55162:28::-;;;;;;;;;;;;;:::o;58765:104::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58850:11:::1;58840:7;:21;;;;;;;;;;;;:::i;:::-;;58765:104:::0;:::o;55129:26::-;;;;;;;;;;;;;:::o;59671:127::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59773:17:::1;59756:14;:34;;;;59671:127:::0;:::o;21878:239::-;21950:7;21970:13;21986:7;:16;21994:7;21986:16;;;;;;;;;;;;;;;;;;;;;21970:32;;22038:1;22021:19;;:5;:19;;;;22013:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22104:5;22097:12;;;21878:239;;;:::o;54905:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58651:106::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58736:13:::1;58724:9;:25;;;;58651:106:::0;:::o;21608:208::-;21680:7;21725:1;21708:19;;:5;:19;;;;21700:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21792:9;:16;21802:5;21792:16;;;;;;;;;;;;;;;;21785:23;;21608:208;;;:::o;43618:103::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43683:30:::1;43710:1;43683:18;:30::i;:::-;43618:103::o:0;42967:87::-;43013:7;43040:6;;;;;;;;;;;43033:13;;42967:87;:::o;59542:121::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59640:15:::1;59623:14;;:32;;;;;;;;;;;;;;;;;;59542:121:::0;:::o;22353:104::-;22409:13;22442:7;22435:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22353:104;:::o;55197:34::-;;;;;;;;;;;;;:::o;55419:29::-;;;;:::o;56152:992::-;56222:6;;;;;;;;;;;56221:7;56213:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;56266:14;56283:13;:11;:13::i;:::-;56266:30;;56329:1;56315:11;:15;56307:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56396:13;;56381:11;:28;;56373:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56493:9;;56478:11;56469:6;:20;;;;:::i;:::-;:33;;56461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56560:7;:5;:7::i;:::-;56546:21;;:10;:21;;;56542:445;;56607:4;56588:23;;:15;;;;;;;;;;;:23;;;56584:315;;;56640:25;56654:10;56640:13;:25::i;:::-;56632:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56712:24;56739:20;:32;56760:10;56739:32;;;;;;;;;;;;;;;;56712:59;;56832:18;;56817:11;56798:16;:30;;;;:::i;:::-;:52;;56790:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;56584:315;;56941:11;56934:4;;:18;;;;:::i;:::-;56921:9;:31;;56913:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56542:445;57004:9;57016:1;57004:13;;56999:138;57024:11;57019:1;:16;56999:138;;57057:20;:32;57078:10;57057:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;57106:19;57114:10;57106:7;:19::i;:::-;57037:3;;;;;:::i;:::-;;;;56999:138;;;;56152:992;;:::o;24036:155::-;24131:52;24150:12;:10;:12::i;:::-;24164:8;24174;24131:18;:52::i;:::-;24036:155;;:::o;58232:69::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58289:4:::1;58278:8;;:15;;;;;;;;;;;;;;;;;;58232:69::o:0;55383:29::-;;;;;;;;;;;;;:::o;25159:328::-;25334:41;25353:12;:10;:12::i;:::-;25367:7;25334:18;:41::i;:::-;25326:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25440:39;25454:4;25460:2;25464:7;25473:5;25440:13;:39::i;:::-;25159:328;;;;:::o;55238:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55084:38::-;;;;:::o;51910:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57753:453::-;57826:13;57860:16;57868:7;57860;:16::i;:::-;57852:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57957:5;57945:17;;:8;;;;;;;;;;;:17;;;57941:71;;;57986:14;57979:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57941:71;58024:28;58055:10;:8;:10::i;:::-;58024:41;;58114:1;58089:14;58083:28;:32;:115;;;;;;;;;;;;;;;;;58142:14;58158:18;:7;:16;:18::i;:::-;58178:13;58125:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58083:115;58076:122;;;57753:453;;;;:::o;57431:110::-;57476:18;57513:20;57506:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57431:110;:::o;58309:::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58405:6:::1;58384:18;:27;;;;58309:110:::0;:::o;56012:97::-;56066:13;56092:9;;;;;;;;;;;;;;56012:97;:::o;55007:31::-;;;;:::o;58877:128::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58980:17:::1;58964:13;:33;;;;;;;;;;;;:::i;:::-;;58877:128:::0;:::o;53372:403::-;53461:4;53540:27;53584:20;;;;;;;;;;;53540:65;;53661:8;53620:49;;53628:13;:21;;;53650:5;53628:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53620:49;;;53616:93;;;53693:4;53686:11;;;;;53616:93;53728:39;53751:5;53758:8;53728:22;:39::i;:::-;53721:46;;;53372:403;;;;;:::o;59343:154::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59429:20:::1;;59422:27;;;;:::i;:::-;59483:6;;59460:20;:29;;;;;;;:::i;:::-;;59343:154:::0;;:::o;59013:126::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59116:15:::1;59099:14;:32;;;;;;;;;;;;:::i;:::-;;59013:126:::0;:::o;43876:201::-;43198:12;:10;:12::i;:::-;43187:23;;:7;:5;:7::i;:::-;:23;;;43179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43985:1:::1;43965:22;;:8;:22;;;;43957:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44041:28;44060:8;44041:18;:28::i;:::-;43876:201:::0;:::o;21239:305::-;21341:4;21393:25;21378:40;;;:11;:40;;;;:105;;;;21450:33;21435:48;;;:11;:48;;;;21378:105;:158;;;;21500:36;21524:11;21500:23;:36::i;:::-;21378:158;21358:178;;21239:305;;;:::o;16484:98::-;16537:7;16564:10;16557:17;;16484:98;:::o;26997:127::-;27062:4;27114:1;27086:30;;:7;:16;27094:7;27086:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27079:37;;26997:127;;;:::o;30979:174::-;31081:2;31054:15;:24;31070:7;31054:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31137:7;31133:2;31099:46;;31108:23;31123:7;31108:14;:23::i;:::-;31099:46;;;;;;;;;;;;30979:174;;:::o;27291:348::-;27384:4;27409:16;27417:7;27409;:16::i;:::-;27401:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27485:13;27501:23;27516:7;27501:14;:23::i;:::-;27485:39;;27554:5;27543:16;;:7;:16;;;:51;;;;27587:7;27563:31;;:20;27575:7;27563:11;:20::i;:::-;:31;;;27543:51;:87;;;;27598:32;27615:5;27622:7;27598:16;:32::i;:::-;27543:87;27535:96;;;27291:348;;;;:::o;30283:578::-;30442:4;30415:31;;:23;30430:7;30415:14;:23::i;:::-;:31;;;30407:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30525:1;30511:16;;:2;:16;;;;30503:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30581:39;30602:4;30608:2;30612:7;30581:20;:39::i;:::-;30685:29;30702:1;30706:7;30685:8;:29::i;:::-;30746:1;30727:9;:15;30737:4;30727:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30775:1;30758:9;:13;30768:2;30758:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30806:2;30787:7;:16;30795:7;30787:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30845:7;30841:2;30826:27;;30835:4;30826:27;;;;;;;;;;;;30283:578;;;:::o;44237:191::-;44311:16;44330:6;;;;;;;;;;;44311:25;;44356:8;44347:6;;:17;;;;;;;;;;;;;;;;;;44411:8;44380:40;;44401:8;44380:40;;;;;;;;;;;;44237:191;;:::o;52383:171::-;52441:18;52462:17;:15;:17::i;:::-;52441:38;;52490:26;52500:3;52505:10;52490:9;:26::i;:::-;52527:19;:17;:19::i;:::-;52383:171;;:::o;31295:315::-;31450:8;31441:17;;:5;:17;;;;31433:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31537:8;31499:18;:25;31518:5;31499:25;;;;;;;;;;;;;;;:35;31525:8;31499:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31583:8;31561:41;;31576:5;31561:41;;;31593:8;31561:41;;;;;;:::i;:::-;;;;;;;;31295:315;;;:::o;26369:::-;26526:28;26536:4;26542:2;26546:7;26526:9;:28::i;:::-;26573:48;26596:4;26602:2;26606:7;26615:5;26573:22;:48::i;:::-;26565:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:315;;;;:::o;55896:108::-;55956:13;55989:7;55982:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55896:108;:::o;17063:723::-;17119:13;17349:1;17340:5;:10;17336:53;;;17367:10;;;;;;;;;;;;;;;;;;;;;17336:53;17399:12;17414:5;17399:20;;17430:14;17455:78;17470:1;17462:4;:9;17455:78;;17488:8;;;;;:::i;:::-;;;;17519:2;17511:10;;;;;:::i;:::-;;;17455:78;;;17543:19;17575:6;17565:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17543:39;;17593:154;17609:1;17600:5;:10;17593:154;;17637:1;17627:11;;;;;:::i;:::-;;;17704:2;17696:5;:10;;;;:::i;:::-;17683:2;:24;;;;:::i;:::-;17670:39;;17653:6;17660;17653:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17733:2;17724:11;;;;;:::i;:::-;;;17593:154;;;17771:6;17757:21;;;;;17063:723;;;;:::o;24262:164::-;24359:4;24383:18;:25;24402:5;24383:25;;;;;;;;;;;;;;;:35;24409:8;24383:35;;;;;;;;;;;;;;;;;;;;;;;;;24376:42;;24262:164;;;;:::o;19685:157::-;19770:4;19809:25;19794:40;;;:11;:40;;;;19787:47;;19685:157;;;:::o;33546:126::-;;;;:::o;52702:105::-;52751:7;52778:21;52797:1;52778:14;;:18;;:21;;;;:::i;:::-;52771:28;;52702:105;:::o;27981:110::-;28057:26;28067:2;28071:7;28057:26;;;;;;;;;;;;:9;:26::i;:::-;27981:110;;:::o;52886:72::-;52934:14;;:16;;;;;;;;;:::i;:::-;;;;;;52886:72::o;32175:799::-;32330:4;32351:15;:2;:13;;;:15::i;:::-;32347:620;;;32403:2;32387:36;;;32424:12;:10;:12::i;:::-;32438:4;32444:7;32453:5;32387:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32383:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32646:1;32629:6;:13;:18;32625:272;;;32672:60;;;;;;;;;;:::i;:::-;;;;;;;;32625:272;32847:6;32841:13;32832:6;32828:2;32824:15;32817:38;32383:529;32520:41;;;32510:51;;;:6;:51;;;;32503:58;;;;;32347:620;32951:4;32944:11;;32175:799;;;;;;;:::o;47297:98::-;47355:7;47386:1;47382;:5;;;;:::i;:::-;47375:12;;47297:98;;;;:::o;28318:321::-;28448:18;28454:2;28458:7;28448:5;:18::i;:::-;28499:54;28530:1;28534:2;28538:7;28547:5;28499:22;:54::i;:::-;28477:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28318:321;;;:::o;8474:387::-;8534:4;8742:12;8809:7;8797:20;8789:28;;8852:1;8845:4;:8;8838:15;;;8474:387;;;:::o;28975:382::-;29069:1;29055:16;;:2;:16;;;;29047:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29128:16;29136:7;29128;:16::i;:::-;29127:17;29119:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29190:45;29219:1;29223:2;29227:7;29190:20;:45::i;:::-;29265:1;29248:9;:13;29258:2;29248:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29296:2;29277:7;:16;29285:7;29277:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29341:7;29337:2;29316:33;;29333:1;29316:33;;;;;;;;;;;;28975:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:137::-;;1462:6;1449:20;1440:29;;1478:32;1504:5;1478:32;:::i;:::-;1430:86;;;;:::o;1522:141::-;;1609:6;1603:13;1594:22;;1625:32;1651:5;1625:32;:::i;:::-;1584:79;;;;:::o;1682:271::-;;1786:3;1779:4;1771:6;1767:17;1763:27;1753:2;;1804:1;1801;1794:12;1753:2;1844:6;1831:20;1869:78;1943:3;1935:6;1928:4;1920:6;1916:17;1869:78;:::i;:::-;1860:87;;1743:210;;;;;:::o;1959:201::-;;2076:6;2070:13;2061:22;;2092:62;2148:5;2092:62;:::i;:::-;2051:109;;;;:::o;2180:273::-;;2285:3;2278:4;2270:6;2266:17;2262:27;2252:2;;2303:1;2300;2293:12;2252:2;2343:6;2330:20;2368:79;2443:3;2435:6;2428:4;2420:6;2416:17;2368:79;:::i;:::-;2359:88;;2242:211;;;;;:::o;2459:139::-;;2543:6;2530:20;2521:29;;2559:33;2586:5;2559:33;:::i;:::-;2511:87;;;;:::o;2604:262::-;;2712:2;2700:9;2691:7;2687:23;2683:32;2680:2;;;2728:1;2725;2718:12;2680:2;2771:1;2796:53;2841:7;2832:6;2821:9;2817:22;2796:53;:::i;:::-;2786:63;;2742:117;2670:196;;;;:::o;2872:407::-;;;2997:2;2985:9;2976:7;2972:23;2968:32;2965:2;;;3013:1;3010;3003:12;2965:2;3056:1;3081:53;3126:7;3117:6;3106:9;3102:22;3081:53;:::i;:::-;3071:63;;3027:117;3183:2;3209:53;3254:7;3245:6;3234:9;3230:22;3209:53;:::i;:::-;3199:63;;3154:118;2955:324;;;;;:::o;3285:552::-;;;;3427:2;3415:9;3406:7;3402:23;3398:32;3395:2;;;3443:1;3440;3433:12;3395:2;3486:1;3511:53;3556:7;3547:6;3536:9;3532:22;3511:53;:::i;:::-;3501:63;;3457:117;3613:2;3639:53;3684:7;3675:6;3664:9;3660:22;3639:53;:::i;:::-;3629:63;;3584:118;3741:2;3767:53;3812:7;3803:6;3792:9;3788:22;3767:53;:::i;:::-;3757:63;;3712:118;3385:452;;;;;:::o;3843:809::-;;;;;4011:3;3999:9;3990:7;3986:23;3982:33;3979:2;;;4028:1;4025;4018:12;3979:2;4071:1;4096:53;4141:7;4132:6;4121:9;4117:22;4096:53;:::i;:::-;4086:63;;4042:117;4198:2;4224:53;4269:7;4260:6;4249:9;4245:22;4224:53;:::i;:::-;4214:63;;4169:118;4326:2;4352:53;4397:7;4388:6;4377:9;4373:22;4352:53;:::i;:::-;4342:63;;4297:118;4482:2;4471:9;4467:18;4454:32;4513:18;4505:6;4502:30;4499:2;;;4545:1;4542;4535:12;4499:2;4573:62;4627:7;4618:6;4607:9;4603:22;4573:62;:::i;:::-;4563:72;;4425:220;3969:683;;;;;;;:::o;4658:401::-;;;4780:2;4768:9;4759:7;4755:23;4751:32;4748:2;;;4796:1;4793;4786:12;4748:2;4839:1;4864:53;4909:7;4900:6;4889:9;4885:22;4864:53;:::i;:::-;4854:63;;4810:117;4966:2;4992:50;5034:7;5025:6;5014:9;5010:22;4992:50;:::i;:::-;4982:60;;4937:115;4738:321;;;;;:::o;5065:407::-;;;5190:2;5178:9;5169:7;5165:23;5161:32;5158:2;;;5206:1;5203;5196:12;5158:2;5249:1;5274:53;5319:7;5310:6;5299:9;5295:22;5274:53;:::i;:::-;5264:63;;5220:117;5376:2;5402:53;5447:7;5438:6;5427:9;5423:22;5402:53;:::i;:::-;5392:63;;5347:118;5148:324;;;;;:::o;5478:425::-;;;5621:2;5609:9;5600:7;5596:23;5592:32;5589:2;;;5637:1;5634;5627:12;5589:2;5708:1;5697:9;5693:17;5680:31;5738:18;5730:6;5727:30;5724:2;;;5770:1;5767;5760:12;5724:2;5806:80;5878:7;5869:6;5858:9;5854:22;5806:80;:::i;:::-;5788:98;;;;5651:245;5579:324;;;;;:::o;5909:256::-;;6014:2;6002:9;5993:7;5989:23;5985:32;5982:2;;;6030:1;6027;6020:12;5982:2;6073:1;6098:50;6140:7;6131:6;6120:9;6116:22;6098:50;:::i;:::-;6088:60;;6044:114;5972:193;;;;:::o;6171:260::-;;6278:2;6266:9;6257:7;6253:23;6249:32;6246:2;;;6294:1;6291;6284:12;6246:2;6337:1;6362:52;6406:7;6397:6;6386:9;6382:22;6362:52;:::i;:::-;6352:62;;6308:116;6236:195;;;;:::o;6437:282::-;;6555:2;6543:9;6534:7;6530:23;6526:32;6523:2;;;6571:1;6568;6561:12;6523:2;6614:1;6639:63;6694:7;6685:6;6674:9;6670:22;6639:63;:::i;:::-;6629:73;;6585:127;6513:206;;;;:::o;6725:342::-;;6873:2;6861:9;6852:7;6848:23;6844:32;6841:2;;;6889:1;6886;6879:12;6841:2;6932:1;6957:93;7042:7;7033:6;7022:9;7018:22;6957:93;:::i;:::-;6947:103;;6903:157;6831:236;;;;:::o;7073:375::-;;7191:2;7179:9;7170:7;7166:23;7162:32;7159:2;;;7207:1;7204;7197:12;7159:2;7278:1;7267:9;7263:17;7250:31;7308:18;7300:6;7297:30;7294:2;;;7340:1;7337;7330:12;7294:2;7368:63;7423:7;7414:6;7403:9;7399:22;7368:63;:::i;:::-;7358:73;;7221:220;7149:299;;;;:::o;7454:262::-;;7562:2;7550:9;7541:7;7537:23;7533:32;7530:2;;;7578:1;7575;7568:12;7530:2;7621:1;7646:53;7691:7;7682:6;7671:9;7667:22;7646:53;:::i;:::-;7636:63;;7592:117;7520:196;;;;:::o;7722:407::-;;;7847:2;7835:9;7826:7;7822:23;7818:32;7815:2;;;7863:1;7860;7853:12;7815:2;7906:1;7931:53;7976:7;7967:6;7956:9;7952:22;7931:53;:::i;:::-;7921:63;;7877:117;8033:2;8059:53;8104:7;8095:6;8084:9;8080:22;8059:53;:::i;:::-;8049:63;;8004:118;7805:324;;;;;:::o;8135:179::-;;8225:46;8267:3;8259:6;8225:46;:::i;:::-;8303:4;8298:3;8294:14;8280:28;;8215:99;;;;:::o;8320:108::-;8397:24;8415:5;8397:24;:::i;:::-;8392:3;8385:37;8375:53;;:::o;8434:118::-;8521:24;8539:5;8521:24;:::i;:::-;8516:3;8509:37;8499:53;;:::o;8588:732::-;;8736:54;8784:5;8736:54;:::i;:::-;8806:86;8885:6;8880:3;8806:86;:::i;:::-;8799:93;;8916:56;8966:5;8916:56;:::i;:::-;8995:7;9026:1;9011:284;9036:6;9033:1;9030:13;9011:284;;;9112:6;9106:13;9139:63;9198:3;9183:13;9139:63;:::i;:::-;9132:70;;9225:60;9278:6;9225:60;:::i;:::-;9215:70;;9071:224;9058:1;9055;9051:9;9046:14;;9011:284;;;9015:14;9311:3;9304:10;;8712:608;;;;;;;:::o;9326:109::-;9407:21;9422:5;9407:21;:::i;:::-;9402:3;9395:34;9385:50;;:::o;9441:360::-;;9555:38;9587:5;9555:38;:::i;:::-;9609:70;9672:6;9667:3;9609:70;:::i;:::-;9602:77;;9688:52;9733:6;9728:3;9721:4;9714:5;9710:16;9688:52;:::i;:::-;9765:29;9787:6;9765:29;:::i;:::-;9760:3;9756:39;9749:46;;9531:270;;;;;:::o;9807:364::-;;9923:39;9956:5;9923:39;:::i;:::-;9978:71;10042:6;10037:3;9978:71;:::i;:::-;9971:78;;10058:52;10103:6;10098:3;10091:4;10084:5;10080:16;10058:52;:::i;:::-;10135:29;10157:6;10135:29;:::i;:::-;10130:3;10126:39;10119:46;;9899:272;;;;;:::o;10177:377::-;;10311:39;10344:5;10311:39;:::i;:::-;10366:89;10448:6;10443:3;10366:89;:::i;:::-;10359:96;;10464:52;10509:6;10504:3;10497:4;10490:5;10486:16;10464:52;:::i;:::-;10541:6;10536:3;10532:16;10525:23;;10287:267;;;;;:::o;10584:845::-;;10724:5;10718:12;10753:36;10779:9;10753:36;:::i;:::-;10805:89;10887:6;10882:3;10805:89;:::i;:::-;10798:96;;10925:1;10914:9;10910:17;10941:1;10936:137;;;;11087:1;11082:341;;;;10903:520;;10936:137;11020:4;11016:9;11005;11001:25;10996:3;10989:38;11056:6;11051:3;11047:16;11040:23;;10936:137;;11082:341;11149:38;11181:5;11149:38;:::i;:::-;11209:1;11223:154;11237:6;11234:1;11231:13;11223:154;;;11311:7;11305:14;11301:1;11296:3;11292:11;11285:35;11361:1;11352:7;11348:15;11337:26;;11259:4;11256:1;11252:12;11247:17;;11223:154;;;11406:6;11401:3;11397:16;11390:23;;11089:334;;10903:520;;10691:738;;;;;;:::o;11435:382::-;;11598:67;11662:2;11657:3;11598:67;:::i;:::-;11591:74;;11695:34;11691:1;11686:3;11682:11;11675:55;11761:20;11756:2;11751:3;11747:12;11740:42;11808:2;11803:3;11799:12;11792:19;;11581:236;;;:::o;11823:370::-;;11986:67;12050:2;12045:3;11986:67;:::i;:::-;11979:74;;12083:34;12079:1;12074:3;12070:11;12063:55;12149:8;12144:2;12139:3;12135:12;12128:30;12184:2;12179:3;12175:12;12168:19;;11969:224;;;:::o;12199:326::-;;12362:67;12426:2;12421:3;12362:67;:::i;:::-;12355:74;;12459:30;12455:1;12450:3;12446:11;12439:51;12516:2;12511:3;12507:12;12500:19;;12345:180;;;:::o;12531:313::-;;12694:67;12758:2;12753:3;12694:67;:::i;:::-;12687:74;;12791:17;12787:1;12782:3;12778:11;12771:38;12835:2;12830:3;12826:12;12819:19;;12677:167;;;:::o;12850:326::-;;13013:67;13077:2;13072:3;13013:67;:::i;:::-;13006:74;;13110:30;13106:1;13101:3;13097:11;13090:51;13167:2;13162:3;13158:12;13151:19;;12996:180;;;:::o;13182:368::-;;13345:67;13409:2;13404:3;13345:67;:::i;:::-;13338:74;;13442:34;13438:1;13433:3;13429:11;13422:55;13508:6;13503:2;13498:3;13494:12;13487:28;13541:2;13536:3;13532:12;13525:19;;13328:222;;;:::o;13556:323::-;;13719:67;13783:2;13778:3;13719:67;:::i;:::-;13712:74;;13816:27;13812:1;13807:3;13803:11;13796:48;13870:2;13865:3;13861:12;13854:19;;13702:177;;;:::o;13885:376::-;;14048:67;14112:2;14107:3;14048:67;:::i;:::-;14041:74;;14145:34;14141:1;14136:3;14132:11;14125:55;14211:14;14206:2;14201:3;14197:12;14190:36;14252:2;14247:3;14243:12;14236:19;;14031:230;;;:::o;14267:388::-;;14430:67;14494:2;14489:3;14430:67;:::i;:::-;14423:74;;14527:34;14523:1;14518:3;14514:11;14507:55;14593:26;14588:2;14583:3;14579:12;14572:48;14646:2;14641:3;14637:12;14630:19;;14413:242;;;:::o;14661:374::-;;14824:67;14888:2;14883:3;14824:67;:::i;:::-;14817:74;;14921:34;14917:1;14912:3;14908:11;14901:55;14987:12;14982:2;14977:3;14973:12;14966:34;15026:2;15021:3;15017:12;15010:19;;14807:228;;;:::o;15041:373::-;;15204:67;15268:2;15263:3;15204:67;:::i;:::-;15197:74;;15301:34;15297:1;15292:3;15288:11;15281:55;15367:11;15362:2;15357:3;15353:12;15346:33;15405:2;15400:3;15396:12;15389:19;;15187:227;;;:::o;15420:320::-;;15583:67;15647:2;15642:3;15583:67;:::i;:::-;15576:74;;15680:24;15676:1;15671:3;15667:11;15660:45;15731:2;15726:3;15722:12;15715:19;;15566:174;;;:::o;15746:368::-;;15909:67;15973:2;15968:3;15909:67;:::i;:::-;15902:74;;16006:34;16002:1;15997:3;15993:11;15986:55;16072:6;16067:2;16062:3;16058:12;16051:28;16105:2;16100:3;16096:12;16089:19;;15892:222;;;:::o;16120:316::-;;16283:67;16347:2;16342:3;16283:67;:::i;:::-;16276:74;;16380:20;16376:1;16371:3;16367:11;16360:41;16427:2;16422:3;16418:12;16411:19;;16266:170;;;:::o;16442:330::-;;16605:67;16669:2;16664:3;16605:67;:::i;:::-;16598:74;;16702:34;16698:1;16693:3;16689:11;16682:55;16763:2;16758:3;16754:12;16747:19;;16588:184;;;:::o;16778:376::-;;16941:67;17005:2;17000:3;16941:67;:::i;:::-;16934:74;;17038:34;17034:1;17029:3;17025:11;17018:55;17104:14;17099:2;17094:3;17090:12;17083:36;17145:2;17140:3;17136:12;17129:19;;16924:230;;;:::o;17160:330::-;;17323:67;17387:2;17382:3;17323:67;:::i;:::-;17316:74;;17420:34;17416:1;17411:3;17407:11;17400:55;17481:2;17476:3;17472:12;17465:19;;17306:184;;;:::o;17496:320::-;;17659:67;17723:2;17718:3;17659:67;:::i;:::-;17652:74;;17756:24;17752:1;17747:3;17743:11;17736:45;17807:2;17802:3;17798:12;17791:19;;17642:174;;;:::o;17822:373::-;;17985:67;18049:2;18044:3;17985:67;:::i;:::-;17978:74;;18082:34;18078:1;18073:3;18069:11;18062:55;18148:11;18143:2;18138:3;18134:12;18127:33;18186:2;18181:3;18177:12;18170:19;;17968:227;;;:::o;18201:379::-;;18364:67;18428:2;18423:3;18364:67;:::i;:::-;18357:74;;18461:34;18457:1;18452:3;18448:11;18441:55;18527:17;18522:2;18517:3;18513:12;18506:39;18571:2;18566:3;18562:12;18555:19;;18347:233;;;:::o;18586:365::-;;18749:67;18813:2;18808:3;18749:67;:::i;:::-;18742:74;;18846:34;18842:1;18837:3;18833:11;18826:55;18912:3;18907:2;18902:3;18898:12;18891:25;18942:2;18937:3;18933:12;18926:19;;18732:219;;;:::o;18957:297::-;;19137:83;19218:1;19213:3;19137:83;:::i;:::-;19130:90;;19246:1;19241:3;19237:11;19230:18;;19120:134;;;:::o;19260:316::-;;19423:67;19487:2;19482:3;19423:67;:::i;:::-;19416:74;;19520:20;19516:1;19511:3;19507:11;19500:41;19567:2;19562:3;19558:12;19551:19;;19406:170;;;:::o;19582:381::-;;19745:67;19809:2;19804:3;19745:67;:::i;:::-;19738:74;;19842:34;19838:1;19833:3;19829:11;19822:55;19908:19;19903:2;19898:3;19894:12;19887:41;19954:2;19949:3;19945:12;19938:19;;19728:235;;;:::o;19969:321::-;;20132:67;20196:2;20191:3;20132:67;:::i;:::-;20125:74;;20229:25;20225:1;20220:3;20216:11;20209:46;20281:2;20276:3;20272:12;20265:19;;20115:175;;;:::o;20296:325::-;;20459:67;20523:2;20518:3;20459:67;:::i;:::-;20452:74;;20556:29;20552:1;20547:3;20543:11;20536:50;20612:2;20607:3;20603:12;20596:19;;20442:179;;;:::o;20627:118::-;20714:24;20732:5;20714:24;:::i;:::-;20709:3;20702:37;20692:53;;:::o;20751:589::-;;20998:95;21089:3;21080:6;20998:95;:::i;:::-;20991:102;;21110:95;21201:3;21192:6;21110:95;:::i;:::-;21103:102;;21222:92;21310:3;21301:6;21222:92;:::i;:::-;21215:99;;21331:3;21324:10;;20980:360;;;;;;:::o;21346:379::-;;21552:147;21695:3;21552:147;:::i;:::-;21545:154;;21716:3;21709:10;;21534:191;;;:::o;21731:222::-;;21862:2;21851:9;21847:18;21839:26;;21875:71;21943:1;21932:9;21928:17;21919:6;21875:71;:::i;:::-;21829:124;;;;:::o;21959:640::-;;22192:3;22181:9;22177:19;22169:27;;22206:71;22274:1;22263:9;22259:17;22250:6;22206:71;:::i;:::-;22287:72;22355:2;22344:9;22340:18;22331:6;22287:72;:::i;:::-;22369;22437:2;22426:9;22422:18;22413:6;22369:72;:::i;:::-;22488:9;22482:4;22478:20;22473:2;22462:9;22458:18;22451:48;22516:76;22587:4;22578:6;22516:76;:::i;:::-;22508:84;;22159:440;;;;;;;:::o;22605:332::-;;22764:2;22753:9;22749:18;22741:26;;22777:71;22845:1;22834:9;22830:17;22821:6;22777:71;:::i;:::-;22858:72;22926:2;22915:9;22911:18;22902:6;22858:72;:::i;:::-;22731:206;;;;;:::o;22943:373::-;;23124:2;23113:9;23109:18;23101:26;;23173:9;23167:4;23163:20;23159:1;23148:9;23144:17;23137:47;23201:108;23304:4;23295:6;23201:108;:::i;:::-;23193:116;;23091:225;;;;:::o;23322:210::-;;23447:2;23436:9;23432:18;23424:26;;23460:65;23522:1;23511:9;23507:17;23498:6;23460:65;:::i;:::-;23414:118;;;;:::o;23538:313::-;;23689:2;23678:9;23674:18;23666:26;;23738:9;23732:4;23728:20;23724:1;23713:9;23709:17;23702:47;23766:78;23839:4;23830:6;23766:78;:::i;:::-;23758:86;;23656:195;;;;:::o;23857:419::-;;24061:2;24050:9;24046:18;24038:26;;24110:9;24104:4;24100:20;24096:1;24085:9;24081:17;24074:47;24138:131;24264:4;24138:131;:::i;:::-;24130:139;;24028:248;;;:::o;24282:419::-;;24486:2;24475:9;24471:18;24463:26;;24535:9;24529:4;24525:20;24521:1;24510:9;24506:17;24499:47;24563:131;24689:4;24563:131;:::i;:::-;24555:139;;24453:248;;;:::o;24707:419::-;;24911:2;24900:9;24896:18;24888:26;;24960:9;24954:4;24950:20;24946:1;24935:9;24931:17;24924:47;24988:131;25114:4;24988:131;:::i;:::-;24980:139;;24878:248;;;:::o;25132:419::-;;25336:2;25325:9;25321:18;25313:26;;25385:9;25379:4;25375:20;25371:1;25360:9;25356:17;25349:47;25413:131;25539:4;25413:131;:::i;:::-;25405:139;;25303:248;;;:::o;25557:419::-;;25761:2;25750:9;25746:18;25738:26;;25810:9;25804:4;25800:20;25796:1;25785:9;25781:17;25774:47;25838:131;25964:4;25838:131;:::i;:::-;25830:139;;25728:248;;;:::o;25982:419::-;;26186:2;26175:9;26171:18;26163:26;;26235:9;26229:4;26225:20;26221:1;26210:9;26206:17;26199:47;26263:131;26389:4;26263:131;:::i;:::-;26255:139;;26153:248;;;:::o;26407:419::-;;26611:2;26600:9;26596:18;26588:26;;26660:9;26654:4;26650:20;26646:1;26635:9;26631:17;26624:47;26688:131;26814:4;26688:131;:::i;:::-;26680:139;;26578:248;;;:::o;26832:419::-;;27036:2;27025:9;27021:18;27013:26;;27085:9;27079:4;27075:20;27071:1;27060:9;27056:17;27049:47;27113:131;27239:4;27113:131;:::i;:::-;27105:139;;27003:248;;;:::o;27257:419::-;;27461:2;27450:9;27446:18;27438:26;;27510:9;27504:4;27500:20;27496:1;27485:9;27481:17;27474:47;27538:131;27664:4;27538:131;:::i;:::-;27530:139;;27428:248;;;:::o;27682:419::-;;27886:2;27875:9;27871:18;27863:26;;27935:9;27929:4;27925:20;27921:1;27910:9;27906:17;27899:47;27963:131;28089:4;27963:131;:::i;:::-;27955:139;;27853:248;;;:::o;28107:419::-;;28311:2;28300:9;28296:18;28288:26;;28360:9;28354:4;28350:20;28346:1;28335:9;28331:17;28324:47;28388:131;28514:4;28388:131;:::i;:::-;28380:139;;28278:248;;;:::o;28532:419::-;;28736:2;28725:9;28721:18;28713:26;;28785:9;28779:4;28775:20;28771:1;28760:9;28756:17;28749:47;28813:131;28939:4;28813:131;:::i;:::-;28805:139;;28703:248;;;:::o;28957:419::-;;29161:2;29150:9;29146:18;29138:26;;29210:9;29204:4;29200:20;29196:1;29185:9;29181:17;29174:47;29238:131;29364:4;29238:131;:::i;:::-;29230:139;;29128:248;;;:::o;29382:419::-;;29586:2;29575:9;29571:18;29563:26;;29635:9;29629:4;29625:20;29621:1;29610:9;29606:17;29599:47;29663:131;29789:4;29663:131;:::i;:::-;29655:139;;29553:248;;;:::o;29807:419::-;;30011:2;30000:9;29996:18;29988:26;;30060:9;30054:4;30050:20;30046:1;30035:9;30031:17;30024:47;30088:131;30214:4;30088:131;:::i;:::-;30080:139;;29978:248;;;:::o;30232:419::-;;30436:2;30425:9;30421:18;30413:26;;30485:9;30479:4;30475:20;30471:1;30460:9;30456:17;30449:47;30513:131;30639:4;30513:131;:::i;:::-;30505:139;;30403:248;;;:::o;30657:419::-;;30861:2;30850:9;30846:18;30838:26;;30910:9;30904:4;30900:20;30896:1;30885:9;30881:17;30874:47;30938:131;31064:4;30938:131;:::i;:::-;30930:139;;30828:248;;;:::o;31082:419::-;;31286:2;31275:9;31271:18;31263:26;;31335:9;31329:4;31325:20;31321:1;31310:9;31306:17;31299:47;31363:131;31489:4;31363:131;:::i;:::-;31355:139;;31253:248;;;:::o;31507:419::-;;31711:2;31700:9;31696:18;31688:26;;31760:9;31754:4;31750:20;31746:1;31735:9;31731:17;31724:47;31788:131;31914:4;31788:131;:::i;:::-;31780:139;;31678:248;;;:::o;31932:419::-;;32136:2;32125:9;32121:18;32113:26;;32185:9;32179:4;32175:20;32171:1;32160:9;32156:17;32149:47;32213:131;32339:4;32213:131;:::i;:::-;32205:139;;32103:248;;;:::o;32357:419::-;;32561:2;32550:9;32546:18;32538:26;;32610:9;32604:4;32600:20;32596:1;32585:9;32581:17;32574:47;32638:131;32764:4;32638:131;:::i;:::-;32630:139;;32528:248;;;:::o;32782:419::-;;32986:2;32975:9;32971:18;32963:26;;33035:9;33029:4;33025:20;33021:1;33010:9;33006:17;32999:47;33063:131;33189:4;33063:131;:::i;:::-;33055:139;;32953:248;;;:::o;33207:419::-;;33411:2;33400:9;33396:18;33388:26;;33460:9;33454:4;33450:20;33446:1;33435:9;33431:17;33424:47;33488:131;33614:4;33488:131;:::i;:::-;33480:139;;33378:248;;;:::o;33632:419::-;;33836:2;33825:9;33821:18;33813:26;;33885:9;33879:4;33875:20;33871:1;33860:9;33856:17;33849:47;33913:131;34039:4;33913:131;:::i;:::-;33905:139;;33803:248;;;:::o;34057:419::-;;34261:2;34250:9;34246:18;34238:26;;34310:9;34304:4;34300:20;34296:1;34285:9;34281:17;34274:47;34338:131;34464:4;34338:131;:::i;:::-;34330:139;;34228:248;;;:::o;34482:222::-;;34613:2;34602:9;34598:18;34590:26;;34626:71;34694:1;34683:9;34679:17;34670:6;34626:71;:::i;:::-;34580:124;;;;:::o;34710:283::-;;34776:2;34770:9;34760:19;;34818:4;34810:6;34806:17;34925:6;34913:10;34910:22;34889:18;34877:10;34874:34;34871:62;34868:2;;;34936:18;;:::i;:::-;34868:2;34976:10;34972:2;34965:22;34750:243;;;;:::o;34999:331::-;;35150:18;35142:6;35139:30;35136:2;;;35172:18;;:::i;:::-;35136:2;35257:4;35253:9;35246:4;35238:6;35234:17;35230:33;35222:41;;35318:4;35312;35308:15;35300:23;;35065:265;;;:::o;35336:332::-;;35488:18;35480:6;35477:30;35474:2;;;35510:18;;:::i;:::-;35474:2;35595:4;35591:9;35584:4;35576:6;35572:17;35568:33;35560:41;;35656:4;35650;35646:15;35638:23;;35403:265;;;:::o;35674:132::-;;35764:3;35756:11;;35794:4;35789:3;35785:14;35777:22;;35746:60;;;:::o;35812:141::-;;35884:3;35876:11;;35907:3;35904:1;35897:14;35941:4;35938:1;35928:18;35920:26;;35866:87;;;:::o;35959:114::-;;36060:5;36054:12;36044:22;;36033:40;;;:::o;36079:98::-;;36164:5;36158:12;36148:22;;36137:40;;;:::o;36183:99::-;;36269:5;36263:12;36253:22;;36242:40;;;:::o;36288:113::-;;36390:4;36385:3;36381:14;36373:22;;36363:38;;;:::o;36407:184::-;;36540:6;36535:3;36528:19;36580:4;36575:3;36571:14;36556:29;;36518:73;;;;:::o;36597:168::-;;36714:6;36709:3;36702:19;36754:4;36749:3;36745:14;36730:29;;36692:73;;;;:::o;36771:147::-;;36909:3;36894:18;;36884:34;;;;:::o;36924:169::-;;37042:6;37037:3;37030:19;37082:4;37077:3;37073:14;37058:29;;37020:73;;;;:::o;37099:148::-;;37238:3;37223:18;;37213:34;;;;:::o;37253:305::-;;37312:20;37330:1;37312:20;:::i;:::-;37307:25;;37346:20;37364:1;37346:20;:::i;:::-;37341:25;;37500:1;37432:66;37428:74;37425:1;37422:81;37419:2;;;37506:18;;:::i;:::-;37419:2;37550:1;37547;37543:9;37536:16;;37297:261;;;;:::o;37564:185::-;;37621:20;37639:1;37621:20;:::i;:::-;37616:25;;37655:20;37673:1;37655:20;:::i;:::-;37650:25;;37694:1;37684:2;;37699:18;;:::i;:::-;37684:2;37741:1;37738;37734:9;37729:14;;37606:143;;;;:::o;37755:348::-;;37818:20;37836:1;37818:20;:::i;:::-;37813:25;;37852:20;37870:1;37852:20;:::i;:::-;37847:25;;38040:1;37972:66;37968:74;37965:1;37962:81;37957:1;37950:9;37943:17;37939:105;37936:2;;;38047:18;;:::i;:::-;37936:2;38095:1;38092;38088:9;38077:20;;37803:300;;;;:::o;38109:191::-;;38169:20;38187:1;38169:20;:::i;:::-;38164:25;;38203:20;38221:1;38203:20;:::i;:::-;38198:25;;38242:1;38239;38236:8;38233:2;;;38247:18;;:::i;:::-;38233:2;38292:1;38289;38285:9;38277:17;;38154:146;;;;:::o;38306:96::-;;38372:24;38390:5;38372:24;:::i;:::-;38361:35;;38351:51;;;:::o;38408:90::-;;38485:5;38478:13;38471:21;38460:32;;38450:48;;;:::o;38504:149::-;;38580:66;38573:5;38569:78;38558:89;;38548:105;;;:::o;38659:125::-;;38754:24;38772:5;38754:24;:::i;:::-;38743:35;;38733:51;;;:::o;38790:126::-;;38867:42;38860:5;38856:54;38845:65;;38835:81;;;:::o;38922:77::-;;38988:5;38977:16;;38967:32;;;:::o;39005:154::-;39089:6;39084:3;39079;39066:30;39151:1;39142:6;39137:3;39133:16;39126:27;39056:103;;;:::o;39165:307::-;39233:1;39243:113;39257:6;39254:1;39251:13;39243:113;;;39342:1;39337:3;39333:11;39327:18;39323:1;39318:3;39314:11;39307:39;39279:2;39276:1;39272:10;39267:15;;39243:113;;;39374:6;39371:1;39368:13;39365:2;;;39454:1;39445:6;39440:3;39436:16;39429:27;39365:2;39214:258;;;;:::o;39478:320::-;;39559:1;39553:4;39549:12;39539:22;;39606:1;39600:4;39596:12;39627:18;39617:2;;39683:4;39675:6;39671:17;39661:27;;39617:2;39745;39737:6;39734:14;39714:18;39711:38;39708:2;;;39764:18;;:::i;:::-;39708:2;39529:269;;;;:::o;39804:233::-;;39866:24;39884:5;39866:24;:::i;:::-;39857:33;;39912:66;39905:5;39902:77;39899:2;;;39982:18;;:::i;:::-;39899:2;40029:1;40022:5;40018:13;40011:20;;39847:190;;;:::o;40043:176::-;;40092:20;40110:1;40092:20;:::i;:::-;40087:25;;40126:20;40144:1;40126:20;:::i;:::-;40121:25;;40165:1;40155:2;;40170:18;;:::i;:::-;40155:2;40211:1;40208;40204:9;40199:14;;40077:142;;;;:::o;40225:180::-;40273:77;40270:1;40263:88;40370:4;40367:1;40360:15;40394:4;40391:1;40384:15;40411:180;40459:77;40456:1;40449:88;40556:4;40553:1;40546:15;40580:4;40577:1;40570:15;40597:180;40645:77;40642:1;40635:88;40742:4;40739:1;40732:15;40766:4;40763:1;40756:15;40783:180;40831:77;40828:1;40821:88;40928:4;40925:1;40918:15;40952:4;40949:1;40942:15;40969:102;;41061:2;41057:7;41052:2;41045:5;41041:14;41037:28;41027:38;;41017:54;;;:::o;41077:122::-;41150:24;41168:5;41150:24;:::i;:::-;41143:5;41140:35;41130:2;;41189:1;41186;41179:12;41130:2;41120:79;:::o;41205:116::-;41275:21;41290:5;41275:21;:::i;:::-;41268:5;41265:32;41255:2;;41311:1;41308;41301:12;41255:2;41245:76;:::o;41327:120::-;41399:23;41416:5;41399:23;:::i;:::-;41392:5;41389:34;41379:2;;41437:1;41434;41427:12;41379:2;41369:78;:::o;41453:180::-;41555:53;41602:5;41555:53;:::i;:::-;41548:5;41545:64;41535:2;;41623:1;41620;41613:12;41535:2;41525:108;:::o;41639:122::-;41712:24;41730:5;41712:24;:::i;:::-;41705:5;41702:35;41692:2;;41751:1;41748;41741:12;41692:2;41682:79;:::o

Swarm Source

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