ETH Price: $3,390.96 (-1.50%)
Gas: 2 Gwei

Token

CryptoCraft (CRAFT)
 

Overview

Max Total Supply

0 CRAFT

Holders

1,457

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CRAFT
0x8Bb31Ef866529Ad82Ac6CB6eCC891A73c4f9212c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Crypto Craft is a Minecraft Metaverse providing true Play-to-Earn (P2E) gameplay with our blockchain integration. Each NFT is your ticket to join our Minecraft world where $EMRD is used for the entire in-game economy.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoCraftNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: contracts/CryptoCraftNFT.sol


pragma solidity ^0.8.2;




contract CryptoCraftNFT is ERC721, Ownable {
    // Private 
    string private baseURI;
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;
    
    // Sale status
    bool public whitelistMintIsActive = false;
    bool public publicMintIsActive = false;
    
    // Constants 
    // To maximize gas savings, max_supply is offset by 1. 
    uint256 public constant MAX_SUPPLY = 4001;
    uint256 public constant MAX_PER_TXN = 5;
    uint256 public constant TOKEN_PRICE = 0.05 ether;
    
    // Maps address to number of remaining whitelist mints
    mapping(address => uint8) private whitelist;
    
    // Reserved for team, giveaways, and promotions
    uint256 public reserveSupply = 25; 

    constructor() ERC721("CryptoCraft", "CRAFT") {
        _tokenIdCounter.increment();
    }
    
    function publicMint(uint256 _amount) external payable {        
        require(publicMintIsActive, "CC: Public Mint is not active");
        require(_tokenIdCounter.current() + _amount + reserveSupply <= MAX_SUPPLY, "CC: Max token supply exceeded");
        require(TOKEN_PRICE * _amount <= msg.value, "CC: Ether value sent is not correct");
        require(_amount <= MAX_PER_TXN, "CC: Exceeded max mint per txn");
        
        for (uint256 i = 0; i < _amount; i++) {
            _tokenIdCounter.increment();
            _safeMint(msg.sender, _tokenIdCounter.current());
        }
    }
    
    function whitelistMint(uint8 _amount) external payable {
        require(whitelistMintIsActive,  "CC: Whitelist Mint is not active");
        require(_amount <= whitelist[msg.sender], "CC: You don't have enough whitelist mints remaining");
        require(_tokenIdCounter.current() + _amount + reserveSupply <= MAX_SUPPLY, "CC: Max token supply exceeded");
        require(TOKEN_PRICE * _amount <= msg.value, "CC: Ether value sent is not correct");
        
        whitelist[msg.sender] -= _amount; 
        for (uint256 i = 0; i < _amount; i++) {
            _tokenIdCounter.increment();
            _safeMint(msg.sender, _tokenIdCounter.current());
        }
    }
    
    function numAvailableToMint(address addr) external view returns (uint8) {
        return whitelist[addr];
    }
    
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    
    
    // onlyOwner 
    function setWhitelist(address[] calldata addresses, uint8 numAllowedToMint) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = numAllowedToMint;
        }
    }
    
    function reserve(uint256 n, address mintReceiver) public onlyOwner {
      require(_tokenIdCounter.current() + n + reserveSupply <= MAX_SUPPLY, "CC: Max token supply exceeded");
      require(n <= reserveSupply, "CC: Reserve supply exceeded");
      
      reserveSupply -= n; 
      for (uint256 i = 0; i < n; i++) {
            uint256 tokenId = _tokenIdCounter.current();
            _tokenIdCounter.increment();
            _safeMint(mintReceiver, tokenId);
      }
    }
    
    function setBaseURI(string calldata _tokenBaseURI) external onlyOwner {
        baseURI = _tokenBaseURI;
    }
    
    function setWhitelistMintIsActive(bool _whitelistMintIsActive) external onlyOwner {
        whitelistMintIsActive = _whitelistMintIsActive;
    }
    
    function setPublicMintIsActive(bool _publicMintIsActive) external onlyOwner {
        publicMintIsActive = _publicMintIsActive;
    }
    
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_TXN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"address","name":"mintReceiver","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicMintIsActive","type":"bool"}],"name":"setPublicMintIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whitelistMintIsActive","type":"bool"}],"name":"setWhitelistMintIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_amount","type":"uint8"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff0219169083151502179055506019600b553480156200004c57600080fd5b506040518060400160405280600b81526020017f43727970746f43726166740000000000000000000000000000000000000000008152506040518060400160405280600581526020017f43524146540000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d19291906200020e565b508060019080519060200190620000ea9291906200020e565b5050506200010d620001016200012a60201b60201c565b6200013260201b60201c565b620001246008620001f860201b62001b3f1760201c565b62000323565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8280546200021c90620002be565b90600052602060002090601f0160209004810192826200024057600085556200028c565b82601f106200025b57805160ff19168380011785556200028c565b828001600101855582156200028c579182015b828111156200028b5782518255916020019190600101906200026e565b5b5090506200029b91906200029f565b5090565b5b80821115620002ba576000816000905550600101620002a0565b5090565b60006002820490506001821680620002d757607f821691505b60208210811415620002ee57620002ed620002f4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613ff780620003336000396000f3fe6080604052600436106101d85760003560e01c806370a0823111610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610666578063d2d8cb67146106a3578063e985e9c5146106ce578063f2fde38b1461070b576101d8565b8063a22cb465146105ae578063b8219159146105d7578063b88d4fde14610600578063c04a283614610629576101d8565b80638da5cb5b116100d15780638da5cb5b1461050457806395527a121461052f57806395d89b411461055a57806397495d7114610585576101d8565b806370a082311461045c578063715018a61461049957806373749fbd146104b0578063791d04db146104d9576101d8565b80632db115441161017a57806351b96d921161014957806351b96d92146103af57806355f804b3146103da57806360e85cde146104035780636352211e1461041f576101d8565b80632db115441461032857806332cb6b0c146103445780633ccfd60b1461036f57806342842e0e14610386576101d8565b806306fdde03116101b657806306fdde031461026e578063081812fc14610299578063095ea7b3146102d657806323b872dd146102ff576101d8565b806301ffc9a7146101dd57806303339bcb1461021a57806303d41eb614610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612bcc565b610734565b604051610211919061319c565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190612ca0565b610816565b005b34801561024f57600080fd5b5061025861099c565b60405161026591906134b9565b60405180910390f35b34801561027a57600080fd5b506102836109a2565b60405161029091906131b7565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb9190612c73565b610a34565b6040516102cd9190613135565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612aff565b610ab9565b005b34801561030b57600080fd5b50610326600480360381019061032191906129e9565b610bd1565b005b610342600480360381019061033d9190612c73565b610c31565b005b34801561035057600080fd5b50610359610dbe565b60405161036691906134b9565b60405180910390f35b34801561037b57600080fd5b50610384610dc4565b005b34801561039257600080fd5b506103ad60048036038101906103a891906129e9565b610e8f565b005b3480156103bb57600080fd5b506103c4610eaf565b6040516103d191906134b9565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190612c26565b610eb4565b005b61041d60048036038101906104189190612ce0565b610f46565b005b34801561042b57600080fd5b5061044660048036038101906104419190612c73565b6111a0565b6040516104539190613135565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e919061297c565b611252565b60405161049091906134b9565b60405180910390f35b3480156104a557600080fd5b506104ae61130a565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190612b9f565b611392565b005b3480156104e557600080fd5b506104ee61142b565b6040516104fb919061319c565b60405180910390f35b34801561051057600080fd5b5061051961143e565b6040516105269190613135565b60405180910390f35b34801561053b57600080fd5b50610544611468565b604051610551919061319c565b60405180910390f35b34801561056657600080fd5b5061056f61147b565b60405161057c91906131b7565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a79190612b3f565b61150d565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190612abf565b61162f565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190612b9f565b6117b0565b005b34801561060c57600080fd5b5061062760048036038101906106229190612a3c565b611849565b005b34801561063557600080fd5b50610650600480360381019061064b919061297c565b6118ab565b60405161065d91906134d4565b60405180910390f35b34801561067257600080fd5b5061068d60048036038101906106889190612c73565b611901565b60405161069a91906131b7565b60405180910390f35b3480156106af57600080fd5b506106b86119a8565b6040516106c591906134b9565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f091906129a9565b6119b3565b604051610702919061319c565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d919061297c565b611a47565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ff57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080f575061080e82611b55565b5b9050919050565b61081e611bbf565b73ffffffffffffffffffffffffffffffffffffffff1661083c61143e565b73ffffffffffffffffffffffffffffffffffffffff1614610892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088990613359565b60405180910390fd5b610fa1600b54836108a36008611bc7565b6108ad9190613588565b6108b79190613588565b11156108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef90613419565b60405180910390fd5b600b5482111561093d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093490613379565b60405180910390fd5b81600b600082825461094f9190613669565b9250508190555060005b8281101561099757600061096d6008611bc7565b90506109796008611b3f565b6109838382611bd5565b50808061098f906137f7565b915050610959565b505050565b600b5481565b6060600080546109b190613794565b80601f01602080910402602001604051908101604052809291908181526020018280546109dd90613794565b8015610a2a5780601f106109ff57610100808354040283529160200191610a2a565b820191906000526020600020905b815481529060010190602001808311610a0d57829003601f168201915b5050505050905090565b6000610a3f82611bf3565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590613339565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac4826111a0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c906133f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b54611bbf565b73ffffffffffffffffffffffffffffffffffffffff161480610b835750610b8281610b7d611bbf565b6119b3565b5b610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb9906132b9565b60405180910390fd5b610bcc8383611c5f565b505050565b610be2610bdc611bbf565b82611d18565b610c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1890613459565b60405180910390fd5b610c2c838383611df6565b505050565b600960019054906101000a900460ff16610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7790613499565b60405180910390fd5b610fa1600b5482610c916008611bc7565b610c9b9190613588565b610ca59190613588565b1115610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd90613419565b60405180910390fd5b348166b1a2bc2ec50000610cfa919061360f565b1115610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290613279565b60405180910390fd5b6005811115610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613399565b60405180910390fd5b60005b81811015610dba57610d946008611b3f565b610da733610da26008611bc7565b611bd5565b8080610db2906137f7565b915050610d82565b5050565b610fa181565b610dcc611bbf565b73ffffffffffffffffffffffffffffffffffffffff16610dea61143e565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613359565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e8b573d6000803e3d6000fd5b5050565b610eaa83838360405180602001604052806000815250611849565b505050565b600581565b610ebc611bbf565b73ffffffffffffffffffffffffffffffffffffffff16610eda61143e565b73ffffffffffffffffffffffffffffffffffffffff1614610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613359565b60405180910390fd5b818160079190610f4192919061273f565b505050565b600960009054906101000a900460ff16610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c90613479565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168160ff16111561102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190613439565b60405180910390fd5b610fa1600b548260ff1661103e6008611bc7565b6110489190613588565b6110529190613588565b1115611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90613419565b60405180910390fd5b348160ff1666b1a2bc2ec500006110aa919061360f565b11156110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290613279565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611146919061369d565b92506101000a81548160ff021916908360ff16021790555060005b8160ff1681101561119c576111766008611b3f565b611189336111846008611bc7565b611bd5565b8080611194906137f7565b915050611161565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611249576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611240906132f9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906132d9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611312611bbf565b73ffffffffffffffffffffffffffffffffffffffff1661133061143e565b73ffffffffffffffffffffffffffffffffffffffff1614611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90613359565b60405180910390fd5b6113906000612052565b565b61139a611bbf565b73ffffffffffffffffffffffffffffffffffffffff166113b861143e565b73ffffffffffffffffffffffffffffffffffffffff161461140e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140590613359565b60405180910390fd5b80600960016101000a81548160ff02191690831515021790555050565b600960009054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960019054906101000a900460ff1681565b60606001805461148a90613794565b80601f01602080910402602001604051908101604052809291908181526020018280546114b690613794565b80156115035780601f106114d857610100808354040283529160200191611503565b820191906000526020600020905b8154815290600101906020018083116114e657829003601f168201915b5050505050905090565b611515611bbf565b73ffffffffffffffffffffffffffffffffffffffff1661153361143e565b73ffffffffffffffffffffffffffffffffffffffff1614611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090613359565b60405180910390fd5b60005b838390508110156116295781600a60008686858181106115af576115ae6138fe565b5b90506020020160208101906115c4919061297c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611621906137f7565b91505061158c565b50505050565b611637611bbf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90613259565b60405180910390fd5b80600560006116b2611bbf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661175f611bbf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117a4919061319c565b60405180910390a35050565b6117b8611bbf565b73ffffffffffffffffffffffffffffffffffffffff166117d661143e565b73ffffffffffffffffffffffffffffffffffffffff161461182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182390613359565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b61185a611854611bbf565b83611d18565b611899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189090613459565b60405180910390fd5b6118a584848484612118565b50505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b606061190c82611bf3565b61194b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611942906133d9565b60405180910390fd5b6000611955612174565b9050600081511161197557604051806020016040528060008152506119a0565b8061197f84612206565b604051602001611990929190613111565b6040516020818303038152906040525b915050919050565b66b1a2bc2ec5000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a4f611bbf565b73ffffffffffffffffffffffffffffffffffffffff16611a6d61143e565b73ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba90613359565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a906131f9565b60405180910390fd5b611b3c81612052565b50565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b611bef828260405180602001604052806000815250612367565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cd2836111a0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d2382611bf3565b611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990613299565b60405180910390fd5b6000611d6d836111a0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ddc57508373ffffffffffffffffffffffffffffffffffffffff16611dc484610a34565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ded5750611dec81856119b3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e16826111a0565b73ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906133b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed390613239565b60405180910390fd5b611ee78383836123c2565b611ef2600082611c5f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f429190613669565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f999190613588565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612123848484611df6565b61212f848484846123c7565b61216e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612165906131d9565b60405180910390fd5b50505050565b60606007805461218390613794565b80601f01602080910402602001604051908101604052809291908181526020018280546121af90613794565b80156121fc5780601f106121d1576101008083540402835291602001916121fc565b820191906000526020600020905b8154815290600101906020018083116121df57829003601f168201915b5050505050905090565b6060600082141561224e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612362565b600082905060005b60008214612280578080612269906137f7565b915050600a8261227991906135de565b9150612256565b60008167ffffffffffffffff81111561229c5761229b61392d565b5b6040519080825280601f01601f1916602001820160405280156122ce5781602001600182028036833780820191505090505b5090505b6000851461235b576001826122e79190613669565b9150600a856122f69190613840565b60306123029190613588565b60f81b818381518110612318576123176138fe565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561235491906135de565b94506122d2565b8093505050505b919050565b612371838361255e565b61237e60008484846123c7565b6123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b4906131d9565b60405180910390fd5b505050565b505050565b60006123e88473ffffffffffffffffffffffffffffffffffffffff1661272c565b15612551578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612411611bbf565b8786866040518563ffffffff1660e01b81526004016124339493929190613150565b602060405180830381600087803b15801561244d57600080fd5b505af192505050801561247e57506040513d601f19601f8201168201806040525081019061247b9190612bf9565b60015b612501573d80600081146124ae576040519150601f19603f3d011682016040523d82523d6000602084013e6124b3565b606091505b506000815114156124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f0906131d9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612556565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c590613319565b60405180910390fd5b6125d781611bf3565b15612617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e90613219565b60405180910390fd5b612623600083836123c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126739190613588565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461274b90613794565b90600052602060002090601f01602090048101928261276d57600085556127b4565b82601f1061278657803560ff19168380011785556127b4565b828001600101855582156127b4579182015b828111156127b3578235825591602001919060010190612798565b5b5090506127c191906127c5565b5090565b5b808211156127de5760008160009055506001016127c6565b5090565b60006127f56127f084613514565b6134ef565b9050828152602081018484840111156128115761281061396b565b5b61281c848285613752565b509392505050565b60008135905061283381613f4e565b92915050565b60008083601f84011261284f5761284e613961565b5b8235905067ffffffffffffffff81111561286c5761286b61395c565b5b60208301915083602082028301111561288857612887613966565b5b9250929050565b60008135905061289e81613f65565b92915050565b6000813590506128b381613f7c565b92915050565b6000815190506128c881613f7c565b92915050565b600082601f8301126128e3576128e2613961565b5b81356128f38482602086016127e2565b91505092915050565b60008083601f84011261291257612911613961565b5b8235905067ffffffffffffffff81111561292f5761292e61395c565b5b60208301915083600182028301111561294b5761294a613966565b5b9250929050565b60008135905061296181613f93565b92915050565b60008135905061297681613faa565b92915050565b60006020828403121561299257612991613975565b5b60006129a084828501612824565b91505092915050565b600080604083850312156129c0576129bf613975565b5b60006129ce85828601612824565b92505060206129df85828601612824565b9150509250929050565b600080600060608486031215612a0257612a01613975565b5b6000612a1086828701612824565b9350506020612a2186828701612824565b9250506040612a3286828701612952565b9150509250925092565b60008060008060808587031215612a5657612a55613975565b5b6000612a6487828801612824565b9450506020612a7587828801612824565b9350506040612a8687828801612952565b925050606085013567ffffffffffffffff811115612aa757612aa6613970565b5b612ab3878288016128ce565b91505092959194509250565b60008060408385031215612ad657612ad5613975565b5b6000612ae485828601612824565b9250506020612af58582860161288f565b9150509250929050565b60008060408385031215612b1657612b15613975565b5b6000612b2485828601612824565b9250506020612b3585828601612952565b9150509250929050565b600080600060408486031215612b5857612b57613975565b5b600084013567ffffffffffffffff811115612b7657612b75613970565b5b612b8286828701612839565b93509350506020612b9586828701612967565b9150509250925092565b600060208284031215612bb557612bb4613975565b5b6000612bc38482850161288f565b91505092915050565b600060208284031215612be257612be1613975565b5b6000612bf0848285016128a4565b91505092915050565b600060208284031215612c0f57612c0e613975565b5b6000612c1d848285016128b9565b91505092915050565b60008060208385031215612c3d57612c3c613975565b5b600083013567ffffffffffffffff811115612c5b57612c5a613970565b5b612c67858286016128fc565b92509250509250929050565b600060208284031215612c8957612c88613975565b5b6000612c9784828501612952565b91505092915050565b60008060408385031215612cb757612cb6613975565b5b6000612cc585828601612952565b9250506020612cd685828601612824565b9150509250929050565b600060208284031215612cf657612cf5613975565b5b6000612d0484828501612967565b91505092915050565b612d16816136d1565b82525050565b612d25816136e3565b82525050565b6000612d3682613545565b612d40818561355b565b9350612d50818560208601613761565b612d598161397a565b840191505092915050565b6000612d6f82613550565b612d79818561356c565b9350612d89818560208601613761565b612d928161397a565b840191505092915050565b6000612da882613550565b612db2818561357d565b9350612dc2818560208601613761565b80840191505092915050565b6000612ddb60328361356c565b9150612de68261398b565b604082019050919050565b6000612dfe60268361356c565b9150612e09826139da565b604082019050919050565b6000612e21601c8361356c565b9150612e2c82613a29565b602082019050919050565b6000612e4460248361356c565b9150612e4f82613a52565b604082019050919050565b6000612e6760198361356c565b9150612e7282613aa1565b602082019050919050565b6000612e8a60238361356c565b9150612e9582613aca565b604082019050919050565b6000612ead602c8361356c565b9150612eb882613b19565b604082019050919050565b6000612ed060388361356c565b9150612edb82613b68565b604082019050919050565b6000612ef3602a8361356c565b9150612efe82613bb7565b604082019050919050565b6000612f1660298361356c565b9150612f2182613c06565b604082019050919050565b6000612f3960208361356c565b9150612f4482613c55565b602082019050919050565b6000612f5c602c8361356c565b9150612f6782613c7e565b604082019050919050565b6000612f7f60208361356c565b9150612f8a82613ccd565b602082019050919050565b6000612fa2601b8361356c565b9150612fad82613cf6565b602082019050919050565b6000612fc5601d8361356c565b9150612fd082613d1f565b602082019050919050565b6000612fe860298361356c565b9150612ff382613d48565b604082019050919050565b600061300b602f8361356c565b915061301682613d97565b604082019050919050565b600061302e60218361356c565b915061303982613de6565b604082019050919050565b6000613051601d8361356c565b915061305c82613e35565b602082019050919050565b600061307460338361356c565b915061307f82613e5e565b604082019050919050565b600061309760318361356c565b91506130a282613ead565b604082019050919050565b60006130ba60208361356c565b91506130c582613efc565b602082019050919050565b60006130dd601d8361356c565b91506130e882613f25565b602082019050919050565b6130fc8161373b565b82525050565b61310b81613745565b82525050565b600061311d8285612d9d565b91506131298284612d9d565b91508190509392505050565b600060208201905061314a6000830184612d0d565b92915050565b60006080820190506131656000830187612d0d565b6131726020830186612d0d565b61317f60408301856130f3565b81810360608301526131918184612d2b565b905095945050505050565b60006020820190506131b16000830184612d1c565b92915050565b600060208201905081810360008301526131d18184612d64565b905092915050565b600060208201905081810360008301526131f281612dce565b9050919050565b6000602082019050818103600083015261321281612df1565b9050919050565b6000602082019050818103600083015261323281612e14565b9050919050565b6000602082019050818103600083015261325281612e37565b9050919050565b6000602082019050818103600083015261327281612e5a565b9050919050565b6000602082019050818103600083015261329281612e7d565b9050919050565b600060208201905081810360008301526132b281612ea0565b9050919050565b600060208201905081810360008301526132d281612ec3565b9050919050565b600060208201905081810360008301526132f281612ee6565b9050919050565b6000602082019050818103600083015261331281612f09565b9050919050565b6000602082019050818103600083015261333281612f2c565b9050919050565b6000602082019050818103600083015261335281612f4f565b9050919050565b6000602082019050818103600083015261337281612f72565b9050919050565b6000602082019050818103600083015261339281612f95565b9050919050565b600060208201905081810360008301526133b281612fb8565b9050919050565b600060208201905081810360008301526133d281612fdb565b9050919050565b600060208201905081810360008301526133f281612ffe565b9050919050565b6000602082019050818103600083015261341281613021565b9050919050565b6000602082019050818103600083015261343281613044565b9050919050565b6000602082019050818103600083015261345281613067565b9050919050565b600060208201905081810360008301526134728161308a565b9050919050565b60006020820190508181036000830152613492816130ad565b9050919050565b600060208201905081810360008301526134b2816130d0565b9050919050565b60006020820190506134ce60008301846130f3565b92915050565b60006020820190506134e96000830184613102565b92915050565b60006134f961350a565b905061350582826137c6565b919050565b6000604051905090565b600067ffffffffffffffff82111561352f5761352e61392d565b5b6135388261397a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006135938261373b565b915061359e8361373b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135d3576135d2613871565b5b828201905092915050565b60006135e98261373b565b91506135f48361373b565b925082613604576136036138a0565b5b828204905092915050565b600061361a8261373b565b91506136258361373b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561365e5761365d613871565b5b828202905092915050565b60006136748261373b565b915061367f8361373b565b92508282101561369257613691613871565b5b828203905092915050565b60006136a882613745565b91506136b383613745565b9250828210156136c6576136c5613871565b5b828203905092915050565b60006136dc8261371b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561377f578082015181840152602081019050613764565b8381111561378e576000848401525b50505050565b600060028204905060018216806137ac57607f821691505b602082108114156137c0576137bf6138cf565b5b50919050565b6137cf8261397a565b810181811067ffffffffffffffff821117156137ee576137ed61392d565b5b80604052505050565b60006138028261373b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561383557613834613871565b5b600182019050919050565b600061384b8261373b565b91506138568361373b565b925082613866576138656138a0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43433a2045746865722076616c75652073656e74206973206e6f7420636f727260008201527f6563740000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43433a205265736572766520737570706c792065786365656465640000000000600082015250565b7f43433a204578636565646564206d6178206d696e74207065722074786e000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43433a204d617820746f6b656e20737570706c79206578636565646564000000600082015250565b7f43433a20596f7520646f6e2774206861766520656e6f7567682077686974656c60008201527f697374206d696e74732072656d61696e696e6700000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f43433a2057686974656c697374204d696e74206973206e6f7420616374697665600082015250565b7f43433a205075626c6963204d696e74206973206e6f7420616374697665000000600082015250565b613f57816136d1565b8114613f6257600080fd5b50565b613f6e816136e3565b8114613f7957600080fd5b50565b613f85816136ef565b8114613f9057600080fd5b50565b613f9c8161373b565b8114613fa757600080fd5b50565b613fb381613745565b8114613fbe57600080fd5b5056fea2646970667358221220d2529482fa3a4389bdb058035345c0f77fc046cc2251a9c806deb9ae9c31c51864736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c806370a0823111610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610666578063d2d8cb67146106a3578063e985e9c5146106ce578063f2fde38b1461070b576101d8565b8063a22cb465146105ae578063b8219159146105d7578063b88d4fde14610600578063c04a283614610629576101d8565b80638da5cb5b116100d15780638da5cb5b1461050457806395527a121461052f57806395d89b411461055a57806397495d7114610585576101d8565b806370a082311461045c578063715018a61461049957806373749fbd146104b0578063791d04db146104d9576101d8565b80632db115441161017a57806351b96d921161014957806351b96d92146103af57806355f804b3146103da57806360e85cde146104035780636352211e1461041f576101d8565b80632db115441461032857806332cb6b0c146103445780633ccfd60b1461036f57806342842e0e14610386576101d8565b806306fdde03116101b657806306fdde031461026e578063081812fc14610299578063095ea7b3146102d657806323b872dd146102ff576101d8565b806301ffc9a7146101dd57806303339bcb1461021a57806303d41eb614610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612bcc565b610734565b604051610211919061319c565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190612ca0565b610816565b005b34801561024f57600080fd5b5061025861099c565b60405161026591906134b9565b60405180910390f35b34801561027a57600080fd5b506102836109a2565b60405161029091906131b7565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb9190612c73565b610a34565b6040516102cd9190613135565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612aff565b610ab9565b005b34801561030b57600080fd5b50610326600480360381019061032191906129e9565b610bd1565b005b610342600480360381019061033d9190612c73565b610c31565b005b34801561035057600080fd5b50610359610dbe565b60405161036691906134b9565b60405180910390f35b34801561037b57600080fd5b50610384610dc4565b005b34801561039257600080fd5b506103ad60048036038101906103a891906129e9565b610e8f565b005b3480156103bb57600080fd5b506103c4610eaf565b6040516103d191906134b9565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190612c26565b610eb4565b005b61041d60048036038101906104189190612ce0565b610f46565b005b34801561042b57600080fd5b5061044660048036038101906104419190612c73565b6111a0565b6040516104539190613135565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e919061297c565b611252565b60405161049091906134b9565b60405180910390f35b3480156104a557600080fd5b506104ae61130a565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190612b9f565b611392565b005b3480156104e557600080fd5b506104ee61142b565b6040516104fb919061319c565b60405180910390f35b34801561051057600080fd5b5061051961143e565b6040516105269190613135565b60405180910390f35b34801561053b57600080fd5b50610544611468565b604051610551919061319c565b60405180910390f35b34801561056657600080fd5b5061056f61147b565b60405161057c91906131b7565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a79190612b3f565b61150d565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190612abf565b61162f565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190612b9f565b6117b0565b005b34801561060c57600080fd5b5061062760048036038101906106229190612a3c565b611849565b005b34801561063557600080fd5b50610650600480360381019061064b919061297c565b6118ab565b60405161065d91906134d4565b60405180910390f35b34801561067257600080fd5b5061068d60048036038101906106889190612c73565b611901565b60405161069a91906131b7565b60405180910390f35b3480156106af57600080fd5b506106b86119a8565b6040516106c591906134b9565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f091906129a9565b6119b3565b604051610702919061319c565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d919061297c565b611a47565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ff57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080f575061080e82611b55565b5b9050919050565b61081e611bbf565b73ffffffffffffffffffffffffffffffffffffffff1661083c61143e565b73ffffffffffffffffffffffffffffffffffffffff1614610892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088990613359565b60405180910390fd5b610fa1600b54836108a36008611bc7565b6108ad9190613588565b6108b79190613588565b11156108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef90613419565b60405180910390fd5b600b5482111561093d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093490613379565b60405180910390fd5b81600b600082825461094f9190613669565b9250508190555060005b8281101561099757600061096d6008611bc7565b90506109796008611b3f565b6109838382611bd5565b50808061098f906137f7565b915050610959565b505050565b600b5481565b6060600080546109b190613794565b80601f01602080910402602001604051908101604052809291908181526020018280546109dd90613794565b8015610a2a5780601f106109ff57610100808354040283529160200191610a2a565b820191906000526020600020905b815481529060010190602001808311610a0d57829003601f168201915b5050505050905090565b6000610a3f82611bf3565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590613339565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac4826111a0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c906133f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b54611bbf565b73ffffffffffffffffffffffffffffffffffffffff161480610b835750610b8281610b7d611bbf565b6119b3565b5b610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb9906132b9565b60405180910390fd5b610bcc8383611c5f565b505050565b610be2610bdc611bbf565b82611d18565b610c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1890613459565b60405180910390fd5b610c2c838383611df6565b505050565b600960019054906101000a900460ff16610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7790613499565b60405180910390fd5b610fa1600b5482610c916008611bc7565b610c9b9190613588565b610ca59190613588565b1115610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd90613419565b60405180910390fd5b348166b1a2bc2ec50000610cfa919061360f565b1115610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290613279565b60405180910390fd5b6005811115610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613399565b60405180910390fd5b60005b81811015610dba57610d946008611b3f565b610da733610da26008611bc7565b611bd5565b8080610db2906137f7565b915050610d82565b5050565b610fa181565b610dcc611bbf565b73ffffffffffffffffffffffffffffffffffffffff16610dea61143e565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613359565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e8b573d6000803e3d6000fd5b5050565b610eaa83838360405180602001604052806000815250611849565b505050565b600581565b610ebc611bbf565b73ffffffffffffffffffffffffffffffffffffffff16610eda61143e565b73ffffffffffffffffffffffffffffffffffffffff1614610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613359565b60405180910390fd5b818160079190610f4192919061273f565b505050565b600960009054906101000a900460ff16610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c90613479565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168160ff16111561102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190613439565b60405180910390fd5b610fa1600b548260ff1661103e6008611bc7565b6110489190613588565b6110529190613588565b1115611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90613419565b60405180910390fd5b348160ff1666b1a2bc2ec500006110aa919061360f565b11156110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290613279565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611146919061369d565b92506101000a81548160ff021916908360ff16021790555060005b8160ff1681101561119c576111766008611b3f565b611189336111846008611bc7565b611bd5565b8080611194906137f7565b915050611161565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611249576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611240906132f9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906132d9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611312611bbf565b73ffffffffffffffffffffffffffffffffffffffff1661133061143e565b73ffffffffffffffffffffffffffffffffffffffff1614611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90613359565b60405180910390fd5b6113906000612052565b565b61139a611bbf565b73ffffffffffffffffffffffffffffffffffffffff166113b861143e565b73ffffffffffffffffffffffffffffffffffffffff161461140e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140590613359565b60405180910390fd5b80600960016101000a81548160ff02191690831515021790555050565b600960009054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960019054906101000a900460ff1681565b60606001805461148a90613794565b80601f01602080910402602001604051908101604052809291908181526020018280546114b690613794565b80156115035780601f106114d857610100808354040283529160200191611503565b820191906000526020600020905b8154815290600101906020018083116114e657829003601f168201915b5050505050905090565b611515611bbf565b73ffffffffffffffffffffffffffffffffffffffff1661153361143e565b73ffffffffffffffffffffffffffffffffffffffff1614611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090613359565b60405180910390fd5b60005b838390508110156116295781600a60008686858181106115af576115ae6138fe565b5b90506020020160208101906115c4919061297c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611621906137f7565b91505061158c565b50505050565b611637611bbf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90613259565b60405180910390fd5b80600560006116b2611bbf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661175f611bbf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117a4919061319c565b60405180910390a35050565b6117b8611bbf565b73ffffffffffffffffffffffffffffffffffffffff166117d661143e565b73ffffffffffffffffffffffffffffffffffffffff161461182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182390613359565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b61185a611854611bbf565b83611d18565b611899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189090613459565b60405180910390fd5b6118a584848484612118565b50505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b606061190c82611bf3565b61194b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611942906133d9565b60405180910390fd5b6000611955612174565b9050600081511161197557604051806020016040528060008152506119a0565b8061197f84612206565b604051602001611990929190613111565b6040516020818303038152906040525b915050919050565b66b1a2bc2ec5000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a4f611bbf565b73ffffffffffffffffffffffffffffffffffffffff16611a6d61143e565b73ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba90613359565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a906131f9565b60405180910390fd5b611b3c81612052565b50565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b611bef828260405180602001604052806000815250612367565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cd2836111a0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d2382611bf3565b611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990613299565b60405180910390fd5b6000611d6d836111a0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ddc57508373ffffffffffffffffffffffffffffffffffffffff16611dc484610a34565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ded5750611dec81856119b3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e16826111a0565b73ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906133b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed390613239565b60405180910390fd5b611ee78383836123c2565b611ef2600082611c5f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f429190613669565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f999190613588565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612123848484611df6565b61212f848484846123c7565b61216e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612165906131d9565b60405180910390fd5b50505050565b60606007805461218390613794565b80601f01602080910402602001604051908101604052809291908181526020018280546121af90613794565b80156121fc5780601f106121d1576101008083540402835291602001916121fc565b820191906000526020600020905b8154815290600101906020018083116121df57829003601f168201915b5050505050905090565b6060600082141561224e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612362565b600082905060005b60008214612280578080612269906137f7565b915050600a8261227991906135de565b9150612256565b60008167ffffffffffffffff81111561229c5761229b61392d565b5b6040519080825280601f01601f1916602001820160405280156122ce5781602001600182028036833780820191505090505b5090505b6000851461235b576001826122e79190613669565b9150600a856122f69190613840565b60306123029190613588565b60f81b818381518110612318576123176138fe565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561235491906135de565b94506122d2565b8093505050505b919050565b612371838361255e565b61237e60008484846123c7565b6123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b4906131d9565b60405180910390fd5b505050565b505050565b60006123e88473ffffffffffffffffffffffffffffffffffffffff1661272c565b15612551578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612411611bbf565b8786866040518563ffffffff1660e01b81526004016124339493929190613150565b602060405180830381600087803b15801561244d57600080fd5b505af192505050801561247e57506040513d601f19601f8201168201806040525081019061247b9190612bf9565b60015b612501573d80600081146124ae576040519150601f19603f3d011682016040523d82523d6000602084013e6124b3565b606091505b506000815114156124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f0906131d9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612556565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c590613319565b60405180910390fd5b6125d781611bf3565b15612617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e90613219565b60405180910390fd5b612623600083836123c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126739190613588565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461274b90613794565b90600052602060002090601f01602090048101928261276d57600085556127b4565b82601f1061278657803560ff19168380011785556127b4565b828001600101855582156127b4579182015b828111156127b3578235825591602001919060010190612798565b5b5090506127c191906127c5565b5090565b5b808211156127de5760008160009055506001016127c6565b5090565b60006127f56127f084613514565b6134ef565b9050828152602081018484840111156128115761281061396b565b5b61281c848285613752565b509392505050565b60008135905061283381613f4e565b92915050565b60008083601f84011261284f5761284e613961565b5b8235905067ffffffffffffffff81111561286c5761286b61395c565b5b60208301915083602082028301111561288857612887613966565b5b9250929050565b60008135905061289e81613f65565b92915050565b6000813590506128b381613f7c565b92915050565b6000815190506128c881613f7c565b92915050565b600082601f8301126128e3576128e2613961565b5b81356128f38482602086016127e2565b91505092915050565b60008083601f84011261291257612911613961565b5b8235905067ffffffffffffffff81111561292f5761292e61395c565b5b60208301915083600182028301111561294b5761294a613966565b5b9250929050565b60008135905061296181613f93565b92915050565b60008135905061297681613faa565b92915050565b60006020828403121561299257612991613975565b5b60006129a084828501612824565b91505092915050565b600080604083850312156129c0576129bf613975565b5b60006129ce85828601612824565b92505060206129df85828601612824565b9150509250929050565b600080600060608486031215612a0257612a01613975565b5b6000612a1086828701612824565b9350506020612a2186828701612824565b9250506040612a3286828701612952565b9150509250925092565b60008060008060808587031215612a5657612a55613975565b5b6000612a6487828801612824565b9450506020612a7587828801612824565b9350506040612a8687828801612952565b925050606085013567ffffffffffffffff811115612aa757612aa6613970565b5b612ab3878288016128ce565b91505092959194509250565b60008060408385031215612ad657612ad5613975565b5b6000612ae485828601612824565b9250506020612af58582860161288f565b9150509250929050565b60008060408385031215612b1657612b15613975565b5b6000612b2485828601612824565b9250506020612b3585828601612952565b9150509250929050565b600080600060408486031215612b5857612b57613975565b5b600084013567ffffffffffffffff811115612b7657612b75613970565b5b612b8286828701612839565b93509350506020612b9586828701612967565b9150509250925092565b600060208284031215612bb557612bb4613975565b5b6000612bc38482850161288f565b91505092915050565b600060208284031215612be257612be1613975565b5b6000612bf0848285016128a4565b91505092915050565b600060208284031215612c0f57612c0e613975565b5b6000612c1d848285016128b9565b91505092915050565b60008060208385031215612c3d57612c3c613975565b5b600083013567ffffffffffffffff811115612c5b57612c5a613970565b5b612c67858286016128fc565b92509250509250929050565b600060208284031215612c8957612c88613975565b5b6000612c9784828501612952565b91505092915050565b60008060408385031215612cb757612cb6613975565b5b6000612cc585828601612952565b9250506020612cd685828601612824565b9150509250929050565b600060208284031215612cf657612cf5613975565b5b6000612d0484828501612967565b91505092915050565b612d16816136d1565b82525050565b612d25816136e3565b82525050565b6000612d3682613545565b612d40818561355b565b9350612d50818560208601613761565b612d598161397a565b840191505092915050565b6000612d6f82613550565b612d79818561356c565b9350612d89818560208601613761565b612d928161397a565b840191505092915050565b6000612da882613550565b612db2818561357d565b9350612dc2818560208601613761565b80840191505092915050565b6000612ddb60328361356c565b9150612de68261398b565b604082019050919050565b6000612dfe60268361356c565b9150612e09826139da565b604082019050919050565b6000612e21601c8361356c565b9150612e2c82613a29565b602082019050919050565b6000612e4460248361356c565b9150612e4f82613a52565b604082019050919050565b6000612e6760198361356c565b9150612e7282613aa1565b602082019050919050565b6000612e8a60238361356c565b9150612e9582613aca565b604082019050919050565b6000612ead602c8361356c565b9150612eb882613b19565b604082019050919050565b6000612ed060388361356c565b9150612edb82613b68565b604082019050919050565b6000612ef3602a8361356c565b9150612efe82613bb7565b604082019050919050565b6000612f1660298361356c565b9150612f2182613c06565b604082019050919050565b6000612f3960208361356c565b9150612f4482613c55565b602082019050919050565b6000612f5c602c8361356c565b9150612f6782613c7e565b604082019050919050565b6000612f7f60208361356c565b9150612f8a82613ccd565b602082019050919050565b6000612fa2601b8361356c565b9150612fad82613cf6565b602082019050919050565b6000612fc5601d8361356c565b9150612fd082613d1f565b602082019050919050565b6000612fe860298361356c565b9150612ff382613d48565b604082019050919050565b600061300b602f8361356c565b915061301682613d97565b604082019050919050565b600061302e60218361356c565b915061303982613de6565b604082019050919050565b6000613051601d8361356c565b915061305c82613e35565b602082019050919050565b600061307460338361356c565b915061307f82613e5e565b604082019050919050565b600061309760318361356c565b91506130a282613ead565b604082019050919050565b60006130ba60208361356c565b91506130c582613efc565b602082019050919050565b60006130dd601d8361356c565b91506130e882613f25565b602082019050919050565b6130fc8161373b565b82525050565b61310b81613745565b82525050565b600061311d8285612d9d565b91506131298284612d9d565b91508190509392505050565b600060208201905061314a6000830184612d0d565b92915050565b60006080820190506131656000830187612d0d565b6131726020830186612d0d565b61317f60408301856130f3565b81810360608301526131918184612d2b565b905095945050505050565b60006020820190506131b16000830184612d1c565b92915050565b600060208201905081810360008301526131d18184612d64565b905092915050565b600060208201905081810360008301526131f281612dce565b9050919050565b6000602082019050818103600083015261321281612df1565b9050919050565b6000602082019050818103600083015261323281612e14565b9050919050565b6000602082019050818103600083015261325281612e37565b9050919050565b6000602082019050818103600083015261327281612e5a565b9050919050565b6000602082019050818103600083015261329281612e7d565b9050919050565b600060208201905081810360008301526132b281612ea0565b9050919050565b600060208201905081810360008301526132d281612ec3565b9050919050565b600060208201905081810360008301526132f281612ee6565b9050919050565b6000602082019050818103600083015261331281612f09565b9050919050565b6000602082019050818103600083015261333281612f2c565b9050919050565b6000602082019050818103600083015261335281612f4f565b9050919050565b6000602082019050818103600083015261337281612f72565b9050919050565b6000602082019050818103600083015261339281612f95565b9050919050565b600060208201905081810360008301526133b281612fb8565b9050919050565b600060208201905081810360008301526133d281612fdb565b9050919050565b600060208201905081810360008301526133f281612ffe565b9050919050565b6000602082019050818103600083015261341281613021565b9050919050565b6000602082019050818103600083015261343281613044565b9050919050565b6000602082019050818103600083015261345281613067565b9050919050565b600060208201905081810360008301526134728161308a565b9050919050565b60006020820190508181036000830152613492816130ad565b9050919050565b600060208201905081810360008301526134b2816130d0565b9050919050565b60006020820190506134ce60008301846130f3565b92915050565b60006020820190506134e96000830184613102565b92915050565b60006134f961350a565b905061350582826137c6565b919050565b6000604051905090565b600067ffffffffffffffff82111561352f5761352e61392d565b5b6135388261397a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006135938261373b565b915061359e8361373b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135d3576135d2613871565b5b828201905092915050565b60006135e98261373b565b91506135f48361373b565b925082613604576136036138a0565b5b828204905092915050565b600061361a8261373b565b91506136258361373b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561365e5761365d613871565b5b828202905092915050565b60006136748261373b565b915061367f8361373b565b92508282101561369257613691613871565b5b828203905092915050565b60006136a882613745565b91506136b383613745565b9250828210156136c6576136c5613871565b5b828203905092915050565b60006136dc8261371b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561377f578082015181840152602081019050613764565b8381111561378e576000848401525b50505050565b600060028204905060018216806137ac57607f821691505b602082108114156137c0576137bf6138cf565b5b50919050565b6137cf8261397a565b810181811067ffffffffffffffff821117156137ee576137ed61392d565b5b80604052505050565b60006138028261373b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561383557613834613871565b5b600182019050919050565b600061384b8261373b565b91506138568361373b565b925082613866576138656138a0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43433a2045746865722076616c75652073656e74206973206e6f7420636f727260008201527f6563740000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43433a205265736572766520737570706c792065786365656465640000000000600082015250565b7f43433a204578636565646564206d6178206d696e74207065722074786e000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43433a204d617820746f6b656e20737570706c79206578636565646564000000600082015250565b7f43433a20596f7520646f6e2774206861766520656e6f7567682077686974656c60008201527f697374206d696e74732072656d61696e696e6700000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f43433a2057686974656c697374204d696e74206973206e6f7420616374697665600082015250565b7f43433a205075626c6963204d696e74206973206e6f7420616374697665000000600082015250565b613f57816136d1565b8114613f6257600080fd5b50565b613f6e816136e3565b8114613f7957600080fd5b50565b613f85816136ef565b8114613f9057600080fd5b50565b613f9c8161373b565b8114613fa757600080fd5b50565b613fb381613745565b8114613fbe57600080fd5b5056fea2646970667358221220d2529482fa3a4389bdb058035345c0f77fc046cc2251a9c806deb9ae9c31c51864736f6c63430008070033

Deployed Bytecode Sourcemap

36532:3737:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24333:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39199:485;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37246:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25278:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26837:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26360:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27727:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37392:602;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36922:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40126:140;;;;;;;;;;;;;:::i;:::-;;28137:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36970:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39696:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38006:678;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24972:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24702:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5968:94;;;;;;;;;;;;;:::i;:::-;;39979:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36743:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5317:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36791:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25447:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38958:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27130:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39820:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28393:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38696:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25622:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37016:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27496:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6217:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24333:305;24435:4;24487:25;24472:40;;;:11;:40;;;;:105;;;;24544:33;24529:48;;;:11;:48;;;;24472:105;:158;;;;24594:36;24618:11;24594:23;:36::i;:::-;24472:158;24452:178;;24333:305;;;:::o;39199:485::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36959:4:::1;39315:13;;39311:1;39283:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;:45;;;;:::i;:::-;:59;;39275:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;39398:13;;39393:1;:18;;39385:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39477:1;39460:13;;:18;;;;;;;:::i;:::-;;;;;;;;39493:9;39488:189;39512:1;39508;:5;39488:189;;;39535:15;39553:25;:15;:23;:25::i;:::-;39535:43;;39593:27;:15;:25;:27::i;:::-;39635:32;39645:12;39659:7;39635:9;:32::i;:::-;39520:157;39515:3;;;;;:::i;:::-;;;;39488:189;;;;39199:485:::0;;:::o;37246:33::-;;;;:::o;25278:100::-;25332:13;25365:5;25358:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25278:100;:::o;26837:221::-;26913:7;26941:16;26949:7;26941;:16::i;:::-;26933:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27026:15;:24;27042:7;27026:24;;;;;;;;;;;;;;;;;;;;;27019:31;;26837:221;;;:::o;26360:411::-;26441:13;26457:23;26472:7;26457:14;:23::i;:::-;26441:39;;26505:5;26499:11;;:2;:11;;;;26491:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26599:5;26583:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26608:37;26625:5;26632:12;:10;:12::i;:::-;26608:16;:37::i;:::-;26583:62;26561:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26742:21;26751:2;26755:7;26742:8;:21::i;:::-;26430:341;26360:411;;:::o;27727:339::-;27922:41;27941:12;:10;:12::i;:::-;27955:7;27922:18;:41::i;:::-;27914:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28030:28;28040:4;28046:2;28050:7;28030:9;:28::i;:::-;27727:339;;;:::o;37392:602::-;37473:18;;;;;;;;;;;37465:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36959:4;37582:13;;37572:7;37544:25;:15;:23;:25::i;:::-;:35;;;;:::i;:::-;:51;;;;:::i;:::-;:65;;37536:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;37687:9;37676:7;37054:10;37662:21;;;;:::i;:::-;:34;;37654:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;37008:1;37755:7;:22;;37747:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37837:9;37832:155;37856:7;37852:1;:11;37832:155;;;37885:27;:15;:25;:27::i;:::-;37927:48;37937:10;37949:25;:15;:23;:25::i;:::-;37927:9;:48::i;:::-;37865:3;;;;;:::i;:::-;;;;37832:155;;;;37392:602;:::o;36922:41::-;36959:4;36922:41;:::o;40126:140::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40174:12:::1;40189:21;40174:36;;40229:10;40221:28;;:37;40250:7;40221:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40163:103;40126:140::o:0;28137:185::-;28275:39;28292:4;28298:2;28302:7;28275:39;;;;;;;;;;;;:16;:39::i;:::-;28137:185;;;:::o;36970:39::-;37008:1;36970:39;:::o;39696:112::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39787:13:::1;;39777:7;:23;;;;;;;:::i;:::-;;39696:112:::0;;:::o;38006:678::-;38080:21;;;;;;;;;;;38072:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38169:9;:21;38179:10;38169:21;;;;;;;;;;;;;;;;;;;;;;;;;38158:32;;:7;:32;;;;38150:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;36959:4;38303:13;;38293:7;38265:35;;:25;:15;:23;:25::i;:::-;:35;;;;:::i;:::-;:51;;;;:::i;:::-;:65;;38257:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;38408:9;38397:7;38383:21;;37054:10;38383:21;;;;:::i;:::-;:34;;38375:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;38503:7;38478:9;:21;38488:10;38478:21;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38527:9;38522:155;38546:7;38542:11;;:1;:11;38522:155;;;38575:27;:15;:25;:27::i;:::-;38617:48;38627:10;38639:25;:15;:23;:25::i;:::-;38617:9;:48::i;:::-;38555:3;;;;;:::i;:::-;;;;38522:155;;;;38006:678;:::o;24972:239::-;25044:7;25064:13;25080:7;:16;25088:7;25080:16;;;;;;;;;;;;;;;;;;;;;25064:32;;25132:1;25115:19;;:5;:19;;;;25107:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25198:5;25191:12;;;24972:239;;;:::o;24702:208::-;24774:7;24819:1;24802:19;;:5;:19;;;;24794:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24886:9;:16;24896:5;24886:16;;;;;;;;;;;;;;;;24879:23;;24702:208;;;:::o;5968:94::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6033:21:::1;6051:1;6033:9;:21::i;:::-;5968:94::o:0;39979:135::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40087:19:::1;40066:18;;:40;;;;;;;;;;;;;;;;;;39979:135:::0;:::o;36743:41::-;;;;;;;;;;;;;:::o;5317:87::-;5363:7;5390:6;;;;;;;;;;;5383:13;;5317:87;:::o;36791:38::-;;;;;;;;;;;;;:::o;25447:104::-;25503:13;25536:7;25529:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:104;:::o;38958:229::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39069:9:::1;39064:116;39088:9;;:16;;39084:1;:20;39064:116;;;39152:16;39126:9;:23;39136:9;;39146:1;39136:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39126:23;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;39106:3;;;;;:::i;:::-;;;;39064:116;;;;38958:229:::0;;;:::o;27130:295::-;27245:12;:10;:12::i;:::-;27233:24;;:8;:24;;;;27225:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27345:8;27300:18;:32;27319:12;:10;:12::i;:::-;27300:32;;;;;;;;;;;;;;;:42;27333:8;27300:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27398:8;27369:48;;27384:12;:10;:12::i;:::-;27369:48;;;27408:8;27369:48;;;;;;:::i;:::-;;;;;;;;27130:295;;:::o;39820:147::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39937:22:::1;39913:21;;:46;;;;;;;;;;;;;;;;;;39820:147:::0;:::o;28393:328::-;28568:41;28587:12;:10;:12::i;:::-;28601:7;28568:18;:41::i;:::-;28560:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28674:39;28688:4;28694:2;28698:7;28707:5;28674:13;:39::i;:::-;28393:328;;;;:::o;38696:113::-;38761:5;38786:9;:15;38796:4;38786:15;;;;;;;;;;;;;;;;;;;;;;;;;38779:22;;38696:113;;;:::o;25622:334::-;25695:13;25729:16;25737:7;25729;:16::i;:::-;25721:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25810:21;25834:10;:8;:10::i;:::-;25810:34;;25886:1;25868:7;25862:21;:25;:86;;;;;;;;;;;;;;;;;25914:7;25923:18;:7;:16;:18::i;:::-;25897:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25862:86;25855:93;;;25622:334;;;:::o;37016:48::-;37054:10;37016:48;:::o;27496:164::-;27593:4;27617:18;:25;27636:5;27617:25;;;;;;;;;;;;;;;:35;27643:8;27617:35;;;;;;;;;;;;;;;;;;;;;;;;;27610:42;;27496:164;;;;:::o;6217:192::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6326:1:::1;6306:22;;:8;:22;;;;6298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6382:19;6392:8;6382:9;:19::i;:::-;6217:192:::0;:::o;939:127::-;1046:1;1028:7;:14;;;:19;;;;;;;;;;;939:127;:::o;17303:157::-;17388:4;17427:25;17412:40;;;:11;:40;;;;17405:47;;17303:157;;;:::o;4105:98::-;4158:7;4185:10;4178:17;;4105:98;:::o;817:114::-;882:7;909;:14;;;902:21;;817:114;;;:::o;31215:110::-;31291:26;31301:2;31305:7;31291:26;;;;;;;;;;;;:9;:26::i;:::-;31215:110;;:::o;30231:127::-;30296:4;30348:1;30320:30;;:7;:16;30328:7;30320:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30313:37;;30231:127;;;:::o;34213:174::-;34315:2;34288:15;:24;34304:7;34288:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34371:7;34367:2;34333:46;;34342:23;34357:7;34342:14;:23::i;:::-;34333:46;;;;;;;;;;;;34213:174;;:::o;30525:348::-;30618:4;30643:16;30651:7;30643;:16::i;:::-;30635:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30719:13;30735:23;30750:7;30735:14;:23::i;:::-;30719:39;;30788:5;30777:16;;:7;:16;;;:51;;;;30821:7;30797:31;;:20;30809:7;30797:11;:20::i;:::-;:31;;;30777:51;:87;;;;30832:32;30849:5;30856:7;30832:16;:32::i;:::-;30777:87;30769:96;;;30525:348;;;;:::o;33517:578::-;33676:4;33649:31;;:23;33664:7;33649:14;:23::i;:::-;:31;;;33641:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33759:1;33745:16;;:2;:16;;;;33737:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33815:39;33836:4;33842:2;33846:7;33815:20;:39::i;:::-;33919:29;33936:1;33940:7;33919:8;:29::i;:::-;33980:1;33961:9;:15;33971:4;33961:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34009:1;33992:9;:13;34002:2;33992:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34040:2;34021:7;:16;34029:7;34021:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34079:7;34075:2;34060:27;;34069:4;34060:27;;;;;;;;;;;;33517:578;;;:::o;6417:173::-;6473:16;6492:6;;;;;;;;;;;6473:25;;6518:8;6509:6;;:17;;;;;;;;;;;;;;;;;;6573:8;6542:40;;6563:8;6542:40;;;;;;;;;;;;6462:128;6417:173;:::o;29603:315::-;29760:28;29770:4;29776:2;29780:7;29760:9;:28::i;:::-;29807:48;29830:4;29836:2;29840:7;29849:5;29807:22;:48::i;:::-;29799:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29603:315;;;;:::o;38821:100::-;38873:13;38906:7;38899:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38821:100;:::o;1721:723::-;1777:13;2007:1;1998:5;:10;1994:53;;;2025:10;;;;;;;;;;;;;;;;;;;;;1994:53;2057:12;2072:5;2057:20;;2088:14;2113:78;2128:1;2120:4;:9;2113:78;;2146:8;;;;;:::i;:::-;;;;2177:2;2169:10;;;;;:::i;:::-;;;2113:78;;;2201:19;2233:6;2223:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2201:39;;2251:154;2267:1;2258:5;:10;2251:154;;2295:1;2285:11;;;;;:::i;:::-;;;2362:2;2354:5;:10;;;;:::i;:::-;2341:2;:24;;;;:::i;:::-;2328:39;;2311:6;2318;2311:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2391:2;2382:11;;;;;:::i;:::-;;;2251:154;;;2429:6;2415:21;;;;;1721:723;;;;:::o;31552:321::-;31682:18;31688:2;31692:7;31682:5;:18::i;:::-;31733:54;31764:1;31768:2;31772:7;31781:5;31733:22;:54::i;:::-;31711:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31552:321;;;:::o;36323:126::-;;;;:::o;34952:799::-;35107:4;35128:15;:2;:13;;;:15::i;:::-;35124:620;;;35180:2;35164:36;;;35201:12;:10;:12::i;:::-;35215:4;35221:7;35230:5;35164:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35160:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35423:1;35406:6;:13;:18;35402:272;;;35449:60;;;;;;;;;;:::i;:::-;;;;;;;;35402:272;35624:6;35618:13;35609:6;35605:2;35601:15;35594:38;35160:529;35297:41;;;35287:51;;;:6;:51;;;;35280:58;;;;;35124:620;35728:4;35721:11;;34952:799;;;;;;;:::o;32209:382::-;32303:1;32289:16;;:2;:16;;;;32281:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32362:16;32370:7;32362;:16::i;:::-;32361:17;32353:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32424:45;32453:1;32457:2;32461:7;32424:20;:45::i;:::-;32499:1;32482:9;:13;32492:2;32482:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32530:2;32511:7;:16;32519:7;32511:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32575:7;32571:2;32550:33;;32567:1;32550:33;;;;;;;;;;;;32209:382;;:::o;7363:387::-;7423:4;7631:12;7698:7;7686:20;7678:28;;7741:1;7734:4;:8;7727:15;;;7363:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1959:553::-;2017:8;2027:6;2077:3;2070:4;2062:6;2058:17;2054:27;2044:122;;2085:79;;:::i;:::-;2044:122;2198:6;2185:20;2175:30;;2228:18;2220:6;2217:30;2214:117;;;2250:79;;:::i;:::-;2214:117;2364:4;2356:6;2352:17;2340:29;;2418:3;2410:4;2402:6;2398:17;2388:8;2384:32;2381:41;2378:128;;;2425:79;;:::i;:::-;2378:128;1959:553;;;;;:::o;2518:139::-;2564:5;2602:6;2589:20;2580:29;;2618:33;2645:5;2618:33;:::i;:::-;2518:139;;;;:::o;2663:135::-;2707:5;2745:6;2732:20;2723:29;;2761:31;2786:5;2761:31;:::i;:::-;2663:135;;;;:::o;2804:329::-;2863:6;2912:2;2900:9;2891:7;2887:23;2883:32;2880:119;;;2918:79;;:::i;:::-;2880:119;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;2804:329;;;;:::o;3139:474::-;3207:6;3215;3264:2;3252:9;3243:7;3239:23;3235:32;3232:119;;;3270:79;;:::i;:::-;3232:119;3390:1;3415:53;3460:7;3451:6;3440:9;3436:22;3415:53;:::i;:::-;3405:63;;3361:117;3517:2;3543:53;3588:7;3579:6;3568:9;3564:22;3543:53;:::i;:::-;3533:63;;3488:118;3139:474;;;;;:::o;3619:619::-;3696:6;3704;3712;3761:2;3749:9;3740:7;3736:23;3732:32;3729:119;;;3767:79;;:::i;:::-;3729:119;3887:1;3912:53;3957:7;3948:6;3937:9;3933:22;3912:53;:::i;:::-;3902:63;;3858:117;4014:2;4040:53;4085:7;4076:6;4065:9;4061:22;4040:53;:::i;:::-;4030:63;;3985:118;4142:2;4168:53;4213:7;4204:6;4193:9;4189:22;4168:53;:::i;:::-;4158:63;;4113:118;3619:619;;;;;:::o;4244:943::-;4339:6;4347;4355;4363;4412:3;4400:9;4391:7;4387:23;4383:33;4380:120;;;4419:79;;:::i;:::-;4380:120;4539:1;4564:53;4609:7;4600:6;4589:9;4585:22;4564:53;:::i;:::-;4554:63;;4510:117;4666:2;4692:53;4737:7;4728:6;4717:9;4713:22;4692:53;:::i;:::-;4682:63;;4637:118;4794:2;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;:::i;:::-;4810:63;;4765:118;4950:2;4939:9;4935:18;4922:32;4981:18;4973:6;4970:30;4967:117;;;5003:79;;:::i;:::-;4967:117;5108:62;5162:7;5153:6;5142:9;5138:22;5108:62;:::i;:::-;5098:72;;4893:287;4244:943;;;;;;;:::o;5193:468::-;5258:6;5266;5315:2;5303:9;5294:7;5290:23;5286:32;5283:119;;;5321:79;;:::i;:::-;5283:119;5441:1;5466:53;5511:7;5502:6;5491:9;5487:22;5466:53;:::i;:::-;5456:63;;5412:117;5568:2;5594:50;5636:7;5627:6;5616:9;5612:22;5594:50;:::i;:::-;5584:60;;5539:115;5193:468;;;;;:::o;5667:474::-;5735:6;5743;5792:2;5780:9;5771:7;5767:23;5763:32;5760:119;;;5798:79;;:::i;:::-;5760:119;5918:1;5943:53;5988:7;5979:6;5968:9;5964:22;5943:53;:::i;:::-;5933:63;;5889:117;6045:2;6071:53;6116:7;6107:6;6096:9;6092:22;6071:53;:::i;:::-;6061:63;;6016:118;5667:474;;;;;:::o;6147:700::-;6240:6;6248;6256;6305:2;6293:9;6284:7;6280:23;6276:32;6273:119;;;6311:79;;:::i;:::-;6273:119;6459:1;6448:9;6444:17;6431:31;6489:18;6481:6;6478:30;6475:117;;;6511:79;;:::i;:::-;6475:117;6624:80;6696:7;6687:6;6676:9;6672:22;6624:80;:::i;:::-;6606:98;;;;6402:312;6753:2;6779:51;6822:7;6813:6;6802:9;6798:22;6779:51;:::i;:::-;6769:61;;6724:116;6147:700;;;;;:::o;6853:323::-;6909:6;6958:2;6946:9;6937:7;6933:23;6929:32;6926:119;;;6964:79;;:::i;:::-;6926:119;7084:1;7109:50;7151:7;7142:6;7131:9;7127:22;7109:50;:::i;:::-;7099:60;;7055:114;6853:323;;;;:::o;7182:327::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:52;7484:7;7475:6;7464:9;7460:22;7440:52;:::i;:::-;7430:62;;7386:116;7182:327;;;;:::o;7515:349::-;7584:6;7633:2;7621:9;7612:7;7608:23;7604:32;7601:119;;;7639:79;;:::i;:::-;7601:119;7759:1;7784:63;7839:7;7830:6;7819:9;7815:22;7784:63;:::i;:::-;7774:73;;7730:127;7515:349;;;;:::o;7870:529::-;7941:6;7949;7998:2;7986:9;7977:7;7973:23;7969:32;7966:119;;;8004:79;;:::i;:::-;7966:119;8152:1;8141:9;8137:17;8124:31;8182:18;8174:6;8171:30;8168:117;;;8204:79;;:::i;:::-;8168:117;8317:65;8374:7;8365:6;8354:9;8350:22;8317:65;:::i;:::-;8299:83;;;;8095:297;7870:529;;;;;:::o;8405:329::-;8464:6;8513:2;8501:9;8492:7;8488:23;8484:32;8481:119;;;8519:79;;:::i;:::-;8481:119;8639:1;8664:53;8709:7;8700:6;8689:9;8685:22;8664:53;:::i;:::-;8654:63;;8610:117;8405:329;;;;:::o;8740:474::-;8808:6;8816;8865:2;8853:9;8844:7;8840:23;8836:32;8833:119;;;8871:79;;:::i;:::-;8833:119;8991:1;9016:53;9061:7;9052:6;9041:9;9037:22;9016:53;:::i;:::-;9006:63;;8962:117;9118:2;9144:53;9189:7;9180:6;9169:9;9165:22;9144:53;:::i;:::-;9134:63;;9089:118;8740:474;;;;;:::o;9220:325::-;9277:6;9326:2;9314:9;9305:7;9301:23;9297:32;9294:119;;;9332:79;;:::i;:::-;9294:119;9452:1;9477:51;9520:7;9511:6;9500:9;9496:22;9477:51;:::i;:::-;9467:61;;9423:115;9220:325;;;;:::o;9551:118::-;9638:24;9656:5;9638:24;:::i;:::-;9633:3;9626:37;9551:118;;:::o;9675:109::-;9756:21;9771:5;9756:21;:::i;:::-;9751:3;9744:34;9675:109;;:::o;9790:360::-;9876:3;9904:38;9936:5;9904:38;:::i;:::-;9958:70;10021:6;10016:3;9958:70;:::i;:::-;9951:77;;10037:52;10082:6;10077:3;10070:4;10063:5;10059:16;10037:52;:::i;:::-;10114:29;10136:6;10114:29;:::i;:::-;10109:3;10105:39;10098:46;;9880:270;9790:360;;;;:::o;10156:364::-;10244:3;10272:39;10305:5;10272:39;:::i;:::-;10327:71;10391:6;10386:3;10327:71;:::i;:::-;10320:78;;10407:52;10452:6;10447:3;10440:4;10433:5;10429:16;10407:52;:::i;:::-;10484:29;10506:6;10484:29;:::i;:::-;10479:3;10475:39;10468:46;;10248:272;10156:364;;;;:::o;10526:377::-;10632:3;10660:39;10693:5;10660:39;:::i;:::-;10715:89;10797:6;10792:3;10715:89;:::i;:::-;10708:96;;10813:52;10858:6;10853:3;10846:4;10839:5;10835:16;10813:52;:::i;:::-;10890:6;10885:3;10881:16;10874:23;;10636:267;10526:377;;;;:::o;10909:366::-;11051:3;11072:67;11136:2;11131:3;11072:67;:::i;:::-;11065:74;;11148:93;11237:3;11148:93;:::i;:::-;11266:2;11261:3;11257:12;11250:19;;10909:366;;;:::o;11281:::-;11423:3;11444:67;11508:2;11503:3;11444:67;:::i;:::-;11437:74;;11520:93;11609:3;11520:93;:::i;:::-;11638:2;11633:3;11629:12;11622:19;;11281:366;;;:::o;11653:::-;11795:3;11816:67;11880:2;11875:3;11816:67;:::i;:::-;11809:74;;11892:93;11981:3;11892:93;:::i;:::-;12010:2;12005:3;12001:12;11994:19;;11653:366;;;:::o;12025:::-;12167:3;12188:67;12252:2;12247:3;12188:67;:::i;:::-;12181:74;;12264:93;12353:3;12264:93;:::i;:::-;12382:2;12377:3;12373:12;12366:19;;12025:366;;;:::o;12397:::-;12539:3;12560:67;12624:2;12619:3;12560:67;:::i;:::-;12553:74;;12636:93;12725:3;12636:93;:::i;:::-;12754:2;12749:3;12745:12;12738:19;;12397:366;;;:::o;12769:::-;12911:3;12932:67;12996:2;12991:3;12932:67;:::i;:::-;12925:74;;13008:93;13097:3;13008:93;:::i;:::-;13126:2;13121:3;13117:12;13110:19;;12769:366;;;:::o;13141:::-;13283:3;13304:67;13368:2;13363:3;13304:67;:::i;:::-;13297:74;;13380:93;13469:3;13380:93;:::i;:::-;13498:2;13493:3;13489:12;13482:19;;13141:366;;;:::o;13513:::-;13655:3;13676:67;13740:2;13735:3;13676:67;:::i;:::-;13669:74;;13752:93;13841:3;13752:93;:::i;:::-;13870:2;13865:3;13861:12;13854:19;;13513:366;;;:::o;13885:::-;14027:3;14048:67;14112:2;14107:3;14048:67;:::i;:::-;14041:74;;14124:93;14213:3;14124:93;:::i;:::-;14242:2;14237:3;14233:12;14226:19;;13885:366;;;:::o;14257:::-;14399:3;14420:67;14484:2;14479:3;14420:67;:::i;:::-;14413:74;;14496:93;14585:3;14496:93;:::i;:::-;14614:2;14609:3;14605:12;14598:19;;14257:366;;;:::o;14629:::-;14771:3;14792:67;14856:2;14851:3;14792:67;:::i;:::-;14785:74;;14868:93;14957:3;14868:93;:::i;:::-;14986:2;14981:3;14977:12;14970:19;;14629:366;;;:::o;15001:::-;15143:3;15164:67;15228:2;15223:3;15164:67;:::i;:::-;15157:74;;15240:93;15329:3;15240:93;:::i;:::-;15358:2;15353:3;15349:12;15342:19;;15001:366;;;:::o;15373:::-;15515:3;15536:67;15600:2;15595:3;15536:67;:::i;:::-;15529:74;;15612:93;15701:3;15612:93;:::i;:::-;15730:2;15725:3;15721:12;15714:19;;15373:366;;;:::o;15745:::-;15887:3;15908:67;15972:2;15967:3;15908:67;:::i;:::-;15901:74;;15984:93;16073:3;15984:93;:::i;:::-;16102:2;16097:3;16093:12;16086:19;;15745:366;;;:::o;16117:::-;16259:3;16280:67;16344:2;16339:3;16280:67;:::i;:::-;16273:74;;16356:93;16445:3;16356:93;:::i;:::-;16474:2;16469:3;16465:12;16458:19;;16117:366;;;:::o;16489:::-;16631:3;16652:67;16716:2;16711:3;16652:67;:::i;:::-;16645:74;;16728:93;16817:3;16728:93;:::i;:::-;16846:2;16841:3;16837:12;16830:19;;16489:366;;;:::o;16861:::-;17003:3;17024:67;17088:2;17083:3;17024:67;:::i;:::-;17017:74;;17100:93;17189:3;17100:93;:::i;:::-;17218:2;17213:3;17209:12;17202:19;;16861:366;;;:::o;17233:::-;17375:3;17396:67;17460:2;17455:3;17396:67;:::i;:::-;17389:74;;17472:93;17561:3;17472:93;:::i;:::-;17590:2;17585:3;17581:12;17574:19;;17233:366;;;:::o;17605:::-;17747:3;17768:67;17832:2;17827:3;17768:67;:::i;:::-;17761:74;;17844:93;17933:3;17844:93;:::i;:::-;17962:2;17957:3;17953:12;17946:19;;17605:366;;;:::o;17977:::-;18119:3;18140:67;18204:2;18199:3;18140:67;:::i;:::-;18133:74;;18216:93;18305:3;18216:93;:::i;:::-;18334:2;18329:3;18325:12;18318:19;;17977:366;;;:::o;18349:::-;18491:3;18512:67;18576:2;18571:3;18512:67;:::i;:::-;18505:74;;18588:93;18677:3;18588:93;:::i;:::-;18706:2;18701:3;18697:12;18690:19;;18349:366;;;:::o;18721:::-;18863:3;18884:67;18948:2;18943:3;18884:67;:::i;:::-;18877:74;;18960:93;19049:3;18960:93;:::i;:::-;19078:2;19073:3;19069:12;19062:19;;18721:366;;;:::o;19093:::-;19235:3;19256:67;19320:2;19315:3;19256:67;:::i;:::-;19249:74;;19332:93;19421:3;19332:93;:::i;:::-;19450:2;19445:3;19441:12;19434:19;;19093:366;;;:::o;19465:118::-;19552:24;19570:5;19552:24;:::i;:::-;19547:3;19540:37;19465:118;;:::o;19589:112::-;19672:22;19688:5;19672:22;:::i;:::-;19667:3;19660:35;19589:112;;:::o;19707:435::-;19887:3;19909:95;20000:3;19991:6;19909:95;:::i;:::-;19902:102;;20021:95;20112:3;20103:6;20021:95;:::i;:::-;20014:102;;20133:3;20126:10;;19707:435;;;;;:::o;20148:222::-;20241:4;20279:2;20268:9;20264:18;20256:26;;20292:71;20360:1;20349:9;20345:17;20336:6;20292:71;:::i;:::-;20148:222;;;;:::o;20376:640::-;20571:4;20609:3;20598:9;20594:19;20586:27;;20623:71;20691:1;20680:9;20676:17;20667:6;20623:71;:::i;:::-;20704:72;20772:2;20761:9;20757:18;20748:6;20704:72;:::i;:::-;20786;20854:2;20843:9;20839:18;20830:6;20786:72;:::i;:::-;20905:9;20899:4;20895:20;20890:2;20879:9;20875:18;20868:48;20933:76;21004:4;20995:6;20933:76;:::i;:::-;20925:84;;20376:640;;;;;;;:::o;21022:210::-;21109:4;21147:2;21136:9;21132:18;21124:26;;21160:65;21222:1;21211:9;21207:17;21198:6;21160:65;:::i;:::-;21022:210;;;;:::o;21238:313::-;21351:4;21389:2;21378:9;21374:18;21366:26;;21438:9;21432:4;21428:20;21424:1;21413:9;21409:17;21402:47;21466:78;21539:4;21530:6;21466:78;:::i;:::-;21458:86;;21238:313;;;;:::o;21557:419::-;21723:4;21761:2;21750:9;21746:18;21738:26;;21810:9;21804:4;21800:20;21796:1;21785:9;21781:17;21774:47;21838:131;21964:4;21838:131;:::i;:::-;21830:139;;21557:419;;;:::o;21982:::-;22148:4;22186:2;22175:9;22171:18;22163:26;;22235:9;22229:4;22225:20;22221:1;22210:9;22206:17;22199:47;22263:131;22389:4;22263:131;:::i;:::-;22255:139;;21982:419;;;:::o;22407:::-;22573:4;22611:2;22600:9;22596:18;22588:26;;22660:9;22654:4;22650:20;22646:1;22635:9;22631:17;22624:47;22688:131;22814:4;22688:131;:::i;:::-;22680:139;;22407:419;;;:::o;22832:::-;22998:4;23036:2;23025:9;23021:18;23013:26;;23085:9;23079:4;23075:20;23071:1;23060:9;23056:17;23049:47;23113:131;23239:4;23113:131;:::i;:::-;23105:139;;22832:419;;;:::o;23257:::-;23423:4;23461:2;23450:9;23446:18;23438:26;;23510:9;23504:4;23500:20;23496:1;23485:9;23481:17;23474:47;23538:131;23664:4;23538:131;:::i;:::-;23530:139;;23257:419;;;:::o;23682:::-;23848:4;23886:2;23875:9;23871:18;23863:26;;23935:9;23929:4;23925:20;23921:1;23910:9;23906:17;23899:47;23963:131;24089:4;23963:131;:::i;:::-;23955:139;;23682:419;;;:::o;24107:::-;24273:4;24311:2;24300:9;24296:18;24288:26;;24360:9;24354:4;24350:20;24346:1;24335:9;24331:17;24324:47;24388:131;24514:4;24388:131;:::i;:::-;24380:139;;24107:419;;;:::o;24532:::-;24698:4;24736:2;24725:9;24721:18;24713:26;;24785:9;24779:4;24775:20;24771:1;24760:9;24756:17;24749:47;24813:131;24939:4;24813:131;:::i;:::-;24805:139;;24532:419;;;:::o;24957:::-;25123:4;25161:2;25150:9;25146:18;25138:26;;25210:9;25204:4;25200:20;25196:1;25185:9;25181:17;25174:47;25238:131;25364:4;25238:131;:::i;:::-;25230:139;;24957:419;;;:::o;25382:::-;25548:4;25586:2;25575:9;25571:18;25563:26;;25635:9;25629:4;25625:20;25621:1;25610:9;25606:17;25599:47;25663:131;25789:4;25663:131;:::i;:::-;25655:139;;25382:419;;;:::o;25807:::-;25973:4;26011:2;26000:9;25996:18;25988:26;;26060:9;26054:4;26050:20;26046:1;26035:9;26031:17;26024:47;26088:131;26214:4;26088:131;:::i;:::-;26080:139;;25807:419;;;:::o;26232:::-;26398:4;26436:2;26425:9;26421:18;26413:26;;26485:9;26479:4;26475:20;26471:1;26460:9;26456:17;26449:47;26513:131;26639:4;26513:131;:::i;:::-;26505:139;;26232:419;;;:::o;26657:::-;26823:4;26861:2;26850:9;26846:18;26838:26;;26910:9;26904:4;26900:20;26896:1;26885:9;26881:17;26874:47;26938:131;27064:4;26938:131;:::i;:::-;26930:139;;26657:419;;;:::o;27082:::-;27248:4;27286:2;27275:9;27271:18;27263:26;;27335:9;27329:4;27325:20;27321:1;27310:9;27306:17;27299:47;27363:131;27489:4;27363:131;:::i;:::-;27355:139;;27082:419;;;:::o;27507:::-;27673:4;27711:2;27700:9;27696:18;27688:26;;27760:9;27754:4;27750:20;27746:1;27735:9;27731:17;27724:47;27788:131;27914:4;27788:131;:::i;:::-;27780:139;;27507:419;;;:::o;27932:::-;28098:4;28136:2;28125:9;28121:18;28113:26;;28185:9;28179:4;28175:20;28171:1;28160:9;28156:17;28149:47;28213:131;28339:4;28213:131;:::i;:::-;28205:139;;27932:419;;;:::o;28357:::-;28523:4;28561:2;28550:9;28546:18;28538:26;;28610:9;28604:4;28600:20;28596:1;28585:9;28581:17;28574:47;28638:131;28764:4;28638:131;:::i;:::-;28630:139;;28357:419;;;:::o;28782:::-;28948:4;28986:2;28975:9;28971:18;28963:26;;29035:9;29029:4;29025:20;29021:1;29010:9;29006:17;28999:47;29063:131;29189:4;29063:131;:::i;:::-;29055:139;;28782:419;;;:::o;29207:::-;29373:4;29411:2;29400:9;29396:18;29388:26;;29460:9;29454:4;29450:20;29446:1;29435:9;29431:17;29424:47;29488:131;29614:4;29488:131;:::i;:::-;29480:139;;29207:419;;;:::o;29632:::-;29798:4;29836:2;29825:9;29821:18;29813:26;;29885:9;29879:4;29875:20;29871:1;29860:9;29856:17;29849:47;29913:131;30039:4;29913:131;:::i;:::-;29905:139;;29632:419;;;:::o;30057:::-;30223:4;30261:2;30250:9;30246:18;30238:26;;30310:9;30304:4;30300:20;30296:1;30285:9;30281:17;30274:47;30338:131;30464:4;30338:131;:::i;:::-;30330:139;;30057:419;;;:::o;30482:::-;30648:4;30686:2;30675:9;30671:18;30663:26;;30735:9;30729:4;30725:20;30721:1;30710:9;30706:17;30699:47;30763:131;30889:4;30763:131;:::i;:::-;30755:139;;30482:419;;;:::o;30907:::-;31073:4;31111:2;31100:9;31096:18;31088:26;;31160:9;31154:4;31150:20;31146:1;31135:9;31131:17;31124:47;31188:131;31314:4;31188:131;:::i;:::-;31180:139;;30907:419;;;:::o;31332:222::-;31425:4;31463:2;31452:9;31448:18;31440:26;;31476:71;31544:1;31533:9;31529:17;31520:6;31476:71;:::i;:::-;31332:222;;;;:::o;31560:214::-;31649:4;31687:2;31676:9;31672:18;31664:26;;31700:67;31764:1;31753:9;31749:17;31740:6;31700:67;:::i;:::-;31560:214;;;;:::o;31780:129::-;31814:6;31841:20;;:::i;:::-;31831:30;;31870:33;31898:4;31890:6;31870:33;:::i;:::-;31780:129;;;:::o;31915:75::-;31948:6;31981:2;31975:9;31965:19;;31915:75;:::o;31996:307::-;32057:4;32147:18;32139:6;32136:30;32133:56;;;32169:18;;:::i;:::-;32133:56;32207:29;32229:6;32207:29;:::i;:::-;32199:37;;32291:4;32285;32281:15;32273:23;;31996:307;;;:::o;32309:98::-;32360:6;32394:5;32388:12;32378:22;;32309:98;;;:::o;32413:99::-;32465:6;32499:5;32493:12;32483:22;;32413:99;;;:::o;32518:168::-;32601:11;32635:6;32630:3;32623:19;32675:4;32670:3;32666:14;32651:29;;32518:168;;;;:::o;32692:169::-;32776:11;32810:6;32805:3;32798:19;32850:4;32845:3;32841:14;32826:29;;32692:169;;;;:::o;32867:148::-;32969:11;33006:3;32991:18;;32867:148;;;;:::o;33021:305::-;33061:3;33080:20;33098:1;33080:20;:::i;:::-;33075:25;;33114:20;33132:1;33114:20;:::i;:::-;33109:25;;33268:1;33200:66;33196:74;33193:1;33190:81;33187:107;;;33274:18;;:::i;:::-;33187:107;33318:1;33315;33311:9;33304:16;;33021:305;;;;:::o;33332:185::-;33372:1;33389:20;33407:1;33389:20;:::i;:::-;33384:25;;33423:20;33441:1;33423:20;:::i;:::-;33418:25;;33462:1;33452:35;;33467:18;;:::i;:::-;33452:35;33509:1;33506;33502:9;33497:14;;33332:185;;;;:::o;33523:348::-;33563:7;33586:20;33604:1;33586:20;:::i;:::-;33581:25;;33620:20;33638:1;33620:20;:::i;:::-;33615:25;;33808:1;33740:66;33736:74;33733:1;33730:81;33725:1;33718:9;33711:17;33707:105;33704:131;;;33815:18;;:::i;:::-;33704:131;33863:1;33860;33856:9;33845:20;;33523:348;;;;:::o;33877:191::-;33917:4;33937:20;33955:1;33937:20;:::i;:::-;33932:25;;33971:20;33989:1;33971:20;:::i;:::-;33966:25;;34010:1;34007;34004:8;34001:34;;;34015:18;;:::i;:::-;34001:34;34060:1;34057;34053:9;34045:17;;33877:191;;;;:::o;34074:185::-;34112:4;34132:18;34148:1;34132:18;:::i;:::-;34127:23;;34164:18;34180:1;34164:18;:::i;:::-;34159:23;;34201:1;34198;34195:8;34192:34;;;34206:18;;:::i;:::-;34192:34;34251:1;34248;34244:9;34236:17;;34074:185;;;;:::o;34265:96::-;34302:7;34331:24;34349:5;34331:24;:::i;:::-;34320:35;;34265:96;;;:::o;34367:90::-;34401:7;34444:5;34437:13;34430:21;34419:32;;34367:90;;;:::o;34463:149::-;34499:7;34539:66;34532:5;34528:78;34517:89;;34463:149;;;:::o;34618:126::-;34655:7;34695:42;34688:5;34684:54;34673:65;;34618:126;;;:::o;34750:77::-;34787:7;34816:5;34805:16;;34750:77;;;:::o;34833:86::-;34868:7;34908:4;34901:5;34897:16;34886:27;;34833:86;;;:::o;34925:154::-;35009:6;35004:3;34999;34986:30;35071:1;35062:6;35057:3;35053:16;35046:27;34925:154;;;:::o;35085:307::-;35153:1;35163:113;35177:6;35174:1;35171:13;35163:113;;;35262:1;35257:3;35253:11;35247:18;35243:1;35238:3;35234:11;35227:39;35199:2;35196:1;35192:10;35187:15;;35163:113;;;35294:6;35291:1;35288:13;35285:101;;;35374:1;35365:6;35360:3;35356:16;35349:27;35285:101;35134:258;35085:307;;;:::o;35398:320::-;35442:6;35479:1;35473:4;35469:12;35459:22;;35526:1;35520:4;35516:12;35547:18;35537:81;;35603:4;35595:6;35591:17;35581:27;;35537:81;35665:2;35657:6;35654:14;35634:18;35631:38;35628:84;;;35684:18;;:::i;:::-;35628:84;35449:269;35398:320;;;:::o;35724:281::-;35807:27;35829:4;35807:27;:::i;:::-;35799:6;35795:40;35937:6;35925:10;35922:22;35901:18;35889:10;35886:34;35883:62;35880:88;;;35948:18;;:::i;:::-;35880:88;35988:10;35984:2;35977:22;35767:238;35724:281;;:::o;36011:233::-;36050:3;36073:24;36091:5;36073:24;:::i;:::-;36064:33;;36119:66;36112:5;36109:77;36106:103;;;36189:18;;:::i;:::-;36106:103;36236:1;36229:5;36225:13;36218:20;;36011:233;;;:::o;36250:176::-;36282:1;36299:20;36317:1;36299:20;:::i;:::-;36294:25;;36333:20;36351:1;36333:20;:::i;:::-;36328:25;;36372:1;36362:35;;36377:18;;:::i;:::-;36362:35;36418:1;36415;36411:9;36406:14;;36250:176;;;;:::o;36432:180::-;36480:77;36477:1;36470:88;36577:4;36574:1;36567:15;36601:4;36598:1;36591:15;36618:180;36666:77;36663:1;36656:88;36763:4;36760:1;36753:15;36787:4;36784:1;36777:15;36804:180;36852:77;36849:1;36842:88;36949:4;36946:1;36939:15;36973:4;36970:1;36963:15;36990:180;37038:77;37035:1;37028:88;37135:4;37132:1;37125:15;37159:4;37156:1;37149:15;37176:180;37224:77;37221:1;37214:88;37321:4;37318:1;37311:15;37345:4;37342:1;37335:15;37362:117;37471:1;37468;37461:12;37485:117;37594:1;37591;37584:12;37608:117;37717:1;37714;37707:12;37731:117;37840:1;37837;37830:12;37854:117;37963:1;37960;37953:12;37977:117;38086:1;38083;38076:12;38100:102;38141:6;38192:2;38188:7;38183:2;38176:5;38172:14;38168:28;38158:38;;38100:102;;;:::o;38208:237::-;38348:34;38344:1;38336:6;38332:14;38325:58;38417:20;38412:2;38404:6;38400:15;38393:45;38208:237;:::o;38451:225::-;38591:34;38587:1;38579:6;38575:14;38568:58;38660:8;38655:2;38647:6;38643:15;38636:33;38451:225;:::o;38682:178::-;38822:30;38818:1;38810:6;38806:14;38799:54;38682:178;:::o;38866:223::-;39006:34;39002:1;38994:6;38990:14;38983:58;39075:6;39070:2;39062:6;39058:15;39051:31;38866:223;:::o;39095:175::-;39235:27;39231:1;39223:6;39219:14;39212:51;39095:175;:::o;39276:222::-;39416:34;39412:1;39404:6;39400:14;39393:58;39485:5;39480:2;39472:6;39468:15;39461:30;39276:222;:::o;39504:231::-;39644:34;39640:1;39632:6;39628:14;39621:58;39713:14;39708:2;39700:6;39696:15;39689:39;39504:231;:::o;39741:243::-;39881:34;39877:1;39869:6;39865:14;39858:58;39950:26;39945:2;39937:6;39933:15;39926:51;39741:243;:::o;39990:229::-;40130:34;40126:1;40118:6;40114:14;40107:58;40199:12;40194:2;40186:6;40182:15;40175:37;39990:229;:::o;40225:228::-;40365:34;40361:1;40353:6;40349:14;40342:58;40434:11;40429:2;40421:6;40417:15;40410:36;40225:228;:::o;40459:182::-;40599:34;40595:1;40587:6;40583:14;40576:58;40459:182;:::o;40647:231::-;40787:34;40783:1;40775:6;40771:14;40764:58;40856:14;40851:2;40843:6;40839:15;40832:39;40647:231;:::o;40884:182::-;41024:34;41020:1;41012:6;41008:14;41001:58;40884:182;:::o;41072:177::-;41212:29;41208:1;41200:6;41196:14;41189:53;41072:177;:::o;41255:179::-;41395:31;41391:1;41383:6;41379:14;41372:55;41255:179;:::o;41440:228::-;41580:34;41576:1;41568:6;41564:14;41557:58;41649:11;41644:2;41636:6;41632:15;41625:36;41440:228;:::o;41674:234::-;41814:34;41810:1;41802:6;41798:14;41791:58;41883:17;41878:2;41870:6;41866:15;41859:42;41674:234;:::o;41914:220::-;42054:34;42050:1;42042:6;42038:14;42031:58;42123:3;42118:2;42110:6;42106:15;42099:28;41914:220;:::o;42140:179::-;42280:31;42276:1;42268:6;42264:14;42257:55;42140:179;:::o;42325:238::-;42465:34;42461:1;42453:6;42449:14;42442:58;42534:21;42529:2;42521:6;42517:15;42510:46;42325:238;:::o;42569:236::-;42709:34;42705:1;42697:6;42693:14;42686:58;42778:19;42773:2;42765:6;42761:15;42754:44;42569:236;:::o;42811:182::-;42951:34;42947:1;42939:6;42935:14;42928:58;42811:182;:::o;42999:179::-;43139:31;43135:1;43127:6;43123:14;43116:55;42999:179;:::o;43184:122::-;43257:24;43275:5;43257:24;:::i;:::-;43250:5;43247:35;43237:63;;43296:1;43293;43286:12;43237:63;43184:122;:::o;43312:116::-;43382:21;43397:5;43382:21;:::i;:::-;43375:5;43372:32;43362:60;;43418:1;43415;43408:12;43362:60;43312:116;:::o;43434:120::-;43506:23;43523:5;43506:23;:::i;:::-;43499:5;43496:34;43486:62;;43544:1;43541;43534:12;43486:62;43434:120;:::o;43560:122::-;43633:24;43651:5;43633:24;:::i;:::-;43626:5;43623:35;43613:63;;43672:1;43669;43662:12;43613:63;43560:122;:::o;43688:118::-;43759:22;43775:5;43759:22;:::i;:::-;43752:5;43749:33;43739:61;;43796:1;43793;43786:12;43739:61;43688:118;:::o

Swarm Source

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