Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xcB503D6b7a8Ccf045aB9d2a3414a9832BAcf6074
Contract Name:
NFTMasterChef
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-01-29 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @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); } } // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) 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, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @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); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol) /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev removes all elements in Set */ function _removeAll(Set storage set) private { for (uint256 i = 0; i < set._values.length; i++) { delete set._indexes[set._values[i]]; } delete set._values; } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } function removeAll(UintSet storage set) internal { return _removeAll(set._inner); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // OpenZeppelin Contracts v4.4.1 (access/AccessControlEnumerable.sol) /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } interface ICRT { event MintToken(address indexed to, uint256 amount); function mint(address _to, uint256 _amount) external; function burn(address _to, uint256 _amount) external; } interface ICRTStore { event CRTTransfer(address indexed to, uint256 amount); function safeCRTTransfer(address to, uint256 amount) external; } // import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; // import '@pancakeswap/pancake-swap-lib/contracts/math/SafeMath.sol'; // import '@pancakeswap/pancake-swap-lib/contracts/token/BEP20/IBEP20.sol'; // import '@pancakeswap/pancake-swap-lib/contracts/token/BEP20/SafeBEP20.sol'; // import '@pancakeswap/pancake-swap-lib/contracts/access/Ownable.sol'; // import "./CakeToken.sol"; // import "./SyrupBar.sol"; contract NFTMasterChef is Ownable, IERC721Receiver { using SafeMath for uint256; using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.UintSet; // Info of each user. struct UserInfo { uint256 amount; // How many NFT ids the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. EnumerableSet.UintSet tokenIdList; } // Info of each pool. struct PoolInfo { IERC721 lpToken; // Address of NFT contract. uint256 totalStaked; // Number of Staking ids in this pool. uint256 allocPoint; // How many allocation points assigned to this pool. CAKEs to distribute per block. uint256 lastRewardBlock; // Last block number that CAKEs distribution occurs. uint256 accCRTPerShare; // Accumulated CRTs(Cronoswap Reward Token) per share, times 1e12. See below. } // The First CNS NFT Collection! IERC721 public cnft; ICRT public crt; ICRTStore public syrup; // CRT tokens created per block. uint256 public crtPerBlock; // Bonus muliplier for early cake makers. uint256 public BONUS_MULTIPLIER = 1; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes CNFT tokens. // poolID => UserInfo mapping(uint256 => mapping (address => UserInfo)) internal userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when CAKE mining starts. uint256 public startBlock; event Deposit(address indexed user, uint256 indexed pid, uint256 tokenId); event Harvest(address indexed user, uint256 indexed pid); event Withdraw(address indexed user, uint256 indexed pid, uint256 tokenId); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 tokenId); event UpdateEmissionRate(address indexed user, uint256 crtPerBlock); constructor( IERC721 _cnft, ICRT _crt, ICRTStore _syrup, uint256 _crtPerBlock, uint256 _startBlock ) { cnft = _cnft; crt = _crt; syrup = _syrup; crtPerBlock = _crtPerBlock; startBlock = _startBlock; // staking pool poolInfo.push(PoolInfo({ lpToken: _cnft, totalStaked: 0, allocPoint: 1000, lastRewardBlock: startBlock, accCRTPerShare: 0 })); totalAllocPoint = 1000; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns(bytes4) { return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } function updateMultiplier(uint256 multiplierNumber) public onlyOwner { BONUS_MULTIPLIER = multiplierNumber; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Get tokenIds staked for a given pool function getArrayTokenIDs(uint256 _pid, address _user) external view returns (uint256[] memory) { require (_pid < poolInfo.length, 'Invalid pool Id'); UserInfo storage user = userInfo[_pid][_user]; return user.tokenIdList.values(); } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add(uint256 _allocPoint, IERC721 _lpToken, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({ lpToken: _lpToken, totalStaked: 0, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accCRTPerShare: 0 })); updateStakingPool(); } // Update the given pool's CRT allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 prevAllocPoint = poolInfo[_pid].allocPoint; poolInfo[_pid].allocPoint = _allocPoint; if (prevAllocPoint != _allocPoint) { totalAllocPoint = totalAllocPoint.sub(prevAllocPoint).add(_allocPoint); updateStakingPool(); } } function updateStakingPool() internal { uint256 length = poolInfo.length; uint256 points = 0; for (uint256 pid = 1; pid < length; ++pid) { points = points.add(poolInfo[pid].allocPoint); } if (points != 0) { points = points.div(3); totalAllocPoint = totalAllocPoint.sub(poolInfo[0].allocPoint).add(points); poolInfo[0].allocPoint = points; } } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { return _to.sub(_from).mul(BONUS_MULTIPLIER); } // View function to see pending CRTs on frontend. function pendingCRT(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accCRTPerShare = pool.accCRTPerShare; uint256 lpSupply = pool.totalStaked; if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 crtReward = multiplier.mul(crtPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accCRTPerShare = accCRTPerShare.add(crtReward.mul(1e12).div(lpSupply)); } return user.amount.mul(accCRTPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.totalStaked; if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 crtReward = multiplier.mul(crtPerBlock).mul(pool.allocPoint).div(totalAllocPoint); crt.mint(address(syrup), crtReward); pool.accCRTPerShare = pool.accCRTPerShare.add(crtReward.mul(1e12).div(lpSupply)); pool.lastRewardBlock = block.number; } // Deposit NFT token to MasterChef for CRT allocation. function deposit(uint256 _pid, uint256 _tokenId) public { require (_pid < poolInfo.length, 'Invalid pool Id'); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(pool.lpToken.ownerOf(_tokenId) == msg.sender, "Invalid tokenId"); updatePool(_pid); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accCRTPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeCRTTransfer(msg.sender, pending); } } pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _tokenId); pool.totalStaked = pool.totalStaked.add(1); user.amount = user.amount.add(1); user.tokenIdList.add(_tokenId); user.rewardDebt = user.amount.mul(pool.accCRTPerShare).div(1e12); emit Deposit(msg.sender, _pid, _tokenId); } // Harvest rewards. function harvest(uint256 _pid) public { require (_pid < poolInfo.length, 'Invalid pool Id'); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accCRTPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeCRTTransfer(msg.sender, pending); } } user.rewardDebt = user.amount.mul(pool.accCRTPerShare).div(1e12); emit Harvest(msg.sender, _pid); } // Withdraw NFT token from MasterChef. function withdraw(uint256 _pid, uint256 _tokenId) public { require (_pid < poolInfo.length, 'Invalid pool Id'); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.tokenIdList.contains(_tokenId), "Not staked tokenId"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accCRTPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeCRTTransfer(msg.sender, pending); } user.amount = user.amount.sub(1); user.tokenIdList.remove(_tokenId); pool.lpToken.safeTransferFrom(address(this), address(msg.sender), _tokenId); pool.totalStaked = pool.totalStaked.sub(1); user.rewardDebt = user.amount.mul(pool.accCRTPerShare).div(1e12); emit Withdraw(msg.sender, _pid, _tokenId); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 length = user.tokenIdList.length(); pool.totalStaked = 0; for (uint256 i = 0; i < length; i++) { pool.lpToken.safeTransferFrom(address(this), address(msg.sender), user.tokenIdList.at(i)); } user.tokenIdList.removeAll(); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; } // Safe cake transfer function, just in case if rounding error causes pool to not have enough CAKEs. function safeCRTTransfer(address _to, uint256 _amount) internal { syrup.safeCRTTransfer(_to, _amount); } //Update emission rate function updateEmissionRate(uint256 _crtPerBlock) public onlyOwner { massUpdatePools(); crtPerBlock = _crtPerBlock; emit UpdateEmissionRate(msg.sender, _crtPerBlock); } }
[{"inputs":[{"internalType":"contract IERC721","name":"_cnft","type":"address"},{"internalType":"contract ICRT","name":"_crt","type":"address"},{"internalType":"contract ICRTStore","name":"_syrup","type":"address"},{"internalType":"uint256","name":"_crtPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Harvest","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"crtPerBlock","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC721","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cnft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crt","outputs":[{"internalType":"contract ICRT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crtPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getArrayTokenIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingCRT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC721","name":"lpToken","type":"address"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accCRTPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"syrup","outputs":[{"internalType":"contract ICRTStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_crtPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"multiplierNumber","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600160055560006008553480156200001b57600080fd5b50604051620032933803806200329383398181016040528101906200004191906200034d565b62000061620000556200022560201b60201c565b6200022d60201b60201c565b84600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816004819055508060098190555060066040518060a001604052808773ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016103e8815260200160095481526020016000815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015550506103e86008819055505050505050620004b1565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620003028162000449565b92915050565b600081519050620003198162000463565b92915050565b60008151905062000330816200047d565b92915050565b600081519050620003478162000497565b92915050565b600080600080600060a086880312156200036657600080fd5b600062000376888289016200031f565b9550506020620003898882890162000308565b94505060406200039c88828901620002f1565b9350506060620003af8882890162000336565b9250506080620003c28882890162000336565b9150509295509295909350565b6000620003dc826200041f565b9050919050565b6000620003f082620003cf565b9050919050565b60006200040482620003cf565b9050919050565b60006200041882620003cf565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6200045481620003e3565b81146200046057600080fd5b50565b6200046e81620003f7565b81146200047a57600080fd5b50565b62000488816200040b565b81146200049457600080fd5b50565b620004a2816200043f565b8114620004ae57600080fd5b50565b612dd280620004c16000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635ffe6146116100de5780638da5cb5b11610097578063b9dcb58611610071578063b9dcb5861461044f578063ddc632621461046d578063e2bbb15814610489578063f2fde38b146104a55761018e565b80638da5cb5b146103d15780638dbb1e3a146103ef578063a71896dc1461041f5761018e565b80635ffe614614610349578063630b5ba11461036557806364482f791461036f578063715018a61461038b57806386a952c4146103955780638aa28550146103b35761018e565b806317caf6f11161014b578063441a3e7011610125578063441a3e70146102d757806348cd4cb1146102f357806351eb05a6146103115780635312ea8e1461032d5761018e565b806317caf6f11461027f5780631eaaa0451461029d5780633b8521e3146102b95761018e565b8063081e3eda146101935780630868aad6146101b15780630ba84cd2146101cf578063150b7a02146101eb5780631526fe271461021b5780631638f5d11461024f575b600080fd5b61019b6104c1565b6040516101a89190612a2d565b60405180910390f35b6101b96104ce565b6040516101c69190612904565b60405180910390f35b6101e960048036038101906101e491906124ad565b6104f4565b005b6102056004803603810190610200919061242d565b6105d0565b60405161021291906128ce565b60405180910390f35b610235600480360381019061023091906124ad565b6105fe565b60405161024695949392919061293a565b60405180910390f35b610269600480360381019061026491906124d6565b610664565b6040516102769190612a2d565b60405180910390f35b610287610816565b6040516102949190612a2d565b60405180910390f35b6102b760048036038101906102b29190612512565b61081c565b005b6102c16109c2565b6040516102ce919061291f565b60405180910390f35b6102f160048036038101906102ec9190612561565b6109e8565b005b6102fb610d07565b6040516103089190612a2d565b60405180910390f35b61032b600480360381019061032691906124ad565b610d0d565b005b610347600480360381019061034291906124ad565b610eeb565b005b610363600480360381019061035e91906124ad565b6110e5565b005b61036d61116b565b005b6103896004803603810190610384919061259d565b61119e565b005b61039361130c565b005b61039d611394565b6040516103aa91906128e9565b60405180910390f35b6103bb6113ba565b6040516103c89190612a2d565b60405180910390f35b6103d96113c0565b6040516103e69190612831565b60405180910390f35b61040960048036038101906104049190612561565b6113e9565b6040516104169190612a2d565b60405180910390f35b610439600480360381019061043491906124d6565b61141a565b60405161044691906128ac565b60405180910390f35b6104576114cc565b6040516104649190612a2d565b60405180910390f35b610487600480360381019061048291906124ad565b6114d2565b005b6104a3600480360381019061049e9190612561565b6116b4565b005b6104bf60048036038101906104ba91906123db565b611aa6565b005b6000600680549050905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104fc611b9e565b73ffffffffffffffffffffffffffffffffffffffff1661051a6113c0565b73ffffffffffffffffffffffffffffffffffffffff1614610570576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610567906129ed565b60405180910390fd5b61057861116b565b806004819055503373ffffffffffffffffffffffffffffffffffffffff167fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c4053826040516105c59190612a2d565b60405180910390a250565b60007f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f905095945050505050565b6006818154811061060e57600080fd5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b600080600684815481106106a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905060006007600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260040154905060008360010154905083600301544311801561072b575060008114155b156107c65760006107408560030154436113e9565b90506000610783600854610775886002015461076760045487611ba690919063ffffffff16565b611ba690919063ffffffff16565b611bbc90919063ffffffff16565b90506107c16107b2846107a464e8d4a5100085611ba690919063ffffffff16565b611bbc90919063ffffffff16565b85611bd290919063ffffffff16565b935050505b61080a83600101546107fc64e8d4a510006107ee868860000154611ba690919063ffffffff16565b611bbc90919063ffffffff16565b611be890919063ffffffff16565b94505050505092915050565b60085481565b610824611b9e565b73ffffffffffffffffffffffffffffffffffffffff166108426113c0565b73ffffffffffffffffffffffffffffffffffffffff1614610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f906129ed565b60405180910390fd5b80156108a7576108a661116b565b5b600060095443116108ba576009546108bc565b435b90506108d384600854611bd290919063ffffffff16565b60088190555060066040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001600081526020018681526020018381526020016000815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015550506109bc611bfe565b50505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6006805490508210610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a26906129ad565b60405180910390fd5b600060068381548110610a6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905060006007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610ae58382600201611d7790919063ffffffff16565b610b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1b90612a0d565b60405180910390fd5b610b2d84610d0d565b6000610b778260010154610b6964e8d4a51000610b5b87600401548760000154611ba690919063ffffffff16565b611bbc90919063ffffffff16565b611be890919063ffffffff16565b90506000811115610b8d57610b8c3382611d91565b5b610ba560018360000154611be890919063ffffffff16565b8260000181905550610bc38483600201611e2490919063ffffffff16565b508260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033876040518463ffffffff1660e01b8152600401610c259392919061284c565b600060405180830381600087803b158015610c3f57600080fd5b505af1158015610c53573d6000803e3d6000fd5b50505050610c6f60018460010154611be890919063ffffffff16565b8360010181905550610ca964e8d4a51000610c9b85600401548560000154611ba690919063ffffffff16565b611bbc90919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051610cf89190612a2d565b60405180910390a35050505050565b60095481565b600060068281548110610d49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905080600301544311610d6a5750610ee8565b6000816001015490506000811415610d8c574382600301819055505050610ee8565b6000610d9c8360030154436113e9565b90506000610ddf600854610dd18660020154610dc360045487611ba690919063ffffffff16565b611ba690919063ffffffff16565b611bbc90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610e60929190612883565b600060405180830381600087803b158015610e7a57600080fd5b505af1158015610e8e573d6000803e3d6000fd5b50505050610ed2610ebf84610eb164e8d4a5100085611ba690919063ffffffff16565b611bbc90919063ffffffff16565b8560040154611bd290919063ffffffff16565b8460040181905550438460030181905550505050505b50565b600060068281548110610f27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905060006007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610f9982600201611e3e565b90506000836001018190555060005b8181101561106b578360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30336110088588600201611e5390919063ffffffff16565b6040518463ffffffff1660e01b81526004016110269392919061284c565b600060405180830381600087803b15801561104057600080fd5b505af1158015611054573d6000803e3d6000fd5b50505050808061106390612c99565b915050610fa8565b5061107882600201611e6d565b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059584600001546040516110c39190612a2d565b60405180910390a3600082600001819055506000826001018190555050505050565b6110ed611b9e565b73ffffffffffffffffffffffffffffffffffffffff1661110b6113c0565b73ffffffffffffffffffffffffffffffffffffffff1614611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906129ed565b60405180910390fd5b8060058190555050565b6000600680549050905060005b8181101561119a5761118981610d0d565b8061119390612c99565b9050611178565b5050565b6111a6611b9e565b73ffffffffffffffffffffffffffffffffffffffff166111c46113c0565b73ffffffffffffffffffffffffffffffffffffffff161461121a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611211906129ed565b60405180910390fd5b80156112295761122861116b565b5b600060068481548110611265577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906005020160020154905082600685815481106112b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906005020160020181905550828114611306576112f7836112e983600854611be890919063ffffffff16565b611bd290919063ffffffff16565b600881905550611305611bfe565b5b50505050565b611314611b9e565b73ffffffffffffffffffffffffffffffffffffffff166113326113c0565b73ffffffffffffffffffffffffffffffffffffffff1614611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f906129ed565b60405180910390fd5b6113926000611e7c565b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006114126005546114048585611be890919063ffffffff16565b611ba690919063ffffffff16565b905092915050565b60606006805490508310611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a906129ad565b60405180910390fd5b60006007600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506114c381600201611f40565b91505092915050565b60045481565b6006805490508110611519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611510906129ad565b60405180910390fd5b600060068281548110611555577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905060006007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506115c283610d0d565b600081600001541115611631576000611619826001015461160b64e8d4a510006115fd87600401548760000154611ba690919063ffffffff16565b611bbc90919063ffffffff16565b611be890919063ffffffff16565b9050600081111561162f5761162e3382611d91565b5b505b61166364e8d4a5100061165584600401548460000154611ba690919063ffffffff16565b611bbc90919063ffffffff16565b8160010181905550823373ffffffffffffffffffffffffffffffffffffffff167fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba60405160405180910390a3505050565b60068054905082106116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f2906129ad565b60405180910390fd5b600060068381548110611737577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905060006007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b815260040161180f9190612a2d565b60206040518083038186803b15801561182757600080fd5b505afa15801561183b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185f9190612404565b73ffffffffffffffffffffffffffffffffffffffff16146118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac906129cd565b60405180910390fd5b6118be84610d0d565b60008160000154111561192d576000611915826001015461190764e8d4a510006118f987600401548760000154611ba690919063ffffffff16565b611bbc90919063ffffffff16565b611be890919063ffffffff16565b9050600081111561192b5761192a3382611d91565b5b505b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330866040518463ffffffff1660e01b815260040161198e9392919061284c565b600060405180830381600087803b1580156119a857600080fd5b505af11580156119bc573d6000803e3d6000fd5b505050506119d860018360010154611bd290919063ffffffff16565b82600101819055506119f860018260000154611bd290919063ffffffff16565b8160000181905550611a168382600201611f6190919063ffffffff16565b50611a4964e8d4a51000611a3b84600401548460000154611ba690919063ffffffff16565b611bbc90919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1585604051611a989190612a2d565b60405180910390a350505050565b611aae611b9e565b73ffffffffffffffffffffffffffffffffffffffff16611acc6113c0565b73ffffffffffffffffffffffffffffffffffffffff1614611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b19906129ed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b899061298d565b60405180910390fd5b611b9b81611e7c565b50565b600033905090565b60008183611bb49190612b19565b905092915050565b60008183611bca9190612ae8565b905092915050565b60008183611be09190612a92565b905092915050565b60008183611bf69190612b73565b905092915050565b60006006805490509050600080600190505b82811015611c8957611c7660068281548110611c55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600502016002015483611bd290919063ffffffff16565b915080611c8290612c99565b9050611c10565b5060008114611d7357611ca6600382611bbc90919063ffffffff16565b9050611d1b81611d0d6006600081548110611cea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906005020160020154600854611be890919063ffffffff16565b611bd290919063ffffffff16565b600881905550806006600081548110611d5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201600201819055505b5050565b6000611d89836000018360001b611f7b565b905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632494ec5a83836040518363ffffffff1660e01b8152600401611dee929190612883565b600060405180830381600087803b158015611e0857600080fd5b505af1158015611e1c573d6000803e3d6000fd5b505050505050565b6000611e36836000018360001b611f9e565b905092915050565b6000611e4c82600001612124565b9050919050565b6000611e628360000183612135565b60001c905092915050565b611e7981600001612186565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000611f508360000161221e565b905060608190508092505050919050565b6000611f73836000018360001b61227a565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612118576000600182611fd09190612b73565b9050600060018660000180549050611fe89190612b73565b90508181146120a357600086600001828154811061202f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612079577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806120dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061211e565b60009150505b92915050565b600081600001805490509050919050565b6000826000018281548110612173577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60005b816000018054905081101561220a578160010160008360000183815481106121da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060009055808061220290612c99565b915050612189565b5080600001600061221b91906122ea565b50565b60608160000180548060200260200160405190810160405280929190818152602001828054801561226e57602002820191906000526020600020905b81548152602001906001019080831161225a575b50505050509050919050565b60006122868383611f7b565b6122df5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506122e4565b600090505b92915050565b5080546000825590600052602060002090810190612308919061230b565b50565b5b8082111561232457600081600090555060010161230c565b5090565b60008135905061233781612d40565b92915050565b60008151905061234c81612d40565b92915050565b60008135905061236181612d57565b92915050565b60008083601f84011261237957600080fd5b8235905067ffffffffffffffff81111561239257600080fd5b6020830191508360018202830111156123aa57600080fd5b9250929050565b6000813590506123c081612d6e565b92915050565b6000813590506123d581612d85565b92915050565b6000602082840312156123ed57600080fd5b60006123fb84828501612328565b91505092915050565b60006020828403121561241657600080fd5b60006124248482850161233d565b91505092915050565b60008060008060006080868803121561244557600080fd5b600061245388828901612328565b955050602061246488828901612328565b9450506040612475888289016123c6565b935050606086013567ffffffffffffffff81111561249257600080fd5b61249e88828901612367565b92509250509295509295909350565b6000602082840312156124bf57600080fd5b60006124cd848285016123c6565b91505092915050565b600080604083850312156124e957600080fd5b60006124f7858286016123c6565b925050602061250885828601612328565b9150509250929050565b60008060006060848603121561252757600080fd5b6000612535868287016123c6565b9350506020612546868287016123b1565b925050604061255786828701612352565b9150509250925092565b6000806040838503121561257457600080fd5b6000612582858286016123c6565b9250506020612593858286016123c6565b9150509250929050565b6000806000606084860312156125b257600080fd5b60006125c0868287016123c6565b93505060206125d1868287016123c6565b92505060406125e286828701612352565b9150509250925092565b60006125f88383612813565b60208301905092915050565b61260d81612ba7565b82525050565b600061261e82612a58565b6126288185612a70565b935061263383612a48565b8060005b8381101561266457815161264b88826125ec565b975061265683612a63565b925050600181019050612637565b5085935050505092915050565b61267a81612bc5565b82525050565b61268981612c2d565b82525050565b61269881612c51565b82525050565b6126a781612c75565b82525050565b60006126ba602683612a81565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612720600f83612a81565b91507f496e76616c696420706f6f6c20496400000000000000000000000000000000006000830152602082019050919050565b6000612760600f83612a81565b91507f496e76616c696420746f6b656e496400000000000000000000000000000000006000830152602082019050919050565b60006127a0602083612a81565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006127e0601283612a81565b91507f4e6f74207374616b656420746f6b656e496400000000000000000000000000006000830152602082019050919050565b61281c81612c23565b82525050565b61282b81612c23565b82525050565b60006020820190506128466000830184612604565b92915050565b60006060820190506128616000830186612604565b61286e6020830185612604565b61287b6040830184612822565b949350505050565b60006040820190506128986000830185612604565b6128a56020830184612822565b9392505050565b600060208201905081810360008301526128c68184612613565b905092915050565b60006020820190506128e36000830184612671565b92915050565b60006020820190506128fe6000830184612680565b92915050565b6000602082019050612919600083018461268f565b92915050565b6000602082019050612934600083018461269e565b92915050565b600060a08201905061294f600083018861269e565b61295c6020830187612822565b6129696040830186612822565b6129766060830185612822565b6129836080830184612822565b9695505050505050565b600060208201905081810360008301526129a6816126ad565b9050919050565b600060208201905081810360008301526129c681612713565b9050919050565b600060208201905081810360008301526129e681612753565b9050919050565b60006020820190508181036000830152612a0681612793565b9050919050565b60006020820190508181036000830152612a26816127d3565b9050919050565b6000602082019050612a426000830184612822565b92915050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612a9d82612c23565b9150612aa883612c23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612add57612adc612ce2565b5b828201905092915050565b6000612af382612c23565b9150612afe83612c23565b925082612b0e57612b0d612d11565b5b828204905092915050565b6000612b2482612c23565b9150612b2f83612c23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b6857612b67612ce2565b5b828202905092915050565b6000612b7e82612c23565b9150612b8983612c23565b925082821015612b9c57612b9b612ce2565b5b828203905092915050565b6000612bb282612c03565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000612bfc82612ba7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612c3882612c3f565b9050919050565b6000612c4a82612c03565b9050919050565b6000612c5c82612c63565b9050919050565b6000612c6e82612c03565b9050919050565b6000612c8082612c87565b9050919050565b6000612c9282612c03565b9050919050565b6000612ca482612c23565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612cd757612cd6612ce2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b612d4981612ba7565b8114612d5457600080fd5b50565b612d6081612bb9565b8114612d6b57600080fd5b50565b612d7781612bf1565b8114612d8257600080fd5b50565b612d8e81612c23565b8114612d9957600080fd5b5056fea26469706673582212205027cd1849a0734998dd56602a8c9a3c1e686e6ab1079c3ffee4e7b5140ea34d64736f6c63430008000033000000000000000000000000c21d40acad65b1796d08bcfb02fe3d8d8bdc433d0000000000000000000000006b034644af43fe3e6025461539f4c0c224044ac00000000000000000000000009c81697d32f46966aa76a4f026b0d5604dde4ac00000000000000000000000000000000000000000000000000c7d713b49da00000000000000000000000000000000000000000000000000000000000000130132
Deployed ByteCode Sourcemap
74610:11013:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77621:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75618:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85420:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77232:248;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75860:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;80062:733;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76137:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78203:572;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75585:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83576:905;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76228:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81136:713;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84552:594;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77490:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80878:180;;;:::i;:::-;;78870:449;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22857:103;;;:::i;:::-;;75640:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75789:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22206:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79856:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77769:265;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75709:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82912:612;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81917:962;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23115:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77621:95;77666:7;77693:8;:15;;;;77686:22;;77621:95;:::o;75618:15::-;;;;;;;;;;;;;:::o;85420:200::-;22437:12;:10;:12::i;:::-;22426:23;;:7;:5;:7::i;:::-;:23;;;22418:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;85498:17:::1;:15;:17::i;:::-;85540:12;85526:11;:26;;;;85587:10;85568:44;;;85599:12;85568:44;;;;;;:::i;:::-;;;;;;;;85420:200:::0;:::o;77232:248::-;77378:6;77411:60;77397:75;;77232:248;;;;;;;:::o;75860:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80062:733::-;80134:7;80154:21;80178:8;80187:4;80178:14;;;;;;;;;;;;;;;;;;;;;;;;;;80154:38;;80203:21;80227:8;:14;80236:4;80227:14;;;;;;;;;;;:21;80242:5;80227:21;;;;;;;;;;;;;;;80203:45;;80259:22;80284:4;:19;;;80259:44;;80316:16;80335:4;:16;;;80316:35;;80383:4;:20;;;80368:12;:35;:52;;;;;80419:1;80407:8;:13;;80368:52;80364:344;;;80437:18;80458:49;80472:4;:20;;;80494:12;80458:13;:49::i;:::-;80437:70;;80522:17;80542:69;80595:15;;80542:48;80574:4;:15;;;80542:27;80557:11;;80542:10;:14;;:27;;;;:::i;:::-;:31;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;80522:89;;80643:53;80662:33;80686:8;80662:19;80676:4;80662:9;:13;;:19;;;;:::i;:::-;:23;;:33;;;;:::i;:::-;80643:14;:18;;:53;;;;:::i;:::-;80626:70;;80364:344;;;80725:62;80771:4;:15;;;80725:41;80761:4;80725:31;80741:14;80725:4;:11;;;:15;;:31;;;;:::i;:::-;:35;;:41;;;;:::i;:::-;:45;;:62;;;;:::i;:::-;80718:69;;;;;;80062:733;;;;:::o;76137:34::-;;;;:::o;78203:572::-;22437:12;:10;:12::i;:::-;22426:23;;:7;:5;:7::i;:::-;:23;;;22418:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78305:11:::1;78301:61;;;78333:17;:15;:17::i;:::-;78301:61;78372:23;78413:10;;78398:12;:25;:53;;78441:10;;78398:53;;;78426:12;78398:53;78372:79;;78480:32;78500:11;78480:15;;:19;;:32;;;;:::i;:::-;78462:15;:50;;;;78523:8;78537:199;;;;;;;;78570:8;78537:199;;;;;;78606:1;78537:199;;;;78634:11;78537:199;;;;78677:15;78537:199;;;;78723:1;78537:199;;::::0;78523:214:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78748:19;:17;:19::i;:::-;22497:1;78203:572:::0;;;:::o;75585:19::-;;;;;;;;;;;;;:::o;83576:905::-;83660:8;:15;;;;83653:4;:22;83644:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;83708:21;83732:8;83741:4;83732:14;;;;;;;;;;;;;;;;;;;;;;;;;;83708:38;;83757:21;83781:8;:14;83790:4;83781:14;;;;;;;;;;;:26;83796:10;83781:26;;;;;;;;;;;;;;;83757:50;;83826:35;83852:8;83826:4;:16;;:25;;:35;;;;:::i;:::-;83818:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;83897:16;83908:4;83897:10;:16::i;:::-;83924:15;83942:67;83993:4;:15;;;83942:46;83983:4;83942:36;83958:4;:19;;;83942:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;:50;;:67;;;;:::i;:::-;83924:85;;84033:1;84023:7;:11;84020:79;;;84051:36;84067:10;84079:7;84051:15;:36::i;:::-;84020:79;84133:18;84149:1;84133:4;:11;;;:15;;:18;;;;:::i;:::-;84119:4;:11;;:32;;;;84162:33;84186:8;84162:4;:16;;:23;;:33;;;;:::i;:::-;;84208:4;:12;;;;;;;;;;;;:29;;;84246:4;84261:10;84274:8;84208:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84313:23;84334:1;84313:4;:16;;;:20;;:23;;;;:::i;:::-;84294:4;:16;;:42;;;;84375:46;84416:4;84375:36;84391:4;:19;;;84375:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;84357:4;:15;;:64;;;;84458:4;84446:10;84437:36;;;84464:8;84437:36;;;;;;:::i;:::-;;;;;;;;83576:905;;;;;:::o;76228:25::-;;;;:::o;81136:713::-;81188:21;81212:8;81221:4;81212:14;;;;;;;;;;;;;;;;;;;;;;;;;;81188:38;;81257:4;:20;;;81241:12;:36;81237:75;;81294:7;;;81237:75;81324:16;81343:4;:16;;;81324:35;;81388:1;81376:8;:13;81372:102;;;81429:12;81406:4;:20;;:35;;;;81456:7;;;;81372:102;81484:18;81505:49;81519:4;:20;;;81541:12;81505:13;:49::i;:::-;81484:70;;81565:17;81585:69;81638:15;;81585:48;81617:4;:15;;;81585:27;81600:11;;81585:10;:14;;:27;;;;:::i;:::-;:31;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;81565:89;;81667:3;;;;;;;;;;;:8;;;81684:5;;;;;;;;;;;81692:9;81667:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81737:58;81761:33;81785:8;81761:19;81775:4;81761:9;:13;;:19;;;;:::i;:::-;:23;;:33;;;;:::i;:::-;81737:4;:19;;;:23;;:58;;;;:::i;:::-;81715:4;:19;;:80;;;;81829:12;81806:4;:20;;:35;;;;81136:713;;;;;;:::o;84552:594::-;84611:21;84635:8;84644:4;84635:14;;;;;;;;;;;;;;;;;;;;;;;;;;84611:38;;84660:21;84684:8;:14;84693:4;84684:14;;;;;;;;;;;:26;84699:10;84684:26;;;;;;;;;;;;;;;84660:50;;84723:14;84740:25;:4;:16;;:23;:25::i;:::-;84723:42;;84795:1;84776:4;:16;;:20;;;;84812:9;84807:153;84831:6;84827:1;:10;84807:153;;;84859:4;:12;;;;;;;;;;;;:29;;;84897:4;84912:10;84925:22;84945:1;84925:4;:16;;:19;;:22;;;;:::i;:::-;84859:89;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84839:3;;;;;:::i;:::-;;;;84807:153;;;;84980:28;:4;:16;;:26;:28::i;:::-;85064:4;85052:10;85034:48;;;85070:4;:11;;;85034:48;;;;;;:::i;:::-;;;;;;;;85107:1;85093:4;:11;;:15;;;;85137:1;85119:4;:15;;:19;;;;84552:594;;;;:::o;77490:123::-;22437:12;:10;:12::i;:::-;22426:23;;:7;:5;:7::i;:::-;:23;;;22418:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77589:16:::1;77570;:35;;;;77490:123:::0;:::o;80878:180::-;80923:14;80940:8;:15;;;;80923:32;;80971:11;80966:85;80994:6;80988:3;:12;80966:85;;;81024:15;81035:3;81024:10;:15::i;:::-;81002:5;;;;:::i;:::-;;;80966:85;;;;80878:180;:::o;78870:449::-;22437:12;:10;:12::i;:::-;22426:23;;:7;:5;:7::i;:::-;:23;;;22418:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78968:11:::1;78964:61;;;78996:17;:15;:17::i;:::-;78964:61;79035:22;79060:8;79069:4;79060:14;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;79035:50;;79124:11;79096:8;79105:4;79096:14;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:39;;;;79168:11;79150:14;:29;79146:166;;79214:52;79254:11;79214:35;79234:14;79214:15;;:19;;:35;;;;:::i;:::-;:39;;:52;;;;:::i;:::-;79196:15;:70;;;;79281:19;:17;:19::i;:::-;79146:166;22497:1;78870:449:::0;;;:::o;22857:103::-;22437:12;:10;:12::i;:::-;22426:23;;:7;:5;:7::i;:::-;:23;;;22418:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22922:30:::1;22949:1;22922:18;:30::i;:::-;22857:103::o:0;75640:22::-;;;;;;;;;;;;;:::o;75789:35::-;;;;:::o;22206:87::-;22252:7;22279:6;;;;;;;;;;;22272:13;;22206:87;:::o;79856:143::-;79928:7;79955:36;79974:16;;79955:14;79963:5;79955:3;:7;;:14;;;;:::i;:::-;:18;;:36;;;;:::i;:::-;79948:43;;79856:143;;;;:::o;77769:265::-;77847:16;77892:8;:15;;;;77885:4;:22;77876:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;77938:21;77962:8;:14;77971:4;77962:14;;;;;;;;;;;:21;77977:5;77962:21;;;;;;;;;;;;;;;77938:45;;78001:25;:4;:16;;:23;:25::i;:::-;77994:32;;;77769:265;;;;:::o;75709:26::-;;;;:::o;82912:612::-;82977:8;:15;;;;82970:4;:22;82961:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;83025:21;83049:8;83058:4;83049:14;;;;;;;;;;;;;;;;;;;;;;;;;;83025:38;;83074:21;83098:8;:14;83107:4;83098:14;;;;;;;;;;;:26;83113:10;83098:26;;;;;;;;;;;;;;;83074:50;;83137:16;83148:4;83137:10;:16::i;:::-;83182:1;83168:4;:11;;;:15;83164:235;;;83200:15;83218:67;83269:4;:15;;;83218:46;83259:4;83218:36;83234:4;:19;;;83218:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;:50;;:67;;;;:::i;:::-;83200:85;;83313:1;83303:7;:11;83300:88;;;83335:36;83351:10;83363:7;83335:15;:36::i;:::-;83300:88;83164:235;;83429:46;83470:4;83429:36;83445:4;:19;;;83429:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;83411:4;:15;;:64;;;;83511:4;83499:10;83491:25;;;;;;;;;;;;82912:612;;;:::o;81917:962::-;82002:8;:15;;;;81995:4;:22;81986:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;82050:21;82074:8;82083:4;82074:14;;;;;;;;;;;;;;;;;;;;;;;;;;82050:38;;82099:21;82123:8;:14;82132:4;82123:14;;;;;;;;;;;:26;82138:10;82123:26;;;;;;;;;;;;;;;82099:50;;82204:10;82170:44;;:4;:12;;;;;;;;;;;;:20;;;82191:8;82170:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;82162:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;82247:16;82258:4;82247:10;:16::i;:::-;82292:1;82278:4;:11;;;:15;82274:235;;;82310:15;82328:67;82379:4;:15;;;82328:46;82369:4;82328:36;82344:4;:19;;;82328:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;:50;;:67;;;;:::i;:::-;82310:85;;82423:1;82413:7;:11;82410:88;;;82445:36;82461:10;82473:7;82445:15;:36::i;:::-;82410:88;82274:235;;82529:4;:12;;;;;;;;;;;;:29;;;82567:10;82588:4;82595:8;82529:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82634:23;82655:1;82634:4;:16;;;:20;;:23;;;;:::i;:::-;82615:4;:16;;:42;;;;82684:18;82700:1;82684:4;:11;;;:15;;:18;;;;:::i;:::-;82670:4;:11;;:32;;;;82713:30;82734:8;82713:4;:16;;:20;;:30;;;;:::i;:::-;;82774:46;82815:4;82774:36;82790:4;:19;;;82774:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;82756:4;:15;;:64;;;;82856:4;82844:10;82836:35;;;82862:8;82836:35;;;;;;:::i;:::-;;;;;;;;81917:962;;;;:::o;23115:201::-;22437:12;:10;:12::i;:::-;22426:23;;:7;:5;:7::i;:::-;:23;;;22418:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23224:1:::1;23204:22;;:8;:22;;;;23196:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23280:28;23299:8;23280:18;:28::i;:::-;23115:201:::0;:::o;21016:98::-;21069:7;21096:10;21089:17;;21016:98;:::o;27183:::-;27241:7;27272:1;27268;:5;;;;:::i;:::-;27261:12;;27183:98;;;;:::o;27582:::-;27640:7;27671:1;27667;:5;;;;:::i;:::-;27660:12;;27582:98;;;;:::o;26445:::-;26503:7;26534:1;26530;:5;;;;:::i;:::-;26523:12;;26445:98;;;;:::o;26826:::-;26884:7;26915:1;26911;:5;;;;:::i;:::-;26904:12;;26826:98;;;;:::o;79327:453::-;79376:14;79393:8;:15;;;;79376:32;;79419:14;79453:11;79467:1;79453:15;;79448:115;79476:6;79470:3;:12;79448:115;;;79515:36;79526:8;79535:3;79526:13;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;79515:6;:10;;:36;;;;:::i;:::-;79506:45;;79484:5;;;;:::i;:::-;;;79448:115;;;;79587:1;79577:6;:11;79573:200;;79614:13;79625:1;79614:6;:10;;:13;;;;:::i;:::-;79605:22;;79660:55;79708:6;79660:43;79680:8;79689:1;79680:11;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;79660:15;;:19;;:43;;;;:::i;:::-;:47;;:55;;;;:::i;:::-;79642:15;:73;;;;79755:6;79730:8;79739:1;79730:11;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:31;;;;79573:200;79327:453;;:::o;69896:146::-;69973:4;69997:37;70007:3;:10;;70027:5;70019:14;;69997:9;:37::i;:::-;69990:44;;69896:146;;;;:::o;85262:122::-;85341:5;;;;;;;;;;;:21;;;85363:3;85368:7;85341:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85262:122;;:::o;69568:137::-;69638:4;69662:35;69670:3;:10;;69690:5;69682:14;;69662:7;:35::i;:::-;69655:42;;69568:137;;;;:::o;70128:114::-;70188:7;70215:19;70223:3;:10;;70215:7;:19::i;:::-;70208:26;;70128:114;;;:::o;70596:137::-;70667:7;70702:22;70706:3;:10;;70718:5;70702:3;:22::i;:::-;70694:31;;70687:38;;70596:137;;;;:::o;69713:97::-;69780:22;69791:3;:10;;69780;:22::i;:::-;69713:97;:::o;23476:191::-;23550:16;23569:6;;;;;;;;;;;23550:25;;23595:8;23586:6;;:17;;;;;;;;;;;;;;;;;;23650:8;23619:40;;23640:8;23619:40;;;;;;;;;;;;23476:191;;:::o;71283:263::-;71343:16;71372:22;71397:19;71405:3;:10;;71397:7;:19::i;:::-;71372:44;;71427:23;71497:5;71487:15;;71532:6;71525:13;;;;71283:263;;;:::o;69261:131::-;69328:4;69352:32;69357:3;:10;;69377:5;69369:14;;69352:4;:32::i;:::-;69345:39;;69261:131;;;;:::o;62754:129::-;62827:4;62874:1;62851:3;:12;;:19;62864:5;62851:19;;;;;;;;;;;;:24;;62844:31;;62754:129;;;;:::o;60978:1420::-;61044:4;61162:18;61183:3;:12;;:19;61196:5;61183:19;;;;;;;;;;;;61162:40;;61233:1;61219:10;:15;61215:1176;;61594:21;61631:1;61618:10;:14;;;;:::i;:::-;61594:38;;61647:17;61688:1;61667:3;:11;;:18;;;;:22;;;;:::i;:::-;61647:42;;61723:13;61710:9;:26;61706:405;;61757:17;61777:3;:11;;61789:9;61777:22;;;;;;;;;;;;;;;;;;;;;;;;61757:42;;61931:9;61902:3;:11;;61914:13;61902:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;62042:10;62016:3;:12;;:23;62029:9;62016:23;;;;;;;;;;;:36;;;;61706:405;;62192:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62287:3;:12;;:19;62300:5;62287:19;;;;;;;;;;;62280:26;;;62330:4;62323:11;;;;;;;61215:1176;62374:5;62367:12;;;60978:1420;;;;;:::o;62969:109::-;63025:7;63052:3;:11;;:18;;;;63045:25;;62969:109;;;:::o;63432:120::-;63499:7;63526:3;:11;;63538:5;63526:18;;;;;;;;;;;;;;;;;;;;;;;;63519:25;;63432:120;;;;:::o;62465:203::-;62526:9;62521:111;62545:3;:11;;:18;;;;62541:1;:22;62521:111;;;62592:3;:12;;:28;62605:3;:11;;62617:1;62605:14;;;;;;;;;;;;;;;;;;;;;;;;62592:28;;;;;;;;;;;62585:35;;;62565:3;;;;;:::i;:::-;;;;62521:111;;;;62649:3;:11;;;62642:18;;;;:::i;:::-;62465:203;:::o;64102:111::-;64158:16;64194:3;:11;;64187:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64102:111;;;:::o;60388:414::-;60451:4;60473:21;60483:3;60488:5;60473:9;:21::i;:::-;60468:327;;60511:3;:11;;60528:5;60511:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60694:3;:11;;:18;;;;60672:3;:12;;:19;60685:5;60672:19;;;;;;;;;;;:40;;;;60734:4;60727:11;;;;60468:327;60778:5;60771:12;;60388:414;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:133::-;;382:6;369:20;360:29;;398:30;422:5;398:30;:::i;:::-;350:84;;;;:::o;453:351::-;;;570:3;563:4;555:6;551:17;547:27;537:2;;588:1;585;578:12;537:2;624:6;611:20;601:30;;654:18;646:6;643:30;640:2;;;686:1;683;676:12;640:2;723:4;715:6;711:17;699:29;;777:3;769:4;761:6;757:17;747:8;743:32;740:41;737:2;;;794:1;791;784:12;737:2;527:277;;;;;:::o;810:169::-;;909:6;896:20;887:29;;925:48;967:5;925:48;:::i;:::-;877:102;;;;:::o;985:139::-;;1069:6;1056:20;1047:29;;1085:33;1112:5;1085:33;:::i;:::-;1037:87;;;;:::o;1130:262::-;;1238:2;1226:9;1217:7;1213:23;1209:32;1206:2;;;1254:1;1251;1244:12;1206:2;1297:1;1322:53;1367:7;1358:6;1347:9;1343:22;1322:53;:::i;:::-;1312:63;;1268:117;1196:196;;;;:::o;1398:284::-;;1517:2;1505:9;1496:7;1492:23;1488:32;1485:2;;;1533:1;1530;1523:12;1485:2;1576:1;1601:64;1657:7;1648:6;1637:9;1633:22;1601:64;:::i;:::-;1591:74;;1547:128;1475:207;;;;:::o;1688:829::-;;;;;;1866:3;1854:9;1845:7;1841:23;1837:33;1834:2;;;1883:1;1880;1873:12;1834:2;1926:1;1951:53;1996:7;1987:6;1976:9;1972:22;1951:53;:::i;:::-;1941:63;;1897:117;2053:2;2079:53;2124:7;2115:6;2104:9;2100:22;2079:53;:::i;:::-;2069:63;;2024:118;2181:2;2207:53;2252:7;2243:6;2232:9;2228:22;2207:53;:::i;:::-;2197:63;;2152:118;2337:2;2326:9;2322:18;2309:32;2368:18;2360:6;2357:30;2354:2;;;2400:1;2397;2390:12;2354:2;2436:64;2492:7;2483:6;2472:9;2468:22;2436:64;:::i;:::-;2418:82;;;;2280:230;1824:693;;;;;;;;:::o;2523:262::-;;2631:2;2619:9;2610:7;2606:23;2602:32;2599:2;;;2647:1;2644;2637:12;2599:2;2690:1;2715:53;2760:7;2751:6;2740:9;2736:22;2715:53;:::i;:::-;2705:63;;2661:117;2589:196;;;;:::o;2791:407::-;;;2916:2;2904:9;2895:7;2891:23;2887:32;2884:2;;;2932:1;2929;2922:12;2884:2;2975:1;3000:53;3045:7;3036:6;3025:9;3021:22;3000:53;:::i;:::-;2990:63;;2946:117;3102:2;3128:53;3173:7;3164:6;3153:9;3149:22;3128:53;:::i;:::-;3118:63;;3073:118;2874:324;;;;;:::o;3204:576::-;;;;3358:2;3346:9;3337:7;3333:23;3329:32;3326:2;;;3374:1;3371;3364:12;3326:2;3417:1;3442:53;3487:7;3478:6;3467:9;3463:22;3442:53;:::i;:::-;3432:63;;3388:117;3544:2;3570:68;3630:7;3621:6;3610:9;3606:22;3570:68;:::i;:::-;3560:78;;3515:133;3687:2;3713:50;3755:7;3746:6;3735:9;3731:22;3713:50;:::i;:::-;3703:60;;3658:115;3316:464;;;;;:::o;3786:407::-;;;3911:2;3899:9;3890:7;3886:23;3882:32;3879:2;;;3927:1;3924;3917:12;3879:2;3970:1;3995:53;4040:7;4031:6;4020:9;4016:22;3995:53;:::i;:::-;3985:63;;3941:117;4097:2;4123:53;4168:7;4159:6;4148:9;4144:22;4123:53;:::i;:::-;4113:63;;4068:118;3869:324;;;;;:::o;4199:546::-;;;;4338:2;4326:9;4317:7;4313:23;4309:32;4306:2;;;4354:1;4351;4344:12;4306:2;4397:1;4422:53;4467:7;4458:6;4447:9;4443:22;4422:53;:::i;:::-;4412:63;;4368:117;4524:2;4550:53;4595:7;4586:6;4575:9;4571:22;4550:53;:::i;:::-;4540:63;;4495:118;4652:2;4678:50;4720:7;4711:6;4700:9;4696:22;4678:50;:::i;:::-;4668:60;;4623:115;4296:449;;;;;:::o;4751:179::-;;4841:46;4883:3;4875:6;4841:46;:::i;:::-;4919:4;4914:3;4910:14;4896:28;;4831:99;;;;:::o;4936:118::-;5023:24;5041:5;5023:24;:::i;:::-;5018:3;5011:37;5001:53;;:::o;5090:732::-;;5238:54;5286:5;5238:54;:::i;:::-;5308:86;5387:6;5382:3;5308:86;:::i;:::-;5301:93;;5418:56;5468:5;5418:56;:::i;:::-;5497:7;5528:1;5513:284;5538:6;5535:1;5532:13;5513:284;;;5614:6;5608:13;5641:63;5700:3;5685:13;5641:63;:::i;:::-;5634:70;;5727:60;5780:6;5727:60;:::i;:::-;5717:70;;5573:224;5560:1;5557;5553:9;5548:14;;5513:284;;;5517:14;5813:3;5806:10;;5214:608;;;;;;;:::o;5828:115::-;5913:23;5930:5;5913:23;:::i;:::-;5908:3;5901:36;5891:52;;:::o;5949:167::-;6054:55;6103:5;6054:55;:::i;:::-;6049:3;6042:68;6032:84;;:::o;6122:157::-;6222:50;6266:5;6222:50;:::i;:::-;6217:3;6210:63;6200:79;;:::o;6285:161::-;6387:52;6433:5;6387:52;:::i;:::-;6382:3;6375:65;6365:81;;:::o;6452:370::-;;6615:67;6679:2;6674:3;6615:67;:::i;:::-;6608:74;;6712:34;6708:1;6703:3;6699:11;6692:55;6778:8;6773:2;6768:3;6764:12;6757:30;6813:2;6808:3;6804:12;6797:19;;6598:224;;;:::o;6828:313::-;;6991:67;7055:2;7050:3;6991:67;:::i;:::-;6984:74;;7088:17;7084:1;7079:3;7075:11;7068:38;7132:2;7127:3;7123:12;7116:19;;6974:167;;;:::o;7147:313::-;;7310:67;7374:2;7369:3;7310:67;:::i;:::-;7303:74;;7407:17;7403:1;7398:3;7394:11;7387:38;7451:2;7446:3;7442:12;7435:19;;7293:167;;;:::o;7466:330::-;;7629:67;7693:2;7688:3;7629:67;:::i;:::-;7622:74;;7726:34;7722:1;7717:3;7713:11;7706:55;7787:2;7782:3;7778:12;7771:19;;7612:184;;;:::o;7802:316::-;;7965:67;8029:2;8024:3;7965:67;:::i;:::-;7958:74;;8062:20;8058:1;8053:3;8049:11;8042:41;8109:2;8104:3;8100:12;8093:19;;7948:170;;;:::o;8124:108::-;8201:24;8219:5;8201:24;:::i;:::-;8196:3;8189:37;8179:53;;:::o;8238:118::-;8325:24;8343:5;8325:24;:::i;:::-;8320:3;8313:37;8303:53;;:::o;8362:222::-;;8493:2;8482:9;8478:18;8470:26;;8506:71;8574:1;8563:9;8559:17;8550:6;8506:71;:::i;:::-;8460:124;;;;:::o;8590:442::-;;8777:2;8766:9;8762:18;8754:26;;8790:71;8858:1;8847:9;8843:17;8834:6;8790:71;:::i;:::-;8871:72;8939:2;8928:9;8924:18;8915:6;8871:72;:::i;:::-;8953;9021:2;9010:9;9006:18;8997:6;8953:72;:::i;:::-;8744:288;;;;;;:::o;9038:332::-;;9197:2;9186:9;9182:18;9174:26;;9210:71;9278:1;9267:9;9263:17;9254:6;9210:71;:::i;:::-;9291:72;9359:2;9348:9;9344:18;9335:6;9291:72;:::i;:::-;9164:206;;;;;:::o;9376:373::-;;9557:2;9546:9;9542:18;9534:26;;9606:9;9600:4;9596:20;9592:1;9581:9;9577:17;9570:47;9634:108;9737:4;9728:6;9634:108;:::i;:::-;9626:116;;9524:225;;;;:::o;9755:218::-;;9884:2;9873:9;9869:18;9861:26;;9897:69;9963:1;9952:9;9948:17;9939:6;9897:69;:::i;:::-;9851:122;;;;:::o;9979:258::-;;10128:2;10117:9;10113:18;10105:26;;10141:89;10227:1;10216:9;10212:17;10203:6;10141:89;:::i;:::-;10095:142;;;;:::o;10243:248::-;;10387:2;10376:9;10372:18;10364:26;;10400:84;10481:1;10470:9;10466:17;10457:6;10400:84;:::i;:::-;10354:137;;;;:::o;10497:252::-;;10643:2;10632:9;10628:18;10620:26;;10656:86;10739:1;10728:9;10724:17;10715:6;10656:86;:::i;:::-;10610:139;;;;:::o;10755:694::-;;11013:3;11002:9;10998:19;10990:27;;11027:86;11110:1;11099:9;11095:17;11086:6;11027:86;:::i;:::-;11123:72;11191:2;11180:9;11176:18;11167:6;11123:72;:::i;:::-;11205;11273:2;11262:9;11258:18;11249:6;11205:72;:::i;:::-;11287;11355:2;11344:9;11340:18;11331:6;11287:72;:::i;:::-;11369:73;11437:3;11426:9;11422:19;11413:6;11369:73;:::i;:::-;10980:469;;;;;;;;:::o;11455:419::-;;11659:2;11648:9;11644:18;11636:26;;11708:9;11702:4;11698:20;11694:1;11683:9;11679:17;11672:47;11736:131;11862:4;11736:131;:::i;:::-;11728:139;;11626:248;;;:::o;11880:419::-;;12084:2;12073:9;12069:18;12061:26;;12133:9;12127:4;12123:20;12119:1;12108:9;12104:17;12097:47;12161:131;12287:4;12161:131;:::i;:::-;12153:139;;12051:248;;;:::o;12305:419::-;;12509:2;12498:9;12494:18;12486:26;;12558:9;12552:4;12548:20;12544:1;12533:9;12529:17;12522:47;12586:131;12712:4;12586:131;:::i;:::-;12578:139;;12476:248;;;:::o;12730:419::-;;12934:2;12923:9;12919:18;12911:26;;12983:9;12977:4;12973:20;12969:1;12958:9;12954:17;12947:47;13011:131;13137:4;13011:131;:::i;:::-;13003:139;;12901:248;;;:::o;13155:419::-;;13359:2;13348:9;13344:18;13336:26;;13408:9;13402:4;13398:20;13394:1;13383:9;13379:17;13372:47;13436:131;13562:4;13436:131;:::i;:::-;13428:139;;13326:248;;;:::o;13580:222::-;;13711:2;13700:9;13696:18;13688:26;;13724:71;13792:1;13781:9;13777:17;13768:6;13724:71;:::i;:::-;13678:124;;;;:::o;13808:132::-;;13898:3;13890:11;;13928:4;13923:3;13919:14;13911:22;;13880:60;;;:::o;13946:114::-;;14047:5;14041:12;14031:22;;14020:40;;;:::o;14066:113::-;;14168:4;14163:3;14159:14;14151:22;;14141:38;;;:::o;14185:184::-;;14318:6;14313:3;14306:19;14358:4;14353:3;14349:14;14334:29;;14296:73;;;;:::o;14375:169::-;;14493:6;14488:3;14481:19;14533:4;14528:3;14524:14;14509:29;;14471:73;;;;:::o;14550:305::-;;14609:20;14627:1;14609:20;:::i;:::-;14604:25;;14643:20;14661:1;14643:20;:::i;:::-;14638:25;;14797:1;14729:66;14725:74;14722:1;14719:81;14716:2;;;14803:18;;:::i;:::-;14716:2;14847:1;14844;14840:9;14833:16;;14594:261;;;;:::o;14861:185::-;;14918:20;14936:1;14918:20;:::i;:::-;14913:25;;14952:20;14970:1;14952:20;:::i;:::-;14947:25;;14991:1;14981:2;;14996:18;;:::i;:::-;14981:2;15038:1;15035;15031:9;15026:14;;14903:143;;;;:::o;15052:348::-;;15115:20;15133:1;15115:20;:::i;:::-;15110:25;;15149:20;15167:1;15149:20;:::i;:::-;15144:25;;15337:1;15269:66;15265:74;15262:1;15259:81;15254:1;15247:9;15240:17;15236:105;15233:2;;;15344:18;;:::i;:::-;15233:2;15392:1;15389;15385:9;15374:20;;15100:300;;;;:::o;15406:191::-;;15466:20;15484:1;15466:20;:::i;:::-;15461:25;;15500:20;15518:1;15500:20;:::i;:::-;15495:25;;15539:1;15536;15533:8;15530:2;;;15544:18;;:::i;:::-;15530:2;15589:1;15586;15582:9;15574:17;;15451:146;;;;:::o;15603:96::-;;15669:24;15687:5;15669:24;:::i;:::-;15658:35;;15648:51;;;:::o;15705:90::-;;15782:5;15775:13;15768:21;15757:32;;15747:48;;;:::o;15801:149::-;;15877:66;15870:5;15866:78;15855:89;;15845:105;;;:::o;15956:111::-;;16037:24;16055:5;16037:24;:::i;:::-;16026:35;;16016:51;;;:::o;16073:126::-;;16150:42;16143:5;16139:54;16128:65;;16118:81;;;:::o;16205:77::-;;16271:5;16260:16;;16250:32;;;:::o;16288:162::-;;16389:55;16438:5;16389:55;:::i;:::-;16376:68;;16366:84;;;:::o;16456:131::-;;16557:24;16575:5;16557:24;:::i;:::-;16544:37;;16534:53;;;:::o;16593:152::-;;16689:50;16733:5;16689:50;:::i;:::-;16676:63;;16666:79;;;:::o;16751:126::-;;16847:24;16865:5;16847:24;:::i;:::-;16834:37;;16824:53;;;:::o;16883:156::-;;16981:52;17027:5;16981:52;:::i;:::-;16968:65;;16958:81;;;:::o;17045:128::-;;17143:24;17161:5;17143:24;:::i;:::-;17130:37;;17120:53;;;:::o;17179:233::-;;17241:24;17259:5;17241:24;:::i;:::-;17232:33;;17287:66;17280:5;17277:77;17274:2;;;17357:18;;:::i;:::-;17274:2;17404:1;17397:5;17393:13;17386:20;;17222:190;;;:::o;17418:180::-;17466:77;17463:1;17456:88;17563:4;17560:1;17553:15;17587:4;17584:1;17577:15;17604:180;17652:77;17649:1;17642:88;17749:4;17746:1;17739:15;17773:4;17770:1;17763:15;17790:122;17863:24;17881:5;17863:24;:::i;:::-;17856:5;17853:35;17843:2;;17902:1;17899;17892:12;17843:2;17833:79;:::o;17918:116::-;17988:21;18003:5;17988:21;:::i;:::-;17981:5;17978:32;17968:2;;18024:1;18021;18014:12;17968:2;17958:76;:::o;18040:152::-;18128:39;18161:5;18128:39;:::i;:::-;18121:5;18118:50;18108:2;;18182:1;18179;18172:12;18108:2;18098:94;:::o;18198:122::-;18271:24;18289:5;18271:24;:::i;:::-;18264:5;18261:35;18251:2;;18310:1;18307;18300:12;18251:2;18241:79;:::o
Swarm Source
ipfs://5027cd1849a0734998dd56602a8c9a3c1e686e6ab1079c3ffee4e7b5140ea34d
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.