Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint Bot | 14236448 | 1076 days ago | IN | 0.0022 ETH | 0.00095634 | ||||
Mint Bot | 14097487 | 1097 days ago | IN | 0.0022 ETH | 0.00373539 | ||||
Mint Bot | 14097469 | 1097 days ago | IN | 0.0066 ETH | 0.00295353 | ||||
Set Price | 14035475 | 1107 days ago | IN | 0 ETH | 0.00185161 | ||||
Flip Sale State | 13958373 | 1119 days ago | IN | 0 ETH | 0.0030355 | ||||
Set Base URI | 13958283 | 1119 days ago | IN | 0 ETH | 0.00387678 | ||||
Set Base URI | 13958243 | 1119 days ago | IN | 0 ETH | 0.00353082 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MadBots
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-07 */ /** *Submitted for verification at Etherscan.io on 2021-12-10 */ // SPDX-License-Identifier: MIT // Madbots.io // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @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; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. 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] = toDeleteIndex + 1; // All indexes are 1-based // 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 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) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // 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); } // 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)))); } // 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)); } /** * @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)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity ^0.7.0; pragma abicoder v2; contract MadBots is ERC721, Ownable { using SafeMath for uint256; uint256 public constant MAX_BOTS = 8000; uint256 public constant maxBotPurchase = 20; uint256 public botPrice = 60000000000000000; uint256 public botReserve = 30; // Reserve 10 Bots for team - 20 for Giveaways/Prizes etc string public IMG_PROVENANCE = "4152839917f40279caefe8b834621a7e4e5ee0116ebdbc4ad2b355fb4619cd49"; // SHA-256 HASH of IPFS URL. string public METADATA_PROVENANCE = "37a2271a7e5804c04362b7f72e57cc0fc4dfd252c8bbd04917bb71e7ce2278bb"; // SHA-256 HASH of submarined Pinata IPFS Metadata. Proof that contents has not been modified bool public saleIsActive = false; address d1 = 0xc06d4D722e1bB9eBA65196369444af30911c187F; address d2 = 0xdFDaC53135c0F7cC934a5016b6C8Af1C02c6AddC; constructor() ERC721("Madbots", "MADBOTS") { reserveBots(d2, 2); reserveBots(d1, 2); } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } function withdrawAll() public payable onlyOwner { uint256 balance = address(this).balance / 2; require(balance > 0); _withdraw(d1, balance); _withdraw(d2, address(this).balance); } function reserveBots(address _to, uint256 _reserveAmount) public onlyOwner { uint256 supply = totalSupply(); require(_reserveAmount > 0 && _reserveAmount <= botReserve, "Not enough reserve left"); for (uint256 i = 0; i < _reserveAmount; i++) { _safeMint(_to, supply + i); } botReserve = botReserve.sub(_reserveAmount); } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } // ETH price safeguard function setPrice(uint256 _newPrice) public onlyOwner { botPrice = _newPrice; } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function mintBot(uint256 numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint Bot"); require(numberOfTokens > 0 && numberOfTokens <= maxBotPurchase, "Can only mint 20 tokens at a time"); require(totalSupply().add(numberOfTokens) <= MAX_BOTS - botReserve, "Purchase would exceed max supply of Bots"); require(msg.value >= botPrice.mul(numberOfTokens), "Ether value sent is not correct"); for(uint256 i = 0; i < numberOfTokens; i++) { uint256 mintIndex = totalSupply(); if (totalSupply() < MAX_BOTS) { _safeMint(msg.sender, mintIndex); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"IMG_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BOTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBotPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405266d529ae9e860000600b55601e600c5560405180606001604052806040815260200162005b4260409139600d90805190602001906200004592919062000e46565b5060405180606001604052806040815260200162005b8260409139600e90805190602001906200007792919062000e46565b506000600f60006101000a81548160ff02191690831515021790555073c06d4d722e1bb9eba65196369444af30911c187f600f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dfdac53135c0f7cc934a5016b6c8af1c02c6addc601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200014a57600080fd5b506040518060400160405280600781526020017f4d6164626f7473000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4d4144424f545300000000000000000000000000000000000000000000000000815250620001cf6301ffc9a760e01b6200036c60201b60201c565b8160069080519060200190620001e792919062000e46565b5080600790805190602001906200020092919062000e46565b50620002196380ac58cd60e01b6200036c60201b60201c565b62000231635b5e139f60e01b6200036c60201b60201c565b6200024963780e9d6360e01b6200036c60201b60201c565b505060006200025d6200044460201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000331601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660026200044c60201b60201c565b62000366600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660026200044c60201b60201c565b620015ae565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620003d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cf906200137c565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6200045c6200044460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004826200059a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d29062001426565b60405180910390fd5b6000620004ed620005c460201b60201c565b9050600082118015620005025750600c548211155b62000544576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053b9062001448565b60405180910390fd5b60005b8281101562000572576200056484828401620005e260201b60201c565b808060010191505062000547565b506200058f82600c546200060860201b62001caa1790919060201c565b600c81905550505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000620005dd60026200065b60201b62001cfa1760201c565b905090565b620006048282604051806020016040528060008152506200067860201b60201c565b5050565b60008282111562000650576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200064790620013c0565b60405180910390fd5b818303905092915050565b60006200067182600001620006e660201b60201c565b9050919050565b6200068a8383620006f760201b60201c565b6200069f6000848484620008a960201b60201c565b620006e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006d8906200135a565b60405180910390fd5b505050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200076a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007619062001404565b60405180910390fd5b6200077b8162000a3060201b60201c565b15620007be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007b5906200139e565b60405180910390fd5b620007d26000838362000a5460201b60201c565b6200082a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000a5960201b62001d0f1790919060201c565b50620008488183600262000a7b60201b62001d29179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620008d78473ffffffffffffffffffffffffffffffffffffffff1662000ab860201b62001d5e1760201c565b620008e6576001905062000a28565b6000620009bf63150b7a0260e01b620009046200044460201b60201c565b8887876040516024016200091c9493929190620012e2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200162005b10603291398773ffffffffffffffffffffffffffffffffffffffff1662000acb60201b62001d71179092919060201c565b9050600081806020019051810190620009d9919062000f13565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600062000a4d82600262000aeb60201b62001d891790919060201c565b9050919050565b505050565b600062000a73836000018360001b62000b0d60201b60201c565b905092915050565b600062000aaf846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b62000b8760201b60201c565b90509392505050565b600080823b905060008111915050919050565b606062000ae2848460008562000c6660201b60201c565b90509392505050565b600062000b05836000018360001b62000d9460201b60201c565b905092915050565b600062000b21838362000db760201b60201c565b62000b7c57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000b81565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141562000c305784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062000c5f565b8285600001600183038154811062000c4457fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60608247101562000cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ca590620013e2565b60405180910390fd5b62000cbf8562000ab860201b60201c565b62000d01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cf8906200146a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405162000d2c9190620012c9565b60006040518083038185875af1925050503d806000811462000d6b576040519150601f19603f3d011682016040523d82523d6000602084013e62000d70565b606091505b509150915062000d8882828662000dda60201b60201c565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6060831562000dec5782905062000e3f565b60008351111562000e005782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e36919062001336565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000e7e576000855562000eca565b82601f1062000e9957805160ff191683800117855562000eca565b8280016001018555821562000eca579182015b8281111562000ec957825182559160200191906001019062000eac565b5b50905062000ed9919062000edd565b5090565b5b8082111562000ef857600081600090555060010162000ede565b5090565b60008151905062000f0d8162001594565b92915050565b60006020828403121562000f2657600080fd5b600062000f368482850162000efc565b91505092915050565b62000f4a81620014e3565b82525050565b62000f5b81620014cf565b82525050565b600062000f6e826200148c565b62000f7a8185620014a2565b935062000f8c8185602086016200154d565b62000f978162001583565b840191505092915050565b600062000faf826200148c565b62000fbb8185620014b3565b935062000fcd8185602086016200154d565b80840191505092915050565b600062000fe68262001497565b62000ff28185620014be565b9350620010048185602086016200154d565b6200100f8162001583565b840191505092915050565b600062001029603283620014be565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600062001091601c83620014be565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b6000620010d3601c83620014be565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600062001115601e83620014be565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600062001157602683620014be565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000620011bf602083620014be565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600062001201602083620014be565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600062001243601783620014be565b91507f4e6f7420656e6f7567682072657365727665206c6566740000000000000000006000830152602082019050919050565b600062001285601d83620014be565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b620012c38162001543565b82525050565b6000620012d7828462000fa2565b915081905092915050565b6000608082019050620012f9600083018762000f3f565b62001308602083018662000f50565b620013176040830185620012b8565b81810360608301526200132b818462000f61565b905095945050505050565b6000602082019050818103600083015262001352818462000fd9565b905092915050565b6000602082019050818103600083015262001375816200101a565b9050919050565b60006020820190508181036000830152620013978162001082565b9050919050565b60006020820190508181036000830152620013b981620010c4565b9050919050565b60006020820190508181036000830152620013db8162001106565b9050919050565b60006020820190508181036000830152620013fd8162001148565b9050919050565b600060208201905081810360008301526200141f81620011b0565b9050919050565b600060208201905081810360008301526200144181620011f2565b9050919050565b60006020820190508181036000830152620014638162001234565b9050919050565b60006020820190508181036000830152620014858162001276565b9050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000620014dc8262001523565b9050919050565b6000620014f08262001523565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200156d57808201518184015260208101905062001550565b838111156200157d576000848401525b50505050565b6000601f19601f8301169050919050565b6200159f81620014f7565b8114620015ab57600080fd5b50565b61455280620015be6000396000f3fe6080604052600436106101f85760003560e01c8063715018a61161010d5780639cc6e096116100a0578063c87b56dd1161006f578063c87b56dd146106f2578063e985e9c51461072f578063eb8d24441461076c578063f2fde38b14610797578063f3009d0f146107c0576101f8565b80639cc6e0961461064a578063a22cb46514610675578063b42d5b1c1461069e578063b88d4fde146106c9576101f8565b80638cd35779116100dc5780638cd35779146105a05780638da5cb5b146105cb57806391b7f5ed146105f657806395d89b411461061f576101f8565b8063715018a61461052657806379b6d4a01461053d5780638462151c14610559578063853828b614610596576101f8565b806334918dfd11610190578063586b53361161015f578063586b53361461042b5780635a9083f2146104565780636352211e146104815780636c0360eb146104be57806370a08231146104e9576101f8565b806334918dfd1461038557806342842e0e1461039c5780634f6ccce7146103c557806355f804b314610402576101f8565b8063095ea7b3116101cc578063095ea7b3146102cb57806318160ddd146102f457806323b872dd1461031f5780632f745c5914610348576101f8565b8062c07e17146101fd57806301ffc9a71461022657806306fdde0314610263578063081812fc1461028e575b600080fd5b34801561020957600080fd5b50610224600480360381019061021f9190613194565b6107eb565b005b34801561023257600080fd5b5061024d600480360381019061024891906131d0565b610909565b60405161025a9190613e9a565b60405180910390f35b34801561026f57600080fd5b50610278610970565b6040516102859190613eb5565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b09190613263565b610a12565b6040516102c29190613e11565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190613194565b610a97565b005b34801561030057600080fd5b50610309610baf565b6040516103169190614257565b60405180910390f35b34801561032b57600080fd5b506103466004803603810190610341919061308e565b610bc0565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613194565b610c20565b60405161037c9190614257565b60405180910390f35b34801561039157600080fd5b5061039a610c7b565b005b3480156103a857600080fd5b506103c360048036038101906103be919061308e565b610d23565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190613263565b610d43565b6040516103f99190614257565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190613222565b610d66565b005b34801561043757600080fd5b50610440610dee565b60405161044d9190614257565b60405180910390f35b34801561046257600080fd5b5061046b610df3565b6040516104789190614257565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190613263565b610df9565b6040516104b59190613e11565b60405180910390f35b3480156104ca57600080fd5b506104d3610e30565b6040516104e09190613eb5565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613029565b610ed2565b60405161051d9190614257565b60405180910390f35b34801561053257600080fd5b5061053b610f91565b005b61055760048036038101906105529190613263565b6110ce565b005b34801561056557600080fd5b50610580600480360381019061057b9190613029565b61126b565b60405161058d9190613e78565b60405180910390f35b61059e611364565b005b3480156105ac57600080fd5b506105b5611457565b6040516105c29190614257565b60405180910390f35b3480156105d757600080fd5b506105e061145d565b6040516105ed9190613e11565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613263565b611487565b005b34801561062b57600080fd5b5061063461150d565b6040516106419190613eb5565b60405180910390f35b34801561065657600080fd5b5061065f6115af565b60405161066c9190614257565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613158565b6115b5565b005b3480156106aa57600080fd5b506106b3611736565b6040516106c09190613eb5565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb91906130dd565b6117d4565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613263565b611836565b6040516107269190613eb5565b60405180910390f35b34801561073b57600080fd5b5061075660048036038101906107519190613052565b6119b9565b6040516107639190613e9a565b60405180910390f35b34801561077857600080fd5b50610781611a4d565b60405161078e9190613e9a565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190613029565b611a60565b005b3480156107cc57600080fd5b506107d5611c0c565b6040516107e29190613eb5565b60405180910390f35b6107f3611da3565b73ffffffffffffffffffffffffffffffffffffffff1661081161145d565b73ffffffffffffffffffffffffffffffffffffffff1614610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085e90614137565b60405180910390fd5b6000610871610baf565b90506000821180156108855750600c548211155b6108c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bb90614197565b60405180910390fd5b60005b828110156108e8576108db84828401611dab565b80806001019150506108c7565b506108fe82600c54611caa90919063ffffffff16565b600c81905550505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a085780601f106109dd57610100808354040283529160200191610a08565b820191906000526020600020905b8154815290600101906020018083116109eb57829003601f168201915b5050505050905090565b6000610a1d82611dc9565b610a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5390614117565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa282610df9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906141b7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b32611da3565b73ffffffffffffffffffffffffffffffffffffffff161480610b615750610b6081610b5b611da3565b6119b9565b5b610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790614077565b60405180910390fd5b610baa8383611de6565b505050565b6000610bbb6002611cfa565b905090565b610bd1610bcb611da3565b82611e9f565b610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07906141f7565b60405180910390fd5b610c1b838383611f7d565b505050565b6000610c7382600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061219490919063ffffffff16565b905092915050565b610c83611da3565b73ffffffffffffffffffffffffffffffffffffffff16610ca161145d565b73ffffffffffffffffffffffffffffffffffffffff1614610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90614137565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610d3e838383604051806020016040528060008152506117d4565b505050565b600080610d5a8360026121ae90919063ffffffff16565b50905080915050919050565b610d6e611da3565b73ffffffffffffffffffffffffffffffffffffffff16610d8c61145d565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614137565b60405180910390fd5b610deb816121da565b50565b601481565b600c5481565b6000610e29826040518060600160405280602981526020016144f46029913960026121f49092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ec85780601f10610e9d57610100808354040283529160200191610ec8565b820191906000526020600020905b815481529060010190602001808311610eab57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90614097565b60405180910390fd5b610f8a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612213565b9050919050565b610f99611da3565b73ffffffffffffffffffffffffffffffffffffffff16610fb761145d565b73ffffffffffffffffffffffffffffffffffffffff161461100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100490614137565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600f60009054906101000a900460ff1661111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490613ef7565b60405180910390fd5b60008111801561112e575060148111155b61116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490614057565b60405180910390fd5b600c54611f400361118e82611180610baf565b61222890919063ffffffff16565b11156111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690614237565b60405180910390fd5b6111e481600b5461227d90919063ffffffff16565b341015611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613fd7565b60405180910390fd5b60005b8181101561126757600061123b610baf565b9050611f40611248610baf565b1015611259576112583382611dab565b5b508080600101915050611229565b5050565b6060600061127883610ed2565b905060008114156112d357600067ffffffffffffffff8111801561129b57600080fd5b506040519080825280602002602001820160405280156112ca5781602001602082028036833780820191505090505b5091505061135f565b60008167ffffffffffffffff811180156112ec57600080fd5b5060405190808252806020026020018201604052801561131b5781602001602082028036833780820191505090505b50905060005b82811015611358576113338582610c20565b82828151811061133f57fe5b6020026020010181815250508080600101915050611321565b8193505050505b919050565b61136c611da3565b73ffffffffffffffffffffffffffffffffffffffff1661138a61145d565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790614137565b60405180910390fd5b6000600247816113ec57fe5b049050600081116113fc57600080fd5b611428600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826122ed565b611454601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476122ed565b50565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61148f611da3565b73ffffffffffffffffffffffffffffffffffffffff166114ad61145d565b73ffffffffffffffffffffffffffffffffffffffff1614611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90614137565b60405180910390fd5b80600b8190555050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115a55780601f1061157a576101008083540402835291602001916115a5565b820191906000526020600020905b81548152906001019060200180831161158857829003601f168201915b5050505050905090565b611f4081565b6115bd611da3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290613fb7565b60405180910390fd5b8060056000611638611da3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e5611da3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172a9190613e9a565b60405180910390a35050565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117cc5780601f106117a1576101008083540402835291602001916117cc565b820191906000526020600020905b8154815290600101906020018083116117af57829003601f168201915b505050505081565b6117e56117df611da3565b83611e9f565b611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181b906141f7565b60405180910390fd5b6118308484848461239e565b50505050565b606061184182611dc9565b611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790614177565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119295780601f106118fe57610100808354040283529160200191611929565b820191906000526020600020905b81548152906001019060200180831161190c57829003601f168201915b50505050509050600061193a610e30565b90506000815114156119505781925050506119b4565b60008251111561198557808260405160200161196d929190613dd8565b604051602081830303815290604052925050506119b4565b8061198f856123fa565b6040516020016119a0929190613dd8565b604051602081830303815290604052925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b611a68611da3565b73ffffffffffffffffffffffffffffffffffffffff16611a8661145d565b73ffffffffffffffffffffffffffffffffffffffff1614611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad390614137565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390613f37565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ca25780601f10611c7757610100808354040283529160200191611ca2565b820191906000526020600020905b815481529060010190602001808311611c8557829003601f168201915b505050505081565b600082821115611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690613ff7565b60405180910390fd5b818303905092915050565b6000611d0882600001612541565b9050919050565b6000611d21836000018360001b612552565b905092915050565b6000611d55846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6125c2565b90509392505050565b600080823b905060008111915050919050565b6060611d80848460008561269e565b90509392505050565b6000611d9b836000018360001b6127b2565b905092915050565b600033905090565b611dc58282604051806020016040528060008152506127d5565b5050565b6000611ddf826002611d8990919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e5983610df9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611eaa82611dc9565b611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee090614037565b60405180910390fd5b6000611ef483610df9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f6357508373ffffffffffffffffffffffffffffffffffffffff16611f4b84610a12565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f745750611f7381856119b9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9d82610df9565b73ffffffffffffffffffffffffffffffffffffffff1614611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90614157565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90613f97565b60405180910390fd5b61206e838383612830565b612079600082611de6565b6120ca81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061283590919063ffffffff16565b5061211c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d0f90919063ffffffff16565b5061213381836002611d299092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006121a3836000018361284f565b60001c905092915050565b6000806000806121c186600001866128bc565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906121f0929190612e45565b5050565b6000612207846000018460001b8461293f565b60001c90509392505050565b6000612221826000016129d0565b9050919050565b600080828401905083811015612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90613f77565b60405180910390fd5b8091505092915050565b60008083141561229057600090506122e7565b60008284029050828482816122a157fe5b04146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d9906140f7565b60405180910390fd5b809150505b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161231390613dfc565b60006040518083038185875af1925050503d8060008114612350576040519150601f19603f3d011682016040523d82523d6000602084013e612355565b606091505b5050905080612399576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612390906141d7565b60405180910390fd5b505050565b6123a9848484611f7d565b6123b5848484846129e1565b6123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb90613f17565b60405180910390fd5b50505050565b60606000821415612442576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061253c565b600082905060005b6000821461246c578080600101915050600a828161246457fe5b04915061244a565b60008167ffffffffffffffff8111801561248557600080fd5b506040519080825280601f01601f1916602001820160405280156124b85781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461253457600a84816124d957fe5b0660300160f81b828280600190039350815181106124f357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161252c57fe5b0493506124c7565b819450505050505b919050565b600081600001805490509050919050565b600061255e8383612b45565b6125b75782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506125bc565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561266957846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612697565b8285600001600183038154811061267c57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b6060824710156126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da90614017565b60405180910390fd5b6126ec85611d5e565b61272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272290614217565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127549190613dc1565b60006040518083038185875af1925050503d8060008114612791576040519150601f19603f3d011682016040523d82523d6000602084013e612796565b606091505b50915091506127a6828286612b68565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6127df8383612bcf565b6127ec60008484846129e1565b61282b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282290613f17565b60405180910390fd5b505050565b505050565b6000612847836000018360001b612d5d565b905092915050565b60008183600001805490501161289a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289190613ed7565b60405180910390fd5b8260000182815481106128a957fe5b9060005260206000200154905092915050565b60008082846000018054905011612908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ff906140b7565b60405180910390fd5b600084600001848154811061291957fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906129a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129989190613eb5565b60405180910390fd5b508460000160018203815481106129b457fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612a028473ffffffffffffffffffffffffffffffffffffffff16611d5e565b612a0f5760019050612b3d565b6000612ad663150b7a0260e01b612a24611da3565b888787604051602401612a3a9493929190613e2c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016144c2603291398773ffffffffffffffffffffffffffffffffffffffff16611d719092919063ffffffff16565b9050600081806020019051810190612aee91906131f9565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608315612b7857829050612bc8565b600083511115612b8b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbf9190613eb5565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c36906140d7565b60405180910390fd5b612c4881611dc9565b15612c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7f90613f57565b60405180910390fd5b612c9460008383612830565b612ce581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d0f90919063ffffffff16565b50612cfc81836002611d299092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008083600101600084815260200190815260200160002054905060008114612e395760006001820390506000600186600001805490500390506000866000018281548110612da857fe5b9060005260206000200154905080876000018481548110612dc557fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612dfd57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612e3f565b60009150505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612e7b5760008555612ec2565b82601f10612e9457805160ff1916838001178555612ec2565b82800160010185558215612ec2579182015b82811115612ec1578251825591602001919060010190612ea6565b5b509050612ecf9190612ed3565b5090565b5b80821115612eec576000816000905550600101612ed4565b5090565b6000612f03612efe846142a3565b614272565b905082815260208101848484011115612f1b57600080fd5b612f26848285614410565b509392505050565b6000612f41612f3c846142d3565b614272565b905082815260208101848484011115612f5957600080fd5b612f64848285614410565b509392505050565b600081359050612f7b81614465565b92915050565b600081359050612f908161447c565b92915050565b600081359050612fa581614493565b92915050565b600081519050612fba81614493565b92915050565b600082601f830112612fd157600080fd5b8135612fe1848260208601612ef0565b91505092915050565b600082601f830112612ffb57600080fd5b813561300b848260208601612f2e565b91505092915050565b600081359050613023816144aa565b92915050565b60006020828403121561303b57600080fd5b600061304984828501612f6c565b91505092915050565b6000806040838503121561306557600080fd5b600061307385828601612f6c565b925050602061308485828601612f6c565b9150509250929050565b6000806000606084860312156130a357600080fd5b60006130b186828701612f6c565b93505060206130c286828701612f6c565b92505060406130d386828701613014565b9150509250925092565b600080600080608085870312156130f357600080fd5b600061310187828801612f6c565b945050602061311287828801612f6c565b935050604061312387828801613014565b925050606085013567ffffffffffffffff81111561314057600080fd5b61314c87828801612fc0565b91505092959194509250565b6000806040838503121561316b57600080fd5b600061317985828601612f6c565b925050602061318a85828601612f81565b9150509250929050565b600080604083850312156131a757600080fd5b60006131b585828601612f6c565b92505060206131c685828601613014565b9150509250929050565b6000602082840312156131e257600080fd5b60006131f084828501612f96565b91505092915050565b60006020828403121561320b57600080fd5b600061321984828501612fab565b91505092915050565b60006020828403121561323457600080fd5b600082013567ffffffffffffffff81111561324e57600080fd5b61325a84828501612fea565b91505092915050565b60006020828403121561327557600080fd5b600061328384828501613014565b91505092915050565b60006132988383613da3565b60208301905092915050565b6132ad8161439c565b82525050565b6132bc8161438a565b82525050565b60006132cd82614313565b6132d78185614341565b93506132e283614303565b8060005b838110156133135781516132fa888261328c565b975061330583614334565b9250506001810190506132e6565b5085935050505092915050565b613329816143ae565b82525050565b600061333a8261431e565b6133448185614352565b935061335481856020860161441f565b61335d81614454565b840191505092915050565b60006133738261431e565b61337d8185614363565b935061338d81856020860161441f565b80840191505092915050565b60006133a482614329565b6133ae818561436e565b93506133be81856020860161441f565b6133c781614454565b840191505092915050565b60006133dd82614329565b6133e7818561437f565b93506133f781856020860161441f565b80840191505092915050565b600061341060228361436e565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613476601f8361436e565b91507f53616c65206d7573742062652061637469766520746f206d696e7420426f74006000830152602082019050919050565b60006134b660328361436e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061351c60268361436e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613582601c8361436e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006135c2601b8361436e565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061360260248361436e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061366860198361436e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006136a8601f8361436e565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b60006136e8601e8361436e565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061372860268361436e565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061378e602c8361436e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006137f460218361436e565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061385a60388361436e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006138c0602a8361436e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061392660228361436e565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061398c60208361436e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006139cc60218361436e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a32602c8361436e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a9860208361436e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613ad860298361436e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b3e602f8361436e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613ba460178361436e565b91507f4e6f7420656e6f7567682072657365727665206c6566740000000000000000006000830152602082019050919050565b6000613be460218361436e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4a600083614363565b9150600082019050919050565b6000613c6460108361436e565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b6000613ca460318361436e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d0a601d8361436e565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613d4a60288361436e565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620426f74730000000000000000000000000000000000000000000000006020830152604082019050919050565b613dac81614406565b82525050565b613dbb81614406565b82525050565b6000613dcd8284613368565b915081905092915050565b6000613de482856133d2565b9150613df082846133d2565b91508190509392505050565b6000613e0782613c3d565b9150819050919050565b6000602082019050613e2660008301846132b3565b92915050565b6000608082019050613e4160008301876132a4565b613e4e60208301866132b3565b613e5b6040830185613db2565b8181036060830152613e6d818461332f565b905095945050505050565b60006020820190508181036000830152613e9281846132c2565b905092915050565b6000602082019050613eaf6000830184613320565b92915050565b60006020820190508181036000830152613ecf8184613399565b905092915050565b60006020820190508181036000830152613ef081613403565b9050919050565b60006020820190508181036000830152613f1081613469565b9050919050565b60006020820190508181036000830152613f30816134a9565b9050919050565b60006020820190508181036000830152613f508161350f565b9050919050565b60006020820190508181036000830152613f7081613575565b9050919050565b60006020820190508181036000830152613f90816135b5565b9050919050565b60006020820190508181036000830152613fb0816135f5565b9050919050565b60006020820190508181036000830152613fd08161365b565b9050919050565b60006020820190508181036000830152613ff08161369b565b9050919050565b60006020820190508181036000830152614010816136db565b9050919050565b600060208201905081810360008301526140308161371b565b9050919050565b6000602082019050818103600083015261405081613781565b9050919050565b60006020820190508181036000830152614070816137e7565b9050919050565b600060208201905081810360008301526140908161384d565b9050919050565b600060208201905081810360008301526140b0816138b3565b9050919050565b600060208201905081810360008301526140d081613919565b9050919050565b600060208201905081810360008301526140f08161397f565b9050919050565b60006020820190508181036000830152614110816139bf565b9050919050565b6000602082019050818103600083015261413081613a25565b9050919050565b6000602082019050818103600083015261415081613a8b565b9050919050565b6000602082019050818103600083015261417081613acb565b9050919050565b6000602082019050818103600083015261419081613b31565b9050919050565b600060208201905081810360008301526141b081613b97565b9050919050565b600060208201905081810360008301526141d081613bd7565b9050919050565b600060208201905081810360008301526141f081613c57565b9050919050565b6000602082019050818103600083015261421081613c97565b9050919050565b6000602082019050818103600083015261423081613cfd565b9050919050565b6000602082019050818103600083015261425081613d3d565b9050919050565b600060208201905061426c6000830184613db2565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561429957614298614452565b5b8060405250919050565b600067ffffffffffffffff8211156142be576142bd614452565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156142ee576142ed614452565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614395826143e6565b9050919050565b60006143a7826143e6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561443d578082015181840152602081019050614422565b8381111561444c576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b61446e8161438a565b811461447957600080fd5b50565b614485816143ae565b811461449057600080fd5b50565b61449c816143ba565b81146144a757600080fd5b50565b6144b381614406565b81146144be57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212203f0f311954a6922e3bfada09035800c1b7e22c4f62cfa84aa6901864335967e264736f6c634300070600334552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465723431353238333939313766343032373963616566653862383334363231613765346535656530313136656264626334616432623335356662343631396364343933376132323731613765353830346330343336326237663732653537636330666334646664323532633862626430343931376262373165376365323237386262
Deployed Bytecode
0x6080604052600436106101f85760003560e01c8063715018a61161010d5780639cc6e096116100a0578063c87b56dd1161006f578063c87b56dd146106f2578063e985e9c51461072f578063eb8d24441461076c578063f2fde38b14610797578063f3009d0f146107c0576101f8565b80639cc6e0961461064a578063a22cb46514610675578063b42d5b1c1461069e578063b88d4fde146106c9576101f8565b80638cd35779116100dc5780638cd35779146105a05780638da5cb5b146105cb57806391b7f5ed146105f657806395d89b411461061f576101f8565b8063715018a61461052657806379b6d4a01461053d5780638462151c14610559578063853828b614610596576101f8565b806334918dfd11610190578063586b53361161015f578063586b53361461042b5780635a9083f2146104565780636352211e146104815780636c0360eb146104be57806370a08231146104e9576101f8565b806334918dfd1461038557806342842e0e1461039c5780634f6ccce7146103c557806355f804b314610402576101f8565b8063095ea7b3116101cc578063095ea7b3146102cb57806318160ddd146102f457806323b872dd1461031f5780632f745c5914610348576101f8565b8062c07e17146101fd57806301ffc9a71461022657806306fdde0314610263578063081812fc1461028e575b600080fd5b34801561020957600080fd5b50610224600480360381019061021f9190613194565b6107eb565b005b34801561023257600080fd5b5061024d600480360381019061024891906131d0565b610909565b60405161025a9190613e9a565b60405180910390f35b34801561026f57600080fd5b50610278610970565b6040516102859190613eb5565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b09190613263565b610a12565b6040516102c29190613e11565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190613194565b610a97565b005b34801561030057600080fd5b50610309610baf565b6040516103169190614257565b60405180910390f35b34801561032b57600080fd5b506103466004803603810190610341919061308e565b610bc0565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613194565b610c20565b60405161037c9190614257565b60405180910390f35b34801561039157600080fd5b5061039a610c7b565b005b3480156103a857600080fd5b506103c360048036038101906103be919061308e565b610d23565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190613263565b610d43565b6040516103f99190614257565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190613222565b610d66565b005b34801561043757600080fd5b50610440610dee565b60405161044d9190614257565b60405180910390f35b34801561046257600080fd5b5061046b610df3565b6040516104789190614257565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190613263565b610df9565b6040516104b59190613e11565b60405180910390f35b3480156104ca57600080fd5b506104d3610e30565b6040516104e09190613eb5565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613029565b610ed2565b60405161051d9190614257565b60405180910390f35b34801561053257600080fd5b5061053b610f91565b005b61055760048036038101906105529190613263565b6110ce565b005b34801561056557600080fd5b50610580600480360381019061057b9190613029565b61126b565b60405161058d9190613e78565b60405180910390f35b61059e611364565b005b3480156105ac57600080fd5b506105b5611457565b6040516105c29190614257565b60405180910390f35b3480156105d757600080fd5b506105e061145d565b6040516105ed9190613e11565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613263565b611487565b005b34801561062b57600080fd5b5061063461150d565b6040516106419190613eb5565b60405180910390f35b34801561065657600080fd5b5061065f6115af565b60405161066c9190614257565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613158565b6115b5565b005b3480156106aa57600080fd5b506106b3611736565b6040516106c09190613eb5565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb91906130dd565b6117d4565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613263565b611836565b6040516107269190613eb5565b60405180910390f35b34801561073b57600080fd5b5061075660048036038101906107519190613052565b6119b9565b6040516107639190613e9a565b60405180910390f35b34801561077857600080fd5b50610781611a4d565b60405161078e9190613e9a565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190613029565b611a60565b005b3480156107cc57600080fd5b506107d5611c0c565b6040516107e29190613eb5565b60405180910390f35b6107f3611da3565b73ffffffffffffffffffffffffffffffffffffffff1661081161145d565b73ffffffffffffffffffffffffffffffffffffffff1614610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085e90614137565b60405180910390fd5b6000610871610baf565b90506000821180156108855750600c548211155b6108c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bb90614197565b60405180910390fd5b60005b828110156108e8576108db84828401611dab565b80806001019150506108c7565b506108fe82600c54611caa90919063ffffffff16565b600c81905550505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a085780601f106109dd57610100808354040283529160200191610a08565b820191906000526020600020905b8154815290600101906020018083116109eb57829003601f168201915b5050505050905090565b6000610a1d82611dc9565b610a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5390614117565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa282610df9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906141b7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b32611da3565b73ffffffffffffffffffffffffffffffffffffffff161480610b615750610b6081610b5b611da3565b6119b9565b5b610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790614077565b60405180910390fd5b610baa8383611de6565b505050565b6000610bbb6002611cfa565b905090565b610bd1610bcb611da3565b82611e9f565b610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07906141f7565b60405180910390fd5b610c1b838383611f7d565b505050565b6000610c7382600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061219490919063ffffffff16565b905092915050565b610c83611da3565b73ffffffffffffffffffffffffffffffffffffffff16610ca161145d565b73ffffffffffffffffffffffffffffffffffffffff1614610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90614137565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610d3e838383604051806020016040528060008152506117d4565b505050565b600080610d5a8360026121ae90919063ffffffff16565b50905080915050919050565b610d6e611da3565b73ffffffffffffffffffffffffffffffffffffffff16610d8c61145d565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614137565b60405180910390fd5b610deb816121da565b50565b601481565b600c5481565b6000610e29826040518060600160405280602981526020016144f46029913960026121f49092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ec85780601f10610e9d57610100808354040283529160200191610ec8565b820191906000526020600020905b815481529060010190602001808311610eab57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90614097565b60405180910390fd5b610f8a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612213565b9050919050565b610f99611da3565b73ffffffffffffffffffffffffffffffffffffffff16610fb761145d565b73ffffffffffffffffffffffffffffffffffffffff161461100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100490614137565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600f60009054906101000a900460ff1661111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490613ef7565b60405180910390fd5b60008111801561112e575060148111155b61116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490614057565b60405180910390fd5b600c54611f400361118e82611180610baf565b61222890919063ffffffff16565b11156111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690614237565b60405180910390fd5b6111e481600b5461227d90919063ffffffff16565b341015611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613fd7565b60405180910390fd5b60005b8181101561126757600061123b610baf565b9050611f40611248610baf565b1015611259576112583382611dab565b5b508080600101915050611229565b5050565b6060600061127883610ed2565b905060008114156112d357600067ffffffffffffffff8111801561129b57600080fd5b506040519080825280602002602001820160405280156112ca5781602001602082028036833780820191505090505b5091505061135f565b60008167ffffffffffffffff811180156112ec57600080fd5b5060405190808252806020026020018201604052801561131b5781602001602082028036833780820191505090505b50905060005b82811015611358576113338582610c20565b82828151811061133f57fe5b6020026020010181815250508080600101915050611321565b8193505050505b919050565b61136c611da3565b73ffffffffffffffffffffffffffffffffffffffff1661138a61145d565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790614137565b60405180910390fd5b6000600247816113ec57fe5b049050600081116113fc57600080fd5b611428600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826122ed565b611454601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476122ed565b50565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61148f611da3565b73ffffffffffffffffffffffffffffffffffffffff166114ad61145d565b73ffffffffffffffffffffffffffffffffffffffff1614611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90614137565b60405180910390fd5b80600b8190555050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115a55780601f1061157a576101008083540402835291602001916115a5565b820191906000526020600020905b81548152906001019060200180831161158857829003601f168201915b5050505050905090565b611f4081565b6115bd611da3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290613fb7565b60405180910390fd5b8060056000611638611da3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e5611da3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172a9190613e9a565b60405180910390a35050565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117cc5780601f106117a1576101008083540402835291602001916117cc565b820191906000526020600020905b8154815290600101906020018083116117af57829003601f168201915b505050505081565b6117e56117df611da3565b83611e9f565b611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181b906141f7565b60405180910390fd5b6118308484848461239e565b50505050565b606061184182611dc9565b611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790614177565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119295780601f106118fe57610100808354040283529160200191611929565b820191906000526020600020905b81548152906001019060200180831161190c57829003601f168201915b50505050509050600061193a610e30565b90506000815114156119505781925050506119b4565b60008251111561198557808260405160200161196d929190613dd8565b604051602081830303815290604052925050506119b4565b8061198f856123fa565b6040516020016119a0929190613dd8565b604051602081830303815290604052925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b611a68611da3565b73ffffffffffffffffffffffffffffffffffffffff16611a8661145d565b73ffffffffffffffffffffffffffffffffffffffff1614611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad390614137565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390613f37565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ca25780601f10611c7757610100808354040283529160200191611ca2565b820191906000526020600020905b815481529060010190602001808311611c8557829003601f168201915b505050505081565b600082821115611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690613ff7565b60405180910390fd5b818303905092915050565b6000611d0882600001612541565b9050919050565b6000611d21836000018360001b612552565b905092915050565b6000611d55846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6125c2565b90509392505050565b600080823b905060008111915050919050565b6060611d80848460008561269e565b90509392505050565b6000611d9b836000018360001b6127b2565b905092915050565b600033905090565b611dc58282604051806020016040528060008152506127d5565b5050565b6000611ddf826002611d8990919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e5983610df9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611eaa82611dc9565b611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee090614037565b60405180910390fd5b6000611ef483610df9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f6357508373ffffffffffffffffffffffffffffffffffffffff16611f4b84610a12565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f745750611f7381856119b9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9d82610df9565b73ffffffffffffffffffffffffffffffffffffffff1614611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90614157565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90613f97565b60405180910390fd5b61206e838383612830565b612079600082611de6565b6120ca81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061283590919063ffffffff16565b5061211c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d0f90919063ffffffff16565b5061213381836002611d299092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006121a3836000018361284f565b60001c905092915050565b6000806000806121c186600001866128bc565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906121f0929190612e45565b5050565b6000612207846000018460001b8461293f565b60001c90509392505050565b6000612221826000016129d0565b9050919050565b600080828401905083811015612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90613f77565b60405180910390fd5b8091505092915050565b60008083141561229057600090506122e7565b60008284029050828482816122a157fe5b04146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d9906140f7565b60405180910390fd5b809150505b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161231390613dfc565b60006040518083038185875af1925050503d8060008114612350576040519150601f19603f3d011682016040523d82523d6000602084013e612355565b606091505b5050905080612399576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612390906141d7565b60405180910390fd5b505050565b6123a9848484611f7d565b6123b5848484846129e1565b6123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb90613f17565b60405180910390fd5b50505050565b60606000821415612442576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061253c565b600082905060005b6000821461246c578080600101915050600a828161246457fe5b04915061244a565b60008167ffffffffffffffff8111801561248557600080fd5b506040519080825280601f01601f1916602001820160405280156124b85781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461253457600a84816124d957fe5b0660300160f81b828280600190039350815181106124f357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161252c57fe5b0493506124c7565b819450505050505b919050565b600081600001805490509050919050565b600061255e8383612b45565b6125b75782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506125bc565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561266957846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612697565b8285600001600183038154811061267c57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b6060824710156126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da90614017565b60405180910390fd5b6126ec85611d5e565b61272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272290614217565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127549190613dc1565b60006040518083038185875af1925050503d8060008114612791576040519150601f19603f3d011682016040523d82523d6000602084013e612796565b606091505b50915091506127a6828286612b68565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6127df8383612bcf565b6127ec60008484846129e1565b61282b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282290613f17565b60405180910390fd5b505050565b505050565b6000612847836000018360001b612d5d565b905092915050565b60008183600001805490501161289a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289190613ed7565b60405180910390fd5b8260000182815481106128a957fe5b9060005260206000200154905092915050565b60008082846000018054905011612908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ff906140b7565b60405180910390fd5b600084600001848154811061291957fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906129a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129989190613eb5565b60405180910390fd5b508460000160018203815481106129b457fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612a028473ffffffffffffffffffffffffffffffffffffffff16611d5e565b612a0f5760019050612b3d565b6000612ad663150b7a0260e01b612a24611da3565b888787604051602401612a3a9493929190613e2c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016144c2603291398773ffffffffffffffffffffffffffffffffffffffff16611d719092919063ffffffff16565b9050600081806020019051810190612aee91906131f9565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608315612b7857829050612bc8565b600083511115612b8b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbf9190613eb5565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c36906140d7565b60405180910390fd5b612c4881611dc9565b15612c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7f90613f57565b60405180910390fd5b612c9460008383612830565b612ce581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d0f90919063ffffffff16565b50612cfc81836002611d299092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008083600101600084815260200190815260200160002054905060008114612e395760006001820390506000600186600001805490500390506000866000018281548110612da857fe5b9060005260206000200154905080876000018481548110612dc557fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612dfd57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612e3f565b60009150505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612e7b5760008555612ec2565b82601f10612e9457805160ff1916838001178555612ec2565b82800160010185558215612ec2579182015b82811115612ec1578251825591602001919060010190612ea6565b5b509050612ecf9190612ed3565b5090565b5b80821115612eec576000816000905550600101612ed4565b5090565b6000612f03612efe846142a3565b614272565b905082815260208101848484011115612f1b57600080fd5b612f26848285614410565b509392505050565b6000612f41612f3c846142d3565b614272565b905082815260208101848484011115612f5957600080fd5b612f64848285614410565b509392505050565b600081359050612f7b81614465565b92915050565b600081359050612f908161447c565b92915050565b600081359050612fa581614493565b92915050565b600081519050612fba81614493565b92915050565b600082601f830112612fd157600080fd5b8135612fe1848260208601612ef0565b91505092915050565b600082601f830112612ffb57600080fd5b813561300b848260208601612f2e565b91505092915050565b600081359050613023816144aa565b92915050565b60006020828403121561303b57600080fd5b600061304984828501612f6c565b91505092915050565b6000806040838503121561306557600080fd5b600061307385828601612f6c565b925050602061308485828601612f6c565b9150509250929050565b6000806000606084860312156130a357600080fd5b60006130b186828701612f6c565b93505060206130c286828701612f6c565b92505060406130d386828701613014565b9150509250925092565b600080600080608085870312156130f357600080fd5b600061310187828801612f6c565b945050602061311287828801612f6c565b935050604061312387828801613014565b925050606085013567ffffffffffffffff81111561314057600080fd5b61314c87828801612fc0565b91505092959194509250565b6000806040838503121561316b57600080fd5b600061317985828601612f6c565b925050602061318a85828601612f81565b9150509250929050565b600080604083850312156131a757600080fd5b60006131b585828601612f6c565b92505060206131c685828601613014565b9150509250929050565b6000602082840312156131e257600080fd5b60006131f084828501612f96565b91505092915050565b60006020828403121561320b57600080fd5b600061321984828501612fab565b91505092915050565b60006020828403121561323457600080fd5b600082013567ffffffffffffffff81111561324e57600080fd5b61325a84828501612fea565b91505092915050565b60006020828403121561327557600080fd5b600061328384828501613014565b91505092915050565b60006132988383613da3565b60208301905092915050565b6132ad8161439c565b82525050565b6132bc8161438a565b82525050565b60006132cd82614313565b6132d78185614341565b93506132e283614303565b8060005b838110156133135781516132fa888261328c565b975061330583614334565b9250506001810190506132e6565b5085935050505092915050565b613329816143ae565b82525050565b600061333a8261431e565b6133448185614352565b935061335481856020860161441f565b61335d81614454565b840191505092915050565b60006133738261431e565b61337d8185614363565b935061338d81856020860161441f565b80840191505092915050565b60006133a482614329565b6133ae818561436e565b93506133be81856020860161441f565b6133c781614454565b840191505092915050565b60006133dd82614329565b6133e7818561437f565b93506133f781856020860161441f565b80840191505092915050565b600061341060228361436e565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613476601f8361436e565b91507f53616c65206d7573742062652061637469766520746f206d696e7420426f74006000830152602082019050919050565b60006134b660328361436e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061351c60268361436e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613582601c8361436e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006135c2601b8361436e565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061360260248361436e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061366860198361436e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006136a8601f8361436e565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b60006136e8601e8361436e565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061372860268361436e565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061378e602c8361436e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006137f460218361436e565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061385a60388361436e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006138c0602a8361436e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061392660228361436e565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061398c60208361436e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006139cc60218361436e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a32602c8361436e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a9860208361436e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613ad860298361436e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b3e602f8361436e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613ba460178361436e565b91507f4e6f7420656e6f7567682072657365727665206c6566740000000000000000006000830152602082019050919050565b6000613be460218361436e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4a600083614363565b9150600082019050919050565b6000613c6460108361436e565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b6000613ca460318361436e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d0a601d8361436e565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613d4a60288361436e565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620426f74730000000000000000000000000000000000000000000000006020830152604082019050919050565b613dac81614406565b82525050565b613dbb81614406565b82525050565b6000613dcd8284613368565b915081905092915050565b6000613de482856133d2565b9150613df082846133d2565b91508190509392505050565b6000613e0782613c3d565b9150819050919050565b6000602082019050613e2660008301846132b3565b92915050565b6000608082019050613e4160008301876132a4565b613e4e60208301866132b3565b613e5b6040830185613db2565b8181036060830152613e6d818461332f565b905095945050505050565b60006020820190508181036000830152613e9281846132c2565b905092915050565b6000602082019050613eaf6000830184613320565b92915050565b60006020820190508181036000830152613ecf8184613399565b905092915050565b60006020820190508181036000830152613ef081613403565b9050919050565b60006020820190508181036000830152613f1081613469565b9050919050565b60006020820190508181036000830152613f30816134a9565b9050919050565b60006020820190508181036000830152613f508161350f565b9050919050565b60006020820190508181036000830152613f7081613575565b9050919050565b60006020820190508181036000830152613f90816135b5565b9050919050565b60006020820190508181036000830152613fb0816135f5565b9050919050565b60006020820190508181036000830152613fd08161365b565b9050919050565b60006020820190508181036000830152613ff08161369b565b9050919050565b60006020820190508181036000830152614010816136db565b9050919050565b600060208201905081810360008301526140308161371b565b9050919050565b6000602082019050818103600083015261405081613781565b9050919050565b60006020820190508181036000830152614070816137e7565b9050919050565b600060208201905081810360008301526140908161384d565b9050919050565b600060208201905081810360008301526140b0816138b3565b9050919050565b600060208201905081810360008301526140d081613919565b9050919050565b600060208201905081810360008301526140f08161397f565b9050919050565b60006020820190508181036000830152614110816139bf565b9050919050565b6000602082019050818103600083015261413081613a25565b9050919050565b6000602082019050818103600083015261415081613a8b565b9050919050565b6000602082019050818103600083015261417081613acb565b9050919050565b6000602082019050818103600083015261419081613b31565b9050919050565b600060208201905081810360008301526141b081613b97565b9050919050565b600060208201905081810360008301526141d081613bd7565b9050919050565b600060208201905081810360008301526141f081613c57565b9050919050565b6000602082019050818103600083015261421081613c97565b9050919050565b6000602082019050818103600083015261423081613cfd565b9050919050565b6000602082019050818103600083015261425081613d3d565b9050919050565b600060208201905061426c6000830184613db2565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561429957614298614452565b5b8060405250919050565b600067ffffffffffffffff8211156142be576142bd614452565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156142ee576142ed614452565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614395826143e6565b9050919050565b60006143a7826143e6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561443d578082015181840152602081019050614422565b8381111561444c576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b61446e8161438a565b811461447957600080fd5b50565b614485816143ae565b811461449057600080fd5b50565b61449c816143ba565b81146144a757600080fd5b50565b6144b381614406565b81146144be57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212203f0f311954a6922e3bfada09035800c1b7e22c4f62cfa84aa6901864335967e264736f6c63430007060033
Deployed Bytecode Sourcemap
66899:3399:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68331:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10316:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51593:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54379:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53909:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53387:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55269:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53149:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68958:89;;;;;;;;;;;;;:::i;:::-;;55645:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53675:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68722:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67025:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67127:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51349:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52968:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51066:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66295:148;;;;;;;;;;;;;:::i;:::-;;69603:690;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69055:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68102:221;;;:::i;:::-;;67077:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65644:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68857:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51762:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66979:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54672:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67241:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55867:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51937:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55038:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67601:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66598:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67379:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68331:383;65875:12;:10;:12::i;:::-;65864:23;;:7;:5;:7::i;:::-;:23;;;65856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68417:14:::1;68434:13;:11;:13::i;:::-;68417:30;;68483:1;68466:14;:18;:50;;;;;68506:10;;68488:14;:28;;68466:50;68458:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;68560:9;68555:98;68579:14;68575:1;:18;68555:98;;;68615:26;68625:3;68639:1;68630:6;:10;68615:9;:26::i;:::-;68595:3;;;;;;;68555:98;;;;68676:30;68691:14;68676:10;;:14;;:30;;;;:::i;:::-;68663:10;:43;;;;65935:1;68331:383:::0;;:::o;10316:150::-;10401:4;10425:20;:33;10446:11;10425:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10418:40;;10316:150;;;:::o;51593:100::-;51647:13;51680:5;51673:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51593:100;:::o;54379:221::-;54455:7;54483:16;54491:7;54483;:16::i;:::-;54475:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54568:15;:24;54584:7;54568:24;;;;;;;;;;;;;;;;;;;;;54561:31;;54379:221;;;:::o;53909:404::-;53990:13;54006:23;54021:7;54006:14;:23::i;:::-;53990:39;;54054:5;54048:11;;:2;:11;;;;54040:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54134:5;54118:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54143:44;54167:5;54174:12;:10;:12::i;:::-;54143:23;:44::i;:::-;54118:69;54110:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54284:21;54293:2;54297:7;54284:8;:21::i;:::-;53909:404;;;:::o;53387:211::-;53448:7;53569:21;:12;:19;:21::i;:::-;53562:28;;53387:211;:::o;55269:305::-;55430:41;55449:12;:10;:12::i;:::-;55463:7;55430:18;:41::i;:::-;55422:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55538:28;55548:4;55554:2;55558:7;55538:9;:28::i;:::-;55269:305;;;:::o;53149:162::-;53246:7;53273:30;53297:5;53273:13;:20;53287:5;53273:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53266:37;;53149:162;;;;:::o;68958:89::-;65875:12;:10;:12::i;:::-;65864:23;;:7;:5;:7::i;:::-;:23;;;65856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69027:12:::1;;;;;;;;;;;69026:13;69011:12;;:28;;;;;;;;;;;;;;;;;;68958:89::o:0;55645:151::-;55749:39;55766:4;55772:2;55776:7;55749:39;;;;;;;;;;;;:16;:39::i;:::-;55645:151;;;:::o;53675:172::-;53750:7;53771:15;53792:22;53808:5;53792:12;:15;;:22;;;;:::i;:::-;53770:44;;;53832:7;53825:14;;;53675:172;;;:::o;68722:99::-;65875:12;:10;:12::i;:::-;65864:23;;:7;:5;:7::i;:::-;:23;;;65856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68793:20:::1;68805:7;68793:11;:20::i;:::-;68722:99:::0;:::o;67025:43::-;67066:2;67025:43;:::o;67127:30::-;;;;:::o;51349:177::-;51421:7;51448:70;51465:7;51448:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51441:77;;51349:177;;;:::o;52968:97::-;53016:13;53049:8;53042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52968:97;:::o;51066:221::-;51138:7;51183:1;51166:19;;:5;:19;;;;51158:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51250:29;:13;:20;51264:5;51250:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51243:36;;51066:221;;;:::o;66295:148::-;65875:12;:10;:12::i;:::-;65864:23;;:7;:5;:7::i;:::-;:23;;;65856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66402:1:::1;66365:40;;66386:6;;;;;;;;;;;66365:40;;;;;;;;;;;;66433:1;66416:6;;:19;;;;;;;;;;;;;;;;;;66295:148::o:0;69603:690::-;69678:12;;;;;;;;;;;69670:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;69762:1;69745:14;:18;:54;;;;;67066:2;69767:14;:32;;69745:54;69737:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;69904:10;;67014:4;69893:21;69856:33;69874:14;69856:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:58;;69848:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;69991:28;70004:14;69991:8;;:12;;:28;;;;:::i;:::-;69978:9;:41;;69970:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;70073:9;70069:215;70092:14;70088:1;:18;70069:215;;;70128:17;70148:13;:11;:13::i;:::-;70128:33;;67014:4;70180:13;:11;:13::i;:::-;:24;70176:97;;;70225:32;70235:10;70247:9;70225;:32::i;:::-;70176:97;70069:215;70108:3;;;;;;;70069:215;;;;69603:690;:::o;69055:540::-;69116:16;69146:18;69167:17;69177:6;69167:9;:17::i;:::-;69146:38;;69213:1;69199:10;:15;69195:393;;;69290:1;69276:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69269:23;;;;;69195:393;69325:23;69365:10;69351:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69325:51;;69391:13;69419:130;69443:10;69435:5;:18;69419:130;;;69499:34;69519:6;69527:5;69499:19;:34::i;:::-;69483:6;69490:5;69483:13;;;;;;;;;;;;;:50;;;;;69455:7;;;;;;;69419:130;;;69570:6;69563:13;;;;;69055:540;;;;:::o;68102:221::-;65875:12;:10;:12::i;:::-;65864:23;;:7;:5;:7::i;:::-;:23;;;65856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68161:15:::1;68203:1;68179:21;:25;;;;;;68161:43;;68233:1;68223:7;:11;68215:20;;;::::0;::::1;;68246:22;68256:2;;;;;;;;;;;68260:7;68246:9;:22::i;:::-;68279:36;68289:2;;;;;;;;;;;68293:21;68279:9;:36::i;:::-;65935:1;68102:221::o:0;67077:43::-;;;;:::o;65644:87::-;65690:7;65717:6;;;;;;;;;;;65710:13;;65644:87;:::o;68857:93::-;65875:12;:10;:12::i;:::-;65864:23;;:7;:5;:7::i;:::-;:23;;;65856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68933:9:::1;68922:8;:20;;;;68857:93:::0;:::o;51762:104::-;51818:13;51851:7;51844:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51762:104;:::o;66979:39::-;67014:4;66979:39;:::o;54672:295::-;54787:12;:10;:12::i;:::-;54775:24;;:8;:24;;;;54767:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54887:8;54842:18;:32;54861:12;:10;:12::i;:::-;54842:32;;;;;;;;;;;;;;;:42;54875:8;54842:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54940:8;54911:48;;54926:12;:10;:12::i;:::-;54911:48;;;54950:8;54911:48;;;;;;:::i;:::-;;;;;;;;54672:295;;:::o;67241:97::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55867:285::-;55999:41;56018:12;:10;:12::i;:::-;56032:7;55999:18;:41::i;:::-;55991:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56105:39;56119:4;56125:2;56129:7;56138:5;56105:13;:39::i;:::-;55867:285;;;;:::o;51937:792::-;52010:13;52044:16;52052:7;52044;:16::i;:::-;52036:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52125:23;52151:10;:19;52162:7;52151:19;;;;;;;;;;;52125:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52181:18;52202:9;:7;:9::i;:::-;52181:30;;52309:1;52293:4;52287:18;:23;52283:72;;;52334:9;52327:16;;;;;;52283:72;52485:1;52465:9;52459:23;:27;52455:108;;;52534:4;52540:9;52517:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52503:48;;;;;;52455:108;52695:4;52701:18;:7;:16;:18::i;:::-;52678:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52664:57;;;;51937:792;;;;:::o;55038:164::-;55135:4;55159:18;:25;55178:5;55159:25;;;;;;;;;;;;;;;:35;55185:8;55159:35;;;;;;;;;;;;;;;;;;;;;;;;;55152:42;;55038:164;;;;:::o;67601:32::-;;;;;;;;;;;;;:::o;66598:244::-;65875:12;:10;:12::i;:::-;65864:23;;:7;:5;:7::i;:::-;:23;;;65856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66707:1:::1;66687:22;;:8;:22;;;;66679:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66797:8;66768:38;;66789:6;;;;;;;;;;;66768:38;;;;;;;;;;;;66826:8;66817:6;;:17;;;;;;;;;;;;;;;;;;66598:244:::0;:::o;67379:102::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14340:158::-;14398:7;14431:1;14426;:6;;14418:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14489:1;14485;:5;14478:12;;14340:158;;;;:::o;44359:123::-;44428:7;44455:19;44463:3;:10;;44455:7;:19::i;:::-;44448:26;;44359:123;;;:::o;34930:131::-;34997:4;35021:32;35026:3;:10;;35046:5;35038:14;;35021:4;:32::i;:::-;35014:39;;34930:131;;;;:::o;43543:185::-;43632:4;43656:64;43661:3;:10;;43681:3;43673:12;;43711:5;43695:23;;43687:32;;43656:4;:64::i;:::-;43649:71;;43543:185;;;;;:::o;19319:422::-;19379:4;19587:12;19698:7;19686:20;19678:28;;19732:1;19725:4;:8;19718:15;;;19319:422;;;:::o;22237:195::-;22340:12;22372:52;22394:6;22402:4;22408:1;22411:12;22372:21;:52::i;:::-;22365:59;;22237:195;;;;;:::o;44120:151::-;44204:4;44228:35;44238:3;:10;;44258:3;44250:12;;44228:9;:35::i;:::-;44221:42;;44120:151;;;;:::o;757:106::-;810:15;845:10;838:17;;757:106;:::o;58611:110::-;58687:26;58697:2;58701:7;58687:26;;;;;;;;;;;;:9;:26::i;:::-;58611:110;;:::o;57619:127::-;57684:4;57708:30;57730:7;57708:12;:21;;:30;;;;:::i;:::-;57701:37;;57619:127;;;:::o;63637:192::-;63739:2;63712:15;:24;63728:7;63712:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63795:7;63791:2;63757:46;;63766:23;63781:7;63766:14;:23::i;:::-;63757:46;;;;;;;;;;;;63637:192;;:::o;57913:355::-;58006:4;58031:16;58039:7;58031;:16::i;:::-;58023:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58107:13;58123:23;58138:7;58123:14;:23::i;:::-;58107:39;;58176:5;58165:16;;:7;:16;;;:51;;;;58209:7;58185:31;;:20;58197:7;58185:11;:20::i;:::-;:31;;;58165:51;:94;;;;58220:39;58244:5;58251:7;58220:23;:39::i;:::-;58165:94;58157:103;;;57913:355;;;;:::o;61049:599::-;61174:4;61147:31;;:23;61162:7;61147:14;:23::i;:::-;:31;;;61139:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61275:1;61261:16;;:2;:16;;;;61253:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61331:39;61352:4;61358:2;61362:7;61331:20;:39::i;:::-;61435:29;61452:1;61456:7;61435:8;:29::i;:::-;61477:35;61504:7;61477:13;:19;61491:4;61477:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61523:30;61545:7;61523:13;:17;61537:2;61523:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61566:29;61583:7;61592:2;61566:12;:16;;:29;;;;;:::i;:::-;;61632:7;61628:2;61613:27;;61622:4;61613:27;;;;;;;;;;;;61049:599;;;:::o;36150:137::-;36221:7;36256:22;36260:3;:10;;36272:5;36256:3;:22::i;:::-;36248:31;;36241:38;;36150:137;;;;:::o;44821:236::-;44901:7;44910;44931:11;44944:13;44961:22;44965:3;:10;;44977:5;44961:3;:22::i;:::-;44930:53;;;;45010:3;45002:12;;45040:5;45032:14;;44994:55;;;;;;44821:236;;;;;:::o;62249:100::-;62333:8;62322;:19;;;;;;;;;;;;:::i;:::-;;62249:100;:::o;46107:213::-;46214:7;46265:44;46270:3;:10;;46290:3;46282:12;;46296;46265:4;:44::i;:::-;46257:53;;46234:78;;46107:213;;;;;:::o;35692:114::-;35752:7;35779:19;35787:3;:10;;35779:7;:19::i;:::-;35772:26;;35692:114;;;:::o;13878:179::-;13936:7;13956:9;13972:1;13968;:5;13956:17;;13997:1;13992;:6;;13984:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14048:1;14041:8;;;13878:179;;;;:::o;14757:220::-;14815:7;14844:1;14839;:6;14835:20;;;14854:1;14847:8;;;;14835:20;14866:9;14882:1;14878;:5;14866:17;;14911:1;14906;14902;:5;;;;;;:10;14894:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14968:1;14961:8;;;14757:220;;;;;:::o;67910:180::-;67984:12;68002:8;:13;;68023:7;68002:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67983:52;;;68054:7;68046:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;67910:180;;;:::o;57034:272::-;57148:28;57158:4;57164:2;57168:7;57148:9;:28::i;:::-;57195:48;57218:4;57224:2;57228:7;57237:5;57195:22;:48::i;:::-;57187:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57034:272;;;;:::o;46571:746::-;46627:13;46857:1;46848:5;:10;46844:53;;;46875:10;;;;;;;;;;;;;;;;;;;;;46844:53;46907:12;46922:5;46907:20;;46938:14;46963:78;46978:1;46970:4;:9;46963:78;;46996:8;;;;;;;47027:2;47019:10;;;;;;;;;46963:78;;;47051:19;47083:6;47073:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47051:39;;47101:13;47126:1;47117:6;:10;47101:26;;47145:5;47138:12;;47161:117;47176:1;47168:4;:9;47161:117;;47237:2;47230:4;:9;;;;;;47225:2;:14;47212:29;;47194:6;47201:7;;;;;;;47194:15;;;;;;;;;;;:47;;;;;;;;;;;47264:2;47256:10;;;;;;;;;47161:117;;;47302:6;47288:21;;;;;;46571:746;;;;:::o;40938:110::-;40994:7;41021:3;:12;;:19;;;;41014:26;;40938:110;;;:::o;28300:414::-;28363:4;28385:21;28395:3;28400:5;28385:9;:21::i;:::-;28380:327;;28423:3;:11;;28440:5;28423:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28606:3;:11;;:18;;;;28584:3;:12;;:19;28597:5;28584:19;;;;;;;;;;;:40;;;;28646:4;28639:11;;;;28380:327;28690:5;28683:12;;28300:414;;;;;:::o;38218:692::-;38294:4;38410:16;38429:3;:12;;:17;38442:3;38429:17;;;;;;;;;;;;38410:36;;38475:1;38463:8;:13;38459:444;;;38530:3;:12;;38548:38;;;;;;;;38565:3;38548:38;;;;38578:5;38548:38;;;38530:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38745:3;:12;;:19;;;;38725:3;:12;;:17;38738:3;38725:17;;;;;;;;;;;:39;;;;38786:4;38779:11;;;;;38459:444;38859:5;38823:3;:12;;38847:1;38836:8;:12;38823:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38886:5;38879:12;;;38218:692;;;;;;:::o;23289:530::-;23416:12;23474:5;23449:21;:30;;23441:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23541:18;23552:6;23541:10;:18::i;:::-;23533:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23667:12;23681:23;23708:6;:11;;23728:5;23736:4;23708:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23666:75;;;;23759:52;23777:7;23786:10;23798:12;23759:17;:52::i;:::-;23752:59;;;;23289:530;;;;;;:::o;40718:125::-;40789:4;40834:1;40813:3;:12;;:17;40826:3;40813:17;;;;;;;;;;;;:22;;40806:29;;40718:125;;;;:::o;58948:250::-;59044:18;59050:2;59054:7;59044:5;:18::i;:::-;59081:54;59112:1;59116:2;59120:7;59129:5;59081:22;:54::i;:::-;59073:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58948:250;;;:::o;64442:93::-;;;;:::o;35237:137::-;35307:4;35331:35;35339:3;:10;;35359:5;35351:14;;35331:7;:35::i;:::-;35324:42;;35237:137;;;;:::o;31188:204::-;31255:7;31304:5;31283:3;:11;;:18;;;;:26;31275:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31366:3;:11;;31378:5;31366:18;;;;;;;;;;;;;;;;31359:25;;31188:204;;;;:::o;41403:279::-;41470:7;41479;41529:5;41507:3;:12;;:19;;;;:27;41499:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41586:22;41611:3;:12;;41624:5;41611:19;;;;;;;;;;;;;;;;;;41586:44;;41649:5;:10;;;41661:5;:12;;;41641:33;;;;;41403:279;;;;;:::o;42900:319::-;42994:7;43014:16;43033:3;:12;;:17;43046:3;43033:17;;;;;;;;;;;;43014:36;;43081:1;43069:8;:13;;43084:12;43061:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43151:3;:12;;43175:1;43164:8;:12;43151:26;;;;;;;;;;;;;;;;;;:33;;;43144:40;;;42900:319;;;;;:::o;30735:109::-;30791:7;30818:3;:11;;:18;;;;30811:25;;30735:109;;;:::o;62914:604::-;63035:4;63062:15;:2;:13;;;:15::i;:::-;63057:60;;63101:4;63094:11;;;;63057:60;63127:23;63153:252;63206:45;;;63266:12;:10;:12::i;:::-;63293:4;63312:7;63334:5;63169:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63153:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63127:278;;63416:13;63443:10;63432:32;;;;;;;;;;;;:::i;:::-;63416:48;;48070:10;63493:16;;63483:26;;;:6;:26;;;;63475:35;;;;62914:604;;;;;;;:::o;30520:129::-;30593:4;30640:1;30617:3;:12;;:19;30630:5;30617:19;;;;;;;;;;;;:24;;30610:31;;30520:129;;;;:::o;25829:742::-;25944:12;25973:7;25969:595;;;26004:10;25997:17;;;;25969:595;26138:1;26118:10;:17;:21;26114:439;;;26381:10;26375:17;26442:15;26429:10;26425:2;26421:19;26414:44;26329:148;26524:12;26517:20;;;;;;;;;;;:::i;:::-;;;;;;;;25829:742;;;;;;:::o;59534:404::-;59628:1;59614:16;;:2;:16;;;;59606:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59687:16;59695:7;59687;:16::i;:::-;59686:17;59678:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59749:45;59778:1;59782:2;59786:7;59749:20;:45::i;:::-;59807:30;59829:7;59807:13;:17;59821:2;59807:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59850:29;59867:7;59876:2;59850:12;:16;;:29;;;;;:::i;:::-;;59922:7;59918:2;59897:33;;59914:1;59897:33;;;;;;;;;;;;59534:404;;:::o;28890:1544::-;28956:4;29074:18;29095:3;:12;;:19;29108:5;29095:19;;;;;;;;;;;;29074:40;;29145:1;29131:10;:15;29127:1300;;29493:21;29530:1;29517:10;:14;29493:38;;29546:17;29587:1;29566:3;:11;;:18;;;;:22;29546:42;;29833:17;29853:3;:11;;29865:9;29853:22;;;;;;;;;;;;;;;;29833:42;;29999:9;29970:3;:11;;29982:13;29970:26;;;;;;;;;;;;;;;:38;;;;30118:1;30102:13;:17;30076:3;:12;;:23;30089:9;30076:23;;;;;;;;;;;:43;;;;30228:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30323:3;:12;;:19;30336:5;30323:19;;;;;;;;;;;30316:26;;;30366:4;30359:11;;;;;;;;29127:1300;30410:5;30403:12;;;28890:1544;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:179::-;;6174:46;6216:3;6208:6;6174:46;:::i;:::-;6252:4;6247:3;6243:14;6229:28;;6164:99;;;;:::o;6269:142::-;6372:32;6398:5;6372:32;:::i;:::-;6367:3;6360:45;6350:61;;:::o;6417:118::-;6504:24;6522:5;6504:24;:::i;:::-;6499:3;6492:37;6482:53;;:::o;6571:732::-;;6719:54;6767:5;6719:54;:::i;:::-;6789:86;6868:6;6863:3;6789:86;:::i;:::-;6782:93;;6899:56;6949:5;6899:56;:::i;:::-;6978:7;7009:1;6994:284;7019:6;7016:1;7013:13;6994:284;;;7095:6;7089:13;7122:63;7181:3;7166:13;7122:63;:::i;:::-;7115:70;;7208:60;7261:6;7208:60;:::i;:::-;7198:70;;7054:224;7041:1;7038;7034:9;7029:14;;6994:284;;;6998:14;7294:3;7287:10;;6695:608;;;;;;;:::o;7309:109::-;7390:21;7405:5;7390:21;:::i;:::-;7385:3;7378:34;7368:50;;:::o;7424:360::-;;7538:38;7570:5;7538:38;:::i;:::-;7592:70;7655:6;7650:3;7592:70;:::i;:::-;7585:77;;7671:52;7716:6;7711:3;7704:4;7697:5;7693:16;7671:52;:::i;:::-;7748:29;7770:6;7748:29;:::i;:::-;7743:3;7739:39;7732:46;;7514:270;;;;;:::o;7790:373::-;;7922:38;7954:5;7922:38;:::i;:::-;7976:88;8057:6;8052:3;7976:88;:::i;:::-;7969:95;;8073:52;8118:6;8113:3;8106:4;8099:5;8095:16;8073:52;:::i;:::-;8150:6;8145:3;8141:16;8134:23;;7898:265;;;;;:::o;8169:364::-;;8285:39;8318:5;8285:39;:::i;:::-;8340:71;8404:6;8399:3;8340:71;:::i;:::-;8333:78;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:29;8519:6;8497:29;:::i;:::-;8492:3;8488:39;8481:46;;8261:272;;;;;:::o;8539:377::-;;8673:39;8706:5;8673:39;:::i;:::-;8728:89;8810:6;8805:3;8728:89;:::i;:::-;8721:96;;8826:52;8871:6;8866:3;8859:4;8852:5;8848:16;8826:52;:::i;:::-;8903:6;8898:3;8894:16;8887:23;;8649:267;;;;;:::o;8922:366::-;;9085:67;9149:2;9144:3;9085:67;:::i;:::-;9078:74;;9182:34;9178:1;9173:3;9169:11;9162:55;9248:4;9243:2;9238:3;9234:12;9227:26;9279:2;9274:3;9270:12;9263:19;;9068:220;;;:::o;9294:329::-;;9457:67;9521:2;9516:3;9457:67;:::i;:::-;9450:74;;9554:33;9550:1;9545:3;9541:11;9534:54;9614:2;9609:3;9605:12;9598:19;;9440:183;;;:::o;9629:382::-;;9792:67;9856:2;9851:3;9792:67;:::i;:::-;9785:74;;9889:34;9885:1;9880:3;9876:11;9869:55;9955:20;9950:2;9945:3;9941:12;9934:42;10002:2;9997:3;9993:12;9986:19;;9775:236;;;:::o;10017:370::-;;10180:67;10244:2;10239:3;10180:67;:::i;:::-;10173:74;;10277:34;10273:1;10268:3;10264:11;10257:55;10343:8;10338:2;10333:3;10329:12;10322:30;10378:2;10373:3;10369:12;10362:19;;10163:224;;;:::o;10393:326::-;;10556:67;10620:2;10615:3;10556:67;:::i;:::-;10549:74;;10653:30;10649:1;10644:3;10640:11;10633:51;10710:2;10705:3;10701:12;10694:19;;10539:180;;;:::o;10725:325::-;;10888:67;10952:2;10947:3;10888:67;:::i;:::-;10881:74;;10985:29;10981:1;10976:3;10972:11;10965:50;11041:2;11036:3;11032:12;11025:19;;10871:179;;;:::o;11056:368::-;;11219:67;11283:2;11278:3;11219:67;:::i;:::-;11212:74;;11316:34;11312:1;11307:3;11303:11;11296:55;11382:6;11377:2;11372:3;11368:12;11361:28;11415:2;11410:3;11406:12;11399:19;;11202:222;;;:::o;11430:323::-;;11593:67;11657:2;11652:3;11593:67;:::i;:::-;11586:74;;11690:27;11686:1;11681:3;11677:11;11670:48;11744:2;11739:3;11735:12;11728:19;;11576:177;;;:::o;11759:329::-;;11922:67;11986:2;11981:3;11922:67;:::i;:::-;11915:74;;12019:33;12015:1;12010:3;12006:11;11999:54;12079:2;12074:3;12070:12;12063:19;;11905:183;;;:::o;12094:328::-;;12257:67;12321:2;12316:3;12257:67;:::i;:::-;12250:74;;12354:32;12350:1;12345:3;12341:11;12334:53;12413:2;12408:3;12404:12;12397:19;;12240:182;;;:::o;12428:370::-;;12591:67;12655:2;12650:3;12591:67;:::i;:::-;12584:74;;12688:34;12684:1;12679:3;12675:11;12668:55;12754:8;12749:2;12744:3;12740:12;12733:30;12789:2;12784:3;12780:12;12773:19;;12574:224;;;:::o;12804:376::-;;12967:67;13031:2;13026:3;12967:67;:::i;:::-;12960:74;;13064:34;13060:1;13055:3;13051:11;13044:55;13130:14;13125:2;13120:3;13116:12;13109:36;13171:2;13166:3;13162:12;13155:19;;12950:230;;;:::o;13186:365::-;;13349:67;13413:2;13408:3;13349:67;:::i;:::-;13342:74;;13446:34;13442:1;13437:3;13433:11;13426:55;13512:3;13507:2;13502:3;13498:12;13491:25;13542:2;13537:3;13533:12;13526:19;;13332:219;;;:::o;13557:388::-;;13720:67;13784:2;13779:3;13720:67;:::i;:::-;13713:74;;13817:34;13813:1;13808:3;13804:11;13797:55;13883:26;13878:2;13873:3;13869:12;13862:48;13936:2;13931:3;13927:12;13920:19;;13703:242;;;:::o;13951:374::-;;14114:67;14178:2;14173:3;14114:67;:::i;:::-;14107:74;;14211:34;14207:1;14202:3;14198:11;14191:55;14277:12;14272:2;14267:3;14263:12;14256:34;14316:2;14311:3;14307:12;14300:19;;14097:228;;;:::o;14331:366::-;;14494:67;14558:2;14553:3;14494:67;:::i;:::-;14487:74;;14591:34;14587:1;14582:3;14578:11;14571:55;14657:4;14652:2;14647:3;14643:12;14636:26;14688:2;14683:3;14679:12;14672:19;;14477:220;;;:::o;14703:330::-;;14866:67;14930:2;14925:3;14866:67;:::i;:::-;14859:74;;14963:34;14959:1;14954:3;14950:11;14943:55;15024:2;15019:3;15015:12;15008:19;;14849:184;;;:::o;15039:365::-;;15202:67;15266:2;15261:3;15202:67;:::i;:::-;15195:74;;15299:34;15295:1;15290:3;15286:11;15279:55;15365:3;15360:2;15355:3;15351:12;15344:25;15395:2;15390:3;15386:12;15379:19;;15185:219;;;:::o;15410:376::-;;15573:67;15637:2;15632:3;15573:67;:::i;:::-;15566:74;;15670:34;15666:1;15661:3;15657:11;15650:55;15736:14;15731:2;15726:3;15722:12;15715:36;15777:2;15772:3;15768:12;15761:19;;15556:230;;;:::o;15792:330::-;;15955:67;16019:2;16014:3;15955:67;:::i;:::-;15948:74;;16052:34;16048:1;16043:3;16039:11;16032:55;16113:2;16108:3;16104:12;16097:19;;15938:184;;;:::o;16128:373::-;;16291:67;16355:2;16350:3;16291:67;:::i;:::-;16284:74;;16388:34;16384:1;16379:3;16375:11;16368:55;16454:11;16449:2;16444:3;16440:12;16433:33;16492:2;16487:3;16483:12;16476:19;;16274:227;;;:::o;16507:379::-;;16670:67;16734:2;16729:3;16670:67;:::i;:::-;16663:74;;16767:34;16763:1;16758:3;16754:11;16747:55;16833:17;16828:2;16823:3;16819:12;16812:39;16877:2;16872:3;16868:12;16861:19;;16653:233;;;:::o;16892:321::-;;17055:67;17119:2;17114:3;17055:67;:::i;:::-;17048:74;;17152:25;17148:1;17143:3;17139:11;17132:46;17204:2;17199:3;17195:12;17188:19;;17038:175;;;:::o;17219:365::-;;17382:67;17446:2;17441:3;17382:67;:::i;:::-;17375:74;;17479:34;17475:1;17470:3;17466:11;17459:55;17545:3;17540:2;17535:3;17531:12;17524:25;17575:2;17570:3;17566:12;17559:19;;17365:219;;;:::o;17590:297::-;;17770:83;17851:1;17846:3;17770:83;:::i;:::-;17763:90;;17879:1;17874:3;17870:11;17863:18;;17753:134;;;:::o;17893:314::-;;18056:67;18120:2;18115:3;18056:67;:::i;:::-;18049:74;;18153:18;18149:1;18144:3;18140:11;18133:39;18198:2;18193:3;18189:12;18182:19;;18039:168;;;:::o;18213:381::-;;18376:67;18440:2;18435:3;18376:67;:::i;:::-;18369:74;;18473:34;18469:1;18464:3;18460:11;18453:55;18539:19;18534:2;18529:3;18525:12;18518:41;18585:2;18580:3;18576:12;18569:19;;18359:235;;;:::o;18600:327::-;;18763:67;18827:2;18822:3;18763:67;:::i;:::-;18756:74;;18860:31;18856:1;18851:3;18847:11;18840:52;18918:2;18913:3;18909:12;18902:19;;18746:181;;;:::o;18933:372::-;;19096:67;19160:2;19155:3;19096:67;:::i;:::-;19089:74;;19193:34;19189:1;19184:3;19180:11;19173:55;19259:10;19254:2;19249:3;19245:12;19238:32;19296:2;19291:3;19287:12;19280:19;;19079:226;;;:::o;19311:108::-;19388:24;19406:5;19388:24;:::i;:::-;19383:3;19376:37;19366:53;;:::o;19425:118::-;19512:24;19530:5;19512:24;:::i;:::-;19507:3;19500:37;19490:53;;:::o;19549:271::-;;19701:93;19790:3;19781:6;19701:93;:::i;:::-;19694:100;;19811:3;19804:10;;19683:137;;;;:::o;19826:435::-;;20028:95;20119:3;20110:6;20028:95;:::i;:::-;20021:102;;20140:95;20231:3;20222:6;20140:95;:::i;:::-;20133:102;;20252:3;20245:10;;20010:251;;;;;:::o;20267:379::-;;20473:147;20616:3;20473:147;:::i;:::-;20466:154;;20637:3;20630:10;;20455:191;;;:::o;20652:222::-;;20783:2;20772:9;20768:18;20760:26;;20796:71;20864:1;20853:9;20849:17;20840:6;20796:71;:::i;:::-;20750:124;;;;:::o;20880:672::-;;21129:3;21118:9;21114:19;21106:27;;21143:87;21227:1;21216:9;21212:17;21203:6;21143:87;:::i;:::-;21240:72;21308:2;21297:9;21293:18;21284:6;21240:72;:::i;:::-;21322;21390:2;21379:9;21375:18;21366:6;21322:72;:::i;:::-;21441:9;21435:4;21431:20;21426:2;21415:9;21411:18;21404:48;21469:76;21540:4;21531:6;21469:76;:::i;:::-;21461:84;;21096:456;;;;;;;:::o;21558:373::-;;21739:2;21728:9;21724:18;21716:26;;21788:9;21782:4;21778:20;21774:1;21763:9;21759:17;21752:47;21816:108;21919:4;21910:6;21816:108;:::i;:::-;21808:116;;21706:225;;;;:::o;21937:210::-;;22062:2;22051:9;22047:18;22039:26;;22075:65;22137:1;22126:9;22122:17;22113:6;22075:65;:::i;:::-;22029:118;;;;:::o;22153:313::-;;22304:2;22293:9;22289:18;22281:26;;22353:9;22347:4;22343:20;22339:1;22328:9;22324:17;22317:47;22381:78;22454:4;22445:6;22381:78;:::i;:::-;22373:86;;22271:195;;;;:::o;22472:419::-;;22676:2;22665:9;22661:18;22653:26;;22725:9;22719:4;22715:20;22711:1;22700:9;22696:17;22689:47;22753:131;22879:4;22753:131;:::i;:::-;22745:139;;22643:248;;;:::o;22897:419::-;;23101:2;23090:9;23086:18;23078:26;;23150:9;23144:4;23140:20;23136:1;23125:9;23121:17;23114:47;23178:131;23304:4;23178:131;:::i;:::-;23170:139;;23068:248;;;:::o;23322:419::-;;23526:2;23515:9;23511:18;23503:26;;23575:9;23569:4;23565:20;23561:1;23550:9;23546:17;23539:47;23603:131;23729:4;23603:131;:::i;:::-;23595:139;;23493:248;;;:::o;23747:419::-;;23951:2;23940:9;23936:18;23928:26;;24000:9;23994:4;23990:20;23986:1;23975:9;23971:17;23964:47;24028:131;24154:4;24028:131;:::i;:::-;24020:139;;23918:248;;;:::o;24172:419::-;;24376:2;24365:9;24361:18;24353:26;;24425:9;24419:4;24415:20;24411:1;24400:9;24396:17;24389:47;24453:131;24579:4;24453:131;:::i;:::-;24445:139;;24343:248;;;:::o;24597:419::-;;24801:2;24790:9;24786:18;24778:26;;24850:9;24844:4;24840:20;24836:1;24825:9;24821:17;24814:47;24878:131;25004:4;24878:131;:::i;:::-;24870:139;;24768:248;;;:::o;25022:419::-;;25226:2;25215:9;25211:18;25203:26;;25275:9;25269:4;25265:20;25261:1;25250:9;25246:17;25239:47;25303:131;25429:4;25303:131;:::i;:::-;25295:139;;25193:248;;;:::o;25447:419::-;;25651:2;25640:9;25636:18;25628:26;;25700:9;25694:4;25690:20;25686:1;25675:9;25671:17;25664:47;25728:131;25854:4;25728:131;:::i;:::-;25720:139;;25618:248;;;:::o;25872:419::-;;26076:2;26065:9;26061:18;26053:26;;26125:9;26119:4;26115:20;26111:1;26100:9;26096:17;26089:47;26153:131;26279:4;26153:131;:::i;:::-;26145:139;;26043:248;;;:::o;26297:419::-;;26501:2;26490:9;26486:18;26478:26;;26550:9;26544:4;26540:20;26536:1;26525:9;26521:17;26514:47;26578:131;26704:4;26578:131;:::i;:::-;26570:139;;26468:248;;;:::o;26722:419::-;;26926:2;26915:9;26911:18;26903:26;;26975:9;26969:4;26965:20;26961:1;26950:9;26946:17;26939:47;27003:131;27129:4;27003:131;:::i;:::-;26995:139;;26893:248;;;:::o;27147:419::-;;27351:2;27340:9;27336:18;27328:26;;27400:9;27394:4;27390:20;27386:1;27375:9;27371:17;27364:47;27428:131;27554:4;27428:131;:::i;:::-;27420:139;;27318:248;;;:::o;27572:419::-;;27776:2;27765:9;27761:18;27753:26;;27825:9;27819:4;27815:20;27811:1;27800:9;27796:17;27789:47;27853:131;27979:4;27853:131;:::i;:::-;27845:139;;27743:248;;;:::o;27997:419::-;;28201:2;28190:9;28186:18;28178:26;;28250:9;28244:4;28240:20;28236:1;28225:9;28221:17;28214:47;28278:131;28404:4;28278:131;:::i;:::-;28270:139;;28168:248;;;:::o;28422:419::-;;28626:2;28615:9;28611:18;28603:26;;28675:9;28669:4;28665:20;28661:1;28650:9;28646:17;28639:47;28703:131;28829:4;28703:131;:::i;:::-;28695:139;;28593:248;;;:::o;28847:419::-;;29051:2;29040:9;29036:18;29028:26;;29100:9;29094:4;29090:20;29086:1;29075:9;29071:17;29064:47;29128:131;29254:4;29128:131;:::i;:::-;29120:139;;29018:248;;;:::o;29272:419::-;;29476:2;29465:9;29461:18;29453:26;;29525:9;29519:4;29515:20;29511:1;29500:9;29496:17;29489:47;29553:131;29679:4;29553:131;:::i;:::-;29545:139;;29443:248;;;:::o;29697:419::-;;29901:2;29890:9;29886:18;29878:26;;29950:9;29944:4;29940:20;29936:1;29925:9;29921:17;29914:47;29978:131;30104:4;29978:131;:::i;:::-;29970:139;;29868:248;;;:::o;30122:419::-;;30326:2;30315:9;30311:18;30303:26;;30375:9;30369:4;30365:20;30361:1;30350:9;30346:17;30339:47;30403:131;30529:4;30403:131;:::i;:::-;30395:139;;30293:248;;;:::o;30547:419::-;;30751:2;30740:9;30736:18;30728:26;;30800:9;30794:4;30790:20;30786:1;30775:9;30771:17;30764:47;30828:131;30954:4;30828:131;:::i;:::-;30820:139;;30718:248;;;:::o;30972:419::-;;31176:2;31165:9;31161:18;31153:26;;31225:9;31219:4;31215:20;31211:1;31200:9;31196:17;31189:47;31253:131;31379:4;31253:131;:::i;:::-;31245:139;;31143:248;;;:::o;31397:419::-;;31601:2;31590:9;31586:18;31578:26;;31650:9;31644:4;31640:20;31636:1;31625:9;31621:17;31614:47;31678:131;31804:4;31678:131;:::i;:::-;31670:139;;31568:248;;;:::o;31822:419::-;;32026:2;32015:9;32011:18;32003:26;;32075:9;32069:4;32065:20;32061:1;32050:9;32046:17;32039:47;32103:131;32229:4;32103:131;:::i;:::-;32095:139;;31993:248;;;:::o;32247:419::-;;32451:2;32440:9;32436:18;32428:26;;32500:9;32494:4;32490:20;32486:1;32475:9;32471:17;32464:47;32528:131;32654:4;32528:131;:::i;:::-;32520:139;;32418:248;;;:::o;32672:419::-;;32876:2;32865:9;32861:18;32853:26;;32925:9;32919:4;32915:20;32911:1;32900:9;32896:17;32889:47;32953:131;33079:4;32953:131;:::i;:::-;32945:139;;32843:248;;;:::o;33097:419::-;;33301:2;33290:9;33286:18;33278:26;;33350:9;33344:4;33340:20;33336:1;33325:9;33321:17;33314:47;33378:131;33504:4;33378:131;:::i;:::-;33370:139;;33268:248;;;:::o;33522:419::-;;33726:2;33715:9;33711:18;33703:26;;33775:9;33769:4;33765:20;33761:1;33750:9;33746:17;33739:47;33803:131;33929:4;33803:131;:::i;:::-;33795:139;;33693:248;;;:::o;33947:419::-;;34151:2;34140:9;34136:18;34128:26;;34200:9;34194:4;34190:20;34186:1;34175:9;34171:17;34164:47;34228:131;34354:4;34228:131;:::i;:::-;34220:139;;34118:248;;;:::o;34372:222::-;;34503:2;34492:9;34488:18;34480:26;;34516:71;34584:1;34573:9;34569:17;34560:6;34516:71;:::i;:::-;34470:124;;;;:::o;34600:278::-;;34666:2;34660:9;34650:19;;34708:4;34700:6;34696:17;34815:6;34803:10;34800:22;34779:18;34767:10;34764:34;34761:62;34758:2;;;34826:13;;:::i;:::-;34758:2;34861:10;34857:2;34850:22;34640:238;;;;:::o;34884:326::-;;35035:18;35027:6;35024:30;35021:2;;;35057:13;;:::i;:::-;35021:2;35137:4;35133:9;35126:4;35118:6;35114:17;35110:33;35102:41;;35198:4;35192;35188:15;35180:23;;34950:260;;;:::o;35216:327::-;;35368:18;35360:6;35357:30;35354:2;;;35390:13;;:::i;:::-;35354:2;35470:4;35466:9;35459:4;35451:6;35447:17;35443:33;35435:41;;35531:4;35525;35521:15;35513:23;;35283:260;;;:::o;35549:132::-;;35639:3;35631:11;;35669:4;35664:3;35660:14;35652:22;;35621:60;;;:::o;35687:114::-;;35788:5;35782:12;35772:22;;35761:40;;;:::o;35807:98::-;;35892:5;35886:12;35876:22;;35865:40;;;:::o;35911:99::-;;35997:5;35991:12;35981:22;;35970:40;;;:::o;36016:113::-;;36118:4;36113:3;36109:14;36101:22;;36091:38;;;:::o;36135:184::-;;36268:6;36263:3;36256:19;36308:4;36303:3;36299:14;36284:29;;36246:73;;;;:::o;36325:168::-;;36442:6;36437:3;36430:19;36482:4;36477:3;36473:14;36458:29;;36420:73;;;;:::o;36499:147::-;;36637:3;36622:18;;36612:34;;;;:::o;36652:169::-;;36770:6;36765:3;36758:19;36810:4;36805:3;36801:14;36786:29;;36748:73;;;;:::o;36827:148::-;;36966:3;36951:18;;36941:34;;;;:::o;36981:96::-;;37047:24;37065:5;37047:24;:::i;:::-;37036:35;;37026:51;;;:::o;37083:104::-;;37157:24;37175:5;37157:24;:::i;:::-;37146:35;;37136:51;;;:::o;37193:90::-;;37270:5;37263:13;37256:21;37245:32;;37235:48;;;:::o;37289:149::-;;37365:66;37358:5;37354:78;37343:89;;37333:105;;;:::o;37444:126::-;;37521:42;37514:5;37510:54;37499:65;;37489:81;;;:::o;37576:77::-;;37642:5;37631:16;;37621:32;;;:::o;37659:154::-;37743:6;37738:3;37733;37720:30;37805:1;37796:6;37791:3;37787:16;37780:27;37710:103;;;:::o;37819:307::-;37887:1;37897:113;37911:6;37908:1;37905:13;37897:113;;;37996:1;37991:3;37987:11;37981:18;37977:1;37972:3;37968:11;37961:39;37933:2;37930:1;37926:10;37921:15;;37897:113;;;38028:6;38025:1;38022:13;38019:2;;;38108:1;38099:6;38094:3;38090:16;38083:27;38019:2;37868:258;;;;:::o;38132:48::-;38165:9;38186:102;;38278:2;38274:7;38269:2;38262:5;38258:14;38254:28;38244:38;;38234:54;;;:::o;38294:122::-;38367:24;38385:5;38367:24;:::i;:::-;38360:5;38357:35;38347:2;;38406:1;38403;38396:12;38347:2;38337:79;:::o;38422:116::-;38492:21;38507:5;38492:21;:::i;:::-;38485:5;38482:32;38472:2;;38528:1;38525;38518:12;38472:2;38462:76;:::o;38544:120::-;38616:23;38633:5;38616:23;:::i;:::-;38609:5;38606:34;38596:2;;38654:1;38651;38644:12;38596:2;38586:78;:::o;38670:122::-;38743:24;38761:5;38743:24;:::i;:::-;38736:5;38733:35;38723:2;;38782:1;38779;38772:12;38723:2;38713:79;:::o
Swarm Source
ipfs://3f0f311954a6922e3bfada09035800c1b7e22c4f62cfa84aa6901864335967e2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $677.98 | 0.06 | $40.68 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.