Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,000 BEART
Holders
2,010
Market
Volume (24H)
0.01 ETH
Min Price (24H)
$7.77 @ 0.002000 ETH
Max Price (24H)
$7.77 @ 0.002000 ETH
Other Info
Token Contract
Balance
1 BEARTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BearTings
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-11 */ // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits 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: contracts/BearTings.sol //SPDX-License-Identifier: BearTings pragma solidity ^0.8.15; // ---------------------------------------------------------------------------- // 'BearTings' NFT contract on mainnet // BearTings.sol // ---------------------------------------------------------------------------- contract BearTings is ERC721, Ownable { uint256 private nextTokenId = 1; //0: mint closed //1: private mode (freeMinters only) //2: public (limited to maxMintsPerWallet) uint8 public mintMode = 0; //0=closed; 1=private; 2=public string baseExtension = ".json"; string baseURI = "ipfs://QmVo7AsLgP3tnLvoSgC2v2tUeg47VQEo57acsEfSvpJRe2/"; uint256 public mintCost = 0; //mint price per NFT uint16 public maxSupply = 5000; //unit8 is max 256! mapping (address => uint16) public freeMinters; //remaining freeMints per address mapping (address => uint16) private minters; //counts of mints done by a address uint16 public maxMintsPerWallet = 1; //only applicable for non-freeMinters //ERC2981 bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; address private royalties_recipient; uint96 private royalties_basepoints; constructor() ERC721("BearTings", "BEART") { setRoyalties(msg.sender, 1000); } function cost(address account, uint16 nfts) public view returns (uint256) { //free for owner if (msg.sender == owner()) { return 0; } //freeMinters uint16 freeMints = freeMinters[account]; //deduct freemints if(freeMints >= nfts) { return 0; } else { return mintCost * (nfts - freeMints); } } function mintsLeft(address account) public view returns (uint16) { if (mintMode==1) { return freeMinters[account]; } else if (mintMode==2) { if(freeMinters[account]>0) { //in case it has freeMints left, he can get them return freeMinters[account]; } else { //in case it has no freeMints left if(minters[account] >= maxMintsPerWallet) { //if we have allready more minted in mode 1 than we can in total return 0; } else { return maxMintsPerWallet - minters[account]; } } } else { //mint mode 0 return 0; } } //mint (option 1) max ammount to sender address function mint() public payable { require(mintMode > 0, "ERROR: Minting closed."); uint16 _mintsLeft = mintsLeft(msg.sender); require(_mintsLeft > 0, "ERROR: No mints left for you"); mint(_mintsLeft); } //mint (option 2) to sender address function mint(uint16 _mintAmount) public payable { require(mintMode > 0, "ERROR: Minting closed."); require(_mintAmount <= mintsLeft(msg.sender), "ERROR: Too many mints requested"); //check if we got enough payment if (mintCost > 0) { require(msg.value >= cost(msg.sender, _mintAmount), "ERROR: Not enough value sent to cover cost. call cost function to assess the costs."); } doMint(msg.sender, _mintAmount); } //mint to a specific address function doMint(address to, uint16 _mintAmount) private { require(_mintAmount > 0, "ERROR: Mint amount must be > 0"); require(nextTokenId-1 + _mintAmount <= maxSupply, "ERROR: Collection is fully minted!"); for (uint16 i = 1; i <= _mintAmount; i++) { _safeMint(to, nextTokenId); nextTokenId++; //increase nextTokenId counter //if it is a freemint, decrease free mint counter for the receiver if(freeMinters[to] > 0) { freeMinters[to]--; } minters[to] = minters[to]+1; } } //Owner can mint over this function function mintByOwner(address to, uint16 mintAmount) public onlyOwner { doMint(to, mintAmount); } //ERC2981 Interface function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { return (royalties_recipient, _salePrice * royalties_basepoints / 10000); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) { if(interfaceId == _INTERFACE_ID_ERC2981) { return true; } return super.supportsInterface(interfaceId); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function tokenURI(uint256 _tokenId) public view override(ERC721) returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_baseURI(), Strings.toString(_tokenId), baseExtension)); } //from ERC721Enumerable; returns the current supply function totalSupply() public view returns (uint256) { return nextTokenId-1; } function walletOfOwner(address _owner) public view returns (uint256[] memory){ uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); uint256 counter = 0; for (uint256 i=1; i < nextTokenId; i++) { if(_exists(i) && ownerOf(i)==_owner) tokenIds[counter++] = i; } return tokenIds; } function setBaseURI(string memory newbaseURI) public onlyOwner { baseURI = newbaseURI; } function setExtension(string memory newbaseExtension) public onlyOwner { baseExtension = newbaseExtension; } function setMintCost(uint256 _mintCost) public onlyOwner { mintCost = _mintCost; } //set contract wide Royalties for ERC2981 Interface function setRoyalties(address _recipient, uint96 _basepoints) public onlyOwner { require(_basepoints<=10000, "Royalties: basepoint max is 10000 for 100% royalties"); royalties_recipient = _recipient; royalties_basepoints = _basepoints; } function setMaxMintsPerWallet(uint16 _newMaxMintAmount) public onlyOwner { maxMintsPerWallet = _newMaxMintAmount; } function setMaxSupply(uint16 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } //0: mint closed //1: private mode (freeMinters only) //2: public (limited to maxMintsPerWallet) function setMintMode(uint8 _mintMode) public onlyOwner { mintMode = _mintMode; } function setFreeMinters(address[] memory accounts, uint16 amount) external onlyOwner { uint256 length = accounts.length; for (uint256 i = 0; i < length; i++) { freeMinters[accounts[i]] = amount; } } /*function freeMinter(address _account) public view returns (uint16){ return freeMinters[_account]; }*/ function minter(address _account) public view returns (uint16){ return minters[_account]; } /* function setFreeMinters2(address[] memory accounts, uint16[] memory amounts) external onlyOwner { uint256 length = accounts.length; uint256 length2 = amounts.length; require(length == length2, "ERROR: Both arrays need to have the the same lenght!"); for (uint i = 0; i < length; i++) { freeMinters[accounts[i]] = amounts[i]; } }*/ function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"address","name":"account","type":"address"},{"internalType":"uint16","name":"nfts","type":"uint16"}],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMinters","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"mintAmount","type":"uint16"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMode","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"minter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"mintsLeft","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newbaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newbaseExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"setFreeMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newMaxMintAmount","type":"uint16"}],"name":"setMaxMintsPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintCost","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintMode","type":"uint8"}],"name":"setMintMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint96","name":"_basepoints","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60016007556008805460ff1916905560c06040526005608090815264173539b7b760d91b60a0526009906200003590826200034c565b506040518060600160405280603681526020016200320260369139600a906200005f90826200034c565b506000600b55600c805461ffff1990811661138817909155600f805490911660011790553480156200009057600080fd5b50604051806040016040528060098152602001684265617254696e677360b81b81525060405180604001604052806005815260200164109150549560da1b8152508160009081620000e291906200034c565b506001620000f182826200034c565b5050506200010e620001086200012260201b60201c565b62000126565b6200011c336103e862000178565b62000418565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620001d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b612710816001600160601b031611156200025b5760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d6178206973203130303060448201527f3020666f72203130302520726f79616c746965730000000000000000000000006064820152608401620001cf565b600f80546001600160a01b03909316620100000262010000600160b01b031990931692909217909155601080546001600160601b039092166001600160601b0319909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002d257607f821691505b602082108103620002f357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034757600081815260208120601f850160051c81016020861015620003225750805b601f850160051c820191505b8181101562000343578281556001016200032e565b5050505b505050565b81516001600160401b03811115620003685762000368620002a7565b6200038081620003798454620002bd565b84620002f9565b602080601f831160018114620003b857600084156200039f5750858301515b600019600386901b1c1916600185901b17855562000343565b600085815260208120601f198616915b82811015620003e957888601518255948401946001909101908401620003c8565b5085821015620004085787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612dda80620004286000396000f3fe6080604052600436106102a05760003560e01c806372131db31161016e578063bdb4b848116100cb578063d5abeb011161007f578063f2fde38b11610064578063f2fde38b14610783578063f516a2e6146107a3578063f8b08712146107be57600080fd5b8063d5abeb011461071f578063e985e9c51461073a57600080fd5b8063c67c8902116100b0578063c67c8902146106bf578063c8494888146106df578063c87b56dd146106ff57600080fd5b8063bdb4b84814610689578063c21b471b1461069f57600080fd5b80638545f4ea1161012257806395d89b411161010757806395d89b4114610634578063a22cb46514610649578063b88d4fde1461066957600080fd5b80638545f4ea146105f65780638da5cb5b1461061657600080fd5b80637e2285aa116101535780637e2285aa1461059657806380de2c27146105b657806382b239a4146105d657600080fd5b806372131db31461054a578063788c59991461056a57600080fd5b80632a55205a1161021c578063438b6300116101d05780636352211e116101b55780636352211e146104f557806370a0823114610515578063715018a61461053557600080fd5b8063438b6300146104a857806355f804b3146104d557600080fd5b80633dd08c38116102015780633dd08c381461041b5780633fc250fc1461046857806342842e0e1461048857600080fd5b80632a55205a146103d45780633ccfd60b1461041357600080fd5b8063095ea7b31161027357806318160ddd1161025857806318160ddd1461037e57806323b872dd146103a157806323cf0a22146103c157600080fd5b8063095ea7b3146103565780631249c58b1461037657600080fd5b806301ffc9a7146102a557806306421c2f146102da57806306fdde03146102fc578063081812fc1461031e575b600080fd5b3480156102b157600080fd5b506102c56102c03660046124fb565b6107ef565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102fa6102f5366004612531565b610839565b005b34801561030857600080fd5b5061031161089e565b6040516102d191906125a4565b34801561032a57600080fd5b5061033e6103393660046125b7565b610930565b6040516001600160a01b0390911681526020016102d1565b34801561036257600080fd5b506102fa6103713660046125e7565b6109c5565b6102fa610af6565b34801561038a57600080fd5b50610393610bb5565b6040519081526020016102d1565b3480156103ad57600080fd5b506102fa6103bc366004612611565b610bcb565b6102fa6103cf366004612531565b610c52565b3480156103e057600080fd5b506103f46103ef36600461264d565b610dbb565b604080516001600160a01b0390931683526020830191909152016102d1565b6102fa610e08565b34801561042757600080fd5b5061045561043636600461266f565b6001600160a01b03166000908152600e602052604090205461ffff1690565b60405161ffff90911681526020016102d1565b34801561047457600080fd5b506102fa6104833660046126d1565b610ec1565b34801561049457600080fd5b506102fa6104a3366004612611565b610f88565b3480156104b457600080fd5b506104c86104c336600461266f565b610fa3565b6040516102d19190612790565b3480156104e157600080fd5b506102fa6104f036600461282c565b611093565b34801561050157600080fd5b5061033e6105103660046125b7565b6110eb565b34801561052157600080fd5b5061039361053036600461266f565b611176565b34801561054157600080fd5b506102fa611210565b34801561055657600080fd5b506102fa610565366004612875565b611264565b34801561057657600080fd5b506008546105849060ff1681565b60405160ff90911681526020016102d1565b3480156105a257600080fd5b506102fa6105b136600461282c565b6112c2565b3480156105c257600080fd5b506104556105d136600461266f565b611316565b3480156105e257600080fd5b506103936105f1366004612898565b611400565b34801561060257600080fd5b506102fa6106113660046125b7565b611480565b34801561062257600080fd5b506006546001600160a01b031661033e565b34801561064057600080fd5b506103116114cd565b34801561065557600080fd5b506102fa6106643660046128cb565b6114dc565b34801561067557600080fd5b506102fa610684366004612907565b6114e7565b34801561069557600080fd5b50610393600b5481565b3480156106ab57600080fd5b506102fa6106ba366004612983565b61156f565b3480156106cb57600080fd5b506102fa6106da366004612898565b6116a9565b3480156106eb57600080fd5b506102fa6106fa366004612531565b6116fb565b34801561070b57600080fd5b5061031161071a3660046125b7565b61175b565b34801561072b57600080fd5b50600c546104559061ffff1681565b34801561074657600080fd5b506102c56107553660046129c0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561078f57600080fd5b506102fa61079e36600461266f565b611823565b3480156107af57600080fd5b50600f546104559061ffff1681565b3480156107ca57600080fd5b506104556107d936600461266f565b600d6020526000908152604090205461ffff1681565b60007fd5aadfa6000000000000000000000000000000000000000000000000000000006001600160e01b031983160161082a57506001919050565b610833826118f0565b92915050565b6006546001600160a01b031633146108865760405162461bcd60e51b81526020600482018190526024820152600080516020612d8583398151915260448201526064015b60405180910390fd5b600c805461ffff191661ffff92909216919091179055565b6060600080546108ad906129ea565b80601f01602080910402602001604051908101604052809291908181526020018280546108d9906129ea565b80156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087d565b506000908152600460205260409020546001600160a01b031690565b60006109d0826110eb565b9050806001600160a01b0316836001600160a01b031603610a595760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b336001600160a01b0382161480610a755750610a758133610755565b610ae75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087d565b610af1838361198b565b505050565b60085460ff16610b485760405162461bcd60e51b815260206004820152601660248201527f4552524f523a204d696e74696e6720636c6f7365642e00000000000000000000604482015260640161087d565b6000610b5333611316565b905060008161ffff1611610ba95760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a204e6f206d696e7473206c65667420666f7220796f7500000000604482015260640161087d565b610bb281610c52565b50565b60006001600754610bc69190612a3a565b905090565b610bd53382611a06565b610c475760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610af1838383611afc565b60085460ff16610ca45760405162461bcd60e51b815260206004820152601660248201527f4552524f523a204d696e74696e6720636c6f7365642e00000000000000000000604482015260640161087d565b610cad33611316565b61ffff168161ffff161115610d045760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a20546f6f206d616e79206d696e74732072657175657374656400604482015260640161087d565b600b5415610db157610d163382611400565b341015610db15760405162461bcd60e51b815260206004820152605360248201527f4552524f523a204e6f7420656e6f7567682076616c75652073656e7420746f2060448201527f636f76657220636f73742e2063616c6c20636f73742066756e6374696f6e207460648201527f6f206173736573732074686520636f7374732e00000000000000000000000000608482015260a40161087d565b610bb23382611cd6565b600f546010546000918291620100009091046001600160a01b03169061271090610df3906bffffffffffffffffffffffff1686612a51565b610dfd9190612a86565b915091509250929050565b6006546001600160a01b03163314610e505760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6000610e646006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610eae576040519150601f19603f3d011682016040523d82523d6000602084013e610eb3565b606091505b5050905080610bb257600080fd5b6006546001600160a01b03163314610f095760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b815160005b81811015610f825782600d6000868481518110610f2d57610f2d612a9a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610f7a90612ab0565b915050610f0e565b50505050565b610af1838383604051806020016040528060008152506114e7565b60606000610fb083611176565b905060008167ffffffffffffffff811115610fcd57610fcd61268a565b604051908082528060200260200182016040528015610ff6578160200160208202803683370190505b509050600060015b600754811015611089576000818152600260205260409020546001600160a01b0316151580156110475750856001600160a01b031661103c826110eb565b6001600160a01b0316145b156110775780838361105881612ab0565b94508151811061106a5761106a612a9a565b6020026020010181815250505b8061108181612ab0565b915050610ffe565b5090949350505050565b6006546001600160a01b031633146110db5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600a6110e78282612b17565b5050565b6000818152600260205260408120546001600160a01b0316806108335760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161087d565b60006001600160a01b0382166111f45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161087d565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146112585760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6112626000611ec3565b565b6006546001600160a01b031633146112ac5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6008805460ff191660ff92909216919091179055565b6006546001600160a01b0316331461130a5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b60096110e78282612b17565b60085460009060ff1660010361134657506001600160a01b03166000908152600d602052604090205461ffff1690565b60085460ff166002036113f3576001600160a01b0382166000908152600d602052604090205461ffff161561139557506001600160a01b03166000908152600d602052604090205461ffff1690565b600f546001600160a01b0383166000908152600e602052604090205461ffff9182169116106113c657506000919050565b6001600160a01b0382166000908152600e6020526040902054600f546108339161ffff9081169116612bd7565b506000919050565b919050565b60006114146006546001600160a01b031690565b6001600160a01b0316330361142b57506000610833565b6001600160a01b0383166000908152600d602052604090205461ffff908116908316811061145d576000915050610833565b6114678184612bd7565b61ffff16600b546114789190612a51565b949350505050565b6006546001600160a01b031633146114c85760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600b55565b6060600180546108ad906129ea565b6110e7338383611f22565b6114f13383611a06565b6115635760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610f8284848484611ff0565b6006546001600160a01b031633146115b75760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b612710816bffffffffffffffffffffffff16111561163d5760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d6178206973203130303060448201527f3020666f72203130302520726f79616c74696573000000000000000000000000606482015260840161087d565b600f80546001600160a01b0390931662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90931692909217909155601080546bffffffffffffffffffffffff9092166bffffffffffffffffffffffff19909216919091179055565b6006546001600160a01b031633146116f15760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6110e78282611cd6565b6006546001600160a01b031633146117435760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600f805461ffff191661ffff92909216919091179055565b6000818152600260205260409020546060906001600160a01b03166117e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161087d565b6117f061206e565b6117f98361207d565b600960405160200161180d93929190612bfa565b6040516020818303038152906040529050919050565b6006546001600160a01b0316331461186b5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6001600160a01b0381166118e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161087d565b610bb281611ec3565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061195357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061083357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610833565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906119cd826110eb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a7f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087d565b6000611a8a836110eb565b9050806001600160a01b0316846001600160a01b03161480611ad157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806114785750836001600160a01b0316611aea84610930565b6001600160a01b031614949350505050565b826001600160a01b0316611b0f826110eb565b6001600160a01b031614611b8b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161087d565b6001600160a01b038216611c065760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161087d565b611c1160008261198b565b6001600160a01b0383166000908152600360205260408120805460019290611c3a908490612a3a565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c68908490612c9a565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008161ffff1611611d2a5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a204d696e7420616d6f756e74206d757374206265203e20300000604482015260640161087d565b600c5460075461ffff91821691831690611d4690600190612a3a565b611d509190612c9a565b1115611dc45760405162461bcd60e51b815260206004820152602260248201527f4552524f523a20436f6c6c656374696f6e2069732066756c6c79206d696e746560448201527f6421000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b60015b8161ffff168161ffff1611610af157611de2836007546121b2565b60078054906000611df283612ab0565b90915550506001600160a01b0383166000908152600d602052604090205461ffff1615611e5d576001600160a01b0383166000908152600d60205260408120805461ffff1691611e4183612cb2565b91906101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0383166000908152600e6020526040902054611e859061ffff166001612cd0565b6001600160a01b0384166000908152600e60205260409020805461ffff191661ffff9290921691909117905580611ebb81612cf6565b915050611dc7565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611f835760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ffb848484611afc565b612007848484846121cc565b610f825760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b6060600a80546108ad906129ea565b6060816000036120c057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120ea57806120d481612ab0565b91506120e39050600a83612a86565b91506120c4565b60008167ffffffffffffffff8111156121055761210561268a565b6040519080825280601f01601f19166020018201604052801561212f576020820181803683370190505b5090505b841561147857612144600183612a3a565b9150612151600a86612d17565b61215c906030612c9a565b60f81b81838151811061217157612171612a9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121ab600a86612a86565b9450612133565b6110e7828260405180602001604052806000815250612318565b60006001600160a01b0384163b1561230d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612210903390899088908890600401612d2b565b6020604051808303816000875af192505050801561224b575060408051601f3d908101601f1916820190925261224891810190612d67565b60015b6122f3573d808015612279576040519150601f19603f3d011682016040523d82523d6000602084013e61227e565b606091505b5080516000036122eb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611478565b506001949350505050565b6123228383612396565b61232f60008484846121cc565b610af15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b6001600160a01b0382166123ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087d565b6000818152600260205260409020546001600160a01b0316156124515760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087d565b6001600160a01b038216600090815260036020526040812080546001929061247a908490612c9a565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610bb257600080fd5b60006020828403121561250d57600080fd5b8135612518816124e5565b9392505050565b803561ffff811681146113fb57600080fd5b60006020828403121561254357600080fd5b6125188261251f565b60005b8381101561256757818101518382015260200161254f565b83811115610f825750506000910152565b6000815180845261259081602086016020860161254c565b601f01601f19169290920160200192915050565b6020815260006125186020830184612578565b6000602082840312156125c957600080fd5b5035919050565b80356001600160a01b03811681146113fb57600080fd5b600080604083850312156125fa57600080fd5b612603836125d0565b946020939093013593505050565b60008060006060848603121561262657600080fd5b61262f846125d0565b925061263d602085016125d0565b9150604084013590509250925092565b6000806040838503121561266057600080fd5b50508035926020909101359150565b60006020828403121561268157600080fd5b612518826125d0565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156126c9576126c961268a565b604052919050565b600080604083850312156126e457600080fd5b823567ffffffffffffffff808211156126fc57600080fd5b818501915085601f83011261271057600080fd5b81356020828211156127245761272461268a565b8160051b92506127358184016126a0565b828152928401810192818101908985111561274f57600080fd5b948201945b8486101561277457612765866125d0565b82529482019490820190612754565b9650612783905087820161251f565b9450505050509250929050565b6020808252825182820181905260009190848201906040850190845b818110156127c8578351835292840192918401916001016127ac565b50909695505050505050565b600067ffffffffffffffff8311156127ee576127ee61268a565b612801601f8401601f19166020016126a0565b905082815283838301111561281557600080fd5b828260208301376000602084830101529392505050565b60006020828403121561283e57600080fd5b813567ffffffffffffffff81111561285557600080fd5b8201601f8101841361286657600080fd5b611478848235602084016127d4565b60006020828403121561288757600080fd5b813560ff8116811461251857600080fd5b600080604083850312156128ab57600080fd5b6128b4836125d0565b91506128c26020840161251f565b90509250929050565b600080604083850312156128de57600080fd5b6128e7836125d0565b9150602083013580151581146128fc57600080fd5b809150509250929050565b6000806000806080858703121561291d57600080fd5b612926856125d0565b9350612934602086016125d0565b925060408501359150606085013567ffffffffffffffff81111561295757600080fd5b8501601f8101871361296857600080fd5b612977878235602084016127d4565b91505092959194509250565b6000806040838503121561299657600080fd5b61299f836125d0565b915060208301356bffffffffffffffffffffffff811681146128fc57600080fd5b600080604083850312156129d357600080fd5b6129dc836125d0565b91506128c2602084016125d0565b600181811c908216806129fe57607f821691505b602082108103612a1e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612a4c57612a4c612a24565b500390565b6000816000190483118215151615612a6b57612a6b612a24565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612a9557612a95612a70565b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201612ac257612ac2612a24565b5060010190565b601f821115610af157600081815260208120601f850160051c81016020861015612af05750805b601f850160051c820191505b81811015612b0f57828155600101612afc565b505050505050565b815167ffffffffffffffff811115612b3157612b3161268a565b612b4581612b3f84546129ea565b84612ac9565b602080601f831160018114612b7a5760008415612b625750858301515b600019600386901b1c1916600185901b178555612b0f565b600085815260208120601f198616915b82811015612ba957888601518255948401946001909101908401612b8a565b5085821015612bc75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff83811690831681811015612bf257612bf2612a24565b039392505050565b600084516020612c0d8285838a0161254c565b855191840191612c208184848a0161254c565b8554920191600090612c31816129ea565b60018281168015612c495760018114612c5e57612c8a565b60ff1984168752821515830287019450612c8a565b896000528560002060005b84811015612c8257815489820152908301908701612c69565b505082870194505b50929a9950505050505050505050565b60008219821115612cad57612cad612a24565b500190565b600061ffff821680612cc657612cc6612a24565b6000190192915050565b600061ffff808316818516808303821115612ced57612ced612a24565b01949350505050565b600061ffff808316818103612d0d57612d0d612a24565b6001019392505050565b600082612d2657612d26612a70565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612d5d6080830184612578565b9695505050505050565b600060208284031215612d7957600080fd5b8151612518816124e556fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122051f0e24aceabcb3725df0249c87e0f5e143fb7223b119792254f582c2edf340c64736f6c634300080f0033697066733a2f2f516d566f3741734c675033746e4c766f5367433276327455656734375651456f353761637345665376704a5265322f
Deployed Bytecode
0x6080604052600436106102a05760003560e01c806372131db31161016e578063bdb4b848116100cb578063d5abeb011161007f578063f2fde38b11610064578063f2fde38b14610783578063f516a2e6146107a3578063f8b08712146107be57600080fd5b8063d5abeb011461071f578063e985e9c51461073a57600080fd5b8063c67c8902116100b0578063c67c8902146106bf578063c8494888146106df578063c87b56dd146106ff57600080fd5b8063bdb4b84814610689578063c21b471b1461069f57600080fd5b80638545f4ea1161012257806395d89b411161010757806395d89b4114610634578063a22cb46514610649578063b88d4fde1461066957600080fd5b80638545f4ea146105f65780638da5cb5b1461061657600080fd5b80637e2285aa116101535780637e2285aa1461059657806380de2c27146105b657806382b239a4146105d657600080fd5b806372131db31461054a578063788c59991461056a57600080fd5b80632a55205a1161021c578063438b6300116101d05780636352211e116101b55780636352211e146104f557806370a0823114610515578063715018a61461053557600080fd5b8063438b6300146104a857806355f804b3146104d557600080fd5b80633dd08c38116102015780633dd08c381461041b5780633fc250fc1461046857806342842e0e1461048857600080fd5b80632a55205a146103d45780633ccfd60b1461041357600080fd5b8063095ea7b31161027357806318160ddd1161025857806318160ddd1461037e57806323b872dd146103a157806323cf0a22146103c157600080fd5b8063095ea7b3146103565780631249c58b1461037657600080fd5b806301ffc9a7146102a557806306421c2f146102da57806306fdde03146102fc578063081812fc1461031e575b600080fd5b3480156102b157600080fd5b506102c56102c03660046124fb565b6107ef565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102fa6102f5366004612531565b610839565b005b34801561030857600080fd5b5061031161089e565b6040516102d191906125a4565b34801561032a57600080fd5b5061033e6103393660046125b7565b610930565b6040516001600160a01b0390911681526020016102d1565b34801561036257600080fd5b506102fa6103713660046125e7565b6109c5565b6102fa610af6565b34801561038a57600080fd5b50610393610bb5565b6040519081526020016102d1565b3480156103ad57600080fd5b506102fa6103bc366004612611565b610bcb565b6102fa6103cf366004612531565b610c52565b3480156103e057600080fd5b506103f46103ef36600461264d565b610dbb565b604080516001600160a01b0390931683526020830191909152016102d1565b6102fa610e08565b34801561042757600080fd5b5061045561043636600461266f565b6001600160a01b03166000908152600e602052604090205461ffff1690565b60405161ffff90911681526020016102d1565b34801561047457600080fd5b506102fa6104833660046126d1565b610ec1565b34801561049457600080fd5b506102fa6104a3366004612611565b610f88565b3480156104b457600080fd5b506104c86104c336600461266f565b610fa3565b6040516102d19190612790565b3480156104e157600080fd5b506102fa6104f036600461282c565b611093565b34801561050157600080fd5b5061033e6105103660046125b7565b6110eb565b34801561052157600080fd5b5061039361053036600461266f565b611176565b34801561054157600080fd5b506102fa611210565b34801561055657600080fd5b506102fa610565366004612875565b611264565b34801561057657600080fd5b506008546105849060ff1681565b60405160ff90911681526020016102d1565b3480156105a257600080fd5b506102fa6105b136600461282c565b6112c2565b3480156105c257600080fd5b506104556105d136600461266f565b611316565b3480156105e257600080fd5b506103936105f1366004612898565b611400565b34801561060257600080fd5b506102fa6106113660046125b7565b611480565b34801561062257600080fd5b506006546001600160a01b031661033e565b34801561064057600080fd5b506103116114cd565b34801561065557600080fd5b506102fa6106643660046128cb565b6114dc565b34801561067557600080fd5b506102fa610684366004612907565b6114e7565b34801561069557600080fd5b50610393600b5481565b3480156106ab57600080fd5b506102fa6106ba366004612983565b61156f565b3480156106cb57600080fd5b506102fa6106da366004612898565b6116a9565b3480156106eb57600080fd5b506102fa6106fa366004612531565b6116fb565b34801561070b57600080fd5b5061031161071a3660046125b7565b61175b565b34801561072b57600080fd5b50600c546104559061ffff1681565b34801561074657600080fd5b506102c56107553660046129c0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561078f57600080fd5b506102fa61079e36600461266f565b611823565b3480156107af57600080fd5b50600f546104559061ffff1681565b3480156107ca57600080fd5b506104556107d936600461266f565b600d6020526000908152604090205461ffff1681565b60007fd5aadfa6000000000000000000000000000000000000000000000000000000006001600160e01b031983160161082a57506001919050565b610833826118f0565b92915050565b6006546001600160a01b031633146108865760405162461bcd60e51b81526020600482018190526024820152600080516020612d8583398151915260448201526064015b60405180910390fd5b600c805461ffff191661ffff92909216919091179055565b6060600080546108ad906129ea565b80601f01602080910402602001604051908101604052809291908181526020018280546108d9906129ea565b80156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087d565b506000908152600460205260409020546001600160a01b031690565b60006109d0826110eb565b9050806001600160a01b0316836001600160a01b031603610a595760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b336001600160a01b0382161480610a755750610a758133610755565b610ae75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087d565b610af1838361198b565b505050565b60085460ff16610b485760405162461bcd60e51b815260206004820152601660248201527f4552524f523a204d696e74696e6720636c6f7365642e00000000000000000000604482015260640161087d565b6000610b5333611316565b905060008161ffff1611610ba95760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a204e6f206d696e7473206c65667420666f7220796f7500000000604482015260640161087d565b610bb281610c52565b50565b60006001600754610bc69190612a3a565b905090565b610bd53382611a06565b610c475760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610af1838383611afc565b60085460ff16610ca45760405162461bcd60e51b815260206004820152601660248201527f4552524f523a204d696e74696e6720636c6f7365642e00000000000000000000604482015260640161087d565b610cad33611316565b61ffff168161ffff161115610d045760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a20546f6f206d616e79206d696e74732072657175657374656400604482015260640161087d565b600b5415610db157610d163382611400565b341015610db15760405162461bcd60e51b815260206004820152605360248201527f4552524f523a204e6f7420656e6f7567682076616c75652073656e7420746f2060448201527f636f76657220636f73742e2063616c6c20636f73742066756e6374696f6e207460648201527f6f206173736573732074686520636f7374732e00000000000000000000000000608482015260a40161087d565b610bb23382611cd6565b600f546010546000918291620100009091046001600160a01b03169061271090610df3906bffffffffffffffffffffffff1686612a51565b610dfd9190612a86565b915091509250929050565b6006546001600160a01b03163314610e505760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6000610e646006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610eae576040519150601f19603f3d011682016040523d82523d6000602084013e610eb3565b606091505b5050905080610bb257600080fd5b6006546001600160a01b03163314610f095760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b815160005b81811015610f825782600d6000868481518110610f2d57610f2d612a9a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610f7a90612ab0565b915050610f0e565b50505050565b610af1838383604051806020016040528060008152506114e7565b60606000610fb083611176565b905060008167ffffffffffffffff811115610fcd57610fcd61268a565b604051908082528060200260200182016040528015610ff6578160200160208202803683370190505b509050600060015b600754811015611089576000818152600260205260409020546001600160a01b0316151580156110475750856001600160a01b031661103c826110eb565b6001600160a01b0316145b156110775780838361105881612ab0565b94508151811061106a5761106a612a9a565b6020026020010181815250505b8061108181612ab0565b915050610ffe565b5090949350505050565b6006546001600160a01b031633146110db5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600a6110e78282612b17565b5050565b6000818152600260205260408120546001600160a01b0316806108335760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161087d565b60006001600160a01b0382166111f45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161087d565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146112585760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6112626000611ec3565b565b6006546001600160a01b031633146112ac5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6008805460ff191660ff92909216919091179055565b6006546001600160a01b0316331461130a5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b60096110e78282612b17565b60085460009060ff1660010361134657506001600160a01b03166000908152600d602052604090205461ffff1690565b60085460ff166002036113f3576001600160a01b0382166000908152600d602052604090205461ffff161561139557506001600160a01b03166000908152600d602052604090205461ffff1690565b600f546001600160a01b0383166000908152600e602052604090205461ffff9182169116106113c657506000919050565b6001600160a01b0382166000908152600e6020526040902054600f546108339161ffff9081169116612bd7565b506000919050565b919050565b60006114146006546001600160a01b031690565b6001600160a01b0316330361142b57506000610833565b6001600160a01b0383166000908152600d602052604090205461ffff908116908316811061145d576000915050610833565b6114678184612bd7565b61ffff16600b546114789190612a51565b949350505050565b6006546001600160a01b031633146114c85760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600b55565b6060600180546108ad906129ea565b6110e7338383611f22565b6114f13383611a06565b6115635760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610f8284848484611ff0565b6006546001600160a01b031633146115b75760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b612710816bffffffffffffffffffffffff16111561163d5760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d6178206973203130303060448201527f3020666f72203130302520726f79616c74696573000000000000000000000000606482015260840161087d565b600f80546001600160a01b0390931662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90931692909217909155601080546bffffffffffffffffffffffff9092166bffffffffffffffffffffffff19909216919091179055565b6006546001600160a01b031633146116f15760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6110e78282611cd6565b6006546001600160a01b031633146117435760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600f805461ffff191661ffff92909216919091179055565b6000818152600260205260409020546060906001600160a01b03166117e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161087d565b6117f061206e565b6117f98361207d565b600960405160200161180d93929190612bfa565b6040516020818303038152906040529050919050565b6006546001600160a01b0316331461186b5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6001600160a01b0381166118e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161087d565b610bb281611ec3565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061195357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061083357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610833565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906119cd826110eb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a7f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087d565b6000611a8a836110eb565b9050806001600160a01b0316846001600160a01b03161480611ad157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806114785750836001600160a01b0316611aea84610930565b6001600160a01b031614949350505050565b826001600160a01b0316611b0f826110eb565b6001600160a01b031614611b8b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161087d565b6001600160a01b038216611c065760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161087d565b611c1160008261198b565b6001600160a01b0383166000908152600360205260408120805460019290611c3a908490612a3a565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c68908490612c9a565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008161ffff1611611d2a5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a204d696e7420616d6f756e74206d757374206265203e20300000604482015260640161087d565b600c5460075461ffff91821691831690611d4690600190612a3a565b611d509190612c9a565b1115611dc45760405162461bcd60e51b815260206004820152602260248201527f4552524f523a20436f6c6c656374696f6e2069732066756c6c79206d696e746560448201527f6421000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b60015b8161ffff168161ffff1611610af157611de2836007546121b2565b60078054906000611df283612ab0565b90915550506001600160a01b0383166000908152600d602052604090205461ffff1615611e5d576001600160a01b0383166000908152600d60205260408120805461ffff1691611e4183612cb2565b91906101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0383166000908152600e6020526040902054611e859061ffff166001612cd0565b6001600160a01b0384166000908152600e60205260409020805461ffff191661ffff9290921691909117905580611ebb81612cf6565b915050611dc7565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611f835760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ffb848484611afc565b612007848484846121cc565b610f825760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b6060600a80546108ad906129ea565b6060816000036120c057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120ea57806120d481612ab0565b91506120e39050600a83612a86565b91506120c4565b60008167ffffffffffffffff8111156121055761210561268a565b6040519080825280601f01601f19166020018201604052801561212f576020820181803683370190505b5090505b841561147857612144600183612a3a565b9150612151600a86612d17565b61215c906030612c9a565b60f81b81838151811061217157612171612a9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121ab600a86612a86565b9450612133565b6110e7828260405180602001604052806000815250612318565b60006001600160a01b0384163b1561230d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612210903390899088908890600401612d2b565b6020604051808303816000875af192505050801561224b575060408051601f3d908101601f1916820190925261224891810190612d67565b60015b6122f3573d808015612279576040519150601f19603f3d011682016040523d82523d6000602084013e61227e565b606091505b5080516000036122eb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611478565b506001949350505050565b6123228383612396565b61232f60008484846121cc565b610af15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b6001600160a01b0382166123ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087d565b6000818152600260205260409020546001600160a01b0316156124515760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087d565b6001600160a01b038216600090815260036020526040812080546001929061247a908490612c9a565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610bb257600080fd5b60006020828403121561250d57600080fd5b8135612518816124e5565b9392505050565b803561ffff811681146113fb57600080fd5b60006020828403121561254357600080fd5b6125188261251f565b60005b8381101561256757818101518382015260200161254f565b83811115610f825750506000910152565b6000815180845261259081602086016020860161254c565b601f01601f19169290920160200192915050565b6020815260006125186020830184612578565b6000602082840312156125c957600080fd5b5035919050565b80356001600160a01b03811681146113fb57600080fd5b600080604083850312156125fa57600080fd5b612603836125d0565b946020939093013593505050565b60008060006060848603121561262657600080fd5b61262f846125d0565b925061263d602085016125d0565b9150604084013590509250925092565b6000806040838503121561266057600080fd5b50508035926020909101359150565b60006020828403121561268157600080fd5b612518826125d0565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156126c9576126c961268a565b604052919050565b600080604083850312156126e457600080fd5b823567ffffffffffffffff808211156126fc57600080fd5b818501915085601f83011261271057600080fd5b81356020828211156127245761272461268a565b8160051b92506127358184016126a0565b828152928401810192818101908985111561274f57600080fd5b948201945b8486101561277457612765866125d0565b82529482019490820190612754565b9650612783905087820161251f565b9450505050509250929050565b6020808252825182820181905260009190848201906040850190845b818110156127c8578351835292840192918401916001016127ac565b50909695505050505050565b600067ffffffffffffffff8311156127ee576127ee61268a565b612801601f8401601f19166020016126a0565b905082815283838301111561281557600080fd5b828260208301376000602084830101529392505050565b60006020828403121561283e57600080fd5b813567ffffffffffffffff81111561285557600080fd5b8201601f8101841361286657600080fd5b611478848235602084016127d4565b60006020828403121561288757600080fd5b813560ff8116811461251857600080fd5b600080604083850312156128ab57600080fd5b6128b4836125d0565b91506128c26020840161251f565b90509250929050565b600080604083850312156128de57600080fd5b6128e7836125d0565b9150602083013580151581146128fc57600080fd5b809150509250929050565b6000806000806080858703121561291d57600080fd5b612926856125d0565b9350612934602086016125d0565b925060408501359150606085013567ffffffffffffffff81111561295757600080fd5b8501601f8101871361296857600080fd5b612977878235602084016127d4565b91505092959194509250565b6000806040838503121561299657600080fd5b61299f836125d0565b915060208301356bffffffffffffffffffffffff811681146128fc57600080fd5b600080604083850312156129d357600080fd5b6129dc836125d0565b91506128c2602084016125d0565b600181811c908216806129fe57607f821691505b602082108103612a1e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612a4c57612a4c612a24565b500390565b6000816000190483118215151615612a6b57612a6b612a24565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612a9557612a95612a70565b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201612ac257612ac2612a24565b5060010190565b601f821115610af157600081815260208120601f850160051c81016020861015612af05750805b601f850160051c820191505b81811015612b0f57828155600101612afc565b505050505050565b815167ffffffffffffffff811115612b3157612b3161268a565b612b4581612b3f84546129ea565b84612ac9565b602080601f831160018114612b7a5760008415612b625750858301515b600019600386901b1c1916600185901b178555612b0f565b600085815260208120601f198616915b82811015612ba957888601518255948401946001909101908401612b8a565b5085821015612bc75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff83811690831681811015612bf257612bf2612a24565b039392505050565b600084516020612c0d8285838a0161254c565b855191840191612c208184848a0161254c565b8554920191600090612c31816129ea565b60018281168015612c495760018114612c5e57612c8a565b60ff1984168752821515830287019450612c8a565b896000528560002060005b84811015612c8257815489820152908301908701612c69565b505082870194505b50929a9950505050505050505050565b60008219821115612cad57612cad612a24565b500190565b600061ffff821680612cc657612cc6612a24565b6000190192915050565b600061ffff808316818516808303821115612ced57612ced612a24565b01949350505050565b600061ffff808316818103612d0d57612d0d612a24565b6001019392505050565b600082612d2657612d26612a70565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612d5d6080830184612578565b9695505050505050565b600060208284031215612d7957600080fd5b8151612518816124e556fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122051f0e24aceabcb3725df0249c87e0f5e143fb7223b119792254f582c2edf340c64736f6c634300080f0033
Deployed Bytecode Sourcemap
38124:7634:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42263:250;;;;;;;;;;-1:-1:-1;42263:250:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;42263:250:0;;;;;;;;44375:99;;;;;;;;;;-1:-1:-1;44375:99:0;;;;;:::i;:::-;;:::i;:::-;;25622:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27182:221::-;;;;;;;;;;-1:-1:-1;27182:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2091:55:1;;;2073:74;;2061:2;2046:18;27182:221:0;1927:226:1;26705:411:0;;;;;;;;;;-1:-1:-1;26705:411:0;;;;;:::i;:::-;;:::i;40379:251::-;;;:::i;43008:92::-;;;;;;;;;;;;;:::i;:::-;;;2764:25:1;;;2752:2;2737:18;43008:92:0;2618:177:1;27932:339:0;;;;;;;;;;-1:-1:-1;27932:339:0;;;;;:::i;:::-;;:::i;40683:502::-;;;;;;:::i;:::-;;:::i;42042:213::-;;;;;;;;;;-1:-1:-1;42042:213:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3578:55:1;;;3560:74;;3665:2;3650:18;;3643:34;;;;3533:18;42042:213:0;3386:297:1;45600:155:0;;;:::i;45080:105::-;;;;;;;;;;-1:-1:-1;45080:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;45160:17:0;45135:6;45160:17;;;:7;:17;;;;;;;;;45080:105;;;;4053:6:1;4041:19;;;4023:38;;4011:2;3996:18;45080:105:0;3879:188:1;44702:245:0;;;;;;;;;;-1:-1:-1;44702:245:0;;;;;:::i;:::-;;:::i;28342:185::-;;;;;;;;;;-1:-1:-1;28342:185:0;;;;;:::i;:::-;;:::i;43112:414::-;;;;;;;;;;-1:-1:-1;43112:414:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43534:102::-;;;;;;;;;;-1:-1:-1;43534:102:0;;;;;:::i;:::-;;:::i;25316:239::-;;;;;;;;;;-1:-1:-1;25316:239:0;;;;;:::i;:::-;;:::i;25046:208::-;;;;;;;;;;-1:-1:-1;25046:208:0;;;;;:::i;:::-;;:::i;4889:103::-;;;;;;;;;;;;;:::i;44594:94::-;;;;;;;;;;-1:-1:-1;44594:94:0;;;;;:::i;:::-;;:::i;38325:25::-;;;;;;;;;;-1:-1:-1;38325:25:0;;;;;;;;;;;7523:4:1;7511:17;;;7493:36;;7481:2;7466:18;38325:25:0;7351:184:1;43648:122:0;;;;;;;;;;-1:-1:-1;43648:122:0;;;;;:::i;:::-;;:::i;39594:724::-;;;;;;;;;;-1:-1:-1;39594:724:0;;;;;:::i;:::-;;:::i;39165:421::-;;;;;;;;;;-1:-1:-1;39165:421:0;;;;;:::i;:::-;;:::i;43782:96::-;;;;;;;;;;-1:-1:-1;43782:96:0;;;;;:::i;:::-;;:::i;4238:87::-;;;;;;;;;;-1:-1:-1;4311:6:0;;-1:-1:-1;;;;;4311:6:0;4238:87;;25791:104;;;;;;;;;;;;;:::i;27475:155::-;;;;;;;;;;-1:-1:-1;27475:155:0;;;;;:::i;:::-;;:::i;28598:328::-;;;;;;;;;;-1:-1:-1;28598:328:0;;;;;:::i;:::-;;:::i;38512:27::-;;;;;;;;;;;;;;;;43943:273;;;;;;;;;;-1:-1:-1;43943:273:0;;;;;:::i;:::-;;:::i;41898:111::-;;;;;;;;;;-1:-1:-1;41898:111:0;;;;;:::i;:::-;;:::i;44234:129::-;;;;;;;;;;-1:-1:-1;44234:129:0;;;;;:::i;:::-;;:::i;42648:294::-;;;;;;;;;;-1:-1:-1;42648:294:0;;;;;:::i;:::-;;:::i;38569:30::-;;;;;;;;;;-1:-1:-1;38569:30:0;;;;;;;;27701:164;;;;;;;;;;-1:-1:-1;27701:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27822:25:0;;;27798:4;27822:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27701:164;5147:201;;;;;;;;;;-1:-1:-1;5147:201:0;;;;;:::i;:::-;;:::i;38810:35::-;;;;;;;;;;-1:-1:-1;38810:35:0;;;;;;;;38637:46;;;;;;;;;;-1:-1:-1;38637:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42263:250;42356:4;42376:36;-1:-1:-1;;;;;;42376:36:0;;;42373:79;;-1:-1:-1;42436:4:0;;42263:250;-1:-1:-1;42263:250:0:o;42373:79::-;42469:36;42493:11;42469:23;:36::i;:::-;42462:43;42263:250;-1:-1:-1;;42263:250:0:o;44375:99::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;;;;;;;;;44444:9:::1;:22:::0;;-1:-1:-1;;44444:22:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44375:99::o;25622:100::-;25676:13;25709:5;25702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25622:100;:::o;27182:221::-;27258:7;30525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30525:16:0;27278:73;;;;-1:-1:-1;;;27278:73:0;;10468:2:1;27278:73:0;;;10450:21:1;10507:2;10487:18;;;10480:30;10546:34;10526:18;;;10519:62;-1:-1:-1;;;10597:18:1;;;10590:42;10649:19;;27278:73:0;10266:408:1;27278:73:0;-1:-1:-1;27371:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27371:24:0;;27182:221::o;26705:411::-;26786:13;26802:23;26817:7;26802:14;:23::i;:::-;26786:39;;26850:5;-1:-1:-1;;;;;26844:11:0;:2;-1:-1:-1;;;;;26844:11:0;;26836:57;;;;-1:-1:-1;;;26836:57:0;;10881:2:1;26836:57:0;;;10863:21:1;10920:2;10900:18;;;10893:30;10959:34;10939:18;;;10932:62;11030:3;11010:18;;;11003:31;11051:19;;26836:57:0;10679:397:1;26836:57:0;2989:10;-1:-1:-1;;;;;26928:21:0;;;;:62;;-1:-1:-1;26953:37:0;26970:5;2989:10;27701:164;:::i;26953:37::-;26906:168;;;;-1:-1:-1;;;26906:168:0;;11283:2:1;26906:168:0;;;11265:21:1;11322:2;11302:18;;;11295:30;11361:34;11341:18;;;11334:62;11432:26;11412:18;;;11405:54;11476:19;;26906:168:0;11081:420:1;26906:168:0;27087:21;27096:2;27100:7;27087:8;:21::i;:::-;26775:341;26705:411;;:::o;40379:251::-;40430:8;;;;40422:47;;;;-1:-1:-1;;;40422:47:0;;11708:2:1;40422:47:0;;;11690:21:1;11747:2;11727:18;;;11720:30;11786:24;11766:18;;;11759:52;11828:18;;40422:47:0;11506:346:1;40422:47:0;40480:17;40500:21;40510:10;40500:9;:21::i;:::-;40480:41;;40553:1;40540:10;:14;;;40532:55;;;;-1:-1:-1;;;40532:55:0;;12059:2:1;40532:55:0;;;12041:21:1;12098:2;12078:18;;;12071:30;12137;12117:18;;;12110:58;12185:18;;40532:55:0;11857:352:1;40532:55:0;40606:16;40611:10;40606:4;:16::i;:::-;40410:220;40379:251::o;43008:92::-;43052:7;43091:1;43079:11;;:13;;;;:::i;:::-;43072:20;;43008:92;:::o;27932:339::-;28127:41;2989:10;28160:7;28127:18;:41::i;:::-;28119:103;;;;-1:-1:-1;;;28119:103:0;;12735:2:1;28119:103:0;;;12717:21:1;12774:2;12754:18;;;12747:30;12813:34;12793:18;;;12786:62;12884:19;12864:18;;;12857:47;12921:19;;28119:103:0;12533:413:1;28119:103:0;28235:28;28245:4;28251:2;28255:7;28235:9;:28::i;40683:502::-;40752:8;;;;40744:47;;;;-1:-1:-1;;;40744:47:0;;11708:2:1;40744:47:0;;;11690:21:1;11747:2;11727:18;;;11720:30;11786:24;11766:18;;;11759:52;11828:18;;40744:47:0;11506:346:1;40744:47:0;40825:21;40835:10;40825:9;:21::i;:::-;40810:36;;:11;:36;;;;40802:80;;;;-1:-1:-1;;;40802:80:0;;13153:2:1;40802:80:0;;;13135:21:1;13192:2;13172:18;;;13165:30;13231:33;13211:18;;;13204:61;13282:18;;40802:80:0;12951:355:1;40802:80:0;40957:8;;:12;40953:181;;41005:29;41010:10;41022:11;41005:4;:29::i;:::-;40992:9;:42;;40984:138;;;;-1:-1:-1;;;40984:138:0;;13513:2:1;40984:138:0;;;13495:21:1;13552:2;13532:18;;;13525:30;13591:34;13571:18;;;13564:62;13662:34;13642:18;;;13635:62;13734:21;13713:19;;;13706:50;13773:19;;40984:138:0;13311:487:1;40984:138:0;41146:31;41153:10;41165:11;41146:6;:31::i;42042:213::-;42184:19;;42218:20;;42124:16;;;;42184:19;;;;-1:-1:-1;;;;;42184:19:0;;42241:5;;42205:33;;42218:20;;42205:10;:33;:::i;:::-;:41;;;;:::i;:::-;42176:71;;;;42042:213;;;;;:::o;45600:155::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;45657:7:::1;45678;4311:6:::0;;-1:-1:-1;;;;;4311:6:0;;4238:87;45678:7:::1;-1:-1:-1::0;;;;;45670:21:0::1;45699;45670:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45656:69;;;45744:2;45736:11;;;::::0;::::1;44702:245:::0;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;44815:15;;44798:14:::1;44843:97;44867:6;44863:1;:10;44843:97;;;44922:6;44895:11;:24;44907:8;44916:1;44907:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;44895:24:0::1;-1:-1:-1::0;;;;;44895:24:0::1;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;44875:3;;;;;:::i;:::-;;;;44843:97;;;;44787:160;44702:245:::0;;:::o;28342:185::-;28480:39;28497:4;28503:2;28507:7;28480:39;;;;;;;;;;;;:16;:39::i;43112:414::-;43172:16;43200:23;43226:17;43236:6;43226:9;:17::i;:::-;43200:43;;43254:25;43296:15;43282:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43282:30:0;-1:-1:-1;43254:58:0;-1:-1:-1;43323:15:0;43368:1;43353:140;43375:11;;43371:1;:15;43353:140;;;30501:4;30525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30525:16:0;:30;;43411:32;;;;;43437:6;-1:-1:-1;;;;;43425:18:0;:10;43433:1;43425:7;:10::i;:::-;-1:-1:-1;;;;;43425:18:0;;43411:32;43408:73;;;43480:1;43458:8;43467:9;;;;:::i;:::-;;;43458:19;;;;;;;;:::i;:::-;;;;;;:23;;;;;43408:73;43388:3;;;;:::i;:::-;;;;43353:140;;;-1:-1:-1;43510:8:0;;43112:414;-1:-1:-1;;;;43112:414:0:o;43534:102::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;43608:7:::1;:20;43618:10:::0;43608:7;:20:::1;:::i;:::-;;43534:102:::0;:::o;25316:239::-;25388:7;25424:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25424:16:0;;25451:73;;;;-1:-1:-1;;;25451:73:0;;17235:2:1;25451:73:0;;;17217:21:1;17274:2;17254:18;;;17247:30;17313:34;17293:18;;;17286:62;17384:11;17364:18;;;17357:39;17413:19;;25451:73:0;17033:405:1;25046:208:0;25118:7;-1:-1:-1;;;;;25146:19:0;;25138:74;;;;-1:-1:-1;;;25138:74:0;;17645:2:1;25138:74:0;;;17627:21:1;17684:2;17664:18;;;17657:30;17723:34;17703:18;;;17696:62;17794:12;17774:18;;;17767:40;17824:19;;25138:74:0;17443:406:1;25138:74:0;-1:-1:-1;;;;;;25230:16:0;;;;;:9;:16;;;;;;;25046:208::o;4889:103::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;4954:30:::1;4981:1;4954:18;:30::i;:::-;4889:103::o:0;44594:94::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;44660:8:::1;:20:::0;;-1:-1:-1;;44660:20:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44594:94::o;43648:122::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;43730:13:::1;:32;43746:16:::0;43730:13;:32:::1;:::i;39594:724::-:0;39675:8;;39651:6;;39675:8;;;:11;39671:638;;-1:-1:-1;;;;;;39710:20:0;;;;;:11;:20;;;;;;;;;39594:724::o;39671:638::-;39752:8;;;;39762:1;39752:11;39748:561;;-1:-1:-1;;;;;39783:20:0;;39804:1;39783:20;;;:11;:20;;;;;;;;:22;39780:463;;-1:-1:-1;;;;;;39882:20:0;;;;;:11;:20;;;;;;;;;39594:724::o;39780:463::-;40001:17;;-1:-1:-1;;;;;39981:16:0;;40001:17;39981:16;;;:7;:16;;;;;;40001:17;;;;39981:16;;:37;39978:250;;-1:-1:-1;40115:1:0;;39594:724;-1:-1:-1;39594:724:0:o;39978:250::-;-1:-1:-1;;;;;40192:16:0;;;;;;:7;:16;;;;;;40172:17;;:36;;40192:16;;;;;40172:17;:36;:::i;39748:561::-;-1:-1:-1;40296:1:0;;39594:724;-1:-1:-1;39594:724:0:o;39748:561::-;39594:724;;;:::o;39165:421::-;39230:7;39294;4311:6;;-1:-1:-1;;;;;4311:6:0;;4238:87;39294:7;-1:-1:-1;;;;;39280:21:0;:10;:21;39276:62;;-1:-1:-1;39325:1:0;39318:8;;39276:62;-1:-1:-1;;;;;39392:20:0;;39373:16;39392:20;;;:11;:20;;;;;;;;;;;39456:17;;;;39453:126;;39497:1;39490:8;;;;;39453:126;39550:16;39557:9;39550:4;:16;:::i;:::-;39538:29;;:8;;:29;;;;:::i;:::-;39531:36;39165:421;-1:-1:-1;;;;39165:421:0:o;43782:96::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;43850:8:::1;:20:::0;43782:96::o;25791:104::-;25847:13;25880:7;25873:14;;;;;:::i;27475:155::-;27570:52;2989:10;27603:8;27613;27570:18;:52::i;28598:328::-;28773:41;2989:10;28806:7;28773:18;:41::i;:::-;28765:103;;;;-1:-1:-1;;;28765:103:0;;12735:2:1;28765:103:0;;;12717:21:1;12774:2;12754:18;;;12747:30;12813:34;12793:18;;;12786:62;12884:19;12864:18;;;12857:47;12921:19;;28765:103:0;12533:413:1;28765:103:0;28879:39;28893:4;28899:2;28903:7;28912:5;28879:13;:39::i;43943:273::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;44054:5:::1;44041:11;:18;;;;44033:83;;;::::0;-1:-1:-1;;;44033:83:0;;18278:2:1;44033:83:0::1;::::0;::::1;18260:21:1::0;18317:2;18297:18;;;18290:30;18356:34;18336:18;;;18329:62;18427:22;18407:18;;;18400:50;18467:19;;44033:83:0::1;18076:416:1::0;44033:83:0::1;44129:19;:32:::0;;-1:-1:-1;;;;;44129:32:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;44174:20:::1;:34:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;44174:34:0;;::::1;::::0;;;::::1;::::0;;43943:273::o;41898:111::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;41979:22:::1;41986:2;41990:10;41979:6;:22::i;44234:129::-:0;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;44318:17:::1;:37:::0;;-1:-1:-1;;44318:37:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44234:129::o;42648:294::-;30501:4;30525:16;;;:7;:16;;;;;;42722:13;;-1:-1:-1;;;;;30525:16:0;42748:77;;;;-1:-1:-1;;;42748:77:0;;18699:2:1;42748:77:0;;;18681:21:1;18738:2;18718:18;;;18711:30;18777:34;18757:18;;;18750:62;18848:17;18828:18;;;18821:45;18883:19;;42748:77:0;18497:411:1;42748:77:0;42877:10;:8;:10::i;:::-;42889:26;42906:8;42889:16;:26::i;:::-;42917:13;42860:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42846:86;;42648:294;;;:::o;5147:201::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;-1:-1:-1;;;;;5236:22:0;::::1;5228:73;;;::::0;-1:-1:-1;;;5228:73:0;;20350:2:1;5228:73:0::1;::::0;::::1;20332:21:1::0;20389:2;20369:18;;;20362:30;20428:34;20408:18;;;20401:62;20499:8;20479:18;;;20472:36;20525:19;;5228:73:0::1;20148:402:1::0;5228:73:0::1;5312:28;5331:8;5312:18;:28::i;24677:305::-:0;24779:4;-1:-1:-1;;;;;;24816:40:0;;24831:25;24816:40;;:105;;-1:-1:-1;;;;;;;24873:48:0;;24888:33;24873:48;24816:105;:158;;;-1:-1:-1;17381:25:0;-1:-1:-1;;;;;;17366:40:0;;;24938:36;17257:157;34582:174;34657:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;34657:29:0;-1:-1:-1;;;;;34657:29:0;;;;;;;;:24;;34711:23;34657:24;34711:14;:23::i;:::-;-1:-1:-1;;;;;34702:46:0;;;;;;;;;;;34582:174;;:::o;30730:348::-;30823:4;30525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30525:16:0;30840:73;;;;-1:-1:-1;;;30840:73:0;;20757:2:1;30840:73:0;;;20739:21:1;20796:2;20776:18;;;20769:30;20835:34;20815:18;;;20808:62;-1:-1:-1;;;20886:18:1;;;20879:42;20938:19;;30840:73:0;20555:408:1;30840:73:0;30924:13;30940:23;30955:7;30940:14;:23::i;:::-;30924:39;;30993:5;-1:-1:-1;;;;;30982:16:0;:7;-1:-1:-1;;;;;30982:16:0;;:52;;;-1:-1:-1;;;;;;27822:25:0;;;27798:4;27822:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31002:32;30982:87;;;;31062:7;-1:-1:-1;;;;;31038:31:0;:20;31050:7;31038:11;:20::i;:::-;-1:-1:-1;;;;;31038:31:0;;30974:96;30730:348;-1:-1:-1;;;;30730:348:0:o;33839:625::-;33998:4;-1:-1:-1;;;;;33971:31:0;:23;33986:7;33971:14;:23::i;:::-;-1:-1:-1;;;;;33971:31:0;;33963:81;;;;-1:-1:-1;;;33963:81:0;;21170:2:1;33963:81:0;;;21152:21:1;21209:2;21189:18;;;21182:30;21248:34;21228:18;;;21221:62;21319:7;21299:18;;;21292:35;21344:19;;33963:81:0;20968:401:1;33963:81:0;-1:-1:-1;;;;;34063:16:0;;34055:65;;;;-1:-1:-1;;;34055:65:0;;21576:2:1;34055:65:0;;;21558:21:1;21615:2;21595:18;;;21588:30;21654:34;21634:18;;;21627:62;21725:6;21705:18;;;21698:34;21749:19;;34055:65:0;21374:400:1;34055:65:0;34237:29;34254:1;34258:7;34237:8;:29::i;:::-;-1:-1:-1;;;;;34279:15:0;;;;;;:9;:15;;;;;:20;;34298:1;;34279:15;:20;;34298:1;;34279:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34310:13:0;;;;;;:9;:13;;;;;:18;;34327:1;;34310:13;:18;;34327:1;;34310:18;:::i;:::-;;;;-1:-1:-1;;34339:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;34339:21:0;-1:-1:-1;;;;;34339:21:0;;;;;;;;;34378:27;;34339:16;;34378:27;;;;;;;26775:341;26705:411;;:::o;41227:614::-;41317:1;41303:11;:15;;;41295:58;;;;-1:-1:-1;;;41295:58:0;;22114:2:1;41295:58:0;;;22096:21:1;22153:2;22133:18;;;22126:30;22192:32;22172:18;;;22165:60;22242:18;;41295:58:0;21912:354:1;41295:58:0;41403:9;;41372:11;;41403:9;;;;;41372:27;;;:13;;41403:9;;41372:13;:::i;:::-;:27;;;;:::i;:::-;:40;;41364:87;;;;-1:-1:-1;;;41364:87:0;;22473:2:1;41364:87:0;;;22455:21:1;22512:2;22492:18;;;22485:30;22551:34;22531:18;;;22524:62;22622:4;22602:18;;;22595:32;22644:19;;41364:87:0;22271:398:1;41364:87:0;41484:1;41468:366;41492:11;41487:16;;:1;:16;;;41468:366;;41525:26;41535:2;41539:11;;41525:9;:26::i;:::-;41566:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;;;;;;;41708:15:0;;41726:1;41708:15;;;:11;:15;;;;;;;;:19;41705:76;;-1:-1:-1;;;;;41748:15:0;;;;;;:11;:15;;;;;:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;41705:76;-1:-1:-1;;;;;41809:11:0;;;;;;:7;:11;;;;;;:13;;:11;;;:13;:::i;:::-;-1:-1:-1;;;;;41795:11:0;;;;;;:7;:11;;;;;:27;;-1:-1:-1;;41795:27:0;;;;;;;;;;;;41505:3;;;;:::i;:::-;;;;41468:366;;5508:191;5601:6;;;-1:-1:-1;;;;;5618:17:0;;;-1:-1:-1;;5618:17:0;;;;;;;5651:40;;5601:6;;;5618:17;5601:6;;5651:40;;5582:16;;5651:40;5571:128;5508:191;:::o;34898:315::-;35053:8;-1:-1:-1;;;;;35044:17:0;:5;-1:-1:-1;;;;;35044:17:0;;35036:55;;;;-1:-1:-1;;;35036:55:0;;23493:2:1;35036:55:0;;;23475:21:1;23532:2;23512:18;;;23505:30;23571:27;23551:18;;;23544:55;23616:18;;35036:55:0;23291:349:1;35036:55:0;-1:-1:-1;;;;;35102:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35102:46:0;;;;;;;;;;35164:41;;586::1;;;35164::0;;559:18:1;35164:41:0;;;;;;;34898:315;;;:::o;29808:::-;29965:28;29975:4;29981:2;29985:7;29965:9;:28::i;:::-;30012:48;30035:4;30041:2;30045:7;30054:5;30012:22;:48::i;:::-;30004:111;;;;-1:-1:-1;;;30004:111:0;;23847:2:1;30004:111:0;;;23829:21:1;23886:2;23866:18;;;23859:30;23925:34;23905:18;;;23898:62;-1:-1:-1;;;23976:18:1;;;23969:48;24034:19;;30004:111:0;23645:414:1;42523:108:0;42583:13;42616:7;42609:14;;;;;:::i;418:723::-;474:13;695:5;704:1;695:10;691:53;;-1:-1:-1;;722:10:0;;;;;;;;;;;;;;;;;;418:723::o;691:53::-;769:5;754:12;810:78;817:9;;810:78;;843:8;;;;:::i;:::-;;-1:-1:-1;866:10:0;;-1:-1:-1;874:2:0;866:10;;:::i;:::-;;;810:78;;;898:19;930:6;920:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;920:17:0;;898:39;;948:154;955:10;;948:154;;982:11;992:1;982:11;;:::i;:::-;;-1:-1:-1;1051:10:0;1059:2;1051:5;:10;:::i;:::-;1038:24;;:2;:24;:::i;:::-;1025:39;;1008:6;1015;1008:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1079:11:0;1088:2;1079:11;;:::i;:::-;;;948:154;;31420:110;31496:26;31506:2;31510:7;31496:26;;;;;;;;;;;;:9;:26::i;35778:799::-;35933:4;-1:-1:-1;;;;;35954:13:0;;7287:19;:23;35950:620;;35990:72;;-1:-1:-1;;;35990:72:0;;-1:-1:-1;;;;;35990:36:0;;;;;:72;;2989:10;;36041:4;;36047:7;;36056:5;;35990:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35990:72:0;;;;;;;;-1:-1:-1;;35990:72:0;;;;;;;;;;;;:::i;:::-;;;35986:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36232:6;:13;36249:1;36232:18;36228:272;;36275:60;;-1:-1:-1;;;36275:60:0;;23847:2:1;36275:60:0;;;23829:21:1;23886:2;23866:18;;;23859:30;23925:34;23905:18;;;23898:62;-1:-1:-1;;;23976:18:1;;;23969:48;24034:19;;36275:60:0;23645:414:1;36228:272:0;36450:6;36444:13;36435:6;36431:2;36427:15;36420:38;35986:529;-1:-1:-1;;;;;;36113:51:0;-1:-1:-1;;;36113:51:0;;-1:-1:-1;36106:58:0;;35950:620;-1:-1:-1;36554:4:0;35778:799;;;;;;:::o;31757:321::-;31887:18;31893:2;31897:7;31887:5;:18::i;:::-;31938:54;31969:1;31973:2;31977:7;31986:5;31938:22;:54::i;:::-;31916:154;;;;-1:-1:-1;;;31916:154:0;;23847:2:1;31916:154:0;;;23829:21:1;23886:2;23866:18;;;23859:30;23925:34;23905:18;;;23898:62;-1:-1:-1;;;23976:18:1;;;23969:48;24034:19;;31916:154:0;23645:414:1;32414:439:0;-1:-1:-1;;;;;32494:16:0;;32486:61;;;;-1:-1:-1;;;32486:61:0;;25154:2:1;32486:61:0;;;25136:21:1;;;25173:18;;;25166:30;25232:34;25212:18;;;25205:62;25284:18;;32486:61:0;24952:356:1;32486:61:0;30501:4;30525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30525:16:0;:30;32558:58;;;;-1:-1:-1;;;32558:58:0;;25515:2:1;32558:58:0;;;25497:21:1;25554:2;25534:18;;;25527:30;25593;25573:18;;;25566:58;25641:18;;32558:58:0;25313:352:1;32558:58:0;-1:-1:-1;;;;;32687:13:0;;;;;;:9;:13;;;;;:18;;32704:1;;32687:13;:18;;32704:1;;32687:18;:::i;:::-;;;;-1:-1:-1;;32716:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;32716:21:0;-1:-1:-1;;;;;32716:21:0;;;;;;;;32755:33;;32716:16;;;32755:33;;32716:16;;32755:33;43608:20:::1;43534:102:::0;:::o;14:177:1:-;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:159::-;705:20;;765:6;754:18;;744:29;;734:57;;787:1;784;777:12;802:184;860:6;913:2;901:9;892:7;888:23;884:32;881:52;;;929:1;926;919:12;881:52;952:28;970:9;952:28;:::i;991:258::-;1063:1;1073:113;1087:6;1084:1;1081:13;1073:113;;;1163:11;;;1157:18;1144:11;;;1137:39;1109:2;1102:10;1073:113;;;1204:6;1201:1;1198:13;1195:48;;;-1:-1:-1;;1239:1:1;1221:16;;1214:27;991:258::o;1254:::-;1296:3;1334:5;1328:12;1361:6;1356:3;1349:19;1377:63;1433:6;1426:4;1421:3;1417:14;1410:4;1403:5;1399:16;1377:63;:::i;:::-;1494:2;1473:15;-1:-1:-1;;1469:29:1;1460:39;;;;1501:4;1456:50;;1254:258;-1:-1:-1;;1254:258:1:o;1517:220::-;1666:2;1655:9;1648:21;1629:4;1686:45;1727:2;1716:9;1712:18;1704:6;1686:45;:::i;1742:180::-;1801:6;1854:2;1842:9;1833:7;1829:23;1825:32;1822:52;;;1870:1;1867;1860:12;1822:52;-1:-1:-1;1893:23:1;;1742:180;-1:-1:-1;1742:180:1:o;2158:196::-;2226:20;;-1:-1:-1;;;;;2275:54:1;;2265:65;;2255:93;;2344:1;2341;2334:12;2359:254;2427:6;2435;2488:2;2476:9;2467:7;2463:23;2459:32;2456:52;;;2504:1;2501;2494:12;2456:52;2527:29;2546:9;2527:29;:::i;:::-;2517:39;2603:2;2588:18;;;;2575:32;;-1:-1:-1;;;2359:254:1:o;2800:328::-;2877:6;2885;2893;2946:2;2934:9;2925:7;2921:23;2917:32;2914:52;;;2962:1;2959;2952:12;2914:52;2985:29;3004:9;2985:29;:::i;:::-;2975:39;;3033:38;3067:2;3056:9;3052:18;3033:38;:::i;:::-;3023:48;;3118:2;3107:9;3103:18;3090:32;3080:42;;2800:328;;;;;:::o;3133:248::-;3201:6;3209;3262:2;3250:9;3241:7;3237:23;3233:32;3230:52;;;3278:1;3275;3268:12;3230:52;-1:-1:-1;;3301:23:1;;;3371:2;3356:18;;;3343:32;;-1:-1:-1;3133:248:1:o;3688:186::-;3747:6;3800:2;3788:9;3779:7;3775:23;3771:32;3768:52;;;3816:1;3813;3806:12;3768:52;3839:29;3858:9;3839:29;:::i;4072:184::-;-1:-1:-1;;;4121:1:1;4114:88;4221:4;4218:1;4211:15;4245:4;4242:1;4235:15;4261:275;4332:2;4326:9;4397:2;4378:13;;-1:-1:-1;;4374:27:1;4362:40;;4432:18;4417:34;;4453:22;;;4414:62;4411:88;;;4479:18;;:::i;:::-;4515:2;4508:22;4261:275;;-1:-1:-1;4261:275:1:o;4541:1026::-;4633:6;4641;4694:2;4682:9;4673:7;4669:23;4665:32;4662:52;;;4710:1;4707;4700:12;4662:52;4750:9;4737:23;4779:18;4820:2;4812:6;4809:14;4806:34;;;4836:1;4833;4826:12;4806:34;4874:6;4863:9;4859:22;4849:32;;4919:7;4912:4;4908:2;4904:13;4900:27;4890:55;;4941:1;4938;4931:12;4890:55;4977:2;4964:16;4999:4;5022:2;5018;5015:10;5012:36;;;5028:18;;:::i;:::-;5074:2;5071:1;5067:10;5057:20;;5097:28;5121:2;5117;5113:11;5097:28;:::i;:::-;5159:15;;;5229:11;;;5225:20;;;5190:12;;;;5257:19;;;5254:39;;;5289:1;5286;5279:12;5254:39;5313:11;;;;5333:148;5349:6;5344:3;5341:15;5333:148;;;5415:23;5434:3;5415:23;:::i;:::-;5403:36;;5366:12;;;;5459;;;;5333:148;;;5500:5;-1:-1:-1;5524:37:1;;-1:-1:-1;5542:18:1;;;5524:37;:::i;:::-;5514:47;;;;;;4541:1026;;;;;:::o;5572:632::-;5743:2;5795:21;;;5865:13;;5768:18;;;5887:22;;;5714:4;;5743:2;5966:15;;;;5940:2;5925:18;;;5714:4;6009:169;6023:6;6020:1;6017:13;6009:169;;;6084:13;;6072:26;;6153:15;;;;6118:12;;;;6045:1;6038:9;6009:169;;;-1:-1:-1;6195:3:1;;5572:632;-1:-1:-1;;;;;;5572:632:1:o;6209:407::-;6274:5;6308:18;6300:6;6297:30;6294:56;;;6330:18;;:::i;:::-;6368:57;6413:2;6392:15;;-1:-1:-1;;6388:29:1;6419:4;6384:40;6368:57;:::i;:::-;6359:66;;6448:6;6441:5;6434:21;6488:3;6479:6;6474:3;6470:16;6467:25;6464:45;;;6505:1;6502;6495:12;6464:45;6554:6;6549:3;6542:4;6535:5;6531:16;6518:43;6608:1;6601:4;6592:6;6585:5;6581:18;6577:29;6570:40;6209:407;;;;;:::o;6621:451::-;6690:6;6743:2;6731:9;6722:7;6718:23;6714:32;6711:52;;;6759:1;6756;6749:12;6711:52;6799:9;6786:23;6832:18;6824:6;6821:30;6818:50;;;6864:1;6861;6854:12;6818:50;6887:22;;6940:4;6932:13;;6928:27;-1:-1:-1;6918:55:1;;6969:1;6966;6959:12;6918:55;6992:74;7058:7;7053:2;7040:16;7035:2;7031;7027:11;6992:74;:::i;7077:269::-;7134:6;7187:2;7175:9;7166:7;7162:23;7158:32;7155:52;;;7203:1;7200;7193:12;7155:52;7242:9;7229:23;7292:4;7285:5;7281:16;7274:5;7271:27;7261:55;;7312:1;7309;7302:12;7540:258;7607:6;7615;7668:2;7656:9;7647:7;7643:23;7639:32;7636:52;;;7684:1;7681;7674:12;7636:52;7707:29;7726:9;7707:29;:::i;:::-;7697:39;;7755:37;7788:2;7777:9;7773:18;7755:37;:::i;:::-;7745:47;;7540:258;;;;;:::o;7803:347::-;7868:6;7876;7929:2;7917:9;7908:7;7904:23;7900:32;7897:52;;;7945:1;7942;7935:12;7897:52;7968:29;7987:9;7968:29;:::i;:::-;7958:39;;8047:2;8036:9;8032:18;8019:32;8094:5;8087:13;8080:21;8073:5;8070:32;8060:60;;8116:1;8113;8106:12;8060:60;8139:5;8129:15;;;7803:347;;;;;:::o;8155:667::-;8250:6;8258;8266;8274;8327:3;8315:9;8306:7;8302:23;8298:33;8295:53;;;8344:1;8341;8334:12;8295:53;8367:29;8386:9;8367:29;:::i;:::-;8357:39;;8415:38;8449:2;8438:9;8434:18;8415:38;:::i;:::-;8405:48;;8500:2;8489:9;8485:18;8472:32;8462:42;;8555:2;8544:9;8540:18;8527:32;8582:18;8574:6;8571:30;8568:50;;;8614:1;8611;8604:12;8568:50;8637:22;;8690:4;8682:13;;8678:27;-1:-1:-1;8668:55:1;;8719:1;8716;8709:12;8668:55;8742:74;8808:7;8803:2;8790:16;8785:2;8781;8777:11;8742:74;:::i;:::-;8732:84;;;8155:667;;;;;;;:::o;8827:366::-;8894:6;8902;8955:2;8943:9;8934:7;8930:23;8926:32;8923:52;;;8971:1;8968;8961:12;8923:52;8994:29;9013:9;8994:29;:::i;:::-;8984:39;;9073:2;9062:9;9058:18;9045:32;9117:26;9110:5;9106:38;9099:5;9096:49;9086:77;;9159:1;9156;9149:12;9198:260;9266:6;9274;9327:2;9315:9;9306:7;9302:23;9298:32;9295:52;;;9343:1;9340;9333:12;9295:52;9366:29;9385:9;9366:29;:::i;:::-;9356:39;;9414:38;9448:2;9437:9;9433:18;9414:38;:::i;9824:437::-;9903:1;9899:12;;;;9946;;;9967:61;;10021:4;10013:6;10009:17;9999:27;;9967:61;10074:2;10066:6;10063:14;10043:18;10040:38;10037:218;;-1:-1:-1;;;10108:1:1;10101:88;10212:4;10209:1;10202:15;10240:4;10237:1;10230:15;10037:218;;9824:437;;;:::o;12214:184::-;-1:-1:-1;;;12263:1:1;12256:88;12363:4;12360:1;12353:15;12387:4;12384:1;12377:15;12403:125;12443:4;12471:1;12468;12465:8;12462:34;;;12476:18;;:::i;:::-;-1:-1:-1;12513:9:1;;12403:125::o;13803:168::-;13843:7;13909:1;13905;13901:6;13897:14;13894:1;13891:21;13886:1;13879:9;13872:17;13868:45;13865:71;;;13916:18;;:::i;:::-;-1:-1:-1;13956:9:1;;13803:168::o;13976:184::-;-1:-1:-1;;;14025:1:1;14018:88;14125:4;14122:1;14115:15;14149:4;14146:1;14139:15;14165:120;14205:1;14231;14221:35;;14236:18;;:::i;:::-;-1:-1:-1;14270:9:1;;14165:120::o;14500:184::-;-1:-1:-1;;;14549:1:1;14542:88;14649:4;14646:1;14639:15;14673:4;14670:1;14663:15;14689:135;14728:3;14749:17;;;14746:43;;14769:18;;:::i;:::-;-1:-1:-1;14816:1:1;14805:13;;14689:135::o;14955:545::-;15057:2;15052:3;15049:11;15046:448;;;15093:1;15118:5;15114:2;15107:17;15163:4;15159:2;15149:19;15233:2;15221:10;15217:19;15214:1;15210:27;15204:4;15200:38;15269:4;15257:10;15254:20;15251:47;;;-1:-1:-1;15292:4:1;15251:47;15347:2;15342:3;15338:12;15335:1;15331:20;15325:4;15321:31;15311:41;;15402:82;15420:2;15413:5;15410:13;15402:82;;;15465:17;;;15446:1;15435:13;15402:82;;;15406:3;;;14955:545;;;:::o;15676:1352::-;15802:3;15796:10;15829:18;15821:6;15818:30;15815:56;;;15851:18;;:::i;:::-;15880:97;15970:6;15930:38;15962:4;15956:11;15930:38;:::i;:::-;15924:4;15880:97;:::i;:::-;16032:4;;16096:2;16085:14;;16113:1;16108:663;;;;16815:1;16832:6;16829:89;;;-1:-1:-1;16884:19:1;;;16878:26;16829:89;-1:-1:-1;;15633:1:1;15629:11;;;15625:24;15621:29;15611:40;15657:1;15653:11;;;15608:57;16931:81;;16078:944;;16108:663;14902:1;14895:14;;;14939:4;14926:18;;-1:-1:-1;;16144:20:1;;;16262:236;16276:7;16273:1;16270:14;16262:236;;;16365:19;;;16359:26;16344:42;;16457:27;;;;16425:1;16413:14;;;;16292:19;;16262:236;;;16266:3;16526:6;16517:7;16514:19;16511:201;;;16587:19;;;16581:26;-1:-1:-1;;16670:1:1;16666:14;;;16682:3;16662:24;16658:37;16654:42;16639:58;16624:74;;16511:201;-1:-1:-1;;;;;16758:1:1;16742:14;;;16738:22;16725:36;;-1:-1:-1;15676:1352:1:o;17854:217::-;17893:4;17922:6;17978:10;;;;17948;;18000:12;;;17997:38;;;18015:18;;:::i;:::-;18052:13;;17854:217;-1:-1:-1;;;17854:217:1:o;18913:1230::-;19137:3;19175:6;19169:13;19201:4;19214:51;19258:6;19253:3;19248:2;19240:6;19236:15;19214:51;:::i;:::-;19328:13;;19287:16;;;;19350:55;19328:13;19287:16;19372:15;;;19350:55;:::i;:::-;19494:13;;19427:20;;;19467:1;;19532:36;19494:13;19532:36;:::i;:::-;19587:1;19604:18;;;19631:141;;;;19786:1;19781:337;;;;19597:521;;19631:141;-1:-1:-1;;19666:24:1;;19652:39;;19743:16;;19736:24;19722:39;;19711:51;;;-1:-1:-1;19631:141:1;;19781:337;19812:6;19809:1;19802:17;19860:2;19857:1;19847:16;19885:1;19899:169;19913:8;19910:1;19907:15;19899:169;;;19995:14;;19980:13;;;19973:37;20038:16;;;;19930:10;;19899:169;;;19903:3;;20099:8;20092:5;20088:20;20081:27;;19597:521;-1:-1:-1;20134:3:1;;18913:1230;-1:-1:-1;;;;;;;;;;18913:1230:1:o;21779:128::-;21819:3;21850:1;21846:6;21843:1;21840:13;21837:39;;;21856:18;;:::i;:::-;-1:-1:-1;21892:9:1;;21779:128::o;22674:181::-;22712:3;22756:6;22749:5;22745:18;22782:7;22772:41;;22793:18;;:::i;:::-;-1:-1:-1;;22829:20:1;;22674:181;-1:-1:-1;;22674:181:1:o;22860:224::-;22899:3;22927:6;22960:2;22957:1;22953:10;22990:2;22987:1;22983:10;23021:3;23017:2;23013:12;23008:3;23005:21;23002:47;;;23029:18;;:::i;:::-;23065:13;;22860:224;-1:-1:-1;;;;22860:224:1:o;23089:197::-;23127:3;23155:6;23196:2;23189:5;23185:14;23223:2;23214:7;23211:15;23208:41;;23229:18;;:::i;:::-;23278:1;23265:15;;23089:197;-1:-1:-1;;;23089:197:1:o;24064:112::-;24096:1;24122;24112:35;;24127:18;;:::i;:::-;-1:-1:-1;24161:9:1;;24064:112::o;24181:512::-;24375:4;-1:-1:-1;;;;;24485:2:1;24477:6;24473:15;24462:9;24455:34;24537:2;24529:6;24525:15;24520:2;24509:9;24505:18;24498:43;;24577:6;24572:2;24561:9;24557:18;24550:34;24620:3;24615:2;24604:9;24600:18;24593:31;24641:46;24682:3;24671:9;24667:19;24659:6;24641:46;:::i;:::-;24633:54;24181:512;-1:-1:-1;;;;;;24181:512:1:o;24698:249::-;24767:6;24820:2;24808:9;24799:7;24795:23;24791:32;24788:52;;;24836:1;24833;24826:12;24788:52;24868:9;24862:16;24887:30;24911:5;24887:30;:::i
Swarm Source
ipfs://51f0e24aceabcb3725df0249c87e0f5e143fb7223b119792254f582c2edf340c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.