ETH Price: $3,368.08 (-2.46%)

Token

Dot Square Project (DSP)
 

Overview

Max Total Supply

1,707 DSP

Holders

85

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 DSP
0x7D2EF90FB76aAdad4A51BF307C107Cb4AA40795f
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:
NFT

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol

/// @title Dot
/// @author Dot

pragma solidity ^0.8.9;

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



pragma solidity ^0.8.9;

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

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

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



pragma solidity ^0.8.9;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.9;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.9;

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

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



pragma solidity ^0.8.9;

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



pragma solidity ^0.8.9;


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



pragma solidity ^0.8.9;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.9;


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


pragma solidity >=0.8.9;
// to enable certain compiler features



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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.9;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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


pragma solidity ^0.8.9;

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

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.9;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

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

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

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

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

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

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

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

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

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

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


contract NFT is ERC721A, Ownable {
    
    using Strings for uint256;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private mintCost_; 

    //max amount of mints a user can have
    uint public maxMint;

    //max amount of mints a user can execute per tx
    uint public maxMintPerTX;
    
    //the amount of reserved mints that have currently been executed by creator and giveaways
    uint private _reservedMints;

    //amount of mints it will be free for
    uint private mintsUntilFree;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;
    
    //current state os sale
    enum State {NoSale, OpenSale}
    State private saleState_;
    
    //declaring initial values for variables
    constructor() ERC721A('Dot Square Project', 'DSP') {
        _currentBaseURI = "ipfs://QmX8v5FEcLYPgjgx86h2hhA9cyzoBJafMNiocsbYh7a2N7/";
        maxTotalTokens = 6000;
        mintCost_ = 0.003 ether;
        maxMint = 50;
        maxMintPerTX = 1;
        mintsUntilFree = 4000;
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }

    //open and close the sale
    function toggleSale() public onlyOwner {
        if (saleState_ == State.NoSale) {
            saleState_ = State.OpenSale;
        }
        else {
            saleState_ = State.NoSale;
        }
    }
    
    //mint a @param number of NFTs in presale
    function mint(uint256 number) public payable {
        require(saleState_ != State.NoSale, "Sale is not open yet!");
        require(totalSupply() + number <= maxTotalTokens, "Not enough NFTs left to mint..");
        require(number <= maxMintPerTX, "Max Mints per TX exceeded!");
        require(mintsPerAddress[msg.sender] + number <= maxMint, "Max mints per address exceeded!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs");
        
        _safeMint(msg.sender, number);
        mintsPerAddress[msg.sender] += number;

    }
    
    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(), ".json")) : "";
            
    }
    
    //reserved NFTs for creator
    function reservedMint(uint number, address recipient) public onlyOwner {
        require(totalSupply() + number <= maxTotalTokens, "Not enough Reserved NFTs left to mint..");

        _safeMint(recipient, number);
        mintsPerAddress[recipient] += number;
        _reservedMints += number; 
        
    }


    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //retrieve all funds recieved from minting
    function withdraw() public onlyOwner {
        uint256 balance = accountBalance();
        require(balance > 0, 'No Funds to withdraw, Balance is 0');

        _withdraw(payable(owner()), balance); 
    }
    
    //send the percentage of funds to a shareholder´s wallet
    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //see current state of sale
    //see the current state of the sale
    function saleState() public view returns(State){
        return saleState_;
    }
    
    //gets the cost of current mint
    function mintCost() public view returns(uint) {
        if (totalSupply() < mintsUntilFree) {
            return 0;
        }
        else {
            return mintCost_;
        }
        
    }

    //change the mint cost
    function changeMintCost(uint256 newMintCost) public onlyOwner {
        mintCost_ = newMintCost;
    }

    //change the max mints
    function changeMaxMint(uint256 newMaxMint) public onlyOwner {
        maxMint = newMaxMint;
    }

    //change the max mints per tx
    function changeMaxMintPerTX(uint256 newMaxMintPerTX) public onlyOwner {
        maxMintPerTX = newMaxMintPerTX;
    }
   
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMint","type":"uint256"}],"name":"changeMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintPerTX","type":"uint256"}],"name":"changeMaxMintPerTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintCost","type":"uint256"}],"name":"changeMintCost","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum NFT.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040518060400160405280601281526020017f446f74205371756172652050726f6a65637400000000000000000000000000008152506040518060400160405280600381526020017f445350000000000000000000000000000000000000000000000000000000000081525081600190805190602001906200009692919062000208565b508060029080519060200190620000af92919062000208565b505050620000d2620000c66200013a60201b60201c565b6200014260201b60201c565b60405180606001604052806036815260200162004c1160369139600990805190602001906200010392919062000208565b50611770600881905550660aa87bee538000600a819055506032600b819055506001600c81905550610fa0600e819055506200031d565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021690620002e7565b90600052602060002090601f0160209004810192826200023a576000855562000286565b82601f106200025557805160ff191683800117855562000286565b8280016001018555821562000286579182015b828111156200028557825182559160200191906001019062000268565b5b50905062000295919062000299565b5090565b5b80821115620002b45760008160009055506001016200029a565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200030057607f821691505b60208210811415620003175762000316620002b8565b5b50919050565b6148e4806200032d6000396000f3fe6080604052600436106101f25760003560e01c8063603f4d521161010d57806395d89b41116100a0578063b88d4fde1161006f578063b88d4fde146106d3578063bdb4b848146106fc578063c87b56dd14610727578063e985e9c514610764578063f2fde38b146107a1576101f9565b806395d89b4114610638578063a0712d6814610663578063a22cb4651461067f578063b0a1c1c4146106a8576101f9565b80637501f741116100dc5780637501f741146105a25780637d8966e4146105cd5780637f1921ef146105e45780638da5cb5b1461060d576101f9565b8063603f4d52146104e65780636352211e1461051157806370a082311461054e578063715018a61461058b576101f9565b806323b872dd116101855780633ccfd60b116101545780633ccfd60b1461043e57806342842e0e146104555780634f6ccce71461047e578063553f241e146104bb576101f9565b806323b872dd146103725780632f745c591461039b5780633023eba6146103d857806339a0c6f914610415576101f9565b806318160ddd116101c157806318160ddd146102cc57806318df6403146102f757806320c63e3b14610320578063214584d514610349576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612ee2565b6107ca565b6040516102329190612f2a565b60405180910390f35b34801561024757600080fd5b50610250610914565b60405161025d9190612fde565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613036565b6109a6565b60405161029a91906130a4565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906130eb565b610a2b565b005b3480156102d857600080fd5b506102e1610b44565b6040516102ee919061313a565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613155565b610b4d565b005b34801561032c57600080fd5b5061034760048036038101906103429190613036565b610c9d565b005b34801561035557600080fd5b50610370600480360381019061036b9190613036565b610d23565b005b34801561037e57600080fd5b5061039960048036038101906103949190613195565b610da9565b005b3480156103a757600080fd5b506103c260048036038101906103bd91906130eb565b610db9565b6040516103cf919061313a565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa91906131e8565b610fab565b60405161040c919061313a565b60405180910390f35b34801561042157600080fd5b5061043c6004803603810190610437919061334a565b610fc3565b005b34801561044a57600080fd5b50610453611059565b005b34801561046157600080fd5b5061047c60048036038101906104779190613195565b611138565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613036565b611158565b6040516104b2919061313a565b60405180910390f35b3480156104c757600080fd5b506104d06111ab565b6040516104dd919061313a565b60405180910390f35b3480156104f257600080fd5b506104fb6111b1565b604051610508919061340a565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613036565b6111c8565b60405161054591906130a4565b60405180910390f35b34801561055a57600080fd5b50610575600480360381019061057091906131e8565b6111de565b604051610582919061313a565b60405180910390f35b34801561059757600080fd5b506105a06112c7565b005b3480156105ae57600080fd5b506105b761134f565b6040516105c4919061313a565b60405180910390f35b3480156105d957600080fd5b506105e2611355565b005b3480156105f057600080fd5b5061060b60048036038101906106069190613036565b61146b565b005b34801561061957600080fd5b506106226114f1565b60405161062f91906130a4565b60405180910390f35b34801561064457600080fd5b5061064d61151b565b60405161065a9190612fde565b60405180910390f35b61067d60048036038101906106789190613036565b6115ad565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613451565b611807565b005b3480156106b457600080fd5b506106bd611988565b6040516106ca919061313a565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190613532565b611a0c565b005b34801561070857600080fd5b50610711611a68565b60405161071e919061313a565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613036565b611a8d565b60405161075b9190612fde565b60405180910390f35b34801561077057600080fd5b5061078b600480360381019061078691906135b5565b611b34565b6040516107989190612f2a565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c391906131e8565b611bc8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108fd57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090d575061090c82611cc0565b5b9050919050565b60606001805461092390613624565b80601f016020809104026020016040519081016040528092919081815260200182805461094f90613624565b801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b60006109b182611d2a565b6109f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e7906136c8565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a36826111c8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e9061375a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac6611d37565b73ffffffffffffffffffffffffffffffffffffffff161480610af55750610af481610aef611d37565b611b34565b5b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b906137ec565b60405180910390fd5b610b3f838383611d3f565b505050565b60008054905090565b610b55611d37565b73ffffffffffffffffffffffffffffffffffffffff16610b736114f1565b73ffffffffffffffffffffffffffffffffffffffff1614610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090613858565b60405180910390fd5b60085482610bd5610b44565b610bdf91906138a7565b1115610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c179061396f565b60405180910390fd5b610c2a8183611df1565b81600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c7991906138a7565b9250508190555081600d6000828254610c9291906138a7565b925050819055505050565b610ca5611d37565b73ffffffffffffffffffffffffffffffffffffffff16610cc36114f1565b73ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090613858565b60405180910390fd5b80600b8190555050565b610d2b611d37565b73ffffffffffffffffffffffffffffffffffffffff16610d496114f1565b73ffffffffffffffffffffffffffffffffffffffff1614610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690613858565b60405180910390fd5b80600c8190555050565b610db4838383611e0f565b505050565b6000610dc4836111de565b8210610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90613a01565b60405180910390fd5b6000610e0f610b44565b905060008060005b83811015610f69576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f0957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f5b5786841415610f52578195505050505050610fa5565b83806001019450505b508080600101915050610e17565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613a93565b60405180910390fd5b92915050565b600f6020528060005260406000206000915090505481565b610fcb611d37565b73ffffffffffffffffffffffffffffffffffffffff16610fe96114f1565b73ffffffffffffffffffffffffffffffffffffffff161461103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103690613858565b60405180910390fd5b8060099080519060200190611055929190612d99565b5050565b611061611d37565b73ffffffffffffffffffffffffffffffffffffffff1661107f6114f1565b73ffffffffffffffffffffffffffffffffffffffff16146110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc90613858565b60405180910390fd5b60006110df611988565b905060008111611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90613b25565b60405180910390fd5b61113561112f6114f1565b8261234f565b50565b61115383838360405180602001604052806000815250611a0c565b505050565b6000611162610b44565b82106111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90613bb7565b60405180910390fd5b819050919050565b600c5481565b6000601060009054906101000a900460ff16905090565b60006111d382612400565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613c49565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112cf611d37565b73ffffffffffffffffffffffffffffffffffffffff166112ed6114f1565b73ffffffffffffffffffffffffffffffffffffffff1614611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90613858565b60405180910390fd5b61134d600061259a565b565b600b5481565b61135d611d37565b73ffffffffffffffffffffffffffffffffffffffff1661137b6114f1565b73ffffffffffffffffffffffffffffffffffffffff16146113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613858565b60405180910390fd5b600060018111156113e5576113e4613393565b5b601060009054906101000a900460ff16600181111561140757611406613393565b5b141561143d576001601060006101000a81548160ff0219169083600181111561143357611432613393565b5b0217905550611469565b6000601060006101000a81548160ff0219169083600181111561146357611462613393565b5b02179055505b565b611473611d37565b73ffffffffffffffffffffffffffffffffffffffff166114916114f1565b73ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613858565b60405180910390fd5b80600a8190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461152a90613624565b80601f016020809104026020016040519081016040528092919081815260200182805461155690613624565b80156115a35780601f10611578576101008083540402835291602001916115a3565b820191906000526020600020905b81548152906001019060200180831161158657829003601f168201915b5050505050905090565b600060018111156115c1576115c0613393565b5b601060009054906101000a900460ff1660018111156115e3576115e2613393565b5b1415611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613cb5565b60405180910390fd5b60085481611630610b44565b61163a91906138a7565b111561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290613d21565b60405180910390fd5b600c548111156116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b790613d8d565b60405180910390fd5b600b5481600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461170e91906138a7565b111561174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690613df9565b60405180910390fd5b80611758611a68565b6117629190613e19565b3410156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90613ee5565b60405180910390fd5b6117ae3382611df1565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117fd91906138a7565b9250508190555050565b61180f611d37565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490613f51565b60405180910390fd5b806006600061188a611d37565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611937611d37565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161197c9190612f2a565b60405180910390a35050565b6000611992611d37565b73ffffffffffffffffffffffffffffffffffffffff166119b06114f1565b73ffffffffffffffffffffffffffffffffffffffff1614611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613858565b60405180910390fd5b47905090565b611a17848484611e0f565b611a2384848484612660565b611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990613fe3565b60405180910390fd5b50505050565b6000600e54611a75610b44565b1015611a845760009050611a8a565b600a5490505b90565b6060611a9882611d2a565b611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614075565b60405180910390fd5b6000611ae16127f7565b90506000815111611b015760405180602001604052806000815250611b2c565b80611b0b84612889565b604051602001611b1c92919061411d565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bd0611d37565b73ffffffffffffffffffffffffffffffffffffffff16611bee6114f1565b73ffffffffffffffffffffffffffffffffffffffff1614611c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3b90613858565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab906141be565b60405180910390fd5b611cbd8161259a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611e0b8282604051806020016040528060008152506129ea565b5050565b6000611e1a82612400565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e41611d37565b73ffffffffffffffffffffffffffffffffffffffff161480611e9d5750611e66611d37565b73ffffffffffffffffffffffffffffffffffffffff16611e85846109a6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eb95750611eb88260000151611eb3611d37565b611b34565b5b905080611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290614250565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f64906142e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490614374565b60405180910390fd5b611fea85858560016129fc565b611ffa6000848460000151611d3f565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122df5761223e81611d2a565b156122de5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123488585856001612a02565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612375906143c5565b60006040518083038185875af1925050503d80600081146123b2576040519150601f19603f3d011682016040523d82523d6000602084013e6123b7565b606091505b50509050806123fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f290614426565b60405180910390fd5b505050565b612408612e1f565b61241182611d2a565b612450576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612447906144b8565b60405180910390fd5b60008290505b60008110612559576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461254a578092505050612595565b50808060019003915050612456565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c9061454a565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126818473ffffffffffffffffffffffffffffffffffffffff16612a08565b156127ea578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126aa611d37565b8786866040518563ffffffff1660e01b81526004016126cc94939291906145bf565b602060405180830381600087803b1580156126e657600080fd5b505af192505050801561271757506040513d601f19601f820116820180604052508101906127149190614620565b60015b61279a573d8060008114612747576040519150601f19603f3d011682016040523d82523d6000602084013e61274c565b606091505b50600081511415612792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278990613fe3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127ef565b600190505b949350505050565b60606009805461280690613624565b80601f016020809104026020016040519081016040528092919081815260200182805461283290613624565b801561287f5780601f106128545761010080835404028352916020019161287f565b820191906000526020600020905b81548152906001019060200180831161286257829003601f168201915b5050505050905090565b606060008214156128d1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e5565b600082905060005b600082146129035780806128ec9061464d565b915050600a826128fc91906146c5565b91506128d9565b60008167ffffffffffffffff81111561291f5761291e61321f565b5b6040519080825280601f01601f1916602001820160405280156129515781602001600182028036833780820191505090505b5090505b600085146129de5760018261296a91906146f6565b9150600a85612979919061472a565b603061298591906138a7565b60f81b81838151811061299b5761299a61475b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d791906146c5565b9450612955565b8093505050505b919050565b6129f78383836001612a1b565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a88906147fc565b60405180910390fd5b6000841415612ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acc9061488e565b60405180910390fd5b612ae260008683876129fc565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612d7c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612d6757612d276000888488612660565b612d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d90613fe3565b60405180910390fd5b5b81806001019250508080600101915050612cb0565b508060008190555050612d926000868387612a02565b5050505050565b828054612da590613624565b90600052602060002090601f016020900481019282612dc75760008555612e0e565b82601f10612de057805160ff1916838001178555612e0e565b82800160010185558215612e0e579182015b82811115612e0d578251825591602001919060010190612df2565b5b509050612e1b9190612e59565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e72576000816000905550600101612e5a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ebf81612e8a565b8114612eca57600080fd5b50565b600081359050612edc81612eb6565b92915050565b600060208284031215612ef857612ef7612e80565b5b6000612f0684828501612ecd565b91505092915050565b60008115159050919050565b612f2481612f0f565b82525050565b6000602082019050612f3f6000830184612f1b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f7f578082015181840152602081019050612f64565b83811115612f8e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fb082612f45565b612fba8185612f50565b9350612fca818560208601612f61565b612fd381612f94565b840191505092915050565b60006020820190508181036000830152612ff88184612fa5565b905092915050565b6000819050919050565b61301381613000565b811461301e57600080fd5b50565b6000813590506130308161300a565b92915050565b60006020828403121561304c5761304b612e80565b5b600061305a84828501613021565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061308e82613063565b9050919050565b61309e81613083565b82525050565b60006020820190506130b96000830184613095565b92915050565b6130c881613083565b81146130d357600080fd5b50565b6000813590506130e5816130bf565b92915050565b6000806040838503121561310257613101612e80565b5b6000613110858286016130d6565b925050602061312185828601613021565b9150509250929050565b61313481613000565b82525050565b600060208201905061314f600083018461312b565b92915050565b6000806040838503121561316c5761316b612e80565b5b600061317a85828601613021565b925050602061318b858286016130d6565b9150509250929050565b6000806000606084860312156131ae576131ad612e80565b5b60006131bc868287016130d6565b93505060206131cd868287016130d6565b92505060406131de86828701613021565b9150509250925092565b6000602082840312156131fe576131fd612e80565b5b600061320c848285016130d6565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61325782612f94565b810181811067ffffffffffffffff821117156132765761327561321f565b5b80604052505050565b6000613289612e76565b9050613295828261324e565b919050565b600067ffffffffffffffff8211156132b5576132b461321f565b5b6132be82612f94565b9050602081019050919050565b82818337600083830152505050565b60006132ed6132e88461329a565b61327f565b9050828152602081018484840111156133095761330861321a565b5b6133148482856132cb565b509392505050565b600082601f83011261333157613330613215565b5b81356133418482602086016132da565b91505092915050565b6000602082840312156133605761335f612e80565b5b600082013567ffffffffffffffff81111561337e5761337d612e85565b5b61338a8482850161331c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106133d3576133d2613393565b5b50565b60008190506133e4826133c2565b919050565b60006133f4826133d6565b9050919050565b613404816133e9565b82525050565b600060208201905061341f60008301846133fb565b92915050565b61342e81612f0f565b811461343957600080fd5b50565b60008135905061344b81613425565b92915050565b6000806040838503121561346857613467612e80565b5b6000613476858286016130d6565b92505060206134878582860161343c565b9150509250929050565b600067ffffffffffffffff8211156134ac576134ab61321f565b5b6134b582612f94565b9050602081019050919050565b60006134d56134d084613491565b61327f565b9050828152602081018484840111156134f1576134f061321a565b5b6134fc8482856132cb565b509392505050565b600082601f83011261351957613518613215565b5b81356135298482602086016134c2565b91505092915050565b6000806000806080858703121561354c5761354b612e80565b5b600061355a878288016130d6565b945050602061356b878288016130d6565b935050604061357c87828801613021565b925050606085013567ffffffffffffffff81111561359d5761359c612e85565b5b6135a987828801613504565b91505092959194509250565b600080604083850312156135cc576135cb612e80565b5b60006135da858286016130d6565b92505060206135eb858286016130d6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363c57607f821691505b602082108114156136505761364f6135f5565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006136b2602d83612f50565b91506136bd82613656565b604082019050919050565b600060208201905081810360008301526136e1816136a5565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613744602283612f50565b915061374f826136e8565b604082019050919050565b6000602082019050818103600083015261377381613737565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006137d6603983612f50565b91506137e18261377a565b604082019050919050565b60006020820190508181036000830152613805816137c9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613842602083612f50565b915061384d8261380c565b602082019050919050565b6000602082019050818103600083015261387181613835565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138b282613000565b91506138bd83613000565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138f2576138f1613878565b5b828201905092915050565b7f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f60008201527f206d696e742e2e00000000000000000000000000000000000000000000000000602082015250565b6000613959602783612f50565b9150613964826138fd565b604082019050919050565b600060208201905081810360008301526139888161394c565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006139eb602283612f50565b91506139f68261398f565b604082019050919050565b60006020820190508181036000830152613a1a816139de565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613a7d602e83612f50565b9150613a8882613a21565b604082019050919050565b60006020820190508181036000830152613aac81613a70565b9050919050565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b0f602283612f50565b9150613b1a82613ab3565b604082019050919050565b60006020820190508181036000830152613b3e81613b02565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613ba1602383612f50565b9150613bac82613b45565b604082019050919050565b60006020820190508181036000830152613bd081613b94565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613c33602b83612f50565b9150613c3e82613bd7565b604082019050919050565b60006020820190508181036000830152613c6281613c26565b9050919050565b7f53616c65206973206e6f74206f70656e20796574210000000000000000000000600082015250565b6000613c9f601583612f50565b9150613caa82613c69565b602082019050919050565b60006020820190508181036000830152613cce81613c92565b9050919050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000613d0b601e83612f50565b9150613d1682613cd5565b602082019050919050565b60006020820190508181036000830152613d3a81613cfe565b9050919050565b7f4d6178204d696e74732070657220545820657863656564656421000000000000600082015250565b6000613d77601a83612f50565b9150613d8282613d41565b602082019050919050565b60006020820190508181036000830152613da681613d6a565b9050919050565b7f4d6178206d696e74732070657220616464726573732065786365656465642100600082015250565b6000613de3601f83612f50565b9150613dee82613dad565b602082019050919050565b60006020820190508181036000830152613e1281613dd6565b9050919050565b6000613e2482613000565b9150613e2f83613000565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6857613e67613878565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e46547300000000000000000000000000000000602082015250565b6000613ecf603083612f50565b9150613eda82613e73565b604082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613f3b601a83612f50565b9150613f4682613f05565b602082019050919050565b60006020820190508181036000830152613f6a81613f2e565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613fcd603383612f50565b9150613fd882613f71565b604082019050919050565b60006020820190508181036000830152613ffc81613fc0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061405f602f83612f50565b915061406a82614003565b604082019050919050565b6000602082019050818103600083015261408e81614052565b9050919050565b600081905092915050565b60006140ab82612f45565b6140b58185614095565b93506140c5818560208601612f61565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614107600583614095565b9150614112826140d1565b600582019050919050565b600061412982856140a0565b915061413582846140a0565b9150614140826140fa565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141a8602683612f50565b91506141b38261414c565b604082019050919050565b600060208201905081810360008301526141d78161419b565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061423a603283612f50565b9150614245826141de565b604082019050919050565b600060208201905081810360008301526142698161422d565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006142cc602683612f50565b91506142d782614270565b604082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061435e602583612f50565b915061436982614302565b604082019050919050565b6000602082019050818103600083015261438d81614351565b9050919050565b600081905092915050565b50565b60006143af600083614394565b91506143ba8261439f565b600082019050919050565b60006143d0826143a2565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000614410601483612f50565b915061441b826143da565b602082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006144a2602a83612f50565b91506144ad82614446565b604082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614534602f83612f50565b915061453f826144d8565b604082019050919050565b6000602082019050818103600083015261456381614527565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145918261456a565b61459b8185614575565b93506145ab818560208601612f61565b6145b481612f94565b840191505092915050565b60006080820190506145d46000830187613095565b6145e16020830186613095565b6145ee604083018561312b565b81810360608301526146008184614586565b905095945050505050565b60008151905061461a81612eb6565b92915050565b60006020828403121561463657614635612e80565b5b60006146448482850161460b565b91505092915050565b600061465882613000565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561468b5761468a613878565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146d082613000565b91506146db83613000565b9250826146eb576146ea614696565b5b828204905092915050565b600061470182613000565b915061470c83613000565b92508282101561471f5761471e613878565b5b828203905092915050565b600061473582613000565b915061474083613000565b9250826147505761474f614696565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147e6602183612f50565b91506147f18261478a565b604082019050919050565b60006020820190508181036000830152614815816147d9565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000614878602883612f50565b91506148838261481c565b604082019050919050565b600060208201905081810360008301526148a78161486b565b905091905056fea2646970667358221220a2955083a0aafd6c4c24e2e4c8ee5afd2524fac31d2c78c46c95188adc456f8764736f6c63430008090033697066733a2f2f516d583876354645634c5950676a6778383668326868413963797a6f424a61664d4e696f63736259683761324e372f

Deployed Bytecode

0x6080604052600436106101f25760003560e01c8063603f4d521161010d57806395d89b41116100a0578063b88d4fde1161006f578063b88d4fde146106d3578063bdb4b848146106fc578063c87b56dd14610727578063e985e9c514610764578063f2fde38b146107a1576101f9565b806395d89b4114610638578063a0712d6814610663578063a22cb4651461067f578063b0a1c1c4146106a8576101f9565b80637501f741116100dc5780637501f741146105a25780637d8966e4146105cd5780637f1921ef146105e45780638da5cb5b1461060d576101f9565b8063603f4d52146104e65780636352211e1461051157806370a082311461054e578063715018a61461058b576101f9565b806323b872dd116101855780633ccfd60b116101545780633ccfd60b1461043e57806342842e0e146104555780634f6ccce71461047e578063553f241e146104bb576101f9565b806323b872dd146103725780632f745c591461039b5780633023eba6146103d857806339a0c6f914610415576101f9565b806318160ddd116101c157806318160ddd146102cc57806318df6403146102f757806320c63e3b14610320578063214584d514610349576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612ee2565b6107ca565b6040516102329190612f2a565b60405180910390f35b34801561024757600080fd5b50610250610914565b60405161025d9190612fde565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613036565b6109a6565b60405161029a91906130a4565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906130eb565b610a2b565b005b3480156102d857600080fd5b506102e1610b44565b6040516102ee919061313a565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613155565b610b4d565b005b34801561032c57600080fd5b5061034760048036038101906103429190613036565b610c9d565b005b34801561035557600080fd5b50610370600480360381019061036b9190613036565b610d23565b005b34801561037e57600080fd5b5061039960048036038101906103949190613195565b610da9565b005b3480156103a757600080fd5b506103c260048036038101906103bd91906130eb565b610db9565b6040516103cf919061313a565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa91906131e8565b610fab565b60405161040c919061313a565b60405180910390f35b34801561042157600080fd5b5061043c6004803603810190610437919061334a565b610fc3565b005b34801561044a57600080fd5b50610453611059565b005b34801561046157600080fd5b5061047c60048036038101906104779190613195565b611138565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613036565b611158565b6040516104b2919061313a565b60405180910390f35b3480156104c757600080fd5b506104d06111ab565b6040516104dd919061313a565b60405180910390f35b3480156104f257600080fd5b506104fb6111b1565b604051610508919061340a565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613036565b6111c8565b60405161054591906130a4565b60405180910390f35b34801561055a57600080fd5b50610575600480360381019061057091906131e8565b6111de565b604051610582919061313a565b60405180910390f35b34801561059757600080fd5b506105a06112c7565b005b3480156105ae57600080fd5b506105b761134f565b6040516105c4919061313a565b60405180910390f35b3480156105d957600080fd5b506105e2611355565b005b3480156105f057600080fd5b5061060b60048036038101906106069190613036565b61146b565b005b34801561061957600080fd5b506106226114f1565b60405161062f91906130a4565b60405180910390f35b34801561064457600080fd5b5061064d61151b565b60405161065a9190612fde565b60405180910390f35b61067d60048036038101906106789190613036565b6115ad565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613451565b611807565b005b3480156106b457600080fd5b506106bd611988565b6040516106ca919061313a565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190613532565b611a0c565b005b34801561070857600080fd5b50610711611a68565b60405161071e919061313a565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613036565b611a8d565b60405161075b9190612fde565b60405180910390f35b34801561077057600080fd5b5061078b600480360381019061078691906135b5565b611b34565b6040516107989190612f2a565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c391906131e8565b611bc8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108fd57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090d575061090c82611cc0565b5b9050919050565b60606001805461092390613624565b80601f016020809104026020016040519081016040528092919081815260200182805461094f90613624565b801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b60006109b182611d2a565b6109f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e7906136c8565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a36826111c8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e9061375a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac6611d37565b73ffffffffffffffffffffffffffffffffffffffff161480610af55750610af481610aef611d37565b611b34565b5b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b906137ec565b60405180910390fd5b610b3f838383611d3f565b505050565b60008054905090565b610b55611d37565b73ffffffffffffffffffffffffffffffffffffffff16610b736114f1565b73ffffffffffffffffffffffffffffffffffffffff1614610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090613858565b60405180910390fd5b60085482610bd5610b44565b610bdf91906138a7565b1115610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c179061396f565b60405180910390fd5b610c2a8183611df1565b81600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c7991906138a7565b9250508190555081600d6000828254610c9291906138a7565b925050819055505050565b610ca5611d37565b73ffffffffffffffffffffffffffffffffffffffff16610cc36114f1565b73ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090613858565b60405180910390fd5b80600b8190555050565b610d2b611d37565b73ffffffffffffffffffffffffffffffffffffffff16610d496114f1565b73ffffffffffffffffffffffffffffffffffffffff1614610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690613858565b60405180910390fd5b80600c8190555050565b610db4838383611e0f565b505050565b6000610dc4836111de565b8210610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90613a01565b60405180910390fd5b6000610e0f610b44565b905060008060005b83811015610f69576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f0957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f5b5786841415610f52578195505050505050610fa5565b83806001019450505b508080600101915050610e17565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613a93565b60405180910390fd5b92915050565b600f6020528060005260406000206000915090505481565b610fcb611d37565b73ffffffffffffffffffffffffffffffffffffffff16610fe96114f1565b73ffffffffffffffffffffffffffffffffffffffff161461103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103690613858565b60405180910390fd5b8060099080519060200190611055929190612d99565b5050565b611061611d37565b73ffffffffffffffffffffffffffffffffffffffff1661107f6114f1565b73ffffffffffffffffffffffffffffffffffffffff16146110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc90613858565b60405180910390fd5b60006110df611988565b905060008111611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90613b25565b60405180910390fd5b61113561112f6114f1565b8261234f565b50565b61115383838360405180602001604052806000815250611a0c565b505050565b6000611162610b44565b82106111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90613bb7565b60405180910390fd5b819050919050565b600c5481565b6000601060009054906101000a900460ff16905090565b60006111d382612400565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613c49565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112cf611d37565b73ffffffffffffffffffffffffffffffffffffffff166112ed6114f1565b73ffffffffffffffffffffffffffffffffffffffff1614611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90613858565b60405180910390fd5b61134d600061259a565b565b600b5481565b61135d611d37565b73ffffffffffffffffffffffffffffffffffffffff1661137b6114f1565b73ffffffffffffffffffffffffffffffffffffffff16146113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613858565b60405180910390fd5b600060018111156113e5576113e4613393565b5b601060009054906101000a900460ff16600181111561140757611406613393565b5b141561143d576001601060006101000a81548160ff0219169083600181111561143357611432613393565b5b0217905550611469565b6000601060006101000a81548160ff0219169083600181111561146357611462613393565b5b02179055505b565b611473611d37565b73ffffffffffffffffffffffffffffffffffffffff166114916114f1565b73ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613858565b60405180910390fd5b80600a8190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461152a90613624565b80601f016020809104026020016040519081016040528092919081815260200182805461155690613624565b80156115a35780601f10611578576101008083540402835291602001916115a3565b820191906000526020600020905b81548152906001019060200180831161158657829003601f168201915b5050505050905090565b600060018111156115c1576115c0613393565b5b601060009054906101000a900460ff1660018111156115e3576115e2613393565b5b1415611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613cb5565b60405180910390fd5b60085481611630610b44565b61163a91906138a7565b111561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290613d21565b60405180910390fd5b600c548111156116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b790613d8d565b60405180910390fd5b600b5481600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461170e91906138a7565b111561174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690613df9565b60405180910390fd5b80611758611a68565b6117629190613e19565b3410156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90613ee5565b60405180910390fd5b6117ae3382611df1565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117fd91906138a7565b9250508190555050565b61180f611d37565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490613f51565b60405180910390fd5b806006600061188a611d37565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611937611d37565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161197c9190612f2a565b60405180910390a35050565b6000611992611d37565b73ffffffffffffffffffffffffffffffffffffffff166119b06114f1565b73ffffffffffffffffffffffffffffffffffffffff1614611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613858565b60405180910390fd5b47905090565b611a17848484611e0f565b611a2384848484612660565b611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990613fe3565b60405180910390fd5b50505050565b6000600e54611a75610b44565b1015611a845760009050611a8a565b600a5490505b90565b6060611a9882611d2a565b611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614075565b60405180910390fd5b6000611ae16127f7565b90506000815111611b015760405180602001604052806000815250611b2c565b80611b0b84612889565b604051602001611b1c92919061411d565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bd0611d37565b73ffffffffffffffffffffffffffffffffffffffff16611bee6114f1565b73ffffffffffffffffffffffffffffffffffffffff1614611c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3b90613858565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab906141be565b60405180910390fd5b611cbd8161259a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611e0b8282604051806020016040528060008152506129ea565b5050565b6000611e1a82612400565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e41611d37565b73ffffffffffffffffffffffffffffffffffffffff161480611e9d5750611e66611d37565b73ffffffffffffffffffffffffffffffffffffffff16611e85846109a6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eb95750611eb88260000151611eb3611d37565b611b34565b5b905080611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290614250565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f64906142e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490614374565b60405180910390fd5b611fea85858560016129fc565b611ffa6000848460000151611d3f565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122df5761223e81611d2a565b156122de5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123488585856001612a02565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612375906143c5565b60006040518083038185875af1925050503d80600081146123b2576040519150601f19603f3d011682016040523d82523d6000602084013e6123b7565b606091505b50509050806123fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f290614426565b60405180910390fd5b505050565b612408612e1f565b61241182611d2a565b612450576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612447906144b8565b60405180910390fd5b60008290505b60008110612559576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461254a578092505050612595565b50808060019003915050612456565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c9061454a565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126818473ffffffffffffffffffffffffffffffffffffffff16612a08565b156127ea578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126aa611d37565b8786866040518563ffffffff1660e01b81526004016126cc94939291906145bf565b602060405180830381600087803b1580156126e657600080fd5b505af192505050801561271757506040513d601f19601f820116820180604052508101906127149190614620565b60015b61279a573d8060008114612747576040519150601f19603f3d011682016040523d82523d6000602084013e61274c565b606091505b50600081511415612792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278990613fe3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127ef565b600190505b949350505050565b60606009805461280690613624565b80601f016020809104026020016040519081016040528092919081815260200182805461283290613624565b801561287f5780601f106128545761010080835404028352916020019161287f565b820191906000526020600020905b81548152906001019060200180831161286257829003601f168201915b5050505050905090565b606060008214156128d1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e5565b600082905060005b600082146129035780806128ec9061464d565b915050600a826128fc91906146c5565b91506128d9565b60008167ffffffffffffffff81111561291f5761291e61321f565b5b6040519080825280601f01601f1916602001820160405280156129515781602001600182028036833780820191505090505b5090505b600085146129de5760018261296a91906146f6565b9150600a85612979919061472a565b603061298591906138a7565b60f81b81838151811061299b5761299a61475b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d791906146c5565b9450612955565b8093505050505b919050565b6129f78383836001612a1b565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a88906147fc565b60405180910390fd5b6000841415612ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acc9061488e565b60405180910390fd5b612ae260008683876129fc565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612d7c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612d6757612d276000888488612660565b612d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d90613fe3565b60405180910390fd5b5b81806001019250508080600101915050612cb0565b508060008190555050612d926000868387612a02565b5050505050565b828054612da590613624565b90600052602060002090601f016020900481019282612dc75760008555612e0e565b82601f10612de057805160ff1916838001178555612e0e565b82800160010185558215612e0e579182015b82811115612e0d578251825591602001919060010190612df2565b5b509050612e1b9190612e59565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e72576000816000905550600101612e5a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ebf81612e8a565b8114612eca57600080fd5b50565b600081359050612edc81612eb6565b92915050565b600060208284031215612ef857612ef7612e80565b5b6000612f0684828501612ecd565b91505092915050565b60008115159050919050565b612f2481612f0f565b82525050565b6000602082019050612f3f6000830184612f1b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f7f578082015181840152602081019050612f64565b83811115612f8e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fb082612f45565b612fba8185612f50565b9350612fca818560208601612f61565b612fd381612f94565b840191505092915050565b60006020820190508181036000830152612ff88184612fa5565b905092915050565b6000819050919050565b61301381613000565b811461301e57600080fd5b50565b6000813590506130308161300a565b92915050565b60006020828403121561304c5761304b612e80565b5b600061305a84828501613021565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061308e82613063565b9050919050565b61309e81613083565b82525050565b60006020820190506130b96000830184613095565b92915050565b6130c881613083565b81146130d357600080fd5b50565b6000813590506130e5816130bf565b92915050565b6000806040838503121561310257613101612e80565b5b6000613110858286016130d6565b925050602061312185828601613021565b9150509250929050565b61313481613000565b82525050565b600060208201905061314f600083018461312b565b92915050565b6000806040838503121561316c5761316b612e80565b5b600061317a85828601613021565b925050602061318b858286016130d6565b9150509250929050565b6000806000606084860312156131ae576131ad612e80565b5b60006131bc868287016130d6565b93505060206131cd868287016130d6565b92505060406131de86828701613021565b9150509250925092565b6000602082840312156131fe576131fd612e80565b5b600061320c848285016130d6565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61325782612f94565b810181811067ffffffffffffffff821117156132765761327561321f565b5b80604052505050565b6000613289612e76565b9050613295828261324e565b919050565b600067ffffffffffffffff8211156132b5576132b461321f565b5b6132be82612f94565b9050602081019050919050565b82818337600083830152505050565b60006132ed6132e88461329a565b61327f565b9050828152602081018484840111156133095761330861321a565b5b6133148482856132cb565b509392505050565b600082601f83011261333157613330613215565b5b81356133418482602086016132da565b91505092915050565b6000602082840312156133605761335f612e80565b5b600082013567ffffffffffffffff81111561337e5761337d612e85565b5b61338a8482850161331c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106133d3576133d2613393565b5b50565b60008190506133e4826133c2565b919050565b60006133f4826133d6565b9050919050565b613404816133e9565b82525050565b600060208201905061341f60008301846133fb565b92915050565b61342e81612f0f565b811461343957600080fd5b50565b60008135905061344b81613425565b92915050565b6000806040838503121561346857613467612e80565b5b6000613476858286016130d6565b92505060206134878582860161343c565b9150509250929050565b600067ffffffffffffffff8211156134ac576134ab61321f565b5b6134b582612f94565b9050602081019050919050565b60006134d56134d084613491565b61327f565b9050828152602081018484840111156134f1576134f061321a565b5b6134fc8482856132cb565b509392505050565b600082601f83011261351957613518613215565b5b81356135298482602086016134c2565b91505092915050565b6000806000806080858703121561354c5761354b612e80565b5b600061355a878288016130d6565b945050602061356b878288016130d6565b935050604061357c87828801613021565b925050606085013567ffffffffffffffff81111561359d5761359c612e85565b5b6135a987828801613504565b91505092959194509250565b600080604083850312156135cc576135cb612e80565b5b60006135da858286016130d6565b92505060206135eb858286016130d6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363c57607f821691505b602082108114156136505761364f6135f5565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006136b2602d83612f50565b91506136bd82613656565b604082019050919050565b600060208201905081810360008301526136e1816136a5565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613744602283612f50565b915061374f826136e8565b604082019050919050565b6000602082019050818103600083015261377381613737565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006137d6603983612f50565b91506137e18261377a565b604082019050919050565b60006020820190508181036000830152613805816137c9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613842602083612f50565b915061384d8261380c565b602082019050919050565b6000602082019050818103600083015261387181613835565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138b282613000565b91506138bd83613000565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138f2576138f1613878565b5b828201905092915050565b7f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f60008201527f206d696e742e2e00000000000000000000000000000000000000000000000000602082015250565b6000613959602783612f50565b9150613964826138fd565b604082019050919050565b600060208201905081810360008301526139888161394c565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006139eb602283612f50565b91506139f68261398f565b604082019050919050565b60006020820190508181036000830152613a1a816139de565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613a7d602e83612f50565b9150613a8882613a21565b604082019050919050565b60006020820190508181036000830152613aac81613a70565b9050919050565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b0f602283612f50565b9150613b1a82613ab3565b604082019050919050565b60006020820190508181036000830152613b3e81613b02565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613ba1602383612f50565b9150613bac82613b45565b604082019050919050565b60006020820190508181036000830152613bd081613b94565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613c33602b83612f50565b9150613c3e82613bd7565b604082019050919050565b60006020820190508181036000830152613c6281613c26565b9050919050565b7f53616c65206973206e6f74206f70656e20796574210000000000000000000000600082015250565b6000613c9f601583612f50565b9150613caa82613c69565b602082019050919050565b60006020820190508181036000830152613cce81613c92565b9050919050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000613d0b601e83612f50565b9150613d1682613cd5565b602082019050919050565b60006020820190508181036000830152613d3a81613cfe565b9050919050565b7f4d6178204d696e74732070657220545820657863656564656421000000000000600082015250565b6000613d77601a83612f50565b9150613d8282613d41565b602082019050919050565b60006020820190508181036000830152613da681613d6a565b9050919050565b7f4d6178206d696e74732070657220616464726573732065786365656465642100600082015250565b6000613de3601f83612f50565b9150613dee82613dad565b602082019050919050565b60006020820190508181036000830152613e1281613dd6565b9050919050565b6000613e2482613000565b9150613e2f83613000565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6857613e67613878565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e46547300000000000000000000000000000000602082015250565b6000613ecf603083612f50565b9150613eda82613e73565b604082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613f3b601a83612f50565b9150613f4682613f05565b602082019050919050565b60006020820190508181036000830152613f6a81613f2e565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613fcd603383612f50565b9150613fd882613f71565b604082019050919050565b60006020820190508181036000830152613ffc81613fc0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061405f602f83612f50565b915061406a82614003565b604082019050919050565b6000602082019050818103600083015261408e81614052565b9050919050565b600081905092915050565b60006140ab82612f45565b6140b58185614095565b93506140c5818560208601612f61565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614107600583614095565b9150614112826140d1565b600582019050919050565b600061412982856140a0565b915061413582846140a0565b9150614140826140fa565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141a8602683612f50565b91506141b38261414c565b604082019050919050565b600060208201905081810360008301526141d78161419b565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061423a603283612f50565b9150614245826141de565b604082019050919050565b600060208201905081810360008301526142698161422d565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006142cc602683612f50565b91506142d782614270565b604082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061435e602583612f50565b915061436982614302565b604082019050919050565b6000602082019050818103600083015261438d81614351565b9050919050565b600081905092915050565b50565b60006143af600083614394565b91506143ba8261439f565b600082019050919050565b60006143d0826143a2565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000614410601483612f50565b915061441b826143da565b602082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006144a2602a83612f50565b91506144ad82614446565b604082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614534602f83612f50565b915061453f826144d8565b604082019050919050565b6000602082019050818103600083015261456381614527565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145918261456a565b61459b8185614575565b93506145ab818560208601612f61565b6145b481612f94565b840191505092915050565b60006080820190506145d46000830187613095565b6145e16020830186613095565b6145ee604083018561312b565b81810360608301526146008184614586565b905095945050505050565b60008151905061461a81612eb6565b92915050565b60006020828403121561463657614635612e80565b5b60006146448482850161460b565b91505092915050565b600061465882613000565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561468b5761468a613878565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146d082613000565b91506146db83613000565b9250826146eb576146ea614696565b5b828204905092915050565b600061470182613000565b915061470c83613000565b92508282101561471f5761471e613878565b5b828203905092915050565b600061473582613000565b915061474083613000565b9250826147505761474f614696565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147e6602183612f50565b91506147f18261478a565b604082019050919050565b60006020820190508181036000830152614815816147d9565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000614878602883612f50565b91506148838261481c565b604082019050919050565b600060208201905081810360008301526148a78161486b565b905091905056fea2646970667358221220a2955083a0aafd6c4c24e2e4c8ee5afd2524fac31d2c78c46c95188adc456f8764736f6c63430008090033

Deployed Bytecode Sourcemap

54984:5019:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56464:8;;;41745:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43631:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45193:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44714:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39994:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58131:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59734:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59876:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46069:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40666:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55801:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56691:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58670:209;;;;;;;;;;;;;:::i;:::-;;46310:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40179:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55500:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59223:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43440:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42181:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4626:94;;;;;;;;;;;;;:::i;:::-;;55419:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56839:210;;;;;;;;;;;;;:::i;:::-;;59594:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3975:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43800:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57108:596;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45479:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58501:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46566:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59355:203;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57716:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45838:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41745:372;41847:4;41899:25;41884:40;;;:11;:40;;;;:105;;;;41956:33;41941:48;;;:11;:48;;;;41884:105;:172;;;;42021:35;42006:50;;;:11;:50;;;;41884:172;:225;;;;42073:36;42097:11;42073:23;:36::i;:::-;41884:225;41864:245;;41745:372;;;:::o;43631:100::-;43685:13;43718:5;43711:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43631:100;:::o;45193:214::-;45261:7;45289:16;45297:7;45289;:16::i;:::-;45281:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45375:15;:24;45391:7;45375:24;;;;;;;;;;;;;;;;;;;;;45368:31;;45193:214;;;:::o;44714:413::-;44787:13;44803:24;44819:7;44803:15;:24::i;:::-;44787:40;;44852:5;44846:11;;:2;:11;;;;44838:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44947:5;44931:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44956:37;44973:5;44980:12;:10;:12::i;:::-;44956:16;:37::i;:::-;44931:62;44909:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;45091:28;45100:2;45104:7;45113:5;45091:8;:28::i;:::-;44776:351;44714:413;;:::o;39994:108::-;40055:7;40082:12;;40075:19;;39994:108;:::o;58131:316::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58247:14:::1;;58237:6;58221:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;58213:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;58318:28;58328:9;58339:6;58318:9;:28::i;:::-;58387:6;58357:15;:26;58373:9;58357:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;58422:6;58404:14;;:24;;;;;;;:::i;:::-;;;;;;;;58131:316:::0;;:::o;59734:99::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59815:10:::1;59805:7;:20;;;;59734:99:::0;:::o;59876:119::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59972:15:::1;59957:12;:30;;;;59876:119:::0;:::o;46069:170::-;46203:28;46213:4;46219:2;46223:7;46203:9;:28::i;:::-;46069:170;;;:::o;40666:1007::-;40755:7;40791:16;40801:5;40791:9;:16::i;:::-;40783:5;:24;40775:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40857:22;40882:13;:11;:13::i;:::-;40857:38;;40906:19;40936:25;41125:9;41120:466;41140:14;41136:1;:18;41120:466;;;41180:31;41214:11;:14;41226:1;41214:14;;;;;;;;;;;41180:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41277:1;41251:28;;:9;:14;;;:28;;;41247:111;;41324:9;:14;;;41304:34;;41247:111;41401:5;41380:26;;:17;:26;;;41376:195;;;41450:5;41435:11;:20;41431:85;;;41491:1;41484:8;;;;;;;;;41431:85;41538:13;;;;;;;41376:195;41161:425;41156:3;;;;;;;41120:466;;;;41609:56;;;;;;;;;;:::i;:::-;;;;;;;;40666:1007;;;;;:::o;55801:50::-;;;;;;;;;;;;;;;;;:::o;56691:109::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56784:8:::1;56766:15;:26;;;;;;;;;;;;:::i;:::-;;56691:109:::0;:::o;58670:209::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58718:15:::1;58736:16;:14;:16::i;:::-;58718:34;;58781:1;58771:7;:11;58763:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58834:36;58852:7;:5;:7::i;:::-;58862;58834:9;:36::i;:::-;58707:172;58670:209::o:0;46310:185::-;46448:39;46465:4;46471:2;46475:7;46448:39;;;;;;;;;;;;:16;:39::i;:::-;46310:185;;;:::o;40179:187::-;40246:7;40282:13;:11;:13::i;:::-;40274:5;:21;40266:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40353:5;40346:12;;40179:187;;;:::o;55500:24::-;;;;:::o;59223:83::-;59264:5;59288:10;;;;;;;;;;;59281:17;;59223:83;:::o;43440:124::-;43504:7;43531:20;43543:7;43531:11;:20::i;:::-;:25;;;43524:32;;43440:124;;;:::o;42181:221::-;42245:7;42290:1;42273:19;;:5;:19;;;;42265:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;42366:12;:19;42379:5;42366:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42358:36;;42351:43;;42181:221;;;:::o;4626:94::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4691:21:::1;4709:1;4691:9;:21::i;:::-;4626:94::o:0;55419:19::-;;;;:::o;56839:210::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56907:12:::1;56893:26;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;56889:153;;;56949:14;56936:10;;:27;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;56889:153;;;57018:12;57005:10;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;56889:153;56839:210::o:0;59594:104::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59679:11:::1;59667:9;:23;;;;59594:104:::0;:::o;3975:87::-;4021:7;4048:6;;;;;;;;;;;4041:13;;3975:87;:::o;43800:104::-;43856:13;43889:7;43882:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43800:104;:::o;57108:596::-;57186:12;57172:26;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;;57164:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;57269:14;;57259:6;57243:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;57235:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57347:12;;57337:6;:22;;57329:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57449:7;;57439:6;57409:15;:27;57425:10;57409:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;57401:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57537:6;57524:10;:8;:10::i;:::-;:19;;;;:::i;:::-;57511:9;:32;;57503:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;57617:29;57627:10;57639:6;57617:9;:29::i;:::-;57688:6;57657:15;:27;57673:10;57657:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;57108:596;:::o;45479:288::-;45586:12;:10;:12::i;:::-;45574:24;;:8;:24;;;;45566:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;45687:8;45642:18;:32;45661:12;:10;:12::i;:::-;45642:32;;;;;;;;;;;;;;;:42;45675:8;45642:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;45740:8;45711:48;;45726:12;:10;:12::i;:::-;45711:48;;;45750:8;45711:48;;;;;;:::i;:::-;;;;;;;;45479:288;;:::o;58501:109::-;58557:4;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58581:21:::1;58574:28;;58501:109:::0;:::o;46566:355::-;46725:28;46735:4;46741:2;46745:7;46725:9;:28::i;:::-;46786:48;46809:4;46815:2;46819:7;46828:5;46786:22;:48::i;:::-;46764:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;46566:355;;;;:::o;59355:203::-;59395:4;59432:14;;59416:13;:11;:13::i;:::-;:30;59412:129;;;59470:1;59463:8;;;;59412:129;59520:9;;59513:16;;59355:203;;:::o;57716:370::-;57790:13;57824:17;57832:8;57824:7;:17::i;:::-;57816:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57916:21;57940:10;:8;:10::i;:::-;57916:34;;57992:1;57974:7;57968:21;:25;:96;;;;;;;;;;;;;;;;;58020:7;58029:19;:8;:17;:19::i;:::-;58003:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57968:96;57961:103;;;57716:370;;;:::o;45838:164::-;45935:4;45959:18;:25;45978:5;45959:25;;;;;;;;;;;;;;;:35;45985:8;45959:35;;;;;;;;;;;;;;;;;;;;;;;;;45952:42;;45838:164;;;;:::o;4875:192::-;4206:12;:10;:12::i;:::-;4195:23;;:7;:5;:7::i;:::-;:23;;;4187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4984:1:::1;4964:22;;:8;:22;;;;4956:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5040:19;5050:8;5040:9;:19::i;:::-;4875:192:::0;:::o;15957:157::-;16042:4;16081:25;16066:40;;;:11;:40;;;;16059:47;;15957:157;;;:::o;47176:111::-;47233:4;47267:12;;47257:7;:22;47250:29;;47176:111;;;:::o;2763:98::-;2816:7;2843:10;2836:17;;2763:98;:::o;52096:196::-;52238:2;52211:15;:24;52227:7;52211:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52276:7;52272:2;52256:28;;52265:5;52256:28;;;;;;;;;;;;52096:196;;;:::o;47295:104::-;47364:27;47374:2;47378:8;47364:27;;;;;;;;;;;;:9;:27::i;:::-;47295:104;;:::o;49976:2002::-;50091:35;50129:20;50141:7;50129:11;:20::i;:::-;50091:58;;50162:22;50204:13;:18;;;50188:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;50263:12;:10;:12::i;:::-;50239:36;;:20;50251:7;50239:11;:20::i;:::-;:36;;;50188:87;:154;;;;50292:50;50309:13;:18;;;50329:12;:10;:12::i;:::-;50292:16;:50::i;:::-;50188:154;50162:181;;50364:17;50356:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;50479:4;50457:26;;:13;:18;;;:26;;;50449:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50559:1;50545:16;;:2;:16;;;;50537:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50616:43;50638:4;50644:2;50648:7;50657:1;50616:21;:43::i;:::-;50724:49;50741:1;50745:7;50754:13;:18;;;50724:8;:49::i;:::-;51099:1;51069:12;:18;51082:4;51069:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51143:1;51115:12;:16;51128:2;51115:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51189:2;51161:11;:20;51173:7;51161:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;51251:15;51206:11;:20;51218:7;51206:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;51519:19;51551:1;51541:7;:11;51519:33;;51612:1;51571:43;;:11;:24;51583:11;51571:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;51567:295;;;51639:20;51647:11;51639:7;:20::i;:::-;51635:212;;;51716:13;:18;;;51684:11;:24;51696:11;51684:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;51799:13;:28;;;51757:11;:24;51769:11;51757:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;51635:212;51567:295;51044:829;51909:7;51905:2;51890:27;;51899:4;51890:27;;;;;;;;;;;;51928:42;51949:4;51955:2;51959:7;51968:1;51928:20;:42::i;:::-;50080:1898;;49976:2002;;;:::o;58954:183::-;59035:9;59050:7;:12;;59070:6;59050:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59034:47;;;59100:4;59092:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;59023:114;58954:183;;:::o;42841:537::-;42902:21;;:::i;:::-;42944:16;42952:7;42944;:16::i;:::-;42936:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43050:12;43065:7;43050:22;;43045:245;43082:1;43074:4;:9;43045:245;;43112:31;43146:11;:17;43158:4;43146:17;;;;;;;;;;;43112:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43212:1;43186:28;;:9;:14;;;:28;;;43182:93;;43246:9;43239:16;;;;;;43182:93;43093:197;43085:6;;;;;;;;43045:245;;;;43313:57;;;;;;;;;;:::i;:::-;;;;;;;;42841:537;;;;:::o;5075:173::-;5131:16;5150:6;;;;;;;;;;;5131:25;;5176:8;5167:6;;:17;;;;;;;;;;;;;;;;;;5231:8;5200:40;;5221:8;5200:40;;;;;;;;;;;;5120:128;5075:173;:::o;52857:804::-;53012:4;53033:15;:2;:13;;;:15::i;:::-;53029:625;;;53085:2;53069:36;;;53106:12;:10;:12::i;:::-;53120:4;53126:7;53135:5;53069:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53065:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53332:1;53315:6;:13;:18;53311:273;;;53358:61;;;;;;;;;;:::i;:::-;;;;;;;;53311:273;53534:6;53528:13;53519:6;53515:2;53511:15;53504:38;53065:534;53202:45;;;53192:55;;;:6;:55;;;;53185:62;;;;;53029:625;53638:4;53631:11;;52857:804;;;;;;;:::o;56517:116::-;56577:13;56610:15;56603:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56517:116;:::o;379:723::-;435:13;665:1;656:5;:10;652:53;;;683:10;;;;;;;;;;;;;;;;;;;;;652:53;715:12;730:5;715:20;;746:14;771:78;786:1;778:4;:9;771:78;;804:8;;;;;:::i;:::-;;;;835:2;827:10;;;;;:::i;:::-;;;771:78;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;909:154;925:1;916:5;:10;909:154;;953:1;943:11;;;;;:::i;:::-;;;1020:2;1012:5;:10;;;;:::i;:::-;999:2;:24;;;;:::i;:::-;986:39;;969:6;976;969:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1049:2;1040:11;;;;;:::i;:::-;;;909:154;;;1087:6;1073:21;;;;;379:723;;;;:::o;47762:163::-;47885:32;47891:2;47895:8;47905:5;47912:4;47885:5;:32::i;:::-;47762:163;;;:::o;54149:159::-;;;;;:::o;54720:158::-;;;;;:::o;6021:387::-;6081:4;6289:12;6356:7;6344:20;6336:28;;6399:1;6392:4;:8;6385:15;;;6021:387;;;:::o;48184:1538::-;48323:20;48346:12;;48323:35;;48391:1;48377:16;;:2;:16;;;;48369:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48462:1;48450:8;:13;;48442:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48521:61;48551:1;48555:2;48559:12;48573:8;48521:21;:61::i;:::-;48896:8;48860:12;:16;48873:2;48860:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48961:8;48920:12;:16;48933:2;48920:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49020:2;48987:11;:25;48999:12;48987:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;49087:15;49037:11;:25;49049:12;49037:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;49120:20;49143:12;49120:35;;49177:9;49172:415;49192:8;49188:1;:12;49172:415;;;49256:12;49252:2;49231:38;;49248:1;49231:38;;;;;;;;;;;;49292:4;49288:249;;;49355:59;49386:1;49390:2;49394:12;49408:5;49355:22;:59::i;:::-;49321:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;49288:249;49557:14;;;;;;;49202:3;;;;;;;49172:415;;;;49618:12;49603;:27;;;;48835:807;49654:60;49683:1;49687:2;49691:12;49705:8;49654:20;:60::i;:::-;48312:1410;48184:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:474::-;5358:6;5366;5415:2;5403:9;5394:7;5390:23;5386:32;5383:119;;;5421:79;;:::i;:::-;5383:119;5541:1;5566:53;5611:7;5602:6;5591:9;5587:22;5566:53;:::i;:::-;5556:63;;5512:117;5668:2;5694:53;5739:7;5730:6;5719:9;5715:22;5694:53;:::i;:::-;5684:63;;5639:118;5290:474;;;;;:::o;5770:619::-;5847:6;5855;5863;5912:2;5900:9;5891:7;5887:23;5883:32;5880:119;;;5918:79;;:::i;:::-;5880:119;6038:1;6063:53;6108:7;6099:6;6088:9;6084:22;6063:53;:::i;:::-;6053:63;;6009:117;6165:2;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6136:118;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5770:619;;;;;:::o;6395:329::-;6454:6;6503:2;6491:9;6482:7;6478:23;6474:32;6471:119;;;6509:79;;:::i;:::-;6471:119;6629:1;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6600:117;6395:329;;;;:::o;6730:117::-;6839:1;6836;6829:12;6853:117;6962:1;6959;6952:12;6976:180;7024:77;7021:1;7014:88;7121:4;7118:1;7111:15;7145:4;7142:1;7135:15;7162:281;7245:27;7267:4;7245:27;:::i;:::-;7237:6;7233:40;7375:6;7363:10;7360:22;7339:18;7327:10;7324:34;7321:62;7318:88;;;7386:18;;:::i;:::-;7318:88;7426:10;7422:2;7415:22;7205:238;7162:281;;:::o;7449:129::-;7483:6;7510:20;;:::i;:::-;7500:30;;7539:33;7567:4;7559:6;7539:33;:::i;:::-;7449:129;;;:::o;7584:308::-;7646:4;7736:18;7728:6;7725:30;7722:56;;;7758:18;;:::i;:::-;7722:56;7796:29;7818:6;7796:29;:::i;:::-;7788:37;;7880:4;7874;7870:15;7862:23;;7584:308;;;:::o;7898:154::-;7982:6;7977:3;7972;7959:30;8044:1;8035:6;8030:3;8026:16;8019:27;7898:154;;;:::o;8058:412::-;8136:5;8161:66;8177:49;8219:6;8177:49;:::i;:::-;8161:66;:::i;:::-;8152:75;;8250:6;8243:5;8236:21;8288:4;8281:5;8277:16;8326:3;8317:6;8312:3;8308:16;8305:25;8302:112;;;8333:79;;:::i;:::-;8302:112;8423:41;8457:6;8452:3;8447;8423:41;:::i;:::-;8142:328;8058:412;;;;;:::o;8490:340::-;8546:5;8595:3;8588:4;8580:6;8576:17;8572:27;8562:122;;8603:79;;:::i;:::-;8562:122;8720:6;8707:20;8745:79;8820:3;8812:6;8805:4;8797:6;8793:17;8745:79;:::i;:::-;8736:88;;8552:278;8490:340;;;;:::o;8836:509::-;8905:6;8954:2;8942:9;8933:7;8929:23;8925:32;8922:119;;;8960:79;;:::i;:::-;8922:119;9108:1;9097:9;9093:17;9080:31;9138:18;9130:6;9127:30;9124:117;;;9160:79;;:::i;:::-;9124:117;9265:63;9320:7;9311:6;9300:9;9296:22;9265:63;:::i;:::-;9255:73;;9051:287;8836:509;;;;:::o;9351:180::-;9399:77;9396:1;9389:88;9496:4;9493:1;9486:15;9520:4;9517:1;9510:15;9537:115;9620:1;9613:5;9610:12;9600:46;;9626:18;;:::i;:::-;9600:46;9537:115;:::o;9658:131::-;9705:7;9734:5;9723:16;;9740:43;9777:5;9740:43;:::i;:::-;9658:131;;;:::o;9795:::-;9853:9;9886:34;9914:5;9886:34;:::i;:::-;9873:47;;9795:131;;;:::o;9932:147::-;10027:45;10066:5;10027:45;:::i;:::-;10022:3;10015:58;9932:147;;:::o;10085:238::-;10186:4;10224:2;10213:9;10209:18;10201:26;;10237:79;10313:1;10302:9;10298:17;10289:6;10237:79;:::i;:::-;10085:238;;;;:::o;10329:116::-;10399:21;10414:5;10399:21;:::i;:::-;10392:5;10389:32;10379:60;;10435:1;10432;10425:12;10379:60;10329:116;:::o;10451:133::-;10494:5;10532:6;10519:20;10510:29;;10548:30;10572:5;10548:30;:::i;:::-;10451:133;;;;:::o;10590:468::-;10655:6;10663;10712:2;10700:9;10691:7;10687:23;10683:32;10680:119;;;10718:79;;:::i;:::-;10680:119;10838:1;10863:53;10908:7;10899:6;10888:9;10884:22;10863:53;:::i;:::-;10853:63;;10809:117;10965:2;10991:50;11033:7;11024:6;11013:9;11009:22;10991:50;:::i;:::-;10981:60;;10936:115;10590:468;;;;;:::o;11064:307::-;11125:4;11215:18;11207:6;11204:30;11201:56;;;11237:18;;:::i;:::-;11201:56;11275:29;11297:6;11275:29;:::i;:::-;11267:37;;11359:4;11353;11349:15;11341:23;;11064:307;;;:::o;11377:410::-;11454:5;11479:65;11495:48;11536:6;11495:48;:::i;:::-;11479:65;:::i;:::-;11470:74;;11567:6;11560:5;11553:21;11605:4;11598:5;11594:16;11643:3;11634:6;11629:3;11625:16;11622:25;11619:112;;;11650:79;;:::i;:::-;11619:112;11740:41;11774:6;11769:3;11764;11740:41;:::i;:::-;11460:327;11377:410;;;;;:::o;11806:338::-;11861:5;11910:3;11903:4;11895:6;11891:17;11887:27;11877:122;;11918:79;;:::i;:::-;11877:122;12035:6;12022:20;12060:78;12134:3;12126:6;12119:4;12111:6;12107:17;12060:78;:::i;:::-;12051:87;;11867:277;11806:338;;;;:::o;12150:943::-;12245:6;12253;12261;12269;12318:3;12306:9;12297:7;12293:23;12289:33;12286:120;;;12325:79;;:::i;:::-;12286:120;12445:1;12470:53;12515:7;12506:6;12495:9;12491:22;12470:53;:::i;:::-;12460:63;;12416:117;12572:2;12598:53;12643:7;12634:6;12623:9;12619:22;12598:53;:::i;:::-;12588:63;;12543:118;12700:2;12726:53;12771:7;12762:6;12751:9;12747:22;12726:53;:::i;:::-;12716:63;;12671:118;12856:2;12845:9;12841:18;12828:32;12887:18;12879:6;12876:30;12873:117;;;12909:79;;:::i;:::-;12873:117;13014:62;13068:7;13059:6;13048:9;13044:22;13014:62;:::i;:::-;13004:72;;12799:287;12150:943;;;;;;;:::o;13099:474::-;13167:6;13175;13224:2;13212:9;13203:7;13199:23;13195:32;13192:119;;;13230:79;;:::i;:::-;13192:119;13350:1;13375:53;13420:7;13411:6;13400:9;13396:22;13375:53;:::i;:::-;13365:63;;13321:117;13477:2;13503:53;13548:7;13539:6;13528:9;13524:22;13503:53;:::i;:::-;13493:63;;13448:118;13099:474;;;;;:::o;13579:180::-;13627:77;13624:1;13617:88;13724:4;13721:1;13714:15;13748:4;13745:1;13738:15;13765:320;13809:6;13846:1;13840:4;13836:12;13826:22;;13893:1;13887:4;13883:12;13914:18;13904:81;;13970:4;13962:6;13958:17;13948:27;;13904:81;14032:2;14024:6;14021:14;14001:18;13998:38;13995:84;;;14051:18;;:::i;:::-;13995:84;13816:269;13765:320;;;:::o;14091:232::-;14231:34;14227:1;14219:6;14215:14;14208:58;14300:15;14295:2;14287:6;14283:15;14276:40;14091:232;:::o;14329:366::-;14471:3;14492:67;14556:2;14551:3;14492:67;:::i;:::-;14485:74;;14568:93;14657:3;14568:93;:::i;:::-;14686:2;14681:3;14677:12;14670:19;;14329:366;;;:::o;14701:419::-;14867:4;14905:2;14894:9;14890:18;14882:26;;14954:9;14948:4;14944:20;14940:1;14929:9;14925:17;14918:47;14982:131;15108:4;14982:131;:::i;:::-;14974:139;;14701:419;;;:::o;15126:221::-;15266:34;15262:1;15254:6;15250:14;15243:58;15335:4;15330:2;15322:6;15318:15;15311:29;15126:221;:::o;15353:366::-;15495:3;15516:67;15580:2;15575:3;15516:67;:::i;:::-;15509:74;;15592:93;15681:3;15592:93;:::i;:::-;15710:2;15705:3;15701:12;15694:19;;15353:366;;;:::o;15725:419::-;15891:4;15929:2;15918:9;15914:18;15906:26;;15978:9;15972:4;15968:20;15964:1;15953:9;15949:17;15942:47;16006:131;16132:4;16006:131;:::i;:::-;15998:139;;15725:419;;;:::o;16150:244::-;16290:34;16286:1;16278:6;16274:14;16267:58;16359:27;16354:2;16346:6;16342:15;16335:52;16150:244;:::o;16400:366::-;16542:3;16563:67;16627:2;16622:3;16563:67;:::i;:::-;16556:74;;16639:93;16728:3;16639:93;:::i;:::-;16757:2;16752:3;16748:12;16741:19;;16400:366;;;:::o;16772:419::-;16938:4;16976:2;16965:9;16961:18;16953:26;;17025:9;17019:4;17015:20;17011:1;17000:9;16996:17;16989:47;17053:131;17179:4;17053:131;:::i;:::-;17045:139;;16772:419;;;:::o;17197:182::-;17337:34;17333:1;17325:6;17321:14;17314:58;17197:182;:::o;17385:366::-;17527:3;17548:67;17612:2;17607:3;17548:67;:::i;:::-;17541:74;;17624:93;17713:3;17624:93;:::i;:::-;17742:2;17737:3;17733:12;17726:19;;17385:366;;;:::o;17757:419::-;17923:4;17961:2;17950:9;17946:18;17938:26;;18010:9;18004:4;18000:20;17996:1;17985:9;17981:17;17974:47;18038:131;18164:4;18038:131;:::i;:::-;18030:139;;17757:419;;;:::o;18182:180::-;18230:77;18227:1;18220:88;18327:4;18324:1;18317:15;18351:4;18348:1;18341:15;18368:305;18408:3;18427:20;18445:1;18427:20;:::i;:::-;18422:25;;18461:20;18479:1;18461:20;:::i;:::-;18456:25;;18615:1;18547:66;18543:74;18540:1;18537:81;18534:107;;;18621:18;;:::i;:::-;18534:107;18665:1;18662;18658:9;18651:16;;18368:305;;;;:::o;18679:226::-;18819:34;18815:1;18807:6;18803:14;18796:58;18888:9;18883:2;18875:6;18871:15;18864:34;18679:226;:::o;18911:366::-;19053:3;19074:67;19138:2;19133:3;19074:67;:::i;:::-;19067:74;;19150:93;19239:3;19150:93;:::i;:::-;19268:2;19263:3;19259:12;19252:19;;18911:366;;;:::o;19283:419::-;19449:4;19487:2;19476:9;19472:18;19464:26;;19536:9;19530:4;19526:20;19522:1;19511:9;19507:17;19500:47;19564:131;19690:4;19564:131;:::i;:::-;19556:139;;19283:419;;;:::o;19708:221::-;19848:34;19844:1;19836:6;19832:14;19825:58;19917:4;19912:2;19904:6;19900:15;19893:29;19708:221;:::o;19935:366::-;20077:3;20098:67;20162:2;20157:3;20098:67;:::i;:::-;20091:74;;20174:93;20263:3;20174:93;:::i;:::-;20292:2;20287:3;20283:12;20276:19;;19935:366;;;:::o;20307:419::-;20473:4;20511:2;20500:9;20496:18;20488:26;;20560:9;20554:4;20550:20;20546:1;20535:9;20531:17;20524:47;20588:131;20714:4;20588:131;:::i;:::-;20580:139;;20307:419;;;:::o;20732:233::-;20872:34;20868:1;20860:6;20856:14;20849:58;20941:16;20936:2;20928:6;20924:15;20917:41;20732:233;:::o;20971:366::-;21113:3;21134:67;21198:2;21193:3;21134:67;:::i;:::-;21127:74;;21210:93;21299:3;21210:93;:::i;:::-;21328:2;21323:3;21319:12;21312:19;;20971:366;;;:::o;21343:419::-;21509:4;21547:2;21536:9;21532:18;21524:26;;21596:9;21590:4;21586:20;21582:1;21571:9;21567:17;21560:47;21624:131;21750:4;21624:131;:::i;:::-;21616:139;;21343:419;;;:::o;21768:221::-;21908:34;21904:1;21896:6;21892:14;21885:58;21977:4;21972:2;21964:6;21960:15;21953:29;21768:221;:::o;21995:366::-;22137:3;22158:67;22222:2;22217:3;22158:67;:::i;:::-;22151:74;;22234:93;22323:3;22234:93;:::i;:::-;22352:2;22347:3;22343:12;22336:19;;21995:366;;;:::o;22367:419::-;22533:4;22571:2;22560:9;22556:18;22548:26;;22620:9;22614:4;22610:20;22606:1;22595:9;22591:17;22584:47;22648:131;22774:4;22648:131;:::i;:::-;22640:139;;22367:419;;;:::o;22792:222::-;22932:34;22928:1;22920:6;22916:14;22909:58;23001:5;22996:2;22988:6;22984:15;22977:30;22792:222;:::o;23020:366::-;23162:3;23183:67;23247:2;23242:3;23183:67;:::i;:::-;23176:74;;23259:93;23348:3;23259:93;:::i;:::-;23377:2;23372:3;23368:12;23361:19;;23020:366;;;:::o;23392:419::-;23558:4;23596:2;23585:9;23581:18;23573:26;;23645:9;23639:4;23635:20;23631:1;23620:9;23616:17;23609:47;23673:131;23799:4;23673:131;:::i;:::-;23665:139;;23392:419;;;:::o;23817:230::-;23957:34;23953:1;23945:6;23941:14;23934:58;24026:13;24021:2;24013:6;24009:15;24002:38;23817:230;:::o;24053:366::-;24195:3;24216:67;24280:2;24275:3;24216:67;:::i;:::-;24209:74;;24292:93;24381:3;24292:93;:::i;:::-;24410:2;24405:3;24401:12;24394:19;;24053:366;;;:::o;24425:419::-;24591:4;24629:2;24618:9;24614:18;24606:26;;24678:9;24672:4;24668:20;24664:1;24653:9;24649:17;24642:47;24706:131;24832:4;24706:131;:::i;:::-;24698:139;;24425:419;;;:::o;24850:171::-;24990:23;24986:1;24978:6;24974:14;24967:47;24850:171;:::o;25027:366::-;25169:3;25190:67;25254:2;25249:3;25190:67;:::i;:::-;25183:74;;25266:93;25355:3;25266:93;:::i;:::-;25384:2;25379:3;25375:12;25368:19;;25027:366;;;:::o;25399:419::-;25565:4;25603:2;25592:9;25588:18;25580:26;;25652:9;25646:4;25642:20;25638:1;25627:9;25623:17;25616:47;25680:131;25806:4;25680:131;:::i;:::-;25672:139;;25399:419;;;:::o;25824:180::-;25964:32;25960:1;25952:6;25948:14;25941:56;25824:180;:::o;26010:366::-;26152:3;26173:67;26237:2;26232:3;26173:67;:::i;:::-;26166:74;;26249:93;26338:3;26249:93;:::i;:::-;26367:2;26362:3;26358:12;26351:19;;26010:366;;;:::o;26382:419::-;26548:4;26586:2;26575:9;26571:18;26563:26;;26635:9;26629:4;26625:20;26621:1;26610:9;26606:17;26599:47;26663:131;26789:4;26663:131;:::i;:::-;26655:139;;26382:419;;;:::o;26807:176::-;26947:28;26943:1;26935:6;26931:14;26924:52;26807:176;:::o;26989:366::-;27131:3;27152:67;27216:2;27211:3;27152:67;:::i;:::-;27145:74;;27228:93;27317:3;27228:93;:::i;:::-;27346:2;27341:3;27337:12;27330:19;;26989:366;;;:::o;27361:419::-;27527:4;27565:2;27554:9;27550:18;27542:26;;27614:9;27608:4;27604:20;27600:1;27589:9;27585:17;27578:47;27642:131;27768:4;27642:131;:::i;:::-;27634:139;;27361:419;;;:::o;27786:181::-;27926:33;27922:1;27914:6;27910:14;27903:57;27786:181;:::o;27973:366::-;28115:3;28136:67;28200:2;28195:3;28136:67;:::i;:::-;28129:74;;28212:93;28301:3;28212:93;:::i;:::-;28330:2;28325:3;28321:12;28314:19;;27973:366;;;:::o;28345:419::-;28511:4;28549:2;28538:9;28534:18;28526:26;;28598:9;28592:4;28588:20;28584:1;28573:9;28569:17;28562:47;28626:131;28752:4;28626:131;:::i;:::-;28618:139;;28345:419;;;:::o;28770:348::-;28810:7;28833:20;28851:1;28833:20;:::i;:::-;28828:25;;28867:20;28885:1;28867:20;:::i;:::-;28862:25;;29055:1;28987:66;28983:74;28980:1;28977:81;28972:1;28965:9;28958:17;28954:105;28951:131;;;29062:18;;:::i;:::-;28951:131;29110:1;29107;29103:9;29092:20;;28770:348;;;;:::o;29124:235::-;29264:34;29260:1;29252:6;29248:14;29241:58;29333:18;29328:2;29320:6;29316:15;29309:43;29124:235;:::o;29365:366::-;29507:3;29528:67;29592:2;29587:3;29528:67;:::i;:::-;29521:74;;29604:93;29693:3;29604:93;:::i;:::-;29722:2;29717:3;29713:12;29706:19;;29365:366;;;:::o;29737:419::-;29903:4;29941:2;29930:9;29926:18;29918:26;;29990:9;29984:4;29980:20;29976:1;29965:9;29961:17;29954:47;30018:131;30144:4;30018:131;:::i;:::-;30010:139;;29737:419;;;:::o;30162:176::-;30302:28;30298:1;30290:6;30286:14;30279:52;30162:176;:::o;30344:366::-;30486:3;30507:67;30571:2;30566:3;30507:67;:::i;:::-;30500:74;;30583:93;30672:3;30583:93;:::i;:::-;30701:2;30696:3;30692:12;30685:19;;30344:366;;;:::o;30716:419::-;30882:4;30920:2;30909:9;30905:18;30897:26;;30969:9;30963:4;30959:20;30955:1;30944:9;30940:17;30933:47;30997:131;31123:4;30997:131;:::i;:::-;30989:139;;30716:419;;;:::o;31141:238::-;31281:34;31277:1;31269:6;31265:14;31258:58;31350:21;31345:2;31337:6;31333:15;31326:46;31141:238;:::o;31385:366::-;31527:3;31548:67;31612:2;31607:3;31548:67;:::i;:::-;31541:74;;31624:93;31713:3;31624:93;:::i;:::-;31742:2;31737:3;31733:12;31726:19;;31385:366;;;:::o;31757:419::-;31923:4;31961:2;31950:9;31946:18;31938:26;;32010:9;32004:4;32000:20;31996:1;31985:9;31981:17;31974:47;32038:131;32164:4;32038:131;:::i;:::-;32030:139;;31757:419;;;:::o;32182:234::-;32322:34;32318:1;32310:6;32306:14;32299:58;32391:17;32386:2;32378:6;32374:15;32367:42;32182:234;:::o;32422:366::-;32564:3;32585:67;32649:2;32644:3;32585:67;:::i;:::-;32578:74;;32661:93;32750:3;32661:93;:::i;:::-;32779:2;32774:3;32770:12;32763:19;;32422:366;;;:::o;32794:419::-;32960:4;32998:2;32987:9;32983:18;32975:26;;33047:9;33041:4;33037:20;33033:1;33022:9;33018:17;33011:47;33075:131;33201:4;33075:131;:::i;:::-;33067:139;;32794:419;;;:::o;33219:148::-;33321:11;33358:3;33343:18;;33219:148;;;;:::o;33373:377::-;33479:3;33507:39;33540:5;33507:39;:::i;:::-;33562:89;33644:6;33639:3;33562:89;:::i;:::-;33555:96;;33660:52;33705:6;33700:3;33693:4;33686:5;33682:16;33660:52;:::i;:::-;33737:6;33732:3;33728:16;33721:23;;33483:267;33373:377;;;;:::o;33756:155::-;33896:7;33892:1;33884:6;33880:14;33873:31;33756:155;:::o;33917:400::-;34077:3;34098:84;34180:1;34175:3;34098:84;:::i;:::-;34091:91;;34191:93;34280:3;34191:93;:::i;:::-;34309:1;34304:3;34300:11;34293:18;;33917:400;;;:::o;34323:701::-;34604:3;34626:95;34717:3;34708:6;34626:95;:::i;:::-;34619:102;;34738:95;34829:3;34820:6;34738:95;:::i;:::-;34731:102;;34850:148;34994:3;34850:148;:::i;:::-;34843:155;;35015:3;35008:10;;34323:701;;;;;:::o;35030:225::-;35170:34;35166:1;35158:6;35154:14;35147:58;35239:8;35234:2;35226:6;35222:15;35215:33;35030:225;:::o;35261:366::-;35403:3;35424:67;35488:2;35483:3;35424:67;:::i;:::-;35417:74;;35500:93;35589:3;35500:93;:::i;:::-;35618:2;35613:3;35609:12;35602:19;;35261:366;;;:::o;35633:419::-;35799:4;35837:2;35826:9;35822:18;35814:26;;35886:9;35880:4;35876:20;35872:1;35861:9;35857:17;35850:47;35914:131;36040:4;35914:131;:::i;:::-;35906:139;;35633:419;;;:::o;36058:237::-;36198:34;36194:1;36186:6;36182:14;36175:58;36267:20;36262:2;36254:6;36250:15;36243:45;36058:237;:::o;36301:366::-;36443:3;36464:67;36528:2;36523:3;36464:67;:::i;:::-;36457:74;;36540:93;36629:3;36540:93;:::i;:::-;36658:2;36653:3;36649:12;36642:19;;36301:366;;;:::o;36673:419::-;36839:4;36877:2;36866:9;36862:18;36854:26;;36926:9;36920:4;36916:20;36912:1;36901:9;36897:17;36890:47;36954:131;37080:4;36954:131;:::i;:::-;36946:139;;36673:419;;;:::o;37098:225::-;37238:34;37234:1;37226:6;37222:14;37215:58;37307:8;37302:2;37294:6;37290:15;37283:33;37098:225;:::o;37329:366::-;37471:3;37492:67;37556:2;37551:3;37492:67;:::i;:::-;37485:74;;37568:93;37657:3;37568:93;:::i;:::-;37686:2;37681:3;37677:12;37670:19;;37329:366;;;:::o;37701:419::-;37867:4;37905:2;37894:9;37890:18;37882:26;;37954:9;37948:4;37944:20;37940:1;37929:9;37925:17;37918:47;37982:131;38108:4;37982:131;:::i;:::-;37974:139;;37701:419;;;:::o;38126:224::-;38266:34;38262:1;38254:6;38250:14;38243:58;38335:7;38330:2;38322:6;38318:15;38311:32;38126:224;:::o;38356:366::-;38498:3;38519:67;38583:2;38578:3;38519:67;:::i;:::-;38512:74;;38595:93;38684:3;38595:93;:::i;:::-;38713:2;38708:3;38704:12;38697:19;;38356:366;;;:::o;38728:419::-;38894:4;38932:2;38921:9;38917:18;38909:26;;38981:9;38975:4;38971:20;38967:1;38956:9;38952:17;38945:47;39009:131;39135:4;39009:131;:::i;:::-;39001:139;;38728:419;;;:::o;39153:147::-;39254:11;39291:3;39276:18;;39153:147;;;;:::o;39306:114::-;;:::o;39426:398::-;39585:3;39606:83;39687:1;39682:3;39606:83;:::i;:::-;39599:90;;39698:93;39787:3;39698:93;:::i;:::-;39816:1;39811:3;39807:11;39800:18;;39426:398;;;:::o;39830:379::-;40014:3;40036:147;40179:3;40036:147;:::i;:::-;40029:154;;40200:3;40193:10;;39830:379;;;:::o;40215:170::-;40355:22;40351:1;40343:6;40339:14;40332:46;40215:170;:::o;40391:366::-;40533:3;40554:67;40618:2;40613:3;40554:67;:::i;:::-;40547:74;;40630:93;40719:3;40630:93;:::i;:::-;40748:2;40743:3;40739:12;40732:19;;40391:366;;;:::o;40763:419::-;40929:4;40967:2;40956:9;40952:18;40944:26;;41016:9;41010:4;41006:20;41002:1;40991:9;40987:17;40980:47;41044:131;41170:4;41044:131;:::i;:::-;41036:139;;40763:419;;;:::o;41188:229::-;41328:34;41324:1;41316:6;41312:14;41305:58;41397:12;41392:2;41384:6;41380:15;41373:37;41188:229;:::o;41423:366::-;41565:3;41586:67;41650:2;41645:3;41586:67;:::i;:::-;41579:74;;41662:93;41751:3;41662:93;:::i;:::-;41780:2;41775:3;41771:12;41764:19;;41423:366;;;:::o;41795:419::-;41961:4;41999:2;41988:9;41984:18;41976:26;;42048:9;42042:4;42038:20;42034:1;42023:9;42019:17;42012:47;42076:131;42202:4;42076:131;:::i;:::-;42068:139;;41795:419;;;:::o;42220:234::-;42360:34;42356:1;42348:6;42344:14;42337:58;42429:17;42424:2;42416:6;42412:15;42405:42;42220:234;:::o;42460:366::-;42602:3;42623:67;42687:2;42682:3;42623:67;:::i;:::-;42616:74;;42699:93;42788:3;42699:93;:::i;:::-;42817:2;42812:3;42808:12;42801:19;;42460:366;;;:::o;42832:419::-;42998:4;43036:2;43025:9;43021:18;43013:26;;43085:9;43079:4;43075:20;43071:1;43060:9;43056:17;43049:47;43113:131;43239:4;43113:131;:::i;:::-;43105:139;;42832:419;;;:::o;43257:98::-;43308:6;43342:5;43336:12;43326:22;;43257:98;;;:::o;43361:168::-;43444:11;43478:6;43473:3;43466:19;43518:4;43513:3;43509:14;43494:29;;43361:168;;;;:::o;43535:360::-;43621:3;43649:38;43681:5;43649:38;:::i;:::-;43703:70;43766:6;43761:3;43703:70;:::i;:::-;43696:77;;43782:52;43827:6;43822:3;43815:4;43808:5;43804:16;43782:52;:::i;:::-;43859:29;43881:6;43859:29;:::i;:::-;43854:3;43850:39;43843:46;;43625:270;43535:360;;;;:::o;43901:640::-;44096:4;44134:3;44123:9;44119:19;44111:27;;44148:71;44216:1;44205:9;44201:17;44192:6;44148:71;:::i;:::-;44229:72;44297:2;44286:9;44282:18;44273:6;44229:72;:::i;:::-;44311;44379:2;44368:9;44364:18;44355:6;44311:72;:::i;:::-;44430:9;44424:4;44420:20;44415:2;44404:9;44400:18;44393:48;44458:76;44529:4;44520:6;44458:76;:::i;:::-;44450:84;;43901:640;;;;;;;:::o;44547:141::-;44603:5;44634:6;44628:13;44619:22;;44650:32;44676:5;44650:32;:::i;:::-;44547:141;;;;:::o;44694:349::-;44763:6;44812:2;44800:9;44791:7;44787:23;44783:32;44780:119;;;44818:79;;:::i;:::-;44780:119;44938:1;44963:63;45018:7;45009:6;44998:9;44994:22;44963:63;:::i;:::-;44953:73;;44909:127;44694:349;;;;:::o;45049:233::-;45088:3;45111:24;45129:5;45111:24;:::i;:::-;45102:33;;45157:66;45150:5;45147:77;45144:103;;;45227:18;;:::i;:::-;45144:103;45274:1;45267:5;45263:13;45256:20;;45049:233;;;:::o;45288:180::-;45336:77;45333:1;45326:88;45433:4;45430:1;45423:15;45457:4;45454:1;45447:15;45474:185;45514:1;45531:20;45549:1;45531:20;:::i;:::-;45526:25;;45565:20;45583:1;45565:20;:::i;:::-;45560:25;;45604:1;45594:35;;45609:18;;:::i;:::-;45594:35;45651:1;45648;45644:9;45639:14;;45474:185;;;;:::o;45665:191::-;45705:4;45725:20;45743:1;45725:20;:::i;:::-;45720:25;;45759:20;45777:1;45759:20;:::i;:::-;45754:25;;45798:1;45795;45792:8;45789:34;;;45803:18;;:::i;:::-;45789:34;45848:1;45845;45841:9;45833:17;;45665:191;;;;:::o;45862:176::-;45894:1;45911:20;45929:1;45911:20;:::i;:::-;45906:25;;45945:20;45963:1;45945:20;:::i;:::-;45940:25;;45984:1;45974:35;;45989:18;;:::i;:::-;45974:35;46030:1;46027;46023:9;46018:14;;45862:176;;;;:::o;46044:180::-;46092:77;46089:1;46082:88;46189:4;46186:1;46179:15;46213:4;46210:1;46203:15;46230:220;46370:34;46366:1;46358:6;46354:14;46347:58;46439:3;46434:2;46426:6;46422:15;46415:28;46230:220;:::o;46456:366::-;46598:3;46619:67;46683:2;46678:3;46619:67;:::i;:::-;46612:74;;46695:93;46784:3;46695:93;:::i;:::-;46813:2;46808:3;46804:12;46797:19;;46456:366;;;:::o;46828:419::-;46994:4;47032:2;47021:9;47017:18;47009:26;;47081:9;47075:4;47071:20;47067:1;47056:9;47052:17;47045:47;47109:131;47235:4;47109:131;:::i;:::-;47101:139;;46828:419;;;:::o;47253:227::-;47393:34;47389:1;47381:6;47377:14;47370:58;47462:10;47457:2;47449:6;47445:15;47438:35;47253:227;:::o;47486:366::-;47628:3;47649:67;47713:2;47708:3;47649:67;:::i;:::-;47642:74;;47725:93;47814:3;47725:93;:::i;:::-;47843:2;47838:3;47834:12;47827:19;;47486:366;;;:::o;47858:419::-;48024:4;48062:2;48051:9;48047:18;48039:26;;48111:9;48105:4;48101:20;48097:1;48086:9;48082:17;48075:47;48139:131;48265:4;48139:131;:::i;:::-;48131:139;;47858:419;;;:::o

Swarm Source

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