Contract Overview
Balance:
0 CELO
CELO Value:
$0.00
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x7f49eb83c5a08fb0044bcf2f2408b77f3477b161b4cc5e766f99b033a0a20227 | Claim Celo | 18237214 | 12 days 18 hrs ago | 0xa2c13447ea3578b9ee821aaf78f5560bc5a281dd | IN | 0xd043bd10d88cfc2d11cdd0e2e28f8994ca69a3db | 0 CELO | 0.000175002 | |
0x32da8f6504bf445ea8afd09a4a7826bcc064020518f981b1bcbd75e91b616b3f | Mint | 18237193 | 12 days 18 hrs ago | 0xa2c13447ea3578b9ee821aaf78f5560bc5a281dd | IN | 0xd043bd10d88cfc2d11cdd0e2e28f8994ca69a3db | 5 CELO | 0.004614725 | |
0xb3f65064545977cd6f43785934dccc694d25e5ea366373c902d59cbada254480 | Transfer Ownersh... | 18236787 | 12 days 19 hrs ago | 0x669362780f9a8fce9f5aad34e64f96a01e902bd3 | IN | 0xd043bd10d88cfc2d11cdd0e2e28f8994ca69a3db | 0 CELO | 0.000725575 | |
0x82c1b33aee2bc9d6352fcadfa34aa1de10eb4ab7d420fad4c9603d58f4cd559e | 0x60c06040 | 18236786 | 12 days 19 hrs ago | 0x669362780f9a8fce9f5aad34e64f96a01e902bd3 | IN | Create: ChatNFT | 0 CELO | 0.087750725 |
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x7f49eb83c5a08fb0044bcf2f2408b77f3477b161b4cc5e766f99b033a0a20227 | 18237214 | 12 days 18 hrs ago | 0xd043bd10d88cfc2d11cdd0e2e28f8994ca69a3db | 0xa2c13447ea3578b9ee821aaf78f5560bc5a281dd | 5 CELO |
[ Download CSV Export ]
Contract Name:
ChatNFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at celoscan.io on 2023-03-15 */ // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // 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/[email protected] // 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/utils/introspection/[email protected] // 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/token/ERC721/[email protected] // 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/[email protected] // 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/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (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/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (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/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // File contracts/ChatNFT.sol pragma solidity ^0.8.0; contract ChatNFT is ERC721, Ownable { using Strings for uint256; bytes32 public immutable MINT_TYPEHASH = keccak256("Mint(address beneficiary,string tokenUri)"); bytes32 public immutable DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes("Mint")), keccak256(bytes("1")), getChainID(), address(this) ) ); bool public mintingOpen = true; uint256 public maxSupply = 10000; uint256 public mintPrice = 5 ether; uint256 private _tokenIds; mapping(uint256 => string) private _tokenUris; mapping(string => bool) private _usedTokenUris; address private _nftSigner; modifier whenMintingOpen() { require(mintingOpen, "Minting not open"); _; } constructor(address nftSigner) ERC721("Chat NFTs", "CHATNFT") { _nftSigner = nftSigner; } function setNftSigner(address nftSigner) external onlyOwner { _nftSigner = nftSigner; } function setMintPrice(uint256 price) external onlyOwner { mintPrice = price; } function setMaxSupply(uint256 newMaxSupply) external onlyOwner { maxSupply = newMaxSupply; } function tokenURI( uint256 tokenId ) public view virtual override returns (string memory) { bytes memory dataURI = abi.encodePacked( '{"name": "ChatNFT", "image": "', _tokenUris[tokenId], '"}' ); return string( abi.encodePacked( "data:application/json;base64,", Base64.encode(dataURI) ) ); } function startMintingOpen() external onlyOwner { require(!mintingOpen, "Minting already open"); mintingOpen = true; } function pauseMintingOpen() external onlyOwner whenMintingOpen { mintingOpen = false; } function mint( string memory tokenUri, uint8 v, bytes32 r, bytes32 s ) external payable whenMintingOpen { require(_tokenIds + 1 <= maxSupply, "Minting would exceed max supply"); require(mintPrice == msg.value, "Celo value sent is not correct"); require(!_usedTokenUris[tokenUri], "NFT already minted"); verifySig(msg.sender, tokenUri, v, r, s); _usedTokenUris[tokenUri] = true; _mint(msg.sender, _tokenIds); _tokenUris[_tokenIds] = tokenUri; _tokenIds += 1; } function mintTo( string memory tokenUri, address toAddress ) external onlyOwner { require(_tokenIds + 1 <= maxSupply, "Minting would exceed max supply"); require(!_usedTokenUris[tokenUri], "NFT already minted"); _usedTokenUris[tokenUri] = true; _mint(toAddress, _tokenIds); _tokenUris[_tokenIds] = tokenUri; _tokenIds += 1; } function verifySig( address beneficiary, string memory tokenUri, uint8 v, bytes32 r, bytes32 s ) internal view { bytes32 hashStruct = keccak256( abi.encode(MINT_TYPEHASH, beneficiary, keccak256(bytes(tokenUri))) ); bytes32 digest = keccak256( abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct) ); address signer = ecrecover(digest, v, r, s); require(signer == _nftSigner, "Invalid signature"); } function getChainID() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } function claimCelo() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } // The owner will be able to call any arbitrary function using this function. // Main use case is getting funds out of this contract, even if someone sends ERC20s or NFTs by mistake. // Can be made more explicit / less generic if necessary. function exec( address target, uint256 value, bytes calldata data ) external onlyOwner { (bool success, bytes memory reason) = target.call{value: value}(data); require(success, string(reason)); } }
[{"inputs":[{"internalType":"address","name":"nftSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimCelo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"exec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenUri","type":"string"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenUri","type":"string"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMintingOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftSigner","type":"address"}],"name":"setNftSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMintingOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040527f47b43c1cc82cc80e920bb705ced877aaf7a320289eaadf37c75573c26115b0636080908152507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600481526020017f4d696e7400000000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525080519060200120620000d66200027160201b60201c565b30604051602001620000ed95949392919062000472565b6040516020818303038152906040528051906020012060a0908152506001600660146101000a81548160ff021916908315150217905550612710600755674563918244f400006008553480156200014357600080fd5b50604051620041ea380380620041ea833981810160405281019062000169919062000413565b6040518060400160405280600981526020017f43686174204e46547300000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f434841544e4654000000000000000000000000000000000000000000000000008152508160009080519060200190620001ed9291906200034c565b508060019080519060200190620002069291906200034c565b505050620002296200021d6200027e60201b60201c565b6200028660201b60201c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000596565b6000804690508091505090565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200035a9062000517565b90600052602060002090601f0160209004810192826200037e5760008555620003ca565b82601f106200039957805160ff1916838001178555620003ca565b82800160010185558215620003ca579182015b82811115620003c9578251825591602001919060010190620003ac565b5b509050620003d99190620003dd565b5090565b5b80821115620003f8576000816000905550600101620003de565b5090565b6000815190506200040d816200057c565b92915050565b6000602082840312156200042657600080fd5b60006200043684828501620003fc565b91505092915050565b6200044a81620004cf565b82525050565b6200045b81620004e3565b82525050565b6200046c816200050d565b82525050565b600060a08201905062000489600083018862000450565b62000498602083018762000450565b620004a7604083018662000450565b620004b6606083018562000461565b620004c560808301846200043f565b9695505050505050565b6000620004dc82620004ed565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200053057607f821691505b602082108114156200054757620005466200054d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200058781620004cf565b81146200059357600080fd5b50565b60805160a051613c20620005ca60003960008181610d64015261170001526000818161133b01526116a70152613c206000f3fe6080604052600436106101d85760003560e01c806370a0823111610102578063b88d4fde11610095578063f2fde38b11610064578063f2fde38b14610663578063f4a0a5281461068c578063f76fc35e146106b5578063fe42a2d9146106e0576101d8565b8063b88d4fde14610595578063c87b56dd146105be578063d5abeb01146105fb578063e985e9c514610626576101d8565b80638f4bb497116100d15780638f4bb497146104ed57806395d89b41146105185780639842625b14610543578063a22cb4651461056c576101d8565b806370a0823114610457578063715018a6146104945780638a0ffff9146104ab5780638da5cb5b146104c2576101d8565b806327092c021161017a57806359ca0ccb1161014957806359ca0ccb146103af5780636352211e146103c65780636817c76c146104035780636f8b44b01461042e576101d8565b806327092c02146103195780633644e5151461033057806342842e0e1461035b578063564b81ef14610384576101d8565b8063081812fc116101b6578063081812fc1461026e578063095ea7b3146102ab578063194f52ac146102d457806323b872dd146102f0576101d8565b806301ffc9a7146101dd5780630565bb671461021a57806306fdde0314610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906127b9565b610709565b6040516102119190612ee8565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c919061274d565b6107eb565b005b34801561024f57600080fd5b506102586108b1565b6040516102659190612f9a565b60405180910390f35b34801561027a57600080fd5b50610295600480360381019061029091906128da565b610943565b6040516102a29190612e81565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190612711565b610989565b005b6102ee60048036038101906102e9919061285f565b610aa1565b005b3480156102fc57600080fd5b506103176004803603810190610312919061260b565b610c8d565b005b34801561032557600080fd5b5061032e610ced565b005b34801561033c57600080fd5b50610345610d62565b6040516103529190612f03565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d919061260b565b610d86565b005b34801561039057600080fd5b50610399610da6565b6040516103a6919061321c565b60405180910390f35b3480156103bb57600080fd5b506103c4610db3565b005b3480156103d257600080fd5b506103ed60048036038101906103e891906128da565b610e27565b6040516103fa9190612e81565b60405180910390f35b34801561040f57600080fd5b50610418610ed9565b604051610425919061321c565b60405180910390f35b34801561043a57600080fd5b50610455600480360381019061045091906128da565b610edf565b005b34801561046357600080fd5b5061047e600480360381019061047991906125a6565b610ef1565b60405161048b919061321c565b60405180910390f35b3480156104a057600080fd5b506104a9610fa9565b005b3480156104b757600080fd5b506104c0610fbd565b005b3480156104ce57600080fd5b506104d761100e565b6040516104e49190612e81565b60405180910390f35b3480156104f957600080fd5b50610502611038565b60405161050f9190612ee8565b60405180910390f35b34801561052457600080fd5b5061052d61104b565b60405161053a9190612f9a565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906125a6565b6110dd565b005b34801561057857600080fd5b50610593600480360381019061058e91906126d5565b611129565b005b3480156105a157600080fd5b506105bc60048036038101906105b7919061265a565b61113f565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906128da565b6111a1565b6040516105f29190612f9a565b60405180910390f35b34801561060757600080fd5b50610610611209565b60405161061d919061321c565b60405180910390f35b34801561063257600080fd5b5061064d600480360381019061064891906125cf565b61120f565b60405161065a9190612ee8565b60405180910390f35b34801561066f57600080fd5b5061068a600480360381019061068591906125a6565b6112a3565b005b34801561069857600080fd5b506106b360048036038101906106ae91906128da565b611327565b005b3480156106c157600080fd5b506106ca611339565b6040516106d79190612f03565b60405180910390f35b3480156106ec57600080fd5b506107076004803603810190610702919061280b565b61135d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107d457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e457506107e3826114af565b5b9050919050565b6107f3611519565b6000808573ffffffffffffffffffffffffffffffffffffffff1685858560405161081e929190612dc5565b60006040518083038185875af1925050503d806000811461085b576040519150601f19603f3d011682016040523d82523d6000602084013e610860565b606091505b50915091508181906108a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089f9190612f9a565b60405180910390fd5b50505050505050565b6060600080546108c090613511565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec90613511565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600061094e82611597565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099482610e27565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc9061319c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a246115e2565b73ffffffffffffffffffffffffffffffffffffffff161480610a535750610a5281610a4d6115e2565b61120f565b5b610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a899061311c565b60405180910390fd5b610a9c83836115ea565b505050565b600660149054906101000a900460ff16610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906131fc565b60405180910390fd5b6007546001600954610b029190613321565b1115610b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a906130fc565b60405180910390fd5b3460085414610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e9061303c565b60405180910390fd5b600b84604051610b979190612dde565b908152602001604051809103902060009054906101000a900460ff1615610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea9061307c565b60405180910390fd5b610c0033858585856116a3565b6001600b85604051610c129190612dde565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610c4333600954611837565b83600a600060095481526020019081526020016000209080519060200190610c6c929190612356565b50600160096000828254610c809190613321565b9250508190555050505050565b610c9e610c986115e2565b82611a11565b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd4906131dc565b60405180910390fd5b610ce8838383611aa6565b505050565b610cf5611519565b600660149054906101000a900460ff1615610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c906131bc565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610da18383836040518060200160405280600081525061113f565b505050565b6000804690508091505090565b610dbb611519565b600660149054906101000a900460ff16610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e01906131fc565b60405180910390fd5b6000600660146101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec79061317c565b60405180910390fd5b80915050919050565b60085481565b610ee7611519565b8060078190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f59906130dc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fb1611519565b610fbb6000611d0d565b565b610fc5611519565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561100b573d6000803e3d6000fd5b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600660149054906101000a900460ff1681565b60606001805461105a90613511565b80601f016020809104026020016040519081016040528092919081815260200182805461108690613511565b80156110d35780601f106110a8576101008083540402835291602001916110d3565b820191906000526020600020905b8154815290600101906020018083116110b657829003601f168201915b5050505050905090565b6110e5611519565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61113b6111346115e2565b8383611dd3565b5050565b61115061114a6115e2565b83611a11565b61118f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611186906131dc565b60405180910390fd5b61119b84848484611f40565b50505050565b60606000600a60008481526020019081526020016000206040516020016111c89190612df5565b60405160208183030381529060405290506111e281611f9c565b6040516020016111f29190612e22565b604051602081830303815290604052915050919050565b60075481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112ab611519565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290612fdc565b60405180910390fd5b61132481611d0d565b50565b61132f611519565b8060088190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611365611519565b60075460016009546113779190613321565b11156113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af906130fc565b60405180910390fd5b600b826040516113c89190612dde565b908152602001604051809103902060009054906101000a900460ff1615611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b9061307c565b60405180910390fd5b6001600b836040516114369190612dde565b908152602001604051809103902060006101000a81548160ff02191690831515021790555061146781600954611837565b81600a600060095481526020019081526020016000209080519060200190611490929190612356565b506001600960008282546114a49190613321565b925050819055505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6115216115e2565b73ffffffffffffffffffffffffffffffffffffffff1661153f61100e565b73ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c9061315c565b60405180910390fd5b565b6115a081612126565b6115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d69061317c565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661165d83610e27565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60007f00000000000000000000000000000000000000000000000000000000000000008686805190602001206040516020016116e193929190612f1e565b60405160208183030381529060405280519060200120905060006119017f00000000000000000000000000000000000000000000000000000000000000008360405160200161173293929190612e44565b60405160208183030381529060405280519060200120905060006001828787876040516000815260200160405260405161176f9493929190612f55565b6020604051602081039080840390855afa158015611791573d6000803e3d6000fd5b505050602060405103519050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461182d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611824906130bc565b60405180910390fd5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e9061313c565b60405180910390fd5b6118b081612126565b156118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e79061301c565b60405180910390fd5b6118fc60008383612192565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461194c9190613321565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a0d60008383612197565b5050565b600080611a1d83610e27565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a5f5750611a5e818561120f565b5b80611a9d57508373ffffffffffffffffffffffffffffffffffffffff16611a8584610943565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ac682610e27565b73ffffffffffffffffffffffffffffffffffffffff1614611b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1390612ffc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b839061305c565b60405180910390fd5b611b97838383612192565b611ba26000826115ea565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf29190613402565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c499190613321565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d08838383612197565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e399061309c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f339190612ee8565b60405180910390a3505050565b611f4b848484611aa6565b611f578484848461219c565b611f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8d90612fbc565b60405180910390fd5b50505050565b6060600082511415611fbf57604051806020016040528060008152509050612121565b6000604051806060016040528060408152602001613bab6040913990506000600360028551611fee9190613321565b611ff89190613377565b600461200491906133a8565b67ffffffffffffffff811115612043577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120755781602001600182028036833780820191505090505b509050600182016020820185865187015b808210156120e1576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612086565b50506003865106600181146120fd576002811461211057612118565b603d6001830353603d6002830353612118565b603d60018303535b50505080925050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b60006121bd8473ffffffffffffffffffffffffffffffffffffffff16612333565b15612326578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121e66115e2565b8786866040518563ffffffff1660e01b81526004016122089493929190612e9c565b602060405180830381600087803b15801561222257600080fd5b505af192505050801561225357506040513d601f19601f8201168201806040525081019061225091906127e2565b60015b6122d6573d8060008114612283576040519150601f19603f3d011682016040523d82523d6000602084013e612288565b606091505b506000815114156122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590612fbc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061232b565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461236290613511565b90600052602060002090601f01602090048101928261238457600085556123cb565b82601f1061239d57805160ff19168380011785556123cb565b828001600101855582156123cb579182015b828111156123ca5782518255916020019190600101906123af565b5b5090506123d891906123dc565b5090565b5b808211156123f55760008160009055506001016123dd565b5090565b600061240c6124078461325c565b613237565b90508281526020810184848401111561242457600080fd5b61242f8482856134cf565b509392505050565b600061244a6124458461328d565b613237565b90508281526020810184848401111561246257600080fd5b61246d8482856134cf565b509392505050565b60008135905061248481613b20565b92915050565b60008135905061249981613b37565b92915050565b6000813590506124ae81613b4e565b92915050565b6000813590506124c381613b65565b92915050565b6000815190506124d881613b65565b92915050565b60008083601f8401126124f057600080fd5b8235905067ffffffffffffffff81111561250957600080fd5b60208301915083600182028301111561252157600080fd5b9250929050565b600082601f83011261253957600080fd5b81356125498482602086016123f9565b91505092915050565b600082601f83011261256357600080fd5b8135612573848260208601612437565b91505092915050565b60008135905061258b81613b7c565b92915050565b6000813590506125a081613b93565b92915050565b6000602082840312156125b857600080fd5b60006125c684828501612475565b91505092915050565b600080604083850312156125e257600080fd5b60006125f085828601612475565b925050602061260185828601612475565b9150509250929050565b60008060006060848603121561262057600080fd5b600061262e86828701612475565b935050602061263f86828701612475565b92505060406126508682870161257c565b9150509250925092565b6000806000806080858703121561267057600080fd5b600061267e87828801612475565b945050602061268f87828801612475565b93505060406126a08782880161257c565b925050606085013567ffffffffffffffff8111156126bd57600080fd5b6126c987828801612528565b91505092959194509250565b600080604083850312156126e857600080fd5b60006126f685828601612475565b92505060206127078582860161248a565b9150509250929050565b6000806040838503121561272457600080fd5b600061273285828601612475565b92505060206127438582860161257c565b9150509250929050565b6000806000806060858703121561276357600080fd5b600061277187828801612475565b94505060206127828782880161257c565b935050604085013567ffffffffffffffff81111561279f57600080fd5b6127ab878288016124de565b925092505092959194509250565b6000602082840312156127cb57600080fd5b60006127d9848285016124b4565b91505092915050565b6000602082840312156127f457600080fd5b6000612802848285016124c9565b91505092915050565b6000806040838503121561281e57600080fd5b600083013567ffffffffffffffff81111561283857600080fd5b61284485828601612552565b925050602061285585828601612475565b9150509250929050565b6000806000806080858703121561287557600080fd5b600085013567ffffffffffffffff81111561288f57600080fd5b61289b87828801612552565b94505060206128ac87828801612591565b93505060406128bd8782880161249f565b92505060606128ce8782880161249f565b91505092959194509250565b6000602082840312156128ec57600080fd5b60006128fa8482850161257c565b91505092915050565b61290c81613436565b82525050565b61291b81613448565b82525050565b61292a81613454565b82525050565b61294161293c82613454565b613574565b82525050565b600061295383856132fa565b93506129608385846134cf565b82840190509392505050565b6000612977826132d3565b61298181856132e9565b93506129918185602086016134de565b61299a8161364c565b840191505092915050565b60006129b0826132de565b6129ba8185613305565b93506129ca8185602086016134de565b6129d38161364c565b840191505092915050565b60006129e9826132de565b6129f38185613316565b9350612a038185602086016134de565b80840191505092915050565b60008154612a1c81613511565b612a268186613316565b94506001821660008114612a415760018114612a5257612a85565b60ff19831686528186019350612a85565b612a5b856132be565b60005b83811015612a7d57815481890152600182019150602081019050612a5e565b838801955050505b50505092915050565b6000612a9b603283613305565b9150612aa68261366a565b604082019050919050565b6000612abe602683613305565b9150612ac9826136b9565b604082019050919050565b6000612ae1602583613305565b9150612aec82613708565b604082019050919050565b6000612b04601c83613305565b9150612b0f82613757565b602082019050919050565b6000612b27601e83613305565b9150612b3282613780565b602082019050919050565b6000612b4a602483613305565b9150612b55826137a9565b604082019050919050565b6000612b6d601283613305565b9150612b78826137f8565b602082019050919050565b6000612b90601983613305565b9150612b9b82613821565b602082019050919050565b6000612bb3601e83613316565b9150612bbe8261384a565b601e82019050919050565b6000612bd6601183613305565b9150612be182613873565b602082019050919050565b6000612bf9602983613305565b9150612c048261389c565b604082019050919050565b6000612c1c601f83613305565b9150612c27826138eb565b602082019050919050565b6000612c3f600283613316565b9150612c4a82613914565b600282019050919050565b6000612c62603e83613305565b9150612c6d8261393d565b604082019050919050565b6000612c85602083613305565b9150612c908261398c565b602082019050919050565b6000612ca8602083613305565b9150612cb3826139b5565b602082019050919050565b6000612ccb601883613305565b9150612cd6826139de565b602082019050919050565b6000612cee602183613305565b9150612cf982613a07565b604082019050919050565b6000612d11601d83613316565b9150612d1c82613a56565b601d82019050919050565b6000612d34601483613305565b9150612d3f82613a7f565b602082019050919050565b6000612d57602e83613305565b9150612d6282613aa8565b604082019050919050565b6000612d7a601083613305565b9150612d8582613af7565b602082019050919050565b612da1612d9c8261348a565b61357e565b82525050565b612db0816134b8565b82525050565b612dbf816134c2565b82525050565b6000612dd2828486612947565b91508190509392505050565b6000612dea82846129de565b915081905092915050565b6000612e0082612ba6565b9150612e0c8284612a0f565b9150612e1782612c32565b915081905092915050565b6000612e2d82612d04565b9150612e3982846129de565b915081905092915050565b6000612e508286612d90565b600282019150612e608285612930565b602082019150612e708284612930565b602082019150819050949350505050565b6000602082019050612e966000830184612903565b92915050565b6000608082019050612eb16000830187612903565b612ebe6020830186612903565b612ecb6040830185612da7565b8181036060830152612edd818461296c565b905095945050505050565b6000602082019050612efd6000830184612912565b92915050565b6000602082019050612f186000830184612921565b92915050565b6000606082019050612f336000830186612921565b612f406020830185612903565b612f4d6040830184612921565b949350505050565b6000608082019050612f6a6000830187612921565b612f776020830186612db6565b612f846040830185612921565b612f916060830184612921565b95945050505050565b60006020820190508181036000830152612fb481846129a5565b905092915050565b60006020820190508181036000830152612fd581612a8e565b9050919050565b60006020820190508181036000830152612ff581612ab1565b9050919050565b6000602082019050818103600083015261301581612ad4565b9050919050565b6000602082019050818103600083015261303581612af7565b9050919050565b6000602082019050818103600083015261305581612b1a565b9050919050565b6000602082019050818103600083015261307581612b3d565b9050919050565b6000602082019050818103600083015261309581612b60565b9050919050565b600060208201905081810360008301526130b581612b83565b9050919050565b600060208201905081810360008301526130d581612bc9565b9050919050565b600060208201905081810360008301526130f581612bec565b9050919050565b6000602082019050818103600083015261311581612c0f565b9050919050565b6000602082019050818103600083015261313581612c55565b9050919050565b6000602082019050818103600083015261315581612c78565b9050919050565b6000602082019050818103600083015261317581612c9b565b9050919050565b6000602082019050818103600083015261319581612cbe565b9050919050565b600060208201905081810360008301526131b581612ce1565b9050919050565b600060208201905081810360008301526131d581612d27565b9050919050565b600060208201905081810360008301526131f581612d4a565b9050919050565b6000602082019050818103600083015261321581612d6d565b9050919050565b60006020820190506132316000830184612da7565b92915050565b6000613241613252565b905061324d8282613543565b919050565b6000604051905090565b600067ffffffffffffffff8211156132775761327661361d565b5b6132808261364c565b9050602081019050919050565b600067ffffffffffffffff8211156132a8576132a761361d565b5b6132b18261364c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061332c826134b8565b9150613337836134b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561336c5761336b613590565b5b828201905092915050565b6000613382826134b8565b915061338d836134b8565b92508261339d5761339c6135bf565b5b828204905092915050565b60006133b3826134b8565b91506133be836134b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133f7576133f6613590565b5b828202905092915050565b600061340d826134b8565b9150613418836134b8565b92508282101561342b5761342a613590565b5b828203905092915050565b600061344182613498565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156134fc5780820151818401526020810190506134e1565b8381111561350b576000848401525b50505050565b6000600282049050600182168061352957607f821691505b6020821081141561353d5761353c6135ee565b5b50919050565b61354c8261364c565b810181811067ffffffffffffffff8211171561356b5761356a61361d565b5b80604052505050565b6000819050919050565b60006135898261365d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43656c6f2076616c75652073656e74206973206e6f7420636f72726563740000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4e465420616c7265616479206d696e7465640000000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b226e616d65223a2022436861744e4654222c2022696d616765223a20220000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4d696e74696e6720616c7265616479206f70656e000000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f74206f70656e00000000000000000000000000000000600082015250565b613b2981613436565b8114613b3457600080fd5b50565b613b4081613448565b8114613b4b57600080fd5b50565b613b5781613454565b8114613b6257600080fd5b50565b613b6e8161345e565b8114613b7957600080fd5b50565b613b85816134b8565b8114613b9057600080fd5b50565b613b9c816134c2565b8114613ba757600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212209af48bdb20e8eb471fbc986199f7c4d65d9f6a6cb22ae5c4e18c60cc384be6d564736f6c634300080400330000000000000000000000004f3d410e301e1170833cda37860f6d54e2fdf8f1
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004f3d410e301e1170833cda37860f6d54e2fdf8f1
-----Decoded View---------------
Arg [0] : nftSigner (address): 0x4f3d410e301e1170833cda37860f6d54e2fdf8f1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004f3d410e301e1170833cda37860f6d54e2fdf8f1
Deployed ByteCode Sourcemap
41726:4548:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24820:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46021:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25747:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27260:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26777:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43920:581;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27960:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43663:140;;;;;;;;;;;;;:::i;:::-;;41914:413;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28367:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45478:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43811:101;;;;;;;;;;;;;:::i;:::-;;25458:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42416:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43063:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25189:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2819:103;;;;;;;;;;;;;:::i;:::-;;45647:110;;;;;;;;;;;;;:::i;:::-;;2171:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42336:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25916:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42854:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27503:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28623:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43177:478;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42375:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27729:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3077:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42963:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41803:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44509:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24820:305;24922:4;24974:25;24959:40;;;:11;:40;;;;:105;;;;25031:33;25016:48;;;:11;:48;;;;24959:105;:158;;;;25081:36;25105:11;25081:23;:36::i;:::-;24959:158;24939:178;;24820:305;;;:::o;46021:250::-;2057:13;:11;:13::i;:::-;46152:12:::1;46166:19:::0;46189:6:::1;:11;;46208:5;46215:4;;46189:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46151:69;;;;46239:7;46255:6;46231:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2081:1;;46021:250:::0;;;;:::o;25747:100::-;25801:13;25834:5;25827:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25747:100;:::o;27260:171::-;27336:7;27356:23;27371:7;27356:14;:23::i;:::-;27399:15;:24;27415:7;27399:24;;;;;;;;;;;;;;;;;;;;;27392:31;;27260:171;;;:::o;26777:417::-;26858:13;26874:23;26889:7;26874:14;:23::i;:::-;26858:39;;26922:5;26916:11;;:2;:11;;;;26908:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27016:5;27000:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27025:37;27042:5;27049:12;:10;:12::i;:::-;27025:16;:37::i;:::-;27000:62;26978:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;27165:21;27174:2;27178:7;27165:8;:21::i;:::-;26777:417;;;:::o;43920:581::-;42683:11;;;;;;;;;;;42675:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;44101:9:::1;;44096:1;44084:9;;:13;;;;:::i;:::-;:26;;44076:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;44178:9;44165;;:22;44157:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44242:14;44257:8;44242:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;44241:25;44233:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44302:40;44312:10;44324:8;44334:1;44337;44340;44302:9;:40::i;:::-;44382:4;44355:14;44370:8;44355:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;44397:28;44403:10;44415:9;;44397:5;:28::i;:::-;44460:8;44436:10;:21;44447:9;;44436:21;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;44492:1;44479:9;;:14;;;;;;;:::i;:::-;;;;;;;;43920:581:::0;;;;:::o;27960:336::-;28155:41;28174:12;:10;:12::i;:::-;28188:7;28155:18;:41::i;:::-;28147:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;28260:28;28270:4;28276:2;28280:7;28260:9;:28::i;:::-;27960:336;;;:::o;43663:140::-;2057:13;:11;:13::i;:::-;43730:11:::1;;;;;;;;;;;43729:12;43721:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;43791:4;43777:11;;:18;;;;;;;;;;;;;;;;;;43663:140::o:0;41914:413::-;;;:::o;28367:185::-;28505:39;28522:4;28528:2;28532:7;28505:39;;;;;;;;;;;;:16;:39::i;:::-;28367:185;;;:::o;45478:161::-;45521:7;45541:10;45592:9;45586:15;;45629:2;45622:9;;;45478:161;:::o;43811:101::-;2057:13;:11;:13::i;:::-;42683:11:::1;;;;;;;;;;;42675:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;43899:5:::2;43885:11;;:19;;;;;;;;;;;;;;;;;;43811:101::o:0;25458:222::-;25530:7;25550:13;25566:7;:16;25574:7;25566:16;;;;;;;;;;;;;;;;;;;;;25550:32;;25618:1;25601:19;;:5;:19;;;;25593:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;25667:5;25660:12;;;25458:222;;;:::o;42416:34::-;;;;:::o;43063:106::-;2057:13;:11;:13::i;:::-;43149:12:::1;43137:9;:24;;;;43063:106:::0;:::o;25189:207::-;25261:7;25306:1;25289:19;;:5;:19;;;;25281:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25372:9;:16;25382:5;25372:16;;;;;;;;;;;;;;;;25365:23;;25189:207;;;:::o;2819:103::-;2057:13;:11;:13::i;:::-;2884:30:::1;2911:1;2884:18;:30::i;:::-;2819:103::o:0;45647:110::-;2057:13;:11;:13::i;:::-;45706:10:::1;45698:28;;:51;45727:21;45698:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45647:110::o:0;2171:87::-;2217:7;2244:6;;;;;;;;;;;2237:13;;2171:87;:::o;42336:30::-;;;;;;;;;;;;;:::o;25916:104::-;25972:13;26005:7;25998:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25916:104;:::o;42854:101::-;2057:13;:11;:13::i;:::-;42938:9:::1;42925:10;;:22;;;;;;;;;;;;;;;;;;42854:101:::0;:::o;27503:155::-;27598:52;27617:12;:10;:12::i;:::-;27631:8;27641;27598:18;:52::i;:::-;27503:155;;:::o;28623:323::-;28797:41;28816:12;:10;:12::i;:::-;28830:7;28797:18;:41::i;:::-;28789:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;28900:38;28914:4;28920:2;28924:7;28933:4;28900:13;:38::i;:::-;28623:323;;;;:::o;43177:478::-;43266:13;43292:20;43393:10;:19;43404:7;43393:19;;;;;;;;;;;43315:127;;;;;;;;:::i;:::-;;;;;;;;;;;;;43292:150;;43591:22;43605:7;43591:13;:22::i;:::-;43498:134;;;;;;;;:::i;:::-;;;;;;;;;;;;;43453:194;;;43177:478;;;:::o;42375:32::-;;;;:::o;27729:164::-;27826:4;27850:18;:25;27869:5;27850:25;;;;;;;;;;;;;;;:35;27876:8;27850:35;;;;;;;;;;;;;;;;;;;;;;;;;27843:42;;27729:164;;;;:::o;3077:201::-;2057:13;:11;:13::i;:::-;3186:1:::1;3166:22;;:8;:22;;;;3158:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3242:28;3261:8;3242:18;:28::i;:::-;3077:201:::0;:::o;42963:92::-;2057:13;:11;:13::i;:::-;43042:5:::1;43030:9;:17;;;;42963:92:::0;:::o;41803:104::-;;;:::o;44509:409::-;2057:13;:11;:13::i;:::-;44648:9:::1;;44643:1;44631:9;;:13;;;;:::i;:::-;:26;;44623:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;44713:14;44728:8;44713:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;44712:25;44704:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44800:4;44773:14;44788:8;44773:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;44815:27;44821:9;44832;;44815:5;:27::i;:::-;44877:8;44853:10;:21;44864:9;;44853:21;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;44909:1;44896:9;;:14;;;;;;;:::i;:::-;;;;;;;;44509:409:::0;;:::o;23245:157::-;23330:4;23369:25;23354:40;;;:11;:40;;;;23347:47;;23245:157;;;:::o;2336:132::-;2411:12;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2336:132::o;35235:135::-;35317:16;35325:7;35317;:16::i;:::-;35309:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;35235:135;:::o;718:98::-;771:7;798:10;791:17;;718:98;:::o;34514:174::-;34616:2;34589:15;:24;34605:7;34589:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34672:7;34668:2;34634:46;;34643:23;34658:7;34643:14;:23::i;:::-;34634:46;;;;;;;;;;;;34514:174;;:::o;44926:544::-;45098:18;45154:13;45169:11;45198:8;45182:26;;;;;;45143:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45119:101;;;;;;45098:122;;45231:14;45296:6;45305:16;45323:10;45272:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45248:97;;;;;;45231:114;;45358:14;45375:26;45385:6;45393:1;45396;45399;45375:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45358:43;;45430:10;;;;;;;;;;;45420:20;;:6;:20;;;45412:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;44926:544;;;;;;;;:::o;32345:439::-;32439:1;32425:16;;:2;:16;;;;32417:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32498:16;32506:7;32498;:16::i;:::-;32497:17;32489:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32560:45;32589:1;32593:2;32597:7;32560:20;:45::i;:::-;32635:1;32618:9;:13;32628:2;32618:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32666:2;32647:7;:16;32655:7;32647:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32711:7;32707:2;32686:33;;32703:1;32686:33;;;;;;;;;;;;32732:44;32760:1;32764:2;32768:7;32732:19;:44::i;:::-;32345:439;;:::o;30747:264::-;30840:4;30857:13;30873:23;30888:7;30873:14;:23::i;:::-;30857:39;;30926:5;30915:16;;:7;:16;;;:52;;;;30935:32;30952:5;30959:7;30935:16;:32::i;:::-;30915:52;:87;;;;30995:7;30971:31;;:20;30983:7;30971:11;:20::i;:::-;:31;;;30915:87;30907:96;;;30747:264;;;;:::o;33770:625::-;33929:4;33902:31;;:23;33917:7;33902:14;:23::i;:::-;:31;;;33894:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34008:1;33994:16;;:2;:16;;;;33986:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34064:39;34085:4;34091:2;34095:7;34064:20;:39::i;:::-;34168:29;34185:1;34189:7;34168:8;:29::i;:::-;34229:1;34210:9;:15;34220:4;34210:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34258:1;34241:9;:13;34251:2;34241:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34289:2;34270:7;:16;34278:7;34270:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34328:7;34324:2;34309:27;;34318:4;34309:27;;;;;;;;;;;;34349:38;34369:4;34375:2;34379:7;34349:19;:38::i;:::-;33770:625;;;:::o;3438:191::-;3512:16;3531:6;;;;;;;;;;;3512:25;;3557:8;3548:6;;:17;;;;;;;;;;;;;;;;;;3612:8;3581:40;;3602:8;3581:40;;;;;;;;;;;;3438:191;;:::o;34831:315::-;34986:8;34977:17;;:5;:17;;;;34969:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35073:8;35035:18;:25;35054:5;35035:25;;;;;;;;;;;;;;;:35;35061:8;35035:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35119:8;35097:41;;35112:5;35097:41;;;35129:8;35097:41;;;;;;:::i;:::-;;;;;;;;34831:315;;;:::o;29827:313::-;29983:28;29993:4;29999:2;30003:7;29983:9;:28::i;:::-;30030:47;30053:4;30059:2;30063:7;30072:4;30030:22;:47::i;:::-;30022:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29827:313;;;;:::o;38554:3097::-;38612:13;38864:1;38849:4;:11;:16;38845:31;;;38867:9;;;;;;;;;;;;;;;;38845:31;38929:19;38951:6;;;;;;;;;;;;;;;;;38929:28;;39368:20;39427:1;39422;39408:4;:11;:15;;;;:::i;:::-;39407:21;;;;:::i;:::-;39402:1;:27;;;;:::i;:::-;39391:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39368:62;;39610:1;39603:5;39599:13;39714:2;39706:6;39702:15;39825:4;39877;39871:11;39865:4;39861:22;39787:1432;39911:6;39902:7;39899:19;39787:1432;;;40017:1;40008:7;40004:15;39993:26;;40056:7;40050:14;40709:4;40701:5;40697:2;40693:14;40689:25;40679:8;40675:40;40669:47;40658:9;40650:67;40763:1;40752:9;40748:17;40735:30;;40855:4;40847:5;40843:2;40839:14;40835:25;40825:8;40821:40;40815:47;40804:9;40796:67;40909:1;40898:9;40894:17;40881:30;;41000:4;40992:5;40989:1;40985:13;40981:24;40971:8;40967:39;40961:46;40950:9;40942:66;41054:1;41043:9;41039:17;41026:30;;41137:4;41130:5;41126:16;41116:8;41112:31;41106:38;41095:9;41087:58;41191:1;41180:9;41176:17;41163:30;;39938:1281;39787:1432;;;39791:107;;41381:1;41374:4;41368:11;41364:19;41402:1;41397:123;;;;41539:1;41534:73;;;;41357:250;;41397:123;41450:4;41446:1;41435:9;41431:17;41423:32;41500:4;41496:1;41485:9;41481:17;41473:32;41397:123;;41534:73;41587:4;41583:1;41572:9;41568:17;41560:32;41357:250;;39496:2122;;41637:6;41630:13;;;;38554:3097;;;;:::o;30453:127::-;30518:4;30570:1;30542:30;;:7;:16;30550:7;30542:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30535:37;;30453:127;;;:::o;37359:126::-;;;;:::o;37870:125::-;;;;:::o;35934:853::-;36088:4;36109:15;:2;:13;;;:15::i;:::-;36105:675;;;36161:2;36145:36;;;36182:12;:10;:12::i;:::-;36196:4;36202:7;36211:4;36145:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36141:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36403:1;36386:6;:13;:18;36382:328;;;36429:60;;;;;;;;;;:::i;:::-;;;;;;;;36382:328;36660:6;36654:13;36645:6;36641:2;36637:15;36630:38;36141:584;36277:41;;;36267:51;;;:6;:51;;;;36260:58;;;;;36105:675;36764:4;36757:11;;35934:853;;;;;;;:::o;4875:326::-;4935:4;5192:1;5170:7;:19;;;:23;5163:30;;4875:326;;;:::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:139::-;1037:5;1075:6;1062:20;1053:29;;1091:33;1118:5;1091:33;:::i;:::-;1043:87;;;;:::o;1136:137::-;1181:5;1219:6;1206:20;1197:29;;1235:32;1261:5;1235:32;:::i;:::-;1187:86;;;;:::o;1279:141::-;1335:5;1366:6;1360:13;1351:22;;1382:32;1408:5;1382:32;:::i;:::-;1341:79;;;;:::o;1439:351::-;1496:8;1506:6;1556:3;1549:4;1541:6;1537:17;1533:27;1523:2;;1574:1;1571;1564:12;1523:2;1610:6;1597:20;1587:30;;1640:18;1632:6;1629:30;1626:2;;;1672:1;1669;1662:12;1626:2;1709:4;1701:6;1697:17;1685:29;;1763:3;1755:4;1747:6;1743:17;1733:8;1729:32;1726:41;1723:2;;;1780:1;1777;1770:12;1723:2;1513:277;;;;;:::o;1809:271::-;1864:5;1913:3;1906:4;1898:6;1894:17;1890:27;1880:2;;1931:1;1928;1921:12;1880:2;1971:6;1958:20;1996:78;2070:3;2062:6;2055:4;2047:6;2043:17;1996:78;:::i;:::-;1987:87;;1870:210;;;;;:::o;2100:273::-;2156:5;2205:3;2198:4;2190:6;2186:17;2182:27;2172:2;;2223:1;2220;2213:12;2172:2;2263:6;2250:20;2288:79;2363:3;2355:6;2348:4;2340:6;2336:17;2288:79;:::i;:::-;2279:88;;2162:211;;;;;:::o;2379:139::-;2425:5;2463:6;2450:20;2441:29;;2479:33;2506:5;2479:33;:::i;:::-;2431:87;;;;:::o;2524:135::-;2568:5;2606:6;2593:20;2584:29;;2622:31;2647:5;2622:31;:::i;:::-;2574:85;;;;:::o;2665:262::-;2724:6;2773:2;2761:9;2752:7;2748:23;2744:32;2741:2;;;2789:1;2786;2779:12;2741:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2731:196;;;;:::o;2933:407::-;3001:6;3009;3058:2;3046:9;3037:7;3033:23;3029:32;3026:2;;;3074:1;3071;3064:12;3026:2;3117:1;3142:53;3187:7;3178:6;3167:9;3163:22;3142:53;:::i;:::-;3132:63;;3088:117;3244:2;3270:53;3315:7;3306:6;3295:9;3291:22;3270:53;:::i;:::-;3260:63;;3215:118;3016:324;;;;;:::o;3346:552::-;3423:6;3431;3439;3488:2;3476:9;3467:7;3463:23;3459:32;3456:2;;;3504:1;3501;3494:12;3456:2;3547:1;3572:53;3617:7;3608:6;3597:9;3593:22;3572:53;:::i;:::-;3562:63;;3518:117;3674:2;3700:53;3745:7;3736:6;3725:9;3721:22;3700:53;:::i;:::-;3690:63;;3645:118;3802:2;3828:53;3873:7;3864:6;3853:9;3849:22;3828:53;:::i;:::-;3818:63;;3773:118;3446:452;;;;;:::o;3904:809::-;3999:6;4007;4015;4023;4072:3;4060:9;4051:7;4047:23;4043:33;4040:2;;;4089:1;4086;4079:12;4040:2;4132:1;4157:53;4202:7;4193:6;4182:9;4178:22;4157:53;:::i;:::-;4147:63;;4103:117;4259:2;4285:53;4330:7;4321:6;4310:9;4306:22;4285:53;:::i;:::-;4275:63;;4230:118;4387:2;4413:53;4458:7;4449:6;4438:9;4434:22;4413:53;:::i;:::-;4403:63;;4358:118;4543:2;4532:9;4528:18;4515:32;4574:18;4566:6;4563:30;4560:2;;;4606:1;4603;4596:12;4560:2;4634:62;4688:7;4679:6;4668:9;4664:22;4634:62;:::i;:::-;4624:72;;4486:220;4030:683;;;;;;;:::o;4719:401::-;4784:6;4792;4841:2;4829:9;4820:7;4816:23;4812:32;4809:2;;;4857:1;4854;4847:12;4809:2;4900:1;4925:53;4970:7;4961:6;4950:9;4946:22;4925:53;:::i;:::-;4915:63;;4871:117;5027:2;5053:50;5095:7;5086:6;5075:9;5071:22;5053:50;:::i;:::-;5043:60;;4998:115;4799:321;;;;;:::o;5126:407::-;5194:6;5202;5251:2;5239:9;5230:7;5226:23;5222:32;5219:2;;;5267:1;5264;5257:12;5219:2;5310:1;5335:53;5380:7;5371:6;5360:9;5356:22;5335:53;:::i;:::-;5325:63;;5281:117;5437:2;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5408:118;5209:324;;;;;:::o;5539:683::-;5627:6;5635;5643;5651;5700:2;5688:9;5679:7;5675:23;5671:32;5668:2;;;5716:1;5713;5706:12;5668:2;5759:1;5784:53;5829:7;5820:6;5809:9;5805:22;5784:53;:::i;:::-;5774:63;;5730:117;5886:2;5912:53;5957:7;5948:6;5937:9;5933:22;5912:53;:::i;:::-;5902:63;;5857:118;6042:2;6031:9;6027:18;6014:32;6073:18;6065:6;6062:30;6059:2;;;6105:1;6102;6095:12;6059:2;6141:64;6197:7;6188:6;6177:9;6173:22;6141:64;:::i;:::-;6123:82;;;;5985:230;5658:564;;;;;;;:::o;6228:260::-;6286:6;6335:2;6323:9;6314:7;6310:23;6306:32;6303:2;;;6351:1;6348;6341:12;6303:2;6394:1;6419:52;6463:7;6454:6;6443:9;6439:22;6419:52;:::i;:::-;6409:62;;6365:116;6293:195;;;;:::o;6494:282::-;6563:6;6612:2;6600:9;6591:7;6587:23;6583:32;6580:2;;;6628:1;6625;6618:12;6580:2;6671:1;6696:63;6751:7;6742:6;6731:9;6727:22;6696:63;:::i;:::-;6686:73;;6642:127;6570:206;;;;:::o;6782:520::-;6860:6;6868;6917:2;6905:9;6896:7;6892:23;6888:32;6885:2;;;6933:1;6930;6923:12;6885:2;7004:1;6993:9;6989:17;6976:31;7034:18;7026:6;7023:30;7020:2;;;7066:1;7063;7056:12;7020:2;7094:63;7149:7;7140:6;7129:9;7125:22;7094:63;:::i;:::-;7084:73;;6947:220;7206:2;7232:53;7277:7;7268:6;7257:9;7253:22;7232:53;:::i;:::-;7222:63;;7177:118;6875:427;;;;;:::o;7308:807::-;7402:6;7410;7418;7426;7475:3;7463:9;7454:7;7450:23;7446:33;7443:2;;;7492:1;7489;7482:12;7443:2;7563:1;7552:9;7548:17;7535:31;7593:18;7585:6;7582:30;7579:2;;;7625:1;7622;7615:12;7579:2;7653:63;7708:7;7699:6;7688:9;7684:22;7653:63;:::i;:::-;7643:73;;7506:220;7765:2;7791:51;7834:7;7825:6;7814:9;7810:22;7791:51;:::i;:::-;7781:61;;7736:116;7891:2;7917:53;7962:7;7953:6;7942:9;7938:22;7917:53;:::i;:::-;7907:63;;7862:118;8019:2;8045:53;8090:7;8081:6;8070:9;8066:22;8045:53;:::i;:::-;8035:63;;7990:118;7433:682;;;;;;;:::o;8121:262::-;8180:6;8229:2;8217:9;8208:7;8204:23;8200:32;8197:2;;;8245:1;8242;8235:12;8197:2;8288:1;8313:53;8358:7;8349:6;8338:9;8334:22;8313:53;:::i;:::-;8303:63;;8259:117;8187:196;;;;:::o;8389:118::-;8476:24;8494:5;8476:24;:::i;:::-;8471:3;8464:37;8454:53;;:::o;8513:109::-;8594:21;8609:5;8594:21;:::i;:::-;8589:3;8582:34;8572:50;;:::o;8628:118::-;8715:24;8733:5;8715:24;:::i;:::-;8710:3;8703:37;8693:53;;:::o;8752:157::-;8857:45;8877:24;8895:5;8877:24;:::i;:::-;8857:45;:::i;:::-;8852:3;8845:58;8835:74;;:::o;8937:314::-;9051:3;9072:88;9153:6;9148:3;9072:88;:::i;:::-;9065:95;;9170:43;9206:6;9201:3;9194:5;9170:43;:::i;:::-;9238:6;9233:3;9229:16;9222:23;;9055:196;;;;;:::o;9257:360::-;9343:3;9371:38;9403:5;9371:38;:::i;:::-;9425:70;9488:6;9483:3;9425:70;:::i;:::-;9418:77;;9504:52;9549:6;9544:3;9537:4;9530:5;9526:16;9504:52;:::i;:::-;9581:29;9603:6;9581:29;:::i;:::-;9576:3;9572:39;9565:46;;9347:270;;;;;:::o;9623:364::-;9711:3;9739:39;9772:5;9739:39;:::i;:::-;9794:71;9858:6;9853:3;9794:71;:::i;:::-;9787:78;;9874:52;9919:6;9914:3;9907:4;9900:5;9896:16;9874:52;:::i;:::-;9951:29;9973:6;9951:29;:::i;:::-;9946:3;9942:39;9935:46;;9715:272;;;;;:::o;9993:377::-;10099:3;10127:39;10160:5;10127:39;:::i;:::-;10182:89;10264:6;10259:3;10182:89;:::i;:::-;10175:96;;10280:52;10325:6;10320:3;10313:4;10306:5;10302:16;10280:52;:::i;:::-;10357:6;10352:3;10348:16;10341:23;;10103:267;;;;;:::o;10400:845::-;10503:3;10540:5;10534:12;10569:36;10595:9;10569:36;:::i;:::-;10621:89;10703:6;10698:3;10621:89;:::i;:::-;10614:96;;10741:1;10730:9;10726:17;10757:1;10752:137;;;;10903:1;10898:341;;;;10719:520;;10752:137;10836:4;10832:9;10821;10817:25;10812:3;10805:38;10872:6;10867:3;10863:16;10856:23;;10752:137;;10898:341;10965:38;10997:5;10965:38;:::i;:::-;11025:1;11039:154;11053:6;11050:1;11047:13;11039:154;;;11127:7;11121:14;11117:1;11112:3;11108:11;11101:35;11177:1;11168:7;11164:15;11153:26;;11075:4;11072:1;11068:12;11063:17;;11039:154;;;11222:6;11217:3;11213:16;11206:23;;10905:334;;10719:520;;10507:738;;;;;;:::o;11251:366::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11397:220;;;:::o;11623:366::-;11765:3;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11862:93;11951:3;11862:93;:::i;:::-;11980:2;11975:3;11971:12;11964:19;;11769:220;;;:::o;11995:366::-;12137:3;12158:67;12222:2;12217:3;12158:67;:::i;:::-;12151:74;;12234:93;12323:3;12234:93;:::i;:::-;12352:2;12347:3;12343:12;12336:19;;12141:220;;;:::o;12367:366::-;12509:3;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12606:93;12695:3;12606:93;:::i;:::-;12724:2;12719:3;12715:12;12708:19;;12513:220;;;:::o;12739:366::-;12881:3;12902:67;12966:2;12961:3;12902:67;:::i;:::-;12895:74;;12978:93;13067:3;12978:93;:::i;:::-;13096:2;13091:3;13087:12;13080:19;;12885:220;;;:::o;13111:366::-;13253:3;13274:67;13338:2;13333:3;13274:67;:::i;:::-;13267:74;;13350:93;13439:3;13350:93;:::i;:::-;13468:2;13463:3;13459:12;13452:19;;13257:220;;;:::o;13483:366::-;13625:3;13646:67;13710:2;13705:3;13646:67;:::i;:::-;13639:74;;13722:93;13811:3;13722:93;:::i;:::-;13840:2;13835:3;13831:12;13824:19;;13629:220;;;:::o;13855:366::-;13997:3;14018:67;14082:2;14077:3;14018:67;:::i;:::-;14011:74;;14094:93;14183:3;14094:93;:::i;:::-;14212:2;14207:3;14203:12;14196:19;;14001:220;;;:::o;14227:402::-;14387:3;14408:85;14490:2;14485:3;14408:85;:::i;:::-;14401:92;;14502:93;14591:3;14502:93;:::i;:::-;14620:2;14615:3;14611:12;14604:19;;14391:238;;;:::o;14635:366::-;14777:3;14798:67;14862:2;14857:3;14798:67;:::i;:::-;14791:74;;14874:93;14963:3;14874:93;:::i;:::-;14992:2;14987:3;14983:12;14976:19;;14781:220;;;:::o;15007:366::-;15149:3;15170:67;15234:2;15229:3;15170:67;:::i;:::-;15163:74;;15246:93;15335:3;15246:93;:::i;:::-;15364:2;15359:3;15355:12;15348:19;;15153:220;;;:::o;15379:366::-;15521:3;15542:67;15606:2;15601:3;15542:67;:::i;:::-;15535:74;;15618:93;15707:3;15618:93;:::i;:::-;15736:2;15731:3;15727:12;15720:19;;15525:220;;;:::o;15751:400::-;15911:3;15932:84;16014:1;16009:3;15932:84;:::i;:::-;15925:91;;16025:93;16114:3;16025:93;:::i;:::-;16143:1;16138:3;16134:11;16127:18;;15915:236;;;:::o;16157:366::-;16299:3;16320:67;16384:2;16379:3;16320:67;:::i;:::-;16313:74;;16396:93;16485:3;16396:93;:::i;:::-;16514:2;16509:3;16505:12;16498:19;;16303:220;;;:::o;16529:366::-;16671:3;16692:67;16756:2;16751:3;16692:67;:::i;:::-;16685:74;;16768:93;16857:3;16768:93;:::i;:::-;16886:2;16881:3;16877:12;16870:19;;16675:220;;;:::o;16901:366::-;17043:3;17064:67;17128:2;17123:3;17064:67;:::i;:::-;17057:74;;17140:93;17229:3;17140:93;:::i;:::-;17258:2;17253:3;17249:12;17242:19;;17047:220;;;:::o;17273:366::-;17415:3;17436:67;17500:2;17495:3;17436:67;:::i;:::-;17429:74;;17512:93;17601:3;17512:93;:::i;:::-;17630:2;17625:3;17621:12;17614:19;;17419:220;;;:::o;17645:366::-;17787:3;17808:67;17872:2;17867:3;17808:67;:::i;:::-;17801:74;;17884:93;17973:3;17884:93;:::i;:::-;18002:2;17997:3;17993:12;17986:19;;17791:220;;;:::o;18017:402::-;18177:3;18198:85;18280:2;18275:3;18198:85;:::i;:::-;18191:92;;18292:93;18381:3;18292:93;:::i;:::-;18410:2;18405:3;18401:12;18394:19;;18181:238;;;:::o;18425:366::-;18567:3;18588:67;18652:2;18647:3;18588:67;:::i;:::-;18581:74;;18664:93;18753:3;18664:93;:::i;:::-;18782:2;18777:3;18773:12;18766:19;;18571:220;;;:::o;18797:366::-;18939:3;18960:67;19024:2;19019:3;18960:67;:::i;:::-;18953:74;;19036:93;19125:3;19036:93;:::i;:::-;19154:2;19149:3;19145:12;19138:19;;18943:220;;;:::o;19169:366::-;19311:3;19332:67;19396:2;19391:3;19332:67;:::i;:::-;19325:74;;19408:93;19497:3;19408:93;:::i;:::-;19526:2;19521:3;19517:12;19510:19;;19315:220;;;:::o;19541:153::-;19644:43;19663:23;19680:5;19663:23;:::i;:::-;19644:43;:::i;:::-;19639:3;19632:56;19622:72;;:::o;19700:118::-;19787:24;19805:5;19787:24;:::i;:::-;19782:3;19775:37;19765:53;;:::o;19824:112::-;19907:22;19923:5;19907:22;:::i;:::-;19902:3;19895:35;19885:51;;:::o;19942:291::-;20082:3;20104:103;20203:3;20194:6;20186;20104:103;:::i;:::-;20097:110;;20224:3;20217:10;;20086:147;;;;;:::o;20239:275::-;20371:3;20393:95;20484:3;20475:6;20393:95;:::i;:::-;20386:102;;20505:3;20498:10;;20375:139;;;;:::o;20520:801::-;20851:3;20873:148;21017:3;20873:148;:::i;:::-;20866:155;;21038:92;21126:3;21117:6;21038:92;:::i;:::-;21031:99;;21147:148;21291:3;21147:148;:::i;:::-;21140:155;;21312:3;21305:10;;20855:466;;;;:::o;21327:541::-;21560:3;21582:148;21726:3;21582:148;:::i;:::-;21575:155;;21747:95;21838:3;21829:6;21747:95;:::i;:::-;21740:102;;21859:3;21852:10;;21564:304;;;;:::o;21874:533::-;22040:3;22055:73;22124:3;22115:6;22055:73;:::i;:::-;22153:1;22148:3;22144:11;22137:18;;22165:75;22236:3;22227:6;22165:75;:::i;:::-;22265:2;22260:3;22256:12;22249:19;;22278:75;22349:3;22340:6;22278:75;:::i;:::-;22378:2;22373:3;22369:12;22362:19;;22398:3;22391:10;;22044:363;;;;;;:::o;22413:222::-;22506:4;22544:2;22533:9;22529:18;22521:26;;22557:71;22625:1;22614:9;22610:17;22601:6;22557:71;:::i;:::-;22511:124;;;;:::o;22641:640::-;22836:4;22874:3;22863:9;22859:19;22851:27;;22888:71;22956:1;22945:9;22941:17;22932:6;22888:71;:::i;:::-;22969:72;23037:2;23026:9;23022:18;23013:6;22969:72;:::i;:::-;23051;23119:2;23108:9;23104:18;23095:6;23051:72;:::i;:::-;23170:9;23164:4;23160:20;23155:2;23144:9;23140:18;23133:48;23198:76;23269:4;23260:6;23198:76;:::i;:::-;23190:84;;22841:440;;;;;;;:::o;23287:210::-;23374:4;23412:2;23401:9;23397:18;23389:26;;23425:65;23487:1;23476:9;23472:17;23463:6;23425:65;:::i;:::-;23379:118;;;;:::o;23503:222::-;23596:4;23634:2;23623:9;23619:18;23611:26;;23647:71;23715:1;23704:9;23700:17;23691:6;23647:71;:::i;:::-;23601:124;;;;:::o;23731:442::-;23880:4;23918:2;23907:9;23903:18;23895:26;;23931:71;23999:1;23988:9;23984:17;23975:6;23931:71;:::i;:::-;24012:72;24080:2;24069:9;24065:18;24056:6;24012:72;:::i;:::-;24094;24162:2;24151:9;24147:18;24138:6;24094:72;:::i;:::-;23885:288;;;;;;:::o;24179:545::-;24352:4;24390:3;24379:9;24375:19;24367:27;;24404:71;24472:1;24461:9;24457:17;24448:6;24404:71;:::i;:::-;24485:68;24549:2;24538:9;24534:18;24525:6;24485:68;:::i;:::-;24563:72;24631:2;24620:9;24616:18;24607:6;24563:72;:::i;:::-;24645;24713:2;24702:9;24698:18;24689:6;24645:72;:::i;:::-;24357:367;;;;;;;:::o;24730:313::-;24843:4;24881:2;24870:9;24866:18;24858:26;;24930:9;24924:4;24920:20;24916:1;24905:9;24901:17;24894:47;24958:78;25031:4;25022:6;24958:78;:::i;:::-;24950:86;;24848:195;;;;:::o;25049:419::-;25215:4;25253:2;25242:9;25238:18;25230:26;;25302:9;25296:4;25292:20;25288:1;25277:9;25273:17;25266:47;25330:131;25456:4;25330:131;:::i;:::-;25322:139;;25220:248;;;:::o;25474:419::-;25640:4;25678:2;25667:9;25663:18;25655:26;;25727:9;25721:4;25717:20;25713:1;25702:9;25698:17;25691:47;25755:131;25881:4;25755:131;:::i;:::-;25747:139;;25645:248;;;:::o;25899:419::-;26065:4;26103:2;26092:9;26088:18;26080:26;;26152:9;26146:4;26142:20;26138:1;26127:9;26123:17;26116:47;26180:131;26306:4;26180:131;:::i;:::-;26172:139;;26070:248;;;:::o;26324:419::-;26490:4;26528:2;26517:9;26513:18;26505:26;;26577:9;26571:4;26567:20;26563:1;26552:9;26548:17;26541:47;26605:131;26731:4;26605:131;:::i;:::-;26597:139;;26495:248;;;:::o;26749:419::-;26915:4;26953:2;26942:9;26938:18;26930:26;;27002:9;26996:4;26992:20;26988:1;26977:9;26973:17;26966:47;27030:131;27156:4;27030:131;:::i;:::-;27022:139;;26920:248;;;:::o;27174:419::-;27340:4;27378:2;27367:9;27363:18;27355:26;;27427:9;27421:4;27417:20;27413:1;27402:9;27398:17;27391:47;27455:131;27581:4;27455:131;:::i;:::-;27447:139;;27345:248;;;:::o;27599:419::-;27765:4;27803:2;27792:9;27788:18;27780:26;;27852:9;27846:4;27842:20;27838:1;27827:9;27823:17;27816:47;27880:131;28006:4;27880:131;:::i;:::-;27872:139;;27770:248;;;:::o;28024:419::-;28190:4;28228:2;28217:9;28213:18;28205:26;;28277:9;28271:4;28267:20;28263:1;28252:9;28248:17;28241:47;28305:131;28431:4;28305:131;:::i;:::-;28297:139;;28195:248;;;:::o;28449:419::-;28615:4;28653:2;28642:9;28638:18;28630:26;;28702:9;28696:4;28692:20;28688:1;28677:9;28673:17;28666:47;28730:131;28856:4;28730:131;:::i;:::-;28722:139;;28620:248;;;:::o;28874:419::-;29040:4;29078:2;29067:9;29063:18;29055:26;;29127:9;29121:4;29117:20;29113:1;29102:9;29098:17;29091:47;29155:131;29281:4;29155:131;:::i;:::-;29147:139;;29045:248;;;:::o;29299:419::-;29465:4;29503:2;29492:9;29488:18;29480:26;;29552:9;29546:4;29542:20;29538:1;29527:9;29523:17;29516:47;29580:131;29706:4;29580:131;:::i;:::-;29572:139;;29470:248;;;:::o;29724:419::-;29890:4;29928:2;29917:9;29913:18;29905:26;;29977:9;29971:4;29967:20;29963:1;29952:9;29948:17;29941:47;30005:131;30131:4;30005:131;:::i;:::-;29997:139;;29895:248;;;:::o;30149:419::-;30315:4;30353:2;30342:9;30338:18;30330:26;;30402:9;30396:4;30392:20;30388:1;30377:9;30373:17;30366:47;30430:131;30556:4;30430:131;:::i;:::-;30422:139;;30320:248;;;:::o;30574:419::-;30740:4;30778:2;30767:9;30763:18;30755:26;;30827:9;30821:4;30817:20;30813:1;30802:9;30798:17;30791:47;30855:131;30981:4;30855:131;:::i;:::-;30847:139;;30745:248;;;:::o;30999:419::-;31165:4;31203:2;31192:9;31188:18;31180:26;;31252:9;31246:4;31242:20;31238:1;31227:9;31223:17;31216:47;31280:131;31406:4;31280:131;:::i;:::-;31272:139;;31170:248;;;:::o;31424:419::-;31590:4;31628:2;31617:9;31613:18;31605:26;;31677:9;31671:4;31667:20;31663:1;31652:9;31648:17;31641:47;31705:131;31831:4;31705:131;:::i;:::-;31697:139;;31595:248;;;:::o;31849:419::-;32015:4;32053:2;32042:9;32038:18;32030:26;;32102:9;32096:4;32092:20;32088:1;32077:9;32073:17;32066:47;32130:131;32256:4;32130:131;:::i;:::-;32122:139;;32020:248;;;:::o;32274:419::-;32440:4;32478:2;32467:9;32463:18;32455:26;;32527:9;32521:4;32517:20;32513:1;32502:9;32498:17;32491:47;32555:131;32681:4;32555:131;:::i;:::-;32547:139;;32445:248;;;:::o;32699:419::-;32865:4;32903:2;32892:9;32888:18;32880:26;;32952:9;32946:4;32942:20;32938:1;32927:9;32923:17;32916:47;32980:131;33106:4;32980:131;:::i;:::-;32972:139;;32870:248;;;:::o;33124:222::-;33217:4;33255:2;33244:9;33240:18;33232:26;;33268:71;33336:1;33325:9;33321:17;33312:6;33268:71;:::i;:::-;33222:124;;;;:::o;33352:129::-;33386:6;33413:20;;:::i;:::-;33403:30;;33442:33;33470:4;33462:6;33442:33;:::i;:::-;33393:88;;;:::o;33487:75::-;33520:6;33553:2;33547:9;33537:19;;33527:35;:::o;33568:307::-;33629:4;33719:18;33711:6;33708:30;33705:2;;;33741:18;;:::i;:::-;33705:2;33779:29;33801:6;33779:29;:::i;:::-;33771:37;;33863:4;33857;33853:15;33845:23;;33634:241;;;:::o;33881:308::-;33943:4;34033:18;34025:6;34022:30;34019:2;;;34055:18;;:::i;:::-;34019:2;34093:29;34115:6;34093:29;:::i;:::-;34085:37;;34177:4;34171;34167:15;34159:23;;33948:241;;;:::o;34195:141::-;34244:4;34267:3;34259:11;;34290:3;34287:1;34280:14;34324:4;34321:1;34311:18;34303:26;;34249:87;;;:::o;34342:98::-;34393:6;34427:5;34421:12;34411:22;;34400:40;;;:::o;34446:99::-;34498:6;34532:5;34526:12;34516:22;;34505:40;;;:::o;34551:168::-;34634:11;34668:6;34663:3;34656:19;34708:4;34703:3;34699:14;34684:29;;34646:73;;;;:::o;34725:147::-;34826:11;34863:3;34848:18;;34838:34;;;;:::o;34878:169::-;34962:11;34996:6;34991:3;34984:19;35036:4;35031:3;35027:14;35012:29;;34974:73;;;;:::o;35053:148::-;35155:11;35192:3;35177:18;;35167:34;;;;:::o;35207:305::-;35247:3;35266:20;35284:1;35266:20;:::i;:::-;35261:25;;35300:20;35318:1;35300:20;:::i;:::-;35295:25;;35454:1;35386:66;35382:74;35379:1;35376:81;35373:2;;;35460:18;;:::i;:::-;35373:2;35504:1;35501;35497:9;35490:16;;35251:261;;;;:::o;35518:185::-;35558:1;35575:20;35593:1;35575:20;:::i;:::-;35570:25;;35609:20;35627:1;35609:20;:::i;:::-;35604:25;;35648:1;35638:2;;35653:18;;:::i;:::-;35638:2;35695:1;35692;35688:9;35683:14;;35560:143;;;;:::o;35709:348::-;35749:7;35772:20;35790:1;35772:20;:::i;:::-;35767:25;;35806:20;35824:1;35806:20;:::i;:::-;35801:25;;35994:1;35926:66;35922:74;35919:1;35916:81;35911:1;35904:9;35897:17;35893:105;35890:2;;;36001:18;;:::i;:::-;35890:2;36049:1;36046;36042:9;36031:20;;35757:300;;;;:::o;36063:191::-;36103:4;36123:20;36141:1;36123:20;:::i;:::-;36118:25;;36157:20;36175:1;36157:20;:::i;:::-;36152:25;;36196:1;36193;36190:8;36187:2;;;36201:18;;:::i;:::-;36187:2;36246:1;36243;36239:9;36231:17;;36108:146;;;;:::o;36260:96::-;36297:7;36326:24;36344:5;36326:24;:::i;:::-;36315:35;;36305:51;;;:::o;36362:90::-;36396:7;36439:5;36432:13;36425:21;36414:32;;36404:48;;;:::o;36458:77::-;36495:7;36524:5;36513:16;;36503:32;;;:::o;36541:149::-;36577:7;36617:66;36610:5;36606:78;36595:89;;36585:105;;;:::o;36696:89::-;36732:7;36772:6;36765:5;36761:18;36750:29;;36740:45;;;:::o;36791:126::-;36828:7;36868:42;36861:5;36857:54;36846:65;;36836:81;;;:::o;36923:77::-;36960:7;36989:5;36978:16;;36968:32;;;:::o;37006:86::-;37041:7;37081:4;37074:5;37070:16;37059:27;;37049:43;;;:::o;37098:154::-;37182:6;37177:3;37172;37159:30;37244:1;37235:6;37230:3;37226:16;37219:27;37149:103;;;:::o;37258:307::-;37326:1;37336:113;37350:6;37347:1;37344:13;37336:113;;;37435:1;37430:3;37426:11;37420:18;37416:1;37411:3;37407:11;37400:39;37372:2;37369:1;37365:10;37360:15;;37336:113;;;37467:6;37464:1;37461:13;37458:2;;;37547:1;37538:6;37533:3;37529:16;37522:27;37458:2;37307:258;;;;:::o;37571:320::-;37615:6;37652:1;37646:4;37642:12;37632:22;;37699:1;37693:4;37689:12;37720:18;37710:2;;37776:4;37768:6;37764:17;37754:27;;37710:2;37838;37830:6;37827:14;37807:18;37804:38;37801:2;;;37857:18;;:::i;:::-;37801:2;37622:269;;;;:::o;37897:281::-;37980:27;38002:4;37980:27;:::i;:::-;37972:6;37968:40;38110:6;38098:10;38095:22;38074:18;38062:10;38059:34;38056:62;38053:2;;;38121:18;;:::i;:::-;38053:2;38161:10;38157:2;38150:22;37940:238;;;:::o;38184:79::-;38223:7;38252:5;38241:16;;38231:32;;;:::o;38269:94::-;38307:7;38336:21;38351:5;38336:21;:::i;:::-;38325:32;;38315:48;;;:::o;38369:180::-;38417:77;38414:1;38407:88;38514:4;38511:1;38504:15;38538:4;38535:1;38528:15;38555:180;38603:77;38600:1;38593:88;38700:4;38697:1;38690:15;38724:4;38721:1;38714:15;38741:180;38789:77;38786:1;38779:88;38886:4;38883:1;38876:15;38910:4;38907:1;38900:15;38927:180;38975:77;38972:1;38965:88;39072:4;39069:1;39062:15;39096:4;39093:1;39086:15;39113:102;39154:6;39205:2;39201:7;39196:2;39189:5;39185:14;39181:28;39171:38;;39161:54;;;:::o;39221:96::-;39255:8;39304:5;39299:3;39295:15;39274:36;;39264:53;;;:::o;39323:237::-;39463:34;39459:1;39451:6;39447:14;39440:58;39532:20;39527:2;39519:6;39515:15;39508:45;39429:131;:::o;39566:225::-;39706:34;39702:1;39694:6;39690:14;39683:58;39775:8;39770:2;39762:6;39758:15;39751:33;39672:119;:::o;39797:224::-;39937:34;39933:1;39925:6;39921:14;39914:58;40006:7;40001:2;39993:6;39989:15;39982:32;39903:118;:::o;40027:178::-;40167:30;40163:1;40155:6;40151:14;40144:54;40133:72;:::o;40211:180::-;40351:32;40347:1;40339:6;40335:14;40328:56;40317:74;:::o;40397:223::-;40537:34;40533:1;40525:6;40521:14;40514:58;40606:6;40601:2;40593:6;40589:15;40582:31;40503:117;:::o;40626:168::-;40766:20;40762:1;40754:6;40750:14;40743:44;40732:62;:::o;40800:175::-;40940:27;40936:1;40928:6;40924:14;40917:51;40906:69;:::o;40981:214::-;41121:66;41117:1;41109:6;41105:14;41098:90;41087:108;:::o;41201:167::-;41341:19;41337:1;41329:6;41325:14;41318:43;41307:61;:::o;41374:228::-;41514:34;41510:1;41502:6;41498:14;41491:58;41583:11;41578:2;41570:6;41566:15;41559:36;41480:122;:::o;41608:181::-;41748:33;41744:1;41736:6;41732:14;41725:57;41714:75;:::o;41795:214::-;41935:66;41931:1;41923:6;41919:14;41912:90;41901:108;:::o;42015:249::-;42155:34;42151:1;42143:6;42139:14;42132:58;42224:32;42219:2;42211:6;42207:15;42200:57;42121:143;:::o;42270:182::-;42410:34;42406:1;42398:6;42394:14;42387:58;42376:76;:::o;42458:182::-;42598:34;42594:1;42586:6;42582:14;42575:58;42564:76;:::o;42646:174::-;42786:26;42782:1;42774:6;42770:14;42763:50;42752:68;:::o;42826:220::-;42966:34;42962:1;42954:6;42950:14;42943:58;43035:3;43030:2;43022:6;43018:15;43011:28;42932:114;:::o;43052:179::-;43192:31;43188:1;43180:6;43176:14;43169:55;43158:73;:::o;43237:170::-;43377:22;43373:1;43365:6;43361:14;43354:46;43343:64;:::o;43413:233::-;43553:34;43549:1;43541:6;43537:14;43530:58;43622:16;43617:2;43609:6;43605:15;43598:41;43519:127;:::o;43652:166::-;43792:18;43788:1;43780:6;43776:14;43769:42;43758:60;:::o;43824:122::-;43897:24;43915:5;43897:24;:::i;:::-;43890:5;43887:35;43877:2;;43936:1;43933;43926:12;43877:2;43867:79;:::o;43952:116::-;44022:21;44037:5;44022:21;:::i;:::-;44015:5;44012:32;44002:2;;44058:1;44055;44048:12;44002:2;43992:76;:::o;44074:122::-;44147:24;44165:5;44147:24;:::i;:::-;44140:5;44137:35;44127:2;;44186:1;44183;44176:12;44127:2;44117:79;:::o;44202:120::-;44274:23;44291:5;44274:23;:::i;:::-;44267:5;44264:34;44254:2;;44312:1;44309;44302:12;44254:2;44244:78;:::o;44328:122::-;44401:24;44419:5;44401:24;:::i;:::-;44394:5;44391:35;44381:2;;44440:1;44437;44430:12;44381:2;44371:79;:::o;44456:118::-;44527:22;44543:5;44527:22;:::i;:::-;44520:5;44517:33;44507:2;;44564:1;44561;44554:12;44507:2;44497:77;:::o
Swarm Source
ipfs://9af48bdb20e8eb471fbc986199f7c4d65d9f6a6cb22ae5c4e18c60cc384be6d5
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.