Token Racing Snails
Overview ERC-721
Total Supply:
378 SNAILS
Holders:
113 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RacingSnails
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-24 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _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 a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/RacingSnailsContract.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.4; contract RacingSnails is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Pausable, Ownable { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private _tokenIds; Counters.Counter private _mintCount; Counters.Counter private _giveawayCount; Counters.Counter private _whitelistCount; mapping (address => bool) public whitelist; uint256 public maxMintable = 1690; uint256 public mintPrice = 30 ether; uint256 public whitelistPrice = 15 ether; address payable public payableAddress; string private _defaultBaseURI; bool public whitelistSale; bool public salesAvailable; constructor() ERC721("Racing Snails", "SNAILS") { salesAvailable = false; whitelistSale = false; _tokenIds.increment(); } function mint(uint256 quantity) external payable whenNotPaused { require((whitelistSale || salesAvailable), "Mint don't open yet"); if(whitelistSale) { bool inWhitelist = whitelist[msg.sender]; require(inWhitelist == true, "You don't have whitelist spot"); uint256 amountMint = _mintCount.current(); require(amountMint < maxMintable && ((amountMint + 1) < maxMintable), "Mint limit exceeded!"); uint256 totalPrice = whitelistPrice * 1; require(msg.value >= totalPrice, "Invalid amount for whitelist!"); payableAddress.transfer(totalPrice); uint256 tokenId = _tokenIds.current(); mintNFT(msg.sender, tokenId); delete whitelist[msg.sender]; } if(salesAvailable) { uint256 amountMint = _mintCount.current(); require(amountMint < maxMintable && ((amountMint + quantity) < maxMintable), "Mint limit exceeded!"); uint256 totalPrice = mintPrice * quantity; require(msg.value >= totalPrice, "Invalid amount for mint!"); payableAddress.transfer(totalPrice); uint256 tokenId = _tokenIds.current(); for (uint256 i = 0; i < quantity; i++) { mintNFT(msg.sender, tokenId + i); } } } function giveaway(address to, uint256 quantity) public onlyOwner { uint256 tokenId = _tokenIds.current(); for (uint256 i = 0; i < quantity; i++) { giveNFT(to, tokenId + i); } } function setWhitelistAddress(address[] calldata account) public onlyOwner { require(whitelistSale, "Whitelist Sales isn't public yet!"); for (uint i = 0; i < account.length; i++) { whitelist[account[i]] = true; } } function burn(uint256 tokenId) public { require(ownerOf(tokenId) == msg.sender, "You're not the owner"); _burn(tokenId); } function mintNFT(address to, uint256 tokenId) internal { internalMint(to, tokenId); _mintCount.increment(); } function giveNFT(address to, uint256 tokenId) internal { internalMint(to, tokenId); _mintCount.increment(); } function internalMint(address to, uint256 tokenId) internal { require(tokenId <= maxMintable, "Token limit exceeded!"); _safeMint(to, tokenId); _tokenIds.increment(); } function toggleSalesAvailable() public onlyOwner { salesAvailable = !salesAvailable; } function toggleWhitelistSale() public onlyOwner { whitelistSale = !whitelistSale; } function setBaseURI(string calldata newBaseURI) public onlyOwner { _defaultBaseURI = newBaseURI; } function setPayableAddress(address newPayableAddress) public onlyOwner { payableAddress = payable(newPayableAddress); } function setMintPrice(uint256 newMintPrice) public onlyOwner { mintPrice = newMintPrice; } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json")); } function _baseURI() internal view override returns (string memory) { return _defaultBaseURI; } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":"maxMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salesAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPayableAddress","type":"address"}],"name":"setPayableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"}],"name":"setWhitelistAddress","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":[],"name":"toggleSalesAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405261069a6011556801a055690d9db8000060125567d02ab486cedc00006013553480156200003057600080fd5b506040518060400160405280600d81526020017f526163696e6720536e61696c73000000000000000000000000000000000000008152506040518060400160405280600681526020017f534e41494c5300000000000000000000000000000000000000000000000000008152508160009080519060200190620000b592919062000243565b508060019080519060200190620000ce92919062000243565b5050506000600b60006101000a81548160ff0219169083151502179055506200010c620001006200015f60201b60201c565b6200016760201b60201c565b6000601660016101000a81548160ff0219169083151502179055506000601660006101000a81548160ff02191690831515021790555062000159600c6200022d60201b62001c641760201c565b62000358565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8280546200025190620002f3565b90600052602060002090601f016020900481019282620002755760008555620002c1565b82601f106200029057805160ff1916838001178555620002c1565b82800160010185558215620002c1579182015b82811115620002c0578251825591602001919060010190620002a3565b5b509050620002d09190620002d4565b5090565b5b80821115620002ef576000816000905550600101620002d5565b5090565b600060028204905060018216806200030c57607f821691505b6020821081141562000323576200032262000329565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614c1a80620003686000396000f3fe60806040526004361061020f5760003560e01c80635b3eed5c11610118578063a0712d68116100a0578063e985e9c51161006f578063e985e9c51461078e578063f2fde38b146107cb578063f3f72d1c146107f4578063f4a0a5281461080b578063fc1a1c36146108345761020f565b8063a0712d68146106e3578063a22cb465146106ff578063b88d4fde14610728578063c87b56dd146107515761020f565b806370a08231116100e757806370a08231146105fc578063715018a6146106395780638da5cb5b1461065057806395d89b411461067b5780639b19251a146106a65761020f565b80635b3eed5c146105405780635c975abb146105695780636352211e146105945780636817c76c146105d15761020f565b80632f745c591161019b57806342966c681161016a57806342966c681461046f5780634685e1a0146104985780634f6ccce7146104c357806355f804b31461050057806359eda1b5146105295761020f565b80632f745c59146103b357806331ffd6f1146103f057806335e7b43e1461041b57806342842e0e146104465761020f565b8063095ea7b3116101e2578063095ea7b3146102e2578063158499ce1461030b57806318160ddd146103345780632154dc391461035f57806323b872dd1461038a5761020f565b806301ffc9a714610214578063050225ea1461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906136d6565b61085f565b6040516102489190613cfa565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613655565b610871565b005b34801561028657600080fd5b5061028f610934565b60405161029c9190613d15565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c7919061376d565b6109c6565b6040516102d99190613c78565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613655565b610a4b565b005b34801561031757600080fd5b50610332600480360381019061032d9190613691565b610b63565b005b34801561034057600080fd5b50610349610cf9565b6040516103569190614097565b60405180910390f35b34801561036b57600080fd5b50610374610d06565b6040516103819190614097565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac919061354f565b610d0c565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190613655565b610d6c565b6040516103e79190614097565b60405180910390f35b3480156103fc57600080fd5b50610405610e11565b6040516104129190613cfa565b60405180910390f35b34801561042757600080fd5b50610430610e24565b60405161043d9190613cfa565b60405180910390f35b34801561045257600080fd5b5061046d6004803603810190610468919061354f565b610e37565b005b34801561047b57600080fd5b506104966004803603810190610491919061376d565b610e57565b005b3480156104a457600080fd5b506104ad610ed9565b6040516104ba9190613c93565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e5919061376d565b610eff565b6040516104f79190614097565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613728565b610f96565b005b34801561053557600080fd5b5061053e611028565b005b34801561054c57600080fd5b50610567600480360381019061056291906134ea565b6110d0565b005b34801561057557600080fd5b5061057e611190565b60405161058b9190613cfa565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b6919061376d565b6111a7565b6040516105c89190613c78565b60405180910390f35b3480156105dd57600080fd5b506105e6611259565b6040516105f39190614097565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e91906134ea565b61125f565b6040516106309190614097565b60405180910390f35b34801561064557600080fd5b5061064e611317565b005b34801561065c57600080fd5b5061066561139f565b6040516106729190613c78565b60405180910390f35b34801561068757600080fd5b506106906113c9565b60405161069d9190613d15565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906134ea565b61145b565b6040516106da9190613cfa565b60405180910390f35b6106fd60048036038101906106f8919061376d565b61147b565b005b34801561070b57600080fd5b5061072660048036038101906107219190613619565b6118f2565b005b34801561073457600080fd5b5061074f600480360381019061074a919061359e565b611908565b005b34801561075d57600080fd5b506107786004803603810190610773919061376d565b61196a565b6040516107859190613d15565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190613513565b6119a4565b6040516107c29190613cfa565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed91906134ea565b611a38565b005b34801561080057600080fd5b50610809611b30565b005b34801561081757600080fd5b50610832600480360381019061082d919061376d565b611bd8565b005b34801561084057600080fd5b50610849611c5e565b6040516108569190614097565b60405180910390f35b600061086a82611c7a565b9050919050565b610879611cf4565b73ffffffffffffffffffffffffffffffffffffffff1661089761139f565b73ffffffffffffffffffffffffffffffffffffffff16146108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490613f77565b60405180910390fd5b60006108f9600c611cfc565b905060005b8281101561092e5761091b848284610916919061414b565b611d0a565b80806109269061438b565b9150506108fe565b50505050565b60606000805461094390614328565b80601f016020809104026020016040519081016040528092919081815260200182805461096f90614328565b80156109bc5780601f10610991576101008083540402835291602001916109bc565b820191906000526020600020905b81548152906001019060200180831161099f57829003601f168201915b5050505050905090565b60006109d182611d22565b610a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0790613f57565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a56826111a7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90613f97565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae6611cf4565b73ffffffffffffffffffffffffffffffffffffffff161480610b155750610b1481610b0f611cf4565b6119a4565b5b610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90613eb7565b60405180910390fd5b610b5e8383611d8e565b505050565b610b6b611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610b8961139f565b73ffffffffffffffffffffffffffffffffffffffff1614610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690613f77565b60405180910390fd5b601660009054906101000a900460ff16610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590614057565b60405180910390fd5b60005b82829050811015610cf457600160106000858585818110610c7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610c9091906134ea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610cec9061438b565b915050610c31565b505050565b6000600880549050905090565b60115481565b610d1d610d17611cf4565b82611e47565b610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390613ff7565b60405180910390fd5b610d67838383611f25565b505050565b6000610d778361125f565b8210610db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daf90613d77565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601660009054906101000a900460ff1681565b601660019054906101000a900460ff1681565b610e5283838360405180602001604052806000815250611908565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610e77826111a7565b73ffffffffffffffffffffffffffffffffffffffff1614610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec490614037565b60405180910390fd5b610ed68161218c565b50565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610f09610cf9565b8210610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190614017565b60405180910390fd5b60088281548110610f84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f9e611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610fbc61139f565b73ffffffffffffffffffffffffffffffffffffffff1614611012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100990613f77565b60405180910390fd5b8181601591906110239291906132a2565b505050565b611030611cf4565b73ffffffffffffffffffffffffffffffffffffffff1661104e61139f565b73ffffffffffffffffffffffffffffffffffffffff16146110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b90613f77565b60405180910390fd5b601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b6110d8611cf4565b73ffffffffffffffffffffffffffffffffffffffff166110f661139f565b73ffffffffffffffffffffffffffffffffffffffff161461114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390613f77565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124790613f17565b60405180910390fd5b80915050919050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790613ef7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61131f611cf4565b73ffffffffffffffffffffffffffffffffffffffff1661133d61139f565b73ffffffffffffffffffffffffffffffffffffffff1614611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90613f77565b60405180910390fd5b61139d6000612198565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113d890614328565b80601f016020809104026020016040519081016040528092919081815260200182805461140490614328565b80156114515780601f1061142657610100808354040283529160200191611451565b820191906000526020600020905b81548152906001019060200180831161143457829003601f168201915b5050505050905090565b60106020528060005260406000206000915054906101000a900460ff1681565b611483611190565b156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90613e97565b60405180910390fd5b601660009054906101000a900460ff16806114ea5750601660019054906101000a900460ff165b611529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152090613e17565b60405180910390fd5b601660009054906101000a900460ff161561176c576000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060011515811515146115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd90613fd7565b60405180910390fd5b60006115e2600d611cfc565b9050601154811080156116025750601154600182611600919061414b565b105b611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163890613ed7565b60405180910390fd5b6000600160135461165291906141d2565b905080341015611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90614077565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116ff573d6000803e3d6000fd5b50600061170c600c611cfc565b9050611718338261225e565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055505050505b601660019054906101000a900460ff16156118ef57600061178d600d611cfc565b9050601154811080156117ac575060115482826117aa919061414b565b105b6117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290613ed7565b60405180910390fd5b6000826012546117fb91906141d2565b905080341015611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790613d57565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156118a8573d6000803e3d6000fd5b5060006118b5600c611cfc565b905060005b848110156118ea576118d73382846118d2919061414b565b61225e565b80806118e29061438b565b9150506118ba565b505050505b50565b6119046118fd611cf4565b8383612276565b5050565b611919611913611cf4565b83611e47565b611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613ff7565b60405180910390fd5b611964848484846123e3565b50505050565b606061197461243f565b61197d836124d1565b60405160200161198e929190613c49565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a40611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611a5e61139f565b73ffffffffffffffffffffffffffffffffffffffff1614611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab90613f77565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1b90613db7565b60405180910390fd5b611b2d81612198565b50565b611b38611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611b5661139f565b73ffffffffffffffffffffffffffffffffffffffff1614611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390613f77565b60405180910390fd5b601660019054906101000a900460ff1615601660016101000a81548160ff021916908315150217905550565b611be0611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611bfe61139f565b73ffffffffffffffffffffffffffffffffffffffff1614611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b90613f77565b60405180910390fd5b8060128190555050565b60135481565b6001816000016000828254019250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ced5750611cec8261267e565b5b9050919050565b600033905090565b600081600001549050919050565b611d148282612760565b611d1e600d611c64565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e01836111a7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e5282611d22565b611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8890613e77565b60405180910390fd5b6000611e9c836111a7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f0b57508373ffffffffffffffffffffffffffffffffffffffff16611ef3846109c6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f1c5750611f1b81856119a4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f45826111a7565b73ffffffffffffffffffffffffffffffffffffffff1614611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9290613dd7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561200b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200290613e37565b60405180910390fd5b6120168383836127bd565b612021600082611d8e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612071919061422c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c8919061414b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121878383836127cd565b505050565b612195816127d2565b50565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122688282612760565b612272600d611c64565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90613e57565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123d69190613cfa565b60405180910390a3505050565b6123ee848484611f25565b6123fa84848484612825565b612439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243090613d97565b60405180910390fd5b50505050565b60606015805461244e90614328565b80601f016020809104026020016040519081016040528092919081815260200182805461247a90614328565b80156124c75780601f1061249c576101008083540402835291602001916124c7565b820191906000526020600020905b8154815290600101906020018083116124aa57829003601f168201915b5050505050905090565b60606000821415612519576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612679565b600082905060005b6000821461254b5780806125349061438b565b915050600a8261254491906141a1565b9150612521565b60008167ffffffffffffffff81111561258d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125bf5781602001600182028036833780820191505090505b5090505b60008514612672576001826125d8919061422c565b9150600a856125e791906143d4565b60306125f3919061414b565b60f81b81838151811061262f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561266b91906141a1565b94506125c3565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061274957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127595750612758826129bc565b5b9050919050565b6011548111156127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c90613fb7565b60405180910390fd5b6127af8282612a26565b6127b9600c611c64565b5050565b6127c8838383612a44565b505050565b505050565b6127db81612a9c565b6000600a600083815260200190815260200160002080546127fb90614328565b90501461282257600a600082815260200190815260200160002060006128219190613328565b5b50565b60006128468473ffffffffffffffffffffffffffffffffffffffff16612bb9565b156129af578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261286f611cf4565b8786866040518563ffffffff1660e01b81526004016128919493929190613cae565b602060405180830381600087803b1580156128ab57600080fd5b505af19250505080156128dc57506040513d601f19601f820116820180604052508101906128d991906136ff565b60015b61295f573d806000811461290c576040519150601f19603f3d011682016040523d82523d6000602084013e612911565b606091505b50600081511415612957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294e90613d97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b4565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a40828260405180602001604052806000815250612bdc565b5050565b612a4f838383612c37565b612a57611190565b15612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e90613d37565b60405180910390fd5b505050565b6000612aa7826111a7565b9050612ab5816000846127bd565b612ac0600083611d8e565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b10919061422c565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb5816000846127cd565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b612be68383612d4b565b612bf36000848484612825565b612c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2990613d97565b60405180910390fd5b505050565b612c42838383612f25565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c8557612c8081612f2a565b612cc4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612cc357612cc28382612f73565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d0757612d02816130e0565b612d46565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d4557612d448282613223565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db290613f37565b60405180910390fd5b612dc481611d22565b15612e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb90613df7565b60405180910390fd5b612e10600083836127bd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e60919061414b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f21600083836127cd565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f808461125f565b612f8a919061422c565b905060006007600084815260200190815260200160002054905081811461306f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130f4919061422c565b905060006009600084815260200190815260200160002054905060006008838154811061314a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613192577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613207577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061322e8361125f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546132ae90614328565b90600052602060002090601f0160209004810192826132d05760008555613317565b82601f106132e957803560ff1916838001178555613317565b82800160010185558215613317579182015b828111156133165782358255916020019190600101906132fb565b5b5090506133249190613368565b5090565b50805461333490614328565b6000825580601f106133465750613365565b601f0160209004906000526020600020908101906133649190613368565b5b50565b5b80821115613381576000816000905550600101613369565b5090565b6000613398613393846140d7565b6140b2565b9050828152602081018484840111156133b057600080fd5b6133bb8482856142e6565b509392505050565b6000813590506133d281614b88565b92915050565b60008083601f8401126133ea57600080fd5b8235905067ffffffffffffffff81111561340357600080fd5b60208301915083602082028301111561341b57600080fd5b9250929050565b60008135905061343181614b9f565b92915050565b60008135905061344681614bb6565b92915050565b60008151905061345b81614bb6565b92915050565b600082601f83011261347257600080fd5b8135613482848260208601613385565b91505092915050565b60008083601f84011261349d57600080fd5b8235905067ffffffffffffffff8111156134b657600080fd5b6020830191508360018202830111156134ce57600080fd5b9250929050565b6000813590506134e481614bcd565b92915050565b6000602082840312156134fc57600080fd5b600061350a848285016133c3565b91505092915050565b6000806040838503121561352657600080fd5b6000613534858286016133c3565b9250506020613545858286016133c3565b9150509250929050565b60008060006060848603121561356457600080fd5b6000613572868287016133c3565b9350506020613583868287016133c3565b9250506040613594868287016134d5565b9150509250925092565b600080600080608085870312156135b457600080fd5b60006135c2878288016133c3565b94505060206135d3878288016133c3565b93505060406135e4878288016134d5565b925050606085013567ffffffffffffffff81111561360157600080fd5b61360d87828801613461565b91505092959194509250565b6000806040838503121561362c57600080fd5b600061363a858286016133c3565b925050602061364b85828601613422565b9150509250929050565b6000806040838503121561366857600080fd5b6000613676858286016133c3565b9250506020613687858286016134d5565b9150509250929050565b600080602083850312156136a457600080fd5b600083013567ffffffffffffffff8111156136be57600080fd5b6136ca858286016133d8565b92509250509250929050565b6000602082840312156136e857600080fd5b60006136f684828501613437565b91505092915050565b60006020828403121561371157600080fd5b600061371f8482850161344c565b91505092915050565b6000806020838503121561373b57600080fd5b600083013567ffffffffffffffff81111561375557600080fd5b6137618582860161348b565b92509250509250929050565b60006020828403121561377f57600080fd5b600061378d848285016134d5565b91505092915050565b61379f81614272565b82525050565b6137ae81614260565b82525050565b6137bd81614284565b82525050565b60006137ce82614108565b6137d8818561411e565b93506137e88185602086016142f5565b6137f1816144c1565b840191505092915050565b600061380782614113565b613811818561412f565b93506138218185602086016142f5565b61382a816144c1565b840191505092915050565b600061384082614113565b61384a8185614140565b935061385a8185602086016142f5565b80840191505092915050565b6000613873602b8361412f565b915061387e826144d2565b604082019050919050565b600061389660188361412f565b91506138a182614521565b602082019050919050565b60006138b9602b8361412f565b91506138c48261454a565b604082019050919050565b60006138dc60328361412f565b91506138e782614599565b604082019050919050565b60006138ff60268361412f565b915061390a826145e8565b604082019050919050565b600061392260258361412f565b915061392d82614637565b604082019050919050565b6000613945601c8361412f565b915061395082614686565b602082019050919050565b600061396860138361412f565b9150613973826146af565b602082019050919050565b600061398b60248361412f565b9150613996826146d8565b604082019050919050565b60006139ae60198361412f565b91506139b982614727565b602082019050919050565b60006139d1602c8361412f565b91506139dc82614750565b604082019050919050565b60006139f460108361412f565b91506139ff8261479f565b602082019050919050565b6000613a1760388361412f565b9150613a22826147c8565b604082019050919050565b6000613a3a60148361412f565b9150613a4582614817565b602082019050919050565b6000613a5d602a8361412f565b9150613a6882614840565b604082019050919050565b6000613a8060298361412f565b9150613a8b8261488f565b604082019050919050565b6000613aa360208361412f565b9150613aae826148de565b602082019050919050565b6000613ac6602c8361412f565b9150613ad182614907565b604082019050919050565b6000613ae9600583614140565b9150613af482614956565b600582019050919050565b6000613b0c60208361412f565b9150613b178261497f565b602082019050919050565b6000613b2f60218361412f565b9150613b3a826149a8565b604082019050919050565b6000613b5260158361412f565b9150613b5d826149f7565b602082019050919050565b6000613b75601d8361412f565b9150613b8082614a20565b602082019050919050565b6000613b9860318361412f565b9150613ba382614a49565b604082019050919050565b6000613bbb602c8361412f565b9150613bc682614a98565b604082019050919050565b6000613bde60148361412f565b9150613be982614ae7565b602082019050919050565b6000613c0160218361412f565b9150613c0c82614b10565b604082019050919050565b6000613c24601d8361412f565b9150613c2f82614b5f565b602082019050919050565b613c43816142dc565b82525050565b6000613c558285613835565b9150613c618284613835565b9150613c6c82613adc565b91508190509392505050565b6000602082019050613c8d60008301846137a5565b92915050565b6000602082019050613ca86000830184613796565b92915050565b6000608082019050613cc360008301876137a5565b613cd060208301866137a5565b613cdd6040830185613c3a565b8181036060830152613cef81846137c3565b905095945050505050565b6000602082019050613d0f60008301846137b4565b92915050565b60006020820190508181036000830152613d2f81846137fc565b905092915050565b60006020820190508181036000830152613d5081613866565b9050919050565b60006020820190508181036000830152613d7081613889565b9050919050565b60006020820190508181036000830152613d90816138ac565b9050919050565b60006020820190508181036000830152613db0816138cf565b9050919050565b60006020820190508181036000830152613dd0816138f2565b9050919050565b60006020820190508181036000830152613df081613915565b9050919050565b60006020820190508181036000830152613e1081613938565b9050919050565b60006020820190508181036000830152613e308161395b565b9050919050565b60006020820190508181036000830152613e508161397e565b9050919050565b60006020820190508181036000830152613e70816139a1565b9050919050565b60006020820190508181036000830152613e90816139c4565b9050919050565b60006020820190508181036000830152613eb0816139e7565b9050919050565b60006020820190508181036000830152613ed081613a0a565b9050919050565b60006020820190508181036000830152613ef081613a2d565b9050919050565b60006020820190508181036000830152613f1081613a50565b9050919050565b60006020820190508181036000830152613f3081613a73565b9050919050565b60006020820190508181036000830152613f5081613a96565b9050919050565b60006020820190508181036000830152613f7081613ab9565b9050919050565b60006020820190508181036000830152613f9081613aff565b9050919050565b60006020820190508181036000830152613fb081613b22565b9050919050565b60006020820190508181036000830152613fd081613b45565b9050919050565b60006020820190508181036000830152613ff081613b68565b9050919050565b6000602082019050818103600083015261401081613b8b565b9050919050565b6000602082019050818103600083015261403081613bae565b9050919050565b6000602082019050818103600083015261405081613bd1565b9050919050565b6000602082019050818103600083015261407081613bf4565b9050919050565b6000602082019050818103600083015261409081613c17565b9050919050565b60006020820190506140ac6000830184613c3a565b92915050565b60006140bc6140cd565b90506140c8828261435a565b919050565b6000604051905090565b600067ffffffffffffffff8211156140f2576140f1614492565b5b6140fb826144c1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614156826142dc565b9150614161836142dc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561419657614195614405565b5b828201905092915050565b60006141ac826142dc565b91506141b7836142dc565b9250826141c7576141c6614434565b5b828204905092915050565b60006141dd826142dc565b91506141e8836142dc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422157614220614405565b5b828202905092915050565b6000614237826142dc565b9150614242836142dc565b92508282101561425557614254614405565b5b828203905092915050565b600061426b826142bc565b9050919050565b600061427d826142bc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143135780820151818401526020810190506142f8565b83811115614322576000848401525b50505050565b6000600282049050600182168061434057607f821691505b6020821081141561435457614353614463565b5b50919050565b614363826144c1565b810181811067ffffffffffffffff8211171561438257614381614492565b5b80604052505050565b6000614396826142dc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143c9576143c8614405565b5b600182019050919050565b60006143df826142dc565b91506143ea836142dc565b9250826143fa576143f9614434565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f496e76616c696420616d6f756e7420666f72206d696e74210000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e7420646f6e2774206f70656e2079657400000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d696e74206c696d697420657863656564656421000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e206c696d6974206578636565646564210000000000000000000000600082015250565b7f596f7520646f6e277420686176652077686974656c6973742073706f74000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f75277265206e6f7420746865206f776e6572000000000000000000000000600082015250565b7f57686974656c6973742053616c65732069736e2774207075626c69632079657460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420616d6f756e7420666f722077686974656c69737421000000600082015250565b614b9181614260565b8114614b9c57600080fd5b50565b614ba881614284565b8114614bb357600080fd5b50565b614bbf81614290565b8114614bca57600080fd5b50565b614bd6816142dc565b8114614be157600080fd5b5056fea2646970667358221220dc419bcf0a4d75c44ff5f7dfa26f789edeefb62bd50ba2846c2771332c5b05df64736f6c63430008040033
Deployed ByteCode Sourcemap
52330:4806:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56962:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54590:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29917:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31476:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30999:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54819:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46702:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52741:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32226:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46370:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52961:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52995:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32636:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55086:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52876:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46892:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55940:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55835:97;;;;;;;;;;;;;:::i;:::-;;56060:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8144:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29611:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52783:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29341:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30086:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52690:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53191:1391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31769:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32892:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56313:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31995:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55727:100;;;;;;;;;;;;;:::i;:::-;;56201:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52827:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56962:171;57065:4;57089:36;57113:11;57089:23;:36::i;:::-;57082:43;;56962:171;;;:::o;54590:221::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54666:15:::1;54684:19;:9;:17;:19::i;:::-;54666:37;;54719:9;54714:90;54738:8;54734:1;:12;54714:90;;;54768:24;54776:2;54790:1;54780:7;:11;;;;:::i;:::-;54768:7;:24::i;:::-;54748:3;;;;;:::i;:::-;;;;54714:90;;;;5835:1;54590:221:::0;;:::o;29917:100::-;29971:13;30004:5;29997:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29917:100;:::o;31476:221::-;31552:7;31580:16;31588:7;31580;:16::i;:::-;31572:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31665:15;:24;31681:7;31665:24;;;;;;;;;;;;;;;;;;;;;31658:31;;31476:221;;;:::o;30999:411::-;31080:13;31096:23;31111:7;31096:14;:23::i;:::-;31080:39;;31144:5;31138:11;;:2;:11;;;;31130:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31238:5;31222:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31247:37;31264:5;31271:12;:10;:12::i;:::-;31247:16;:37::i;:::-;31222:62;31200:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31381:21;31390:2;31394:7;31381:8;:21::i;:::-;30999:411;;;:::o;54819:259::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54912:13:::1;;;;;;;;;;;54904:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54979:6;54974:97;54995:7;;:14;;54991:1;:18;54974:97;;;55055:4;55031:9;:21;55041:7;;55049:1;55041:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55031:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;55011:3;;;;;:::i;:::-;;;;54974:97;;;;54819:259:::0;;:::o;46702:113::-;46763:7;46790:10;:17;;;;46783:24;;46702:113;:::o;52741:33::-;;;;:::o;32226:339::-;32421:41;32440:12;:10;:12::i;:::-;32454:7;32421:18;:41::i;:::-;32413:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32529:28;32539:4;32545:2;32549:7;32529:9;:28::i;:::-;32226:339;;;:::o;46370:256::-;46467:7;46503:23;46520:5;46503:16;:23::i;:::-;46495:5;:31;46487:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46592:12;:19;46605:5;46592:19;;;;;;;;;;;;;;;:26;46612:5;46592:26;;;;;;;;;;;;46585:33;;46370:256;;;;:::o;52961:25::-;;;;;;;;;;;;;:::o;52995:26::-;;;;;;;;;;;;;:::o;32636:185::-;32774:39;32791:4;32797:2;32801:7;32774:39;;;;;;;;;;;;:16;:39::i;:::-;32636:185;;;:::o;55086:145::-;55163:10;55143:30;;:16;55151:7;55143;:16::i;:::-;:30;;;55135:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55209:14;55215:7;55209:5;:14::i;:::-;55086:145;:::o;52876:37::-;;;;;;;;;;;;;:::o;46892:233::-;46967:7;47003:30;:28;:30::i;:::-;46995:5;:38;46987:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47100:10;47111:5;47100:17;;;;;;;;;;;;;;;;;;;;;;;;47093:24;;46892:233;;;:::o;55940:112::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56034:10:::1;;56016:15;:28;;;;;;;:::i;:::-;;55940:112:::0;;:::o;55835:97::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55911:13:::1;;;;;;;;;;;55910:14;55894:13;;:30;;;;;;;;;;;;;;;;;;55835:97::o:0;56060:133::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56167:17:::1;56142:14;;:43;;;;;;;;;;;;;;;;;;56060:133:::0;:::o;8144:86::-;8191:4;8215:7;;;;;;;;;;;8208:14;;8144:86;:::o;29611:239::-;29683:7;29703:13;29719:7;:16;29727:7;29719:16;;;;;;;;;;;;;;;;;;;;;29703:32;;29771:1;29754:19;;:5;:19;;;;29746:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29837:5;29830:12;;;29611:239;;;:::o;52783:35::-;;;;:::o;29341:208::-;29413:7;29458:1;29441:19;;:5;:19;;;;29433:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29525:9;:16;29535:5;29525:16;;;;;;;;;;;;;;;;29518:23;;29341:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;30086:104::-;30142:13;30175:7;30168:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30086:104;:::o;52690:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;53191:1391::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;53274:13:::1;;;;;;;;;;;:31;;;;53291:14;;;;;;;;;;;53274:31;53265:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53344:13;;;;;;;;;;;53341:653;;;53374:16;53393:9;:21;53403:10;53393:21;;;;;;;;;;;;;;;;;;;;;;;;;53374:40;;53452:4;53437:19;;:11;:19;;;53429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53505:18;53526:20;:10;:18;:20::i;:::-;53505:41;;53582:11;;53569:10;:24;:60;;;;;53617:11;;53612:1;53599:10;:14;;;;:::i;:::-;53598:30;53569:60;53561:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;53669:18;53707:1;53690:14;;:18;;;;:::i;:::-;53669:39;;53744:10;53731:9;:23;;53723:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53805:14;;;;;;;;;;;:23;;:35;53829:10;53805:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53857:15;53875:19;:9;:17;:19::i;:::-;53857:37;;53909:28;53917:10;53929:7;53909;:28::i;:::-;53961:9;:21;53971:10;53961:21;;;;;;;;;;;;;;;;53954:28;;;;;;;;;;;53341:653;;;;;54009:14;;;;;;;;;;;54006:569;;;54040:18;54061:20;:10;:18;:20::i;:::-;54040:41;;54117:11;;54104:10;:24;:67;;;;;54159:11;;54147:8;54134:10;:21;;;;:::i;:::-;54133:37;54104:67;54096:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;54221:18;54254:8;54242:9;;:20;;;;:::i;:::-;54221:41;;54298:10;54285:9;:23;;54277:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;54354:14;;;;;;;;;;;:23;;:35;54378:10;54354:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54406:15;54424:19;:9;:17;:19::i;:::-;54406:37;;54463:9;54458:106;54482:8;54478:1;:12;54458:106;;;54516:32;54524:10;54546:1;54536:7;:11;;;;:::i;:::-;54516:7;:32::i;:::-;54492:3;;;;;:::i;:::-;;;;54458:106;;;;54006:569;;;;53191:1391:::0;:::o;31769:155::-;31864:52;31883:12;:10;:12::i;:::-;31897:8;31907;31864:18;:52::i;:::-;31769:155;;:::o;32892:328::-;33067:41;33086:12;:10;:12::i;:::-;33100:7;33067:18;:41::i;:::-;33059:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33173:39;33187:4;33193:2;33197:7;33206:5;33173:13;:39::i;:::-;32892:328;;;;:::o;56313:197::-;56404:13;56461:10;:8;:10::i;:::-;56473:18;:7;:16;:18::i;:::-;56444:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56430:72;;56313:197;;;:::o;31995:164::-;32092:4;32116:18;:25;32135:5;32116:25;;;;;;;;;;;;;;;:35;32142:8;32116:35;;;;;;;;;;;;;;;;;;;;;;;;;32109:42;;31995:164;;;;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;55727:100::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55805:14:::1;;;;;;;;;;;55804:15;55787:14;;:32;;;;;;;;;;;;;;;;;;55727:100::o:0;56201:104::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56285:12:::1;56273:9;:24;;;;56201:104:::0;:::o;52827:40::-;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;46062:224::-;46164:4;46203:35;46188:50;;;:11;:50;;;;:90;;;;46242:36;46266:11;46242:23;:36::i;:::-;46188:90;46181:97;;46062:224;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;55379:132::-;55445:25;55458:2;55462:7;55445:12;:25::i;:::-;55481:22;:10;:20;:22::i;:::-;55379:132;;:::o;34730:127::-;34795:4;34847:1;34819:30;;:7;:16;34827:7;34819:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34812:37;;34730:127;;;:::o;38876:174::-;38978:2;38951:15;:24;38967:7;38951:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39034:7;39030:2;38996:46;;39005:23;39020:7;39005:14;:23::i;:::-;38996:46;;;;;;;;;;;;38876:174;;:::o;35024:348::-;35117:4;35142:16;35150:7;35142;:16::i;:::-;35134:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35218:13;35234:23;35249:7;35234:14;:23::i;:::-;35218:39;;35287:5;35276:16;;:7;:16;;;:51;;;;35320:7;35296:31;;:20;35308:7;35296:11;:20::i;:::-;:31;;;35276:51;:87;;;;35331:32;35348:5;35355:7;35331:16;:32::i;:::-;35276:87;35268:96;;;35024:348;;;;:::o;38133:625::-;38292:4;38265:31;;:23;38280:7;38265:14;:23::i;:::-;:31;;;38257:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38371:1;38357:16;;:2;:16;;;;38349:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38427:39;38448:4;38454:2;38458:7;38427:20;:39::i;:::-;38531:29;38548:1;38552:7;38531:8;:29::i;:::-;38592:1;38573:9;:15;38583:4;38573:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38621:1;38604:9;:13;38614:2;38604:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38652:2;38633:7;:16;38641:7;38633:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38691:7;38687:2;38672:27;;38681:4;38672:27;;;;;;;;;;;;38712:38;38732:4;38738:2;38742:7;38712:19;:38::i;:::-;38133:625;;;:::o;56634:115::-;56721:20;56733:7;56721:11;:20::i;:::-;56634:115;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6814:191;;:::o;55239:132::-;55305:25;55318:2;55322:7;55305:12;:25::i;:::-;55341:22;:10;:20;:22::i;:::-;55239:132;;:::o;39192:315::-;39347:8;39338:17;;:5;:17;;;;39330:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39434:8;39396:18;:25;39415:5;39396:25;;;;;;;;;;;;;;;:35;39422:8;39396:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39480:8;39458:41;;39473:5;39458:41;;;39490:8;39458:41;;;;;;:::i;:::-;;;;;;;;39192:315;;;:::o;34102:::-;34259:28;34269:4;34275:2;34279:7;34259:9;:28::i;:::-;34306:48;34329:4;34335:2;34339:7;34348:5;34306:22;:48::i;:::-;34298:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34102:315;;;;:::o;56518:108::-;56570:13;56603:15;56596:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56518:108;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;28972:305::-;29074:4;29126:25;29111:40;;;:11;:40;;;;:105;;;;29183:33;29168:48;;;:11;:48;;;;29111:105;:158;;;;29233:36;29257:11;29233:23;:36::i;:::-;29111:158;29091:178;;28972:305;;;:::o;55519:200::-;55609:11;;55598:7;:22;;55590:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;55657:22;55667:2;55671:7;55657:9;:22::i;:::-;55690:21;:9;:19;:21::i;:::-;55519:200;;:::o;56757:197::-;56901:45;56928:4;56934:2;56938:7;56901:26;:45::i;:::-;56757:197;;;:::o;41954:125::-;;;;:::o;44838:206::-;44907:20;44919:7;44907:11;:20::i;:::-;44981:1;44950:10;:19;44961:7;44950:19;;;;;;;;;;;44944:33;;;;;:::i;:::-;;;:38;44940:97;;45006:10;:19;45017:7;45006:19;;;;;;;;;;;;44999:26;;;;:::i;:::-;44940:97;44838:206;:::o;40072:799::-;40227:4;40248:15;:2;:13;;;:15::i;:::-;40244:620;;;40300:2;40284:36;;;40321:12;:10;:12::i;:::-;40335:4;40341:7;40350:5;40284:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40280:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40543:1;40526:6;:13;:18;40522:272;;;40569:60;;;;;;;;;;:::i;:::-;;;;;;;;40522:272;40744:6;40738:13;40729:6;40725:2;40721:15;40714:38;40280:529;40417:41;;;40407:51;;;:6;:51;;;;40400:58;;;;;40244:620;40848:4;40841:11;;40072:799;;;;;;;:::o;20646:157::-;20731:4;20770:25;20755:40;;;:11;:40;;;;20748:47;;20646:157;;;:::o;35714:110::-;35790:26;35800:2;35804:7;35790:26;;;;;;;;;;;;:9;:26::i;:::-;35714:110;;:::o;42764:275::-;42908:45;42935:4;42941:2;42945:7;42908:26;:45::i;:::-;42975:8;:6;:8::i;:::-;42974:9;42966:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42764:275;;;:::o;37376:420::-;37436:13;37452:23;37467:7;37452:14;:23::i;:::-;37436:39;;37488:48;37509:5;37524:1;37528:7;37488:20;:48::i;:::-;37577:29;37594:1;37598:7;37577:8;:29::i;:::-;37639:1;37619:9;:16;37629:5;37619:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;37658:7;:16;37666:7;37658:16;;;;;;;;;;;;37651:23;;;;;;;;;;;37720:7;37716:1;37692:36;;37701:5;37692:36;;;;;;;;;;;;37741:47;37761:5;37776:1;37780:7;37741:19;:47::i;:::-;37376:420;;:::o;10563:326::-;10623:4;10880:1;10858:7;:19;;;:23;10851:30;;10563:326;;;:::o;36051:321::-;36181:18;36187:2;36191:7;36181:5;:18::i;:::-;36232:54;36263:1;36267:2;36271:7;36280:5;36232:22;:54::i;:::-;36210:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36051:321;;;:::o;47738:589::-;47882:45;47909:4;47915:2;47919:7;47882:26;:45::i;:::-;47960:1;47944:18;;:4;:18;;;47940:187;;;47979:40;48011:7;47979:31;:40::i;:::-;47940:187;;;48049:2;48041:10;;:4;:10;;;48037:90;;48068:47;48101:4;48107:7;48068:32;:47::i;:::-;48037:90;47940:187;48155:1;48141:16;;:2;:16;;;48137:183;;;48174:45;48211:7;48174:36;:45::i;:::-;48137:183;;;48247:4;48241:10;;:2;:10;;;48237:83;;48268:40;48296:2;48300:7;48268:27;:40::i;:::-;48237:83;48137:183;47738:589;;;:::o;36708:439::-;36802:1;36788:16;;:2;:16;;;;36780:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36861:16;36869:7;36861;:16::i;:::-;36860:17;36852:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36923:45;36952:1;36956:2;36960:7;36923:20;:45::i;:::-;36998:1;36981:9;:13;36991:2;36981:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37029:2;37010:7;:16;37018:7;37010:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37074:7;37070:2;37049:33;;37066:1;37049:33;;;;;;;;;;;;37095:44;37123:1;37127:2;37131:7;37095:19;:44::i;:::-;36708:439;;:::o;41443:126::-;;;;:::o;49050:164::-;49154:10;:17;;;;49127:15;:24;49143:7;49127:24;;;;;;;;;;;:44;;;;49182:10;49198:7;49182:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49050:164;:::o;49841:988::-;50107:22;50157:1;50132:22;50149:4;50132:16;:22::i;:::-;:26;;;;:::i;:::-;50107:51;;50169:18;50190:17;:26;50208:7;50190:26;;;;;;;;;;;;50169:47;;50337:14;50323:10;:28;50319:328;;50368:19;50390:12;:18;50403:4;50390:18;;;;;;;;;;;;;;;:34;50409:14;50390:34;;;;;;;;;;;;50368:56;;50474:11;50441:12;:18;50454:4;50441:18;;;;;;;;;;;;;;;:30;50460:10;50441:30;;;;;;;;;;;:44;;;;50591:10;50558:17;:30;50576:11;50558:30;;;;;;;;;;;:43;;;;50319:328;;50743:17;:26;50761:7;50743:26;;;;;;;;;;;50736:33;;;50787:12;:18;50800:4;50787:18;;;;;;;;;;;;;;;:34;50806:14;50787:34;;;;;;;;;;;50780:41;;;49841:988;;;;:::o;51124:1079::-;51377:22;51422:1;51402:10;:17;;;;:21;;;;:::i;:::-;51377:46;;51434:18;51455:15;:24;51471:7;51455:24;;;;;;;;;;;;51434:45;;51806:19;51828:10;51839:14;51828:26;;;;;;;;;;;;;;;;;;;;;;;;51806:48;;51892:11;51867:10;51878;51867:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;52003:10;51972:15;:28;51988:11;51972:28;;;;;;;;;;;:41;;;;52144:15;:24;52160:7;52144:24;;;;;;;;;;;52137:31;;;52179:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51124:1079;;;;:::o;48628:221::-;48713:14;48730:20;48747:2;48730:16;:20::i;:::-;48713:37;;48788:7;48761:12;:16;48774:2;48761:16;;;;;;;;;;;;;;;:24;48778:6;48761:24;;;;;;;;;;;:34;;;;48835:6;48806:17;:26;48824:7;48806:26;;;;;;;;;;;:35;;;;48628:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::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:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;518:367::-;591:8;601:6;651:3;644:4;636:6;632:17;628:27;618:2;;669:1;666;659:12;618:2;705:6;692:20;682:30;;735:18;727:6;724:30;721:2;;;767:1;764;757:12;721:2;804:4;796:6;792:17;780:29;;858:3;850:4;842:6;838:17;828:8;824:32;821:41;818:2;;;875:1;872;865:12;818:2;608:277;;;;;:::o;891:133::-;934:5;972:6;959:20;950:29;;988:30;1012:5;988:30;:::i;:::-;940:84;;;;:::o;1030:137::-;1075:5;1113:6;1100:20;1091:29;;1129:32;1155:5;1129:32;:::i;:::-;1081:86;;;;:::o;1173:141::-;1229:5;1260:6;1254:13;1245:22;;1276:32;1302:5;1276:32;:::i;:::-;1235:79;;;;:::o;1333:271::-;1388:5;1437:3;1430:4;1422:6;1418:17;1414:27;1404:2;;1455:1;1452;1445:12;1404:2;1495:6;1482:20;1520:78;1594:3;1586:6;1579:4;1571:6;1567:17;1520:78;:::i;:::-;1511:87;;1394:210;;;;;:::o;1624:352::-;1682:8;1692:6;1742:3;1735:4;1727:6;1723:17;1719:27;1709:2;;1760:1;1757;1750:12;1709:2;1796:6;1783:20;1773:30;;1826:18;1818:6;1815:30;1812:2;;;1858:1;1855;1848:12;1812:2;1895:4;1887:6;1883:17;1871:29;;1949:3;1941:4;1933:6;1929:17;1919:8;1915:32;1912:41;1909:2;;;1966:1;1963;1956:12;1909:2;1699:277;;;;;:::o;1982:139::-;2028:5;2066:6;2053:20;2044:29;;2082:33;2109:5;2082:33;:::i;:::-;2034:87;;;;:::o;2127:262::-;2186:6;2235:2;2223:9;2214:7;2210:23;2206:32;2203:2;;;2251:1;2248;2241:12;2203:2;2294:1;2319:53;2364:7;2355:6;2344:9;2340:22;2319:53;:::i;:::-;2309:63;;2265:117;2193:196;;;;:::o;2395:407::-;2463:6;2471;2520:2;2508:9;2499:7;2495:23;2491:32;2488:2;;;2536:1;2533;2526:12;2488:2;2579:1;2604:53;2649:7;2640:6;2629:9;2625:22;2604:53;:::i;:::-;2594:63;;2550:117;2706:2;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2677:118;2478:324;;;;;:::o;2808:552::-;2885:6;2893;2901;2950:2;2938:9;2929:7;2925:23;2921:32;2918:2;;;2966:1;2963;2956:12;2918:2;3009:1;3034:53;3079:7;3070:6;3059:9;3055:22;3034:53;:::i;:::-;3024:63;;2980:117;3136:2;3162:53;3207:7;3198:6;3187:9;3183:22;3162:53;:::i;:::-;3152:63;;3107:118;3264:2;3290:53;3335:7;3326:6;3315:9;3311:22;3290:53;:::i;:::-;3280:63;;3235:118;2908:452;;;;;:::o;3366:809::-;3461:6;3469;3477;3485;3534:3;3522:9;3513:7;3509:23;3505:33;3502:2;;;3551:1;3548;3541:12;3502:2;3594:1;3619:53;3664:7;3655:6;3644:9;3640:22;3619:53;:::i;:::-;3609:63;;3565:117;3721:2;3747:53;3792:7;3783:6;3772:9;3768:22;3747:53;:::i;:::-;3737:63;;3692:118;3849:2;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3820:118;4005:2;3994:9;3990:18;3977:32;4036:18;4028:6;4025:30;4022:2;;;4068:1;4065;4058:12;4022:2;4096:62;4150:7;4141:6;4130:9;4126:22;4096:62;:::i;:::-;4086:72;;3948:220;3492:683;;;;;;;:::o;4181:401::-;4246:6;4254;4303:2;4291:9;4282:7;4278:23;4274:32;4271:2;;;4319:1;4316;4309:12;4271:2;4362:1;4387:53;4432:7;4423:6;4412:9;4408:22;4387:53;:::i;:::-;4377:63;;4333:117;4489:2;4515:50;4557:7;4548:6;4537:9;4533:22;4515:50;:::i;:::-;4505:60;;4460:115;4261:321;;;;;:::o;4588:407::-;4656:6;4664;4713:2;4701:9;4692:7;4688:23;4684:32;4681:2;;;4729:1;4726;4719:12;4681:2;4772:1;4797:53;4842:7;4833:6;4822:9;4818:22;4797:53;:::i;:::-;4787:63;;4743:117;4899:2;4925:53;4970:7;4961:6;4950:9;4946:22;4925:53;:::i;:::-;4915:63;;4870:118;4671:324;;;;;:::o;5001:425::-;5087:6;5095;5144:2;5132:9;5123:7;5119:23;5115:32;5112:2;;;5160:1;5157;5150:12;5112:2;5231:1;5220:9;5216:17;5203:31;5261:18;5253:6;5250:30;5247:2;;;5293:1;5290;5283:12;5247:2;5329:80;5401:7;5392:6;5381:9;5377:22;5329:80;:::i;:::-;5311:98;;;;5174:245;5102:324;;;;;:::o;5432:260::-;5490:6;5539:2;5527:9;5518:7;5514:23;5510:32;5507:2;;;5555:1;5552;5545:12;5507:2;5598:1;5623:52;5667:7;5658:6;5647:9;5643:22;5623:52;:::i;:::-;5613:62;;5569:116;5497:195;;;;:::o;5698:282::-;5767:6;5816:2;5804:9;5795:7;5791:23;5787:32;5784:2;;;5832:1;5829;5822:12;5784:2;5875:1;5900:63;5955:7;5946:6;5935:9;5931:22;5900:63;:::i;:::-;5890:73;;5846:127;5774:206;;;;:::o;5986:395::-;6057:6;6065;6114:2;6102:9;6093:7;6089:23;6085:32;6082:2;;;6130:1;6127;6120:12;6082:2;6201:1;6190:9;6186:17;6173:31;6231:18;6223:6;6220:30;6217:2;;;6263:1;6260;6253:12;6217:2;6299:65;6356:7;6347:6;6336:9;6332:22;6299:65;:::i;:::-;6281:83;;;;6144:230;6072:309;;;;;:::o;6387:262::-;6446:6;6495:2;6483:9;6474:7;6470:23;6466:32;6463:2;;;6511:1;6508;6501:12;6463:2;6554:1;6579:53;6624:7;6615:6;6604:9;6600:22;6579:53;:::i;:::-;6569:63;;6525:117;6453:196;;;;:::o;6655:142::-;6758:32;6784:5;6758:32;:::i;:::-;6753:3;6746:45;6736:61;;:::o;6803:118::-;6890:24;6908:5;6890:24;:::i;:::-;6885:3;6878:37;6868:53;;:::o;6927:109::-;7008:21;7023:5;7008:21;:::i;:::-;7003:3;6996:34;6986:50;;:::o;7042:360::-;7128:3;7156:38;7188:5;7156:38;:::i;:::-;7210:70;7273:6;7268:3;7210:70;:::i;:::-;7203:77;;7289:52;7334:6;7329:3;7322:4;7315:5;7311:16;7289:52;:::i;:::-;7366:29;7388:6;7366:29;:::i;:::-;7361:3;7357:39;7350:46;;7132:270;;;;;:::o;7408:364::-;7496:3;7524:39;7557:5;7524:39;:::i;:::-;7579:71;7643:6;7638:3;7579:71;:::i;:::-;7572:78;;7659:52;7704:6;7699:3;7692:4;7685:5;7681:16;7659:52;:::i;:::-;7736:29;7758:6;7736:29;:::i;:::-;7731:3;7727:39;7720:46;;7500:272;;;;;:::o;7778:377::-;7884:3;7912:39;7945:5;7912:39;:::i;:::-;7967:89;8049:6;8044:3;7967:89;:::i;:::-;7960:96;;8065:52;8110:6;8105:3;8098:4;8091:5;8087:16;8065:52;:::i;:::-;8142:6;8137:3;8133:16;8126:23;;7888:267;;;;;:::o;8161:366::-;8303:3;8324:67;8388:2;8383:3;8324:67;:::i;:::-;8317:74;;8400:93;8489:3;8400:93;:::i;:::-;8518:2;8513:3;8509:12;8502:19;;8307:220;;;:::o;8533:366::-;8675:3;8696:67;8760:2;8755:3;8696:67;:::i;:::-;8689:74;;8772:93;8861:3;8772:93;:::i;:::-;8890:2;8885:3;8881:12;8874:19;;8679:220;;;:::o;8905:366::-;9047:3;9068:67;9132:2;9127:3;9068:67;:::i;:::-;9061:74;;9144:93;9233:3;9144:93;:::i;:::-;9262:2;9257:3;9253:12;9246:19;;9051:220;;;:::o;9277:366::-;9419:3;9440:67;9504:2;9499:3;9440:67;:::i;:::-;9433:74;;9516:93;9605:3;9516:93;:::i;:::-;9634:2;9629:3;9625:12;9618:19;;9423:220;;;:::o;9649:366::-;9791:3;9812:67;9876:2;9871:3;9812:67;:::i;:::-;9805:74;;9888:93;9977:3;9888:93;:::i;:::-;10006:2;10001:3;9997:12;9990:19;;9795:220;;;:::o;10021:366::-;10163:3;10184:67;10248:2;10243:3;10184:67;:::i;:::-;10177:74;;10260:93;10349:3;10260:93;:::i;:::-;10378:2;10373:3;10369:12;10362:19;;10167:220;;;:::o;10393:366::-;10535:3;10556:67;10620:2;10615:3;10556:67;:::i;:::-;10549:74;;10632:93;10721:3;10632:93;:::i;:::-;10750:2;10745:3;10741:12;10734:19;;10539:220;;;:::o;10765:366::-;10907:3;10928:67;10992:2;10987:3;10928:67;:::i;:::-;10921:74;;11004:93;11093:3;11004:93;:::i;:::-;11122:2;11117:3;11113:12;11106:19;;10911:220;;;:::o;11137:366::-;11279:3;11300:67;11364:2;11359:3;11300:67;:::i;:::-;11293:74;;11376:93;11465:3;11376:93;:::i;:::-;11494:2;11489:3;11485:12;11478:19;;11283:220;;;:::o;11509:366::-;11651:3;11672:67;11736:2;11731:3;11672:67;:::i;:::-;11665:74;;11748:93;11837:3;11748:93;:::i;:::-;11866:2;11861:3;11857:12;11850:19;;11655:220;;;:::o;11881:366::-;12023:3;12044:67;12108:2;12103:3;12044:67;:::i;:::-;12037:74;;12120:93;12209:3;12120:93;:::i;:::-;12238:2;12233:3;12229:12;12222:19;;12027:220;;;:::o;12253:366::-;12395:3;12416:67;12480:2;12475:3;12416:67;:::i;:::-;12409:74;;12492:93;12581:3;12492:93;:::i;:::-;12610:2;12605:3;12601:12;12594:19;;12399:220;;;:::o;12625:366::-;12767:3;12788:67;12852:2;12847:3;12788:67;:::i;:::-;12781:74;;12864:93;12953:3;12864:93;:::i;:::-;12982:2;12977:3;12973:12;12966:19;;12771:220;;;:::o;12997:366::-;13139:3;13160:67;13224:2;13219:3;13160:67;:::i;:::-;13153:74;;13236:93;13325:3;13236:93;:::i;:::-;13354:2;13349:3;13345:12;13338:19;;13143:220;;;:::o;13369:366::-;13511:3;13532:67;13596:2;13591:3;13532:67;:::i;:::-;13525:74;;13608:93;13697:3;13608:93;:::i;:::-;13726:2;13721:3;13717:12;13710:19;;13515:220;;;:::o;13741:366::-;13883:3;13904:67;13968:2;13963:3;13904:67;:::i;:::-;13897:74;;13980:93;14069:3;13980:93;:::i;:::-;14098:2;14093:3;14089:12;14082:19;;13887:220;;;:::o;14113:366::-;14255:3;14276:67;14340:2;14335:3;14276:67;:::i;:::-;14269:74;;14352:93;14441:3;14352:93;:::i;:::-;14470:2;14465:3;14461:12;14454:19;;14259:220;;;:::o;14485:366::-;14627:3;14648:67;14712:2;14707:3;14648:67;:::i;:::-;14641:74;;14724:93;14813:3;14724:93;:::i;:::-;14842:2;14837:3;14833:12;14826:19;;14631:220;;;:::o;14857:400::-;15017:3;15038:84;15120:1;15115:3;15038:84;:::i;:::-;15031:91;;15131:93;15220:3;15131:93;:::i;:::-;15249:1;15244:3;15240:11;15233:18;;15021:236;;;:::o;15263:366::-;15405:3;15426:67;15490:2;15485:3;15426:67;:::i;:::-;15419:74;;15502:93;15591:3;15502:93;:::i;:::-;15620:2;15615:3;15611:12;15604:19;;15409:220;;;:::o;15635:366::-;15777:3;15798:67;15862:2;15857:3;15798:67;:::i;:::-;15791:74;;15874:93;15963:3;15874:93;:::i;:::-;15992:2;15987:3;15983:12;15976:19;;15781:220;;;:::o;16007:366::-;16149:3;16170:67;16234:2;16229:3;16170:67;:::i;:::-;16163:74;;16246:93;16335:3;16246:93;:::i;:::-;16364:2;16359:3;16355:12;16348:19;;16153:220;;;:::o;16379:366::-;16521:3;16542:67;16606:2;16601:3;16542:67;:::i;:::-;16535:74;;16618:93;16707:3;16618:93;:::i;:::-;16736:2;16731:3;16727:12;16720:19;;16525:220;;;:::o;16751:366::-;16893:3;16914:67;16978:2;16973:3;16914:67;:::i;:::-;16907:74;;16990:93;17079:3;16990:93;:::i;:::-;17108:2;17103:3;17099:12;17092:19;;16897:220;;;:::o;17123:366::-;17265:3;17286:67;17350:2;17345:3;17286:67;:::i;:::-;17279:74;;17362:93;17451:3;17362:93;:::i;:::-;17480:2;17475:3;17471:12;17464:19;;17269:220;;;:::o;17495:366::-;17637:3;17658:67;17722:2;17717:3;17658:67;:::i;:::-;17651:74;;17734:93;17823:3;17734:93;:::i;:::-;17852:2;17847:3;17843:12;17836:19;;17641:220;;;:::o;17867:366::-;18009:3;18030:67;18094:2;18089:3;18030:67;:::i;:::-;18023:74;;18106:93;18195:3;18106:93;:::i;:::-;18224:2;18219:3;18215:12;18208:19;;18013:220;;;:::o;18239:366::-;18381:3;18402:67;18466:2;18461:3;18402:67;:::i;:::-;18395:74;;18478:93;18567:3;18478:93;:::i;:::-;18596:2;18591:3;18587:12;18580:19;;18385:220;;;:::o;18611:118::-;18698:24;18716:5;18698:24;:::i;:::-;18693:3;18686:37;18676:53;;:::o;18735:701::-;19016:3;19038:95;19129:3;19120:6;19038:95;:::i;:::-;19031:102;;19150:95;19241:3;19232:6;19150:95;:::i;:::-;19143:102;;19262:148;19406:3;19262:148;:::i;:::-;19255:155;;19427:3;19420:10;;19020:416;;;;;:::o;19442:222::-;19535:4;19573:2;19562:9;19558:18;19550:26;;19586:71;19654:1;19643:9;19639:17;19630:6;19586:71;:::i;:::-;19540:124;;;;:::o;19670:254::-;19779:4;19817:2;19806:9;19802:18;19794:26;;19830:87;19914:1;19903:9;19899:17;19890:6;19830:87;:::i;:::-;19784:140;;;;:::o;19930:640::-;20125:4;20163:3;20152:9;20148:19;20140:27;;20177:71;20245:1;20234:9;20230:17;20221:6;20177:71;:::i;:::-;20258:72;20326:2;20315:9;20311:18;20302:6;20258:72;:::i;:::-;20340;20408:2;20397:9;20393:18;20384:6;20340:72;:::i;:::-;20459:9;20453:4;20449:20;20444:2;20433:9;20429:18;20422:48;20487:76;20558:4;20549:6;20487:76;:::i;:::-;20479:84;;20130:440;;;;;;;:::o;20576:210::-;20663:4;20701:2;20690:9;20686:18;20678:26;;20714:65;20776:1;20765:9;20761:17;20752:6;20714:65;:::i;:::-;20668:118;;;;:::o;20792:313::-;20905:4;20943:2;20932:9;20928:18;20920:26;;20992:9;20986:4;20982:20;20978:1;20967:9;20963:17;20956:47;21020:78;21093:4;21084:6;21020:78;:::i;:::-;21012:86;;20910:195;;;;:::o;21111:419::-;21277:4;21315:2;21304:9;21300:18;21292:26;;21364:9;21358:4;21354:20;21350:1;21339:9;21335:17;21328:47;21392:131;21518:4;21392:131;:::i;:::-;21384:139;;21282:248;;;:::o;21536:419::-;21702:4;21740:2;21729:9;21725:18;21717:26;;21789:9;21783:4;21779:20;21775:1;21764:9;21760:17;21753:47;21817:131;21943:4;21817:131;:::i;:::-;21809:139;;21707:248;;;:::o;21961:419::-;22127:4;22165:2;22154:9;22150:18;22142:26;;22214:9;22208:4;22204:20;22200:1;22189:9;22185:17;22178:47;22242:131;22368:4;22242:131;:::i;:::-;22234:139;;22132:248;;;:::o;22386:419::-;22552:4;22590:2;22579:9;22575:18;22567:26;;22639:9;22633:4;22629:20;22625:1;22614:9;22610:17;22603:47;22667:131;22793:4;22667:131;:::i;:::-;22659:139;;22557:248;;;:::o;22811:419::-;22977:4;23015:2;23004:9;23000:18;22992:26;;23064:9;23058:4;23054:20;23050:1;23039:9;23035:17;23028:47;23092:131;23218:4;23092:131;:::i;:::-;23084:139;;22982:248;;;:::o;23236:419::-;23402:4;23440:2;23429:9;23425:18;23417:26;;23489:9;23483:4;23479:20;23475:1;23464:9;23460:17;23453:47;23517:131;23643:4;23517:131;:::i;:::-;23509:139;;23407:248;;;:::o;23661:419::-;23827:4;23865:2;23854:9;23850:18;23842:26;;23914:9;23908:4;23904:20;23900:1;23889:9;23885:17;23878:47;23942:131;24068:4;23942:131;:::i;:::-;23934:139;;23832:248;;;:::o;24086:419::-;24252:4;24290:2;24279:9;24275:18;24267:26;;24339:9;24333:4;24329:20;24325:1;24314:9;24310:17;24303:47;24367:131;24493:4;24367:131;:::i;:::-;24359:139;;24257:248;;;:::o;24511:419::-;24677:4;24715:2;24704:9;24700:18;24692:26;;24764:9;24758:4;24754:20;24750:1;24739:9;24735:17;24728:47;24792:131;24918:4;24792:131;:::i;:::-;24784:139;;24682:248;;;:::o;24936:419::-;25102:4;25140:2;25129:9;25125:18;25117:26;;25189:9;25183:4;25179:20;25175:1;25164:9;25160:17;25153:47;25217:131;25343:4;25217:131;:::i;:::-;25209:139;;25107:248;;;:::o;25361:419::-;25527:4;25565:2;25554:9;25550:18;25542:26;;25614:9;25608:4;25604:20;25600:1;25589:9;25585:17;25578:47;25642:131;25768:4;25642:131;:::i;:::-;25634:139;;25532:248;;;:::o;25786:419::-;25952:4;25990:2;25979:9;25975:18;25967:26;;26039:9;26033:4;26029:20;26025:1;26014:9;26010:17;26003:47;26067:131;26193:4;26067:131;:::i;:::-;26059:139;;25957:248;;;:::o;26211:419::-;26377:4;26415:2;26404:9;26400:18;26392:26;;26464:9;26458:4;26454:20;26450:1;26439:9;26435:17;26428:47;26492:131;26618:4;26492:131;:::i;:::-;26484:139;;26382:248;;;:::o;26636:419::-;26802:4;26840:2;26829:9;26825:18;26817:26;;26889:9;26883:4;26879:20;26875:1;26864:9;26860:17;26853:47;26917:131;27043:4;26917:131;:::i;:::-;26909:139;;26807:248;;;:::o;27061:419::-;27227:4;27265:2;27254:9;27250:18;27242:26;;27314:9;27308:4;27304:20;27300:1;27289:9;27285:17;27278:47;27342:131;27468:4;27342:131;:::i;:::-;27334:139;;27232:248;;;:::o;27486:419::-;27652:4;27690:2;27679:9;27675:18;27667:26;;27739:9;27733:4;27729:20;27725:1;27714:9;27710:17;27703:47;27767:131;27893:4;27767:131;:::i;:::-;27759:139;;27657:248;;;:::o;27911:419::-;28077:4;28115:2;28104:9;28100:18;28092:26;;28164:9;28158:4;28154:20;28150:1;28139:9;28135:17;28128:47;28192:131;28318:4;28192:131;:::i;:::-;28184:139;;28082:248;;;:::o;28336:419::-;28502:4;28540:2;28529:9;28525:18;28517:26;;28589:9;28583:4;28579:20;28575:1;28564:9;28560:17;28553:47;28617:131;28743:4;28617:131;:::i;:::-;28609:139;;28507:248;;;:::o;28761:419::-;28927:4;28965:2;28954:9;28950:18;28942:26;;29014:9;29008:4;29004:20;29000:1;28989:9;28985:17;28978:47;29042:131;29168:4;29042:131;:::i;:::-;29034:139;;28932:248;;;:::o;29186:419::-;29352:4;29390:2;29379:9;29375:18;29367:26;;29439:9;29433:4;29429:20;29425:1;29414:9;29410:17;29403:47;29467:131;29593:4;29467:131;:::i;:::-;29459:139;;29357:248;;;:::o;29611:419::-;29777:4;29815:2;29804:9;29800:18;29792:26;;29864:9;29858:4;29854:20;29850:1;29839:9;29835:17;29828:47;29892:131;30018:4;29892:131;:::i;:::-;29884:139;;29782:248;;;:::o;30036:419::-;30202:4;30240:2;30229:9;30225:18;30217:26;;30289:9;30283:4;30279:20;30275:1;30264:9;30260:17;30253:47;30317:131;30443:4;30317:131;:::i;:::-;30309:139;;30207:248;;;:::o;30461:419::-;30627:4;30665:2;30654:9;30650:18;30642:26;;30714:9;30708:4;30704:20;30700:1;30689:9;30685:17;30678:47;30742:131;30868:4;30742:131;:::i;:::-;30734:139;;30632:248;;;:::o;30886:419::-;31052:4;31090:2;31079:9;31075:18;31067:26;;31139:9;31133:4;31129:20;31125:1;31114:9;31110:17;31103:47;31167:131;31293:4;31167:131;:::i;:::-;31159:139;;31057:248;;;:::o;31311:419::-;31477:4;31515:2;31504:9;31500:18;31492:26;;31564:9;31558:4;31554:20;31550:1;31539:9;31535:17;31528:47;31592:131;31718:4;31592:131;:::i;:::-;31584:139;;31482:248;;;:::o;31736:419::-;31902:4;31940:2;31929:9;31925:18;31917:26;;31989:9;31983:4;31979:20;31975:1;31964:9;31960:17;31953:47;32017:131;32143:4;32017:131;:::i;:::-;32009:139;;31907:248;;;:::o;32161:419::-;32327:4;32365:2;32354:9;32350:18;32342:26;;32414:9;32408:4;32404:20;32400:1;32389:9;32385:17;32378:47;32442:131;32568:4;32442:131;:::i;:::-;32434:139;;32332:248;;;:::o;32586:222::-;32679:4;32717:2;32706:9;32702:18;32694:26;;32730:71;32798:1;32787:9;32783:17;32774:6;32730:71;:::i;:::-;32684:124;;;;:::o;32814:129::-;32848:6;32875:20;;:::i;:::-;32865:30;;32904:33;32932:4;32924:6;32904:33;:::i;:::-;32855:88;;;:::o;32949:75::-;32982:6;33015:2;33009:9;32999:19;;32989:35;:::o;33030:307::-;33091:4;33181:18;33173:6;33170:30;33167:2;;;33203:18;;:::i;:::-;33167:2;33241:29;33263:6;33241:29;:::i;:::-;33233:37;;33325:4;33319;33315:15;33307:23;;33096:241;;;:::o;33343:98::-;33394:6;33428:5;33422:12;33412:22;;33401:40;;;:::o;33447:99::-;33499:6;33533:5;33527:12;33517:22;;33506:40;;;:::o;33552:168::-;33635:11;33669:6;33664:3;33657:19;33709:4;33704:3;33700:14;33685:29;;33647:73;;;;:::o;33726:169::-;33810:11;33844:6;33839:3;33832:19;33884:4;33879:3;33875:14;33860:29;;33822:73;;;;:::o;33901:148::-;34003:11;34040:3;34025:18;;34015:34;;;;:::o;34055:305::-;34095:3;34114:20;34132:1;34114:20;:::i;:::-;34109:25;;34148:20;34166:1;34148:20;:::i;:::-;34143:25;;34302:1;34234:66;34230:74;34227:1;34224:81;34221:2;;;34308:18;;:::i;:::-;34221:2;34352:1;34349;34345:9;34338:16;;34099:261;;;;:::o;34366:185::-;34406:1;34423:20;34441:1;34423:20;:::i;:::-;34418:25;;34457:20;34475:1;34457:20;:::i;:::-;34452:25;;34496:1;34486:2;;34501:18;;:::i;:::-;34486:2;34543:1;34540;34536:9;34531:14;;34408:143;;;;:::o;34557:348::-;34597:7;34620:20;34638:1;34620:20;:::i;:::-;34615:25;;34654:20;34672:1;34654:20;:::i;:::-;34649:25;;34842:1;34774:66;34770:74;34767:1;34764:81;34759:1;34752:9;34745:17;34741:105;34738:2;;;34849:18;;:::i;:::-;34738:2;34897:1;34894;34890:9;34879:20;;34605:300;;;;:::o;34911:191::-;34951:4;34971:20;34989:1;34971:20;:::i;:::-;34966:25;;35005:20;35023:1;35005:20;:::i;:::-;35000:25;;35044:1;35041;35038:8;35035:2;;;35049:18;;:::i;:::-;35035:2;35094:1;35091;35087:9;35079:17;;34956:146;;;;:::o;35108:96::-;35145:7;35174:24;35192:5;35174:24;:::i;:::-;35163:35;;35153:51;;;:::o;35210:104::-;35255:7;35284:24;35302:5;35284:24;:::i;:::-;35273:35;;35263:51;;;:::o;35320:90::-;35354:7;35397:5;35390:13;35383:21;35372:32;;35362:48;;;:::o;35416:149::-;35452:7;35492:66;35485:5;35481:78;35470:89;;35460:105;;;:::o;35571:126::-;35608:7;35648:42;35641:5;35637:54;35626:65;;35616:81;;;:::o;35703:77::-;35740:7;35769:5;35758:16;;35748:32;;;:::o;35786:154::-;35870:6;35865:3;35860;35847:30;35932:1;35923:6;35918:3;35914:16;35907:27;35837:103;;;:::o;35946:307::-;36014:1;36024:113;36038:6;36035:1;36032:13;36024:113;;;36123:1;36118:3;36114:11;36108:18;36104:1;36099:3;36095:11;36088:39;36060:2;36057:1;36053:10;36048:15;;36024:113;;;36155:6;36152:1;36149:13;36146:2;;;36235:1;36226:6;36221:3;36217:16;36210:27;36146:2;35995:258;;;;:::o;36259:320::-;36303:6;36340:1;36334:4;36330:12;36320:22;;36387:1;36381:4;36377:12;36408:18;36398:2;;36464:4;36456:6;36452:17;36442:27;;36398:2;36526;36518:6;36515:14;36495:18;36492:38;36489:2;;;36545:18;;:::i;:::-;36489:2;36310:269;;;;:::o;36585:281::-;36668:27;36690:4;36668:27;:::i;:::-;36660:6;36656:40;36798:6;36786:10;36783:22;36762:18;36750:10;36747:34;36744:62;36741:2;;;36809:18;;:::i;:::-;36741:2;36849:10;36845:2;36838:22;36628:238;;;:::o;36872:233::-;36911:3;36934:24;36952:5;36934:24;:::i;:::-;36925:33;;36980:66;36973:5;36970:77;36967:2;;;37050:18;;:::i;:::-;36967:2;37097:1;37090:5;37086:13;37079:20;;36915:190;;;:::o;37111:176::-;37143:1;37160:20;37178:1;37160:20;:::i;:::-;37155:25;;37194:20;37212:1;37194:20;:::i;:::-;37189:25;;37233:1;37223:2;;37238:18;;:::i;:::-;37223:2;37279:1;37276;37272:9;37267:14;;37145:142;;;;:::o;37293:180::-;37341:77;37338:1;37331:88;37438:4;37435:1;37428:15;37462:4;37459:1;37452:15;37479:180;37527:77;37524:1;37517:88;37624:4;37621:1;37614:15;37648:4;37645:1;37638:15;37665:180;37713:77;37710:1;37703:88;37810:4;37807:1;37800:15;37834:4;37831:1;37824:15;37851:180;37899:77;37896:1;37889:88;37996:4;37993:1;37986:15;38020:4;38017:1;38010:15;38037:102;38078:6;38129:2;38125:7;38120:2;38113:5;38109:14;38105:28;38095:38;;38085:54;;;:::o;38145:230::-;38285:34;38281:1;38273:6;38269:14;38262:58;38354:13;38349:2;38341:6;38337:15;38330:38;38251:124;:::o;38381:174::-;38521:26;38517:1;38509:6;38505:14;38498:50;38487:68;:::o;38561:230::-;38701:34;38697:1;38689:6;38685:14;38678:58;38770:13;38765:2;38757:6;38753:15;38746:38;38667:124;:::o;38797:237::-;38937:34;38933:1;38925:6;38921:14;38914:58;39006:20;39001:2;38993:6;38989:15;38982:45;38903:131;:::o;39040:225::-;39180:34;39176:1;39168:6;39164:14;39157:58;39249:8;39244:2;39236:6;39232:15;39225:33;39146:119;:::o;39271:224::-;39411:34;39407:1;39399:6;39395:14;39388:58;39480:7;39475:2;39467:6;39463:15;39456:32;39377:118;:::o;39501:178::-;39641:30;39637:1;39629:6;39625:14;39618:54;39607:72;:::o;39685:169::-;39825:21;39821:1;39813:6;39809:14;39802:45;39791:63;:::o;39860:223::-;40000:34;39996:1;39988:6;39984:14;39977:58;40069:6;40064:2;40056:6;40052:15;40045:31;39966:117;:::o;40089:175::-;40229:27;40225:1;40217:6;40213:14;40206:51;40195:69;:::o;40270:231::-;40410:34;40406:1;40398:6;40394:14;40387:58;40479:14;40474:2;40466:6;40462:15;40455:39;40376:125;:::o;40507:166::-;40647:18;40643:1;40635:6;40631:14;40624:42;40613:60;:::o;40679:243::-;40819:34;40815:1;40807:6;40803:14;40796:58;40888:26;40883:2;40875:6;40871:15;40864:51;40785:137;:::o;40928:170::-;41068:22;41064:1;41056:6;41052:14;41045:46;41034:64;:::o;41104:229::-;41244:34;41240:1;41232:6;41228:14;41221:58;41313:12;41308:2;41300:6;41296:15;41289:37;41210:123;:::o;41339:228::-;41479:34;41475:1;41467:6;41463:14;41456:58;41548:11;41543:2;41535:6;41531:15;41524:36;41445:122;:::o;41573:182::-;41713:34;41709:1;41701:6;41697:14;41690:58;41679:76;:::o;41761:231::-;41901:34;41897:1;41889:6;41885:14;41878:58;41970:14;41965:2;41957:6;41953:15;41946:39;41867:125;:::o;41998:155::-;42138:7;42134:1;42126:6;42122:14;42115:31;42104:49;:::o;42159:182::-;42299:34;42295:1;42287:6;42283:14;42276:58;42265:76;:::o;42347:220::-;42487:34;42483:1;42475:6;42471:14;42464:58;42556:3;42551:2;42543:6;42539:15;42532:28;42453:114;:::o;42573:171::-;42713:23;42709:1;42701:6;42697:14;42690:47;42679:65;:::o;42750:179::-;42890:31;42886:1;42878:6;42874:14;42867:55;42856:73;:::o;42935:236::-;43075:34;43071:1;43063:6;43059:14;43052:58;43144:19;43139:2;43131:6;43127:15;43120:44;43041:130;:::o;43177:231::-;43317:34;43313:1;43305:6;43301:14;43294:58;43386:14;43381:2;43373:6;43369:15;43362:39;43283:125;:::o;43414:170::-;43554:22;43550:1;43542:6;43538:14;43531:46;43520:64;:::o;43590:220::-;43730:34;43726:1;43718:6;43714:14;43707:58;43799:3;43794:2;43786:6;43782:15;43775:28;43696:114;:::o;43816:179::-;43956:31;43952:1;43944:6;43940:14;43933:55;43922:73;:::o;44001:122::-;44074:24;44092:5;44074:24;:::i;:::-;44067:5;44064:35;44054:2;;44113:1;44110;44103:12;44054:2;44044:79;:::o;44129:116::-;44199:21;44214:5;44199:21;:::i;:::-;44192:5;44189:32;44179:2;;44235:1;44232;44225:12;44179:2;44169:76;:::o;44251:120::-;44323:23;44340:5;44323:23;:::i;:::-;44316:5;44313:34;44303:2;;44361:1;44358;44351:12;44303:2;44293:78;:::o;44377:122::-;44450:24;44468:5;44450:24;:::i;:::-;44443:5;44440:35;44430:2;;44489:1;44486;44479:12;44430:2;44420:79;:::o
Swarm Source
ipfs://dc419bcf0a4d75c44ff5f7dfa26f789edeefb62bd50ba2846c2771332c5b05df