ERC-721
Overview
Max Total Supply
132 CFF
Holders
28
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 CFFLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CFF
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-08 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (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); /** * @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/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: CFF.sol pragma solidity ^0.8.0; // https://ipfs.io/ipfs/Qmed5jnKnuan1ePg5u4PrqnfRt6GMbtUc7yE88vB5BLjrQ/ contract CFF is ERC721, ERC721Enumerable, Ownable { bool public saleIsActive = false; string private _baseURIextended = "https://ipfs.io/ipfs/Qmed5jnKnuan1ePg5u4PrqnfRt6GMbtUc7yE88vB5BLjrQ/"; uint256 public constant MAX_SUPPLY = 10000; uint256 public constant MAX_PUBLIC_SUPPLY = 9500; uint256 public constant MAX_PUBLIC_MINT = 10; uint256 public constant PRICE_PER_TOKEN = 0 ether; // string private _contractURI = "ipfs://Qmaudw8eK8HsYPnhJ5WNpn17G16oEYngqJrstpnT5ysDBx"; constructor() ERC721("Crazy Fans_Football", "CFF") { } 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 setContractURI(string memory baseURI_) public onlyOwner{ // _contractURI = baseURI_; // } // function contractURI() public view returns (string memory) { // // "https://exermon.com/nft/metadata/contractMetadata.json"; // // "ipfs://QmSs4m8KZmBJCYpM5713rzMWqFQzmhsADsB1G6wqT36nNh" // // "ipfs://QmNkYsBzuSGtFdkUmwDimoqPd7UdfkmCHmzHyqvymz2EfH" // //"https://ipfs.io/ipfs/QmNkYsBzuSGtFdkUmwDimoqPd7UdfkmCHmzHyqvymz2EfH?filename=contractMetadata.json"; // return _contractURI; // } function reserve(uint256 n) public onlyOwner { uint total = totalSupply(); require(total + n <= MAX_SUPPLY, "Purchase would exceed max tokens"); uint i; for (i = 0; i < n; i++) { _safeMint(msg.sender, total + i + 1); } } function setSaleState(bool newState) public onlyOwner { saleIsActive = newState; } function mint(uint n) public payable { uint256 total = totalSupply(); uint256 balance = balanceOf(msg.sender); require(saleIsActive, "Sale must be active to mint tokens"); require(balance + n <= MAX_PUBLIC_MINT, "Exceeded max token purchase"); require(total + n <= MAX_PUBLIC_SUPPLY, "Purchase would exceed max tokens"); require(PRICE_PER_TOKEN * n >= msg.value, "Ether value sent is not correct"); for (uint256 i = 0; i < n; i++) { _safeMint(msg.sender, total + i + 1); } } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","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":"uint256","name":"n","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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
60806040526000600a60146101000a81548160ff02191690831515021790555060405180608001604052806044815260200162003dd760449139600b908051906020019062000050929190620001f3565b503480156200005e57600080fd5b506040518060400160405280601381526020017f4372617a792046616e735f466f6f7462616c6c000000000000000000000000008152506040518060400160405280600381526020017f43464600000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e3929190620001f3565b508060019080519060200190620000fc929190620001f3565b5050506200011f620001136200012560201b60201c565b6200012d60201b60201c565b62000308565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020190620002a3565b90600052602060002090601f01602090048101928262000225576000855562000271565b82601f106200024057805160ff191683800117855562000271565b8280016001018555821562000271579182015b828111156200027057825182559160200191906001019062000253565b5b50905062000280919062000284565b5090565b5b808211156200029f57600081600090555060010162000285565b5090565b60006002820490506001821680620002bc57607f821691505b60208210811415620002d357620002d2620002d9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613abf80620003186000396000f3fe6080604052600436106101c25760003560e01c806365f13097116100f7578063a0712d6811610095578063c87b56dd11610064578063c87b56dd1461061f578063e985e9c51461065c578063eb8d244414610699578063f2fde38b146106c4576101c2565b8063a0712d6814610588578063a22cb465146105a4578063b88d4fde146105cd578063c4e37095146105f6576101c2565b8063819b25ba116100d1578063819b25ba146104de578063833b9499146105075780638da5cb5b1461053257806395d89b411461055d576101c2565b806365f130971461045f57806370a082311461048a578063715018a6146104c7576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e146103935780634f6ccce7146103bc57806355f804b3146103f95780636352211e14610422576101c2565b80632f745c591461031457806332cb6b0c146103515780633ccfd60b1461037c576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632a47f799146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906129d9565b6106ed565b6040516101fb9190612e89565b60405180910390f35b34801561021057600080fd5b506102196106ff565b6040516102269190612ea4565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612a6c565b610791565b6040516102639190612e22565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612974565b6107d7565b005b3480156102a157600080fd5b506102aa6108ef565b6040516102b79190613126565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e2919061286e565b6108fc565b005b3480156102f557600080fd5b506102fe61095c565b60405161030b9190613126565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190612974565b610962565b6040516103489190613126565b60405180910390f35b34801561035d57600080fd5b50610366610a07565b6040516103739190613126565b60405180910390f35b34801561038857600080fd5b50610391610a0d565b005b34801561039f57600080fd5b506103ba60048036038101906103b5919061286e565b610a64565b005b3480156103c857600080fd5b506103e360048036038101906103de9190612a6c565b610a84565b6040516103f09190613126565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190612a2b565b610b1b565b005b34801561042e57600080fd5b5061044960048036038101906104449190612a6c565b610b3d565b6040516104569190612e22565b60405180910390f35b34801561046b57600080fd5b50610474610bef565b6040516104819190613126565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac9190612809565b610bf4565b6040516104be9190613126565b60405180910390f35b3480156104d357600080fd5b506104dc610cac565b005b3480156104ea57600080fd5b5061050560048036038101906105009190612a6c565b610cc0565b005b34801561051357600080fd5b5061051c610d68565b6040516105299190613126565b60405180910390f35b34801561053e57600080fd5b50610547610d6d565b6040516105549190612e22565b60405180910390f35b34801561056957600080fd5b50610572610d97565b60405161057f9190612ea4565b60405180910390f35b6105a2600480360381019061059d9190612a6c565b610e29565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190612938565b610fc4565b005b3480156105d957600080fd5b506105f460048036038101906105ef91906128bd565b610fda565b005b34801561060257600080fd5b5061061d600480360381019061061891906129b0565b61103c565b005b34801561062b57600080fd5b5061064660048036038101906106419190612a6c565b611061565b6040516106539190612ea4565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190612832565b6110c9565b6040516106909190612e89565b60405180910390f35b3480156106a557600080fd5b506106ae61115d565b6040516106bb9190612e89565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190612809565b611170565b005b60006106f8826111f4565b9050919050565b60606000805461070e906133d6565b80601f016020809104026020016040519081016040528092919081815260200182805461073a906133d6565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b5050505050905090565b600061079c8261126e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e282610b3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a906130a6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108726112b9565b73ffffffffffffffffffffffffffffffffffffffff1614806108a157506108a08161089b6112b9565b6110c9565b5b6108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d790613006565b60405180910390fd5b6108ea83836112c1565b505050565b6000600880549050905090565b61090d6109076112b9565b8261137a565b61094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390613106565b60405180910390fd5b61095783838361140f565b505050565b61251c81565b600061096d83610bf4565b82106109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590612ec6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610a15611676565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a60573d6000803e3d6000fd5b5050565b610a7f83838360405180602001604052806000815250610fda565b505050565b6000610a8e6108ef565b8210610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac6906130e6565b60405180910390fd5b60088281548110610b09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610b23611676565b80600b9080519060200190610b3992919061262d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90613066565b60405180910390fd5b80915050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90612fe6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cb4611676565b610cbe60006116f4565b565b610cc8611676565b6000610cd26108ef565b90506127108282610ce3919061320b565b1115610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90612f26565b60405180910390fd5b60005b82811015610d6357610d503360018385610d41919061320b565b610d4b919061320b565b6117ba565b8080610d5b90613439565b915050610d27565b505050565b600081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610da6906133d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd2906133d6565b8015610e1f5780601f10610df457610100808354040283529160200191610e1f565b820191906000526020600020905b815481529060010190602001808311610e0257829003601f168201915b5050505050905090565b6000610e336108ef565b90506000610e4033610bf4565b9050600a60149054906101000a900460ff16610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8890613086565b60405180910390fd5b600a8382610e9f919061320b565b1115610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed7906130c6565b60405180910390fd5b61251c8383610eef919061320b565b1115610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790612f26565b60405180910390fd5b34836000610f3e9190613292565b1015610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690612fc6565b60405180910390fd5b60005b83811015610fbe57610fab3360018386610f9c919061320b565b610fa6919061320b565b6117ba565b8080610fb690613439565b915050610f82565b50505050565b610fd6610fcf6112b9565b83836117d8565b5050565b610feb610fe56112b9565b8361137a565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190613106565b60405180910390fd5b61103684848484611945565b50505050565b611044611676565b80600a60146101000a81548160ff02191690831515021790555050565b606061106c8261126e565b60006110766119a1565b9050600081511161109657604051806020016040528060008152506110c1565b806110a084611a33565b6040516020016110b1929190612dfe565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60149054906101000a900460ff1681565b611178611676565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90612f06565b60405180910390fd5b6111f1816116f4565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611267575061126682611be0565b5b9050919050565b61127781611cc2565b6112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90613066565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661133483610b3d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061138683610b3d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113c857506113c781856110c9565b5b8061140657508373ffffffffffffffffffffffffffffffffffffffff166113ee84610791565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661142f82610b3d565b73ffffffffffffffffffffffffffffffffffffffff1614611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147c90612f46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90612f86565b60405180910390fd5b611500838383611d2e565b61150b6000826112c1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461155b91906132ec565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b2919061320b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611671838383611d3e565b505050565b61167e6112b9565b73ffffffffffffffffffffffffffffffffffffffff1661169c610d6d565b73ffffffffffffffffffffffffffffffffffffffff16146116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e990613046565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6117d4828260405180602001604052806000815250611d43565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90612fa6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119389190612e89565b60405180910390a3505050565b61195084848461140f565b61195c84848484611d9e565b61199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290612ee6565b60405180910390fd5b50505050565b6060600b80546119b0906133d6565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc906133d6565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b5050505050905090565b60606000821415611a7b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611bdb565b600082905060005b60008214611aad578080611a9690613439565b915050600a82611aa69190613261565b9150611a83565b60008167ffffffffffffffff811115611aef577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b215781602001600182028036833780820191505090505b5090505b60008514611bd457600182611b3a91906132ec565b9150600a85611b499190613482565b6030611b55919061320b565b60f81b818381518110611b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611bcd9190613261565b9450611b25565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cbb5750611cba82611f35565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611d39838383611f9f565b505050565b505050565b611d4d83836120b3565b611d5a6000848484611d9e565b611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9090612ee6565b60405180910390fd5b505050565b6000611dbf8473ffffffffffffffffffffffffffffffffffffffff1661228d565b15611f28578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611de86112b9565b8786866040518563ffffffff1660e01b8152600401611e0a9493929190612e3d565b602060405180830381600087803b158015611e2457600080fd5b505af1925050508015611e5557506040513d601f19601f82011682018060405250810190611e529190612a02565b60015b611ed8573d8060008114611e85576040519150601f19603f3d011682016040523d82523d6000602084013e611e8a565b606091505b50600081511415611ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec790612ee6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f2d565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611faa8383836122b0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fed57611fe8816122b5565b61202c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461202b5761202a83826122fe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561206f5761206a8161246b565b6120ae565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120ad576120ac82826125ae565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90613026565b60405180910390fd5b61212c81611cc2565b1561216c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216390612f66565b60405180910390fd5b61217860008383611d2e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c8919061320b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461228960008383611d3e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161230b84610bf4565b61231591906132ec565b90506000600760008481526020019081526020016000205490508181146123fa576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061247f91906132ec565b90506000600960008481526020019081526020016000205490506000600883815481106124d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061251d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612592577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125b983610bf4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612639906133d6565b90600052602060002090601f01602090048101928261265b57600085556126a2565b82601f1061267457805160ff19168380011785556126a2565b828001600101855582156126a2579182015b828111156126a1578251825591602001919060010190612686565b5b5090506126af91906126b3565b5090565b5b808211156126cc5760008160009055506001016126b4565b5090565b60006126e36126de84613166565b613141565b9050828152602081018484840111156126fb57600080fd5b612706848285613394565b509392505050565b600061272161271c84613197565b613141565b90508281526020810184848401111561273957600080fd5b612744848285613394565b509392505050565b60008135905061275b81613a2d565b92915050565b60008135905061277081613a44565b92915050565b60008135905061278581613a5b565b92915050565b60008151905061279a81613a5b565b92915050565b600082601f8301126127b157600080fd5b81356127c18482602086016126d0565b91505092915050565b600082601f8301126127db57600080fd5b81356127eb84826020860161270e565b91505092915050565b60008135905061280381613a72565b92915050565b60006020828403121561281b57600080fd5b60006128298482850161274c565b91505092915050565b6000806040838503121561284557600080fd5b60006128538582860161274c565b92505060206128648582860161274c565b9150509250929050565b60008060006060848603121561288357600080fd5b60006128918682870161274c565b93505060206128a28682870161274c565b92505060406128b3868287016127f4565b9150509250925092565b600080600080608085870312156128d357600080fd5b60006128e18782880161274c565b94505060206128f28782880161274c565b9350506040612903878288016127f4565b925050606085013567ffffffffffffffff81111561292057600080fd5b61292c878288016127a0565b91505092959194509250565b6000806040838503121561294b57600080fd5b60006129598582860161274c565b925050602061296a85828601612761565b9150509250929050565b6000806040838503121561298757600080fd5b60006129958582860161274c565b92505060206129a6858286016127f4565b9150509250929050565b6000602082840312156129c257600080fd5b60006129d084828501612761565b91505092915050565b6000602082840312156129eb57600080fd5b60006129f984828501612776565b91505092915050565b600060208284031215612a1457600080fd5b6000612a228482850161278b565b91505092915050565b600060208284031215612a3d57600080fd5b600082013567ffffffffffffffff811115612a5757600080fd5b612a63848285016127ca565b91505092915050565b600060208284031215612a7e57600080fd5b6000612a8c848285016127f4565b91505092915050565b612a9e81613320565b82525050565b612aad81613332565b82525050565b6000612abe826131c8565b612ac881856131de565b9350612ad88185602086016133a3565b612ae18161356f565b840191505092915050565b6000612af7826131d3565b612b0181856131ef565b9350612b118185602086016133a3565b612b1a8161356f565b840191505092915050565b6000612b30826131d3565b612b3a8185613200565b9350612b4a8185602086016133a3565b80840191505092915050565b6000612b63602b836131ef565b9150612b6e82613580565b604082019050919050565b6000612b866032836131ef565b9150612b91826135cf565b604082019050919050565b6000612ba96026836131ef565b9150612bb48261361e565b604082019050919050565b6000612bcc6020836131ef565b9150612bd78261366d565b602082019050919050565b6000612bef6025836131ef565b9150612bfa82613696565b604082019050919050565b6000612c12601c836131ef565b9150612c1d826136e5565b602082019050919050565b6000612c356024836131ef565b9150612c408261370e565b604082019050919050565b6000612c586019836131ef565b9150612c638261375d565b602082019050919050565b6000612c7b601f836131ef565b9150612c8682613786565b602082019050919050565b6000612c9e6029836131ef565b9150612ca9826137af565b604082019050919050565b6000612cc1603e836131ef565b9150612ccc826137fe565b604082019050919050565b6000612ce46020836131ef565b9150612cef8261384d565b602082019050919050565b6000612d076020836131ef565b9150612d1282613876565b602082019050919050565b6000612d2a6018836131ef565b9150612d358261389f565b602082019050919050565b6000612d4d6022836131ef565b9150612d58826138c8565b604082019050919050565b6000612d706021836131ef565b9150612d7b82613917565b604082019050919050565b6000612d93601b836131ef565b9150612d9e82613966565b602082019050919050565b6000612db6602c836131ef565b9150612dc18261398f565b604082019050919050565b6000612dd9602e836131ef565b9150612de4826139de565b604082019050919050565b612df88161338a565b82525050565b6000612e0a8285612b25565b9150612e168284612b25565b91508190509392505050565b6000602082019050612e376000830184612a95565b92915050565b6000608082019050612e526000830187612a95565b612e5f6020830186612a95565b612e6c6040830185612def565b8181036060830152612e7e8184612ab3565b905095945050505050565b6000602082019050612e9e6000830184612aa4565b92915050565b60006020820190508181036000830152612ebe8184612aec565b905092915050565b60006020820190508181036000830152612edf81612b56565b9050919050565b60006020820190508181036000830152612eff81612b79565b9050919050565b60006020820190508181036000830152612f1f81612b9c565b9050919050565b60006020820190508181036000830152612f3f81612bbf565b9050919050565b60006020820190508181036000830152612f5f81612be2565b9050919050565b60006020820190508181036000830152612f7f81612c05565b9050919050565b60006020820190508181036000830152612f9f81612c28565b9050919050565b60006020820190508181036000830152612fbf81612c4b565b9050919050565b60006020820190508181036000830152612fdf81612c6e565b9050919050565b60006020820190508181036000830152612fff81612c91565b9050919050565b6000602082019050818103600083015261301f81612cb4565b9050919050565b6000602082019050818103600083015261303f81612cd7565b9050919050565b6000602082019050818103600083015261305f81612cfa565b9050919050565b6000602082019050818103600083015261307f81612d1d565b9050919050565b6000602082019050818103600083015261309f81612d40565b9050919050565b600060208201905081810360008301526130bf81612d63565b9050919050565b600060208201905081810360008301526130df81612d86565b9050919050565b600060208201905081810360008301526130ff81612da9565b9050919050565b6000602082019050818103600083015261311f81612dcc565b9050919050565b600060208201905061313b6000830184612def565b92915050565b600061314b61315c565b90506131578282613408565b919050565b6000604051905090565b600067ffffffffffffffff82111561318157613180613540565b5b61318a8261356f565b9050602081019050919050565b600067ffffffffffffffff8211156131b2576131b1613540565b5b6131bb8261356f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006132168261338a565b91506132218361338a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613256576132556134b3565b5b828201905092915050565b600061326c8261338a565b91506132778361338a565b925082613287576132866134e2565b5b828204905092915050565b600061329d8261338a565b91506132a88361338a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132e1576132e06134b3565b5b828202905092915050565b60006132f78261338a565b91506133028361338a565b925082821015613315576133146134b3565b5b828203905092915050565b600061332b8261336a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156133c15780820151818401526020810190506133a6565b838111156133d0576000848401525b50505050565b600060028204905060018216806133ee57607f821691505b6020821081141561340257613401613511565b5b50919050565b6134118261356f565b810181811067ffffffffffffffff821117156134305761342f613540565b5b80604052505050565b60006134448261338a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613477576134766134b3565b5b600182019050919050565b600061348d8261338a565b91506134988361338a565b9250826134a8576134a76134e2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b613a3681613320565b8114613a4157600080fd5b50565b613a4d81613332565b8114613a5857600080fd5b50565b613a648161333e565b8114613a6f57600080fd5b50565b613a7b8161338a565b8114613a8657600080fd5b5056fea26469706673582212201371a64c1069dede04b630a689acc0ea0e9a1237adb466e90875af1cbd8bacd064736f6c6343000804003368747470733a2f2f697066732e696f2f697066732f516d6564356a6e4b6e75616e316550673575345072716e66527436474d627455633779453838764235424c6a72512f
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806365f13097116100f7578063a0712d6811610095578063c87b56dd11610064578063c87b56dd1461061f578063e985e9c51461065c578063eb8d244414610699578063f2fde38b146106c4576101c2565b8063a0712d6814610588578063a22cb465146105a4578063b88d4fde146105cd578063c4e37095146105f6576101c2565b8063819b25ba116100d1578063819b25ba146104de578063833b9499146105075780638da5cb5b1461053257806395d89b411461055d576101c2565b806365f130971461045f57806370a082311461048a578063715018a6146104c7576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e146103935780634f6ccce7146103bc57806355f804b3146103f95780636352211e14610422576101c2565b80632f745c591461031457806332cb6b0c146103515780633ccfd60b1461037c576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632a47f799146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906129d9565b6106ed565b6040516101fb9190612e89565b60405180910390f35b34801561021057600080fd5b506102196106ff565b6040516102269190612ea4565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612a6c565b610791565b6040516102639190612e22565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612974565b6107d7565b005b3480156102a157600080fd5b506102aa6108ef565b6040516102b79190613126565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e2919061286e565b6108fc565b005b3480156102f557600080fd5b506102fe61095c565b60405161030b9190613126565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190612974565b610962565b6040516103489190613126565b60405180910390f35b34801561035d57600080fd5b50610366610a07565b6040516103739190613126565b60405180910390f35b34801561038857600080fd5b50610391610a0d565b005b34801561039f57600080fd5b506103ba60048036038101906103b5919061286e565b610a64565b005b3480156103c857600080fd5b506103e360048036038101906103de9190612a6c565b610a84565b6040516103f09190613126565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190612a2b565b610b1b565b005b34801561042e57600080fd5b5061044960048036038101906104449190612a6c565b610b3d565b6040516104569190612e22565b60405180910390f35b34801561046b57600080fd5b50610474610bef565b6040516104819190613126565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac9190612809565b610bf4565b6040516104be9190613126565b60405180910390f35b3480156104d357600080fd5b506104dc610cac565b005b3480156104ea57600080fd5b5061050560048036038101906105009190612a6c565b610cc0565b005b34801561051357600080fd5b5061051c610d68565b6040516105299190613126565b60405180910390f35b34801561053e57600080fd5b50610547610d6d565b6040516105549190612e22565b60405180910390f35b34801561056957600080fd5b50610572610d97565b60405161057f9190612ea4565b60405180910390f35b6105a2600480360381019061059d9190612a6c565b610e29565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190612938565b610fc4565b005b3480156105d957600080fd5b506105f460048036038101906105ef91906128bd565b610fda565b005b34801561060257600080fd5b5061061d600480360381019061061891906129b0565b61103c565b005b34801561062b57600080fd5b5061064660048036038101906106419190612a6c565b611061565b6040516106539190612ea4565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190612832565b6110c9565b6040516106909190612e89565b60405180910390f35b3480156106a557600080fd5b506106ae61115d565b6040516106bb9190612e89565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190612809565b611170565b005b60006106f8826111f4565b9050919050565b60606000805461070e906133d6565b80601f016020809104026020016040519081016040528092919081815260200182805461073a906133d6565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b5050505050905090565b600061079c8261126e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e282610b3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a906130a6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108726112b9565b73ffffffffffffffffffffffffffffffffffffffff1614806108a157506108a08161089b6112b9565b6110c9565b5b6108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d790613006565b60405180910390fd5b6108ea83836112c1565b505050565b6000600880549050905090565b61090d6109076112b9565b8261137a565b61094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390613106565b60405180910390fd5b61095783838361140f565b505050565b61251c81565b600061096d83610bf4565b82106109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590612ec6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610a15611676565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a60573d6000803e3d6000fd5b5050565b610a7f83838360405180602001604052806000815250610fda565b505050565b6000610a8e6108ef565b8210610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac6906130e6565b60405180910390fd5b60088281548110610b09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610b23611676565b80600b9080519060200190610b3992919061262d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90613066565b60405180910390fd5b80915050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90612fe6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cb4611676565b610cbe60006116f4565b565b610cc8611676565b6000610cd26108ef565b90506127108282610ce3919061320b565b1115610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90612f26565b60405180910390fd5b60005b82811015610d6357610d503360018385610d41919061320b565b610d4b919061320b565b6117ba565b8080610d5b90613439565b915050610d27565b505050565b600081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610da6906133d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd2906133d6565b8015610e1f5780601f10610df457610100808354040283529160200191610e1f565b820191906000526020600020905b815481529060010190602001808311610e0257829003601f168201915b5050505050905090565b6000610e336108ef565b90506000610e4033610bf4565b9050600a60149054906101000a900460ff16610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8890613086565b60405180910390fd5b600a8382610e9f919061320b565b1115610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed7906130c6565b60405180910390fd5b61251c8383610eef919061320b565b1115610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790612f26565b60405180910390fd5b34836000610f3e9190613292565b1015610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690612fc6565b60405180910390fd5b60005b83811015610fbe57610fab3360018386610f9c919061320b565b610fa6919061320b565b6117ba565b8080610fb690613439565b915050610f82565b50505050565b610fd6610fcf6112b9565b83836117d8565b5050565b610feb610fe56112b9565b8361137a565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190613106565b60405180910390fd5b61103684848484611945565b50505050565b611044611676565b80600a60146101000a81548160ff02191690831515021790555050565b606061106c8261126e565b60006110766119a1565b9050600081511161109657604051806020016040528060008152506110c1565b806110a084611a33565b6040516020016110b1929190612dfe565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60149054906101000a900460ff1681565b611178611676565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90612f06565b60405180910390fd5b6111f1816116f4565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611267575061126682611be0565b5b9050919050565b61127781611cc2565b6112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90613066565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661133483610b3d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061138683610b3d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113c857506113c781856110c9565b5b8061140657508373ffffffffffffffffffffffffffffffffffffffff166113ee84610791565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661142f82610b3d565b73ffffffffffffffffffffffffffffffffffffffff1614611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147c90612f46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90612f86565b60405180910390fd5b611500838383611d2e565b61150b6000826112c1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461155b91906132ec565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b2919061320b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611671838383611d3e565b505050565b61167e6112b9565b73ffffffffffffffffffffffffffffffffffffffff1661169c610d6d565b73ffffffffffffffffffffffffffffffffffffffff16146116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e990613046565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6117d4828260405180602001604052806000815250611d43565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90612fa6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119389190612e89565b60405180910390a3505050565b61195084848461140f565b61195c84848484611d9e565b61199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290612ee6565b60405180910390fd5b50505050565b6060600b80546119b0906133d6565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc906133d6565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b5050505050905090565b60606000821415611a7b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611bdb565b600082905060005b60008214611aad578080611a9690613439565b915050600a82611aa69190613261565b9150611a83565b60008167ffffffffffffffff811115611aef577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b215781602001600182028036833780820191505090505b5090505b60008514611bd457600182611b3a91906132ec565b9150600a85611b499190613482565b6030611b55919061320b565b60f81b818381518110611b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611bcd9190613261565b9450611b25565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cbb5750611cba82611f35565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611d39838383611f9f565b505050565b505050565b611d4d83836120b3565b611d5a6000848484611d9e565b611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9090612ee6565b60405180910390fd5b505050565b6000611dbf8473ffffffffffffffffffffffffffffffffffffffff1661228d565b15611f28578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611de86112b9565b8786866040518563ffffffff1660e01b8152600401611e0a9493929190612e3d565b602060405180830381600087803b158015611e2457600080fd5b505af1925050508015611e5557506040513d601f19601f82011682018060405250810190611e529190612a02565b60015b611ed8573d8060008114611e85576040519150601f19603f3d011682016040523d82523d6000602084013e611e8a565b606091505b50600081511415611ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec790612ee6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f2d565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611faa8383836122b0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fed57611fe8816122b5565b61202c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461202b5761202a83826122fe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561206f5761206a8161246b565b6120ae565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120ad576120ac82826125ae565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90613026565b60405180910390fd5b61212c81611cc2565b1561216c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216390612f66565b60405180910390fd5b61217860008383611d2e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c8919061320b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461228960008383611d3e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161230b84610bf4565b61231591906132ec565b90506000600760008481526020019081526020016000205490508181146123fa576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061247f91906132ec565b90506000600960008481526020019081526020016000205490506000600883815481106124d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061251d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612592577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125b983610bf4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612639906133d6565b90600052602060002090601f01602090048101928261265b57600085556126a2565b82601f1061267457805160ff19168380011785556126a2565b828001600101855582156126a2579182015b828111156126a1578251825591602001919060010190612686565b5b5090506126af91906126b3565b5090565b5b808211156126cc5760008160009055506001016126b4565b5090565b60006126e36126de84613166565b613141565b9050828152602081018484840111156126fb57600080fd5b612706848285613394565b509392505050565b600061272161271c84613197565b613141565b90508281526020810184848401111561273957600080fd5b612744848285613394565b509392505050565b60008135905061275b81613a2d565b92915050565b60008135905061277081613a44565b92915050565b60008135905061278581613a5b565b92915050565b60008151905061279a81613a5b565b92915050565b600082601f8301126127b157600080fd5b81356127c18482602086016126d0565b91505092915050565b600082601f8301126127db57600080fd5b81356127eb84826020860161270e565b91505092915050565b60008135905061280381613a72565b92915050565b60006020828403121561281b57600080fd5b60006128298482850161274c565b91505092915050565b6000806040838503121561284557600080fd5b60006128538582860161274c565b92505060206128648582860161274c565b9150509250929050565b60008060006060848603121561288357600080fd5b60006128918682870161274c565b93505060206128a28682870161274c565b92505060406128b3868287016127f4565b9150509250925092565b600080600080608085870312156128d357600080fd5b60006128e18782880161274c565b94505060206128f28782880161274c565b9350506040612903878288016127f4565b925050606085013567ffffffffffffffff81111561292057600080fd5b61292c878288016127a0565b91505092959194509250565b6000806040838503121561294b57600080fd5b60006129598582860161274c565b925050602061296a85828601612761565b9150509250929050565b6000806040838503121561298757600080fd5b60006129958582860161274c565b92505060206129a6858286016127f4565b9150509250929050565b6000602082840312156129c257600080fd5b60006129d084828501612761565b91505092915050565b6000602082840312156129eb57600080fd5b60006129f984828501612776565b91505092915050565b600060208284031215612a1457600080fd5b6000612a228482850161278b565b91505092915050565b600060208284031215612a3d57600080fd5b600082013567ffffffffffffffff811115612a5757600080fd5b612a63848285016127ca565b91505092915050565b600060208284031215612a7e57600080fd5b6000612a8c848285016127f4565b91505092915050565b612a9e81613320565b82525050565b612aad81613332565b82525050565b6000612abe826131c8565b612ac881856131de565b9350612ad88185602086016133a3565b612ae18161356f565b840191505092915050565b6000612af7826131d3565b612b0181856131ef565b9350612b118185602086016133a3565b612b1a8161356f565b840191505092915050565b6000612b30826131d3565b612b3a8185613200565b9350612b4a8185602086016133a3565b80840191505092915050565b6000612b63602b836131ef565b9150612b6e82613580565b604082019050919050565b6000612b866032836131ef565b9150612b91826135cf565b604082019050919050565b6000612ba96026836131ef565b9150612bb48261361e565b604082019050919050565b6000612bcc6020836131ef565b9150612bd78261366d565b602082019050919050565b6000612bef6025836131ef565b9150612bfa82613696565b604082019050919050565b6000612c12601c836131ef565b9150612c1d826136e5565b602082019050919050565b6000612c356024836131ef565b9150612c408261370e565b604082019050919050565b6000612c586019836131ef565b9150612c638261375d565b602082019050919050565b6000612c7b601f836131ef565b9150612c8682613786565b602082019050919050565b6000612c9e6029836131ef565b9150612ca9826137af565b604082019050919050565b6000612cc1603e836131ef565b9150612ccc826137fe565b604082019050919050565b6000612ce46020836131ef565b9150612cef8261384d565b602082019050919050565b6000612d076020836131ef565b9150612d1282613876565b602082019050919050565b6000612d2a6018836131ef565b9150612d358261389f565b602082019050919050565b6000612d4d6022836131ef565b9150612d58826138c8565b604082019050919050565b6000612d706021836131ef565b9150612d7b82613917565b604082019050919050565b6000612d93601b836131ef565b9150612d9e82613966565b602082019050919050565b6000612db6602c836131ef565b9150612dc18261398f565b604082019050919050565b6000612dd9602e836131ef565b9150612de4826139de565b604082019050919050565b612df88161338a565b82525050565b6000612e0a8285612b25565b9150612e168284612b25565b91508190509392505050565b6000602082019050612e376000830184612a95565b92915050565b6000608082019050612e526000830187612a95565b612e5f6020830186612a95565b612e6c6040830185612def565b8181036060830152612e7e8184612ab3565b905095945050505050565b6000602082019050612e9e6000830184612aa4565b92915050565b60006020820190508181036000830152612ebe8184612aec565b905092915050565b60006020820190508181036000830152612edf81612b56565b9050919050565b60006020820190508181036000830152612eff81612b79565b9050919050565b60006020820190508181036000830152612f1f81612b9c565b9050919050565b60006020820190508181036000830152612f3f81612bbf565b9050919050565b60006020820190508181036000830152612f5f81612be2565b9050919050565b60006020820190508181036000830152612f7f81612c05565b9050919050565b60006020820190508181036000830152612f9f81612c28565b9050919050565b60006020820190508181036000830152612fbf81612c4b565b9050919050565b60006020820190508181036000830152612fdf81612c6e565b9050919050565b60006020820190508181036000830152612fff81612c91565b9050919050565b6000602082019050818103600083015261301f81612cb4565b9050919050565b6000602082019050818103600083015261303f81612cd7565b9050919050565b6000602082019050818103600083015261305f81612cfa565b9050919050565b6000602082019050818103600083015261307f81612d1d565b9050919050565b6000602082019050818103600083015261309f81612d40565b9050919050565b600060208201905081810360008301526130bf81612d63565b9050919050565b600060208201905081810360008301526130df81612d86565b9050919050565b600060208201905081810360008301526130ff81612da9565b9050919050565b6000602082019050818103600083015261311f81612dcc565b9050919050565b600060208201905061313b6000830184612def565b92915050565b600061314b61315c565b90506131578282613408565b919050565b6000604051905090565b600067ffffffffffffffff82111561318157613180613540565b5b61318a8261356f565b9050602081019050919050565b600067ffffffffffffffff8211156131b2576131b1613540565b5b6131bb8261356f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006132168261338a565b91506132218361338a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613256576132556134b3565b5b828201905092915050565b600061326c8261338a565b91506132778361338a565b925082613287576132866134e2565b5b828204905092915050565b600061329d8261338a565b91506132a88361338a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132e1576132e06134b3565b5b828202905092915050565b60006132f78261338a565b91506133028361338a565b925082821015613315576133146134b3565b5b828203905092915050565b600061332b8261336a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156133c15780820151818401526020810190506133a6565b838111156133d0576000848401525b50505050565b600060028204905060018216806133ee57607f821691505b6020821081141561340257613401613511565b5b50919050565b6134118261356f565b810181811067ffffffffffffffff821117156134305761342f613540565b5b80604052505050565b60006134448261338a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613477576134766134b3565b5b600182019050919050565b600061348d8261338a565b91506134988361338a565b9250826134a8576134a76134e2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b613a3681613320565b8114613a4157600080fd5b50565b613a4d81613332565b8114613a5857600080fd5b50565b613a648161333e565b8114613a6f57600080fd5b50565b613a7b8161338a565b8114613a8657600080fd5b5056fea26469706673582212201371a64c1069dede04b630a689acc0ea0e9a1237adb466e90875af1cbd8bacd064736f6c63430008040033
Deployed Bytecode Sourcemap
46288:2730:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47037:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26744:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28257:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27774:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40650:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28957:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46540:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40318:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46493:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48885:130;;;;;;;;;;;;;:::i;:::-;;29364:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40840:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47216:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26455:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46593:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26186:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;47992:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46642:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26913:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48351:528;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28500:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29620:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48255:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27088:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28726:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46345:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47037:173;47148:4;47168:36;47192:11;47168:23;:36::i;:::-;47161:43;;47037:173;;;:::o;26744:100::-;26798:13;26831:5;26824:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26744:100;:::o;28257:171::-;28333:7;28353:23;28368:7;28353:14;:23::i;:::-;28396:15;:24;28412:7;28396:24;;;;;;;;;;;;;;;;;;;;;28389:31;;28257:171;;;:::o;27774:417::-;27855:13;27871:23;27886:7;27871:14;:23::i;:::-;27855:39;;27919:5;27913:11;;:2;:11;;;;27905:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28013:5;27997:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28022:37;28039:5;28046:12;:10;:12::i;:::-;28022:16;:37::i;:::-;27997:62;27975:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28162:21;28171:2;28175:7;28162:8;:21::i;:::-;27774:417;;;:::o;40650:113::-;40711:7;40738:10;:17;;;;40731:24;;40650:113;:::o;28957:336::-;29152:41;29171:12;:10;:12::i;:::-;29185:7;29152:18;:41::i;:::-;29144:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29257:28;29267:4;29273:2;29277:7;29257:9;:28::i;:::-;28957:336;;;:::o;46540:48::-;46584:4;46540:48;:::o;40318:256::-;40415:7;40451:23;40468:5;40451:16;:23::i;:::-;40443:5;:31;40435:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40540:12;:19;40553:5;40540:19;;;;;;;;;;;;;;;:26;40560:5;40540:26;;;;;;;;;;;;40533:33;;40318:256;;;;:::o;46493:42::-;46530:5;46493:42;:::o;48885:130::-;4511:13;:11;:13::i;:::-;48929:12:::1;48944:21;48929:36;;48980:10;48972:28;;:37;49001:7;48972:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4535:1;48885:130::o:0;29364:185::-;29502:39;29519:4;29525:2;29529:7;29502:39;;;;;;;;;;;;:16;:39::i;:::-;29364:185;;;:::o;40840:233::-;40915:7;40951:30;:28;:30::i;:::-;40943:5;:38;40935:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41048:10;41059:5;41048:17;;;;;;;;;;;;;;;;;;;;;;;;41041:24;;40840:233;;;:::o;47216:105::-;4511:13;:11;:13::i;:::-;47307:8:::1;47288:16;:27;;;;;;;;;;;;:::i;:::-;;47216:105:::0;:::o;26455:222::-;26527:7;26547:13;26563:7;:16;26571:7;26563:16;;;;;;;;;;;;;;;;;;;;;26547:32;;26615:1;26598:19;;:5;:19;;;;26590:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26664:5;26657:12;;;26455:222;;;:::o;46593:44::-;46635:2;46593:44;:::o;26186:207::-;26258:7;26303:1;26286:19;;:5;:19;;;;26278:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:9;:16;26379:5;26369:16;;;;;;;;;;;;;;;;26362:23;;26186:207;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;47992:257::-;4511:13;:11;:13::i;:::-;48044:10:::1;48057:13;:11;:13::i;:::-;48044:26;;46530:5;48093:1;48085:5;:9;;;;:::i;:::-;:23;;48077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48154:6;48167:77;48183:1;48179;:5;48167:77;;;48200:36;48210:10;48234:1;48230;48222:5;:9;;;;:::i;:::-;:13;;;;:::i;:::-;48200:9;:36::i;:::-;48186:3;;;;;:::i;:::-;;;;48167:77;;;4535:1;;47992:257:::0;:::o;46642:49::-;46684:7;46642:49;:::o;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;26913:104::-;26969:13;27002:7;26995:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26913:104;:::o;48351:528::-;48395:13;48411;:11;:13::i;:::-;48395:29;;48431:15;48449:21;48459:10;48449:9;:21::i;:::-;48431:39;;48487:12;;;;;;;;;;;48479:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;46635:2;48563:1;48553:7;:11;;;;:::i;:::-;:30;;48545:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;46584:4;48638:1;48630:5;:9;;;;:::i;:::-;:30;;48622:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;48735:9;48730:1;46684:7;48712:19;;;;:::i;:::-;:32;;48704:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48794:9;48789:85;48813:1;48809;:5;48789:85;;;48830:36;48840:10;48864:1;48860;48852:5;:9;;;;:::i;:::-;:13;;;;:::i;:::-;48830:9;:36::i;:::-;48816:3;;;;;:::i;:::-;;;;48789:85;;;;48351:528;;;:::o;28500:155::-;28595:52;28614:12;:10;:12::i;:::-;28628:8;28638;28595:18;:52::i;:::-;28500:155;;:::o;29620:323::-;29794:41;29813:12;:10;:12::i;:::-;29827:7;29794:18;:41::i;:::-;29786:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29897:38;29911:4;29917:2;29921:7;29930:4;29897:13;:38::i;:::-;29620:323;;;;:::o;48255:90::-;4511:13;:11;:13::i;:::-;48331:8:::1;48316:12;;:23;;;;;;;;;;;;;;;;;;48255:90:::0;:::o;27088:281::-;27161:13;27187:23;27202:7;27187:14;:23::i;:::-;27223:21;27247:10;:8;:10::i;:::-;27223:34;;27299:1;27281:7;27275:21;:25;:86;;;;;;;;;;;;;;;;;27327:7;27336:18;:7;:16;:18::i;:::-;27310:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27275:86;27268:93;;;27088:281;;;:::o;28726:164::-;28823:4;28847:18;:25;28866:5;28847:25;;;;;;;;;;;;;;;:35;28873:8;28847:35;;;;;;;;;;;;;;;;;;;;;;;;;28840:42;;28726:164;;;;:::o;46345:32::-;;;;;;;;;;;;;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;;;5612:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;40010:224::-;40112:4;40151:35;40136:50;;;:11;:50;;;;:90;;;;40190:36;40214:11;40190:23;:36::i;:::-;40136:90;40129:97;;40010:224;;;:::o;36232:135::-;36314:16;36322:7;36314;:16::i;:::-;36306:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36232:135;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;35511:174::-;35613:2;35586:15;:24;35602:7;35586:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35669:7;35665:2;35631:46;;35640:23;35655:7;35640:14;:23::i;:::-;35631:46;;;;;;;;;;;;35511:174;;:::o;31744:264::-;31837:4;31854:13;31870:23;31885:7;31870:14;:23::i;:::-;31854:39;;31923:5;31912:16;;:7;:16;;;:52;;;;31932:32;31949:5;31956:7;31932:16;:32::i;:::-;31912:52;:87;;;;31992:7;31968:31;;:20;31980:7;31968:11;:20::i;:::-;:31;;;31912:87;31904:96;;;31744:264;;;;:::o;34767:625::-;34926:4;34899:31;;:23;34914:7;34899:14;:23::i;:::-;:31;;;34891:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35005:1;34991:16;;:2;:16;;;;34983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35061:39;35082:4;35088:2;35092:7;35061:20;:39::i;:::-;35165:29;35182:1;35186:7;35165:8;:29::i;:::-;35226:1;35207:9;:15;35217:4;35207:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35255:1;35238:9;:13;35248:2;35238:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35286:2;35267:7;:16;35275:7;35267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35325:7;35321:2;35306:27;;35315:4;35306:27;;;;;;;;;;;;35346:38;35366:4;35372:2;35376:7;35346:19;:38::i;:::-;34767:625;;;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5892:191;;:::o;32350:110::-;32426:26;32436:2;32440:7;32426:26;;;;;;;;;;;;:9;:26::i;:::-;32350:110;;:::o;35828:315::-;35983:8;35974:17;;:5;:17;;;;35966:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36070:8;36032:18;:25;36051:5;36032:25;;;;;;;;;;;;;;;:35;36058:8;36032:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36116:8;36094:41;;36109:5;36094:41;;;36126:8;36094:41;;;;;;:::i;:::-;;;;;;;;35828:315;;;:::o;30824:313::-;30980:28;30990:4;30996:2;31000:7;30980:9;:28::i;:::-;31027:47;31050:4;31056:2;31060:7;31069:4;31027:22;:47::i;:::-;31019:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30824:313;;;;:::o;47327:111::-;47387:13;47416:16;47409:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47327:111;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;25817:305::-;25919:4;25971:25;25956:40;;;:11;:40;;;;:105;;;;26028:33;26013:48;;;:11;:48;;;;25956:105;:158;;;;26078:36;26102:11;26078:23;:36::i;:::-;25956:158;25936:178;;25817:305;;;:::o;31450:127::-;31515:4;31567:1;31539:30;;:7;:16;31547:7;31539:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31532:37;;31450:127;;;:::o;46856:175::-;46980:45;47007:4;47013:2;47017:7;46980:26;:45::i;:::-;46856:175;;;:::o;38867:125::-;;;;:::o;32687:319::-;32816:18;32822:2;32826:7;32816:5;:18::i;:::-;32867:53;32898:1;32902:2;32906:7;32915:4;32867:22;:53::i;:::-;32845:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;32687:319;;;:::o;36931:853::-;37085:4;37106:15;:2;:13;;;:15::i;:::-;37102:675;;;37158:2;37142:36;;;37179:12;:10;:12::i;:::-;37193:4;37199:7;37208:4;37142:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37138:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37400:1;37383:6;:13;:18;37379:328;;;37426:60;;;;;;;;;;:::i;:::-;;;;;;;;37379:328;37657:6;37651:13;37642:6;37638:2;37634:15;37627:38;37138:584;37274:41;;;37264:51;;;:6;:51;;;;37257:58;;;;;37102:675;37761:4;37754:11;;36931:853;;;;;;;:::o;17479:157::-;17564:4;17603:25;17588:40;;;:11;:40;;;;17581:47;;17479:157;;;:::o;41686:589::-;41830:45;41857:4;41863:2;41867:7;41830:26;:45::i;:::-;41908:1;41892:18;;:4;:18;;;41888:187;;;41927:40;41959:7;41927:31;:40::i;:::-;41888:187;;;41997:2;41989:10;;:4;:10;;;41985:90;;42016:47;42049:4;42055:7;42016:32;:47::i;:::-;41985:90;41888:187;42103:1;42089:16;;:2;:16;;;42085:183;;;42122:45;42159:7;42122:36;:45::i;:::-;42085:183;;;42195:4;42189:10;;:2;:10;;;42185:83;;42216:40;42244:2;42248:7;42216:27;:40::i;:::-;42185:83;42085:183;41686:589;;;:::o;33342:439::-;33436:1;33422:16;;:2;:16;;;;33414:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33495:16;33503:7;33495;:16::i;:::-;33494:17;33486:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33557:45;33586:1;33590:2;33594:7;33557:20;:45::i;:::-;33632:1;33615:9;:13;33625:2;33615:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33663:2;33644:7;:16;33652:7;33644:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33708:7;33704:2;33683:33;;33700:1;33683:33;;;;;;;;;;;;33729:44;33757:1;33761:2;33765:7;33729:19;:44::i;:::-;33342:439;;:::o;7323:326::-;7383:4;7640:1;7618:7;:19;;;:23;7611:30;;7323:326;;;:::o;38356:126::-;;;;:::o;42998:164::-;43102:10;:17;;;;43075:15;:24;43091:7;43075:24;;;;;;;;;;;:44;;;;43130:10;43146:7;43130:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42998:164;:::o;43789:988::-;44055:22;44105:1;44080:22;44097:4;44080:16;:22::i;:::-;:26;;;;:::i;:::-;44055:51;;44117:18;44138:17;:26;44156:7;44138:26;;;;;;;;;;;;44117:47;;44285:14;44271:10;:28;44267:328;;44316:19;44338:12;:18;44351:4;44338:18;;;;;;;;;;;;;;;:34;44357:14;44338:34;;;;;;;;;;;;44316:56;;44422:11;44389:12;:18;44402:4;44389:18;;;;;;;;;;;;;;;:30;44408:10;44389:30;;;;;;;;;;;:44;;;;44539:10;44506:17;:30;44524:11;44506:30;;;;;;;;;;;:43;;;;44267:328;;44691:17;:26;44709:7;44691:26;;;;;;;;;;;44684:33;;;44735:12;:18;44748:4;44735:18;;;;;;;;;;;;;;;:34;44754:14;44735:34;;;;;;;;;;;44728:41;;;43789:988;;;;:::o;45072:1079::-;45325:22;45370:1;45350:10;:17;;;;:21;;;;:::i;:::-;45325:46;;45382:18;45403:15;:24;45419:7;45403:24;;;;;;;;;;;;45382:45;;45754:19;45776:10;45787:14;45776:26;;;;;;;;;;;;;;;;;;;;;;;;45754:48;;45840:11;45815:10;45826;45815:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;45951:10;45920:15;:28;45936:11;45920:28;;;;;;;;;;;:41;;;;46092:15;:24;46108:7;46092:24;;;;;;;;;;;46085:31;;;46127:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45072:1079;;;;:::o;42576:221::-;42661:14;42678:20;42695:2;42678:16;:20::i;:::-;42661:37;;42736:7;42709:12;:16;42722:2;42709:16;;;;;;;;;;;;;;;:24;42726:6;42709:24;;;;;;;;;;;:34;;;;42783:6;42754:17;:26;42772:7;42754:26;;;;;;;;;;;:35;;;;42576:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:256::-;4939:6;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:50;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;:::-;5062:60;;5018:114;4946:193;;;;:::o;5145:260::-;5203:6;5252:2;5240:9;5231:7;5227:23;5223:32;5220:2;;;5268:1;5265;5258:12;5220:2;5311:1;5336:52;5380:7;5371:6;5360:9;5356:22;5336:52;:::i;:::-;5326:62;;5282:116;5210:195;;;;:::o;5411:282::-;5480:6;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;5545:1;5542;5535:12;5497:2;5588:1;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5559:127;5487:206;;;;:::o;5699:375::-;5768:6;5817:2;5805:9;5796:7;5792:23;5788:32;5785:2;;;5833:1;5830;5823:12;5785:2;5904:1;5893:9;5889:17;5876:31;5934:18;5926:6;5923:30;5920:2;;;5966:1;5963;5956:12;5920:2;5994:63;6049:7;6040:6;6029:9;6025:22;5994:63;:::i;:::-;5984:73;;5847:220;5775:299;;;;:::o;6080:262::-;6139:6;6188:2;6176:9;6167:7;6163:23;6159:32;6156:2;;;6204:1;6201;6194:12;6156:2;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6146:196;;;;:::o;6348:118::-;6435:24;6453:5;6435:24;:::i;:::-;6430:3;6423:37;6413:53;;:::o;6472:109::-;6553:21;6568:5;6553:21;:::i;:::-;6548:3;6541:34;6531:50;;:::o;6587:360::-;6673:3;6701:38;6733:5;6701:38;:::i;:::-;6755:70;6818:6;6813:3;6755:70;:::i;:::-;6748:77;;6834:52;6879:6;6874:3;6867:4;6860:5;6856:16;6834:52;:::i;:::-;6911:29;6933:6;6911:29;:::i;:::-;6906:3;6902:39;6895:46;;6677:270;;;;;:::o;6953:364::-;7041:3;7069:39;7102:5;7069:39;:::i;:::-;7124:71;7188:6;7183:3;7124:71;:::i;:::-;7117:78;;7204:52;7249:6;7244:3;7237:4;7230:5;7226:16;7204:52;:::i;:::-;7281:29;7303:6;7281:29;:::i;:::-;7276:3;7272:39;7265:46;;7045:272;;;;;:::o;7323:377::-;7429:3;7457:39;7490:5;7457:39;:::i;:::-;7512:89;7594:6;7589:3;7512:89;:::i;:::-;7505:96;;7610:52;7655:6;7650:3;7643:4;7636:5;7632:16;7610:52;:::i;:::-;7687:6;7682:3;7678:16;7671:23;;7433:267;;;;;:::o;7706:366::-;7848:3;7869:67;7933:2;7928:3;7869:67;:::i;:::-;7862:74;;7945:93;8034:3;7945:93;:::i;:::-;8063:2;8058:3;8054:12;8047:19;;7852:220;;;:::o;8078:366::-;8220:3;8241:67;8305:2;8300:3;8241:67;:::i;:::-;8234:74;;8317:93;8406:3;8317:93;:::i;:::-;8435:2;8430:3;8426:12;8419:19;;8224:220;;;:::o;8450:366::-;8592:3;8613:67;8677:2;8672:3;8613:67;:::i;:::-;8606:74;;8689:93;8778:3;8689:93;:::i;:::-;8807:2;8802:3;8798:12;8791:19;;8596:220;;;:::o;8822:366::-;8964:3;8985:67;9049:2;9044:3;8985:67;:::i;:::-;8978:74;;9061:93;9150:3;9061:93;:::i;:::-;9179:2;9174:3;9170:12;9163:19;;8968:220;;;:::o;9194:366::-;9336:3;9357:67;9421:2;9416:3;9357:67;:::i;:::-;9350:74;;9433:93;9522:3;9433:93;:::i;:::-;9551:2;9546:3;9542:12;9535:19;;9340:220;;;:::o;9566:366::-;9708:3;9729:67;9793:2;9788:3;9729:67;:::i;:::-;9722:74;;9805:93;9894:3;9805:93;:::i;:::-;9923:2;9918:3;9914:12;9907:19;;9712:220;;;:::o;9938:366::-;10080:3;10101:67;10165:2;10160:3;10101:67;:::i;:::-;10094:74;;10177:93;10266:3;10177:93;:::i;:::-;10295:2;10290:3;10286:12;10279:19;;10084:220;;;:::o;10310:366::-;10452:3;10473:67;10537:2;10532:3;10473:67;:::i;:::-;10466:74;;10549:93;10638:3;10549:93;:::i;:::-;10667:2;10662:3;10658:12;10651:19;;10456:220;;;:::o;10682:366::-;10824:3;10845:67;10909:2;10904:3;10845:67;:::i;:::-;10838:74;;10921:93;11010:3;10921:93;:::i;:::-;11039:2;11034:3;11030:12;11023:19;;10828:220;;;:::o;11054:366::-;11196:3;11217:67;11281:2;11276:3;11217:67;:::i;:::-;11210:74;;11293:93;11382:3;11293:93;:::i;:::-;11411:2;11406:3;11402:12;11395:19;;11200:220;;;:::o;11426:366::-;11568:3;11589:67;11653:2;11648:3;11589:67;:::i;:::-;11582:74;;11665:93;11754:3;11665:93;:::i;:::-;11783:2;11778:3;11774:12;11767:19;;11572:220;;;:::o;11798:366::-;11940:3;11961:67;12025:2;12020:3;11961:67;:::i;:::-;11954:74;;12037:93;12126:3;12037:93;:::i;:::-;12155:2;12150:3;12146:12;12139:19;;11944:220;;;:::o;12170:366::-;12312:3;12333:67;12397:2;12392:3;12333:67;:::i;:::-;12326:74;;12409:93;12498:3;12409:93;:::i;:::-;12527:2;12522:3;12518:12;12511:19;;12316:220;;;:::o;12542:366::-;12684:3;12705:67;12769:2;12764:3;12705:67;:::i;:::-;12698:74;;12781:93;12870:3;12781:93;:::i;:::-;12899:2;12894:3;12890:12;12883:19;;12688:220;;;:::o;12914:366::-;13056:3;13077:67;13141:2;13136:3;13077:67;:::i;:::-;13070:74;;13153:93;13242:3;13153:93;:::i;:::-;13271:2;13266:3;13262:12;13255:19;;13060:220;;;:::o;13286:366::-;13428:3;13449:67;13513:2;13508:3;13449:67;:::i;:::-;13442:74;;13525:93;13614:3;13525:93;:::i;:::-;13643:2;13638:3;13634:12;13627:19;;13432:220;;;:::o;13658:366::-;13800:3;13821:67;13885:2;13880:3;13821:67;:::i;:::-;13814:74;;13897:93;13986:3;13897:93;:::i;:::-;14015:2;14010:3;14006:12;13999:19;;13804:220;;;:::o;14030:366::-;14172:3;14193:67;14257:2;14252:3;14193:67;:::i;:::-;14186:74;;14269:93;14358:3;14269:93;:::i;:::-;14387:2;14382:3;14378:12;14371:19;;14176:220;;;:::o;14402:366::-;14544:3;14565:67;14629:2;14624:3;14565:67;:::i;:::-;14558:74;;14641:93;14730:3;14641:93;:::i;:::-;14759:2;14754:3;14750:12;14743:19;;14548:220;;;:::o;14774:118::-;14861:24;14879:5;14861:24;:::i;:::-;14856:3;14849:37;14839:53;;:::o;14898:435::-;15078:3;15100:95;15191:3;15182:6;15100:95;:::i;:::-;15093:102;;15212:95;15303:3;15294:6;15212:95;:::i;:::-;15205:102;;15324:3;15317:10;;15082:251;;;;;:::o;15339:222::-;15432:4;15470:2;15459:9;15455:18;15447:26;;15483:71;15551:1;15540:9;15536:17;15527:6;15483:71;:::i;:::-;15437:124;;;;:::o;15567:640::-;15762:4;15800:3;15789:9;15785:19;15777:27;;15814:71;15882:1;15871:9;15867:17;15858:6;15814:71;:::i;:::-;15895:72;15963:2;15952:9;15948:18;15939:6;15895:72;:::i;:::-;15977;16045:2;16034:9;16030:18;16021:6;15977:72;:::i;:::-;16096:9;16090:4;16086:20;16081:2;16070:9;16066:18;16059:48;16124:76;16195:4;16186:6;16124:76;:::i;:::-;16116:84;;15767:440;;;;;;;:::o;16213:210::-;16300:4;16338:2;16327:9;16323:18;16315:26;;16351:65;16413:1;16402:9;16398:17;16389:6;16351:65;:::i;:::-;16305:118;;;;:::o;16429:313::-;16542:4;16580:2;16569:9;16565:18;16557:26;;16629:9;16623:4;16619:20;16615:1;16604:9;16600:17;16593:47;16657:78;16730:4;16721:6;16657:78;:::i;:::-;16649:86;;16547:195;;;;:::o;16748:419::-;16914:4;16952:2;16941:9;16937:18;16929:26;;17001:9;16995:4;16991:20;16987:1;16976:9;16972:17;16965:47;17029:131;17155:4;17029:131;:::i;:::-;17021:139;;16919:248;;;:::o;17173:419::-;17339:4;17377:2;17366:9;17362:18;17354:26;;17426:9;17420:4;17416:20;17412:1;17401:9;17397:17;17390:47;17454:131;17580:4;17454:131;:::i;:::-;17446:139;;17344:248;;;:::o;17598:419::-;17764:4;17802:2;17791:9;17787:18;17779:26;;17851:9;17845:4;17841:20;17837:1;17826:9;17822:17;17815:47;17879:131;18005:4;17879:131;:::i;:::-;17871:139;;17769:248;;;:::o;18023:419::-;18189:4;18227:2;18216:9;18212:18;18204:26;;18276:9;18270:4;18266:20;18262:1;18251:9;18247:17;18240:47;18304:131;18430:4;18304:131;:::i;:::-;18296:139;;18194:248;;;:::o;18448:419::-;18614:4;18652:2;18641:9;18637:18;18629:26;;18701:9;18695:4;18691:20;18687:1;18676:9;18672:17;18665:47;18729:131;18855:4;18729:131;:::i;:::-;18721:139;;18619:248;;;:::o;18873:419::-;19039:4;19077:2;19066:9;19062:18;19054:26;;19126:9;19120:4;19116:20;19112:1;19101:9;19097:17;19090:47;19154:131;19280:4;19154:131;:::i;:::-;19146:139;;19044:248;;;:::o;19298:419::-;19464:4;19502:2;19491:9;19487:18;19479:26;;19551:9;19545:4;19541:20;19537:1;19526:9;19522:17;19515:47;19579:131;19705:4;19579:131;:::i;:::-;19571:139;;19469:248;;;:::o;19723:419::-;19889:4;19927:2;19916:9;19912:18;19904:26;;19976:9;19970:4;19966:20;19962:1;19951:9;19947:17;19940:47;20004:131;20130:4;20004:131;:::i;:::-;19996:139;;19894:248;;;:::o;20148:419::-;20314:4;20352:2;20341:9;20337:18;20329:26;;20401:9;20395:4;20391:20;20387:1;20376:9;20372:17;20365:47;20429:131;20555:4;20429:131;:::i;:::-;20421:139;;20319:248;;;:::o;20573:419::-;20739:4;20777:2;20766:9;20762:18;20754:26;;20826:9;20820:4;20816:20;20812:1;20801:9;20797:17;20790:47;20854:131;20980:4;20854:131;:::i;:::-;20846:139;;20744:248;;;:::o;20998:419::-;21164:4;21202:2;21191:9;21187:18;21179:26;;21251:9;21245:4;21241:20;21237:1;21226:9;21222:17;21215:47;21279:131;21405:4;21279:131;:::i;:::-;21271:139;;21169:248;;;:::o;21423:419::-;21589:4;21627:2;21616:9;21612:18;21604:26;;21676:9;21670:4;21666:20;21662:1;21651:9;21647:17;21640:47;21704:131;21830:4;21704:131;:::i;:::-;21696:139;;21594:248;;;:::o;21848:419::-;22014:4;22052:2;22041:9;22037:18;22029:26;;22101:9;22095:4;22091:20;22087:1;22076:9;22072:17;22065:47;22129:131;22255:4;22129:131;:::i;:::-;22121:139;;22019:248;;;:::o;22273:419::-;22439:4;22477:2;22466:9;22462:18;22454:26;;22526:9;22520:4;22516:20;22512:1;22501:9;22497:17;22490:47;22554:131;22680:4;22554:131;:::i;:::-;22546:139;;22444:248;;;:::o;22698:419::-;22864:4;22902:2;22891:9;22887:18;22879:26;;22951:9;22945:4;22941:20;22937:1;22926:9;22922:17;22915:47;22979:131;23105:4;22979:131;:::i;:::-;22971:139;;22869:248;;;:::o;23123:419::-;23289:4;23327:2;23316:9;23312:18;23304:26;;23376:9;23370:4;23366:20;23362:1;23351:9;23347:17;23340:47;23404:131;23530:4;23404:131;:::i;:::-;23396:139;;23294:248;;;:::o;23548:419::-;23714:4;23752:2;23741:9;23737:18;23729:26;;23801:9;23795:4;23791:20;23787:1;23776:9;23772:17;23765:47;23829:131;23955:4;23829:131;:::i;:::-;23821:139;;23719:248;;;:::o;23973:419::-;24139:4;24177:2;24166:9;24162:18;24154:26;;24226:9;24220:4;24216:20;24212:1;24201:9;24197:17;24190:47;24254:131;24380:4;24254:131;:::i;:::-;24246:139;;24144:248;;;:::o;24398:419::-;24564:4;24602:2;24591:9;24587:18;24579:26;;24651:9;24645:4;24641:20;24637:1;24626:9;24622:17;24615:47;24679:131;24805:4;24679:131;:::i;:::-;24671:139;;24569:248;;;:::o;24823:222::-;24916:4;24954:2;24943:9;24939:18;24931:26;;24967:71;25035:1;25024:9;25020:17;25011:6;24967:71;:::i;:::-;24921:124;;;;:::o;25051:129::-;25085:6;25112:20;;:::i;:::-;25102:30;;25141:33;25169:4;25161:6;25141:33;:::i;:::-;25092:88;;;:::o;25186:75::-;25219:6;25252:2;25246:9;25236:19;;25226:35;:::o;25267:307::-;25328:4;25418:18;25410:6;25407:30;25404:2;;;25440:18;;:::i;:::-;25404:2;25478:29;25500:6;25478:29;:::i;:::-;25470:37;;25562:4;25556;25552:15;25544:23;;25333:241;;;:::o;25580:308::-;25642:4;25732:18;25724:6;25721:30;25718:2;;;25754:18;;:::i;:::-;25718:2;25792:29;25814:6;25792:29;:::i;:::-;25784:37;;25876:4;25870;25866:15;25858:23;;25647:241;;;:::o;25894:98::-;25945:6;25979:5;25973:12;25963:22;;25952:40;;;:::o;25998:99::-;26050:6;26084:5;26078:12;26068:22;;26057:40;;;:::o;26103:168::-;26186:11;26220:6;26215:3;26208:19;26260:4;26255:3;26251:14;26236:29;;26198:73;;;;:::o;26277:169::-;26361:11;26395:6;26390:3;26383:19;26435:4;26430:3;26426:14;26411:29;;26373:73;;;;:::o;26452:148::-;26554:11;26591:3;26576:18;;26566:34;;;;:::o;26606:305::-;26646:3;26665:20;26683:1;26665:20;:::i;:::-;26660:25;;26699:20;26717:1;26699:20;:::i;:::-;26694:25;;26853:1;26785:66;26781:74;26778:1;26775:81;26772:2;;;26859:18;;:::i;:::-;26772:2;26903:1;26900;26896:9;26889:16;;26650:261;;;;:::o;26917:185::-;26957:1;26974:20;26992:1;26974:20;:::i;:::-;26969:25;;27008:20;27026:1;27008:20;:::i;:::-;27003:25;;27047:1;27037:2;;27052:18;;:::i;:::-;27037:2;27094:1;27091;27087:9;27082:14;;26959:143;;;;:::o;27108:348::-;27148:7;27171:20;27189:1;27171:20;:::i;:::-;27166:25;;27205:20;27223:1;27205:20;:::i;:::-;27200:25;;27393:1;27325:66;27321:74;27318:1;27315:81;27310:1;27303:9;27296:17;27292:105;27289:2;;;27400:18;;:::i;:::-;27289:2;27448:1;27445;27441:9;27430:20;;27156:300;;;;:::o;27462:191::-;27502:4;27522:20;27540:1;27522:20;:::i;:::-;27517:25;;27556:20;27574:1;27556:20;:::i;:::-;27551:25;;27595:1;27592;27589:8;27586:2;;;27600:18;;:::i;:::-;27586:2;27645:1;27642;27638:9;27630:17;;27507:146;;;;:::o;27659:96::-;27696:7;27725:24;27743:5;27725:24;:::i;:::-;27714:35;;27704:51;;;:::o;27761:90::-;27795:7;27838:5;27831:13;27824:21;27813:32;;27803:48;;;:::o;27857:149::-;27893:7;27933:66;27926:5;27922:78;27911:89;;27901:105;;;:::o;28012:126::-;28049:7;28089:42;28082:5;28078:54;28067:65;;28057:81;;;:::o;28144:77::-;28181:7;28210:5;28199:16;;28189:32;;;:::o;28227:154::-;28311:6;28306:3;28301;28288:30;28373:1;28364:6;28359:3;28355:16;28348:27;28278:103;;;:::o;28387:307::-;28455:1;28465:113;28479:6;28476:1;28473:13;28465:113;;;28564:1;28559:3;28555:11;28549:18;28545:1;28540:3;28536:11;28529:39;28501:2;28498:1;28494:10;28489:15;;28465:113;;;28596:6;28593:1;28590:13;28587:2;;;28676:1;28667:6;28662:3;28658:16;28651:27;28587:2;28436:258;;;;:::o;28700:320::-;28744:6;28781:1;28775:4;28771:12;28761:22;;28828:1;28822:4;28818:12;28849:18;28839:2;;28905:4;28897:6;28893:17;28883:27;;28839:2;28967;28959:6;28956:14;28936:18;28933:38;28930:2;;;28986:18;;:::i;:::-;28930:2;28751:269;;;;:::o;29026:281::-;29109:27;29131:4;29109:27;:::i;:::-;29101:6;29097:40;29239:6;29227:10;29224:22;29203:18;29191:10;29188:34;29185:62;29182:2;;;29250:18;;:::i;:::-;29182:2;29290:10;29286:2;29279:22;29069:238;;;:::o;29313:233::-;29352:3;29375:24;29393:5;29375:24;:::i;:::-;29366:33;;29421:66;29414:5;29411:77;29408:2;;;29491:18;;:::i;:::-;29408:2;29538:1;29531:5;29527:13;29520:20;;29356:190;;;:::o;29552:176::-;29584:1;29601:20;29619:1;29601:20;:::i;:::-;29596:25;;29635:20;29653:1;29635:20;:::i;:::-;29630:25;;29674:1;29664:2;;29679:18;;:::i;:::-;29664:2;29720:1;29717;29713:9;29708:14;;29586:142;;;;:::o;29734:180::-;29782:77;29779:1;29772:88;29879:4;29876:1;29869:15;29903:4;29900:1;29893:15;29920:180;29968:77;29965:1;29958:88;30065:4;30062:1;30055:15;30089:4;30086:1;30079:15;30106:180;30154:77;30151:1;30144:88;30251:4;30248:1;30241:15;30275:4;30272:1;30265:15;30292:180;30340:77;30337:1;30330:88;30437:4;30434:1;30427:15;30461:4;30458:1;30451:15;30478:102;30519:6;30570:2;30566:7;30561:2;30554:5;30550:14;30546:28;30536:38;;30526:54;;;:::o;30586:230::-;30726:34;30722:1;30714:6;30710:14;30703:58;30795:13;30790:2;30782:6;30778:15;30771:38;30692:124;:::o;30822:237::-;30962:34;30958:1;30950:6;30946:14;30939:58;31031:20;31026:2;31018:6;31014:15;31007:45;30928:131;:::o;31065:225::-;31205:34;31201:1;31193:6;31189:14;31182:58;31274:8;31269:2;31261:6;31257:15;31250:33;31171:119;:::o;31296:182::-;31436:34;31432:1;31424:6;31420:14;31413:58;31402:76;:::o;31484:224::-;31624:34;31620:1;31612:6;31608:14;31601:58;31693:7;31688:2;31680:6;31676:15;31669:32;31590:118;:::o;31714:178::-;31854:30;31850:1;31842:6;31838:14;31831:54;31820:72;:::o;31898:223::-;32038:34;32034:1;32026:6;32022:14;32015:58;32107:6;32102:2;32094:6;32090:15;32083:31;32004:117;:::o;32127:175::-;32267:27;32263:1;32255:6;32251:14;32244:51;32233:69;:::o;32308:181::-;32448:33;32444:1;32436:6;32432:14;32425:57;32414:75;:::o;32495:228::-;32635:34;32631:1;32623:6;32619:14;32612:58;32704:11;32699:2;32691:6;32687:15;32680:36;32601:122;:::o;32729:249::-;32869:34;32865:1;32857:6;32853:14;32846:58;32938:32;32933:2;32925:6;32921:15;32914:57;32835:143;:::o;32984:182::-;33124:34;33120:1;33112:6;33108:14;33101:58;33090:76;:::o;33172:182::-;33312:34;33308:1;33300:6;33296:14;33289:58;33278:76;:::o;33360:174::-;33500:26;33496:1;33488:6;33484:14;33477:50;33466:68;:::o;33540:221::-;33680:34;33676:1;33668:6;33664:14;33657:58;33749:4;33744:2;33736:6;33732:15;33725:29;33646:115;:::o;33767:220::-;33907:34;33903:1;33895:6;33891:14;33884:58;33976:3;33971:2;33963:6;33959:15;33952:28;33873:114;:::o;33993:177::-;34133:29;34129:1;34121:6;34117:14;34110:53;34099:71;:::o;34176:231::-;34316:34;34312:1;34304:6;34300:14;34293:58;34385:14;34380:2;34372:6;34368:15;34361:39;34282:125;:::o;34413:233::-;34553:34;34549:1;34541:6;34537:14;34530:58;34622:16;34617:2;34609:6;34605:15;34598:41;34519:127;:::o;34652:122::-;34725:24;34743:5;34725:24;:::i;:::-;34718:5;34715:35;34705:2;;34764:1;34761;34754:12;34705:2;34695:79;:::o;34780:116::-;34850:21;34865:5;34850:21;:::i;:::-;34843:5;34840:32;34830:2;;34886:1;34883;34876:12;34830:2;34820:76;:::o;34902:120::-;34974:23;34991:5;34974:23;:::i;:::-;34967:5;34964:34;34954:2;;35012:1;35009;35002:12;34954:2;34944:78;:::o;35028:122::-;35101:24;35119:5;35101:24;:::i;:::-;35094:5;35091:35;35081:2;;35140:1;35137;35130:12;35081:2;35071:79;:::o
Swarm Source
ipfs://1371a64c1069dede04b630a689acc0ea0e9a1237adb466e90875af1cbd8bacd0
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.