Contract
0xd3a9c48df4d9342dc1a0ee2c185ce50588729fa9
1
[ Download CSV Export ]
OVERVIEW
462 of the cutest galactic beanies have escaped from their containment can! Help recapture them by joining the MoonBeans Corps and save the beaniverse, one bounty at a time!
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x6e9b16bbdf8452f2a2322820d21c117532960805ec1543b1a462acc9dbc2e947 | 692379 | 596 days 10 hrs ago | MoonBeans: Beanie NFTs | MoonBeans: Developer Wallet | 118.68 MOVR | ||
0xaf420f7b4180b5af05b2f13f0eeb659cbaf2d3da851b60921e8d0fdc92a56304 | 685405 | 597 days 13 hrs ago | MoonBeans: Beanie NFTs | MoonBeans: Developer Wallet | 200.1 MOVR |
[ Download CSV Export ]
Contract Name:
AdvTokenNFT
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2022-01-03 */ // SPDX-License-Identifier: MIT // 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 () internal { // 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_) public { _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, ".json")); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString(), ".json")); } /** * @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 () internal { 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; } } // File: @openzeppelin/contracts/token/ERC20/IERC.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); function mint(address to, uint256 amount) external returns (bool); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity ^0.7.0; pragma abicoder v2; contract AdvTokenNFT is ERC721, Ownable { using SafeMath for uint256; using Strings for uint256; string public PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN TOKENS ARE ALL SOLD OUT string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE uint256 public constant tokenPrice = 690000000000000000; // 0.1 ETH uint public constant maxTokenPurchase = 5; uint256 public constant MAX_TOKENS = 465; bool public saleIsActive = false; struct attributes { string name; uint level; uint pets; uint battlesWon; uint health; uint strength; uint defense; uint speed; uint luck; uint xp; uint log; uint lastRewardBlock; } mapping(uint256 => attributes) public attrIndex; // Reserve 256 for team - Giveaways/Prizes etc uint public tokenReserve = 5; event nameChange(address _by, uint _tokenId, string _name); event licenseisLocked(string _licenseText); event erc20Minted(address _by, uint amount); event sentAdventuring(address _by, uint tokenIndex); event levelUpToken(address _by, uint tokenIndex); event tokenPet(address _by, uint tokenIndex); event tokenCreated(uint tokenIndex); IERC20 public erc20 = IERC20(0x000000000000000000000000000000000000dEaD); IERC20 public BEANS = IERC20(0xC2392DD3e3fED2c8Ed9f7f0bDf6026fcd1348453); address public deadAddress = 0x000000000000000000000000000000000000dEaD; bool requireBeans = true; uint256 requiredBal = 250 ether; uint luckDigits = 4; uint luckModulus = 10 ** luckDigits; uint public cumulativeLevel = 0; uint public mintingRate = 10000; uint public feeMul = 1; uint constant xp_per_day = 250e18; uint constant DAY = 1 days; // Low Res Base URI string private _baseURI; address private _battleground = owner(); modifier onlyBattleground() { require(battleground() == _msgSender(), "Ownable: caller is not the owner"); _; } constructor() ERC721("BEANS NFT", "Beanies") { } function withdraw() public onlyOwner { uint balance = address(this).balance; msg.sender.transfer(balance); } function admin_reserve(address _to, uint256 _reserveAmount) public onlyOwner { uint supply = totalSupply(); require(_reserveAmount > 0 && _reserveAmount <= tokenReserve, "Not enough reserve left for team"); for (uint i = 0; i < _reserveAmount; i++) { _safeMint(_to, supply + i); } tokenReserve = tokenReserve.sub(_reserveAmount); } function admin_setProvenanceHash(string memory provenanceHash) public onlyOwner { PROVENANCE = provenanceHash; } function admin_setLBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function admin_flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function admin_setRequiredBal(uint256 _requiredBal) external onlyOwner { requiredBal = _requiredBal; } function admin_setRequireBeans(bool _requireBeans) external onlyOwner { requireBeans = _requireBeans; } function battleground() public view virtual returns (address) { return _battleground; } function admin_setBattleground(address newBattleground) public onlyOwner { _battleground = newBattleground; } function resetPets(uint tokenIndex, uint newPets) external onlyBattleground { attrIndex[tokenIndex].pets = newPets; } function wonBattle(uint tokenIndex) external onlyBattleground { attrIndex[tokenIndex].battlesWon = attrIndex[tokenIndex].battlesWon.add(1); } function resetXP(uint tokenIndex, uint newXP) external onlyBattleground { attrIndex[tokenIndex].xp = newXP; } function minterc20(uint tokenId) public { require(ownerOf(tokenId) == msg.sender, "Hey, your wallet doesn't own this token!"); require(attrIndex[tokenId].level >= 3, "Level must be at least 3 to claim!"); uint reward = mintingRate.mul((getMultiplier(attrIndex[tokenId].lastRewardBlock, block.number)).mul(attrIndex[tokenId].luck).mul(attrIndex[tokenId].level)).div(cumulativeLevel); attrIndex[tokenId].lastRewardBlock = block.number; erc20.mint(msg.sender, reward); emit erc20Minted(msg.sender, reward); } //For the front-end function viewOwedTokens(uint tokenId) public view returns (uint) { return mintingRate.mul((getMultiplier(attrIndex[tokenId].lastRewardBlock, block.number)).mul(attrIndex[tokenId].luck).mul(attrIndex[tokenId].level)).div(cumulativeLevel); } function burn(uint tokenId) public { require(ownerOf(tokenId) == msg.sender, "Hey, your wallet doesn't own this token!"); uint reward = mintingRate.mul(5000000000000000000); erc20.mint(msg.sender, reward); emit erc20Minted(msg.sender, reward); _burn(tokenId); } function xp_required(uint curent_level) public pure returns (uint xp_to_next_level) { xp_to_next_level = curent_level * 1000e18; for (uint i = 1; i < curent_level; i++) { xp_to_next_level += i * 1000e18; } } function adventure(uint tokenIndex) external { require(_isApprovedOrOwner(msg.sender, tokenIndex)); require(block.timestamp > attrIndex[tokenIndex].log); attrIndex[tokenIndex].log = block.timestamp.add((DAY.div(4))); attrIndex[tokenIndex].xp += xp_per_day; emit sentAdventuring(msg.sender, tokenIndex); } function levelUptoken(uint tokenId) public { require(ownerOf(tokenId) == msg.sender, "Hey, your wallet doesn't own this token!"); require(attrIndex[tokenId].level <= 9, "token already max level!"); require(erc20.balanceOf(address(msg.sender)) >= feeMul.mul(50000000000000000000).mul(attrIndex[tokenId].level), "You don't have enough tokens."); uint _xp_required = xp_required(attrIndex[tokenId].level); require(attrIndex[tokenId].xp >= _xp_required, "Need more XP!"); uint levelUpFee = feeMul.mul(1000000000).mul(attrIndex[tokenId].level); uint256 allowance = erc20.allowance(msg.sender, address(this)); require(allowance >= levelUpFee, "Check the token allowance"); erc20.transferFrom(msg.sender, address(this), levelUpFee); attrIndex[tokenId].xp -= _xp_required; attrIndex[tokenId].level = attrIndex[tokenId].level.add(1); //Burn whatever we got uint burnAmount = erc20.balanceOf(address(this)); erc20.transfer(deadAddress, burnAmount); emit levelUpToken(msg.sender, tokenId); } function petToken(uint tokenId) public { require(attrIndex[tokenId].pets <= 25, "Can't be pet beyond 10!"); if(attrIndex[tokenId].pets >= 1){ require(erc20.balanceOf(address(msg.sender)) >= feeMul.mul(5000000000000000000).mul(attrIndex[tokenId].pets), "You don't have enough erc20."); uint petUpFee = feeMul.mul(5000000000000000000).mul(attrIndex[tokenId].pets); uint256 allowance = erc20.allowance(msg.sender, address(this)); require(allowance >= petUpFee, string(abi.encodePacked("Check the token allowance:",erc20.allowance(msg.sender, address(this))," , ",petUpFee))); erc20.transferFrom(msg.sender, address(this), petUpFee); uint burnAmount = erc20.balanceOf(address(this)); erc20.transfer(deadAddress, burnAmount); } attrIndex[tokenId].pets = attrIndex[tokenId].pets.add(1); emit tokenPet(msg.sender, tokenId); } function admin_setFeeMul(uint newFee) public onlyOwner { feeMul = newFee; } function admin_setMintingRate(uint newMintingRate) public onlyOwner { mintingRate = newMintingRate; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } 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; } } // Returns the license for tokens function tokenLicense(uint _id) public view returns(string memory) { require(_id < totalSupply(), "CHOOSE A token WITHIN RANGE"); return LICENSE_TEXT; } // Locks the license to prevent further changes function admin_lockLicense() public onlyOwner { licenseLocked = true; emit licenseisLocked(LICENSE_TEXT); } // Change the license function admin_changeLicense(string memory _license) public onlyOwner { require(licenseLocked == false, "License already locked"); LICENSE_TEXT = _license; } function mintToken(uint numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint token"); require(numberOfTokens > 0 && numberOfTokens <= maxTokenPurchase, "Can only mint 5 tokens at a time"); require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Purchase would exceed max supply of tokens"); require(msg.value >= tokenPrice.mul(numberOfTokens), "Ether value sent is not correct"); if (requireBeans) { require(BEANS.balanceOf(msg.sender) > requiredBal, "Not enough native tokens in wallet to mint."); } if(MAX_TOKENS - totalSupply() <= tokenReserve) { require(owner() == _msgSender(), "Reached reserved team mints. Owner only."); } for(uint i = 0; i < numberOfTokens; i++) { uint mintIndex = totalSupply() + 1; if (totalSupply() < MAX_TOKENS) { attrIndex[mintIndex].level = 1; attrIndex[mintIndex].pets = 0; attrIndex[mintIndex].battlesWon = 0; attrIndex[mintIndex].log = block.timestamp; attrIndex[mintIndex].lastRewardBlock = block.number; attrIndex[mintIndex].health = generateRandom(mintIndex.mul(128)); attrIndex[mintIndex].strength = generateRandom(mintIndex.mul(25)); attrIndex[mintIndex].defense = generateRandom(mintIndex.mul(420)); attrIndex[mintIndex].speed = generateRandom(mintIndex.mul(69)); attrIndex[mintIndex].luck = generateRandom(mintIndex.mul(10)); cumulativeLevel = cumulativeLevel.add(1); _safeMint(msg.sender, mintIndex); emit tokenCreated(mintIndex); } } } function generateRandom(uint mintIndex) internal view returns(uint){ uint blockDna = mintIndex.mul(block.number); uint rand = uint(keccak256(abi.encodePacked(blockDna))); return rand % luckModulus; } function viewTokenBattleStats(uint mintIndex) public view returns (uint, uint, uint, uint, uint) { require(mintIndex >= 0, "Please choose a token within valid range."); require(mintIndex <= totalSupply(), "Token hasn't been minted yet!"); return (attrIndex[mintIndex].health.add((attrIndex[mintIndex].pets).mul(attrIndex[mintIndex].level).mul(4)), attrIndex[mintIndex].strength.add((attrIndex[mintIndex].pets.mul(attrIndex[mintIndex].level).mul(4))), attrIndex[mintIndex].defense.add((attrIndex[mintIndex].pets.mul(attrIndex[mintIndex].level).mul(4))), attrIndex[mintIndex].speed, attrIndex[mintIndex].luck); } function changeTokenName(uint _tokenId, string memory _name) public { require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this token!"); require(sha256(bytes(_name)) != sha256(bytes(attrIndex[_tokenId].name)), "New name is same as the current one"); attrIndex[_tokenId].name = _name; emit nameChange(msg.sender, _tokenId, _name); } function viewTokenName(uint _tokenId) public view returns( string memory ){ require( _tokenId < totalSupply(), "Choose a token within range" ); if(attrIndex[_tokenId].level <= 2){ return attrIndex[_tokenId].name; } if(attrIndex[_tokenId].level == 3){ string[1] memory name; name[0] = namePreffixes[attrIndex[_tokenId].luck % namePreffixes.length]; string memory output = string(abi.encodePacked(name[0], ' ', attrIndex[_tokenId].name)); return output; } if(attrIndex[_tokenId].level <= 5){ string[2] memory name; name[0] = namePreffixes[attrIndex[_tokenId].luck % namePreffixes.length]; name[1] = prefixes[attrIndex[_tokenId].luck % prefixes.length]; string memory output = string(abi.encodePacked(name[0], ' ', attrIndex[_tokenId].name , ', ', name[1])); return output; } if(attrIndex[_tokenId].level <= 7){ string[3] memory name; name[0] = namePreffixes[attrIndex[_tokenId].luck % namePreffixes.length]; name[1] = prefixes[attrIndex[_tokenId].luck % prefixes.length]; name[2] = suffixes[attrIndex[_tokenId].luck % suffixes.length]; string memory output = string(abi.encodePacked(name[0], ' ', attrIndex[_tokenId].name , ', ', name[1], ' ', name[2])); return output; } else { string[4] memory name; name[0] = namePreffixes[attrIndex[_tokenId].luck % namePreffixes.length]; name[1] = prefixes[attrIndex[_tokenId].luck % prefixes.length]; name[2] = suffixes[attrIndex[_tokenId].luck % suffixes.length]; name[3] = prePrefixes[attrIndex[_tokenId].luck % prePrefixes.length]; string memory output = string(abi.encodePacked(name[3], '-', name[0], ' ', attrIndex[_tokenId].name , ', ', name[1], ' ', name[2] )); return output; } } function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } string[] private prePrefixes = [ "Bard", "Druid", "Sorcerer", "Wizard", "Loremaster", "Vermin Lord", "Silverstar", "Arcane", "Spelldancer", "Bane", "Void", "BlackFlame", "Beholder", "Incantatrix", "Bladesinger", "Diabolist", "Queen of the Wild", "Gold", "Silver", "Bronze", "Platinum", "Titanium" ]; string[] private namePreffixes = [ "Bane", "Root", "Bite", "Song", "Roar", "Grasp", "Instrument", "Glow", "Bender", "Shadow", "Whisper", "Shout", "Growl", "Tear", "Peak", "Form", "Sun", "Moon" ]; // Name string[] private prefixes = [ "Agony", "Apocalypse", "Armageddon", "Beast", "Behemoth", "Blight", "Blood", "Bramble", "Brimstone", "Brood", "Carrion", "Cataclysm", "Chimeric", "Corpse", "Corruption", "Damnation", "Death", "Demon", "Dire", "Dragon", "Dread", "Doom", "Dusk", "Eagle", "Empyrean", "Fate", "Foe", "Gale", "Ghoul", "Gloom", "Glyph", "Golem", "Grim", "Hate", "Havoc", "Honour", "Horror", "Hypnotic", "Kraken", "Loath", "Maelstrom", "Mind", "Miracle", "Morbid", "Oblivion", "Onslaught", "Pain", "Pandemonium", "Phoenix", "Plague", "Rage", "Rapture", "Rune", "Skull", "Sol", "Soul", "Sorrow", "Spirit", "Storm", "Tempest", "Torment", "Vengeance", "Victory", "Viper", "Vortex", "Woe", "Wrath", "Light's", "Shimmering" ]; string[] private suffixes = [ "of Power", "of Giants", "of Titans", "of Skill", "of Perfection", "of Brilliance", "of Enlightenment", "of Protection", "of Anger", "of Rage", "of Fury", "of Vitriol", "of the Fox", "of Detection", "of Reflection", "of the Twins" ]; }
[{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"erc20Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"levelUpToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"nameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"sentAdventuring","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"tokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"tokenPet","type":"event"},{"inputs":[],"name":"BEANS","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"admin_changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin_flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin_lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"admin_reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBattleground","type":"address"}],"name":"admin_setBattleground","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"admin_setFeeMul","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"admin_setLBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintingRate","type":"uint256"}],"name":"admin_setMintingRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"admin_setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_requireBeans","type":"bool"}],"name":"admin_setRequireBeans","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requiredBal","type":"uint256"}],"name":"admin_setRequiredBal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"adventure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"attrIndex","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"pets","type":"uint256"},{"internalType":"uint256","name":"battlesWon","type":"uint256"},{"internalType":"uint256","name":"health","type":"uint256"},{"internalType":"uint256","name":"strength","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"luck","type":"uint256"},{"internalType":"uint256","name":"xp","type":"uint256"},{"internalType":"uint256","name":"log","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"}],"stateMutability":"view","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":"battleground","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeTokenName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cumulativeLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeMul","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"levelUptoken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"minterc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"petToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"},{"internalType":"uint256","name":"newPets","type":"uint256"}],"name":"resetPets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"},{"internalType":"uint256","name":"newXP","type":"uint256"}],"name":"resetXP","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":"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":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenReserve","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"viewOwedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"}],"name":"viewTokenBattleStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewTokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"wonBattle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curent_level","type":"uint256"}],"name":"xp_required","outputs":[{"internalType":"uint256","name":"xp_to_next_level","type":"uint256"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001b91600b916200127c565b506040805160208101918290526000908190526200003c91600c916200127c565b50600d805461ffff191690556005600f55601080546001600160a01b031990811661dead90811790925560118054821673c2392dd3e3fed2c8ed9f7f0bdf6026fcd13484531790556012805460ff60a01b19921690921716600160a01b179055680d8d726b7177a800006013556004601455612710601581905560006016556017556001601855620000cd6200120e565b601a80546001600160a01b0319166001600160a01b0392909216919091179055604080516103008101825260046102c082018181526310985c9960e21b6102e08401528252825180840184526005815264111c9d5a5960da1b602080830191909152808401919091528351808501855260088082526729b7b931b2b932b960c11b82840152848601919091528451808601865260068082526515da5e985c9960d21b82850152606086019190915285518087018752600a808252692637b932b6b0b9ba32b960b11b82860152608087019190915286518088018852600b8082526a15995c9b5a5b88131bdc9960aa1b8287015260a0880191909152875180890189528281526929b4b63b32b939ba30b960b11b8187015260c08801528751808901895283815265417263616e6560d01b8187015260e0880152875180890189528181526a29b832b6363230b731b2b960a91b81870152610100880152875180890189528681526342616e6560e01b818701526101208801528751808901895286815263159bda5960e21b818701526101408801528751808901895291825269426c61636b466c616d6560b01b8286015261016087019190915286518088018852838152672132b437b63232b960c11b81860152610180870152865180880188528181526a092dcc6c2dce8c2e8e4d2f60ab1b818601526101a0870152865180880188529081526a213630b232b9b4b733b2b960a91b818501526101c0860152855180870187526009815268111a58589bdb1a5cdd60ba1b818501526101e0860152855180870187526011815270145d59595b881bd9881d1a194815da5b19607a1b81850152610200860152855180870187529384526311dbdb1960e21b84840152610220850193909352845180860186528381526529b4b63b32b960d11b81840152610240850152845180860186529283526542726f6e7a6560d01b838301526102608401929092528351808501855282815267506c6174696e756d60c01b81830152610280840152835180850190945290835267546974616e69756d60c01b908301526102a0810191909152620003ea90601b90601662001311565b506040805161028081018252600461024082018181526342616e6560e01b61026084015282528251808401845281815263149bdbdd60e21b6020828101919091528084019190915283518085018552828152634269746560e01b81830152838501528351808501855282815263536f6e6760e01b81830152606084015283518085018552828152632937b0b960e11b81830152608084015283518085018552600580825264047726173760dc1b8284015260a085019190915284518086018652600a815269125b9cdd1c9d5b595b9d60b21b8184015260c08501528451808601865283815263476c6f7760e01b8184015260e0850152845180860186526006808252652132b73232b960d11b828501526101008601919091528551808701875290815265536861646f7760d01b818401526101208501528451808601865260078152662bb434b9b832b960c91b81840152610140850152845180860186528181526414da1bdd5d60da1b81840152610160850152845180860186529081526411dc9bdddb60da1b8183015261018084015283518085018552828152632a32b0b960e11b818301526101a084015283518085018552828152635065616b60e01b818301526101c08401528351808501855282815263466f726d60e01b818301526101e084015283518085018552600381526229bab760e91b8183015261020084015283518085019094529083526326b7b7b760e11b908301526102208101919091526200061b90601c90601262001371565b50604080516108e08101825260056108a082018181526441676f6e7960d81b6108c0840152825282518084018452600a8082526941706f63616c7970736560b01b60208381019190915280850192909252845180860186528181526920b936b0b3b2b23237b760b11b818401528486015284518086018652838152641099585cdd60da1b81840152606085015284518086018652600880825267084cad0cadadee8d60c31b82850152608086019190915285518087018752600680825265109b1a59da1d60d21b8286015260a08701919091528651808801885285815264109b1bdbd960da1b8186015260c0870152865180880188526007808252664272616d626c6560c81b8287015260e0880191909152875180890189526009808252684272696d73746f6e6560b81b828801526101008901919091528851808a018a5287815264109c9bdbd960da1b818801526101208901528851808a018a528281526621b0b93934b7b760c91b818801526101408901528851808a018a528181526843617461636c79736d60b81b818801526101608901528851808a018a52848152674368696d6572696360c01b818801526101808901528851808a018a5283815265436f7270736560d01b818801526101a08901528851808a018a528581526921b7b9393ab83a34b7b760b11b818801526101c08901528851808a018a52818152682230b6b730ba34b7b760b91b818801526101e08901528851808a018a5287815264088cac2e8d60db1b818801526102008901528851808a018a52878152642232b6b7b760d91b818801526102208901528851808a018a526004808252634469726560e01b828901526102408a01919091528951808b018b5284815265223930b3b7b760d11b818901526102608a01528951808b018b5288815264111c99585960da1b818901526102808a01528951808b018b5281815263446f6f6d60e01b818901526102a08a01528951808b018b52818152634475736b60e01b818901526102c08a01528951808b018b52888152644561676c6560d81b818901526102e08a01528951808b018b528581526722b6b83cb932b0b760c11b818901526103008a01528951808b018b52818152634661746560e01b818901526103208a01528951808b018b52600380825262466f6560e81b828a01526103408b01919091528a51808c018c528281526347616c6560e01b818a01526103608b01528a51808c018c528981526411da1bdd5b60da1b818a01526103808b01528a51808c018c5289815264476c6f6f6d60d81b818a01526103a08b01528a51808c018c528981526408ed8f2e0d60db1b818a01526103c08b01528a51808c018c5289815264476f6c656d60d81b818a01526103e08b01528a51808c018c52828152634772696d60e01b818a01526104008b01528a51808c018c52828152634861746560e01b818a01526104208b01528a51808c018c52898152644861766f6360d81b818a01526104408b01528a51808c018c52858152652437b737bab960d11b818a01526104608b01528a51808c018c52858152652437b93937b960d11b818a01526104808b01528a51808c018c52868152674879706e6f74696360c01b818a01526104a08b01528a51808c018c528581526525b930b5b2b760d11b818a01526104c08b01528a51808c018c5289815264098dec2e8d60db1b818a01526104e08b01528a51808c018c52838152684d61656c7374726f6d60b81b818a01526105008b01528a51808c018c5282815263135a5b9960e21b818a01526105208b01528a51808c018c52848152664d697261636c6560c81b818a01526105408b01528a51808c018c5285815265135bdc989a5960d21b818a01526105608b01528a51808c018c529586526727b13634bb34b7b760c11b868901526105808a01959095528951808b018b528281526813db9cdb185d59da1d60ba1b818901526105a08a01528951808b018b52818152632830b4b760e11b818901526105c08a01528951808b018b52600b81526a50616e64656d6f6e69756d60a81b818901526105e08a01528951808b018b52838152660a0d0decadcd2f60cb1b818901526106008a01528951808b018b5284815265506c6167756560d01b818901526106208a01528951808b018b52818152635261676560e01b818901526106408a01528951808b018b52838152665261707475726560c81b818901526106608a01528951808b018b528181526352756e6560e01b818901526106808a01528951808b018b528881526414dadd5b1b60da1b818901526106a08a01528951808b018b528581526214dbdb60ea1b818901526106c08a01528951808b018b529081526314dbdd5b60e21b818801526106e08901528851808a018a5283815265536f72726f7760d01b818801526107008901528851808a018a528381526514dc1a5c9a5d60d21b818801526107208901528851808a018a528781526453746f726d60d81b818801526107408901528851808a018a528281526615195b5c195cdd60ca1b818801526107608901528851808a018a5282815266151bdc9b595b9d60ca1b818801526107808901528851808a018a529081526856656e6765616e636560b81b818701526107a08801528751808901895281815266566963746f727960c81b818701526107c088015287518089018952868152642b34b832b960d91b818701526107e088015287518089018952918252650acdee4e8caf60d31b828601526108008701919091528651808801885291825262576f6560e81b8285015261082086019190915285518087018752938452640aee4c2e8d60db1b8484015261084085019390935284518086018652928352664c69676874277360c81b838301526108608401929092528351808501909452908352695368696d6d6572696e6760b01b9083015261088081019190915262000e8590601d906045620013c3565b506040805161024081018252600861020082018181526737b3102837bbb2b960c11b6102208401528252825180840184526009808252686f66204769616e747360b81b6020838101919091528085019290925284518086018652908152686f6620546974616e7360b81b818301528385015283518085018552828152671bd98814dada5b1b60c21b81830152606084015283518085018552600d8082526c37b3102832b93332b1ba34b7b760991b828401526080850191909152845180860186528181526c6f66204272696c6c69616e636560981b8184015260a08501528451808601865260108082526f1bd988115b9b1a59da1d195b9b595b9d60821b8285015260c0860191909152855180870187528281526c37b310283937ba32b1ba34b7b760991b8185015260e0860152855180870187529384526737b31020b733b2b960c11b84840152610100850193909352845180860186526007808252666f66205261676560c81b8285015261012086019190915285518087018752908152666f66204675727960c81b8184015261014085015284518086018652600a808252691bd988159a5d1c9a5bdb60b21b8285015261016086019190915285518087018752908152690decc40e8d0ca408cdef60b31b8184015261018085015284518086018652600c8082526b37b3102232ba32b1ba34b7b760a11b828501526101a0860191909152855180870187529182526c37b3102932b33632b1ba34b7b760991b828401526101c0850191909152845180860190955284526b6f6620746865205477696e7360a01b908401526101e0820192909252620010e991601e919062001415565b50348015620010f757600080fd5b5060408051808201825260098152681091505394c813919560ba1b602080830191909152825180840190935260078352664265616e69657360c81b9083015290620011496301ffc9a760e01b6200121d565b81516200115e9060069060208501906200127c565b508051620011749060079060208401906200127c565b50620011876380ac58cd60e01b6200121d565b62001199635b5e139f60e01b6200121d565b620011ab63780e9d6360e01b6200121d565b5060009050620011ba62001278565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062001521565b600a546001600160a01b031690565b6001600160e01b03198082161415620012535760405162461bcd60e51b81526004016200124a90620014ea565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620012b45760008555620012ff565b82601f10620012cf57805160ff1916838001178555620012ff565b82800160010185558215620012ff579182015b82811115620012ff578251825591602001919060010190620012e2565b506200130d92915062001467565b5090565b82805482825590600052602060002090810192821562001363579160200282015b82811115620013635782518051620013529184916020909101906200127c565b509160200191906001019062001332565b506200130d9291506200147e565b82805482825590600052602060002090810192821562001363579160200282015b82811115620013635782518051620013b29184916020909101906200127c565b509160200191906001019062001392565b82805482825590600052602060002090810192821562001363579160200282015b82811115620013635782518051620014049184916020909101906200127c565b5091602001919060010190620013e4565b82805482825590600052602060002090810192821562001363579160200282015b82811115620013635782518051620014569184916020909101906200127c565b509160200191906001019062001436565b5b808211156200130d576000815560010162001468565b808211156200130d5760006200149582826200149f565b506001016200147e565b50805460018160011615610100020316600290046000825580601f10620014c75750620014e7565b601f016020900490600052602060002090810190620014e7919062001467565b50565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b615a0280620015316000396000f3fe6080604052600436106103c35760003560e01c806376613c20116101f2578063b88d4fde1161010d578063e985e9c5116100a0578063f47c84c51161006f578063f47c84c514610ac9578063f741251d14610ade578063f84b40dc14610afe578063f86aa6bd14610b1e576103c3565b8063e985e9c514610a54578063eb8d244414610a74578063ef3efe6714610a89578063f2fde38b14610aa9576103c3565b8063cbcb3171116100dc578063cbcb3171146109df578063d84fedd3146109f4578063d9b137b214610a14578063ddb9657c14610a34576103c3565b8063b88d4fde1461095b578063c38fdbbf1461097b578063c634d032146109ac578063c87b56dd146109bf576103c3565b806395d89b4111610185578063a22cb46511610154578063a22cb465146108e6578063aca10be314610906578063b00b52f114610926578063b6f6a92014610946576103c3565b806395d89b41146108875780639be6ab9d1461089c5780639c3e72bd146108bc5780639f7ff889146108d1576103c3565b8063843ac051116101c1578063843ac051146108055780638462151c146108255780638da5cb5b146108525780638dbb1e3a14610867576103c3565b806376613c201461079b578063785e9e86146107bb5780637a2b753d146107d05780637ff9b596146107f0576103c3565b80633cfcccc1116102e2578063542766ed116102755780636373a6b1116102445780636373a6b11461073c5780636c0360eb1461075157806370a0823114610766578063715018a614610786576103c3565b8063542766ed146106d25780635501c671146106f257806356ddea0a146107075780636352211e1461071c576103c3565b806348c5c00b116102b157806348c5c00b146106685780634c031a661461067d5780634f6ccce71461069d57806353e1a7a0146106bd576103c3565b80633cfcccc1146105e857806342842e0e1461060857806342966c681461062857806344cd4cec14610648576103c3565b80631cc3a1621161035a5780633228a488116103295780633228a488146105735780633c6444f6146105935780633ccfd60b146105b35780633ce21c8e146105c8576103c3565b80631cc3a162146104fe57806323b872dd1461051e57806327c8f8351461053e5780632f745c5914610553576103c3565b806309aa3dcf1161039657806309aa3dcf1461046f57806318160ddd146104915780631877b42d146104a657806318f5de38146104c6576103c3565b806301ffc9a7146103c857806306fdde03146103fe578063081812fc14610420578063095ea7b31461044d575b600080fd5b3480156103d457600080fd5b506103e86103e336600461486b565b610b33565b6040516103f59190614d42565b60405180910390f35b34801561040a57600080fd5b50610413610b56565b6040516103f59190614d4d565b34801561042c57600080fd5b5061044061043b3660046148d6565b610bec565b6040516103f59190614c2f565b34801561045957600080fd5b5061046d6104683660046147f2565b610c38565b005b34801561047b57600080fd5b50610484610cd0565b6040516103f59190614c26565b34801561049d57600080fd5b50610484610cd5565b3480156104b257600080fd5b5061046d6104c13660046148a3565b610ce6565b3480156104d257600080fd5b506104e66104e13660046148d6565b610d31565b6040516103f59c9b9a99989796959493929190614d60565b34801561050a57600080fd5b5061046d6105193660046148d6565b610e14565b34801561052a57600080fd5b5061046d610539366004614708565b610fa3565b34801561054a57600080fd5b50610440610fdb565b34801561055f57600080fd5b5061048461056e3660046147f2565b610fea565b34801561057f57600080fd5b5061046d61058e3660046148d6565b611015565b34801561059f57600080fd5b5061046d6105ae3660046148a3565b6114ae565b3480156105bf57600080fd5b5061046d611504565b3480156105d457600080fd5b5061046d6105e3366004614933565b611572565b3480156105f457600080fd5b5061046d6106033660046148d6565b6115c6565b34801561061457600080fd5b5061046d610623366004614708565b611a23565b34801561063457600080fd5b5061046d6106433660046148d6565b611a3e565b34801561065457600080fd5b5061046d6106633660046146bc565b611b4e565b34801561067457600080fd5b50610484611baf565b34801561068957600080fd5b5061046d61069836600461481b565b611bb5565b3480156106a957600080fd5b506104846106b83660046148d6565b611c12565b3480156106c957600080fd5b50610484611c28565b3480156106de57600080fd5b5061046d6106ed3660046148a3565b611c2e565b3480156106fe57600080fd5b5061046d611ca3565b34801561071357600080fd5b50610440611cff565b34801561072857600080fd5b506104406107373660046148d6565b611d0e565b34801561074857600080fd5b50610413611d36565b34801561075d57600080fd5b50610413611dc4565b34801561077257600080fd5b506104846107813660046146bc565b611e25565b34801561079257600080fd5b5061046d611e6e565b3480156107a757600080fd5b5061046d6107b63660046148d6565b611ef7565b3480156107c757600080fd5b50610440611f3b565b3480156107dc57600080fd5b506104846107eb3660046148d6565b611f4a565b3480156107fc57600080fd5b50610484611f89565b34801561081157600080fd5b5061046d6108203660046148d6565b611f95565b34801561083157600080fd5b506108456108403660046146bc565b611fd9565b6040516103f59190614cfe565b34801561085e57600080fd5b5061044061208d565b34801561087357600080fd5b50610484610882366004614933565b61209c565b34801561089357600080fd5b506104136120a8565b3480156108a857600080fd5b5061046d6108b73660046148d6565b612109565b3480156108c857600080fd5b5061041361214d565b3480156108dd57600080fd5b506104846121a8565b3480156108f257600080fd5b5061046d6109013660046147bc565b6121ae565b34801561091257600080fd5b506104846109213660046148d6565b61227c565b34801561093257600080fd5b5061046d6109413660046148d6565b6122ac565b34801561095257600080fd5b50610440612350565b34801561096757600080fd5b5061046d610976366004614743565b61235f565b34801561098757600080fd5b5061099b6109963660046148d6565b61239e565b6040516103f59594939291906158f2565b61046d6109ba3660046148d6565b6124c7565b3480156109cb57600080fd5b506104136109da3660046148d6565b6127e1565b3480156109eb57600080fd5b50610484612925565b348015610a0057600080fd5b50610413610a0f3660046148d6565b61292b565b348015610a2057600080fd5b50610413610a2f3660046148d6565b613398565b348015610a4057600080fd5b5061046d610a4f3660046147f2565b613452565b348015610a6057600080fd5b506103e8610a6f3660046146d6565b613500565b348015610a8057600080fd5b506103e861352e565b348015610a9557600080fd5b5061046d610aa43660046148d6565b61353c565b348015610ab557600080fd5b5061046d610ac43660046146bc565b6135ad565b348015610ad557600080fd5b5061048461366e565b348015610aea57600080fd5b5061046d610af9366004614933565b613674565b348015610b0a57600080fd5b5061046d610b193660046148ee565b6136c8565b348015610b2a57600080fd5b5061046d613817565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b820191906000526020600020905b815481529060010190602001808311610bc557829003601f168201915b5050505050905090565b6000610bf78261389e565b610c1c5760405162461bcd60e51b8152600401610c13906154f6565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c4382611d0e565b9050806001600160a01b0316836001600160a01b03161415610c775760405162461bcd60e51b8152600401610c139061570b565b806001600160a01b0316610c896138ab565b6001600160a01b03161480610ca55750610ca581610a6f6138ab565b610cc15760405162461bcd60e51b8152600401610c13906152a8565b610ccb83836138af565b505050565b600581565b6000610ce1600261391d565b905090565b610cee6138ab565b6001600160a01b0316610cff61208d565b6001600160a01b031614610d255760405162461bcd60e51b8152600401610c1390615579565b610d2e81613928565b50565b600e6020908152600091825260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452909291839190830182828015610dc85780601f10610d9d57610100808354040283529160200191610dc8565b820191906000526020600020905b815481529060010190602001808311610dab57829003601f168201915b50505050509080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b33610e1e82611d0e565b6001600160a01b031614610e445760405162461bcd60e51b8152600401610c1390615804565b6000818152600e602052604090206001015460031115610e765760405162461bcd60e51b8152600401610c13906151f8565b6016546000828152600e6020526040812060018101546008820154600b909201549293610eca939092610ec492610ebb929091610eb59182904361209c565b9061393b565b6017549061393b565b90613975565b6000838152600e60205260409081902043600b9091015560105490516340c10f1960e01b81529192506001600160a01b0316906340c10f1990610f139033908590600401614cbe565b602060405180830381600087803b158015610f2d57600080fd5b505af1158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614837565b507f1fb23666ed94b3e9ced2ad714495c2852c931585b9e60221a1f7914bc578b9123382604051610f97929190614cbe565b60405180910390a15050565b610fb4610fae6138ab565b826139a7565b610fd05760405162461bcd60e51b8152600401610c139061577c565b610ccb838383613a2c565b6012546001600160a01b031681565b6001600160a01b038216600090815260016020526040812061100c9083613b3a565b90505b92915050565b6000818152600e6020526040902060020154601910156110475760405162461bcd60e51b8152600401610c1390615542565b6000818152600e602052604090206002015460011161143f576000818152600e602052604090206002015460185461108c9190610eb590674563918244f4000061393b565b6010546040516370a0823160e01b81526001600160a01b03909116906370a08231906110bc903390600401614c2f565b60206040518083038186803b1580156110d457600080fd5b505afa1580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110c9190614853565b101561112a5760405162461bcd60e51b8152600401610c1390615894565b6000818152600e60205260408120600201546018546111569190610eb590674563918244f4000061393b565b601054604051636eb1769f60e11b81529192506000916001600160a01b039091169063dd62ed3e9061118e9033903090600401614c43565b60206040518083038186803b1580156111a657600080fd5b505afa1580156111ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111de9190614853565b601054604051636eb1769f60e11b815291925083831015916001600160a01b039091169063dd62ed3e906112189033903090600401614c43565b60206040518083038186803b15801561123057600080fd5b505afa158015611244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112689190614853565b8360405160200161127a929190614be4565b604051602081830303815290604052906112a75760405162461bcd60e51b8152600401610c139190614d4d565b506010546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906112dc90339030908790600401614c5d565b602060405180830381600087803b1580156112f657600080fd5b505af115801561130a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132e9190614837565b506010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611360903090600401614c2f565b60206040518083038186803b15801561137857600080fd5b505afa15801561138c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b09190614853565b60105460125460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926113e89216908590600401614cbe565b602060405180830381600087803b15801561140257600080fd5b505af1158015611416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143a9190614837565b505050505b6000818152600e602052604090206002015461145c906001613b46565b6000828152600e60205260409081902060020191909155517f1b434a086dd5f568dcf1cb1c9460656430e95f3bce11b6b7bc20798bd706e49a906114a39033908490614cbe565b60405180910390a150565b6114b66138ab565b6001600160a01b03166114c761208d565b6001600160a01b0316146114ed5760405162461bcd60e51b8152600401610c1390615579565b805161150090600b9060208401906144cd565b5050565b61150c6138ab565b6001600160a01b031661151d61208d565b6001600160a01b0316146115435760405162461bcd60e51b8152600401610c1390615579565b6040514790339082156108fc029083906000818181858888f19350505050158015611500573d6000803e3d6000fd5b61157a6138ab565b6001600160a01b031661158b611cff565b6001600160a01b0316146115b15760405162461bcd60e51b8152600401610c1390615579565b6000918252600e602052604090912060020155565b336115d082611d0e565b6001600160a01b0316146115f65760405162461bcd60e51b8152600401610c1390615804565b6000818152600e6020526040902060010154600910156116285760405162461bcd60e51b8152600401610c139061547e565b6000818152600e60205260409020600101546018546116559190610eb5906802b5e3af16b188000061393b565b6010546040516370a0823160e01b81526001600160a01b03909116906370a0823190611685903390600401614c2f565b60206040518083038186803b15801561169d57600080fd5b505afa1580156116b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d59190614853565b10156116f35760405162461bcd60e51b8152600401610c13906153d0565b6000818152600e602052604081206001015461170e9061227c565b6000838152600e60205260409020600901549091508111156117425760405162461bcd60e51b8152600401610c13906158cb565b6000828152600e602052604081206001015460185461176a9190610eb590633b9aca0061393b565b601054604051636eb1769f60e11b81529192506000916001600160a01b039091169063dd62ed3e906117a29033903090600401614c43565b60206040518083038186803b1580156117ba57600080fd5b505afa1580156117ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f29190614853565b9050818110156118145760405162461bcd60e51b8152600401610c1390615305565b6010546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061184890339030908790600401614c5d565b602060405180830381600087803b15801561186257600080fd5b505af1158015611876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189a9190614837565b506000848152600e6020526040902060098101805485900390556001908101546118c391613b46565b6000858152600e60205260408082206001019290925560105491516370a0823160e01b815290916001600160a01b0316906370a0823190611908903090600401614c2f565b60206040518083038186803b15801561192057600080fd5b505afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119589190614853565b60105460125460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926119909216908590600401614cbe565b602060405180830381600087803b1580156119aa57600080fd5b505af11580156119be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e29190614837565b507f63f93e9c49e6ef55ed1cf3b3915e6f71ac510f5d0d265c19d42cb43e789fec543386604051611a14929190614cbe565b60405180910390a15050505050565b610ccb8383836040518060200160405280600081525061235f565b33611a4882611d0e565b6001600160a01b031614611a6e5760405162461bcd60e51b8152600401610c1390615804565b601754600090611a8690674563918244f4000061393b565b6010546040516340c10f1960e01b81529192506001600160a01b0316906340c10f1990611ab99033908590600401614cbe565b602060405180830381600087803b158015611ad357600080fd5b505af1158015611ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0b9190614837565b507f1fb23666ed94b3e9ced2ad714495c2852c931585b9e60221a1f7914bc578b9123382604051611b3d929190614cbe565b60405180910390a161150082613b6b565b611b566138ab565b6001600160a01b0316611b6761208d565b6001600160a01b031614611b8d5760405162461bcd60e51b8152600401610c1390615579565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b60165481565b611bbd6138ab565b6001600160a01b0316611bce61208d565b6001600160a01b031614611bf45760405162461bcd60e51b8152600401610c1390615579565b60128054911515600160a01b0260ff60a01b19909216919091179055565b600080611c20600284613c38565b509392505050565b60185481565b611c366138ab565b6001600160a01b0316611c4761208d565b6001600160a01b031614611c6d5760405162461bcd60e51b8152600401610c1390615579565b600d5460ff1615611c905760405162461bcd60e51b8152600401610c139061574c565b805161150090600c9060208401906144cd565b611cab6138ab565b6001600160a01b0316611cbc61208d565b6001600160a01b031614611ce25760405162461bcd60e51b8152600401610c1390615579565b600d805461ff001981166101009182900460ff1615909102179055565b601a546001600160a01b031690565b600061100f826040518060600160405280602981526020016159a46029913960029190613c54565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611dbc5780601f10611d9157610100808354040283529160200191611dbc565b820191906000526020600020905b815481529060010190602001808311611d9f57829003601f168201915b505050505081565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b60006001600160a01b038216611e4d5760405162461bcd60e51b8152600401610c139061533c565b6001600160a01b038216600090815260016020526040902061100f9061391d565b611e766138ab565b6001600160a01b0316611e8761208d565b6001600160a01b031614611ead5760405162461bcd60e51b8152600401610c1390615579565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b611eff6138ab565b6001600160a01b0316611f1061208d565b6001600160a01b031614611f365760405162461bcd60e51b8152600401610c1390615579565b601355565b6010546001600160a01b031681565b6016546000828152600e6020526040812060018101546008820154600b90920154929361100f939092610ec492610ebb929091610eb59182904361209c565b6709935f581f05000081565b611f9d6138ab565b6001600160a01b0316611fae61208d565b6001600160a01b031614611fd45760405162461bcd60e51b8152600401610c1390615579565b601755565b60606000611fe683611e25565b905080612003575050604080516000815260208101909152610b51565b60008167ffffffffffffffff8111801561201c57600080fd5b50604051908082528060200260200182016040528015612046578160200160208202803683370190505b50905060005b8281101561207d5761205e8582610fea565b82828151811061206a57fe5b602090810291909101015260010161204c565b509150610b519050565b50919050565b600a546001600160a01b031690565b600061100c8284613c6b565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b6121116138ab565b6001600160a01b031661212261208d565b6001600160a01b0316146121485760405162461bcd60e51b8152600401610c1390615579565b601855565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611dbc5780601f10611d9157610100808354040283529160200191611dbc565b60175481565b6121b66138ab565b6001600160a01b0316826001600160a01b031614156121e75760405162461bcd60e51b8152600401610c13906150c1565b80600560006121f46138ab565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556122386138ab565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122709190614d42565b60405180910390a35050565b683635c9adc5dea00000810260015b8281101561208757683635c9adc5dea000008102919091019060010161228b565b6122b633826139a7565b6122bf57600080fd5b6000818152600e60205260409020600a015442116122dc57600080fd5b6122f46122ed620151806004613975565b4290613b46565b6000828152600e602052604090819020600a81019290925560099091018054680d8d726b7177a80000019055517f295d55086c6d393038a87c8c8dae07b9d3c630d89f0f0147f031a68b23ca2f00906114a39033908490614cbe565b6011546001600160a01b031681565b61237061236a6138ab565b836139a7565b61238c5760405162461bcd60e51b8152600401610c139061577c565b61239884848484613c93565b50505050565b6000808080806123ac610cd5565b8611156123cb5760405162461bcd60e51b8152600401610c1390615646565b6000868152600e602052604090206001810154600290910154612411916123f991600491610eb5919061393b565b6000888152600e602052604090206004015490613b46565b6000878152600e6020526040902060018101546002909101546124579161243f91600491610eb5919061393b565b6000898152600e602052604090206005015490613b46565b6000888152600e60205260409020600181015460029091015461249d9161248591600491610eb5919061393b565b60008a8152600e602052604090206006015490613b46565b6000988952600e602052604090982060078101546008909101549299919897509550909350915050565b600d54610100900460ff166124ee5760405162461bcd60e51b8152600401610c1390614e95565b6000811180156124ff575060058111155b61251b5760405162461bcd60e51b8152600401610c1390614f0d565b6101d16125308261252a610cd5565b90613b46565b111561254e5760405162461bcd60e51b8152600401610c1390615386565b6125606709935f581f0500008261393b565b34101561257f5760405162461bcd60e51b8152600401610c13906150f8565b601254600160a01b900460ff1615612631576013546011546040516370a0823160e01b81526001600160a01b03909116906370a08231906125c4903390600401614c2f565b60206040518083038186803b1580156125dc57600080fd5b505afa1580156125f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126149190614853565b116126315760405162461bcd60e51b8152600401610c139061567d565b600f5461263c610cd5565b6101d103116126845761264d6138ab565b6001600160a01b031661265e61208d565b6001600160a01b0316146126845760405162461bcd60e51b8152600401610c139061584c565b60005b81811015611500576000612699610cd5565b60010190506101d16126a9610cd5565b10156127d8576000818152600e6020526040812060018181015560028101829055600381019190915542600a82015543600b909101556126f26126ed82608061393b565b613cc6565b6000828152600e60205260409020600401556127126126ed82601961393b565b6000828152600e60205260409020600501556127336126ed826101a461393b565b6000828152600e60205260409020600601556127536126ed82604561393b565b6000828152600e60205260409020600701556127736126ed82600a61393b565b6000828152600e6020526040902060080155601654612793906001613b46565b6016556127a03382613d17565b7f0a6b2a25f2764bb23ba81dc1f3c7e5885291c116a26ba73b46c15ed494831741816040516127cf9190614c26565b60405180910390a15b50600101612687565b60606127ec8261389e565b6128085760405162461bcd60e51b8152600401610c13906155f7565b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f81018590048502820185019093528281529290919083018282801561289b5780601f106128705761010080835404028352916020019161289b565b820191906000526020600020905b81548152906001019060200180831161287e57829003601f168201915b5050505050905060006128ac611dc4565b90508051600014156128c057509050610b51565b8151156128f25780826040516020016128da929190614a18565b60405160208183030381529060405292505050610b51565b806128fc85613d31565b60405160200161290d929190614a18565b60405160208183030381529060405292505050919050565b600f5481565b6060612935610cd5565b82106129535760405162461bcd60e51b8152600401610c1390614ed6565b6000828152600e6020526040902060010154600210612a0b576000828152600e602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156129ff5780601f106129d4576101008083540402835291602001916129ff565b820191906000526020600020905b8154815290600101906020018083116129e257829003601f168201915b50505050509050610b51565b6000828152600e602052604090206001015460031415612b3d57612a2d614559565b601c80546000858152600e602052604090206008015481612a4a57fe5b0681548110612a5557fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ae35780601f10612ab857610100808354040283529160200191612ae3565b820191906000526020600020905b815481529060010190602001808311612ac657829003601f168201915b505050505081600060018110612af557fe5b602002015260008181602090810291909101516000868152600e83526040908190209051612b239301614a57565b60408051601f198184030181529190529250610b51915050565b6000828152600e6020526040902060010154600510612d3157612b5e614580565b601c80546000858152600e602052604090206008015481612b7b57fe5b0681548110612b8657fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612c145780601f10612be957610100808354040283529160200191612c14565b820191906000526020600020905b815481529060010190602001808311612bf757829003601f168201915b505050505081600060028110612c2657fe5b6020020181905250601d8080549050600e60008681526020019081526020016000206008015481612c5357fe5b0681548110612c5e57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612cec5780601f10612cc157610100808354040283529160200191612cec565b820191906000526020600020905b815481529060010190602001808311612ccf57829003601f168201915b505050505081600160028110612cfe57fe5b6020908102919091019190915281516000858152600e835260408082208585015191519294612b23949391929101614a8a565b6000828152600e602052604090206001015460071061300257612d52614599565b601c80546000858152600e602052604090206008015481612d6f57fe5b0681548110612d7a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612e085780601f10612ddd57610100808354040283529160200191612e08565b820191906000526020600020905b815481529060010190602001808311612deb57829003601f168201915b505050505081600060038110612e1a57fe5b6020020181905250601d8080549050600e60008681526020019081526020016000206008015481612e4757fe5b0681548110612e5257fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ee05780601f10612eb557610100808354040283529160200191612ee0565b820191906000526020600020905b815481529060010190602001808311612ec357829003601f168201915b505050505081600160038110612ef257fe5b6020020181905250601e8080549050600e60008681526020019081526020016000206008015481612f1f57fe5b0681548110612f2a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612fb85780601f10612f8d57610100808354040283529160200191612fb8565b820191906000526020600020905b815481529060010190602001808311612f9b57829003601f168201915b505050505081600260038110612fca57fe5b6020908102919091019190915281516000858152600e83526040808220858501518287015192519395612b2395949293919201614ade565b61300a6145b3565b601c80546000858152600e60205260409020600801548161302757fe5b068154811061303257fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156130c05780601f10613095576101008083540402835291602001916130c0565b820191906000526020600020905b8154815290600101906020018083116130a357829003601f168201915b5050505050816000600481106130d257fe5b6020020181905250601d8080549050600e600086815260200190815260200160002060080154816130ff57fe5b068154811061310a57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156131985780601f1061316d57610100808354040283529160200191613198565b820191906000526020600020905b81548152906001019060200180831161317b57829003601f168201915b5050505050816001600481106131aa57fe5b6020020181905250601e8080549050600e600086815260200190815260200160002060080154816131d757fe5b06815481106131e257fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156132705780601f1061324557610100808354040283529160200191613270565b820191906000526020600020905b81548152906001019060200180831161325357829003601f168201915b50505050508160026004811061328257fe5b6020020181905250601b8080549050600e600086815260200190815260200160002060080154816132af57fe5b06815481106132ba57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156133485780601f1061331d57610100808354040283529160200191613348565b820191906000526020600020905b81548152906001019060200180831161332b57829003601f168201915b50505050508160036004811061335a57fe5b60209081029190910191909152606082015182516000868152600e84526040808220868601518288015192519396612b239695949293919201614b4f565b60606133a2610cd5565b82106133c05760405162461bcd60e51b8152600401610c1390615271565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156134465780601f1061341b57610100808354040283529160200191613446565b820191906000526020600020905b81548152906001019060200180831161342957829003601f168201915b50505050509050919050565b61345a6138ab565b6001600160a01b031661346b61208d565b6001600160a01b0316146134915760405162461bcd60e51b8152600401610c1390615579565b600061349b610cd5565b90506000821180156134af5750600f548211155b6134cb5760405162461bcd60e51b8152600401610c1390615048565b60005b828110156134ea576134e284828401613d17565b6001016134ce565b50600f546134f89083613c6b565b600f55505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600d54610100900460ff1681565b6135446138ab565b6001600160a01b0316613555611cff565b6001600160a01b03161461357b5760405162461bcd60e51b8152600401610c1390615579565b6000818152600e6020526040902060030154613598906001613b46565b6000918252600e602052604090912060030155565b6135b56138ab565b6001600160a01b03166135c661208d565b6001600160a01b0316146135ec5760405162461bcd60e51b8152600401610c1390615579565b6001600160a01b0381166136125760405162461bcd60e51b8152600401610c1390614f94565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6101d181565b61367c6138ab565b6001600160a01b031661368d611cff565b6001600160a01b0316146136b35760405162461bcd60e51b8152600401610c1390615579565b6000918252600e602052604090912060090155565b336136d283611d0e565b6001600160a01b0316146136f85760405162461bcd60e51b8152600401610c1390615804565b6000828152600e602052604090819020905160029161371691614a0c565b602060405180830381855afa158015613733573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906137569190614853565b60028260405161376691906149f0565b602060405180830381855afa158015613783573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906137a69190614853565b14156137c45760405162461bcd60e51b8152600401610c13906156c8565b6000828152600e6020908152604090912082516137e3928401906144cd565b507fc19a2e831d67ca309cf36e8e5d6ac83e8c34f277a669bfcc437619794d25157a338383604051610f9793929190614cd7565b61381f6138ab565b6001600160a01b031661383061208d565b6001600160a01b0316146138565760405162461bcd60e51b8152600401610c1390615579565b600d805460ff191660011790556040517f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b09061389490600c90614dc9565b60405180910390a1565b600061100f600283613e0c565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906138e482611d0e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061100f82613e18565b80516115009060099060208401906144cd565b60008261394a5750600061100f565b8282028284828161395757fe5b041461100c5760405162461bcd60e51b8152600401610c13906154b5565b60008082116139965760405162461bcd60e51b8152600401610c139061523a565b81838161399f57fe5b049392505050565b60006139b28261389e565b6139ce5760405162461bcd60e51b8152600401610c13906151ac565b60006139d983611d0e565b9050806001600160a01b0316846001600160a01b03161480613a145750836001600160a01b0316613a0984610bec565b6001600160a01b0316145b80613a245750613a248185613500565b949350505050565b826001600160a01b0316613a3f82611d0e565b6001600160a01b031614613a655760405162461bcd60e51b8152600401610c13906155ae565b6001600160a01b038216613a8b5760405162461bcd60e51b8152600401610c139061507d565b613a96838383610ccb565b613aa16000826138af565b6001600160a01b0383166000908152600160205260409020613ac39082613e1c565b506001600160a01b0382166000908152600160205260409020613ae69082613e28565b50613af360028284613e34565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061100c8383613e4a565b60008282018381101561100c5760405162461bcd60e51b8152600401610c1390615011565b6000613b7682611d0e565b9050613b8481600084610ccb565b613b8f6000836138af565b6000828152600860205260409020546002600019610100600184161502019091160415613bcd576000828152600860205260408120613bcd916145cd565b6001600160a01b0381166000908152600160205260409020613bef9083613e1c565b50613bfb600283613e8f565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080613c478686613e9b565b9097909650945050505050565b6000613c61848484613ef7565b90505b9392505050565b600082821115613c8d5760405162461bcd60e51b8152600401610c139061512f565b50900390565b613c9e848484613a2c565b613caa84848484613f56565b6123985760405162461bcd60e51b8152600401610c1390614f42565b600080613cd3834361393b565b9050600081604051602001613ce89190614c26565b6040516020818303038152906040528051906020012060001c90506015548181613d0e57fe5b06949350505050565b611500828260405180602001604052806000815250614035565b606081613d5657506040805180820190915260018152600360fc1b6020820152610b51565b8160005b8115613d6e57600101600a82049150613d5a565b60008167ffffffffffffffff81118015613d8757600080fd5b506040519080825280601f01601f191660200182016040528015613db2576020820181803683370190505b50859350905060001982015b8315613e0357600a840660300160f81b82828060019003935081518110613de157fe5b60200101906001600160f81b031916908160001a905350600a84049350613dbe565b50949350505050565b600061100c8383614068565b5490565b600061100c8383614080565b600061100c8383614146565b6000613c6184846001600160a01b038516614190565b81546000908210613e6d5760405162461bcd60e51b8152600401610c1390614e53565b826000018281548110613e7c57fe5b9060005260206000200154905092915050565b600061100c8383614227565b815460009081908310613ec05760405162461bcd60e51b8152600401610c1390615407565b6000846000018481548110613ed157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281613f275760405162461bcd60e51b8152600401610c139190614d4d565b50846000016001820381548110613f3a57fe5b9060005260206000209060020201600101549150509392505050565b6000613f6a846001600160a01b03166142fb565b613f7657506001613a24565b6000613ffe630a85bd0160e11b613f8b6138ab565b888787604051602401613fa19493929190614c81565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001615972603291396001600160a01b0388169190614301565b90506000818060200190518101906140169190614887565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b61403f8383614310565b61404c6000848484613f56565b610ccb5760405162461bcd60e51b8152600401610c1390614f42565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561413c57835460001980830191908101906000908790839081106140b357fe5b90600052602060002001549050808760000184815481106140d057fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061410057fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061100f565b600091505061100f565b60006141528383614068565b6141885750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561100f565b50600061100f565b6000828152600184016020526040812054806141f5575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613c64565b8285600001600183038154811061420857fe5b9060005260206000209060020201600101819055506000915050613c64565b6000818152600183016020526040812054801561413c578354600019808301919081019060009087908390811061425a57fe5b906000526020600020906002020190508087600001848154811061427a57fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806142b957fe5b600082815260208082206002600019909401938402018281556001908101839055929093558881528982019092526040822091909155945061100f9350505050565b3b151590565b6060613c6184846000856143d4565b6001600160a01b0382166143365760405162461bcd60e51b8152600401610c1390615449565b61433f8161389e565b1561435c5760405162461bcd60e51b8152600401610c1390614fda565b61436860008383610ccb565b6001600160a01b038216600090815260016020526040902061438a9082613e28565b5061439760028284613e34565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156143f65760405162461bcd60e51b8152600401610c1390615166565b6143ff856142fb565b61441b5760405162461bcd60e51b8152600401610c13906157cd565b600080866001600160a01b0316858760405161443791906149f0565b60006040518083038185875af1925050503d8060008114614474576040519150601f19603f3d011682016040523d82523d6000602084013e614479565b606091505b5091509150614489828286614494565b979650505050505050565b606083156144a3575081613c64565b8251156144b35782518084602001fd5b8160405162461bcd60e51b8152600401610c139190614d4d565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826145035760008555614549565b82601f1061451c57805160ff1916838001178555614549565b82800160010185558215614549579182015b8281111561454957825182559160200191906001019061452e565b5061455592915061460d565b5090565b60405180602001604052806001905b60608152602001906001900390816145685790505090565b6040805180820190915260608152600160208201614568565b604080516060808201909252908152600260208201614568565b604080516080810190915260608152600360208201614568565b50805460018160011615610100020316600290046000825580601f106145f35750610d2e565b601f016020900490600052602060002090810190610d2e91905b5b80821115614555576000815560010161460e565b600067ffffffffffffffff8084111561463757fe5b604051601f8501601f19168101602001828111828210171561465557fe5b60405284815291508183850186101561466d57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b0381168114610b5157600080fd5b600082601f8301126146ad578081fd5b61100c83833560208501614622565b6000602082840312156146cd578081fd5b61100c82614686565b600080604083850312156146e8578081fd5b6146f183614686565b91506146ff60208401614686565b90509250929050565b60008060006060848603121561471c578081fd5b61472584614686565b925061473360208501614686565b9150604084013590509250925092565b60008060008060808587031215614758578081fd5b61476185614686565b935061476f60208601614686565b925060408501359150606085013567ffffffffffffffff811115614791578182fd5b8501601f810187136147a1578182fd5b6147b087823560208401614622565b91505092959194509250565b600080604083850312156147ce578182fd5b6147d783614686565b915060208301356147e78161594d565b809150509250929050565b60008060408385031215614804578182fd5b61480d83614686565b946020939093013593505050565b60006020828403121561482c578081fd5b813561100c8161594d565b600060208284031215614848578081fd5b815161100c8161594d565b600060208284031215614864578081fd5b5051919050565b60006020828403121561487c578081fd5b813561100c8161595b565b600060208284031215614898578081fd5b815161100c8161595b565b6000602082840312156148b4578081fd5b813567ffffffffffffffff8111156148ca578182fd5b613a248482850161469d565b6000602082840312156148e7578081fd5b5035919050565b60008060408385031215614900578182fd5b82359150602083013567ffffffffffffffff81111561491d578182fd5b6149298582860161469d565b9150509250929050565b60008060408385031215614945578182fd5b50508035926020909101359150565b6000815180845261496c816020860160208601615921565b601f01601f19169290920160200192915050565b6000815460018082166000811461499e57600181146149b5576149e7565b60ff198316865260028304607f16860193506149e7565b600283048560005260208060002060005b838110156149df5781548a8201529085019082016149c6565b505050860193505b50505092915050565b60008251614a02818460208701615921565b9190910192915050565b600061100c8284614980565b60008351614a2a818460208801615921565b835190830190614a3e818360208801615921565b64173539b7b760d91b9101908152600501949350505050565b60008351614a69818460208801615921565b600160fd1b908301908152614a816001820185614980565b95945050505050565b60008451614a9c818460208901615921565b600160fd1b908301908152614ab46001820186614980565b905061016160f51b81528351614ad1816002840160208801615921565b0160020195945050505050565b60008551614af0818460208a01615921565b600160fd1b90830181815290614b096001830188614980565b915061016160f51b82528551614b26816002850160208a01615921565b60029201918201528351614b41816003840160208801615921565b016003019695505050505050565b60008651614b61818460208b01615921565b602d60f81b9083019081528651614b7f816001840160208b01615921565b808201915050600160fd1b806001830152614b9d6002830188614980565b915061016160f51b82528551614bba816002850160208a01615921565b60029201918201528351614bd5816003840160208801615921565b01600301979650505050505050565b7f436865636b2074686520746f6b656e20616c6c6f77616e63653a0000000000008152601a8101929092526201016160ed1b603a830152603d820152605d0190565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614cb490830184614954565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038516825283602083015260606040830152614a816060830184614954565b6020808252825182820181905260009190848201906040850190845b81811015614d3657835183529284019291840191600101614d1a565b50909695505050505050565b901515815260200190565b60006020825261100c6020830184614954565b60006101808252614d7561018083018f614954565b602083019d909d5250604081019a909a5260608a0198909852608089019690965260a088019490945260c087019290925260e086015261010085015261012084015261014083015261016090910152919050565b60006020808301818452828554600180821660008114614df05760018114614e0e57614e46565b60028304607f16855260ff1983166040890152606088019350614e46565b60028304808652614e1e8a615915565b885b82811015614e3c5781548b820160400152908401908801614e20565b8a01604001955050505b5091979650505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526021908201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656040820152603760f91b606082015260800190565b6020808252601b908201527f43686f6f7365206120746f6b656e2077697468696e2072616e67650000000000604082015260600190565b6020808252818101527f43616e206f6e6c79206d696e74203520746f6b656e7320617420612074696d65604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526022908201527f4c6576656c206d757374206265206174206c65617374203320746f20636c61696040820152616d2160f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601b908201527f43484f4f5345204120746f6b656e2057495448494e2052414e47450000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526019908201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f6620746f6b656e7360b01b606082015260800190565b6020808252601d908201527f596f7520646f6e2774206861766520656e6f75676820746f6b656e732e000000604082015260600190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526018908201527f746f6b656e20616c7265616479206d6178206c6576656c210000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f43616e277420626520706574206265796f6e6420313021000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601d908201527f546f6b656e206861736e2774206265656e206d696e7465642079657421000000604082015260600190565b6020808252602b908201527f4e6f7420656e6f756768206e617469766520746f6b656e7320696e2077616c6c60408201526a32ba103a379036b4b73a1760a91b606082015260800190565b60208082526023908201527f4e6577206e616d652069732073616d65206173207468652063757272656e74206040820152626f6e6560e81b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b602080825260169082015275131a58d95b9cd948185b1c9958591e481b1bd8dad95960521b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526028908201527f4865792c20796f75722077616c6c657420646f65736e2774206f776e207468696040820152677320746f6b656e2160c01b606082015260800190565b60208082526028908201527f52656163686564207265736572766564207465616d206d696e74732e204f776e60408201526732b91037b7363c9760c11b606082015260800190565b6020808252601c908201527f596f7520646f6e2774206861766520656e6f7567682065726332302e00000000604082015260600190565b6020808252600d908201526c4e656564206d6f72652058502160981b604082015260600190565b948552602085019390935260408401919091526060830152608082015260a00190565b60009081526020902090565b60005b8381101561593c578181015183820152602001615924565b838111156123985750506000910152565b8015158114610d2e57600080fd5b6001600160e01b031981168114610d2e57600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220a57787aca53d89b372c2e0c3de24b77b44cad34269dc98f7db00266c11a87ba164736f6c63430007060033
Deployed ByteCode Sourcemap
69735:16813:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10235:150;;;;;;;;;;-1:-1:-1;10235:150:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51519:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54323:221::-;;;;;;;;;;-1:-1:-1;54323:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53853:404::-;;;;;;;;;;-1:-1:-1;53853:404:0;;;;;:::i;:::-;;:::i;:::-;;70168:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53331:211::-;;;;;;;;;;;;;:::i;72552:106::-;;;;;;;;;;-1:-1:-1;72552:106:0;;;;;:::i;:::-;;:::i;70528:47::-;;;;;;;;;;-1:-1:-1;70528:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;73685:534::-;;;;;;;;;;-1:-1:-1;73685:534:0;;;;;:::i;:::-;;:::i;55213:305::-;;;;;;;;;;-1:-1:-1;55213:305:0;;;;;:::i;:::-;;:::i;71191:71::-;;;;;;;;;;;;;:::i;53093:162::-;;;;;;;;;;-1:-1:-1;53093:162:0;;;;;:::i;:::-;;:::i;76435:902::-;;;;;;;;;;-1:-1:-1;76435:902:0;;;;;:::i;:::-;;:::i;72418:126::-;;;;;;;;;;-1:-1:-1;72418:126:0;;;;;:::i;:::-;;:::i;71875:131::-;;;;;;;;;;;;;:::i;73258:::-;;;;;;;;;;-1:-1:-1;73258:131:0;;;;;:::i;:::-;;:::i;75391:1039::-;;;;;;;;;;-1:-1:-1;75391:1039:0;;;;;:::i;:::-;;:::i;55589:151::-;;;;;;;;;;-1:-1:-1;55589:151:0;;;;;:::i;:::-;;:::i;74498:278::-;;;;;;;;;;-1:-1:-1;74498:278:0;;;;;:::i;:::-;;:::i;73127:123::-;;;;;;;;;;-1:-1:-1;73127:123:0;;;;;:::i;:::-;;:::i;71404:31::-;;;;;;;;;;;;;:::i;72893:117::-;;;;;;;;;;-1:-1:-1;72893:117:0;;;;;:::i;:::-;;:::i;53619:172::-;;;;;;;;;;-1:-1:-1;53619:172:0;;;;;:::i;:::-;;:::i;71477:22::-;;;;;;;;;;;;;:::i;78730:180::-;;;;;;;;;;-1:-1:-1;78730:180:0;;;;;:::i;:::-;;:::i;72666:95::-;;;;;;;;;;;;;:::i;73018:101::-;;;;;;;;;;;;;:::i;51275:177::-;;;;;;;;;;-1:-1:-1;51275:177:0;;;;;:::i;:::-;;:::i;69851:29::-;;;;;;;;;;;;;:::i;52912:97::-;;;;;;;;;;;;;:::i;50992:221::-;;;;;;;;;;-1:-1:-1;50992:221:0;;;;;:::i;:::-;;:::i;66248:148::-;;;;;;;;;;;;;:::i;72769:116::-;;;;;;;;;;-1:-1:-1;72769:116:0;;;;;:::i;:::-;;:::i;71039:72::-;;;;;;;;;;;;;:::i;74246:247::-;;;;;;;;;;-1:-1:-1;74246:247:0;;;;;:::i;:::-;;:::i;70093:55::-;;;;;;;;;;;;;:::i;77430:109::-;;;;;;;;;;-1:-1:-1;77430:109:0;;;;;:::i;:::-;;:::i;77741:540::-;;;;;;;;;;-1:-1:-1;77741:540:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65597:87::-;;;;;;;;;;;;;:::i;77612:121::-;;;;;;;;;;-1:-1:-1;77612:121:0;;;;;:::i;:::-;;:::i;51688:104::-;;;;;;;;;;;;;:::i;77342:83::-;;;;;;;;;;-1:-1:-1;77342:83:0;;;;;:::i;:::-;;:::i;69944:31::-;;;;;;;;;;;;;:::i;71442:::-;;;;;;;;;;;;;:::i;54616:295::-;;;;;;;;;;-1:-1:-1;54616:295:0;;;;;:::i;:::-;;:::i;74781:252::-;;;;;;;;;;-1:-1:-1;74781:252:0;;;;;:::i;:::-;;:::i;75038:348::-;;;;;;;;;;-1:-1:-1;75038:348:0;;;;;:::i;:::-;;:::i;71115:72::-;;;;;;;;;;;;;:::i;55811:285::-;;;;;;;;;;-1:-1:-1;55811:285:0;;;;;:::i;:::-;;:::i;80963:642::-;;;;;;;;;;-1:-1:-1;80963:642:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;78920:1796::-;;;;;;:::i;:::-;;:::i;51863:810::-;;;;;;;;;;-1:-1:-1;51863:810:0;;;;;:::i;:::-;;:::i;70636:28::-;;;;;;;;;;;;;:::i;82016:1982::-;;;;;;;;;;-1:-1:-1;82016:1982:0;;;;;:::i;:::-;;:::i;78328:175::-;;;;;;;;;;-1:-1:-1;78328:175:0;;;;;:::i;:::-;;:::i;72014:394::-;;;;;;;;;;-1:-1:-1;72014:394:0;;;;;:::i;:::-;;:::i;54982:164::-;;;;;;;;;;-1:-1:-1;54982:164:0;;;;;:::i;:::-;;:::i;70267:32::-;;;;;;;;;;;;;:::i;73394:155::-;;;;;;;;;;-1:-1:-1;73394:155:0;;;;;:::i;:::-;;:::i;66551:244::-;;;;;;;;;;-1:-1:-1;66551:244:0;;;;;:::i;:::-;;:::i;70218:40::-;;;;;;;;;;;;;:::i;73557:123::-;;;;;;;;;;-1:-1:-1;73557:123:0;;;;;:::i;:::-;;:::i;81613:395::-;;;;;;;;;;-1:-1:-1;81613:395:0;;;;;:::i;:::-;;:::i;78564:131::-;;;;;;;;;;;;;:::i;10235:150::-;-1:-1:-1;;;;;;10344:33:0;;10320:4;10344:33;;;;;;;;;;;;;10235:150;;;;:::o;51519:100::-;51606:5;51599:12;;;;;;;;-1:-1:-1;;51599:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51573:13;;51599:12;;51606:5;;51599:12;;51606:5;51599:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51519:100;:::o;54323:221::-;54399:7;54427:16;54435:7;54427;:16::i;:::-;54419:73;;;;-1:-1:-1;;;54419:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;54512:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;54512:24:0;;54323:221::o;53853:404::-;53934:13;53950:23;53965:7;53950:14;:23::i;:::-;53934:39;;53998:5;-1:-1:-1;;;;;53992:11:0;:2;-1:-1:-1;;;;;53992:11:0;;;53984:57;;;;-1:-1:-1;;;53984:57:0;;;;;;;:::i;:::-;54078:5;-1:-1:-1;;;;;54062:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;54062:21:0;;:69;;;;54087:44;54111:5;54118:12;:10;:12::i;54087:44::-;54054:161;;;;-1:-1:-1;;;54054:161:0;;;;;;;:::i;:::-;54228:21;54237:2;54241:7;54228:8;:21::i;:::-;53853:404;;;:::o;70168:41::-;70208:1;70168:41;:::o;53331:211::-;53392:7;53513:21;:12;:19;:21::i;:::-;53506:28;;53331:211;:::o;72552:106::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;72630:20:::1;72642:7;72630:11;:20::i;:::-;72552:106:::0;:::o;70528:47::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70528:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73685:534::-;73761:10;73741:16;73749:7;73741;:16::i;:::-;-1:-1:-1;;;;;73741:30:0;;73733:83;;;;-1:-1:-1;;;73733:83:0;;;;;;;:::i;:::-;73832:18;;;;:9;:18;;;;;:24;;;73860:1;-1:-1:-1;73832:29:0;73824:76;;;;-1:-1:-1;;;73824:76:0;;;;;;;:::i;:::-;74068:15;;73908:11;74037:18;;;:9;:18;;;;;:24;;;;74008:23;;;;73953:34;;;;;73908:11;;73922:162;;74068:15;;73922:141;;73938:124;;74037:24;;73938:94;;;;73989:12;73939:13;:63::i;:::-;73938:69;;:94::i;:124::-;73922:11;;;:15;:141::i;:::-;:145;;:162::i;:::-;74089:18;;;;:9;:18;;;;;;;74126:12;74089:34;;;;:49;74143:5;;:30;;-1:-1:-1;;;74143:30:0;;73908:176;;-1:-1:-1;;;;;;74143:5:0;;:10;;:30;;74154:10;;73908:176;;74143:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74183:31;74195:10;74207:6;74183:31;;;;;;;:::i;:::-;;;;;;;;73685:534;;:::o;55213:305::-;55374:41;55393:12;:10;:12::i;:::-;55407:7;55374:18;:41::i;:::-;55366:103;;;;-1:-1:-1;;;55366:103:0;;;;;;;:::i;:::-;55482:28;55492:4;55498:2;55502:7;55482:9;:28::i;71191:71::-;;;-1:-1:-1;;;;;71191:71:0;;:::o;53093:162::-;-1:-1:-1;;;;;53217:20:0;;53190:7;53217:20;;;:13;:20;;;;;:30;;53241:5;53217:23;:30::i;:::-;53210:37;;53093:162;;;;;:::o;76435:902::-;76490:18;;;;:9;:18;;;;;:23;;;76517:2;-1:-1:-1;76490:29:0;76482:65;;;;-1:-1:-1;;;76482:65:0;;;;;;;:::i;:::-;76558:18;;;;:9;:18;;;;;:23;;;76585:1;-1:-1:-1;76555:678:0;;76683:18;;;;:9;:18;;;;;:23;;;76647:6;;:60;;76683:23;76647:31;;76658:19;76647:10;:31::i;:60::-;76607:5;;:36;;-1:-1:-1;;;76607:36:0;;-1:-1:-1;;;;;76607:5:0;;;;:15;;:36;;76631:10;;76607:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:100;;76599:141;;;;-1:-1:-1;;;76599:141:0;;;;;;;:::i;:::-;76749:13;76801:18;;;:9;:18;;;;;:23;;;76765:6;;:60;;76801:23;76765:31;;76776:19;76765:10;:31::i;:60::-;76854:5;;:42;;-1:-1:-1;;;76854:42:0;;76749:76;;-1:-1:-1;76834:17:0;;-1:-1:-1;;;;;76854:5:0;;;;:15;;:42;;76870:10;;76890:4;;76854:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76995:5;;:42;;-1:-1:-1;;;76995:42:0;;76834:62;;-1:-1:-1;76919:21:0;;;;;-1:-1:-1;;;;;76995:5:0;;;;:15;;:42;;77011:10;;77031:4;;76995:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77044:8;76949:104;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76911:144;;;;;-1:-1:-1;;;76911:144:0;;;;;;;;:::i;:::-;-1:-1:-1;77064:5:0;;:55;;-1:-1:-1;;;77064:55:0;;-1:-1:-1;;;;;77064:5:0;;;;:18;;:55;;77083:10;;77103:4;;77110:8;;77064:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77146:5:0;;:30;;-1:-1:-1;;;77146:30:0;;77128:15;;-1:-1:-1;;;;;77146:5:0;;:15;;:30;;77170:4;;77146:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77185:5;;77200:11;;77185:39;;-1:-1:-1;;;77185:39:0;;77128:48;;-1:-1:-1;;;;;;77185:5:0;;;;:14;;:39;;77200:11;;77128:48;;77185:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76555:678;;;;77263:18;;;;:9;:18;;;;;:23;;;:30;;77291:1;77263:27;:30::i;:::-;77237:18;;;;:9;:18;;;;;;;:23;;:56;;;;77303:29;;;;;77312:10;;77247:7;;77303:29;:::i;:::-;;;;;;;;76435:902;:::o;72418:126::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;72509:27;;::::1;::::0;:10:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;72418:126:::0;:::o;71875:131::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;71970:28:::1;::::0;71938:21:::1;::::0;71970:10:::1;::::0;:28;::::1;;;::::0;71938:21;;71923:12:::1;71970:28:::0;71923:12;71970:28;71938:21;71970:10;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;73258:131:::0;71742:12;:10;:12::i;:::-;-1:-1:-1;;;;;71724:30:0;:14;:12;:14::i;:::-;-1:-1:-1;;;;;71724:30:0;;71716:75;;;;-1:-1:-1;;;71716:75:0;;;;;;;:::i;:::-;73345:21:::1;::::0;;;:9:::1;:21;::::0;;;;;:26:::1;;:36:::0;73258:131::o;75391:1039::-;75467:10;75447:16;75455:7;75447;:16::i;:::-;-1:-1:-1;;;;;75447:30:0;;75439:83;;;;-1:-1:-1;;;75439:83:0;;;;;;;:::i;:::-;75535:18;;;;:9;:18;;;;;:24;;;75563:1;-1:-1:-1;75535:29:0;75527:66;;;;-1:-1:-1;;;75527:66:0;;;;;;;:::i;:::-;75683:18;;;;:9;:18;;;;;:24;;;75646:6;;:62;;75683:24;75646:32;;75657:20;75646:10;:32::i;:62::-;75606:5;;:36;;-1:-1:-1;;;75606:36:0;;-1:-1:-1;;;;;75606:5:0;;;;:15;;:36;;75630:10;;75606:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:102;;75598:144;;;;-1:-1:-1;;;75598:144:0;;;;;;;:::i;:::-;75747:17;75779:18;;;:9;:18;;;;;:24;;;75767:37;;:11;:37::i;:::-;75823:18;;;;:9;:18;;;;;:21;;;75747:57;;-1:-1:-1;75823:37:0;-1:-1:-1;75823:37:0;75815:63;;;;-1:-1:-1;;;75815:63:0;;;;;;;:::i;:::-;75883:15;75928:18;;;:9;:18;;;;;:24;;;75901:6;;:52;;75928:24;75901:22;;75912:10;75901;:22::i;:52::-;75978:5;;:42;;-1:-1:-1;;;75978:42:0;;75883:70;;-1:-1:-1;75958:17:0;;-1:-1:-1;;;;;75978:5:0;;;;:15;;:42;;75994:10;;76014:4;;75978:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75958:62;;76052:10;76039:9;:23;;76031:61;;;;-1:-1:-1;;;76031:61:0;;;;;;;:::i;:::-;76097:5;;:57;;-1:-1:-1;;;76097:57:0;;-1:-1:-1;;;;;76097:5:0;;;;:18;;:57;;76116:10;;76136:4;;76143:10;;76097:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;76159:18:0;;;;:9;:18;;;;;:21;;;:37;;;;;;;-1:-1:-1;76228:24:0;;;;:31;;:28;:31::i;:::-;76201:18;;;;:9;:18;;;;;;:24;;:58;;;;76308:5;;:30;;-1:-1:-1;;;76308:30:0;;76201:18;;-1:-1:-1;;;;;76308:5:0;;:15;;:30;;76332:4;;76308:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76343:5;;76358:11;;76343:39;;-1:-1:-1;;;76343:39:0;;76290:48;;-1:-1:-1;;;;;;76343:5:0;;;;:14;;:39;;76358:11;;76290:48;;76343:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76392:33;76405:10;76417:7;76392:33;;;;;;;:::i;:::-;;;;;;;;75391:1039;;;;;:::o;55589:151::-;55693:39;55710:4;55716:2;55720:7;55693:39;;;;;;;;;;;;:16;:39::i;74498:278::-;74566:10;74546:16;74554:7;74546;:16::i;:::-;-1:-1:-1;;;;;74546:30:0;;74538:83;;;;-1:-1:-1;;;74538:83:0;;;;;;;:::i;:::-;74640:11;;74626;;74640:36;;74656:19;74640:15;:36::i;:::-;74681:5;;:30;;-1:-1:-1;;;74681:30:0;;74626:50;;-1:-1:-1;;;;;;74681:5:0;;:10;;:30;;74692:10;;74626:50;;74681:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74721:31;74733:10;74745:6;74721:31;;;;;;;:::i;:::-;;;;;;;;74757:14;74763:7;74757:5;:14::i;73127:123::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;73211:13:::1;:31:::0;;-1:-1:-1;;;;;;73211:31:0::1;-1:-1:-1::0;;;;;73211:31:0;;;::::1;::::0;;;::::1;::::0;;73127:123::o;71404:31::-;;;;:::o;72893:117::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;72974:12:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;72974:28:0::1;-1:-1:-1::0;;;;72974:28:0;;::::1;::::0;;;::::1;::::0;;72893:117::o;53619:172::-;53694:7;;53736:22;:12;53752:5;53736:15;:22::i;:::-;-1:-1:-1;53714:44:0;53619:172;-1:-1:-1;;;53619:172:0:o;71477:22::-;;;;:::o;78730:180::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;78819:13:::1;::::0;::::1;;:22;78811:57;;;;-1:-1:-1::0;;;78811:57:0::1;;;;;;;:::i;:::-;78879:23:::0;;::::1;::::0;:12:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;72666:95::-:0;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;72741:12:::1;::::0;;-1:-1:-1;;72725:28:0;::::1;72741:12;::::0;;;::::1;;;72740:13;72725:28:::0;;::::1;;::::0;;72666:95::o;73018:101::-;73098:13;;-1:-1:-1;;;;;73098:13:0;73018:101;:::o;51275:177::-;51347:7;51374:70;51391:7;51374:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;69851:29::-;;;;;;;;;;;;;;;-1:-1:-1;;69851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52912:97::-;52993:8;52986:15;;;;;;;;-1:-1:-1;;52986:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52960:13;;52986:15;;52993:8;;52986:15;;52993:8;52986:15;;;;;;;;;;;;;;;;;;;;;;;;50992:221;51064:7;-1:-1:-1;;;;;51092:19:0;;51084:74;;;;-1:-1:-1;;;51084:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51176:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;66248:148::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;66339:6:::1;::::0;66318:40:::1;::::0;66355:1:::1;::::0;-1:-1:-1;;;;;66339:6:0::1;::::0;66318:40:::1;::::0;66355:1;;66318:40:::1;66369:6;:19:::0;;-1:-1:-1;;;;;;66369:19:0::1;::::0;;66248:148::o;72769:116::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;72851:11:::1;:26:::0;72769:116::o;71039:72::-;;;-1:-1:-1;;;;;71039:72:0;;:::o;74246:247::-;74472:15;;74305:4;74441:18;;;:9;:18;;;;;:24;;;;74412:23;;;;74357:34;;;;;74305:4;;74326:162;;74472:15;;74326:141;;74342:124;;74441:24;;74342:94;;;;74393:12;74343:13;:63::i;70093:55::-;70130:18;70093:55;:::o;77430:109::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;77506:11:::1;:28:::0;77430:109::o;77741:540::-;77802:16;77832:18;77853:17;77863:6;77853:9;:17::i;:::-;77832:38;-1:-1:-1;77885:15:0;77881:393;;-1:-1:-1;;77962:16:0;;;77976:1;77962:16;;;;;;;;77955:23;;77881:393;78011:23;78051:10;78037:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78037:25:0;;78011:51;;78077:13;78105:130;78129:10;78121:5;:18;78105:130;;;78185:34;78205:6;78213:5;78185:19;:34::i;:::-;78169:6;78176:5;78169:13;;;;;;;;;;;;;;;;;:50;78141:7;;78105:130;;;-1:-1:-1;78256:6:0;-1:-1:-1;78249:13:0;;-1:-1:-1;78249:13:0;77881:393;77741:540;;;;:::o;65597:87::-;65670:6;;-1:-1:-1;;;;;65670:6:0;65597:87;:::o;77612:121::-;77684:7;77711:14;:3;77719:5;77711:7;:14::i;51688:104::-;51777:7;51770:14;;;;;;;;-1:-1:-1;;51770:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51744:13;;51770:14;;51777:7;;51770:14;;51777:7;51770:14;;;;;;;;;;;;;;;;;;;;;;;;77342:83;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;77405:6:::1;:15:::0;77342:83::o;69944:31::-;;;;;;;;;;;;;;;-1:-1:-1;;69944:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71442;;;;:::o;54616:295::-;54731:12;:10;:12::i;:::-;-1:-1:-1;;;;;54719:24:0;:8;-1:-1:-1;;;;;54719:24:0;;;54711:62;;;;-1:-1:-1;;;54711:62:0;;;;;;;:::i;:::-;54831:8;54786:18;:32;54805:12;:10;:12::i;:::-;-1:-1:-1;;;;;54786:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;54786:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;54786:53:0;;;;;;;;;;;54870:12;:10;:12::i;:::-;-1:-1:-1;;;;;54855:48:0;;54894:8;54855:48;;;;;;:::i;:::-;;;;;;;;54616:295;;:::o;74781:252::-;74910:7;74895:22;;74942:1;74928:98;74949:12;74945:1;:16;74928:98;;;75007:7;75003:11;;74983:31;;;;;74963:3;;74928:98;;75038:348;75102:42;75121:10;75133;75102:18;:42::i;:::-;75094:51;;;;;;75182:21;;;;:9;:21;;;;;:25;;;75164:15;:43;75156:52;;;;;;75247:33;75268:10;71563:6;75276:1;75268:7;:10::i;:::-;75247:15;;:19;:33::i;:::-;75219:21;;;;:9;:21;;;;;;;:25;;;:61;;;;75291:24;;;;:38;;71530:6;75291:38;;;75339:39;;;;;75355:10;;75229;;75339:39;:::i;71115:72::-;;;-1:-1:-1;;;;;71115:72:0;;:::o;55811:285::-;55943:41;55962:12;:10;:12::i;:::-;55976:7;55943:18;:41::i;:::-;55935:103;;;;-1:-1:-1;;;55935:103:0;;;;;;;:::i;:::-;56049:39;56063:4;56069:2;56073:7;56082:5;56049:13;:39::i;:::-;55811:285;;;;:::o;80963:642::-;81030:4;;;;;81171:13;:11;:13::i;:::-;81158:9;:26;;81150:68;;;;-1:-1:-1;;;81150:68:0;;;;;;;:::i;:::-;81301:20;;;;:9;:20;;;;;:26;;;;81270:25;;;;;81237:99;;81269:66;;81333:1;;81269:59;;81270:25;81269:31;:59::i;:66::-;81237:20;;;;:9;:20;;;;;:27;;;;:31;:99::i;:::-;81403:20;;;;:9;:20;;;;;:26;;;;81373:25;;;;;81338:101;;81373:64;;81435:1;;81373:57;;:25;:29;:57::i;:64::-;81338:20;;;;:9;:20;;;;;:29;;;;:33;:101::i;:::-;81505:20;;;;:9;:20;;;;;:26;;;;81475:25;;;;;81441:100;;81475:64;;81537:1;;81475:57;;:25;:29;:57::i;:64::-;81441:20;;;;:9;:20;;;;;:28;;;;:32;:100::i;:::-;81543:20;;;;:9;:20;;;;;;:26;;;;81571:25;;;;;81229:368;;;;;-1:-1:-1;81543:26:0;-1:-1:-1;81571:25:0;;-1:-1:-1;80963:642:0;-1:-1:-1;;80963:642:0:o;78920:1796::-;78994:12;;;;;;;78986:58;;;;-1:-1:-1;;;78986:58:0;;;;;;;:::i;:::-;79080:1;79063:14;:18;:56;;;;;70208:1;79085:14;:34;;79063:56;79055:101;;;;-1:-1:-1;;;79055:101:0;;;;;;;:::i;:::-;70255:3;79175:33;79193:14;79175:13;:11;:13::i;:::-;:17;;:33::i;:::-;:47;;79167:102;;;;-1:-1:-1;;;79167:102:0;;;;;;;:::i;:::-;79301:30;70130:18;79316:14;79301;:30::i;:::-;79288:9;:43;;79280:87;;;;-1:-1:-1;;;79280:87:0;;;;;;;:::i;:::-;79382:12;;-1:-1:-1;;;79382:12:0;;;;79378:142;;;79449:11;;79419:5;;:27;;-1:-1:-1;;;79419:27:0;;-1:-1:-1;;;;;79419:5:0;;;;:15;;:27;;79435:10;;79419:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;79411:97;;;;-1:-1:-1;;;79411:97:0;;;;;;;:::i;:::-;79563:12;;79546:13;:11;:13::i;:::-;70255:3;79533:26;:42;79530:150;;79611:12;:10;:12::i;:::-;-1:-1:-1;;;;;79600:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;79600:23:0;;79592:76;;;;-1:-1:-1;;;79592:76:0;;;;;;;:::i;:::-;79696:6;79692:1015;79712:14;79708:1;:18;79692:1015;;;79748:14;79765:13;:11;:13::i;:::-;79781:1;79765:17;79748:34;;70255:3;79801:13;:11;:13::i;:::-;:26;79797:899;;;79848:20;;;;:9;:20;;;;;79877:1;79848:26;;;:30;79897:25;;;:29;;;79945:31;;;:35;;;;80026:15;79999:24;;;:42;80099:12;80060:36;;;;:51;80160:34;80175:18;79858:9;80189:3;80175:13;:18::i;:::-;80160:14;:34::i;:::-;80130:20;;;;:9;:20;;;;;:27;;:64;80245:33;80260:17;80140:9;80274:2;80260:13;:17::i;80245:33::-;80213:20;;;;:9;:20;;;;;:29;;:65;80328:34;80343:18;80223:9;80357:3;80343:13;:18::i;80328:34::-;80297:20;;;;:9;:20;;;;;:28;;:65;80410:33;80425:17;80307:9;80439:2;80425:13;:17::i;80410:33::-;80381:20;;;;:9;:20;;;;;:26;;:62;80490:33;80505:17;80391:9;80519:2;80505:13;:17::i;80490:33::-;80462:20;;;;:9;:20;;;;;:25;;:61;80560:15;;:22;;80580:1;80560:19;:22::i;:::-;80542:15;:40;80601:32;80611:10;80623:9;80601;:32::i;:::-;80657:23;80670:9;80657:23;;;;;;:::i;:::-;;;;;;;;79797:899;-1:-1:-1;79728:3:0;;79692:1015;;51863:810;51936:13;51970:16;51978:7;51970;:16::i;:::-;51962:76;;;;-1:-1:-1;;;51962:76:0;;;;;;;:::i;:::-;52051:23;52077:19;;;:10;:19;;;;;;;;52051:45;;;;;;;;;;;-1:-1:-1;;52051:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;52077:19;;52051:45;;;52077:19;52051:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52107:18;52128:9;:7;:9::i;:::-;52107:30;;52219:4;52213:18;52235:1;52213:23;52209:72;;;-1:-1:-1;52260:9:0;-1:-1:-1;52253:16:0;;52209:72;52385:23;;:27;52381:117;;52460:4;52466:9;52443:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52429:57;;;;;;52381:117;52630:4;52636:18;:7;:16;:18::i;:::-;52613:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52599:66;;;;51863:810;;;:::o;70636:28::-;;;;:::o;82016:1982::-;82075:13;82121;:11;:13::i;:::-;82110:8;:24;82101:66;;;;-1:-1:-1;;;82101:66:0;;;;;;;:::i;:::-;82181:19;;;;:9;:19;;;;;:25;;;82210:1;-1:-1:-1;82178:92:0;;82234:19;;;;:9;:19;;;;;;;;;82227:31;;;;;;-1:-1:-1;;82227:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82234:19;;82227:31;;82234:19;82227:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82178:92;82283:19;;;;:9;:19;;;;;:25;;;82312:1;82283:30;82280:299;;;82329:21;;:::i;:::-;82375:13;82416:20;;82389:19;;;;:9;:19;;;;;:24;;;82416:20;82389:47;;;;;82375:62;;;;;;;;;;;;;;;;;;82365:72;;;;;;;-1:-1:-1;;82365:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82375:62;82365:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;82370:1;82365:7;;;;;;;;;;:72;82452:20;82499:4;82452:20;82499:7;;;;;;;;;82513:19;;;;:9;:19;;;;;;;82482:56;;;;;;:::i;:::-;;;;-1:-1:-1;;82482:56:0;;;;;;;;;;-1:-1:-1;82554:13:0;;-1:-1:-1;;82554:13:0;82280:299;82586:19;;;;:9;:19;;;;;:25;;;82615:1;-1:-1:-1;82583:392:0;;82632:21;;:::i;:::-;82678:13;82719:20;;82692:19;;;;:9;:19;;;;;:24;;;82719:20;82692:47;;;;;82678:62;;;;;;;;;;;;;;;;;;82668:72;;;;;;;-1:-1:-1;;82668:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82678:62;82668:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;82673:1;82668:7;;;;;;;;;;:72;;;;82765:8;82801;:15;;;;82774:9;:19;82784:8;82774:19;;;;;;;;;;;:24;;;:42;;;;;;82765:52;;;;;;;;;;;;;;;;;;82755:62;;;;;;;-1:-1:-1;;82755:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82765:52;82755:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;82760:1;82755:7;;;;;;;;;;;;;;;:62;;;;82879:7;;82832:20;82893:19;;;:9;:19;;;;;;82926:7;;;;82862:72;;82832:20;;82862:72;;82879:7;82893:19;;82926:7;82862:72;;:::i;82583:392::-;82982:19;;;;:9;:19;;;;;:25;;;83011:1;-1:-1:-1;82979:1012:0;;83028:21;;:::i;:::-;83074:13;83115:20;;83088:19;;;;:9;:19;;;;;:24;;;83115:20;83088:47;;;;;83074:62;;;;;;;;;;;;;;;;;;83064:72;;;;;;;-1:-1:-1;;83064:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83074:62;83064:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83069:1;83064:7;;;;;;;;;;:72;;;;83161:8;83197;:15;;;;83170:9;:19;83180:8;83170:19;;;;;;;;;;;:24;;;:42;;;;;;83161:52;;;;;;;;;;;;;;;;;;83151:62;;;;;;;-1:-1:-1;;83151:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83161:52;83151:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83156:1;83151:7;;;;;;;;;;:62;;;;83229:8;83265;:15;;;;83238:9;:19;83248:8;83238:19;;;;;;;;;;;:24;;;:42;;;;;;83229:52;;;;;;;;;;;;;;;;;;83219:62;;;;;;;-1:-1:-1;;83219:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83229:52;83219:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83224:1;83219:7;;;;;;;;;;;;;;;:62;;;;83343:7;;83296:20;83357:19;;;:9;:19;;;;;;83390:7;;;;83404;;;;83326:86;;83296:20;;83326:86;;83343:7;83357:19;;83390:7;;83326:86;;:::i;82979:1012::-;83477:21;;:::i;:::-;83523:13;83564:20;;83537:19;;;;:9;:19;;;;;:24;;;83564:20;83537:47;;;;;83523:62;;;;;;;;;;;;;;;;;;83513:72;;;;;;;-1:-1:-1;;83513:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83523:62;83513:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83518:1;83513:7;;;;;;;;;;:72;;;;83610:8;83646;:15;;;;83619:9;:19;83629:8;83619:19;;;;;;;;;;;:24;;;:42;;;;;;83610:52;;;;;;;;;;;;;;;;;;83600:62;;;;;;;-1:-1:-1;;83600:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83610:52;83600:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83605:1;83600:7;;;;;;;;;;:62;;;;83678:8;83714;:15;;;;83687:9;:19;83697:8;83687:19;;;;;;;;;;;:24;;;:42;;;;;;83678:52;;;;;;;;;;;;;;;;;;83668:62;;;;;;;-1:-1:-1;;83668:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83678:52;83668:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83673:1;83668:7;;;;;;;;;;:62;;;;83746:11;83785;:18;;;;83758:9;:19;83768:8;83758:19;;;;;;;;;;;:24;;;:45;;;;;;83746:58;;;;;;;;;;;;;;;;;;83736:68;;;;;;;-1:-1:-1;;83736:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83746:58;83736:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83741:1;83736:7;;;;;;;;;;;;;;;:68;;;;83866:7;;;;83880;;83819:20;83894:19;;;:9;:19;;;;;;83927:7;;;;83941;;;;83849:101;;83819:20;;83849:101;;83866:7;83880;83894:19;;83927:7;;83849:101;;:::i;78328:175::-;78380:13;78420;:11;:13::i;:::-;78414:3;:19;78406:59;;;;-1:-1:-1;;;78406:59:0;;;;;;;:::i;:::-;78483:12;78476:19;;;;;;;;;;;;;-1:-1:-1;;78476:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;78483:12;78476:19;;78483:12;78476:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78328:175;;;:::o;72014:394::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;72102:11:::1;72116:13;:11;:13::i;:::-;72102:27;;72165:1;72148:14;:18;:52;;;;;72188:12;;72170:14;:30;;72148:52;72140:97;;;;-1:-1:-1::0;;;72140:97:0::1;;;;;;;:::i;:::-;72253:6;72248:95;72269:14;72265:1;:18;72248:95;;;72305:26;72315:3;72329:1;72320:6;:10;72305:9;:26::i;:::-;72285:3;;72248:95;;;-1:-1:-1::0;72368:12:0::1;::::0;:32:::1;::::0;72385:14;72368:16:::1;:32::i;:::-;72353:12;:47:::0;-1:-1:-1;;;72014:394:0:o;54982:164::-;-1:-1:-1;;;;;55103:25:0;;;55079:4;55103:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;54982:164::o;70267:32::-;;;;;;;;;:::o;73394:155::-;71742:12;:10;:12::i;:::-;-1:-1:-1;;;;;71724:30:0;:14;:12;:14::i;:::-;-1:-1:-1;;;;;71724:30:0;;71716:75;;;;-1:-1:-1;;;71716:75:0;;;;;;;:::i;:::-;73502:21:::1;::::0;;;:9:::1;:21;::::0;;;;:32:::1;;::::0;:39:::1;::::0;73539:1:::1;73502:36;:39::i;:::-;73467:21;::::0;;;:9:::1;:21;::::0;;;;;:32:::1;;:74:::0;73394:155::o;66551:244::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66640:22:0;::::1;66632:73;;;;-1:-1:-1::0;;;66632:73:0::1;;;;;;;:::i;:::-;66742:6;::::0;66721:38:::1;::::0;-1:-1:-1;;;;;66721:38:0;;::::1;::::0;66742:6:::1;::::0;66721:38:::1;::::0;66742:6:::1;::::0;66721:38:::1;66770:6;:17:::0;;-1:-1:-1;;;;;;66770:17:0::1;-1:-1:-1::0;;;;;66770:17:0;;;::::1;::::0;;;::::1;::::0;;66551:244::o;70218:40::-;70255:3;70218:40;:::o;73557:123::-;71742:12;:10;:12::i;:::-;-1:-1:-1;;;;;71724:30:0;:14;:12;:14::i;:::-;-1:-1:-1;;;;;71724:30:0;;71716:75;;;;-1:-1:-1;;;71716:75:0;;;;;;;:::i;:::-;73640:21:::1;::::0;;;:9:::1;:21;::::0;;;;;:24:::1;;:32:::0;73557:123::o;81613:395::-;81721:10;81700:17;81708:8;81700:7;:17::i;:::-;-1:-1:-1;;;;;81700:31:0;;81692:84;;;;-1:-1:-1;;;81692:84:0;;;;;;;:::i;:::-;81832:19;;;;:9;:19;;;;;;;81819:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81795:20;81808:5;81795:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;81787:111;;;;-1:-1:-1;;;81787:111:0;;;;;;;:::i;:::-;81909:19;;;;:9;:19;;;;;;;;:32;;;;;;;;:::i;:::-;;81959:39;81970:10;81982:8;81992:5;81959:39;;;;;;;;:::i;78564:131::-;65828:12;:10;:12::i;:::-;-1:-1:-1;;;;;65817:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65817:23:0;;65809:68;;;;-1:-1:-1;;;65809:68:0;;;;;;;:::i;:::-;78621:13:::1;:21:::0;;-1:-1:-1;;78621:21:0::1;78638:4;78621:21;::::0;;78658:29:::1;::::0;::::1;::::0;::::1;::::0;78674:12:::1;::::0;78658:29:::1;:::i;:::-;;;;;;;;78564:131::o:0;57563:127::-;57628:4;57652:30;:12;57674:7;57652:21;:30::i;667:106::-;755:10;667:106;:::o;63581:192::-;63656:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;63656:29:0;-1:-1:-1;;;;;63656:29:0;;;;;;;;:24;;63710:23;63656:24;63710:14;:23::i;:::-;-1:-1:-1;;;;;63701:46:0;;;;;;;;;;;63581:192;;:::o;44278:123::-;44347:7;44374:19;44382:3;44374:7;:19::i;62193:100::-;62266:19;;;;:8;;:19;;;;;:::i;14676:220::-;14734:7;14758:6;14754:20;;-1:-1:-1;14773:1:0;14766:8;;14754:20;14797:5;;;14801:1;14797;:5;:1;14821:5;;;;;:10;14813:56;;;;-1:-1:-1;;;14813:56:0;;;;;;;:::i;15374:153::-;15432:7;15464:1;15460;:5;15452:44;;;;-1:-1:-1;;;15452:44:0;;;;;;;:::i;:::-;15518:1;15514;:5;;;;;;;15374:153;-1:-1:-1;;;15374:153:0:o;57857:355::-;57950:4;57975:16;57983:7;57975;:16::i;:::-;57967:73;;;;-1:-1:-1;;;57967:73:0;;;;;;;:::i;:::-;58051:13;58067:23;58082:7;58067:14;:23::i;:::-;58051:39;;58120:5;-1:-1:-1;;;;;58109:16:0;:7;-1:-1:-1;;;;;58109:16:0;;:51;;;;58153:7;-1:-1:-1;;;;;58129:31:0;:20;58141:7;58129:11;:20::i;:::-;-1:-1:-1;;;;;58129:31:0;;58109:51;:94;;;;58164:39;58188:5;58195:7;58164:23;:39::i;:::-;58101:103;57857:355;-1:-1:-1;;;;57857:355:0:o;60993:599::-;61118:4;-1:-1:-1;;;;;61091:31:0;:23;61106:7;61091:14;:23::i;:::-;-1:-1:-1;;;;;61091:31:0;;61083:85;;;;-1:-1:-1;;;61083:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61205:16:0;;61197:65;;;;-1:-1:-1;;;61197:65:0;;;;;;;:::i;:::-;61275:39;61296:4;61302:2;61306:7;61275:20;:39::i;:::-;61379:29;61396:1;61400:7;61379:8;:29::i;:::-;-1:-1:-1;;;;;61421:19:0;;;;;;:13;:19;;;;;:35;;61448:7;61421:26;:35::i;:::-;-1:-1:-1;;;;;;61467:17:0;;;;;;:13;:17;;;;;:30;;61489:7;61467:21;:30::i;:::-;-1:-1:-1;61510:29:0;:12;61527:7;61536:2;61510:16;:29::i;:::-;;61576:7;61572:2;-1:-1:-1;;;;;61557:27:0;61566:4;-1:-1:-1;;;;;61557:27:0;;;;;;;;;;;60993:599;;;:::o;36069:137::-;36140:7;36175:22;36179:3;36191:5;36175:3;:22::i;13797:179::-;13855:7;13887:5;;;13911:6;;;;13903:46;;;;-1:-1:-1;;;13903:46:0;;;;;;;:::i;60111:545::-;60171:13;60187:23;60202:7;60187:14;:23::i;:::-;60171:39;;60241:48;60262:5;60277:1;60281:7;60241:20;:48::i;:::-;60330:29;60347:1;60351:7;60330:8;:29::i;:::-;60418:19;;;;:10;:19;;;;;60412:33;;-1:-1:-1;;60412:33:0;;;;;;;;;;;:38;60408:97;;60474:19;;;;:10;:19;;;;;60467:26;;;:::i;:::-;-1:-1:-1;;;;;60517:20:0;;;;;;:13;:20;;;;;:36;;60545:7;60517:27;:36::i;:::-;-1:-1:-1;60566:28:0;:12;60586:7;60566:19;:28::i;:::-;-1:-1:-1;60612:36:0;;60640:7;;60636:1;;-1:-1:-1;;;;;60612:36:0;;;;;60636:1;;60612:36;60111:545;;:::o;44740:236::-;44820:7;;;;44880:22;44884:3;44896:5;44880:3;:22::i;:::-;44849:53;;;;-1:-1:-1;44740:236:0;-1:-1:-1;;;;;44740:236:0:o;46026:213::-;46133:7;46184:44;46189:3;46209;46215:12;46184:4;:44::i;:::-;46176:53;-1:-1:-1;46026:213:0;;;;;;:::o;14259:158::-;14317:7;14350:1;14345;:6;;14337:49;;;;-1:-1:-1;;;14337:49:0;;;;;;;:::i;:::-;-1:-1:-1;14404:5:0;;;14259:158::o;56978:272::-;57092:28;57102:4;57108:2;57112:7;57092:9;:28::i;:::-;57139:48;57162:4;57168:2;57172:7;57181:5;57139:22;:48::i;:::-;57131:111;;;;-1:-1:-1;;;57131:111:0;;;;;;;:::i;80724:231::-;80786:4;;80818:27;:9;80832:12;80818:13;:27::i;:::-;80802:43;;80856:9;80900:8;80883:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;80873:37;;;;;;80868:43;;80856:55;;80936:11;;80929:4;:18;;;;;;;80724:231;-1:-1:-1;;;;80724:231:0:o;58555:110::-;58631:26;58641:2;58645:7;58631:26;;;;;;;;;;;;:9;:26::i;46490:746::-;46546:13;46767:10;46763:53;;-1:-1:-1;46794:10:0;;;;;;;;;;;;-1:-1:-1;;;46794:10:0;;;;;;46763:53;46841:5;46826:12;46882:78;46889:9;;46882:78;;46915:8;;46946:2;46938:10;;;;46882:78;;;46970:19;47002:6;46992:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46992:17:0;-1:-1:-1;47064:5:0;;-1:-1:-1;46970:39:0;-1:-1:-1;;;47036:10:0;;47080:117;47087:9;;47080:117;;47156:2;47149:4;:9;47144:2;:14;47131:29;;47113:6;47120:7;;;;;;;47113:15;;;;;;;;;;;:47;-1:-1:-1;;;;;47113:47:0;;;;;;;;-1:-1:-1;47183:2:0;47175:10;;;;47080:117;;;-1:-1:-1;47221:6:0;46490:746;-1:-1:-1;;;;46490:746:0:o;44039:151::-;44123:4;44147:35;44157:3;44177;44147:9;:35::i;40857:110::-;40940:19;;40857:110::o;35156:137::-;35226:4;35250:35;35258:3;35278:5;35250:7;:35::i;34849:131::-;34916:4;34940:32;34945:3;34965:5;34940:4;:32::i;43462:185::-;43551:4;43575:64;43580:3;43600;-1:-1:-1;;;;;43614:23:0;;43575:4;:64::i;31107:204::-;31202:18;;31174:7;;31202:26;-1:-1:-1;31194:73:0;;;;-1:-1:-1;;;31194:73:0;;;;;;;:::i;:::-;31285:3;:11;;31297:5;31285:18;;;;;;;;;;;;;;;;31278:25;;31107:204;;;;:::o;43813:142::-;43890:4;43914:33;43922:3;43942;43914:7;:33::i;41322:279::-;41426:19;;41389:7;;;;41426:27;-1:-1:-1;41418:74:0;;;;-1:-1:-1;;;41418:74:0;;;;;;;:::i;:::-;41505:22;41530:3;:12;;41543:5;41530:19;;;;;;;;;;;;;;;;;;41505:44;;41568:5;:10;;;41580:5;:12;;;41560:33;;;;;41322:279;;;;;:::o;42819:319::-;42913:7;42952:17;;;:12;;;:17;;;;;;43003:12;42988:13;42980:36;;;;-1:-1:-1;;;42980:36:0;;;;;;;;:::i;:::-;;43070:3;:12;;43094:1;43083:8;:12;43070:26;;;;;;;;;;;;;;;;;;:33;;;43063:40;;;42819:319;;;;;:::o;62858:604::-;62979:4;63006:15;:2;-1:-1:-1;;;;;63006:13:0;;:15::i;:::-;63001:60;;-1:-1:-1;63045:4:0;63038:11;;63001:60;63071:23;63097:252;-1:-1:-1;;;63210:12:0;:10;:12::i;:::-;63237:4;63256:7;63278:5;63113:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;63113:181:0;;;;;;;-1:-1:-1;;;;;63113:181:0;;;;;;;;;;;63097:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63097:15:0;;;:252;:15;:252::i;:::-;63071:278;;63360:13;63387:10;63376:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;63427:26:0;-1:-1:-1;;;63427:26:0;;-1:-1:-1;;;62858:604:0;;;;;;:::o;58892:250::-;58988:18;58994:2;58998:7;58988:5;:18::i;:::-;59025:54;59056:1;59060:2;59064:7;59073:5;59025:22;:54::i;:::-;59017:117;;;;-1:-1:-1;;;59017:117:0;;;;;;;:::i;40637:125::-;40708:4;40732:17;;;:12;;;;;:17;;;;;;:22;;;40637:125::o;28809:1544::-;28875:4;29014:19;;;:12;;;:19;;;;;;29050:15;;29046:1300;;29485:18;;-1:-1:-1;;29436:14:0;;;;29485:22;;;;29412:21;;29485:3;;:22;;29772;;;;;;;;;;;;;;29752:42;;29918:9;29889:3;:11;;29901:13;29889:26;;;;;;;;;;;;;;;;;;;:38;;;;29995:23;;;30037:1;29995:12;;;:23;;;;;;30021:17;;;29995:43;;30147:17;;29995:3;;30147:17;;;;;;;;;;;;;;;;;;;;;;30242:3;:12;;:19;30255:5;30242:19;;;;;;;;;;;30235:26;;;30285:4;30278:11;;;;;;;;29046:1300;30329:5;30322:12;;;;;28219:414;28282:4;28304:21;28314:3;28319:5;28304:9;:21::i;:::-;28299:327;;-1:-1:-1;28342:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;28525:18;;28503:19;;;:12;;;:19;;;;;;:40;;;;28558:11;;28299:327;-1:-1:-1;28609:5:0;28602:12;;38137:692;38213:4;38348:17;;;:12;;;:17;;;;;;38382:13;38378:444;;-1:-1:-1;;38467:38:0;;;;;;;;;;;;;;;;;;38449:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;38664:19;;38644:17;;;:12;;;:17;;;;;;;:39;38698:11;;38378:444;38778:5;38742:3;:12;;38766:1;38755:8;:12;38742:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38805:5;38798:12;;;;;39004:1549;39068:4;39203:17;;;:12;;;:17;;;;;;39237:13;;39233:1313;;39669:19;;-1:-1:-1;;39622:12:0;;;;39669:23;;;;39598:21;;39669:3;;:23;;39966;;;;;;;;;;;;;;;;39937:52;;40114:9;40084:3;:12;;40097:13;40084:27;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;;;;40204:14;;40191:28;;:12;;;:28;;;;;40222:17;;;40191:48;;40348:18;;40191:3;;40348:18;;;;;;;;;;;;;;-1:-1:-1;;40348:18:0;;;;;;;;;;;;;;;;;;;;;40444:17;;;:12;;;:17;;;;;;40437:24;;;;40348:18;-1:-1:-1;40478:11:0;;-1:-1:-1;;;;40478:11:0;19238:422;19605:20;19644:8;;;19238:422::o;22156:195::-;22259:12;22291:52;22313:6;22321:4;22327:1;22330:12;22291:21;:52::i;59478:404::-;-1:-1:-1;;;;;59558:16:0;;59550:61;;;;-1:-1:-1;;;59550:61:0;;;;;;;:::i;:::-;59631:16;59639:7;59631;:16::i;:::-;59630:17;59622:58;;;;-1:-1:-1;;;59622:58:0;;;;;;;:::i;:::-;59693:45;59722:1;59726:2;59730:7;59693:20;:45::i;:::-;-1:-1:-1;;;;;59751:17:0;;;;;;:13;:17;;;;;:30;;59773:7;59751:21;:30::i;:::-;-1:-1:-1;59794:29:0;:12;59811:7;59820:2;59794:16;:29::i;:::-;-1:-1:-1;59841:33:0;;59866:7;;-1:-1:-1;;;;;59841:33:0;;;59858:1;;59841:33;;59858:1;;59841:33;59478:404;;:::o;23208:530::-;23335:12;23393:5;23368:21;:30;;23360:81;;;;-1:-1:-1;;;23360:81:0;;;;;;;:::i;:::-;23460:18;23471:6;23460:10;:18::i;:::-;23452:60;;;;-1:-1:-1;;;23452:60:0;;;;;;;:::i;:::-;23586:12;23600:23;23627:6;-1:-1:-1;;;;;23627:11:0;23647:5;23655:4;23627:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23585:75;;;;23678:52;23696:7;23705:10;23717:12;23678:17;:52::i;:::-;23671:59;23208:530;-1:-1:-1;;;;;;;23208:530:0:o;25748:742::-;25863:12;25892:7;25888:595;;;-1:-1:-1;25923:10:0;25916:17;;25888:595;26037:17;;:21;26033:439;;26300:10;26294:17;26361:15;26348:10;26344:2;26340:19;26333:44;26248:148;26443:12;26436:20;;-1:-1:-1;;;26436:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:589:1;;110:18;151:2;143:6;140:14;137:2;;;157:9;137:2;197;191:9;270:2;247:17;;-1:-1:-1;;243:31:1;231:44;;277:4;227:55;297:18;;;317:22;;;294:46;291:2;;;343:9;291:2;370;363:22;418;;;403:6;-1:-1:-1;403:6:1;455:16;;;452:25;-1:-1:-1;449:2:1;;;490:1;487;480:12;449:2;540:6;535:3;528:4;520:6;516:17;503:44;595:1;588:4;579:6;571;567:19;563:30;556:41;;;90:513;;;;;:::o;608:175::-;678:20;;-1:-1:-1;;;;;727:31:1;;717:42;;707:2;;773:1;770;763:12;788:233;;886:3;879:4;871:6;867:17;863:27;853:2;;908:5;901;894:20;853:2;934:81;1011:3;1002:6;989:20;982:4;974:6;970:17;934:81;:::i;1026:198::-;;1138:2;1126:9;1117:7;1113:23;1109:32;1106:2;;;1159:6;1151;1144:22;1106:2;1187:31;1208:9;1187:31;:::i;1229:274::-;;;1358:2;1346:9;1337:7;1333:23;1329:32;1326:2;;;1379:6;1371;1364:22;1326:2;1407:31;1428:9;1407:31;:::i;:::-;1397:41;;1457:40;1493:2;1482:9;1478:18;1457:40;:::i;:::-;1447:50;;1316:187;;;;;:::o;1508:342::-;;;;1654:2;1642:9;1633:7;1629:23;1625:32;1622:2;;;1675:6;1667;1660:22;1622:2;1703:31;1724:9;1703:31;:::i;:::-;1693:41;;1753:40;1789:2;1778:9;1774:18;1753:40;:::i;:::-;1743:50;;1840:2;1829:9;1825:18;1812:32;1802:42;;1612:238;;;;;:::o;1855:702::-;;;;;2027:3;2015:9;2006:7;2002:23;1998:33;1995:2;;;2049:6;2041;2034:22;1995:2;2077:31;2098:9;2077:31;:::i;:::-;2067:41;;2127:40;2163:2;2152:9;2148:18;2127:40;:::i;:::-;2117:50;;2214:2;2203:9;2199:18;2186:32;2176:42;;2269:2;2258:9;2254:18;2241:32;2296:18;2288:6;2285:30;2282:2;;;2333:6;2325;2318:22;2282:2;2361:22;;2414:4;2406:13;;2402:27;-1:-1:-1;2392:2:1;;2448:6;2440;2433:22;2392:2;2476:75;2543:7;2538:2;2525:16;2520:2;2516;2512:11;2476:75;:::i;:::-;2466:85;;;1985:572;;;;;;;:::o;2562:329::-;;;2688:2;2676:9;2667:7;2663:23;2659:32;2656:2;;;2709:6;2701;2694:22;2656:2;2737:31;2758:9;2737:31;:::i;:::-;2727:41;;2818:2;2807:9;2803:18;2790:32;2831:30;2855:5;2831:30;:::i;:::-;2880:5;2870:15;;;2646:245;;;;;:::o;2896:266::-;;;3025:2;3013:9;3004:7;3000:23;2996:32;2993:2;;;3046:6;3038;3031:22;2993:2;3074:31;3095:9;3074:31;:::i;:::-;3064:41;3152:2;3137:18;;;;3124:32;;-1:-1:-1;;;2983:179:1:o;3167:253::-;;3276:2;3264:9;3255:7;3251:23;3247:32;3244:2;;;3297:6;3289;3282:22;3244:2;3341:9;3328:23;3360:30;3384:5;3360:30;:::i;3425:257::-;;3545:2;3533:9;3524:7;3520:23;3516:32;3513:2;;;3566:6;3558;3551:22;3513:2;3603:9;3597:16;3622:30;3646:5;3622:30;:::i;3687:194::-;;3810:2;3798:9;3789:7;3785:23;3781:32;3778:2;;;3831:6;3823;3816:22;3778:2;-1:-1:-1;3859:16:1;;3768:113;-1:-1:-1;3768:113:1:o;3886:257::-;;3997:2;3985:9;3976:7;3972:23;3968:32;3965:2;;;4018:6;4010;4003:22;3965:2;4062:9;4049:23;4081:32;4107:5;4081:32;:::i;4148:261::-;;4270:2;4258:9;4249:7;4245:23;4241:32;4238:2;;;4291:6;4283;4276:22;4238:2;4328:9;4322:16;4347:32;4373:5;4347:32;:::i;4414:344::-;;4536:2;4524:9;4515:7;4511:23;4507:32;4504:2;;;4557:6;4549;4542:22;4504:2;4602:9;4589:23;4635:18;4627:6;4624:30;4621:2;;;4672:6;4664;4657:22;4621:2;4700:52;4744:7;4735:6;4724:9;4720:22;4700:52;:::i;4763:190::-;;4875:2;4863:9;4854:7;4850:23;4846:32;4843:2;;;4896:6;4888;4881:22;4843:2;-1:-1:-1;4924:23:1;;4833:120;-1:-1:-1;4833:120:1:o;5157:412::-;;;5296:2;5284:9;5275:7;5271:23;5267:32;5264:2;;;5317:6;5309;5302:22;5264:2;5358:9;5345:23;5335:33;;5419:2;5408:9;5404:18;5391:32;5446:18;5438:6;5435:30;5432:2;;;5483:6;5475;5468:22;5432:2;5511:52;5555:7;5546:6;5535:9;5531:22;5511:52;:::i;:::-;5501:62;;;5254:315;;;;;:::o;5574:258::-;;;5703:2;5691:9;5682:7;5678:23;5674:32;5671:2;;;5724:6;5716;5709:22;5671:2;-1:-1:-1;;5752:23:1;;;5822:2;5807:18;;;5794:32;;-1:-1:-1;5661:171:1:o;5837:259::-;;5918:5;5912:12;5945:6;5940:3;5933:19;5961:63;6017:6;6010:4;6005:3;6001:14;5994:4;5987:5;5983:16;5961:63;:::i;:::-;6078:2;6057:15;-1:-1:-1;;6053:29:1;6044:39;;;;6085:4;6040:50;;5888:208;-1:-1:-1;;5888:208:1:o;6101:705::-;;6197:5;6191:12;6222:1;6254:2;6243:9;6239:18;6271:1;6266:126;;;;6406:1;6401:399;;;;6232:568;;6266:126;-1:-1:-1;;6299:24:1;;6287:37;;6372:1;6357:17;;6376:4;6353:28;6344:38;;;-1:-1:-1;6266:126:1;;6401:399;6451:1;6440:9;6436:17;6476:5;6473:1;6466:16;6505:4;6550:2;6547:1;6537:16;6575:1;6589:165;6603:6;6600:1;6597:13;6589:165;;;6681:14;;6668:11;;;6661:35;6724:16;;;;6618:10;;6589:165;;;-1:-1:-1;;;6774:16:1;;;-1:-1:-1;6232:568:1;;;;6164:642;;;;:::o;6811:274::-;;6978:6;6972:13;6994:53;7040:6;7035:3;7028:4;7020:6;7016:17;6994:53;:::i;:::-;7063:16;;;;;6948:137;-1:-1:-1;;6948:137:1:o;7090:204::-;;7245:43;7284:3;7276:6;7245:43;:::i;7299:637::-;;7617:6;7611:13;7633:53;7679:6;7674:3;7667:4;7659:6;7655:17;7633:53;:::i;:::-;7749:13;;7708:16;;;;7771:57;7749:13;7708:16;7805:4;7793:17;;7771:57;:::i;:::-;-1:-1:-1;;;7850:20:1;;7879:22;;;7928:1;7917:13;;7587:349;-1:-1:-1;;;;7587:349:1:o;7941:524::-;;8256:6;8250:13;8272:53;8318:6;8313:3;8306:4;8298:6;8294:17;8272:53;:::i;:::-;-1:-1:-1;;;8347:16:1;;;8372:18;;;8406:53;8456:1;8445:13;;8437:6;8406:53;:::i;:::-;8399:60;8226:239;-1:-1:-1;;;;;8226:239:1:o;8470:851::-;;8934:6;8928:13;8950:53;8996:6;8991:3;8984:4;8976:6;8972:17;8950:53;:::i;:::-;-1:-1:-1;;;9025:16:1;;;9050:18;;;9087:53;9137:1;9126:13;;9118:6;9087:53;:::i;:::-;9077:63;;-1:-1:-1;;;9156:2:1;9149:16;9196:6;9190:13;9212:62;9265:8;9261:1;9257:2;9253:10;9246:4;9238:6;9234:17;9212:62;:::i;:::-;9294:17;9313:1;9290:25;;8904:417;-1:-1:-1;;;;;8904:417:1:o;9326:1197::-;;9939:6;9933:13;9955:53;10001:6;9996:3;9989:4;9981:6;9977:17;9955:53;:::i;:::-;-1:-1:-1;;;10030:16:1;;;10077:17;;;10030:16;10113:53;10163:1;10152:13;;10144:6;10113:53;:::i;:::-;10103:63;;-1:-1:-1;;;10182:2:1;10175:16;10222:6;10216:13;10238:62;10291:8;10287:1;10283:2;10279:10;10272:4;10264:6;10260:17;10238:62;:::i;:::-;10360:1;10319:17;;10352:10;;;10345:22;10392:13;;10414:62;10392:13;10463:1;10455:10;;10448:4;10436:17;;10414:62;:::i;:::-;10496:17;10515:1;10492:25;;9909:614;-1:-1:-1;;;;;;9909:614:1:o;10528:1526::-;;11290:6;11284:13;11306:53;11352:6;11347:3;11340:4;11332:6;11328:17;11306:53;:::i;:::-;-1:-1:-1;;;11381:16:1;;;11406:18;;;11449:13;;11471:65;11449:13;11523:1;11512:13;;11505:4;11493:17;;11471:65;:::i;:::-;11566:8;11559:5;11555:20;11545:30;;;-1:-1:-1;;;11625:2:1;11621:1;11617:2;11613:10;11606:22;11647:50;11694:1;11690:2;11686:10;11678:6;11647:50;:::i;:::-;11637:60;;-1:-1:-1;;;11713:2:1;11706:16;11753:6;11747:13;11769:62;11822:8;11818:1;11814:2;11810:10;11803:4;11795:6;11791:17;11769:62;:::i;:::-;11891:1;11850:17;;11883:10;;;11876:22;11923:13;;11945:62;11923:13;11994:1;11986:10;;11979:4;11967:17;;11945:62;:::i;:::-;12027:17;12046:1;12023:25;;11260:794;-1:-1:-1;;;;;;;11260:794:1:o;12059:544::-;12430:28;12418:41;;12484:2;12475:12;;12468:28;;;;-1:-1:-1;;;12521:2:1;12512:12;;12505:27;12557:2;12548:12;;12541:28;12594:2;12585:12;;12408:195::o;12608:182::-;12737:19;;;12781:2;12772:12;;12727:63::o;12795:203::-;-1:-1:-1;;;;;12959:32:1;;;;12941:51;;12929:2;12914:18;;12896:102::o;13219:312::-;-1:-1:-1;;;;;13457:15:1;;;13439:34;;13509:15;;13504:2;13489:18;;13482:43;13389:2;13374:18;;13356:175::o;13536:383::-;-1:-1:-1;;;;;13802:15:1;;;13784:34;;13854:15;;;;13849:2;13834:18;;13827:43;13901:2;13886:18;;13879:34;;;;13734:2;13719:18;;13701:218::o;13924:506::-;-1:-1:-1;;;;;14209:15:1;;;14191:34;;14261:15;;14256:2;14241:18;;14234:43;14308:2;14293:18;;14286:34;;;14356:3;14351:2;14336:18;;14329:31;;;13924:506;;14377:47;;14404:19;;14396:6;14377:47;:::i;:::-;14369:55;14143:287;-1:-1:-1;;;;;;14143:287:1:o;14435:282::-;-1:-1:-1;;;;;14635:32:1;;;;14617:51;;14699:2;14684:18;;14677:34;14605:2;14590:18;;14572:145::o;14722:397::-;;14964:1;14960;14955:3;14951:11;14947:19;14939:6;14935:32;14924:9;14917:51;15004:6;14999:2;14988:9;14984:18;14977:34;15047:2;15042;15031:9;15027:18;15020:30;15067:46;15109:2;15098:9;15094:18;15086:6;15067:46;:::i;15403:635::-;15574:2;15626:21;;;15696:13;;15599:18;;;15718:22;;;15403:635;;15574:2;15797:15;;;;15771:2;15756:18;;;15403:635;15843:169;15857:6;15854:1;15851:13;15843:169;;;15918:13;;15906:26;;15987:15;;;;15952:12;;;;15879:1;15872:9;15843:169;;;-1:-1:-1;16029:3:1;;15554:484;-1:-1:-1;;;;;;15554:484:1:o;16043:187::-;16208:14;;16201:22;16183:41;;16171:2;16156:18;;16138:92::o;16458:221::-;;16607:2;16596:9;16589:21;16627:46;16669:2;16658:9;16654:18;16646:6;16627:46;:::i;16684:1016::-;;17143:3;17132:9;17125:22;17164:47;17206:3;17195:9;17191:19;17183:6;17164:47;:::i;:::-;17242:2;17227:18;;17220:34;;;;-1:-1:-1;17285:2:1;17270:18;;17263:34;;;;17328:2;17313:18;;17306:34;;;;17371:3;17356:19;;17349:35;;;;17415:3;17400:19;;17393:35;;;;17459:3;17444:19;;17437:35;;;;17503:3;17488:19;;17481:35;17547:3;17532:19;;17525:35;17591:3;17576:19;;17569:35;17635:3;17620:19;;17613:36;17680:3;17665:19;;;17658:36;17156:55;17115:585;-1:-1:-1;17115:585:1:o;17705:982::-;;17843:2;17883;17872:9;17868:18;17913:2;17902:9;17895:21;17936:4;17972:6;17966:13;17998:1;18030:2;18019:9;18015:18;18047:1;18042:178;;;;18234:1;18229:432;;;;18008:653;;18042:178;18097:1;18082:17;;18101:4;18078:28;18063:44;;-1:-1:-1;;18147:24:1;;18142:2;18127:18;;18120:52;18207:2;18192:18;;;-1:-1:-1;18042:178:1;;18229:432;18279:1;18268:9;18264:17;18309:6;18301;18294:22;18344:42;18379:6;18344:42;:::i;:::-;18408:4;18425:180;18439:6;18436:1;18433:13;18425:180;;;18532:14;;18508:17;;;18527:2;18504:26;18497:50;18575:16;;;;18454:10;;18425:180;;;18629:17;;18648:2;18625:26;;-1:-1:-1;;;18008:653:1;-1:-1:-1;18678:3:1;;17823:864;-1:-1:-1;;;;;;;17823:864:1:o;18692:398::-;18894:2;18876:21;;;18933:2;18913:18;;;18906:30;18972:34;18967:2;18952:18;;18945:62;-1:-1:-1;;;19038:2:1;19023:18;;19016:32;19080:3;19065:19;;18866:224::o;19095:397::-;19297:2;19279:21;;;19336:2;19316:18;;;19309:30;19375:34;19370:2;19355:18;;19348:62;-1:-1:-1;;;19441:2:1;19426:18;;19419:31;19482:3;19467:19;;19269:223::o;19497:351::-;19699:2;19681:21;;;19738:2;19718:18;;;19711:30;19777:29;19772:2;19757:18;;19750:57;19839:2;19824:18;;19671:177::o;19853:356::-;20055:2;20037:21;;;20074:18;;;20067:30;20133:34;20128:2;20113:18;;20106:62;20200:2;20185:18;;20027:182::o;20214:414::-;20416:2;20398:21;;;20455:2;20435:18;;;20428:30;20494:34;20489:2;20474:18;;20467:62;-1:-1:-1;;;20560:2:1;20545:18;;20538:48;20618:3;20603:19;;20388:240::o;20633:402::-;20835:2;20817:21;;;20874:2;20854:18;;;20847:30;20913:34;20908:2;20893:18;;20886:62;-1:-1:-1;;;20979:2:1;20964:18;;20957:36;21025:3;21010:19;;20807:228::o;21040:352::-;21242:2;21224:21;;;21281:2;21261:18;;;21254:30;21320;21315:2;21300:18;;21293:58;21383:2;21368:18;;21214:178::o;21397:351::-;21599:2;21581:21;;;21638:2;21618:18;;;21611:30;21677:29;21672:2;21657:18;;21650:57;21739:2;21724:18;;21571:177::o;22163:356::-;22365:2;22347:21;;;22384:18;;;22377:30;22443:34;22438:2;22423:18;;22416:62;22510:2;22495:18;;22337:182::o;22524:400::-;22726:2;22708:21;;;22765:2;22745:18;;;22738:30;22804:34;22799:2;22784:18;;22777:62;-1:-1:-1;;;22870:2:1;22855:18;;22848:34;22914:3;22899:19;;22698:226::o;22929:349::-;23131:2;23113:21;;;23170:2;23150:18;;;23143:30;23209:27;23204:2;23189:18;;23182:55;23269:2;23254:18;;23103:175::o;23283:355::-;23485:2;23467:21;;;23524:2;23504:18;;;23497:30;23563:33;23558:2;23543:18;;23536:61;23629:2;23614:18;;23457:181::o;23643:354::-;23845:2;23827:21;;;23884:2;23864:18;;;23857:30;23923:32;23918:2;23903:18;;23896:60;23988:2;23973:18;;23817:180::o;24002:402::-;24204:2;24186:21;;;24243:2;24223:18;;;24216:30;24282:34;24277:2;24262:18;;24255:62;-1:-1:-1;;;24348:2:1;24333:18;;24326:36;24394:3;24379:19;;24176:228::o;24409:408::-;24611:2;24593:21;;;24650:2;24630:18;;;24623:30;24689:34;24684:2;24669:18;;24662:62;-1:-1:-1;;;24755:2:1;24740:18;;24733:42;24807:3;24792:19;;24583:234::o;24822:398::-;25024:2;25006:21;;;25063:2;25043:18;;;25036:30;25102:34;25097:2;25082:18;;25075:62;-1:-1:-1;;;25168:2:1;25153:18;;25146:32;25210:3;25195:19;;24996:224::o;25225:350::-;25427:2;25409:21;;;25466:2;25446:18;;;25439:30;25505:28;25500:2;25485:18;;25478:56;25566:2;25551:18;;25399:176::o;25580:351::-;25782:2;25764:21;;;25821:2;25801:18;;;25794:30;25860:29;25855:2;25840:18;;25833:57;25922:2;25907:18;;25754:177::o;25936:420::-;26138:2;26120:21;;;26177:2;26157:18;;;26150:30;26216:34;26211:2;26196:18;;26189:62;26287:26;26282:2;26267:18;;26260:54;26346:3;26331:19;;26110:246::o;26361:349::-;26563:2;26545:21;;;26602:2;26582:18;;;26575:30;26641:27;26636:2;26621:18;;26614:55;26701:2;26686:18;;26535:175::o;26715:406::-;26917:2;26899:21;;;26956:2;26936:18;;;26929:30;26995:34;26990:2;26975:18;;26968:62;-1:-1:-1;;;27061:2:1;27046:18;;27039:40;27111:3;27096:19;;26889:232::o;27126:406::-;27328:2;27310:21;;;27367:2;27347:18;;;27340:30;27406:34;27401:2;27386:18;;27379:62;-1:-1:-1;;;27472:2:1;27457:18;;27450:40;27522:3;27507:19;;27300:232::o;27537:353::-;27739:2;27721:21;;;27778:2;27758:18;;;27751:30;27817:31;27812:2;27797:18;;27790:59;27881:2;27866:18;;27711:179::o;27895:398::-;28097:2;28079:21;;;28136:2;28116:18;;;28109:30;28175:34;28170:2;28155:18;;28148:62;-1:-1:-1;;;28241:2:1;28226:18;;28219:32;28283:3;28268:19;;28069:224::o;28298:356::-;28500:2;28482:21;;;28519:18;;;28512:30;28578:34;28573:2;28558:18;;28551:62;28645:2;28630:18;;28472:182::o;28659:348::-;28861:2;28843:21;;;28900:2;28880:18;;;28873:30;28939:26;28934:2;28919:18;;28912:54;28998:2;28983:18;;28833:174::o;29012:397::-;29214:2;29196:21;;;29253:2;29233:18;;;29226:30;29292:34;29287:2;29272:18;;29265:62;-1:-1:-1;;;29358:2:1;29343:18;;29336:31;29399:3;29384:19;;29186:223::o;29414:408::-;29616:2;29598:21;;;29655:2;29635:18;;;29628:30;29694:34;29689:2;29674:18;;29667:62;-1:-1:-1;;;29760:2:1;29745:18;;29738:42;29812:3;29797:19;;29588:234::o;29827:347::-;30029:2;30011:21;;;30068:2;30048:18;;;30041:30;30107:25;30102:2;30087:18;;30080:53;30165:2;30150:18;;30001:173::o;30179:356::-;30381:2;30363:21;;;30400:18;;;30393:30;30459:34;30454:2;30439:18;;30432:62;30526:2;30511:18;;30353:182::o;30540:405::-;30742:2;30724:21;;;30781:2;30761:18;;;30754:30;30820:34;30815:2;30800:18;;30793:62;-1:-1:-1;;;30886:2:1;30871:18;;30864:39;30935:3;30920:19;;30714:231::o;30950:411::-;31152:2;31134:21;;;31191:2;31171:18;;;31164:30;31230:34;31225:2;31210:18;;31203:62;-1:-1:-1;;;31296:2:1;31281:18;;31274:45;31351:3;31336:19;;31124:237::o;31366:353::-;31568:2;31550:21;;;31607:2;31587:18;;;31580:30;31646:31;31641:2;31626:18;;31619:59;31710:2;31695:18;;31540:179::o;31724:407::-;31926:2;31908:21;;;31965:2;31945:18;;;31938:30;32004:34;31999:2;31984:18;;31977:62;-1:-1:-1;;;32070:2:1;32055:18;;32048:41;32121:3;32106:19;;31898:233::o;32136:399::-;32338:2;32320:21;;;32377:2;32357:18;;;32350:30;32416:34;32411:2;32396:18;;32389:62;-1:-1:-1;;;32482:2:1;32467:18;;32460:33;32525:3;32510:19;;32310:225::o;32540:397::-;32742:2;32724:21;;;32781:2;32761:18;;;32754:30;32820:34;32815:2;32800:18;;32793:62;-1:-1:-1;;;32886:2:1;32871:18;;32864:31;32927:3;32912:19;;32714:223::o;32942:346::-;33144:2;33126:21;;;33183:2;33163:18;;;33156:30;-1:-1:-1;;;33217:2:1;33202:18;;33195:52;33279:2;33264:18;;33116:172::o;33293:413::-;33495:2;33477:21;;;33534:2;33514:18;;;33507:30;33573:34;33568:2;33553:18;;33546:62;-1:-1:-1;;;33639:2:1;33624:18;;33617:47;33696:3;33681:19;;33467:239::o;33711:353::-;33913:2;33895:21;;;33952:2;33932:18;;;33925:30;33991:31;33986:2;33971:18;;33964:59;34055:2;34040:18;;33885:179::o;34069:404::-;34271:2;34253:21;;;34310:2;34290:18;;;34283:30;34349:34;34344:2;34329:18;;34322:62;-1:-1:-1;;;34415:2:1;34400:18;;34393:38;34463:3;34448:19;;34243:230::o;34478:404::-;34680:2;34662:21;;;34719:2;34699:18;;;34692:30;34758:34;34753:2;34738:18;;34731:62;-1:-1:-1;;;34824:2:1;34809:18;;34802:38;34872:3;34857:19;;34652:230::o;34887:352::-;35089:2;35071:21;;;35128:2;35108:18;;;35101:30;35167;35162:2;35147:18;;35140:58;35230:2;35215:18;;35061:178::o;35244:337::-;35446:2;35428:21;;;35485:2;35465:18;;;35458:30;-1:-1:-1;;;35519:2:1;35504:18;;35497:43;35572:2;35557:18;;35418:163::o;35768:463::-;36027:25;;;36083:2;36068:18;;36061:34;;;;36126:2;36111:18;;36104:34;;;;36169:2;36154:18;;36147:34;36212:3;36197:19;;36190:35;36014:3;35999:19;;35981:250::o;36236:132::-;;36307:17;;;36357:4;36341:21;;;36297:71::o;36373:258::-;36445:1;36455:113;36469:6;36466:1;36463:13;36455:113;;;36545:11;;;36539:18;36526:11;;;36519:39;36491:2;36484:10;36455:113;;;36586:6;36583:1;36580:13;36577:2;;;-1:-1:-1;;36621:1:1;36603:16;;36596:27;36426:205::o;36636:120::-;36724:5;36717:13;36710:21;36703:5;36700:32;36690:2;;36746:1;36743;36736:12;36761:133;-1:-1:-1;;;;;;36837:32:1;;36827:43;;36817:2;;36884:1;36881;36874:12
Swarm Source
ipfs://a57787aca53d89b372c2e0c3de24b77b44cad34269dc98f7db00266c11a87ba1
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.