Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,034 TF
Holders
276
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TFLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TF
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-06 */ // 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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File contracts/tf.sol /* ████████╗██╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██╗ ╚══██╔══╝██║ ██║██╔════╝██╔════╝██╔═══██╗██╔═══██╗██║ ██║ ███████║█████╗ █████╗ ██║ ██║██║ ██║██║ ██║ ██╔══██║██╔══╝ ██╔══╝ ██║ ██║██║ ██║██║ ██║ ██║ ██║███████╗██║ ╚██████╔╝╚██████╔╝███████╗ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ */ pragma solidity ^0.8.0; contract TF is ERC721, ERC721Enumerable, Ownable { string private _baseURIextended; address payable public immutable shareholderAddress; uint256 public constant maxSupply = 6555; uint256 public immutable maxMint = 10; uint256 public immutable freeSupply = 1000; bool public isSaleActive = false; constructor(address payable shareholderAddress_) ERC721("The Fool NFT", "TF") { require(shareholderAddress_ != address(0)); shareholderAddress = shareholderAddress_; _baseURIextended = "ipfs://QmSpv36AoMFJmn4KqGWYmGtMvnxXgP5F8P9QTaoznVyq4p/"; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function setBaseURI(string memory baseURI_) external onlyOwner() { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function freeMint(uint numberOfTokens) public { require(isSaleActive, "TF: Sale are not active"); require(numberOfTokens <= 5, "TF: You can only mint a maximum of 5 tokens per transaction"); require(balanceOf(msg.sender) + numberOfTokens <= maxMint, "TF: Maximum 10 per wallet"); require(totalSupply() + numberOfTokens <= freeSupply, "TF: Only the 1000 first mphers were free. Please use mint function now ;)"); for(uint i = 0; i < numberOfTokens; i++) { uint mintIndex = totalSupply(); if (totalSupply() < freeSupply) { _safeMint(msg.sender, mintIndex); } } } function toggleSale() external onlyOwner { isSaleActive = !isSaleActive; } function mint(uint numberOfTokens) public payable { require(isSaleActive, "TF: Sale are not active"); require(numberOfTokens <= 5, "TF: You can only mint a maximum of 5 tokens per transaction"); require(balanceOf(msg.sender) + numberOfTokens <= maxMint, "TF: Maximum 10 tokens per wallet"); require(totalSupply() + numberOfTokens <= maxSupply, "TF: Purchase would exceed max supply of tokens"); require(0.01 ether * numberOfTokens <= msg.value, "TF: Ether value sent is not correct"); for(uint i = 0; i < numberOfTokens; i++) { uint mintIndex = totalSupply(); if (totalSupply() < maxSupply) { _safeMint(msg.sender, mintIndex); } } } function withdraw() public onlyOwner { uint256 balance = address(this).balance; Address.sendValue(shareholderAddress, balance); } } // File contracts/libraries/Base64.sol /** *Submitted for verification at Etherscan.io on 2021-09-05 */ pragma solidity ^0.8.0; /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF) ) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF) ) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF) ) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"shareholderAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"shareholderAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052600a60a0908152506103e860c0908152506000600c60006101000a81548160ff0219169083151502179055503480156200003d57600080fd5b506040516200480f3803806200480f833981810160405281019062000063919062000363565b6040518060400160405280600c81526020017f54686520466f6f6c204e465400000000000000000000000000000000000000008152506040518060400160405280600281526020017f54460000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e79291906200029c565b508060019080519060200190620001009291906200029c565b5050506200012362000117620001ce60201b60201c565b620001d660201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200015e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050604051806060016040528060368152602001620047d960369139600b9080519060200190620001c69291906200029c565b505062000442565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002aa90620003c3565b90600052602060002090601f016020900481019282620002ce57600085556200031a565b82601f10620002e957805160ff19168380011785556200031a565b828001600101855582156200031a579182015b8281111562000319578251825591602001919060010190620002fc565b5b5090506200032991906200032d565b5090565b5b80821115620003485760008160009055506001016200032e565b5090565b6000815190506200035d8162000428565b92915050565b6000602082840312156200037657600080fd5b600062000386848285016200034c565b91505092915050565b60006200039c82620003a3565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003dc57607f821691505b60208210811415620003f357620003f2620003f9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b62000433816200038f565b81146200043f57600080fd5b50565b60805160601c60a05160c051614341620004986000396000818161098b01528181610f81015261100d015260008181610e5401528181610f0b015261127a015260008181610ad8015261113101526143416000f3fe6080604052600436106101c25760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd1461060d578063d5abeb011461064a578063e985e9c514610675578063f2fde38b146106b2576101c2565b806395d89b4114610574578063a0712d681461059f578063a22cb465146105bb578063b88d4fde146105e4576101c2565b80637c928fe9116100d15780637c928fe9146104de5780637d8966e4146105075780638da5cb5b1461051e578063943d40e714610549576101c2565b806370a082311461045f578063715018a61461049c5780637501f741146104b3576101c2565b80632f745c59116101645780634f6ccce71161013e5780634f6ccce71461039157806355f804b3146103ce578063564566a8146103f75780636352211e14610422576101c2565b80632f745c59146103145780633ccfd60b1461035157806342842e0e14610368576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c057806324a6ab0c146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612e9a565b6106db565b6040516101fb9190613ac2565b60405180910390f35b34801561021057600080fd5b506102196106ed565b6040516102269190613add565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612f2d565b61077f565b6040516102639190613a40565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612e5e565b610804565b005b3480156102a157600080fd5b506102aa61091c565b6040516102b79190613e5f565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612d58565b610929565b005b3480156102f557600080fd5b506102fe610989565b60405161030b9190613e5f565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190612e5e565b6109ad565b6040516103489190613e5f565b60405180910390f35b34801561035d57600080fd5b50610366610a52565b005b34801561037457600080fd5b5061038f600480360381019061038a9190612d58565b610b00565b005b34801561039d57600080fd5b506103b860048036038101906103b39190612f2d565b610b20565b6040516103c59190613e5f565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190612eec565b610bb7565b005b34801561040357600080fd5b5061040c610c4d565b6040516104199190613ac2565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190612f2d565b610c60565b6040516104569190613a40565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190612cf3565b610d12565b6040516104939190613e5f565b60405180910390f35b3480156104a857600080fd5b506104b1610dca565b005b3480156104bf57600080fd5b506104c8610e52565b6040516104d59190613e5f565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190612f2d565b610e76565b005b34801561051357600080fd5b5061051c61105d565b005b34801561052a57600080fd5b50610533611105565b6040516105409190613a40565b60405180910390f35b34801561055557600080fd5b5061055e61112f565b60405161056b9190613a5b565b60405180910390f35b34801561058057600080fd5b50610589611153565b6040516105969190613add565b60405180910390f35b6105b960048036038101906105b49190612f2d565b6111e5565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190612e22565b6113e5565b005b3480156105f057600080fd5b5061060b60048036038101906106069190612da7565b6113fb565b005b34801561061957600080fd5b50610634600480360381019061062f9190612f2d565b61145d565b6040516106419190613add565b60405180910390f35b34801561065657600080fd5b5061065f611504565b60405161066c9190613e5f565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190612d1c565b61150a565b6040516106a99190613ac2565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190612cf3565b61159e565b005b60006106e682611696565b9050919050565b6060600080546106fc90614136565b80601f016020809104026020016040519081016040528092919081815260200182805461072890614136565b80156107755780601f1061074a57610100808354040283529160200191610775565b820191906000526020600020905b81548152906001019060200180831161075857829003601f168201915b5050505050905090565b600061078a82611710565b6107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c090613cdf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080f82610c60565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790613d9f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089f61177c565b73ffffffffffffffffffffffffffffffffffffffff1614806108ce57506108cd816108c861177c565b61150a565b5b61090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090490613c5f565b60405180910390fd5b6109178383611784565b505050565b6000600880549050905090565b61093a61093461177c565b8261183d565b610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090613dbf565b60405180910390fd5b61098483838361191b565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109b883610d12565b82106109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090613aff565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a5a61177c565b73ffffffffffffffffffffffffffffffffffffffff16610a78611105565b73ffffffffffffffffffffffffffffffffffffffff1614610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590613d1f565b60405180910390fd5b6000479050610afd7f000000000000000000000000000000000000000000000000000000000000000082611b77565b50565b610b1b838383604051806020016040528060008152506113fb565b505050565b6000610b2a61091c565b8210610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613ddf565b60405180910390fd5b60088281548110610ba5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610bbf61177c565b73ffffffffffffffffffffffffffffffffffffffff16610bdd611105565b73ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90613d1f565b60405180910390fd5b80600b9080519060200190610c49929190612b17565b5050565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0090613c9f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90613c7f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd261177c565b73ffffffffffffffffffffffffffffffffffffffff16610df0611105565b73ffffffffffffffffffffffffffffffffffffffff1614610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90613d1f565b60405180910390fd5b610e506000611c6b565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c60009054906101000a900460ff16610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90613dff565b60405180910390fd5b6005811115610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090613e3f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610f3433610d12565b610f3e9190613f59565b1115610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690613bbf565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610fa961091c565b610fb39190613f59565b1115610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90613bff565b60405180910390fd5b60005b8181101561105957600061100961091c565b90507f000000000000000000000000000000000000000000000000000000000000000061103461091c565b1015611045576110443382611d31565b5b50808061105190614168565b915050610ff7565b5050565b61106561177c565b73ffffffffffffffffffffffffffffffffffffffff16611083611105565b73ffffffffffffffffffffffffffffffffffffffff16146110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613d1f565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606001805461116290614136565b80601f016020809104026020016040519081016040528092919081815260200182805461118e90614136565b80156111db5780601f106111b0576101008083540402835291602001916111db565b820191906000526020600020905b8154815290600101906020018083116111be57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff16611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b90613dff565b60405180910390fd5b6005811115611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90613e3f565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816112a333610d12565b6112ad9190613f59565b11156112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e590613cff565b60405180910390fd5b61199b816112fa61091c565b6113049190613f59565b1115611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90613d7f565b60405180910390fd5b3481662386f26fc100006113599190613fe0565b111561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613e1f565b60405180910390fd5b60005b818110156113e15760006113af61091c565b905061199b6113bc61091c565b10156113cd576113cc3382611d31565b5b5080806113d990614168565b91505061139d565b5050565b6113f76113f061177c565b8383611d4f565b5050565b61140c61140661177c565b8361183d565b61144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290613dbf565b60405180910390fd5b61145784848484611ebc565b50505050565b606061146882611710565b6114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90613d5f565b60405180910390fd5b60006114b1611f18565b905060008151116114d157604051806020016040528060008152506114fc565b806114db84611faa565b6040516020016114ec929190613a07565b6040516020818303038152906040525b915050919050565b61199b81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115a661177c565b73ffffffffffffffffffffffffffffffffffffffff166115c4611105565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190613d1f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190613b3f565b60405180910390fd5b61169381611c6b565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611709575061170882612157565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117f783610c60565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061184882611710565b611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90613c3f565b60405180910390fd5b600061189283610c60565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061190157508373ffffffffffffffffffffffffffffffffffffffff166118e98461077f565b73ffffffffffffffffffffffffffffffffffffffff16145b806119125750611911818561150a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661193b82610c60565b73ffffffffffffffffffffffffffffffffffffffff1614611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198890613d3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890613b7f565b60405180910390fd5b611a0c838383612239565b611a17600082611784565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a67919061403a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611abe9190613f59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb190613c1f565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611be090613a2b565b60006040518083038185875af1925050503d8060008114611c1d576040519150601f19603f3d011682016040523d82523d6000602084013e611c22565b606091505b5050905080611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d90613bdf565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d4b828260405180602001604052806000815250612249565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db590613b9f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eaf9190613ac2565b60405180910390a3505050565b611ec784848461191b565b611ed3848484846122a4565b611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0990613b1f565b60405180910390fd5b50505050565b6060600b8054611f2790614136565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5390614136565b8015611fa05780601f10611f7557610100808354040283529160200191611fa0565b820191906000526020600020905b815481529060010190602001808311611f8357829003601f168201915b5050505050905090565b60606000821415611ff2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612152565b600082905060005b6000821461202457808061200d90614168565b915050600a8261201d9190613faf565b9150611ffa565b60008167ffffffffffffffff811115612066577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120985781602001600182028036833780820191505090505b5090505b6000851461214b576001826120b1919061403a565b9150600a856120c091906141b1565b60306120cc9190613f59565b60f81b818381518110612108577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121449190613faf565b945061209c565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061222257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061223257506122318261243b565b5b9050919050565b6122448383836124a5565b505050565b61225383836125b9565b61226060008484846122a4565b61229f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229690613b1f565b60405180910390fd5b505050565b60006122c58473ffffffffffffffffffffffffffffffffffffffff16612787565b1561242e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122ee61177c565b8786866040518563ffffffff1660e01b81526004016123109493929190613a76565b602060405180830381600087803b15801561232a57600080fd5b505af192505050801561235b57506040513d601f19601f820116820180604052508101906123589190612ec3565b60015b6123de573d806000811461238b576040519150601f19603f3d011682016040523d82523d6000602084013e612390565b606091505b506000815114156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90613b1f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612433565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124b083838361279a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124f3576124ee8161279f565b612532565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125315761253083826127e8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125755761257081612955565b6125b4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125b3576125b28282612a98565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262090613cbf565b60405180910390fd5b61263281611710565b15612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990613b5f565b60405180910390fd5b61267e60008383612239565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ce9190613f59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127f584610d12565b6127ff919061403a565b90506000600760008481526020019081526020016000205490508181146128e4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612969919061403a565b90506000600960008481526020019081526020016000205490506000600883815481106129bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a07577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612aa383610d12565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612b2390614136565b90600052602060002090601f016020900481019282612b455760008555612b8c565b82601f10612b5e57805160ff1916838001178555612b8c565b82800160010185558215612b8c579182015b82811115612b8b578251825591602001919060010190612b70565b5b509050612b999190612b9d565b5090565b5b80821115612bb6576000816000905550600101612b9e565b5090565b6000612bcd612bc884613eab565b613e7a565b905082815260208101848484011115612be557600080fd5b612bf08482856140f4565b509392505050565b6000612c0b612c0684613edb565b613e7a565b905082815260208101848484011115612c2357600080fd5b612c2e8482856140f4565b509392505050565b600081359050612c45816142af565b92915050565b600081359050612c5a816142c6565b92915050565b600081359050612c6f816142dd565b92915050565b600081519050612c84816142dd565b92915050565b600082601f830112612c9b57600080fd5b8135612cab848260208601612bba565b91505092915050565b600082601f830112612cc557600080fd5b8135612cd5848260208601612bf8565b91505092915050565b600081359050612ced816142f4565b92915050565b600060208284031215612d0557600080fd5b6000612d1384828501612c36565b91505092915050565b60008060408385031215612d2f57600080fd5b6000612d3d85828601612c36565b9250506020612d4e85828601612c36565b9150509250929050565b600080600060608486031215612d6d57600080fd5b6000612d7b86828701612c36565b9350506020612d8c86828701612c36565b9250506040612d9d86828701612cde565b9150509250925092565b60008060008060808587031215612dbd57600080fd5b6000612dcb87828801612c36565b9450506020612ddc87828801612c36565b9350506040612ded87828801612cde565b925050606085013567ffffffffffffffff811115612e0a57600080fd5b612e1687828801612c8a565b91505092959194509250565b60008060408385031215612e3557600080fd5b6000612e4385828601612c36565b9250506020612e5485828601612c4b565b9150509250929050565b60008060408385031215612e7157600080fd5b6000612e7f85828601612c36565b9250506020612e9085828601612cde565b9150509250929050565b600060208284031215612eac57600080fd5b6000612eba84828501612c60565b91505092915050565b600060208284031215612ed557600080fd5b6000612ee384828501612c75565b91505092915050565b600060208284031215612efe57600080fd5b600082013567ffffffffffffffff811115612f1857600080fd5b612f2484828501612cb4565b91505092915050565b600060208284031215612f3f57600080fd5b6000612f4d84828501612cde565b91505092915050565b612f5f81614080565b82525050565b612f6e8161406e565b82525050565b612f7d81614092565b82525050565b6000612f8e82613f0b565b612f988185613f21565b9350612fa8818560208601614103565b612fb18161429e565b840191505092915050565b6000612fc782613f16565b612fd18185613f3d565b9350612fe1818560208601614103565b612fea8161429e565b840191505092915050565b600061300082613f16565b61300a8185613f4e565b935061301a818560208601614103565b80840191505092915050565b6000613033602b83613f3d565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613099603283613f3d565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006130ff602683613f3d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613165601c83613f3d565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006131a5602483613f3d565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061320b601983613f3d565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061324b601983613f3d565b91507f54463a204d6178696d756d203130207065722077616c6c6574000000000000006000830152602082019050919050565b600061328b603a83613f3d565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006132f1604983613f3d565b91507f54463a204f6e6c79207468652031303030206669727374206d7068657273207760008301527f65726520667265652e20506c6561736520757365206d696e742066756e63746960208301527f6f6e206e6f77203b2900000000000000000000000000000000000000000000006040830152606082019050919050565b600061337d601d83613f3d565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006133bd602c83613f3d565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613423603883613f3d565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613489602a83613f3d565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006134ef602983613f3d565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613555602083613f3d565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613595602c83613f3d565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006135fb602083613f3d565b91507f54463a204d6178696d756d20313020746f6b656e73207065722077616c6c65746000830152602082019050919050565b600061363b602083613f3d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061367b602983613f3d565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e1602f83613f3d565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613747602e83613f3d565b91507f54463a20507572636861736520776f756c6420657863656564206d617820737560008301527f70706c79206f6620746f6b656e730000000000000000000000000000000000006020830152604082019050919050565b60006137ad602183613f3d565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613813600083613f32565b9150600082019050919050565b600061382d603183613f3d565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613893602c83613f3d565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006138f9601783613f3d565b91507f54463a2053616c6520617265206e6f74206163746976650000000000000000006000830152602082019050919050565b6000613939602383613f3d565b91507f54463a2045746865722076616c75652073656e74206973206e6f7420636f727260008301527f65637400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061399f603b83613f3d565b91507f54463a20596f752063616e206f6e6c79206d696e742061206d6178696d756d2060008301527f6f66203520746f6b656e7320706572207472616e73616374696f6e00000000006020830152604082019050919050565b613a01816140ea565b82525050565b6000613a138285612ff5565b9150613a1f8284612ff5565b91508190509392505050565b6000613a3682613806565b9150819050919050565b6000602082019050613a556000830184612f65565b92915050565b6000602082019050613a706000830184612f56565b92915050565b6000608082019050613a8b6000830187612f65565b613a986020830186612f65565b613aa560408301856139f8565b8181036060830152613ab78184612f83565b905095945050505050565b6000602082019050613ad76000830184612f74565b92915050565b60006020820190508181036000830152613af78184612fbc565b905092915050565b60006020820190508181036000830152613b1881613026565b9050919050565b60006020820190508181036000830152613b388161308c565b9050919050565b60006020820190508181036000830152613b58816130f2565b9050919050565b60006020820190508181036000830152613b7881613158565b9050919050565b60006020820190508181036000830152613b9881613198565b9050919050565b60006020820190508181036000830152613bb8816131fe565b9050919050565b60006020820190508181036000830152613bd88161323e565b9050919050565b60006020820190508181036000830152613bf88161327e565b9050919050565b60006020820190508181036000830152613c18816132e4565b9050919050565b60006020820190508181036000830152613c3881613370565b9050919050565b60006020820190508181036000830152613c58816133b0565b9050919050565b60006020820190508181036000830152613c7881613416565b9050919050565b60006020820190508181036000830152613c988161347c565b9050919050565b60006020820190508181036000830152613cb8816134e2565b9050919050565b60006020820190508181036000830152613cd881613548565b9050919050565b60006020820190508181036000830152613cf881613588565b9050919050565b60006020820190508181036000830152613d18816135ee565b9050919050565b60006020820190508181036000830152613d388161362e565b9050919050565b60006020820190508181036000830152613d588161366e565b9050919050565b60006020820190508181036000830152613d78816136d4565b9050919050565b60006020820190508181036000830152613d988161373a565b9050919050565b60006020820190508181036000830152613db8816137a0565b9050919050565b60006020820190508181036000830152613dd881613820565b9050919050565b60006020820190508181036000830152613df881613886565b9050919050565b60006020820190508181036000830152613e18816138ec565b9050919050565b60006020820190508181036000830152613e388161392c565b9050919050565b60006020820190508181036000830152613e5881613992565b9050919050565b6000602082019050613e7460008301846139f8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613ea157613ea061426f565b5b8060405250919050565b600067ffffffffffffffff821115613ec657613ec561426f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613ef657613ef561426f565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f64826140ea565b9150613f6f836140ea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fa457613fa36141e2565b5b828201905092915050565b6000613fba826140ea565b9150613fc5836140ea565b925082613fd557613fd4614211565b5b828204905092915050565b6000613feb826140ea565b9150613ff6836140ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561402f5761402e6141e2565b5b828202905092915050565b6000614045826140ea565b9150614050836140ea565b925082821015614063576140626141e2565b5b828203905092915050565b6000614079826140ca565b9050919050565b600061408b826140ca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614121578082015181840152602081019050614106565b83811115614130576000848401525b50505050565b6000600282049050600182168061414e57607f821691505b6020821081141561416257614161614240565b5b50919050565b6000614173826140ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141a6576141a56141e2565b5b600182019050919050565b60006141bc826140ea565b91506141c7836140ea565b9250826141d7576141d6614211565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6142b88161406e565b81146142c357600080fd5b50565b6142cf81614092565b81146142da57600080fd5b50565b6142e68161409e565b81146142f157600080fd5b50565b6142fd816140ea565b811461430857600080fd5b5056fea2646970667358221220121a6b76a2c28fc4d15b2c0255afafe6c71a9ef00c7ae197a85510587c6609a264736f6c63430008000033697066733a2f2f516d5370763336416f4d464a6d6e344b714757596d47744d766e7858675035463850395154616f7a6e56797134702f0000000000000000000000004e7d70ece7d4a1d3f9837942e3fdaa3ece051a84
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd1461060d578063d5abeb011461064a578063e985e9c514610675578063f2fde38b146106b2576101c2565b806395d89b4114610574578063a0712d681461059f578063a22cb465146105bb578063b88d4fde146105e4576101c2565b80637c928fe9116100d15780637c928fe9146104de5780637d8966e4146105075780638da5cb5b1461051e578063943d40e714610549576101c2565b806370a082311461045f578063715018a61461049c5780637501f741146104b3576101c2565b80632f745c59116101645780634f6ccce71161013e5780634f6ccce71461039157806355f804b3146103ce578063564566a8146103f75780636352211e14610422576101c2565b80632f745c59146103145780633ccfd60b1461035157806342842e0e14610368576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c057806324a6ab0c146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612e9a565b6106db565b6040516101fb9190613ac2565b60405180910390f35b34801561021057600080fd5b506102196106ed565b6040516102269190613add565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612f2d565b61077f565b6040516102639190613a40565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612e5e565b610804565b005b3480156102a157600080fd5b506102aa61091c565b6040516102b79190613e5f565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612d58565b610929565b005b3480156102f557600080fd5b506102fe610989565b60405161030b9190613e5f565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190612e5e565b6109ad565b6040516103489190613e5f565b60405180910390f35b34801561035d57600080fd5b50610366610a52565b005b34801561037457600080fd5b5061038f600480360381019061038a9190612d58565b610b00565b005b34801561039d57600080fd5b506103b860048036038101906103b39190612f2d565b610b20565b6040516103c59190613e5f565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190612eec565b610bb7565b005b34801561040357600080fd5b5061040c610c4d565b6040516104199190613ac2565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190612f2d565b610c60565b6040516104569190613a40565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190612cf3565b610d12565b6040516104939190613e5f565b60405180910390f35b3480156104a857600080fd5b506104b1610dca565b005b3480156104bf57600080fd5b506104c8610e52565b6040516104d59190613e5f565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190612f2d565b610e76565b005b34801561051357600080fd5b5061051c61105d565b005b34801561052a57600080fd5b50610533611105565b6040516105409190613a40565b60405180910390f35b34801561055557600080fd5b5061055e61112f565b60405161056b9190613a5b565b60405180910390f35b34801561058057600080fd5b50610589611153565b6040516105969190613add565b60405180910390f35b6105b960048036038101906105b49190612f2d565b6111e5565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190612e22565b6113e5565b005b3480156105f057600080fd5b5061060b60048036038101906106069190612da7565b6113fb565b005b34801561061957600080fd5b50610634600480360381019061062f9190612f2d565b61145d565b6040516106419190613add565b60405180910390f35b34801561065657600080fd5b5061065f611504565b60405161066c9190613e5f565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190612d1c565b61150a565b6040516106a99190613ac2565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190612cf3565b61159e565b005b60006106e682611696565b9050919050565b6060600080546106fc90614136565b80601f016020809104026020016040519081016040528092919081815260200182805461072890614136565b80156107755780601f1061074a57610100808354040283529160200191610775565b820191906000526020600020905b81548152906001019060200180831161075857829003601f168201915b5050505050905090565b600061078a82611710565b6107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c090613cdf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080f82610c60565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790613d9f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089f61177c565b73ffffffffffffffffffffffffffffffffffffffff1614806108ce57506108cd816108c861177c565b61150a565b5b61090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090490613c5f565b60405180910390fd5b6109178383611784565b505050565b6000600880549050905090565b61093a61093461177c565b8261183d565b610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090613dbf565b60405180910390fd5b61098483838361191b565b505050565b7f00000000000000000000000000000000000000000000000000000000000003e881565b60006109b883610d12565b82106109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090613aff565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a5a61177c565b73ffffffffffffffffffffffffffffffffffffffff16610a78611105565b73ffffffffffffffffffffffffffffffffffffffff1614610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590613d1f565b60405180910390fd5b6000479050610afd7f0000000000000000000000004e7d70ece7d4a1d3f9837942e3fdaa3ece051a8482611b77565b50565b610b1b838383604051806020016040528060008152506113fb565b505050565b6000610b2a61091c565b8210610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613ddf565b60405180910390fd5b60088281548110610ba5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610bbf61177c565b73ffffffffffffffffffffffffffffffffffffffff16610bdd611105565b73ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90613d1f565b60405180910390fd5b80600b9080519060200190610c49929190612b17565b5050565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0090613c9f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90613c7f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd261177c565b73ffffffffffffffffffffffffffffffffffffffff16610df0611105565b73ffffffffffffffffffffffffffffffffffffffff1614610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90613d1f565b60405180910390fd5b610e506000611c6b565b565b7f000000000000000000000000000000000000000000000000000000000000000a81565b600c60009054906101000a900460ff16610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90613dff565b60405180910390fd5b6005811115610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090613e3f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a81610f3433610d12565b610f3e9190613f59565b1115610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690613bbf565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e881610fa961091c565b610fb39190613f59565b1115610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90613bff565b60405180910390fd5b60005b8181101561105957600061100961091c565b90507f00000000000000000000000000000000000000000000000000000000000003e861103461091c565b1015611045576110443382611d31565b5b50808061105190614168565b915050610ff7565b5050565b61106561177c565b73ffffffffffffffffffffffffffffffffffffffff16611083611105565b73ffffffffffffffffffffffffffffffffffffffff16146110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613d1f565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f0000000000000000000000004e7d70ece7d4a1d3f9837942e3fdaa3ece051a8481565b60606001805461116290614136565b80601f016020809104026020016040519081016040528092919081815260200182805461118e90614136565b80156111db5780601f106111b0576101008083540402835291602001916111db565b820191906000526020600020905b8154815290600101906020018083116111be57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff16611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b90613dff565b60405180910390fd5b6005811115611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90613e3f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a816112a333610d12565b6112ad9190613f59565b11156112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e590613cff565b60405180910390fd5b61199b816112fa61091c565b6113049190613f59565b1115611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90613d7f565b60405180910390fd5b3481662386f26fc100006113599190613fe0565b111561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613e1f565b60405180910390fd5b60005b818110156113e15760006113af61091c565b905061199b6113bc61091c565b10156113cd576113cc3382611d31565b5b5080806113d990614168565b91505061139d565b5050565b6113f76113f061177c565b8383611d4f565b5050565b61140c61140661177c565b8361183d565b61144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290613dbf565b60405180910390fd5b61145784848484611ebc565b50505050565b606061146882611710565b6114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90613d5f565b60405180910390fd5b60006114b1611f18565b905060008151116114d157604051806020016040528060008152506114fc565b806114db84611faa565b6040516020016114ec929190613a07565b6040516020818303038152906040525b915050919050565b61199b81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115a661177c565b73ffffffffffffffffffffffffffffffffffffffff166115c4611105565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190613d1f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190613b3f565b60405180910390fd5b61169381611c6b565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611709575061170882612157565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117f783610c60565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061184882611710565b611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90613c3f565b60405180910390fd5b600061189283610c60565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061190157508373ffffffffffffffffffffffffffffffffffffffff166118e98461077f565b73ffffffffffffffffffffffffffffffffffffffff16145b806119125750611911818561150a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661193b82610c60565b73ffffffffffffffffffffffffffffffffffffffff1614611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198890613d3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890613b7f565b60405180910390fd5b611a0c838383612239565b611a17600082611784565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a67919061403a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611abe9190613f59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb190613c1f565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611be090613a2b565b60006040518083038185875af1925050503d8060008114611c1d576040519150601f19603f3d011682016040523d82523d6000602084013e611c22565b606091505b5050905080611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d90613bdf565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d4b828260405180602001604052806000815250612249565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db590613b9f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eaf9190613ac2565b60405180910390a3505050565b611ec784848461191b565b611ed3848484846122a4565b611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0990613b1f565b60405180910390fd5b50505050565b6060600b8054611f2790614136565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5390614136565b8015611fa05780601f10611f7557610100808354040283529160200191611fa0565b820191906000526020600020905b815481529060010190602001808311611f8357829003601f168201915b5050505050905090565b60606000821415611ff2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612152565b600082905060005b6000821461202457808061200d90614168565b915050600a8261201d9190613faf565b9150611ffa565b60008167ffffffffffffffff811115612066577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120985781602001600182028036833780820191505090505b5090505b6000851461214b576001826120b1919061403a565b9150600a856120c091906141b1565b60306120cc9190613f59565b60f81b818381518110612108577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121449190613faf565b945061209c565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061222257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061223257506122318261243b565b5b9050919050565b6122448383836124a5565b505050565b61225383836125b9565b61226060008484846122a4565b61229f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229690613b1f565b60405180910390fd5b505050565b60006122c58473ffffffffffffffffffffffffffffffffffffffff16612787565b1561242e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122ee61177c565b8786866040518563ffffffff1660e01b81526004016123109493929190613a76565b602060405180830381600087803b15801561232a57600080fd5b505af192505050801561235b57506040513d601f19601f820116820180604052508101906123589190612ec3565b60015b6123de573d806000811461238b576040519150601f19603f3d011682016040523d82523d6000602084013e612390565b606091505b506000815114156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90613b1f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612433565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124b083838361279a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124f3576124ee8161279f565b612532565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125315761253083826127e8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125755761257081612955565b6125b4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125b3576125b28282612a98565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262090613cbf565b60405180910390fd5b61263281611710565b15612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990613b5f565b60405180910390fd5b61267e60008383612239565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ce9190613f59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127f584610d12565b6127ff919061403a565b90506000600760008481526020019081526020016000205490508181146128e4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612969919061403a565b90506000600960008481526020019081526020016000205490506000600883815481106129bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a07577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612aa383610d12565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612b2390614136565b90600052602060002090601f016020900481019282612b455760008555612b8c565b82601f10612b5e57805160ff1916838001178555612b8c565b82800160010185558215612b8c579182015b82811115612b8b578251825591602001919060010190612b70565b5b509050612b999190612b9d565b5090565b5b80821115612bb6576000816000905550600101612b9e565b5090565b6000612bcd612bc884613eab565b613e7a565b905082815260208101848484011115612be557600080fd5b612bf08482856140f4565b509392505050565b6000612c0b612c0684613edb565b613e7a565b905082815260208101848484011115612c2357600080fd5b612c2e8482856140f4565b509392505050565b600081359050612c45816142af565b92915050565b600081359050612c5a816142c6565b92915050565b600081359050612c6f816142dd565b92915050565b600081519050612c84816142dd565b92915050565b600082601f830112612c9b57600080fd5b8135612cab848260208601612bba565b91505092915050565b600082601f830112612cc557600080fd5b8135612cd5848260208601612bf8565b91505092915050565b600081359050612ced816142f4565b92915050565b600060208284031215612d0557600080fd5b6000612d1384828501612c36565b91505092915050565b60008060408385031215612d2f57600080fd5b6000612d3d85828601612c36565b9250506020612d4e85828601612c36565b9150509250929050565b600080600060608486031215612d6d57600080fd5b6000612d7b86828701612c36565b9350506020612d8c86828701612c36565b9250506040612d9d86828701612cde565b9150509250925092565b60008060008060808587031215612dbd57600080fd5b6000612dcb87828801612c36565b9450506020612ddc87828801612c36565b9350506040612ded87828801612cde565b925050606085013567ffffffffffffffff811115612e0a57600080fd5b612e1687828801612c8a565b91505092959194509250565b60008060408385031215612e3557600080fd5b6000612e4385828601612c36565b9250506020612e5485828601612c4b565b9150509250929050565b60008060408385031215612e7157600080fd5b6000612e7f85828601612c36565b9250506020612e9085828601612cde565b9150509250929050565b600060208284031215612eac57600080fd5b6000612eba84828501612c60565b91505092915050565b600060208284031215612ed557600080fd5b6000612ee384828501612c75565b91505092915050565b600060208284031215612efe57600080fd5b600082013567ffffffffffffffff811115612f1857600080fd5b612f2484828501612cb4565b91505092915050565b600060208284031215612f3f57600080fd5b6000612f4d84828501612cde565b91505092915050565b612f5f81614080565b82525050565b612f6e8161406e565b82525050565b612f7d81614092565b82525050565b6000612f8e82613f0b565b612f988185613f21565b9350612fa8818560208601614103565b612fb18161429e565b840191505092915050565b6000612fc782613f16565b612fd18185613f3d565b9350612fe1818560208601614103565b612fea8161429e565b840191505092915050565b600061300082613f16565b61300a8185613f4e565b935061301a818560208601614103565b80840191505092915050565b6000613033602b83613f3d565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613099603283613f3d565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006130ff602683613f3d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613165601c83613f3d565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006131a5602483613f3d565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061320b601983613f3d565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061324b601983613f3d565b91507f54463a204d6178696d756d203130207065722077616c6c6574000000000000006000830152602082019050919050565b600061328b603a83613f3d565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006132f1604983613f3d565b91507f54463a204f6e6c79207468652031303030206669727374206d7068657273207760008301527f65726520667265652e20506c6561736520757365206d696e742066756e63746960208301527f6f6e206e6f77203b2900000000000000000000000000000000000000000000006040830152606082019050919050565b600061337d601d83613f3d565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006133bd602c83613f3d565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613423603883613f3d565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613489602a83613f3d565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006134ef602983613f3d565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613555602083613f3d565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613595602c83613f3d565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006135fb602083613f3d565b91507f54463a204d6178696d756d20313020746f6b656e73207065722077616c6c65746000830152602082019050919050565b600061363b602083613f3d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061367b602983613f3d565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e1602f83613f3d565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613747602e83613f3d565b91507f54463a20507572636861736520776f756c6420657863656564206d617820737560008301527f70706c79206f6620746f6b656e730000000000000000000000000000000000006020830152604082019050919050565b60006137ad602183613f3d565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613813600083613f32565b9150600082019050919050565b600061382d603183613f3d565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613893602c83613f3d565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006138f9601783613f3d565b91507f54463a2053616c6520617265206e6f74206163746976650000000000000000006000830152602082019050919050565b6000613939602383613f3d565b91507f54463a2045746865722076616c75652073656e74206973206e6f7420636f727260008301527f65637400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061399f603b83613f3d565b91507f54463a20596f752063616e206f6e6c79206d696e742061206d6178696d756d2060008301527f6f66203520746f6b656e7320706572207472616e73616374696f6e00000000006020830152604082019050919050565b613a01816140ea565b82525050565b6000613a138285612ff5565b9150613a1f8284612ff5565b91508190509392505050565b6000613a3682613806565b9150819050919050565b6000602082019050613a556000830184612f65565b92915050565b6000602082019050613a706000830184612f56565b92915050565b6000608082019050613a8b6000830187612f65565b613a986020830186612f65565b613aa560408301856139f8565b8181036060830152613ab78184612f83565b905095945050505050565b6000602082019050613ad76000830184612f74565b92915050565b60006020820190508181036000830152613af78184612fbc565b905092915050565b60006020820190508181036000830152613b1881613026565b9050919050565b60006020820190508181036000830152613b388161308c565b9050919050565b60006020820190508181036000830152613b58816130f2565b9050919050565b60006020820190508181036000830152613b7881613158565b9050919050565b60006020820190508181036000830152613b9881613198565b9050919050565b60006020820190508181036000830152613bb8816131fe565b9050919050565b60006020820190508181036000830152613bd88161323e565b9050919050565b60006020820190508181036000830152613bf88161327e565b9050919050565b60006020820190508181036000830152613c18816132e4565b9050919050565b60006020820190508181036000830152613c3881613370565b9050919050565b60006020820190508181036000830152613c58816133b0565b9050919050565b60006020820190508181036000830152613c7881613416565b9050919050565b60006020820190508181036000830152613c988161347c565b9050919050565b60006020820190508181036000830152613cb8816134e2565b9050919050565b60006020820190508181036000830152613cd881613548565b9050919050565b60006020820190508181036000830152613cf881613588565b9050919050565b60006020820190508181036000830152613d18816135ee565b9050919050565b60006020820190508181036000830152613d388161362e565b9050919050565b60006020820190508181036000830152613d588161366e565b9050919050565b60006020820190508181036000830152613d78816136d4565b9050919050565b60006020820190508181036000830152613d988161373a565b9050919050565b60006020820190508181036000830152613db8816137a0565b9050919050565b60006020820190508181036000830152613dd881613820565b9050919050565b60006020820190508181036000830152613df881613886565b9050919050565b60006020820190508181036000830152613e18816138ec565b9050919050565b60006020820190508181036000830152613e388161392c565b9050919050565b60006020820190508181036000830152613e5881613992565b9050919050565b6000602082019050613e7460008301846139f8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613ea157613ea061426f565b5b8060405250919050565b600067ffffffffffffffff821115613ec657613ec561426f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613ef657613ef561426f565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f64826140ea565b9150613f6f836140ea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fa457613fa36141e2565b5b828201905092915050565b6000613fba826140ea565b9150613fc5836140ea565b925082613fd557613fd4614211565b5b828204905092915050565b6000613feb826140ea565b9150613ff6836140ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561402f5761402e6141e2565b5b828202905092915050565b6000614045826140ea565b9150614050836140ea565b925082821015614063576140626141e2565b5b828203905092915050565b6000614079826140ca565b9050919050565b600061408b826140ca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614121578082015181840152602081019050614106565b83811115614130576000848401525b50505050565b6000600282049050600182168061414e57607f821691505b6020821081141561416257614161614240565b5b50919050565b6000614173826140ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141a6576141a56141e2565b5b600182019050919050565b60006141bc826140ea565b91506141c7836140ea565b9250826141d7576141d6614211565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6142b88161406e565b81146142c357600080fd5b50565b6142cf81614092565b81146142da57600080fd5b50565b6142e68161409e565b81146142f157600080fd5b50565b6142fd816140ea565b811461430857600080fd5b5056fea2646970667358221220121a6b76a2c28fc4d15b2c0255afafe6c71a9ef00c7ae197a85510587c6609a264736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004e7d70ece7d4a1d3f9837942e3fdaa3ece051a84
-----Decoded View---------------
Arg [0] : shareholderAddress_ (address): 0x4e7d70ECe7D4A1d3f9837942E3fDaA3ece051A84
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004e7d70ece7d4a1d3f9837942e3fdaa3ece051a84
Deployed Bytecode Sourcemap
46620:2941:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47432:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23197:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24756:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24279:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39964:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25506:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46863:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39632:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49406:152;;;;;;;;;;;;;:::i;:::-;;25916:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40154:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47619:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46920:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22891:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22621:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36411:103;;;;;;;;;;;;;:::i;:::-;;46819:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47863:677;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48546:88;;;;;;;;;;;;;:::i;:::-;;35760:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46714:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23366:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48640:758;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25049:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26172:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23541:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46772:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25275:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36669:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47432:179;47543:4;47567:36;47591:11;47567:23;:36::i;:::-;47560:43;;47432:179;;;:::o;23197:100::-;23251:13;23284:5;23277:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23197:100;:::o;24756:221::-;24832:7;24860:16;24868:7;24860;:16::i;:::-;24852:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24945:15;:24;24961:7;24945:24;;;;;;;;;;;;;;;;;;;;;24938:31;;24756:221;;;:::o;24279:411::-;24360:13;24376:23;24391:7;24376:14;:23::i;:::-;24360:39;;24424:5;24418:11;;:2;:11;;;;24410:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24518:5;24502:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24527:37;24544:5;24551:12;:10;:12::i;:::-;24527:16;:37::i;:::-;24502:62;24480:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24661:21;24670:2;24674:7;24661:8;:21::i;:::-;24279:411;;;:::o;39964:113::-;40025:7;40052:10;:17;;;;40045:24;;39964:113;:::o;25506:339::-;25701:41;25720:12;:10;:12::i;:::-;25734:7;25701:18;:41::i;:::-;25693:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25809:28;25819:4;25825:2;25829:7;25809:9;:28::i;:::-;25506:339;;;:::o;46863:42::-;;;:::o;39632:256::-;39729:7;39765:23;39782:5;39765:16;:23::i;:::-;39757:5;:31;39749:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39854:12;:19;39867:5;39854:19;;;;;;;;;;;;;;;:26;39874:5;39854:26;;;;;;;;;;;;39847:33;;39632:256;;;;:::o;49406:152::-;35991:12;:10;:12::i;:::-;35980:23;;:7;:5;:7::i;:::-;:23;;;35972:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49454:15:::1;49472:21;49454:39;;49504:46;49522:18;49542:7;49504:17;:46::i;:::-;36051:1;49406:152::o:0;25916:185::-;26054:39;26071:4;26077:2;26081:7;26054:39;;;;;;;;;;;;:16;:39::i;:::-;25916:185;;;:::o;40154:233::-;40229:7;40265:30;:28;:30::i;:::-;40257:5;:38;40249:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40362:10;40373:5;40362:17;;;;;;;;;;;;;;;;;;;;;;;;40355:24;;40154:233;;;:::o;47619:111::-;35991:12;:10;:12::i;:::-;35980:23;;:7;:5;:7::i;:::-;:23;;;35972:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47714:8:::1;47695:16;:27;;;;;;;;;;;;:::i;:::-;;47619:111:::0;:::o;46920:32::-;;;;;;;;;;;;;:::o;22891:239::-;22963:7;22983:13;22999:7;:16;23007:7;22999:16;;;;;;;;;;;;;;;;;;;;;22983:32;;23051:1;23034:19;;:5;:19;;;;23026:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23117:5;23110:12;;;22891:239;;;:::o;22621:208::-;22693:7;22738:1;22721:19;;:5;:19;;;;22713:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22805:9;:16;22815:5;22805:16;;;;;;;;;;;;;;;;22798:23;;22621:208;;;:::o;36411:103::-;35991:12;:10;:12::i;:::-;35980:23;;:7;:5;:7::i;:::-;:23;;;35972:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36476:30:::1;36503:1;36476:18;:30::i;:::-;36411:103::o:0;46819:37::-;;;:::o;47863:677::-;47930:12;;;;;;;;;;;47922:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48007:1;47989:14;:19;;47981:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;48133:7;48115:14;48091:21;48101:10;48091:9;:21::i;:::-;:38;;;;:::i;:::-;:49;;48083:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48223:10;48205:14;48189:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;48181:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;48326:6;48322:211;48342:14;48338:1;:18;48322:211;;;48378:14;48395:13;:11;:13::i;:::-;48378:30;;48443:10;48427:13;:11;:13::i;:::-;:26;48423:99;;;48474:32;48484:10;48496:9;48474;:32::i;:::-;48423:99;48322:211;48358:3;;;;;:::i;:::-;;;;48322:211;;;;47863:677;:::o;48546:88::-;35991:12;:10;:12::i;:::-;35980:23;;:7;:5;:7::i;:::-;:23;;;35972:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48614:12:::1;;;;;;;;;;;48613:13;48598:12;;:28;;;;;;;;;;;;;;;;;;48546:88::o:0;35760:87::-;35806:7;35833:6;;;;;;;;;;;35826:13;;35760:87;:::o;46714:51::-;;;:::o;23366:104::-;23422:13;23455:7;23448:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23366:104;:::o;48640:758::-;48709:12;;;;;;;;;;;48701:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48786:1;48768:14;:19;;48760:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;48912:7;48894:14;48870:21;48880:10;48870:9;:21::i;:::-;:38;;;;:::i;:::-;:49;;48862:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;46808:4;48991:14;48975:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;48967:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;49119:9;49101:14;49088:10;:27;;;;:::i;:::-;:40;;49080:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;49185:6;49181:210;49201:14;49197:1;:18;49181:210;;;49237:14;49254:13;:11;:13::i;:::-;49237:30;;46808:4;49286:13;:11;:13::i;:::-;:25;49282:98;;;49332:32;49342:10;49354:9;49332;:32::i;:::-;49282:98;49181:210;49217:3;;;;;:::i;:::-;;;;49181:210;;;;48640:758;:::o;25049:155::-;25144:52;25163:12;:10;:12::i;:::-;25177:8;25187;25144:18;:52::i;:::-;25049:155;;:::o;26172:328::-;26347:41;26366:12;:10;:12::i;:::-;26380:7;26347:18;:41::i;:::-;26339:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26453:39;26467:4;26473:2;26477:7;26486:5;26453:13;:39::i;:::-;26172:328;;;;:::o;23541:334::-;23614:13;23648:16;23656:7;23648;:16::i;:::-;23640:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23729:21;23753:10;:8;:10::i;:::-;23729:34;;23805:1;23787:7;23781:21;:25;:86;;;;;;;;;;;;;;;;;23833:7;23842:18;:7;:16;:18::i;:::-;23816:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23781:86;23774:93;;;23541:334;;;:::o;46772:40::-;46808:4;46772:40;:::o;25275:164::-;25372:4;25396:18;:25;25415:5;25396:25;;;;;;;;;;;;;;;:35;25422:8;25396:35;;;;;;;;;;;;;;;;;;;;;;;;;25389:42;;25275:164;;;;:::o;36669:201::-;35991:12;:10;:12::i;:::-;35980:23;;:7;:5;:7::i;:::-;:23;;;35972:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36778:1:::1;36758:22;;:8;:22;;;;36750:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36834:28;36853:8;36834:18;:28::i;:::-;36669:201:::0;:::o;39324:224::-;39426:4;39465:35;39450:50;;;:11;:50;;;;:90;;;;39504:36;39528:11;39504:23;:36::i;:::-;39450:90;39443:97;;39324:224;;;:::o;28010:127::-;28075:4;28127:1;28099:30;;:7;:16;28107:7;28099:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28092:37;;28010:127;;;:::o;17473:98::-;17526:7;17553:10;17546:17;;17473:98;:::o;31992:174::-;32094:2;32067:15;:24;32083:7;32067:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32150:7;32146:2;32112:46;;32121:23;32136:7;32121:14;:23::i;:::-;32112:46;;;;;;;;;;;;31992:174;;:::o;28304:348::-;28397:4;28422:16;28430:7;28422;:16::i;:::-;28414:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28498:13;28514:23;28529:7;28514:14;:23::i;:::-;28498:39;;28567:5;28556:16;;:7;:16;;;:51;;;;28600:7;28576:31;;:20;28588:7;28576:11;:20::i;:::-;:31;;;28556:51;:87;;;;28611:32;28628:5;28635:7;28611:16;:32::i;:::-;28556:87;28548:96;;;28304:348;;;;:::o;31296:578::-;31455:4;31428:31;;:23;31443:7;31428:14;:23::i;:::-;:31;;;31420:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31538:1;31524:16;;:2;:16;;;;31516:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31594:39;31615:4;31621:2;31625:7;31594:20;:39::i;:::-;31698:29;31715:1;31719:7;31698:8;:29::i;:::-;31759:1;31740:9;:15;31750:4;31740:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31788:1;31771:9;:13;31781:2;31771:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31819:2;31800:7;:16;31808:7;31800:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31858:7;31854:2;31839:27;;31848:4;31839:27;;;;;;;;;;;;31296:578;;;:::o;10777:317::-;10892:6;10867:21;:31;;10859:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10946:12;10964:9;:14;;10986:6;10964:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10945:52;;;11016:7;11008:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10777:317;;;:::o;37030:191::-;37104:16;37123:6;;;;;;;;;;;37104:25;;37149:8;37140:6;;:17;;;;;;;;;;;;;;;;;;37204:8;37173:40;;37194:8;37173:40;;;;;;;;;;;;37030:191;;:::o;28994:110::-;29070:26;29080:2;29084:7;29070:26;;;;;;;;;;;;:9;:26::i;:::-;28994:110;;:::o;32308:315::-;32463:8;32454:17;;:5;:17;;;;32446:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32550:8;32512:18;:25;32531:5;32512:25;;;;;;;;;;;;;;;:35;32538:8;32512:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32596:8;32574:41;;32589:5;32574:41;;;32606:8;32574:41;;;;;;:::i;:::-;;;;;;;;32308:315;;;:::o;27382:::-;27539:28;27549:4;27555:2;27559:7;27539:9;:28::i;:::-;27586:48;27609:4;27615:2;27619:7;27628:5;27586:22;:48::i;:::-;27578:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27382:315;;;;:::o;47738:117::-;47798:13;47831:16;47824:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47738:117;:::o;18060:723::-;18116:13;18346:1;18337:5;:10;18333:53;;;18364:10;;;;;;;;;;;;;;;;;;;;;18333:53;18396:12;18411:5;18396:20;;18427:14;18452:78;18467:1;18459:4;:9;18452:78;;18485:8;;;;;:::i;:::-;;;;18516:2;18508:10;;;;;:::i;:::-;;;18452:78;;;18540:19;18572:6;18562:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18540:39;;18590:154;18606:1;18597:5;:10;18590:154;;18634:1;18624:11;;;;;:::i;:::-;;;18701:2;18693:5;:10;;;;:::i;:::-;18680:2;:24;;;;:::i;:::-;18667:39;;18650:6;18657;18650:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18730:2;18721:11;;;;;:::i;:::-;;;18590:154;;;18768:6;18754:21;;;;;18060:723;;;;:::o;22252:305::-;22354:4;22406:25;22391:40;;;:11;:40;;;;:105;;;;22463:33;22448:48;;;:11;:48;;;;22391:105;:158;;;;22513:36;22537:11;22513:23;:36::i;:::-;22391:158;22371:178;;22252:305;;;:::o;47243:181::-;47371:45;47398:4;47404:2;47408:7;47371:26;:45::i;:::-;47243:181;;;:::o;29331:321::-;29461:18;29467:2;29471:7;29461:5;:18::i;:::-;29512:54;29543:1;29547:2;29551:7;29560:5;29512:22;:54::i;:::-;29490:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29331:321;;;:::o;33188:799::-;33343:4;33364:15;:2;:13;;;:15::i;:::-;33360:620;;;33416:2;33400:36;;;33437:12;:10;:12::i;:::-;33451:4;33457:7;33466:5;33400:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33396:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33659:1;33642:6;:13;:18;33638:272;;;33685:60;;;;;;;;;;:::i;:::-;;;;;;;;33638:272;33860:6;33854:13;33845:6;33841:2;33837:15;33830:38;33396:529;33533:41;;;33523:51;;;:6;:51;;;;33516:58;;;;;33360:620;33964:4;33957:11;;33188:799;;;;;;;:::o;20690:157::-;20775:4;20814:25;20799:40;;;:11;:40;;;;20792:47;;20690:157;;;:::o;41000:589::-;41144:45;41171:4;41177:2;41181:7;41144:26;:45::i;:::-;41222:1;41206:18;;:4;:18;;;41202:187;;;41241:40;41273:7;41241:31;:40::i;:::-;41202:187;;;41311:2;41303:10;;:4;:10;;;41299:90;;41330:47;41363:4;41369:7;41330:32;:47::i;:::-;41299:90;41202:187;41417:1;41403:16;;:2;:16;;;41399:183;;;41436:45;41473:7;41436:36;:45::i;:::-;41399:183;;;41509:4;41503:10;;:2;:10;;;41499:83;;41530:40;41558:2;41562:7;41530:27;:40::i;:::-;41499:83;41399:183;41000:589;;;:::o;29988:382::-;30082:1;30068:16;;:2;:16;;;;30060:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30141:16;30149:7;30141;:16::i;:::-;30140:17;30132:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30203:45;30232:1;30236:2;30240:7;30203:20;:45::i;:::-;30278:1;30261:9;:13;30271:2;30261:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30309:2;30290:7;:16;30298:7;30290:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30354:7;30350:2;30329:33;;30346:1;30329:33;;;;;;;;;;;;29988:382;;:::o;9455:387::-;9515:4;9723:12;9790:7;9778:20;9770:28;;9833:1;9826:4;:8;9819:15;;;9455:387;;;:::o;34559:126::-;;;;:::o;42312:164::-;42416:10;:17;;;;42389:15;:24;42405:7;42389:24;;;;;;;;;;;:44;;;;42444:10;42460:7;42444:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42312:164;:::o;43103:988::-;43369:22;43419:1;43394:22;43411:4;43394:16;:22::i;:::-;:26;;;;:::i;:::-;43369:51;;43431:18;43452:17;:26;43470:7;43452:26;;;;;;;;;;;;43431:47;;43599:14;43585:10;:28;43581:328;;43630:19;43652:12;:18;43665:4;43652:18;;;;;;;;;;;;;;;:34;43671:14;43652:34;;;;;;;;;;;;43630:56;;43736:11;43703:12;:18;43716:4;43703:18;;;;;;;;;;;;;;;:30;43722:10;43703:30;;;;;;;;;;;:44;;;;43853:10;43820:17;:30;43838:11;43820:30;;;;;;;;;;;:43;;;;43581:328;;44005:17;:26;44023:7;44005:26;;;;;;;;;;;43998:33;;;44049:12;:18;44062:4;44049:18;;;;;;;;;;;;;;;:34;44068:14;44049:34;;;;;;;;;;;44042:41;;;43103:988;;;;:::o;44386:1079::-;44639:22;44684:1;44664:10;:17;;;;:21;;;;:::i;:::-;44639:46;;44696:18;44717:15;:24;44733:7;44717:24;;;;;;;;;;;;44696:45;;45068:19;45090:10;45101:14;45090:26;;;;;;;;;;;;;;;;;;;;;;;;45068:48;;45154:11;45129:10;45140;45129:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;45265:10;45234:15;:28;45250:11;45234:28;;;;;;;;;;;:41;;;;45406:15;:24;45422:7;45406:24;;;;;;;;;;;45399:31;;;45441:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44386:1079;;;;:::o;41890:221::-;41975:14;41992:20;42009:2;41992:16;:20::i;:::-;41975:37;;42050:7;42023:12;:16;42036:2;42023:16;;;;;;;;;;;;;;;:24;42040:6;42023:24;;;;;;;;;;;:34;;;;42097:6;42068:17;:26;42086:7;42068:26;;;;;;;;;;;:35;;;;41890:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:142::-;6187:32;6213:5;6187:32;:::i;:::-;6182:3;6175:45;6165:61;;:::o;6232:118::-;6319:24;6337:5;6319:24;:::i;:::-;6314:3;6307:37;6297:53;;:::o;6356:109::-;6437:21;6452:5;6437:21;:::i;:::-;6432:3;6425:34;6415:50;;:::o;6471:360::-;;6585:38;6617:5;6585:38;:::i;:::-;6639:70;6702:6;6697:3;6639:70;:::i;:::-;6632:77;;6718:52;6763:6;6758:3;6751:4;6744:5;6740:16;6718:52;:::i;:::-;6795:29;6817:6;6795:29;:::i;:::-;6790:3;6786:39;6779:46;;6561:270;;;;;:::o;6837:364::-;;6953:39;6986:5;6953:39;:::i;:::-;7008:71;7072:6;7067:3;7008:71;:::i;:::-;7001:78;;7088:52;7133:6;7128:3;7121:4;7114:5;7110:16;7088:52;:::i;:::-;7165:29;7187:6;7165:29;:::i;:::-;7160:3;7156:39;7149:46;;6929:272;;;;;:::o;7207:377::-;;7341:39;7374:5;7341:39;:::i;:::-;7396:89;7478:6;7473:3;7396:89;:::i;:::-;7389:96;;7494:52;7539:6;7534:3;7527:4;7520:5;7516:16;7494:52;:::i;:::-;7571:6;7566:3;7562:16;7555:23;;7317:267;;;;;:::o;7590:375::-;;7753:67;7817:2;7812:3;7753:67;:::i;:::-;7746:74;;7850:34;7846:1;7841:3;7837:11;7830:55;7916:13;7911:2;7906:3;7902:12;7895:35;7956:2;7951:3;7947:12;7940:19;;7736:229;;;:::o;7971:382::-;;8134:67;8198:2;8193:3;8134:67;:::i;:::-;8127:74;;8231:34;8227:1;8222:3;8218:11;8211:55;8297:20;8292:2;8287:3;8283:12;8276:42;8344:2;8339:3;8335:12;8328:19;;8117:236;;;:::o;8359:370::-;;8522:67;8586:2;8581:3;8522:67;:::i;:::-;8515:74;;8619:34;8615:1;8610:3;8606:11;8599:55;8685:8;8680:2;8675:3;8671:12;8664:30;8720:2;8715:3;8711:12;8704:19;;8505:224;;;:::o;8735:326::-;;8898:67;8962:2;8957:3;8898:67;:::i;:::-;8891:74;;8995:30;8991:1;8986:3;8982:11;8975:51;9052:2;9047:3;9043:12;9036:19;;8881:180;;;:::o;9067:368::-;;9230:67;9294:2;9289:3;9230:67;:::i;:::-;9223:74;;9327:34;9323:1;9318:3;9314:11;9307:55;9393:6;9388:2;9383:3;9379:12;9372:28;9426:2;9421:3;9417:12;9410:19;;9213:222;;;:::o;9441:323::-;;9604:67;9668:2;9663:3;9604:67;:::i;:::-;9597:74;;9701:27;9697:1;9692:3;9688:11;9681:48;9755:2;9750:3;9746:12;9739:19;;9587:177;;;:::o;9770:323::-;;9933:67;9997:2;9992:3;9933:67;:::i;:::-;9926:74;;10030:27;10026:1;10021:3;10017:11;10010:48;10084:2;10079:3;10075:12;10068:19;;9916:177;;;:::o;10099:390::-;;10262:67;10326:2;10321:3;10262:67;:::i;:::-;10255:74;;10359:34;10355:1;10350:3;10346:11;10339:55;10425:28;10420:2;10415:3;10411:12;10404:50;10480:2;10475:3;10471:12;10464:19;;10245:244;;;:::o;10495:427::-;;10658:67;10722:2;10717:3;10658:67;:::i;:::-;10651:74;;10755:34;10751:1;10746:3;10742:11;10735:55;10821:34;10816:2;10811:3;10807:12;10800:56;10883:11;10878:2;10873:3;10869:12;10862:33;10917:2;10912:3;10908:12;10901:19;;10641:281;;;:::o;10924:311::-;;11083:67;11147:2;11142:3;11083:67;:::i;:::-;11076:74;;11176:31;11172:1;11167:3;11163:11;11156:52;11230:2;11225:3;11221:12;11214:19;;11070:165;;;:::o;11237:356::-;;11396:67;11460:2;11455:3;11396:67;:::i;:::-;11389:74;;11489:34;11485:1;11480:3;11476:11;11469:55;11551:14;11546:2;11541:3;11537:12;11530:36;11588:2;11583:3;11579:12;11572:19;;11383:210;;;:::o;11595:368::-;;11754:67;11818:2;11813:3;11754:67;:::i;:::-;11747:74;;11847:34;11843:1;11838:3;11834:11;11827:55;11909:26;11904:2;11899:3;11895:12;11888:48;11958:2;11953:3;11949:12;11942:19;;11741:222;;;:::o;11965:354::-;;12124:67;12188:2;12183:3;12124:67;:::i;:::-;12117:74;;12217:34;12213:1;12208:3;12204:11;12197:55;12279:12;12274:2;12269:3;12265:12;12258:34;12314:2;12309:3;12305:12;12298:19;;12111:208;;;:::o;12321:353::-;;12480:67;12544:2;12539:3;12480:67;:::i;:::-;12473:74;;12573:34;12569:1;12564:3;12560:11;12553:55;12635:11;12630:2;12625:3;12621:12;12614:33;12669:2;12664:3;12660:12;12653:19;;12467:207;;;:::o;12676:314::-;;12835:67;12899:2;12894:3;12835:67;:::i;:::-;12828:74;;12928:34;12924:1;12919:3;12915:11;12908:55;12985:2;12980:3;12976:12;12969:19;;12822:168;;;:::o;12992:356::-;;13151:67;13215:2;13210:3;13151:67;:::i;:::-;13144:74;;13244:34;13240:1;13235:3;13231:11;13224:55;13306:14;13301:2;13296:3;13292:12;13285:36;13343:2;13338:3;13334:12;13327:19;;13138:210;;;:::o;13350:314::-;;13509:67;13573:2;13568:3;13509:67;:::i;:::-;13502:74;;13602:34;13598:1;13593:3;13589:11;13582:55;13659:2;13654:3;13650:12;13643:19;;13496:168;;;:::o;13666:314::-;;13825:67;13889:2;13884:3;13825:67;:::i;:::-;13818:74;;13918:34;13914:1;13909:3;13905:11;13898:55;13975:2;13970:3;13966:12;13959:19;;13812:168;;;:::o;13982:353::-;;14141:67;14205:2;14200:3;14141:67;:::i;:::-;14134:74;;14234:34;14230:1;14225:3;14221:11;14214:55;14296:11;14291:2;14286:3;14282:12;14275:33;14330:2;14325:3;14321:12;14314:19;;14128:207;;;:::o;14337:359::-;;14496:67;14560:2;14555:3;14496:67;:::i;:::-;14489:74;;14589:34;14585:1;14580:3;14576:11;14569:55;14651:17;14646:2;14641:3;14637:12;14630:39;14691:2;14686:3;14682:12;14675:19;;14483:213;;;:::o;14698:358::-;;14857:67;14921:2;14916:3;14857:67;:::i;:::-;14850:74;;14950:34;14946:1;14941:3;14937:11;14930:55;15012:16;15007:2;15002:3;14998:12;14991:38;15051:2;15046:3;15042:12;15035:19;;14844:212;;;:::o;15058:345::-;;15217:67;15281:2;15276:3;15217:67;:::i;:::-;15210:74;;15310:34;15306:1;15301:3;15297:11;15290:55;15372:3;15367:2;15362:3;15358:12;15351:25;15398:2;15393:3;15389:12;15382:19;;15204:199;;;:::o;15405:285::-;;15581:83;15662:1;15657:3;15581:83;:::i;:::-;15574:90;;15686:1;15681:3;15677:11;15670:18;;15568:122;;;:::o;15692:361::-;;15851:67;15915:2;15910:3;15851:67;:::i;:::-;15844:74;;15944:34;15940:1;15935:3;15931:11;15924:55;16006:19;16001:2;15996:3;15992:12;15985:41;16048:2;16043:3;16039:12;16032:19;;15838:215;;;:::o;16055:356::-;;16214:67;16278:2;16273:3;16214:67;:::i;:::-;16207:74;;16307:34;16303:1;16298:3;16294:11;16287:55;16369:14;16364:2;16359:3;16355:12;16348:36;16406:2;16401:3;16397:12;16390:19;;16201:210;;;:::o;16413:305::-;;16572:67;16636:2;16631:3;16572:67;:::i;:::-;16565:74;;16665:25;16661:1;16656:3;16652:11;16645:46;16713:2;16708:3;16704:12;16697:19;;16559:159;;;:::o;16720:347::-;;16879:67;16943:2;16938:3;16879:67;:::i;:::-;16872:74;;16972:34;16968:1;16963:3;16959:11;16952:55;17034:5;17029:2;17024:3;17020:12;17013:27;17062:2;17057:3;17053:12;17046:19;;16866:201;;;:::o;17069:371::-;;17228:67;17292:2;17287:3;17228:67;:::i;:::-;17221:74;;17321:34;17317:1;17312:3;17308:11;17301:55;17383:29;17378:2;17373:3;17369:12;17362:51;17435:2;17430:3;17426:12;17419:19;;17215:225;;;:::o;17442:110::-;17525:24;17543:5;17525:24;:::i;:::-;17520:3;17513:37;17507:45;;:::o;17554:419::-;;17752:95;17843:3;17834:6;17752:95;:::i;:::-;17745:102;;17860:95;17951:3;17942:6;17860:95;:::i;:::-;17853:102;;17968:3;17961:10;;17738:235;;;;;:::o;17975:367::-;;18177:147;18320:3;18177:147;:::i;:::-;18170:154;;18337:3;18330:10;;18163:179;;;:::o;18344:210::-;;18471:2;18460:9;18456:18;18448:26;;18480:71;18548:1;18537:9;18533:17;18524:6;18480:71;:::i;:::-;18442:112;;;;:::o;18556:242::-;;18699:2;18688:9;18684:18;18676:26;;18708:87;18792:1;18781:9;18777:17;18768:6;18708:87;:::i;:::-;18670:128;;;;:::o;18800:612::-;;19029:3;19018:9;19014:19;19006:27;;19039:71;19107:1;19096:9;19092:17;19083:6;19039:71;:::i;:::-;19116:72;19184:2;19173:9;19169:18;19160:6;19116:72;:::i;:::-;19194;19262:2;19251:9;19247:18;19238:6;19194:72;:::i;:::-;19309:9;19303:4;19299:20;19294:2;19283:9;19279:18;19272:48;19333:76;19404:4;19395:6;19333:76;:::i;:::-;19325:84;;19000:412;;;;;;;:::o;19414:198::-;;19535:2;19524:9;19520:18;19512:26;;19544:65;19606:1;19595:9;19591:17;19582:6;19544:65;:::i;:::-;19506:106;;;;:::o;19614:297::-;;19761:2;19750:9;19746:18;19738:26;;19806:9;19800:4;19796:20;19792:1;19781:9;19777:17;19770:47;19830:78;19903:4;19894:6;19830:78;:::i;:::-;19822:86;;19732:179;;;;:::o;19913:403::-;;20113:2;20102:9;20098:18;20090:26;;20158:9;20152:4;20148:20;20144:1;20133:9;20129:17;20122:47;20182:131;20308:4;20182:131;:::i;:::-;20174:139;;20084:232;;;:::o;20318:403::-;;20518:2;20507:9;20503:18;20495:26;;20563:9;20557:4;20553:20;20549:1;20538:9;20534:17;20527:47;20587:131;20713:4;20587:131;:::i;:::-;20579:139;;20489:232;;;:::o;20723:403::-;;20923:2;20912:9;20908:18;20900:26;;20968:9;20962:4;20958:20;20954:1;20943:9;20939:17;20932:47;20992:131;21118:4;20992:131;:::i;:::-;20984:139;;20894:232;;;:::o;21128:403::-;;21328:2;21317:9;21313:18;21305:26;;21373:9;21367:4;21363:20;21359:1;21348:9;21344:17;21337:47;21397:131;21523:4;21397:131;:::i;:::-;21389:139;;21299:232;;;:::o;21533:403::-;;21733:2;21722:9;21718:18;21710:26;;21778:9;21772:4;21768:20;21764:1;21753:9;21749:17;21742:47;21802:131;21928:4;21802:131;:::i;:::-;21794:139;;21704:232;;;:::o;21938:403::-;;22138:2;22127:9;22123:18;22115:26;;22183:9;22177:4;22173:20;22169:1;22158:9;22154:17;22147:47;22207:131;22333:4;22207:131;:::i;:::-;22199:139;;22109:232;;;:::o;22343:403::-;;22543:2;22532:9;22528:18;22520:26;;22588:9;22582:4;22578:20;22574:1;22563:9;22559:17;22552:47;22612:131;22738:4;22612:131;:::i;:::-;22604:139;;22514:232;;;:::o;22748:403::-;;22948:2;22937:9;22933:18;22925:26;;22993:9;22987:4;22983:20;22979:1;22968:9;22964:17;22957:47;23017:131;23143:4;23017:131;:::i;:::-;23009:139;;22919:232;;;:::o;23153:403::-;;23353:2;23342:9;23338:18;23330:26;;23398:9;23392:4;23388:20;23384:1;23373:9;23369:17;23362:47;23422:131;23548:4;23422:131;:::i;:::-;23414:139;;23324:232;;;:::o;23558:403::-;;23758:2;23747:9;23743:18;23735:26;;23803:9;23797:4;23793:20;23789:1;23778:9;23774:17;23767:47;23827:131;23953:4;23827:131;:::i;:::-;23819:139;;23729:232;;;:::o;23963:403::-;;24163:2;24152:9;24148:18;24140:26;;24208:9;24202:4;24198:20;24194:1;24183:9;24179:17;24172:47;24232:131;24358:4;24232:131;:::i;:::-;24224:139;;24134:232;;;:::o;24368:403::-;;24568:2;24557:9;24553:18;24545:26;;24613:9;24607:4;24603:20;24599:1;24588:9;24584:17;24577:47;24637:131;24763:4;24637:131;:::i;:::-;24629:139;;24539:232;;;:::o;24773:403::-;;24973:2;24962:9;24958:18;24950:26;;25018:9;25012:4;25008:20;25004:1;24993:9;24989:17;24982:47;25042:131;25168:4;25042:131;:::i;:::-;25034:139;;24944:232;;;:::o;25178:403::-;;25378:2;25367:9;25363:18;25355:26;;25423:9;25417:4;25413:20;25409:1;25398:9;25394:17;25387:47;25447:131;25573:4;25447:131;:::i;:::-;25439:139;;25349:232;;;:::o;25583:403::-;;25783:2;25772:9;25768:18;25760:26;;25828:9;25822:4;25818:20;25814:1;25803:9;25799:17;25792:47;25852:131;25978:4;25852:131;:::i;:::-;25844:139;;25754:232;;;:::o;25988:403::-;;26188:2;26177:9;26173:18;26165:26;;26233:9;26227:4;26223:20;26219:1;26208:9;26204:17;26197:47;26257:131;26383:4;26257:131;:::i;:::-;26249:139;;26159:232;;;:::o;26393:403::-;;26593:2;26582:9;26578:18;26570:26;;26638:9;26632:4;26628:20;26624:1;26613:9;26609:17;26602:47;26662:131;26788:4;26662:131;:::i;:::-;26654:139;;26564:232;;;:::o;26798:403::-;;26998:2;26987:9;26983:18;26975:26;;27043:9;27037:4;27033:20;27029:1;27018:9;27014:17;27007:47;27067:131;27193:4;27067:131;:::i;:::-;27059:139;;26969:232;;;:::o;27203:403::-;;27403:2;27392:9;27388:18;27380:26;;27448:9;27442:4;27438:20;27434:1;27423:9;27419:17;27412:47;27472:131;27598:4;27472:131;:::i;:::-;27464:139;;27374:232;;;:::o;27608:403::-;;27808:2;27797:9;27793:18;27785:26;;27853:9;27847:4;27843:20;27839:1;27828:9;27824:17;27817:47;27877:131;28003:4;27877:131;:::i;:::-;27869:139;;27779:232;;;:::o;28013:403::-;;28213:2;28202:9;28198:18;28190:26;;28258:9;28252:4;28248:20;28244:1;28233:9;28229:17;28222:47;28282:131;28408:4;28282:131;:::i;:::-;28274:139;;28184:232;;;:::o;28418:403::-;;28618:2;28607:9;28603:18;28595:26;;28663:9;28657:4;28653:20;28649:1;28638:9;28634:17;28627:47;28687:131;28813:4;28687:131;:::i;:::-;28679:139;;28589:232;;;:::o;28823:403::-;;29023:2;29012:9;29008:18;29000:26;;29068:9;29062:4;29058:20;29054:1;29043:9;29039:17;29032:47;29092:131;29218:4;29092:131;:::i;:::-;29084:139;;28994:232;;;:::o;29228:403::-;;29428:2;29417:9;29413:18;29405:26;;29473:9;29467:4;29463:20;29459:1;29448:9;29444:17;29437:47;29497:131;29623:4;29497:131;:::i;:::-;29489:139;;29399:232;;;:::o;29633:403::-;;29833:2;29822:9;29818:18;29810:26;;29878:9;29872:4;29868:20;29864:1;29853:9;29849:17;29842:47;29902:131;30028:4;29902:131;:::i;:::-;29894:139;;29804:232;;;:::o;30038:403::-;;30238:2;30227:9;30223:18;30215:26;;30283:9;30277:4;30273:20;30269:1;30258:9;30254:17;30247:47;30307:131;30433:4;30307:131;:::i;:::-;30299:139;;30209:232;;;:::o;30443:403::-;;30643:2;30632:9;30628:18;30620:26;;30688:9;30682:4;30678:20;30674:1;30663:9;30659:17;30652:47;30712:131;30838:4;30712:131;:::i;:::-;30704:139;;30614:232;;;:::o;30848:210::-;;30975:2;30964:9;30960:18;30952:26;;30984:71;31052:1;31041:9;31037:17;31028:6;30984:71;:::i;:::-;30946:112;;;;:::o;31060:259::-;;31122:2;31116:9;31106:19;;31160:4;31152:6;31148:17;31259:6;31247:10;31244:22;31223:18;31211:10;31208:34;31205:62;31202:2;;;31270:18;;:::i;:::-;31202:2;31306:10;31302:2;31295:22;31100:219;;;;:::o;31321:303::-;;31464:18;31456:6;31453:30;31450:2;;;31486:18;;:::i;:::-;31450:2;31563:4;31559:9;31552:4;31544:6;31540:17;31536:33;31528:41;;31616:4;31610;31606:15;31598:23;;31387:237;;;:::o;31626:304::-;;31770:18;31762:6;31759:30;31756:2;;;31792:18;;:::i;:::-;31756:2;31869:4;31865:9;31858:4;31850:6;31846:17;31842:33;31834:41;;31922:4;31916;31912:15;31904:23;;31693:237;;;:::o;31932:90::-;;32013:5;32007:12;31997:22;;31990:32;;;:::o;32024:91::-;;32106:5;32100:12;32090:22;;32083:32;;;:::o;32117:156::-;;32230:6;32225:3;32218:19;32266:4;32261:3;32257:14;32242:29;;32212:61;;;;:::o;32275:139::-;;32409:3;32394:18;;32388:26;;;;:::o;32416:157::-;;32530:6;32525:3;32518:19;32566:4;32561:3;32557:14;32542:29;;32512:61;;;;:::o;32575:140::-;;32710:3;32695:18;;32689:26;;;;:::o;32717:281::-;;32772:20;32790:1;32772:20;:::i;:::-;32767:25;;32802:20;32820:1;32802:20;:::i;:::-;32797:25;;32948:1;32880:66;32876:74;32873:1;32870:81;32867:2;;;32954:18;;:::i;:::-;32867:2;32994:1;32991;32987:9;32980:16;;32761:237;;;;:::o;33000:165::-;;33053:20;33071:1;33053:20;:::i;:::-;33048:25;;33083:20;33101:1;33083:20;:::i;:::-;33078:25;;33118:1;33108:2;;33123:18;;:::i;:::-;33108:2;33161:1;33158;33154:9;33149:14;;33042:123;;;;:::o;33167:324::-;;33226:20;33244:1;33226:20;:::i;:::-;33221:25;;33256:20;33274:1;33256:20;:::i;:::-;33251:25;;33436:1;33368:66;33364:74;33361:1;33358:81;33353:1;33346:9;33339:17;33335:105;33332:2;;;33443:18;;:::i;:::-;33332:2;33487:1;33484;33480:9;33469:20;;33215:276;;;;:::o;33493:171::-;;33549:20;33567:1;33549:20;:::i;:::-;33544:25;;33579:20;33597:1;33579:20;:::i;:::-;33574:25;;33614:1;33611;33608:8;33605:2;;;33619:18;;:::i;:::-;33605:2;33660:1;33657;33653:9;33645:17;;33538:126;;;;:::o;33666:88::-;;33728:24;33746:5;33728:24;:::i;:::-;33717:35;;33711:43;;;:::o;33756:96::-;;33826:24;33844:5;33826:24;:::i;:::-;33815:35;;33809:43;;;:::o;33854:82::-;;33927:5;33920:13;33913:21;33902:32;;33896:40;;;:::o;33938:141::-;;34010:66;34003:5;33999:78;33988:89;;33982:97;;;:::o;34081:118::-;;34154:42;34147:5;34143:54;34132:65;;34126:73;;;:::o;34201:69::-;;34263:5;34252:16;;34246:24;;;:::o;34272:138::-;34352:6;34347:3;34342;34329:30;34406:1;34397:6;34392:3;34388:16;34381:27;34323:87;;;:::o;34412:263::-;34476:1;34482:101;34496:6;34493:1;34490:13;34482:101;;;34573:1;34568:3;34564:11;34558:18;34554:1;34549:3;34545:11;34538:39;34518:2;34515:1;34511:10;34506:15;;34482:101;;;34597:6;34594:1;34591:13;34588:2;;;34665:1;34656:6;34651:3;34647:16;34640:27;34588:2;34461:214;;;;:::o;34677:284::-;;34754:1;34748:4;34744:12;34734:22;;34797:1;34791:4;34787:12;34814:18;34804:2;;34866:4;34858:6;34854:17;34844:27;;34804:2;34920;34912:6;34909:14;34889:18;34886:38;34883:2;;;34935:18;;:::i;:::-;34883:2;34728:233;;;;:::o;34963:217::-;;35021:24;35039:5;35021:24;:::i;:::-;35012:33;;35063:66;35056:5;35053:77;35050:2;;;35133:18;;:::i;:::-;35050:2;35176:1;35169:5;35165:13;35158:20;;35006:174;;;:::o;35182:156::-;;35227:20;35245:1;35227:20;:::i;:::-;35222:25;;35257:20;35275:1;35257:20;:::i;:::-;35252:25;;35292:1;35282:2;;35297:18;;:::i;:::-;35282:2;35334:1;35331;35327:9;35322:14;;35216:122;;;;:::o;35340:164::-;35384:77;35381:1;35374:88;35477:4;35474:1;35467:15;35497:4;35494:1;35487:15;35506:164;35550:77;35547:1;35540:88;35643:4;35640:1;35633:15;35663:4;35660:1;35653:15;35672:164;35716:77;35713:1;35706:88;35809:4;35806:1;35799:15;35829:4;35826:1;35819:15;35838:164;35882:77;35879:1;35872:88;35975:4;35972:1;35965:15;35995:4;35992:1;35985:15;36004:94;;36092:2;36088:7;36083:2;36076:5;36072:14;36068:28;36058:38;;36052:46;;;:::o;36100:114::-;36169:24;36187:5;36169:24;:::i;:::-;36162:5;36159:35;36149:2;;36208:1;36205;36198:12;36149:2;36143:71;:::o;36216:108::-;36282:21;36297:5;36282:21;:::i;:::-;36275:5;36272:32;36262:2;;36318:1;36315;36308:12;36262:2;36256:68;:::o;36326:112::-;36394:23;36411:5;36394:23;:::i;:::-;36387:5;36384:34;36374:2;;36432:1;36429;36422:12;36374:2;36368:70;:::o;36440:114::-;36509:24;36527:5;36509:24;:::i;:::-;36502:5;36499:35;36489:2;;36548:1;36545;36538:12;36489:2;36483:71;:::o
Swarm Source
ipfs://121a6b76a2c28fc4d15b2c0255afafe6c71a9ef00c7ae197a85510587c6609a2
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.