ETH Price: $3,455.09 (+0.02%)
Gas: 5 Gwei

Token

CryptoFreak (FREAK)
 

Overview

Max Total Supply

249 FREAK

Holders

159

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
vonsoh.eth
Balance
1 FREAK
0xdD32231c664f6e3456e81ec6c27C6f429C7dc3b3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoFreaks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-23
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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


pragma solidity ^0.8.0;


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

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


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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


pragma solidity ^0.8.0;


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

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

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

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


pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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/math/SafeMath.sol


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/cryptofreaks.sol


pragma solidity ^0.8.0;




contract CryptoFreaks is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    uint public constant MAX_CRYPTOFREAKS = 250;
    bool public frozen = false;
    string private _baseURIextended;
    
    mapping(uint => address) private holders;

    constructor(string memory baseURI) ERC721("CryptoFreak","FREAK")  {
        setBaseURI(baseURI);
    }
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    function freezeMetadata() public onlyOwner {
        frozen = true;
    }
    
    function setBaseURI(string memory baseURI_) public onlyOwner {
        require(frozen == false, "Metadata is frozen");
        _baseURIextended = baseURI_;
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory base = _baseURI();
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
    
    function setHolders(uint256[] calldata token_ids, address[] calldata addresses) external onlyOwner {
        require(token_ids.length == addresses.length, "Length of token ids must match length of addresses");
        for (uint i = 0; i < token_ids.length; i++) {
            setHolder(token_ids[i], addresses[i]);
        }
    }
    
    function setHolder(uint256 token_id, address addr) public onlyOwner {
        require(token_id > 0, "TokenID must be greater than 0");
        require(token_id <= MAX_CRYPTOFREAKS, "TokenID must be less than or equal to 250");
        require(!_exists(token_id), "Token has already been minted");
        holders[token_id] = addr;
    }
    
    function getHolder(uint256 token_id) external view virtual returns (address) {
        return holders[token_id];
    }
    
    function mint(uint256[] calldata token_ids) external onlyOwner {
        require(totalSupply().add(token_ids.length) < MAX_CRYPTOFREAKS, "Exceeds MAX_CRYPTOFREAKS");
        
        for (uint i = 0; i < token_ids.length; i++) {
            _mint(token_ids[i]);
        }
    }
    
    function _mint(uint256 token_id) private onlyOwner {
        require(!_exists(token_id), "Token has already been minted");
        address recipient = holders[token_id];
        require(recipient != address(0), "Cannot mint to zero address");
        _safeMint(recipient, token_id);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_CRYPTOFREAKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"token_id","type":"uint256"}],"name":"getHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"token_ids","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"setHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"token_ids","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162004dcb38038062004dcb833981810160405281019062000052919062000454565b6040518060400160405280600b81526020017f43727970746f467265616b0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f465245414b0000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d692919062000326565b508060019080519060200190620000ef92919062000326565b50505062000112620001066200012a60201b60201c565b6200013260201b60201c565b6200012381620001f860201b60201c565b506200071e565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002086200012a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200022e620002fc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000287576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027e9062000515565b60405180910390fd5b60001515600a60149054906101000a900460ff16151514620002e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d790620004f3565b60405180910390fd5b80600b9080519060200190620002f892919062000326565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200033490620005dd565b90600052602060002090601f016020900481019282620003585760008555620003a4565b82601f106200037357805160ff1916838001178555620003a4565b82800160010185558215620003a4579182015b82811115620003a357825182559160200191906001019062000386565b5b509050620003b39190620003b7565b5090565b5b80821115620003d2576000816000905550600101620003b8565b5090565b6000620003ed620003e78462000560565b62000537565b9050828152602081018484840111156200040c576200040b620006ac565b5b62000419848285620005a7565b509392505050565b600082601f830112620004395762000438620006a7565b5b81516200044b848260208601620003d6565b91505092915050565b6000602082840312156200046d576200046c620006b6565b5b600082015167ffffffffffffffff8111156200048e576200048d620006b1565b5b6200049c8482850162000421565b91505092915050565b6000620004b460128362000596565b9150620004c182620006cc565b602082019050919050565b6000620004db60208362000596565b9150620004e882620006f5565b602082019050919050565b600060208201905081810360008301526200050e81620004a5565b9050919050565b600060208201905081810360008301526200053081620004cc565b9050919050565b60006200054362000556565b905062000551828262000613565b919050565b6000604051905090565b600067ffffffffffffffff8211156200057e576200057d62000678565b5b6200058982620006bb565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005c7578082015181840152602081019050620005aa565b83811115620005d7576000848401525b50505050565b60006002820490506001821680620005f657607f821691505b602082108114156200060d576200060c62000649565b5b50919050565b6200061e82620006bb565b810181811067ffffffffffffffff8211171562000640576200063f62000678565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d657461646174612069732066726f7a656e0000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61469d806200072e6000396000f3fe6080604052600436106101c25760003560e01c8063715018a6116100f7578063c87b56dd11610095578063ea79942111610064578063ea79942114610657578063edadc3bd14610682578063f2fde38b146106ab578063f8e93ef9146106d4576101c2565b8063c87b56dd14610589578063d111515d146105c6578063e8a96b46146105dd578063e985e9c51461061a576101c2565b80638da5cb5b116100d15780638da5cb5b146104e157806395d89b411461050c578063a22cb46514610537578063b88d4fde14610560576101c2565b8063715018a6146104835780638462151c1461049a578063853828b6146104d7576101c2565b80632ce62e50116101645780634f6ccce71161013e5780634f6ccce7146103a357806355f804b3146103e05780636352211e1461040957806370a0823114610446576101c2565b80632ce62e50146103145780632f745c591461033d57806342842e0e1461037a576101c2565b8063081812fc116101a0578063081812fc1461025a578063095ea7b31461029757806318160ddd146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c7578063054f7d9c1461020457806306fdde031461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e9919061311b565b6106fd565b6040516101fb9190613798565b60405180910390f35b34801561021057600080fd5b50610219610777565b6040516102269190613798565b60405180910390f35b34801561023b57600080fd5b5061024461078a565b60405161025191906137b3565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c91906131be565b61081c565b60405161028e919061370f565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b9919061300d565b6108a1565b005b3480156102cc57600080fd5b506102d56109b9565b6040516102e29190613af5565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612ef7565b6109c6565b005b34801561032057600080fd5b5061033b600480360381019061033691906131eb565b610a26565b005b34801561034957600080fd5b50610364600480360381019061035f919061300d565b610bc8565b6040516103719190613af5565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190612ef7565b610c6d565b005b3480156103af57600080fd5b506103ca60048036038101906103c591906131be565b610c8d565b6040516103d79190613af5565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190613175565b610cfe565b005b34801561041557600080fd5b50610430600480360381019061042b91906131be565b610dea565b60405161043d919061370f565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190612e8a565b610e9c565b60405161047a9190613af5565b60405180910390f35b34801561048f57600080fd5b50610498610f54565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190612e8a565b610fdc565b6040516104ce9190613776565b60405180910390f35b6104df6110e6565b005b3480156104ed57600080fd5b506104f66111a2565b604051610503919061370f565b60405180910390f35b34801561051857600080fd5b506105216111cc565b60405161052e91906137b3565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190612fcd565b61125e565b005b34801561056c57600080fd5b5061058760048036038101906105829190612f4a565b6113df565b005b34801561059557600080fd5b506105b060048036038101906105ab91906131be565b611441565b6040516105bd91906137b3565b60405180910390f35b3480156105d257600080fd5b506105db6114c9565b005b3480156105e957600080fd5b5061060460048036038101906105ff91906131be565b611562565b604051610611919061370f565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190612eb7565b61159f565b60405161064e9190613798565b60405180910390f35b34801561066357600080fd5b5061066c611633565b6040516106799190613af5565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a4919061309a565b611638565b005b3480156106b757600080fd5b506106d260048036038101906106cd9190612e8a565b61176e565b005b3480156106e057600080fd5b506106fb60048036038101906106f6919061304d565b611866565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610770575061076f82611989565b5b9050919050565b600a60149054906101000a900460ff1681565b60606000805461079990613d84565b80601f01602080910402602001604051908101604052809291908181526020018280546107c590613d84565b80156108125780601f106107e757610100808354040283529160200191610812565b820191906000526020600020905b8154815290600101906020018083116107f557829003601f168201915b5050505050905090565b600061082782611a6b565b610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d906139d5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ac82610dea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613a55565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093c611ad7565b73ffffffffffffffffffffffffffffffffffffffff16148061096b575061096a81610965611ad7565b61159f565b5b6109aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a190613935565b60405180910390fd5b6109b48383611adf565b505050565b6000600880549050905090565b6109d76109d1611ad7565b82611b98565b610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d90613a75565b60405180910390fd5b610a21838383611c76565b505050565b610a2e611ad7565b73ffffffffffffffffffffffffffffffffffffffff16610a4c6111a2565b73ffffffffffffffffffffffffffffffffffffffff1614610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a99906139f5565b60405180910390fd5b60008211610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90613ad5565b60405180910390fd5b60fa821115610b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2090613ab5565b60405180910390fd5b610b3282611a6b565b15610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990613995565b60405180910390fd5b80600c600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000610bd383610e9c565b8210610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b906137d5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c88838383604051806020016040528060008152506113df565b505050565b6000610c976109b9565b8210610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90613a95565b60405180910390fd5b60088281548110610cec57610ceb613f1d565b5b90600052602060002001549050919050565b610d06611ad7565b73ffffffffffffffffffffffffffffffffffffffff16610d246111a2565b73ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906139f5565b60405180910390fd5b60001515600a60149054906101000a900460ff16151514610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790613835565b60405180910390fd5b80600b9080519060200190610de6929190612bf2565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613975565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613955565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f5c611ad7565b73ffffffffffffffffffffffffffffffffffffffff16610f7a6111a2565b73ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc7906139f5565b60405180910390fd5b610fda6000611ed2565b565b60606000610fe983610e9c565b9050600081141561104657600067ffffffffffffffff81111561100f5761100e613f4c565b5b60405190808252806020026020018201604052801561103d5781602001602082028036833780820191505090505b509150506110e1565b60008167ffffffffffffffff81111561106257611061613f4c565b5b6040519080825280602002602001820160405280156110905781602001602082028036833780820191505090505b50905060005b828110156110da576110a88582610bc8565b8282815181106110bb576110ba613f1d565b5b60200260200101818152505080806110d290613de7565b915050611096565b8193505050505b919050565b6110ee611ad7565b73ffffffffffffffffffffffffffffffffffffffff1661110c6111a2565b73ffffffffffffffffffffffffffffffffffffffff1614611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906139f5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506111a057600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111db90613d84565b80601f016020809104026020016040519081016040528092919081815260200182805461120790613d84565b80156112545780601f1061122957610100808354040283529160200191611254565b820191906000526020600020905b81548152906001019060200180831161123757829003601f168201915b5050505050905090565b611266611ad7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb906138d5565b60405180910390fd5b80600560006112e1611ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661138e611ad7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d39190613798565b60405180910390a35050565b6113f06113ea611ad7565b83611b98565b61142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690613a75565b60405180910390fd5b61143b84848484611f98565b50505050565b606061144c82611a6b565b61148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613a35565b60405180910390fd5b6000611495611ff4565b9050806114a184612086565b6040516020016114b29291906136eb565b604051602081830303815290604052915050919050565b6114d1611ad7565b73ffffffffffffffffffffffffffffffffffffffff166114ef6111a2565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c906139f5565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60fa81565b611640611ad7565b73ffffffffffffffffffffffffffffffffffffffff1661165e6111a2565b73ffffffffffffffffffffffffffffffffffffffff16146116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab906139f5565b60405180910390fd5b8181905084849050146116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f390613895565b60405180910390fd5b60005b84849050811015611767576117548585838181106117205761171f613f1d565b5b9050602002013584848481811061173a57611739613f1d565b5b905060200201602081019061174f9190612e8a565b610a26565b808061175f90613de7565b9150506116ff565b5050505050565b611776611ad7565b73ffffffffffffffffffffffffffffffffffffffff166117946111a2565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e1906139f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613815565b60405180910390fd5b61186381611ed2565b50565b61186e611ad7565b73ffffffffffffffffffffffffffffffffffffffff1661188c6111a2565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d9906139f5565b60405180910390fd5b60fa611901838390506118f36109b9565b6121e790919063ffffffff16565b10611941576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611938906138f5565b60405180910390fd5b60005b828290508110156119845761197183838381811061196557611964613f1d565b5b905060200201356121fd565b808061197c90613de7565b915050611944565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a5457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a645750611a6382612378565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5283610dea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ba382611a6b565b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613915565b60405180910390fd5b6000611bed83610dea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c5c57508373ffffffffffffffffffffffffffffffffffffffff16611c448461081c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c6d5750611c6c818561159f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c9682610dea565b73ffffffffffffffffffffffffffffffffffffffff1614611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce390613a15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d53906138b5565b60405180910390fd5b611d678383836123e2565b611d72600082611adf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc29190613c9a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e199190613c13565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fa3848484611c76565b611faf848484846124f6565b611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906137f5565b60405180910390fd5b50505050565b6060600b805461200390613d84565b80601f016020809104026020016040519081016040528092919081815260200182805461202f90613d84565b801561207c5780601f106120515761010080835404028352916020019161207c565b820191906000526020600020905b81548152906001019060200180831161205f57829003601f168201915b5050505050905090565b606060008214156120ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121e2565b600082905060005b600082146121005780806120e990613de7565b915050600a826120f99190613c69565b91506120d6565b60008167ffffffffffffffff81111561211c5761211b613f4c565b5b6040519080825280601f01601f19166020018201604052801561214e5781602001600182028036833780820191505090505b5090505b600085146121db576001826121679190613c9a565b9150600a856121769190613e30565b60306121829190613c13565b60f81b81838151811061219857612197613f1d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121d49190613c69565b9450612152565b8093505050505b919050565b600081836121f59190613c13565b905092915050565b612205611ad7565b73ffffffffffffffffffffffffffffffffffffffff166122236111a2565b73ffffffffffffffffffffffffffffffffffffffff1614612279576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612270906139f5565b60405180910390fd5b61228281611a6b565b156122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b990613995565b60405180910390fd5b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236190613875565b60405180910390fd5b612374818361268d565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123ed8383836126ab565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124305761242b816126b0565b61246f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461246e5761246d83826126f9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124b2576124ad81612866565b6124f1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124f0576124ef8282612937565b5b5b505050565b60006125178473ffffffffffffffffffffffffffffffffffffffff166129b6565b15612680578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612540611ad7565b8786866040518563ffffffff1660e01b8152600401612562949392919061372a565b602060405180830381600087803b15801561257c57600080fd5b505af19250505080156125ad57506040513d601f19601f820116820180604052508101906125aa9190613148565b60015b612630573d80600081146125dd576040519150601f19603f3d011682016040523d82523d6000602084013e6125e2565b606091505b50600081511415612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f906137f5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612685565b600190505b949350505050565b6126a78282604051806020016040528060008152506129c9565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161270684610e9c565b6127109190613c9a565b90506000600760008481526020019081526020016000205490508181146127f5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061287a9190613c9a565b90506000600960008481526020019081526020016000205490506000600883815481106128aa576128a9613f1d565b5b9060005260206000200154905080600883815481106128cc576128cb613f1d565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061291b5761291a613eee565b5b6001900381819060005260206000200160009055905550505050565b600061294283610e9c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6129d38383612a24565b6129e060008484846124f6565b612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a16906137f5565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b906139b5565b60405180910390fd5b612a9d81611a6b565b15612add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad490613855565b60405180910390fd5b612ae9600083836123e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b399190613c13565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612bfe90613d84565b90600052602060002090601f016020900481019282612c205760008555612c67565b82601f10612c3957805160ff1916838001178555612c67565b82800160010185558215612c67579182015b82811115612c66578251825591602001919060010190612c4b565b5b509050612c749190612c78565b5090565b5b80821115612c91576000816000905550600101612c79565b5090565b6000612ca8612ca384613b35565b613b10565b905082815260208101848484011115612cc457612cc3613f8a565b5b612ccf848285613d42565b509392505050565b6000612cea612ce584613b66565b613b10565b905082815260208101848484011115612d0657612d05613f8a565b5b612d11848285613d42565b509392505050565b600081359050612d288161460b565b92915050565b60008083601f840112612d4457612d43613f80565b5b8235905067ffffffffffffffff811115612d6157612d60613f7b565b5b602083019150836020820283011115612d7d57612d7c613f85565b5b9250929050565b60008083601f840112612d9a57612d99613f80565b5b8235905067ffffffffffffffff811115612db757612db6613f7b565b5b602083019150836020820283011115612dd357612dd2613f85565b5b9250929050565b600081359050612de981614622565b92915050565b600081359050612dfe81614639565b92915050565b600081519050612e1381614639565b92915050565b600082601f830112612e2e57612e2d613f80565b5b8135612e3e848260208601612c95565b91505092915050565b600082601f830112612e5c57612e5b613f80565b5b8135612e6c848260208601612cd7565b91505092915050565b600081359050612e8481614650565b92915050565b600060208284031215612ea057612e9f613f94565b5b6000612eae84828501612d19565b91505092915050565b60008060408385031215612ece57612ecd613f94565b5b6000612edc85828601612d19565b9250506020612eed85828601612d19565b9150509250929050565b600080600060608486031215612f1057612f0f613f94565b5b6000612f1e86828701612d19565b9350506020612f2f86828701612d19565b9250506040612f4086828701612e75565b9150509250925092565b60008060008060808587031215612f6457612f63613f94565b5b6000612f7287828801612d19565b9450506020612f8387828801612d19565b9350506040612f9487828801612e75565b925050606085013567ffffffffffffffff811115612fb557612fb4613f8f565b5b612fc187828801612e19565b91505092959194509250565b60008060408385031215612fe457612fe3613f94565b5b6000612ff285828601612d19565b925050602061300385828601612dda565b9150509250929050565b6000806040838503121561302457613023613f94565b5b600061303285828601612d19565b925050602061304385828601612e75565b9150509250929050565b6000806020838503121561306457613063613f94565b5b600083013567ffffffffffffffff81111561308257613081613f8f565b5b61308e85828601612d84565b92509250509250929050565b600080600080604085870312156130b4576130b3613f94565b5b600085013567ffffffffffffffff8111156130d2576130d1613f8f565b5b6130de87828801612d84565b9450945050602085013567ffffffffffffffff81111561310157613100613f8f565b5b61310d87828801612d2e565b925092505092959194509250565b60006020828403121561313157613130613f94565b5b600061313f84828501612def565b91505092915050565b60006020828403121561315e5761315d613f94565b5b600061316c84828501612e04565b91505092915050565b60006020828403121561318b5761318a613f94565b5b600082013567ffffffffffffffff8111156131a9576131a8613f8f565b5b6131b584828501612e47565b91505092915050565b6000602082840312156131d4576131d3613f94565b5b60006131e284828501612e75565b91505092915050565b6000806040838503121561320257613201613f94565b5b600061321085828601612e75565b925050602061322185828601612d19565b9150509250929050565b600061323783836136cd565b60208301905092915050565b61324c81613cce565b82525050565b600061325d82613ba7565b6132678185613bd5565b935061327283613b97565b8060005b838110156132a357815161328a888261322b565b975061329583613bc8565b925050600181019050613276565b5085935050505092915050565b6132b981613ce0565b82525050565b60006132ca82613bb2565b6132d48185613be6565b93506132e4818560208601613d51565b6132ed81613f99565b840191505092915050565b600061330382613bbd565b61330d8185613bf7565b935061331d818560208601613d51565b61332681613f99565b840191505092915050565b600061333c82613bbd565b6133468185613c08565b9350613356818560208601613d51565b80840191505092915050565b600061336f602b83613bf7565b915061337a82613faa565b604082019050919050565b6000613392603283613bf7565b915061339d82613ff9565b604082019050919050565b60006133b5602683613bf7565b91506133c082614048565b604082019050919050565b60006133d8601283613bf7565b91506133e382614097565b602082019050919050565b60006133fb601c83613bf7565b9150613406826140c0565b602082019050919050565b600061341e601b83613bf7565b9150613429826140e9565b602082019050919050565b6000613441603283613bf7565b915061344c82614112565b604082019050919050565b6000613464602483613bf7565b915061346f82614161565b604082019050919050565b6000613487601983613bf7565b9150613492826141b0565b602082019050919050565b60006134aa601883613bf7565b91506134b5826141d9565b602082019050919050565b60006134cd602c83613bf7565b91506134d882614202565b604082019050919050565b60006134f0603883613bf7565b91506134fb82614251565b604082019050919050565b6000613513602a83613bf7565b915061351e826142a0565b604082019050919050565b6000613536602983613bf7565b9150613541826142ef565b604082019050919050565b6000613559601d83613bf7565b91506135648261433e565b602082019050919050565b600061357c602083613bf7565b915061358782614367565b602082019050919050565b600061359f602c83613bf7565b91506135aa82614390565b604082019050919050565b60006135c2602083613bf7565b91506135cd826143df565b602082019050919050565b60006135e5602983613bf7565b91506135f082614408565b604082019050919050565b6000613608602f83613bf7565b915061361382614457565b604082019050919050565b600061362b602183613bf7565b9150613636826144a6565b604082019050919050565b600061364e603183613bf7565b9150613659826144f5565b604082019050919050565b6000613671602c83613bf7565b915061367c82614544565b604082019050919050565b6000613694602983613bf7565b915061369f82614593565b604082019050919050565b60006136b7601e83613bf7565b91506136c2826145e2565b602082019050919050565b6136d681613d38565b82525050565b6136e581613d38565b82525050565b60006136f78285613331565b91506137038284613331565b91508190509392505050565b60006020820190506137246000830184613243565b92915050565b600060808201905061373f6000830187613243565b61374c6020830186613243565b61375960408301856136dc565b818103606083015261376b81846132bf565b905095945050505050565b600060208201905081810360008301526137908184613252565b905092915050565b60006020820190506137ad60008301846132b0565b92915050565b600060208201905081810360008301526137cd81846132f8565b905092915050565b600060208201905081810360008301526137ee81613362565b9050919050565b6000602082019050818103600083015261380e81613385565b9050919050565b6000602082019050818103600083015261382e816133a8565b9050919050565b6000602082019050818103600083015261384e816133cb565b9050919050565b6000602082019050818103600083015261386e816133ee565b9050919050565b6000602082019050818103600083015261388e81613411565b9050919050565b600060208201905081810360008301526138ae81613434565b9050919050565b600060208201905081810360008301526138ce81613457565b9050919050565b600060208201905081810360008301526138ee8161347a565b9050919050565b6000602082019050818103600083015261390e8161349d565b9050919050565b6000602082019050818103600083015261392e816134c0565b9050919050565b6000602082019050818103600083015261394e816134e3565b9050919050565b6000602082019050818103600083015261396e81613506565b9050919050565b6000602082019050818103600083015261398e81613529565b9050919050565b600060208201905081810360008301526139ae8161354c565b9050919050565b600060208201905081810360008301526139ce8161356f565b9050919050565b600060208201905081810360008301526139ee81613592565b9050919050565b60006020820190508181036000830152613a0e816135b5565b9050919050565b60006020820190508181036000830152613a2e816135d8565b9050919050565b60006020820190508181036000830152613a4e816135fb565b9050919050565b60006020820190508181036000830152613a6e8161361e565b9050919050565b60006020820190508181036000830152613a8e81613641565b9050919050565b60006020820190508181036000830152613aae81613664565b9050919050565b60006020820190508181036000830152613ace81613687565b9050919050565b60006020820190508181036000830152613aee816136aa565b9050919050565b6000602082019050613b0a60008301846136dc565b92915050565b6000613b1a613b2b565b9050613b268282613db6565b919050565b6000604051905090565b600067ffffffffffffffff821115613b5057613b4f613f4c565b5b613b5982613f99565b9050602081019050919050565b600067ffffffffffffffff821115613b8157613b80613f4c565b5b613b8a82613f99565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c1e82613d38565b9150613c2983613d38565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c5e57613c5d613e61565b5b828201905092915050565b6000613c7482613d38565b9150613c7f83613d38565b925082613c8f57613c8e613e90565b5b828204905092915050565b6000613ca582613d38565b9150613cb083613d38565b925082821015613cc357613cc2613e61565b5b828203905092915050565b6000613cd982613d18565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d6f578082015181840152602081019050613d54565b83811115613d7e576000848401525b50505050565b60006002820490506001821680613d9c57607f821691505b60208210811415613db057613daf613ebf565b5b50919050565b613dbf82613f99565b810181811067ffffffffffffffff82111715613dde57613ddd613f4c565b5b80604052505050565b6000613df282613d38565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e2557613e24613e61565b5b600182019050919050565b6000613e3b82613d38565b9150613e4683613d38565b925082613e5657613e55613e90565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d657461646174612069732066726f7a656e0000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f74206d696e7420746f207a65726f20616464726573730000000000600082015250565b7f4c656e677468206f6620746f6b656e20696473206d757374206d61746368206c60008201527f656e677468206f66206164647265737365730000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45786365656473204d41585f43525950544f465245414b530000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f546f6b656e2068617320616c7265616479206265656e206d696e746564000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546f6b656e4944206d757374206265206c657373207468616e206f722065717560008201527f616c20746f203235300000000000000000000000000000000000000000000000602082015250565b7f546f6b656e4944206d7573742062652067726561746572207468616e20300000600082015250565b61461481613cce565b811461461f57600080fd5b50565b61462b81613ce0565b811461463657600080fd5b50565b61464281613cec565b811461464d57600080fd5b50565b61465981613d38565b811461466457600080fd5b5056fea26469706673582212209c8a029fdd6a655969bd8a3c40b119b62959f7b9fac1f11df79961d65f45690d64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101c25760003560e01c8063715018a6116100f7578063c87b56dd11610095578063ea79942111610064578063ea79942114610657578063edadc3bd14610682578063f2fde38b146106ab578063f8e93ef9146106d4576101c2565b8063c87b56dd14610589578063d111515d146105c6578063e8a96b46146105dd578063e985e9c51461061a576101c2565b80638da5cb5b116100d15780638da5cb5b146104e157806395d89b411461050c578063a22cb46514610537578063b88d4fde14610560576101c2565b8063715018a6146104835780638462151c1461049a578063853828b6146104d7576101c2565b80632ce62e50116101645780634f6ccce71161013e5780634f6ccce7146103a357806355f804b3146103e05780636352211e1461040957806370a0823114610446576101c2565b80632ce62e50146103145780632f745c591461033d57806342842e0e1461037a576101c2565b8063081812fc116101a0578063081812fc1461025a578063095ea7b31461029757806318160ddd146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c7578063054f7d9c1461020457806306fdde031461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e9919061311b565b6106fd565b6040516101fb9190613798565b60405180910390f35b34801561021057600080fd5b50610219610777565b6040516102269190613798565b60405180910390f35b34801561023b57600080fd5b5061024461078a565b60405161025191906137b3565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c91906131be565b61081c565b60405161028e919061370f565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b9919061300d565b6108a1565b005b3480156102cc57600080fd5b506102d56109b9565b6040516102e29190613af5565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612ef7565b6109c6565b005b34801561032057600080fd5b5061033b600480360381019061033691906131eb565b610a26565b005b34801561034957600080fd5b50610364600480360381019061035f919061300d565b610bc8565b6040516103719190613af5565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190612ef7565b610c6d565b005b3480156103af57600080fd5b506103ca60048036038101906103c591906131be565b610c8d565b6040516103d79190613af5565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190613175565b610cfe565b005b34801561041557600080fd5b50610430600480360381019061042b91906131be565b610dea565b60405161043d919061370f565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190612e8a565b610e9c565b60405161047a9190613af5565b60405180910390f35b34801561048f57600080fd5b50610498610f54565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190612e8a565b610fdc565b6040516104ce9190613776565b60405180910390f35b6104df6110e6565b005b3480156104ed57600080fd5b506104f66111a2565b604051610503919061370f565b60405180910390f35b34801561051857600080fd5b506105216111cc565b60405161052e91906137b3565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190612fcd565b61125e565b005b34801561056c57600080fd5b5061058760048036038101906105829190612f4a565b6113df565b005b34801561059557600080fd5b506105b060048036038101906105ab91906131be565b611441565b6040516105bd91906137b3565b60405180910390f35b3480156105d257600080fd5b506105db6114c9565b005b3480156105e957600080fd5b5061060460048036038101906105ff91906131be565b611562565b604051610611919061370f565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190612eb7565b61159f565b60405161064e9190613798565b60405180910390f35b34801561066357600080fd5b5061066c611633565b6040516106799190613af5565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a4919061309a565b611638565b005b3480156106b757600080fd5b506106d260048036038101906106cd9190612e8a565b61176e565b005b3480156106e057600080fd5b506106fb60048036038101906106f6919061304d565b611866565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610770575061076f82611989565b5b9050919050565b600a60149054906101000a900460ff1681565b60606000805461079990613d84565b80601f01602080910402602001604051908101604052809291908181526020018280546107c590613d84565b80156108125780601f106107e757610100808354040283529160200191610812565b820191906000526020600020905b8154815290600101906020018083116107f557829003601f168201915b5050505050905090565b600061082782611a6b565b610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d906139d5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ac82610dea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613a55565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093c611ad7565b73ffffffffffffffffffffffffffffffffffffffff16148061096b575061096a81610965611ad7565b61159f565b5b6109aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a190613935565b60405180910390fd5b6109b48383611adf565b505050565b6000600880549050905090565b6109d76109d1611ad7565b82611b98565b610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d90613a75565b60405180910390fd5b610a21838383611c76565b505050565b610a2e611ad7565b73ffffffffffffffffffffffffffffffffffffffff16610a4c6111a2565b73ffffffffffffffffffffffffffffffffffffffff1614610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a99906139f5565b60405180910390fd5b60008211610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90613ad5565b60405180910390fd5b60fa821115610b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2090613ab5565b60405180910390fd5b610b3282611a6b565b15610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990613995565b60405180910390fd5b80600c600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000610bd383610e9c565b8210610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b906137d5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c88838383604051806020016040528060008152506113df565b505050565b6000610c976109b9565b8210610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90613a95565b60405180910390fd5b60088281548110610cec57610ceb613f1d565b5b90600052602060002001549050919050565b610d06611ad7565b73ffffffffffffffffffffffffffffffffffffffff16610d246111a2565b73ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906139f5565b60405180910390fd5b60001515600a60149054906101000a900460ff16151514610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790613835565b60405180910390fd5b80600b9080519060200190610de6929190612bf2565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613975565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613955565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f5c611ad7565b73ffffffffffffffffffffffffffffffffffffffff16610f7a6111a2565b73ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc7906139f5565b60405180910390fd5b610fda6000611ed2565b565b60606000610fe983610e9c565b9050600081141561104657600067ffffffffffffffff81111561100f5761100e613f4c565b5b60405190808252806020026020018201604052801561103d5781602001602082028036833780820191505090505b509150506110e1565b60008167ffffffffffffffff81111561106257611061613f4c565b5b6040519080825280602002602001820160405280156110905781602001602082028036833780820191505090505b50905060005b828110156110da576110a88582610bc8565b8282815181106110bb576110ba613f1d565b5b60200260200101818152505080806110d290613de7565b915050611096565b8193505050505b919050565b6110ee611ad7565b73ffffffffffffffffffffffffffffffffffffffff1661110c6111a2565b73ffffffffffffffffffffffffffffffffffffffff1614611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906139f5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506111a057600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111db90613d84565b80601f016020809104026020016040519081016040528092919081815260200182805461120790613d84565b80156112545780601f1061122957610100808354040283529160200191611254565b820191906000526020600020905b81548152906001019060200180831161123757829003601f168201915b5050505050905090565b611266611ad7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb906138d5565b60405180910390fd5b80600560006112e1611ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661138e611ad7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d39190613798565b60405180910390a35050565b6113f06113ea611ad7565b83611b98565b61142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690613a75565b60405180910390fd5b61143b84848484611f98565b50505050565b606061144c82611a6b565b61148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613a35565b60405180910390fd5b6000611495611ff4565b9050806114a184612086565b6040516020016114b29291906136eb565b604051602081830303815290604052915050919050565b6114d1611ad7565b73ffffffffffffffffffffffffffffffffffffffff166114ef6111a2565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c906139f5565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60fa81565b611640611ad7565b73ffffffffffffffffffffffffffffffffffffffff1661165e6111a2565b73ffffffffffffffffffffffffffffffffffffffff16146116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab906139f5565b60405180910390fd5b8181905084849050146116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f390613895565b60405180910390fd5b60005b84849050811015611767576117548585838181106117205761171f613f1d565b5b9050602002013584848481811061173a57611739613f1d565b5b905060200201602081019061174f9190612e8a565b610a26565b808061175f90613de7565b9150506116ff565b5050505050565b611776611ad7565b73ffffffffffffffffffffffffffffffffffffffff166117946111a2565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e1906139f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613815565b60405180910390fd5b61186381611ed2565b50565b61186e611ad7565b73ffffffffffffffffffffffffffffffffffffffff1661188c6111a2565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d9906139f5565b60405180910390fd5b60fa611901838390506118f36109b9565b6121e790919063ffffffff16565b10611941576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611938906138f5565b60405180910390fd5b60005b828290508110156119845761197183838381811061196557611964613f1d565b5b905060200201356121fd565b808061197c90613de7565b915050611944565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a5457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a645750611a6382612378565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5283610dea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ba382611a6b565b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613915565b60405180910390fd5b6000611bed83610dea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c5c57508373ffffffffffffffffffffffffffffffffffffffff16611c448461081c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c6d5750611c6c818561159f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c9682610dea565b73ffffffffffffffffffffffffffffffffffffffff1614611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce390613a15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d53906138b5565b60405180910390fd5b611d678383836123e2565b611d72600082611adf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc29190613c9a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e199190613c13565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fa3848484611c76565b611faf848484846124f6565b611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906137f5565b60405180910390fd5b50505050565b6060600b805461200390613d84565b80601f016020809104026020016040519081016040528092919081815260200182805461202f90613d84565b801561207c5780601f106120515761010080835404028352916020019161207c565b820191906000526020600020905b81548152906001019060200180831161205f57829003601f168201915b5050505050905090565b606060008214156120ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121e2565b600082905060005b600082146121005780806120e990613de7565b915050600a826120f99190613c69565b91506120d6565b60008167ffffffffffffffff81111561211c5761211b613f4c565b5b6040519080825280601f01601f19166020018201604052801561214e5781602001600182028036833780820191505090505b5090505b600085146121db576001826121679190613c9a565b9150600a856121769190613e30565b60306121829190613c13565b60f81b81838151811061219857612197613f1d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121d49190613c69565b9450612152565b8093505050505b919050565b600081836121f59190613c13565b905092915050565b612205611ad7565b73ffffffffffffffffffffffffffffffffffffffff166122236111a2565b73ffffffffffffffffffffffffffffffffffffffff1614612279576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612270906139f5565b60405180910390fd5b61228281611a6b565b156122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b990613995565b60405180910390fd5b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236190613875565b60405180910390fd5b612374818361268d565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123ed8383836126ab565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124305761242b816126b0565b61246f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461246e5761246d83826126f9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124b2576124ad81612866565b6124f1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124f0576124ef8282612937565b5b5b505050565b60006125178473ffffffffffffffffffffffffffffffffffffffff166129b6565b15612680578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612540611ad7565b8786866040518563ffffffff1660e01b8152600401612562949392919061372a565b602060405180830381600087803b15801561257c57600080fd5b505af19250505080156125ad57506040513d601f19601f820116820180604052508101906125aa9190613148565b60015b612630573d80600081146125dd576040519150601f19603f3d011682016040523d82523d6000602084013e6125e2565b606091505b50600081511415612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f906137f5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612685565b600190505b949350505050565b6126a78282604051806020016040528060008152506129c9565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161270684610e9c565b6127109190613c9a565b90506000600760008481526020019081526020016000205490508181146127f5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061287a9190613c9a565b90506000600960008481526020019081526020016000205490506000600883815481106128aa576128a9613f1d565b5b9060005260206000200154905080600883815481106128cc576128cb613f1d565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061291b5761291a613eee565b5b6001900381819060005260206000200160009055905550505050565b600061294283610e9c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6129d38383612a24565b6129e060008484846124f6565b612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a16906137f5565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b906139b5565b60405180910390fd5b612a9d81611a6b565b15612add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad490613855565b60405180910390fd5b612ae9600083836123e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b399190613c13565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612bfe90613d84565b90600052602060002090601f016020900481019282612c205760008555612c67565b82601f10612c3957805160ff1916838001178555612c67565b82800160010185558215612c67579182015b82811115612c66578251825591602001919060010190612c4b565b5b509050612c749190612c78565b5090565b5b80821115612c91576000816000905550600101612c79565b5090565b6000612ca8612ca384613b35565b613b10565b905082815260208101848484011115612cc457612cc3613f8a565b5b612ccf848285613d42565b509392505050565b6000612cea612ce584613b66565b613b10565b905082815260208101848484011115612d0657612d05613f8a565b5b612d11848285613d42565b509392505050565b600081359050612d288161460b565b92915050565b60008083601f840112612d4457612d43613f80565b5b8235905067ffffffffffffffff811115612d6157612d60613f7b565b5b602083019150836020820283011115612d7d57612d7c613f85565b5b9250929050565b60008083601f840112612d9a57612d99613f80565b5b8235905067ffffffffffffffff811115612db757612db6613f7b565b5b602083019150836020820283011115612dd357612dd2613f85565b5b9250929050565b600081359050612de981614622565b92915050565b600081359050612dfe81614639565b92915050565b600081519050612e1381614639565b92915050565b600082601f830112612e2e57612e2d613f80565b5b8135612e3e848260208601612c95565b91505092915050565b600082601f830112612e5c57612e5b613f80565b5b8135612e6c848260208601612cd7565b91505092915050565b600081359050612e8481614650565b92915050565b600060208284031215612ea057612e9f613f94565b5b6000612eae84828501612d19565b91505092915050565b60008060408385031215612ece57612ecd613f94565b5b6000612edc85828601612d19565b9250506020612eed85828601612d19565b9150509250929050565b600080600060608486031215612f1057612f0f613f94565b5b6000612f1e86828701612d19565b9350506020612f2f86828701612d19565b9250506040612f4086828701612e75565b9150509250925092565b60008060008060808587031215612f6457612f63613f94565b5b6000612f7287828801612d19565b9450506020612f8387828801612d19565b9350506040612f9487828801612e75565b925050606085013567ffffffffffffffff811115612fb557612fb4613f8f565b5b612fc187828801612e19565b91505092959194509250565b60008060408385031215612fe457612fe3613f94565b5b6000612ff285828601612d19565b925050602061300385828601612dda565b9150509250929050565b6000806040838503121561302457613023613f94565b5b600061303285828601612d19565b925050602061304385828601612e75565b9150509250929050565b6000806020838503121561306457613063613f94565b5b600083013567ffffffffffffffff81111561308257613081613f8f565b5b61308e85828601612d84565b92509250509250929050565b600080600080604085870312156130b4576130b3613f94565b5b600085013567ffffffffffffffff8111156130d2576130d1613f8f565b5b6130de87828801612d84565b9450945050602085013567ffffffffffffffff81111561310157613100613f8f565b5b61310d87828801612d2e565b925092505092959194509250565b60006020828403121561313157613130613f94565b5b600061313f84828501612def565b91505092915050565b60006020828403121561315e5761315d613f94565b5b600061316c84828501612e04565b91505092915050565b60006020828403121561318b5761318a613f94565b5b600082013567ffffffffffffffff8111156131a9576131a8613f8f565b5b6131b584828501612e47565b91505092915050565b6000602082840312156131d4576131d3613f94565b5b60006131e284828501612e75565b91505092915050565b6000806040838503121561320257613201613f94565b5b600061321085828601612e75565b925050602061322185828601612d19565b9150509250929050565b600061323783836136cd565b60208301905092915050565b61324c81613cce565b82525050565b600061325d82613ba7565b6132678185613bd5565b935061327283613b97565b8060005b838110156132a357815161328a888261322b565b975061329583613bc8565b925050600181019050613276565b5085935050505092915050565b6132b981613ce0565b82525050565b60006132ca82613bb2565b6132d48185613be6565b93506132e4818560208601613d51565b6132ed81613f99565b840191505092915050565b600061330382613bbd565b61330d8185613bf7565b935061331d818560208601613d51565b61332681613f99565b840191505092915050565b600061333c82613bbd565b6133468185613c08565b9350613356818560208601613d51565b80840191505092915050565b600061336f602b83613bf7565b915061337a82613faa565b604082019050919050565b6000613392603283613bf7565b915061339d82613ff9565b604082019050919050565b60006133b5602683613bf7565b91506133c082614048565b604082019050919050565b60006133d8601283613bf7565b91506133e382614097565b602082019050919050565b60006133fb601c83613bf7565b9150613406826140c0565b602082019050919050565b600061341e601b83613bf7565b9150613429826140e9565b602082019050919050565b6000613441603283613bf7565b915061344c82614112565b604082019050919050565b6000613464602483613bf7565b915061346f82614161565b604082019050919050565b6000613487601983613bf7565b9150613492826141b0565b602082019050919050565b60006134aa601883613bf7565b91506134b5826141d9565b602082019050919050565b60006134cd602c83613bf7565b91506134d882614202565b604082019050919050565b60006134f0603883613bf7565b91506134fb82614251565b604082019050919050565b6000613513602a83613bf7565b915061351e826142a0565b604082019050919050565b6000613536602983613bf7565b9150613541826142ef565b604082019050919050565b6000613559601d83613bf7565b91506135648261433e565b602082019050919050565b600061357c602083613bf7565b915061358782614367565b602082019050919050565b600061359f602c83613bf7565b91506135aa82614390565b604082019050919050565b60006135c2602083613bf7565b91506135cd826143df565b602082019050919050565b60006135e5602983613bf7565b91506135f082614408565b604082019050919050565b6000613608602f83613bf7565b915061361382614457565b604082019050919050565b600061362b602183613bf7565b9150613636826144a6565b604082019050919050565b600061364e603183613bf7565b9150613659826144f5565b604082019050919050565b6000613671602c83613bf7565b915061367c82614544565b604082019050919050565b6000613694602983613bf7565b915061369f82614593565b604082019050919050565b60006136b7601e83613bf7565b91506136c2826145e2565b602082019050919050565b6136d681613d38565b82525050565b6136e581613d38565b82525050565b60006136f78285613331565b91506137038284613331565b91508190509392505050565b60006020820190506137246000830184613243565b92915050565b600060808201905061373f6000830187613243565b61374c6020830186613243565b61375960408301856136dc565b818103606083015261376b81846132bf565b905095945050505050565b600060208201905081810360008301526137908184613252565b905092915050565b60006020820190506137ad60008301846132b0565b92915050565b600060208201905081810360008301526137cd81846132f8565b905092915050565b600060208201905081810360008301526137ee81613362565b9050919050565b6000602082019050818103600083015261380e81613385565b9050919050565b6000602082019050818103600083015261382e816133a8565b9050919050565b6000602082019050818103600083015261384e816133cb565b9050919050565b6000602082019050818103600083015261386e816133ee565b9050919050565b6000602082019050818103600083015261388e81613411565b9050919050565b600060208201905081810360008301526138ae81613434565b9050919050565b600060208201905081810360008301526138ce81613457565b9050919050565b600060208201905081810360008301526138ee8161347a565b9050919050565b6000602082019050818103600083015261390e8161349d565b9050919050565b6000602082019050818103600083015261392e816134c0565b9050919050565b6000602082019050818103600083015261394e816134e3565b9050919050565b6000602082019050818103600083015261396e81613506565b9050919050565b6000602082019050818103600083015261398e81613529565b9050919050565b600060208201905081810360008301526139ae8161354c565b9050919050565b600060208201905081810360008301526139ce8161356f565b9050919050565b600060208201905081810360008301526139ee81613592565b9050919050565b60006020820190508181036000830152613a0e816135b5565b9050919050565b60006020820190508181036000830152613a2e816135d8565b9050919050565b60006020820190508181036000830152613a4e816135fb565b9050919050565b60006020820190508181036000830152613a6e8161361e565b9050919050565b60006020820190508181036000830152613a8e81613641565b9050919050565b60006020820190508181036000830152613aae81613664565b9050919050565b60006020820190508181036000830152613ace81613687565b9050919050565b60006020820190508181036000830152613aee816136aa565b9050919050565b6000602082019050613b0a60008301846136dc565b92915050565b6000613b1a613b2b565b9050613b268282613db6565b919050565b6000604051905090565b600067ffffffffffffffff821115613b5057613b4f613f4c565b5b613b5982613f99565b9050602081019050919050565b600067ffffffffffffffff821115613b8157613b80613f4c565b5b613b8a82613f99565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c1e82613d38565b9150613c2983613d38565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c5e57613c5d613e61565b5b828201905092915050565b6000613c7482613d38565b9150613c7f83613d38565b925082613c8f57613c8e613e90565b5b828204905092915050565b6000613ca582613d38565b9150613cb083613d38565b925082821015613cc357613cc2613e61565b5b828203905092915050565b6000613cd982613d18565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d6f578082015181840152602081019050613d54565b83811115613d7e576000848401525b50505050565b60006002820490506001821680613d9c57607f821691505b60208210811415613db057613daf613ebf565b5b50919050565b613dbf82613f99565b810181811067ffffffffffffffff82111715613dde57613ddd613f4c565b5b80604052505050565b6000613df282613d38565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e2557613e24613e61565b5b600182019050919050565b6000613e3b82613d38565b9150613e4683613d38565b925082613e5657613e55613e90565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d657461646174612069732066726f7a656e0000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f74206d696e7420746f207a65726f20616464726573730000000000600082015250565b7f4c656e677468206f6620746f6b656e20696473206d757374206d61746368206c60008201527f656e677468206f66206164647265737365730000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45786365656473204d41585f43525950544f465245414b530000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f546f6b656e2068617320616c7265616479206265656e206d696e746564000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546f6b656e4944206d757374206265206c657373207468616e206f722065717560008201527f616c20746f203235300000000000000000000000000000000000000000000000602082015250565b7f546f6b656e4944206d7573742062652067726561746572207468616e20300000600082015250565b61461481613cce565b811461461f57600080fd5b50565b61462b81613ce0565b811461463657600080fd5b50565b61464281613cec565b811461464d57600080fd5b50565b61465981613d38565b811461466457600080fd5b5056fea26469706673582212209c8a029fdd6a655969bd8a3c40b119b62959f7b9fac1f11df79961d65f45690d64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

50153:3309:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34700:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50326:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21605:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23164:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22687:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35340:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24054:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52386:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35008:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24464:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35530:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51207:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21299:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21029:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42495:94;;;;;;;;;;;;;:::i;:::-;;50568:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51904:123;;;:::i;:::-;;41844:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21774:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23457:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24720:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51512:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51120:75;;;;;;;;;;;;;:::i;:::-;;52739:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23823:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50276:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52039:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42744:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52871:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34700:224;34802:4;34841:35;34826:50;;;:11;:50;;;;:90;;;;34880:36;34904:11;34880:23;:36::i;:::-;34826:90;34819:97;;34700:224;;;:::o;50326:26::-;;;;;;;;;;;;;:::o;21605:100::-;21659:13;21692:5;21685:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21605:100;:::o;23164:221::-;23240:7;23268:16;23276:7;23268;:16::i;:::-;23260:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23353:15;:24;23369:7;23353:24;;;;;;;;;;;;;;;;;;;;;23346:31;;23164:221;;;:::o;22687:411::-;22768:13;22784:23;22799:7;22784:14;:23::i;:::-;22768:39;;22832:5;22826:11;;:2;:11;;;;22818:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22926:5;22910:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22935:37;22952:5;22959:12;:10;:12::i;:::-;22935:16;:37::i;:::-;22910:62;22888:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23069:21;23078:2;23082:7;23069:8;:21::i;:::-;22757:341;22687:411;;:::o;35340:113::-;35401:7;35428:10;:17;;;;35421:24;;35340:113;:::o;24054:339::-;24249:41;24268:12;:10;:12::i;:::-;24282:7;24249:18;:41::i;:::-;24241:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24357:28;24367:4;24373:2;24377:7;24357:9;:28::i;:::-;24054:339;;;:::o;52386:341::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52484:1:::1;52473:8;:12;52465:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50316:3;52539:8;:28;;52531:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52633:17;52641:8;52633:7;:17::i;:::-;52632:18;52624:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52715:4;52695:7;:17;52703:8;52695:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;52386:341:::0;;:::o;35008:256::-;35105:7;35141:23;35158:5;35141:16;:23::i;:::-;35133:5;:31;35125:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35230:12;:19;35243:5;35230:19;;;;;;;;;;;;;;;:26;35250:5;35230:26;;;;;;;;;;;;35223:33;;35008:256;;;;:::o;24464:185::-;24602:39;24619:4;24625:2;24629:7;24602:39;;;;;;;;;;;;:16;:39::i;:::-;24464:185;;;:::o;35530:233::-;35605:7;35641:30;:28;:30::i;:::-;35633:5;:38;35625:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35738:10;35749:5;35738:17;;;;;;;;:::i;:::-;;;;;;;;;;35731:24;;35530:233;;;:::o;51207:164::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51297:5:::1;51287:15;;:6;;;;;;;;;;;:15;;;51279:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51355:8;51336:16;:27;;;;;;;;;;;;:::i;:::-;;51207:164:::0;:::o;21299:239::-;21371:7;21391:13;21407:7;:16;21415:7;21407:16;;;;;;;;;;;;;;;;;;;;;21391:32;;21459:1;21442:19;;:5;:19;;;;21434:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21525:5;21518:12;;;21299:239;;;:::o;21029:208::-;21101:7;21146:1;21129:19;;:5;:19;;;;21121:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21213:9;:16;21223:5;21213:16;;;;;;;;;;;;;;;;21206:23;;21029:208;;;:::o;42495:94::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42560:21:::1;42578:1;42560:9;:21::i;:::-;42495:94::o:0;50568:540::-;50629:16;50659:18;50680:17;50690:6;50680:9;:17::i;:::-;50659:38;;50726:1;50712:10;:15;50708:393;;;50803:1;50789:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50782:23;;;;;50708:393;50838:23;50878:10;50864:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50838:51;;50904:13;50932:130;50956:10;50948:5;:18;50932:130;;;51012:34;51032:6;51040:5;51012:19;:34::i;:::-;50996:6;51003:5;50996:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;50968:7;;;;;:::i;:::-;;;;50932:130;;;51083:6;51076:13;;;;;50568:540;;;;:::o;51904:123::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51979:10:::1;51971:24;;:47;51996:21;51971:47;;;;;;;;;;;;;;;;;;;;;;;51963:56;;;::::0;::::1;;51904:123::o:0;41844:87::-;41890:7;41917:6;;;;;;;;;;;41910:13;;41844:87;:::o;21774:104::-;21830:13;21863:7;21856:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21774:104;:::o;23457:295::-;23572:12;:10;:12::i;:::-;23560:24;;:8;:24;;;;23552:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23672:8;23627:18;:32;23646:12;:10;:12::i;:::-;23627:32;;;;;;;;;;;;;;;:42;23660:8;23627:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23725:8;23696:48;;23711:12;:10;:12::i;:::-;23696:48;;;23735:8;23696:48;;;;;;:::i;:::-;;;;;;;;23457:295;;:::o;24720:328::-;24895:41;24914:12;:10;:12::i;:::-;24928:7;24895:18;:41::i;:::-;24887:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25001:39;25015:4;25021:2;25025:7;25034:5;25001:13;:39::i;:::-;24720:328;;;;:::o;51512:384::-;51585:13;51619:16;51627:7;51619;:16::i;:::-;51611:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51698:18;51719:10;:8;:10::i;:::-;51698:31;;51862:4;51868:18;:7;:16;:18::i;:::-;51845:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51831:57;;;51512:384;;;:::o;51120:75::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51183:4:::1;51174:6;;:13;;;;;;;;;;;;;;;;;;51120:75::o:0;52739:120::-;52807:7;52834;:17;52842:8;52834:17;;;;;;;;;;;;;;;;;;;;;52827:24;;52739:120;;;:::o;23823:164::-;23920:4;23944:18;:25;23963:5;23944:25;;;;;;;;;;;;;;;:35;23970:8;23944:35;;;;;;;;;;;;;;;;;;;;;;;;;23937:42;;23823:164;;;;:::o;50276:43::-;50316:3;50276:43;:::o;52039:335::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52177:9:::1;;:16;;52157:9;;:16;;:36;52149:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;52264:6;52259:108;52280:9;;:16;;52276:1;:20;52259:108;;;52318:37;52328:9;;52338:1;52328:12;;;;;;;:::i;:::-;;;;;;;;52342:9;;52352:1;52342:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52318:9;:37::i;:::-;52298:3;;;;;:::i;:::-;;;;52259:108;;;;52039:335:::0;;;;:::o;42744:192::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42853:1:::1;42833:22;;:8;:22;;;;42825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42909:19;42919:8;42909:9;:19::i;:::-;42744:192:::0;:::o;52871:283::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50316:3:::1;52953:35;52971:9;;:16;;52953:13;:11;:13::i;:::-;:17;;:35;;;;:::i;:::-;:54;52945:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;53062:6;53057:90;53078:9;;:16;;53074:1;:20;53057:90;;;53116:19;53122:9;;53132:1;53122:12;;;;;;;:::i;:::-;;;;;;;;53116:5;:19::i;:::-;53096:3;;;;;:::i;:::-;;;;53057:90;;;;52871:283:::0;;:::o;20660:305::-;20762:4;20814:25;20799:40;;;:11;:40;;;;:105;;;;20871:33;20856:48;;;:11;:48;;;;20799:105;:158;;;;20921:36;20945:11;20921:23;:36::i;:::-;20799:158;20779:178;;20660:305;;;:::o;26558:127::-;26623:4;26675:1;26647:30;;:7;:16;26655:7;26647:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26640:37;;26558:127;;;:::o;16088:98::-;16141:7;16168:10;16161:17;;16088:98;:::o;30540:174::-;30642:2;30615:15;:24;30631:7;30615:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30698:7;30694:2;30660:46;;30669:23;30684:7;30669:14;:23::i;:::-;30660:46;;;;;;;;;;;;30540:174;;:::o;26852:348::-;26945:4;26970:16;26978:7;26970;:16::i;:::-;26962:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27046:13;27062:23;27077:7;27062:14;:23::i;:::-;27046:39;;27115:5;27104:16;;:7;:16;;;:51;;;;27148:7;27124:31;;:20;27136:7;27124:11;:20::i;:::-;:31;;;27104:51;:87;;;;27159:32;27176:5;27183:7;27159:16;:32::i;:::-;27104:87;27096:96;;;26852:348;;;;:::o;29844:578::-;30003:4;29976:31;;:23;29991:7;29976:14;:23::i;:::-;:31;;;29968:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30086:1;30072:16;;:2;:16;;;;30064:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30142:39;30163:4;30169:2;30173:7;30142:20;:39::i;:::-;30246:29;30263:1;30267:7;30246:8;:29::i;:::-;30307:1;30288:9;:15;30298:4;30288:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30336:1;30319:9;:13;30329:2;30319:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30367:2;30348:7;:16;30356:7;30348:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30406:7;30402:2;30387:27;;30396:4;30387:27;;;;;;;;;;;;29844:578;;;:::o;42944:173::-;43000:16;43019:6;;;;;;;;;;;43000:25;;43045:8;43036:6;;:17;;;;;;;;;;;;;;;;;;43100:8;43069:40;;43090:8;43069:40;;;;;;;;;;;;42989:128;42944:173;:::o;25930:315::-;26087:28;26097:4;26103:2;26107:7;26087:9;:28::i;:::-;26134:48;26157:4;26163:2;26167:7;26176:5;26134:22;:48::i;:::-;26126:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25930:315;;;;:::o;51383:117::-;51443:13;51476:16;51469:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51383:117;:::o;16611:723::-;16667:13;16897:1;16888:5;:10;16884:53;;;16915:10;;;;;;;;;;;;;;;;;;;;;16884:53;16947:12;16962:5;16947:20;;16978:14;17003:78;17018:1;17010:4;:9;17003:78;;17036:8;;;;;:::i;:::-;;;;17067:2;17059:10;;;;;:::i;:::-;;;17003:78;;;17091:19;17123:6;17113:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17091:39;;17141:154;17157:1;17148:5;:10;17141:154;;17185:1;17175:11;;;;;:::i;:::-;;;17252:2;17244:5;:10;;;;:::i;:::-;17231:2;:24;;;;:::i;:::-;17218:39;;17201:6;17208;17201:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17281:2;17272:11;;;;;:::i;:::-;;;17141:154;;;17319:6;17305:21;;;;;16611:723;;;;:::o;45914:98::-;45972:7;46003:1;45999;:5;;;;:::i;:::-;45992:12;;45914:98;;;;:::o;53166:293::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53237:17:::1;53245:8;53237:7;:17::i;:::-;53236:18;53228:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53299:17;53319:7;:17;53327:8;53319:17;;;;;;;;;;;;;;;;;;;;;53299:37;;53376:1;53355:23;;:9;:23;;;;53347:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53421:30;53431:9;53442:8;53421:9;:30::i;:::-;53217:242;53166:293:::0;:::o;19166:157::-;19251:4;19290:25;19275:40;;;:11;:40;;;;19268:47;;19166:157;;;:::o;36376:589::-;36520:45;36547:4;36553:2;36557:7;36520:26;:45::i;:::-;36598:1;36582:18;;:4;:18;;;36578:187;;;36617:40;36649:7;36617:31;:40::i;:::-;36578:187;;;36687:2;36679:10;;:4;:10;;;36675:90;;36706:47;36739:4;36745:7;36706:32;:47::i;:::-;36675:90;36578:187;36793:1;36779:16;;:2;:16;;;36775:183;;;36812:45;36849:7;36812:36;:45::i;:::-;36775:183;;;36885:4;36879:10;;:2;:10;;;36875:83;;36906:40;36934:2;36938:7;36906:27;:40::i;:::-;36875:83;36775:183;36376:589;;;:::o;31279:799::-;31434:4;31455:15;:2;:13;;;:15::i;:::-;31451:620;;;31507:2;31491:36;;;31528:12;:10;:12::i;:::-;31542:4;31548:7;31557:5;31491:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31487:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:1;31733:6;:13;:18;31729:272;;;31776:60;;;;;;;;;;:::i;:::-;;;;;;;;31729:272;31951:6;31945:13;31936:6;31932:2;31928:15;31921:38;31487:529;31624:41;;;31614:51;;;:6;:51;;;;31607:58;;;;;31451:620;32055:4;32048:11;;31279:799;;;;;;;:::o;27542:110::-;27618:26;27628:2;27632:7;27618:26;;;;;;;;;;;;:9;:26::i;:::-;27542:110;;:::o;32650:126::-;;;;:::o;37688:164::-;37792:10;:17;;;;37765:15;:24;37781:7;37765:24;;;;;;;;;;;:44;;;;37820:10;37836:7;37820:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37688:164;:::o;38479:988::-;38745:22;38795:1;38770:22;38787:4;38770:16;:22::i;:::-;:26;;;;:::i;:::-;38745:51;;38807:18;38828:17;:26;38846:7;38828:26;;;;;;;;;;;;38807:47;;38975:14;38961:10;:28;38957:328;;39006:19;39028:12;:18;39041:4;39028:18;;;;;;;;;;;;;;;:34;39047:14;39028:34;;;;;;;;;;;;39006:56;;39112:11;39079:12;:18;39092:4;39079:18;;;;;;;;;;;;;;;:30;39098:10;39079:30;;;;;;;;;;;:44;;;;39229:10;39196:17;:30;39214:11;39196:30;;;;;;;;;;;:43;;;;38991:294;38957:328;39381:17;:26;39399:7;39381:26;;;;;;;;;;;39374:33;;;39425:12;:18;39438:4;39425:18;;;;;;;;;;;;;;;:34;39444:14;39425:34;;;;;;;;;;;39418:41;;;38560:907;;38479:988;;:::o;39762:1079::-;40015:22;40060:1;40040:10;:17;;;;:21;;;;:::i;:::-;40015:46;;40072:18;40093:15;:24;40109:7;40093:24;;;;;;;;;;;;40072:45;;40444:19;40466:10;40477:14;40466:26;;;;;;;;:::i;:::-;;;;;;;;;;40444:48;;40530:11;40505:10;40516;40505:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40641:10;40610:15;:28;40626:11;40610:28;;;;;;;;;;;:41;;;;40782:15;:24;40798:7;40782:24;;;;;;;;;;;40775:31;;;40817:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39833:1008;;;39762:1079;:::o;37266:221::-;37351:14;37368:20;37385:2;37368:16;:20::i;:::-;37351:37;;37426:7;37399:12;:16;37412:2;37399:16;;;;;;;;;;;;;;;:24;37416:6;37399:24;;;;;;;;;;;:34;;;;37473:6;37444:17;:26;37462:7;37444:26;;;;;;;;;;;:35;;;;37340:147;37266:221;;:::o;8134:387::-;8194:4;8402:12;8469:7;8457:20;8449:28;;8512:1;8505:4;:8;8498:15;;;8134:387;;;:::o;27879:321::-;28009:18;28015:2;28019:7;28009:5;:18::i;:::-;28060:54;28091:1;28095:2;28099:7;28108:5;28060:22;:54::i;:::-;28038:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27879:321;;;:::o;28536:382::-;28630:1;28616:16;;:2;:16;;;;28608:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28689:16;28697:7;28689;:16::i;:::-;28688:17;28680:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28751:45;28780:1;28784:2;28788:7;28751:20;:45::i;:::-;28826:1;28809:9;:13;28819:2;28809:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28857:2;28838:7;:16;28846:7;28838:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28902:7;28898:2;28877:33;;28894:1;28877:33;;;;;;;;;;;;28536:382;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:559::-;6888:6;6896;6945:2;6933:9;6924:7;6920:23;6916:32;6913:119;;;6951:79;;:::i;:::-;6913:119;7099:1;7088:9;7084:17;7071:31;7129:18;7121:6;7118:30;7115:117;;;7151:79;;:::i;:::-;7115:117;7264:80;7336:7;7327:6;7316:9;7312:22;7264:80;:::i;:::-;7246:98;;;;7042:312;6802:559;;;;;:::o;7367:934::-;7489:6;7497;7505;7513;7562:2;7550:9;7541:7;7537:23;7533:32;7530:119;;;7568:79;;:::i;:::-;7530:119;7716:1;7705:9;7701:17;7688:31;7746:18;7738:6;7735:30;7732:117;;;7768:79;;:::i;:::-;7732:117;7881:80;7953:7;7944:6;7933:9;7929:22;7881:80;:::i;:::-;7863:98;;;;7659:312;8038:2;8027:9;8023:18;8010:32;8069:18;8061:6;8058:30;8055:117;;;8091:79;;:::i;:::-;8055:117;8204:80;8276:7;8267:6;8256:9;8252:22;8204:80;:::i;:::-;8186:98;;;;7981:313;7367:934;;;;;;;:::o;8307:327::-;8365:6;8414:2;8402:9;8393:7;8389:23;8385:32;8382:119;;;8420:79;;:::i;:::-;8382:119;8540:1;8565:52;8609:7;8600:6;8589:9;8585:22;8565:52;:::i;:::-;8555:62;;8511:116;8307:327;;;;:::o;8640:349::-;8709:6;8758:2;8746:9;8737:7;8733:23;8729:32;8726:119;;;8764:79;;:::i;:::-;8726:119;8884:1;8909:63;8964:7;8955:6;8944:9;8940:22;8909:63;:::i;:::-;8899:73;;8855:127;8640:349;;;;:::o;8995:509::-;9064:6;9113:2;9101:9;9092:7;9088:23;9084:32;9081:119;;;9119:79;;:::i;:::-;9081:119;9267:1;9256:9;9252:17;9239:31;9297:18;9289:6;9286:30;9283:117;;;9319:79;;:::i;:::-;9283:117;9424:63;9479:7;9470:6;9459:9;9455:22;9424:63;:::i;:::-;9414:73;;9210:287;8995:509;;;;:::o;9510:329::-;9569:6;9618:2;9606:9;9597:7;9593:23;9589:32;9586:119;;;9624:79;;:::i;:::-;9586:119;9744:1;9769:53;9814:7;9805:6;9794:9;9790:22;9769:53;:::i;:::-;9759:63;;9715:117;9510:329;;;;:::o;9845:474::-;9913:6;9921;9970:2;9958:9;9949:7;9945:23;9941:32;9938:119;;;9976:79;;:::i;:::-;9938:119;10096:1;10121:53;10166:7;10157:6;10146:9;10142:22;10121:53;:::i;:::-;10111:63;;10067:117;10223:2;10249:53;10294:7;10285:6;10274:9;10270:22;10249:53;:::i;:::-;10239:63;;10194:118;9845:474;;;;;:::o;10325:179::-;10394:10;10415:46;10457:3;10449:6;10415:46;:::i;:::-;10493:4;10488:3;10484:14;10470:28;;10325:179;;;;:::o;10510:118::-;10597:24;10615:5;10597:24;:::i;:::-;10592:3;10585:37;10510:118;;:::o;10664:732::-;10783:3;10812:54;10860:5;10812:54;:::i;:::-;10882:86;10961:6;10956:3;10882:86;:::i;:::-;10875:93;;10992:56;11042:5;10992:56;:::i;:::-;11071:7;11102:1;11087:284;11112:6;11109:1;11106:13;11087:284;;;11188:6;11182:13;11215:63;11274:3;11259:13;11215:63;:::i;:::-;11208:70;;11301:60;11354:6;11301:60;:::i;:::-;11291:70;;11147:224;11134:1;11131;11127:9;11122:14;;11087:284;;;11091:14;11387:3;11380:10;;10788:608;;;10664:732;;;;:::o;11402:109::-;11483:21;11498:5;11483:21;:::i;:::-;11478:3;11471:34;11402:109;;:::o;11517:360::-;11603:3;11631:38;11663:5;11631:38;:::i;:::-;11685:70;11748:6;11743:3;11685:70;:::i;:::-;11678:77;;11764:52;11809:6;11804:3;11797:4;11790:5;11786:16;11764:52;:::i;:::-;11841:29;11863:6;11841:29;:::i;:::-;11836:3;11832:39;11825:46;;11607:270;11517:360;;;;:::o;11883:364::-;11971:3;11999:39;12032:5;11999:39;:::i;:::-;12054:71;12118:6;12113:3;12054:71;:::i;:::-;12047:78;;12134:52;12179:6;12174:3;12167:4;12160:5;12156:16;12134:52;:::i;:::-;12211:29;12233:6;12211:29;:::i;:::-;12206:3;12202:39;12195:46;;11975:272;11883:364;;;;:::o;12253:377::-;12359:3;12387:39;12420:5;12387:39;:::i;:::-;12442:89;12524:6;12519:3;12442:89;:::i;:::-;12435:96;;12540:52;12585:6;12580:3;12573:4;12566:5;12562:16;12540:52;:::i;:::-;12617:6;12612:3;12608:16;12601:23;;12363:267;12253:377;;;;:::o;12636:366::-;12778:3;12799:67;12863:2;12858:3;12799:67;:::i;:::-;12792:74;;12875:93;12964:3;12875:93;:::i;:::-;12993:2;12988:3;12984:12;12977:19;;12636:366;;;:::o;13008:::-;13150:3;13171:67;13235:2;13230:3;13171:67;:::i;:::-;13164:74;;13247:93;13336:3;13247:93;:::i;:::-;13365:2;13360:3;13356:12;13349:19;;13008:366;;;:::o;13380:::-;13522:3;13543:67;13607:2;13602:3;13543:67;:::i;:::-;13536:74;;13619:93;13708:3;13619:93;:::i;:::-;13737:2;13732:3;13728:12;13721:19;;13380:366;;;:::o;13752:::-;13894:3;13915:67;13979:2;13974:3;13915:67;:::i;:::-;13908:74;;13991:93;14080:3;13991:93;:::i;:::-;14109:2;14104:3;14100:12;14093:19;;13752:366;;;:::o;14124:::-;14266:3;14287:67;14351:2;14346:3;14287:67;:::i;:::-;14280:74;;14363:93;14452:3;14363:93;:::i;:::-;14481:2;14476:3;14472:12;14465:19;;14124:366;;;:::o;14496:::-;14638:3;14659:67;14723:2;14718:3;14659:67;:::i;:::-;14652:74;;14735:93;14824:3;14735:93;:::i;:::-;14853:2;14848:3;14844:12;14837:19;;14496:366;;;:::o;14868:::-;15010:3;15031:67;15095:2;15090:3;15031:67;:::i;:::-;15024:74;;15107:93;15196:3;15107:93;:::i;:::-;15225:2;15220:3;15216:12;15209:19;;14868:366;;;:::o;15240:::-;15382:3;15403:67;15467:2;15462:3;15403:67;:::i;:::-;15396:74;;15479:93;15568:3;15479:93;:::i;:::-;15597:2;15592:3;15588:12;15581:19;;15240:366;;;:::o;15612:::-;15754:3;15775:67;15839:2;15834:3;15775:67;:::i;:::-;15768:74;;15851:93;15940:3;15851:93;:::i;:::-;15969:2;15964:3;15960:12;15953:19;;15612:366;;;:::o;15984:::-;16126:3;16147:67;16211:2;16206:3;16147:67;:::i;:::-;16140:74;;16223:93;16312:3;16223:93;:::i;:::-;16341:2;16336:3;16332:12;16325:19;;15984:366;;;:::o;16356:::-;16498:3;16519:67;16583:2;16578:3;16519:67;:::i;:::-;16512:74;;16595:93;16684:3;16595:93;:::i;:::-;16713:2;16708:3;16704:12;16697:19;;16356:366;;;:::o;16728:::-;16870:3;16891:67;16955:2;16950:3;16891:67;:::i;:::-;16884:74;;16967:93;17056:3;16967:93;:::i;:::-;17085:2;17080:3;17076:12;17069:19;;16728:366;;;:::o;17100:::-;17242:3;17263:67;17327:2;17322:3;17263:67;:::i;:::-;17256:74;;17339:93;17428:3;17339:93;:::i;:::-;17457:2;17452:3;17448:12;17441:19;;17100:366;;;:::o;17472:::-;17614:3;17635:67;17699:2;17694:3;17635:67;:::i;:::-;17628:74;;17711:93;17800:3;17711:93;:::i;:::-;17829:2;17824:3;17820:12;17813:19;;17472:366;;;:::o;17844:::-;17986:3;18007:67;18071:2;18066:3;18007:67;:::i;:::-;18000:74;;18083:93;18172:3;18083:93;:::i;:::-;18201:2;18196:3;18192:12;18185:19;;17844:366;;;:::o;18216:::-;18358:3;18379:67;18443:2;18438:3;18379:67;:::i;:::-;18372:74;;18455:93;18544:3;18455:93;:::i;:::-;18573:2;18568:3;18564:12;18557:19;;18216:366;;;:::o;18588:::-;18730:3;18751:67;18815:2;18810:3;18751:67;:::i;:::-;18744:74;;18827:93;18916:3;18827:93;:::i;:::-;18945:2;18940:3;18936:12;18929:19;;18588:366;;;:::o;18960:::-;19102:3;19123:67;19187:2;19182:3;19123:67;:::i;:::-;19116:74;;19199:93;19288:3;19199:93;:::i;:::-;19317:2;19312:3;19308:12;19301:19;;18960:366;;;:::o;19332:::-;19474:3;19495:67;19559:2;19554:3;19495:67;:::i;:::-;19488:74;;19571:93;19660:3;19571:93;:::i;:::-;19689:2;19684:3;19680:12;19673:19;;19332:366;;;:::o;19704:::-;19846:3;19867:67;19931:2;19926:3;19867:67;:::i;:::-;19860:74;;19943:93;20032:3;19943:93;:::i;:::-;20061:2;20056:3;20052:12;20045:19;;19704:366;;;:::o;20076:::-;20218:3;20239:67;20303:2;20298:3;20239:67;:::i;:::-;20232:74;;20315:93;20404:3;20315:93;:::i;:::-;20433:2;20428:3;20424:12;20417:19;;20076:366;;;:::o;20448:::-;20590:3;20611:67;20675:2;20670:3;20611:67;:::i;:::-;20604:74;;20687:93;20776:3;20687:93;:::i;:::-;20805:2;20800:3;20796:12;20789:19;;20448:366;;;:::o;20820:::-;20962:3;20983:67;21047:2;21042:3;20983:67;:::i;:::-;20976:74;;21059:93;21148:3;21059:93;:::i;:::-;21177:2;21172:3;21168:12;21161:19;;20820:366;;;:::o;21192:::-;21334:3;21355:67;21419:2;21414:3;21355:67;:::i;:::-;21348:74;;21431:93;21520:3;21431:93;:::i;:::-;21549:2;21544:3;21540:12;21533:19;;21192:366;;;:::o;21564:::-;21706:3;21727:67;21791:2;21786:3;21727:67;:::i;:::-;21720:74;;21803:93;21892:3;21803:93;:::i;:::-;21921:2;21916:3;21912:12;21905:19;;21564:366;;;:::o;21936:108::-;22013:24;22031:5;22013:24;:::i;:::-;22008:3;22001:37;21936:108;;:::o;22050:118::-;22137:24;22155:5;22137:24;:::i;:::-;22132:3;22125:37;22050:118;;:::o;22174:435::-;22354:3;22376:95;22467:3;22458:6;22376:95;:::i;:::-;22369:102;;22488:95;22579:3;22570:6;22488:95;:::i;:::-;22481:102;;22600:3;22593:10;;22174:435;;;;;:::o;22615:222::-;22708:4;22746:2;22735:9;22731:18;22723:26;;22759:71;22827:1;22816:9;22812:17;22803:6;22759:71;:::i;:::-;22615:222;;;;:::o;22843:640::-;23038:4;23076:3;23065:9;23061:19;23053:27;;23090:71;23158:1;23147:9;23143:17;23134:6;23090:71;:::i;:::-;23171:72;23239:2;23228:9;23224:18;23215:6;23171:72;:::i;:::-;23253;23321:2;23310:9;23306:18;23297:6;23253:72;:::i;:::-;23372:9;23366:4;23362:20;23357:2;23346:9;23342:18;23335:48;23400:76;23471:4;23462:6;23400:76;:::i;:::-;23392:84;;22843:640;;;;;;;:::o;23489:373::-;23632:4;23670:2;23659:9;23655:18;23647:26;;23719:9;23713:4;23709:20;23705:1;23694:9;23690:17;23683:47;23747:108;23850:4;23841:6;23747:108;:::i;:::-;23739:116;;23489:373;;;;:::o;23868:210::-;23955:4;23993:2;23982:9;23978:18;23970:26;;24006:65;24068:1;24057:9;24053:17;24044:6;24006:65;:::i;:::-;23868:210;;;;:::o;24084:313::-;24197:4;24235:2;24224:9;24220:18;24212:26;;24284:9;24278:4;24274:20;24270:1;24259:9;24255:17;24248:47;24312:78;24385:4;24376:6;24312:78;:::i;:::-;24304:86;;24084:313;;;;:::o;24403:419::-;24569:4;24607:2;24596:9;24592:18;24584:26;;24656:9;24650:4;24646:20;24642:1;24631:9;24627:17;24620:47;24684:131;24810:4;24684:131;:::i;:::-;24676:139;;24403:419;;;:::o;24828:::-;24994:4;25032:2;25021:9;25017:18;25009:26;;25081:9;25075:4;25071:20;25067:1;25056:9;25052:17;25045:47;25109:131;25235:4;25109:131;:::i;:::-;25101:139;;24828:419;;;:::o;25253:::-;25419:4;25457:2;25446:9;25442:18;25434:26;;25506:9;25500:4;25496:20;25492:1;25481:9;25477:17;25470:47;25534:131;25660:4;25534:131;:::i;:::-;25526:139;;25253:419;;;:::o;25678:::-;25844:4;25882:2;25871:9;25867:18;25859:26;;25931:9;25925:4;25921:20;25917:1;25906:9;25902:17;25895:47;25959:131;26085:4;25959:131;:::i;:::-;25951:139;;25678:419;;;:::o;26103:::-;26269:4;26307:2;26296:9;26292:18;26284:26;;26356:9;26350:4;26346:20;26342:1;26331:9;26327:17;26320:47;26384:131;26510:4;26384:131;:::i;:::-;26376:139;;26103:419;;;:::o;26528:::-;26694:4;26732:2;26721:9;26717:18;26709:26;;26781:9;26775:4;26771:20;26767:1;26756:9;26752:17;26745:47;26809:131;26935:4;26809:131;:::i;:::-;26801:139;;26528:419;;;:::o;26953:::-;27119:4;27157:2;27146:9;27142:18;27134:26;;27206:9;27200:4;27196:20;27192:1;27181:9;27177:17;27170:47;27234:131;27360:4;27234:131;:::i;:::-;27226:139;;26953:419;;;:::o;27378:::-;27544:4;27582:2;27571:9;27567:18;27559:26;;27631:9;27625:4;27621:20;27617:1;27606:9;27602:17;27595:47;27659:131;27785:4;27659:131;:::i;:::-;27651:139;;27378:419;;;:::o;27803:::-;27969:4;28007:2;27996:9;27992:18;27984:26;;28056:9;28050:4;28046:20;28042:1;28031:9;28027:17;28020:47;28084:131;28210:4;28084:131;:::i;:::-;28076:139;;27803:419;;;:::o;28228:::-;28394:4;28432:2;28421:9;28417:18;28409:26;;28481:9;28475:4;28471:20;28467:1;28456:9;28452:17;28445:47;28509:131;28635:4;28509:131;:::i;:::-;28501:139;;28228:419;;;:::o;28653:::-;28819:4;28857:2;28846:9;28842:18;28834:26;;28906:9;28900:4;28896:20;28892:1;28881:9;28877:17;28870:47;28934:131;29060:4;28934:131;:::i;:::-;28926:139;;28653:419;;;:::o;29078:::-;29244:4;29282:2;29271:9;29267:18;29259:26;;29331:9;29325:4;29321:20;29317:1;29306:9;29302:17;29295:47;29359:131;29485:4;29359:131;:::i;:::-;29351:139;;29078:419;;;:::o;29503:::-;29669:4;29707:2;29696:9;29692:18;29684:26;;29756:9;29750:4;29746:20;29742:1;29731:9;29727:17;29720:47;29784:131;29910:4;29784:131;:::i;:::-;29776:139;;29503:419;;;:::o;29928:::-;30094:4;30132:2;30121:9;30117:18;30109:26;;30181:9;30175:4;30171:20;30167:1;30156:9;30152:17;30145:47;30209:131;30335:4;30209:131;:::i;:::-;30201:139;;29928:419;;;:::o;30353:::-;30519:4;30557:2;30546:9;30542:18;30534:26;;30606:9;30600:4;30596:20;30592:1;30581:9;30577:17;30570:47;30634:131;30760:4;30634:131;:::i;:::-;30626:139;;30353:419;;;:::o;30778:::-;30944:4;30982:2;30971:9;30967:18;30959:26;;31031:9;31025:4;31021:20;31017:1;31006:9;31002:17;30995:47;31059:131;31185:4;31059:131;:::i;:::-;31051:139;;30778:419;;;:::o;31203:::-;31369:4;31407:2;31396:9;31392:18;31384:26;;31456:9;31450:4;31446:20;31442:1;31431:9;31427:17;31420:47;31484:131;31610:4;31484:131;:::i;:::-;31476:139;;31203:419;;;:::o;31628:::-;31794:4;31832:2;31821:9;31817:18;31809:26;;31881:9;31875:4;31871:20;31867:1;31856:9;31852:17;31845:47;31909:131;32035:4;31909:131;:::i;:::-;31901:139;;31628:419;;;:::o;32053:::-;32219:4;32257:2;32246:9;32242:18;32234:26;;32306:9;32300:4;32296:20;32292:1;32281:9;32277:17;32270:47;32334:131;32460:4;32334:131;:::i;:::-;32326:139;;32053:419;;;:::o;32478:::-;32644:4;32682:2;32671:9;32667:18;32659:26;;32731:9;32725:4;32721:20;32717:1;32706:9;32702:17;32695:47;32759:131;32885:4;32759:131;:::i;:::-;32751:139;;32478:419;;;:::o;32903:::-;33069:4;33107:2;33096:9;33092:18;33084:26;;33156:9;33150:4;33146:20;33142:1;33131:9;33127:17;33120:47;33184:131;33310:4;33184:131;:::i;:::-;33176:139;;32903:419;;;:::o;33328:::-;33494:4;33532:2;33521:9;33517:18;33509:26;;33581:9;33575:4;33571:20;33567:1;33556:9;33552:17;33545:47;33609:131;33735:4;33609:131;:::i;:::-;33601:139;;33328:419;;;:::o;33753:::-;33919:4;33957:2;33946:9;33942:18;33934:26;;34006:9;34000:4;33996:20;33992:1;33981:9;33977:17;33970:47;34034:131;34160:4;34034:131;:::i;:::-;34026:139;;33753:419;;;:::o;34178:::-;34344:4;34382:2;34371:9;34367:18;34359:26;;34431:9;34425:4;34421:20;34417:1;34406:9;34402:17;34395:47;34459:131;34585:4;34459:131;:::i;:::-;34451:139;;34178:419;;;:::o;34603:::-;34769:4;34807:2;34796:9;34792:18;34784:26;;34856:9;34850:4;34846:20;34842:1;34831:9;34827:17;34820:47;34884:131;35010:4;34884:131;:::i;:::-;34876:139;;34603:419;;;:::o;35028:222::-;35121:4;35159:2;35148:9;35144:18;35136:26;;35172:71;35240:1;35229:9;35225:17;35216:6;35172:71;:::i;:::-;35028:222;;;;:::o;35256:129::-;35290:6;35317:20;;:::i;:::-;35307:30;;35346:33;35374:4;35366:6;35346:33;:::i;:::-;35256:129;;;:::o;35391:75::-;35424:6;35457:2;35451:9;35441:19;;35391:75;:::o;35472:307::-;35533:4;35623:18;35615:6;35612:30;35609:56;;;35645:18;;:::i;:::-;35609:56;35683:29;35705:6;35683:29;:::i;:::-;35675:37;;35767:4;35761;35757:15;35749:23;;35472:307;;;:::o;35785:308::-;35847:4;35937:18;35929:6;35926:30;35923:56;;;35959:18;;:::i;:::-;35923:56;35997:29;36019:6;35997:29;:::i;:::-;35989:37;;36081:4;36075;36071:15;36063:23;;35785:308;;;:::o;36099:132::-;36166:4;36189:3;36181:11;;36219:4;36214:3;36210:14;36202:22;;36099:132;;;:::o;36237:114::-;36304:6;36338:5;36332:12;36322:22;;36237:114;;;:::o;36357:98::-;36408:6;36442:5;36436:12;36426:22;;36357:98;;;:::o;36461:99::-;36513:6;36547:5;36541:12;36531:22;;36461:99;;;:::o;36566:113::-;36636:4;36668;36663:3;36659:14;36651:22;;36566:113;;;:::o;36685:184::-;36784:11;36818:6;36813:3;36806:19;36858:4;36853:3;36849:14;36834:29;;36685:184;;;;:::o;36875:168::-;36958:11;36992:6;36987:3;36980:19;37032:4;37027:3;37023:14;37008:29;;36875:168;;;;:::o;37049:169::-;37133:11;37167:6;37162:3;37155:19;37207:4;37202:3;37198:14;37183:29;;37049:169;;;;:::o;37224:148::-;37326:11;37363:3;37348:18;;37224:148;;;;:::o;37378:305::-;37418:3;37437:20;37455:1;37437:20;:::i;:::-;37432:25;;37471:20;37489:1;37471:20;:::i;:::-;37466:25;;37625:1;37557:66;37553:74;37550:1;37547:81;37544:107;;;37631:18;;:::i;:::-;37544:107;37675:1;37672;37668:9;37661:16;;37378:305;;;;:::o;37689:185::-;37729:1;37746:20;37764:1;37746:20;:::i;:::-;37741:25;;37780:20;37798:1;37780:20;:::i;:::-;37775:25;;37819:1;37809:35;;37824:18;;:::i;:::-;37809:35;37866:1;37863;37859:9;37854:14;;37689:185;;;;:::o;37880:191::-;37920:4;37940:20;37958:1;37940:20;:::i;:::-;37935:25;;37974:20;37992:1;37974:20;:::i;:::-;37969:25;;38013:1;38010;38007:8;38004:34;;;38018:18;;:::i;:::-;38004:34;38063:1;38060;38056:9;38048:17;;37880:191;;;;:::o;38077:96::-;38114:7;38143:24;38161:5;38143:24;:::i;:::-;38132:35;;38077:96;;;:::o;38179:90::-;38213:7;38256:5;38249:13;38242:21;38231:32;;38179:90;;;:::o;38275:149::-;38311:7;38351:66;38344:5;38340:78;38329:89;;38275:149;;;:::o;38430:126::-;38467:7;38507:42;38500:5;38496:54;38485:65;;38430:126;;;:::o;38562:77::-;38599:7;38628:5;38617:16;;38562:77;;;:::o;38645:154::-;38729:6;38724:3;38719;38706:30;38791:1;38782:6;38777:3;38773:16;38766:27;38645:154;;;:::o;38805:307::-;38873:1;38883:113;38897:6;38894:1;38891:13;38883:113;;;38982:1;38977:3;38973:11;38967:18;38963:1;38958:3;38954:11;38947:39;38919:2;38916:1;38912:10;38907:15;;38883:113;;;39014:6;39011:1;39008:13;39005:101;;;39094:1;39085:6;39080:3;39076:16;39069:27;39005:101;38854:258;38805:307;;;:::o;39118:320::-;39162:6;39199:1;39193:4;39189:12;39179:22;;39246:1;39240:4;39236:12;39267:18;39257:81;;39323:4;39315:6;39311:17;39301:27;;39257:81;39385:2;39377:6;39374:14;39354:18;39351:38;39348:84;;;39404:18;;:::i;:::-;39348:84;39169:269;39118:320;;;:::o;39444:281::-;39527:27;39549:4;39527:27;:::i;:::-;39519:6;39515:40;39657:6;39645:10;39642:22;39621:18;39609:10;39606:34;39603:62;39600:88;;;39668:18;;:::i;:::-;39600:88;39708:10;39704:2;39697:22;39487:238;39444:281;;:::o;39731:233::-;39770:3;39793:24;39811:5;39793:24;:::i;:::-;39784:33;;39839:66;39832:5;39829:77;39826:103;;;39909:18;;:::i;:::-;39826:103;39956:1;39949:5;39945:13;39938:20;;39731:233;;;:::o;39970:176::-;40002:1;40019:20;40037:1;40019:20;:::i;:::-;40014:25;;40053:20;40071:1;40053:20;:::i;:::-;40048:25;;40092:1;40082:35;;40097:18;;:::i;:::-;40082:35;40138:1;40135;40131:9;40126:14;;39970:176;;;;:::o;40152:180::-;40200:77;40197:1;40190:88;40297:4;40294:1;40287:15;40321:4;40318:1;40311:15;40338:180;40386:77;40383:1;40376:88;40483:4;40480:1;40473:15;40507:4;40504:1;40497:15;40524:180;40572:77;40569:1;40562:88;40669:4;40666:1;40659:15;40693:4;40690:1;40683:15;40710:180;40758:77;40755:1;40748:88;40855:4;40852:1;40845:15;40879:4;40876:1;40869:15;40896:180;40944:77;40941:1;40934:88;41041:4;41038:1;41031:15;41065:4;41062:1;41055:15;41082:180;41130:77;41127:1;41120:88;41227:4;41224:1;41217:15;41251:4;41248:1;41241:15;41268:117;41377:1;41374;41367:12;41391:117;41500:1;41497;41490:12;41514:117;41623:1;41620;41613:12;41637:117;41746:1;41743;41736:12;41760:117;41869:1;41866;41859:12;41883:117;41992:1;41989;41982:12;42006:102;42047:6;42098:2;42094:7;42089:2;42082:5;42078:14;42074:28;42064:38;;42006:102;;;:::o;42114:230::-;42254:34;42250:1;42242:6;42238:14;42231:58;42323:13;42318:2;42310:6;42306:15;42299:38;42114:230;:::o;42350:237::-;42490:34;42486:1;42478:6;42474:14;42467:58;42559:20;42554:2;42546:6;42542:15;42535:45;42350:237;:::o;42593:225::-;42733:34;42729:1;42721:6;42717:14;42710:58;42802:8;42797:2;42789:6;42785:15;42778:33;42593:225;:::o;42824:168::-;42964:20;42960:1;42952:6;42948:14;42941:44;42824:168;:::o;42998:178::-;43138:30;43134:1;43126:6;43122:14;43115:54;42998:178;:::o;43182:177::-;43322:29;43318:1;43310:6;43306:14;43299:53;43182:177;:::o;43365:237::-;43505:34;43501:1;43493:6;43489:14;43482:58;43574:20;43569:2;43561:6;43557:15;43550:45;43365:237;:::o;43608:223::-;43748:34;43744:1;43736:6;43732:14;43725:58;43817:6;43812:2;43804:6;43800:15;43793:31;43608:223;:::o;43837:175::-;43977:27;43973:1;43965:6;43961:14;43954:51;43837:175;:::o;44018:174::-;44158:26;44154:1;44146:6;44142:14;44135:50;44018:174;:::o;44198:231::-;44338:34;44334:1;44326:6;44322:14;44315:58;44407:14;44402:2;44394:6;44390:15;44383:39;44198:231;:::o;44435:243::-;44575:34;44571:1;44563:6;44559:14;44552:58;44644:26;44639:2;44631:6;44627:15;44620:51;44435:243;:::o;44684:229::-;44824:34;44820:1;44812:6;44808:14;44801:58;44893:12;44888:2;44880:6;44876:15;44869:37;44684:229;:::o;44919:228::-;45059:34;45055:1;45047:6;45043:14;45036:58;45128:11;45123:2;45115:6;45111:15;45104:36;44919:228;:::o;45153:179::-;45293:31;45289:1;45281:6;45277:14;45270:55;45153:179;:::o;45338:182::-;45478:34;45474:1;45466:6;45462:14;45455:58;45338:182;:::o;45526:231::-;45666:34;45662:1;45654:6;45650:14;45643:58;45735:14;45730:2;45722:6;45718:15;45711:39;45526:231;:::o;45763:182::-;45903:34;45899:1;45891:6;45887:14;45880:58;45763:182;:::o;45951:228::-;46091:34;46087:1;46079:6;46075:14;46068:58;46160:11;46155:2;46147:6;46143:15;46136:36;45951:228;:::o;46185:234::-;46325:34;46321:1;46313:6;46309:14;46302:58;46394:17;46389:2;46381:6;46377:15;46370:42;46185:234;:::o;46425:220::-;46565:34;46561:1;46553:6;46549:14;46542:58;46634:3;46629:2;46621:6;46617:15;46610:28;46425:220;:::o;46651:236::-;46791:34;46787:1;46779:6;46775:14;46768:58;46860:19;46855:2;46847:6;46843:15;46836:44;46651:236;:::o;46893:231::-;47033:34;47029:1;47021:6;47017:14;47010:58;47102:14;47097:2;47089:6;47085:15;47078:39;46893:231;:::o;47130:228::-;47270:34;47266:1;47258:6;47254:14;47247:58;47339:11;47334:2;47326:6;47322:15;47315:36;47130:228;:::o;47364:180::-;47504:32;47500:1;47492:6;47488:14;47481:56;47364:180;:::o;47550:122::-;47623:24;47641:5;47623:24;:::i;:::-;47616:5;47613:35;47603:63;;47662:1;47659;47652:12;47603:63;47550:122;:::o;47678:116::-;47748:21;47763:5;47748:21;:::i;:::-;47741:5;47738:32;47728:60;;47784:1;47781;47774:12;47728:60;47678:116;:::o;47800:120::-;47872:23;47889:5;47872:23;:::i;:::-;47865:5;47862:34;47852:62;;47910:1;47907;47900:12;47852:62;47800:120;:::o;47926:122::-;47999:24;48017:5;47999:24;:::i;:::-;47992:5;47989:35;47979:63;;48038:1;48035;48028:12;47979:63;47926:122;:::o

Swarm Source

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