Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
5
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Solvency
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-19 */ // .---. .---. ,-. .-. .-.,---. .-. .-. ,--,.-. .-. // ( .-._)/ .-. ) | | \ \ / / | .-' | \| |.' .') \ \_/ )/ // (_) \ | | |(_)| | \ V / | `-. | | || |(_) \ (_) // _ \ \ | | | | | | ) / | .-' | |\ |\ \ ) ( // ( `-' ) \ `-' / | `--.(_) | `--.| | |)| \ `-. | | // `----' )---' |( __.' /( __.'/( (_) \____\/(_| // (_) (_) (__) (__) (__) // // solvency.art // by Ezra Miller + Steve Klebanoff // SPDX-License-Identifier: Unlicensed // Sources flattened with hardhat v2.0.10 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] 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/access/[email protected] 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/introspection/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _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/token/ERC721/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File @openzeppelin/contracts/token/ERC20/[email protected] 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); /** * @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); } // File contracts/Solvency.sol pragma experimental ABIEncoderV2; pragma solidity ^0.6.0; contract Solvency is ERC721, ERC721Burnable, Ownable { uint256 public lastMintedId; bool public saleActive; bool public arweaveIdLocked; bool public tokenUriLocked; uint256 public pricePerPiece; uint256 public maxNumberOfPieces; string public arweaveId; mapping(uint256 => bytes32) public tokenIdToHash; address payable public withdrawalAddress; address public oracleToken; address public oracleAccount; event Purchase(address buyer, uint256 price, uint256 tokenId, bytes32 hash); event ArweaveIdUpdated(string newArweaveId); constructor( string memory givenTokenUriBase, uint256 givenPricePerPiece, uint256 givenMaxNumberOfPieces, string memory givenArweaveId, address payable givenWithdrawalAddress, address givenOracleToken, address givenOracleAccount ) public ERC721("Solvency by Ezra Miller", "SOLVENCY") { pricePerPiece = givenPricePerPiece; maxNumberOfPieces = givenMaxNumberOfPieces; arweaveId = givenArweaveId; withdrawalAddress = givenWithdrawalAddress; oracleToken = givenOracleToken; oracleAccount = givenOracleAccount; _setBaseURI(givenTokenUriBase); } function buy() public payable { require(saleActive || msg.sender == owner(), "sale must be active"); require(msg.value == pricePerPiece, "must send in correct amount"); _mintPiece(); } function mintArtistProofs() public onlyOwner { require(lastMintedId <= 1, "cant be more than one piece existing"); for (uint256 i = 0; i < 9; ++i) { _mintPiece(); } } function piecesLeft() public view returns (uint256) { return maxNumberOfPieces - lastMintedId; } function setSaleActive(bool isActive) public onlyOwner { saleActive = isActive; } function lockTokenUri() public onlyOwner { tokenUriLocked = true; } function setTokenUri(string memory givenTokenUri) public onlyOwner { require(!tokenUriLocked, "token uri locked"); _setBaseURI(givenTokenUri); } function setArweaveId(string memory givenArweaveId) public onlyOwner { require(!arweaveIdLocked, "arweave id locked"); emit ArweaveIdUpdated(givenArweaveId); arweaveId = givenArweaveId; } function lockArweaveId() public onlyOwner { arweaveIdLocked = true; } function setWithdrawalAddress(address payable givenWithdrawalAddress) public onlyOwner { withdrawalAddress = givenWithdrawalAddress; } function setMaxNumberOfPieces(uint256 givenMaxNumberOfPieces) public onlyOwner { uint256 newMaxNumberOfPieces = _max(givenMaxNumberOfPieces, lastMintedId); require(piecesLeft() >= 1, "must have pieces left"); require( newMaxNumberOfPieces <= maxNumberOfPieces, "cant create more pieces" ); maxNumberOfPieces = newMaxNumberOfPieces; } function withdrawEth() public { Address.sendValue(withdrawalAddress, address(this).balance); } function tokenInfo(uint256 tokenId) public view returns (address, bytes32) { return (ownerOf(tokenId), tokenIdToHash[tokenId]); } function getOwners(uint256 start, uint256 end) public view returns (address[] memory) { address[] memory re = new address[](end - start); for (uint256 i = start; i < end; i++) { re[i - start] = ownerOf(i); } return re; } function getTokenHashes(uint256 start, uint256 end) public view returns (bytes32[] memory) { bytes32[] memory re = new bytes32[](end - start); for (uint256 i = start; i < end; i++) { re[i - start] = tokenIdToHash[i]; } return re; } function _mintPiece() private returns (uint256) { require(piecesLeft() >= 1, "all pieces sold out"); uint256 newTokenId = lastMintedId + 1; lastMintedId = newTokenId; bytes32 newTokenHash = _psuedoRandomHash(); tokenIdToHash[newTokenId] = newTokenHash; emit Purchase(msg.sender, msg.value, newTokenId, newTokenHash); _mint(msg.sender, newTokenId); } function _psuedoRandomHash() private view returns (bytes32) { return keccak256( abi.encodePacked( msg.sender, tx.gasprice, lastMintedId, block.number, block.timestamp, blockhash(block.number - 1), IERC20(oracleToken).balanceOf(oracleAccount) ) ); } function _max(uint256 a, uint256 b) private pure returns (uint256) { return a > b ? a : b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"givenTokenUriBase","type":"string"},{"internalType":"uint256","name":"givenPricePerPiece","type":"uint256"},{"internalType":"uint256","name":"givenMaxNumberOfPieces","type":"uint256"},{"internalType":"string","name":"givenArweaveId","type":"string"},{"internalType":"address payable","name":"givenWithdrawalAddress","type":"address"},{"internalType":"address","name":"givenOracleToken","type":"address"},{"internalType":"address","name":"givenOracleAccount","type":"address"}],"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":false,"internalType":"string","name":"newArweaveId","type":"string"}],"name":"ArweaveIdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arweaveId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"arweaveIdLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buy","outputs":[],"stateMutability":"payable","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":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getTokenHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastMintedId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockArweaveId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxNumberOfPieces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintArtistProofs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piecesLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerPiece","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"givenArweaveId","type":"string"}],"name":"setArweaveId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"givenMaxNumberOfPieces","type":"uint256"}],"name":"setMaxNumberOfPieces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"givenTokenUri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"givenWithdrawalAddress","type":"address"}],"name":"setWithdrawalAddress","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":"","type":"uint256"}],"name":"tokenIdToHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenUriLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005aa538038062005aa5833981810160405281019062000037919062000533565b6040518060400160405280601781526020017f536f6c76656e637920627920457a7261204d696c6c65720000000000000000008152506040518060400160405280600881526020017f534f4c56454e4359000000000000000000000000000000000000000000000000815250620000bb6301ffc9a760e01b620002f060201b60201c565b8160069080519060200190620000d3929190620003ec565b508060079080519060200190620000ec929190620003ec565b50620001056380ac58cd60e01b620002f060201b60201c565b6200011d635b5e139f60e01b620002f060201b60201c565b6200013563780e9d6360e01b620002f060201b60201c565b5050600062000149620003c860201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35085600d8190555084600e8190555083600f90805190602001906200020e929190620003ec565b5082601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002e387620003d060201b60201c565b50505050505050620007b8565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200035c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003539062000654565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b8060099080519060200190620003e8929190620003ec565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200042f57805160ff191683800117855562000460565b8280016001018555821562000460579182015b828111156200045f57825182559160200191906001019062000442565b5b5090506200046f919062000473565b5090565b5b808211156200048e57600081600090555060010162000474565b5090565b600081519050620004a3816200076a565b92915050565b600081519050620004ba8162000784565b92915050565b600082601f830112620004d257600080fd5b8151620004e9620004e382620006a4565b62000676565b915080825260208301602083018583830111156200050657600080fd5b6200051383828462000734565b50505092915050565b6000815190506200052d816200079e565b92915050565b600080600080600080600060e0888a0312156200054f57600080fd5b600088015167ffffffffffffffff8111156200056a57600080fd5b620005788a828b01620004c0565b97505060206200058b8a828b016200051c565b96505060406200059e8a828b016200051c565b955050606088015167ffffffffffffffff811115620005bc57600080fd5b620005ca8a828b01620004c0565b9450506080620005dd8a828b01620004a9565b93505060a0620005f08a828b0162000492565b92505060c0620006038a828b0162000492565b91505092959891949750929550565b600062000621601c83620006d1565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200066f8162000612565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200069a57600080fd5b8060405250919050565b600067ffffffffffffffff821115620006bc57600080fd5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b6000620006ef826200070a565b9050919050565b600062000703826200070a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200075457808201518184015260208101905062000737565b8381111562000764576000848401525b50505050565b6200077581620006e2565b81146200078157600080fd5b50565b6200078f81620006f6565b81146200079b57600080fd5b50565b620007a9816200072a565b8114620007b557600080fd5b50565b6152dd80620007c86000396000f3fe60806040526004361061027d5760003560e01c80636c0360eb1161014f578063b88d4fde116100c1578063e7c597361161007a578063e7c5973614610968578063e985e9c514610993578063ef8a187c146109d0578063f2bcd022146109f9578063f2fde38b14610a24578063fe3c465714610a4d5761027d565b8063b88d4fde14610859578063be883a0414610882578063c0c53f51146108ab578063c87b56dd146108c2578063cc33c875146108ff578063e1d41a281461093d5761027d565b80638da5cb5b116101135780638da5cb5b1461077c57806395d89b41146107a7578063a0ef91df146107d2578063a22cb465146107e9578063a6f2ae3a14610812578063b5c904b91461081c5761027d565b80636c0360eb146106a957806370a08231146106d4578063715018a61461071157806383472fcf14610728578063841718a6146107535761027d565b806323b872dd116101f3578063575ca2c7116101ac578063575ca2c714610583578063620a2358146105ae578063621a1f74146105d95780636352211e1461061657806368428a1b146106535780636b1786be1461067e5761027d565b806323b872dd146104775780632d589345146104a05780632f745c59146104b757806342842e0e146104f457806342966c681461051d5780634f6ccce7146105465761027d565b8063081812fc11610245578063081812fc14610367578063095ea7b3146103a457806318160ddd146103cd5780631e8e9e22146103f857806320fb9e8a1461042357806321b8092e1461044e5761027d565b806301ffc9a71461028257806304822058146102bf57806305ea13fb146102fc5780630675b7c61461031357806306fdde031461033c575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613b40565b610a78565b6040516102b69190614b03565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613c25565b610adf565b6040516102f39190614abf565b60405180910390f35b34801561030857600080fd5b50610311610ba4565b005b34801561031f57600080fd5b5061033a60048036038101906103359190613b92565b610c89565b005b34801561034857600080fd5b50610351610d61565b60405161035e9190614b39565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613bd3565b610e03565b60405161039b91906149cf565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c69190613adb565b610e88565b005b3480156103d957600080fd5b506103e2610fa0565b6040516103ef9190614f1b565b60405180910390f35b34801561040457600080fd5b5061040d610fb1565b60405161041a9190614b03565b60405180910390f35b34801561042f57600080fd5b50610438610fc4565b6040516104459190614b03565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190613970565b610fd7565b005b34801561048357600080fd5b5061049e600480360381019061049991906139d5565b611097565b005b3480156104ac57600080fd5b506104b56110f7565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613adb565b611190565b6040516104eb9190614f1b565b60405180910390f35b34801561050057600080fd5b5061051b600480360381019061051691906139d5565b6111eb565b005b34801561052957600080fd5b50610544600480360381019061053f9190613bd3565b61120b565b005b34801561055257600080fd5b5061056d60048036038101906105689190613bd3565b611267565b60405161057a9190614f1b565b60405180910390f35b34801561058f57600080fd5b5061059861128a565b6040516105a59190614f1b565b60405180910390f35b3480156105ba57600080fd5b506105c3611290565b6040516105d09190614f1b565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190613bd3565b611296565b60405161060d9190614b1e565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190613bd3565b6112ae565b60405161064a91906149cf565b60405180910390f35b34801561065f57600080fd5b506106686112e5565b6040516106759190614b03565b60405180910390f35b34801561068a57600080fd5b506106936112f8565b6040516106a09190614b39565b60405180910390f35b3480156106b557600080fd5b506106be611396565b6040516106cb9190614b39565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f69190613947565b611438565b6040516107089190614f1b565b60405180910390f35b34801561071d57600080fd5b506107266114f7565b005b34801561073457600080fd5b5061073d611634565b60405161074a91906149cf565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613b17565b61165a565b005b34801561078857600080fd5b506107916116f3565b60405161079e91906149cf565b60405180910390f35b3480156107b357600080fd5b506107bc61171d565b6040516107c99190614b39565b60405180910390f35b3480156107de57600080fd5b506107e76117bf565b005b3480156107f557600080fd5b50610810600480360381019061080b9190613a9f565b6117ed565b005b61081a61196e565b005b34801561082857600080fd5b50610843600480360381019061083e9190613c25565b611a49565b6040516108509190614ae1565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190613a24565b611aeb565b005b34801561088e57600080fd5b506108a960048036038101906108a49190613bd3565b611b4d565b005b3480156108b757600080fd5b506108c0611c74565b005b3480156108ce57600080fd5b506108e960048036038101906108e49190613bd3565b611d0d565b6040516108f69190614b39565b60405180910390f35b34801561090b57600080fd5b5061092660048036038101906109219190613bd3565b611e90565b604051610934929190614a96565b60405180910390f35b34801561094957600080fd5b50610952611eb9565b60405161095f9190614f1b565b60405180910390f35b34801561097457600080fd5b5061097d611ec7565b60405161098a91906149cf565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190613999565b611eed565b6040516109c79190614b03565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613b92565b611f81565b005b348015610a0557600080fd5b50610a0e61209e565b604051610a1b91906149ea565b60405180910390f35b348015610a3057600080fd5b50610a4b6004803603810190610a469190613947565b6120c4565b005b348015610a5957600080fd5b50610a62612270565b604051610a6f9190614f1b565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60608083830367ffffffffffffffff81118015610afb57600080fd5b50604051908082528060200260200182016040528015610b2a5781602001602082028036833780820191505090505b50905060008490505b83811015610b9957610b44816112ae565b8286830381518110610b5257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610b33565b508091505092915050565b610bac612276565b73ffffffffffffffffffffffffffffffffffffffff16610bca6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1790614ddb565b60405180910390fd5b6001600b541115610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90614b7b565b60405180910390fd5b60005b6009811015610c8657610c7a61227e565b50806001019050610c69565b50565b610c91612276565b73ffffffffffffffffffffffffffffffffffffffff16610caf6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc90614ddb565b60405180910390fd5b600c60029054906101000a900460ff1615610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c90614cbb565b60405180910390fd5b610d5e8161234c565b50565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610df95780601f10610dce57610100808354040283529160200191610df9565b820191906000526020600020905b815481529060010190602001808311610ddc57829003601f168201915b5050505050905090565b6000610e0e82612366565b610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4490614dbb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e93826112ae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614e3b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f23612276565b73ffffffffffffffffffffffffffffffffffffffff161480610f525750610f5181610f4c612276565b611eed565b5b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890614cdb565b60405180910390fd5b610f9b8383612383565b505050565b6000610fac600261243c565b905090565b600c60019054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b610fdf612276565b73ffffffffffffffffffffffffffffffffffffffff16610ffd6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90614ddb565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110a86110a2612276565b82612451565b6110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90614e9b565b60405180910390fd5b6110f283838361252f565b505050565b6110ff612276565b73ffffffffffffffffffffffffffffffffffffffff1661111d6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614ddb565b60405180910390fd5b6001600c60016101000a81548160ff021916908315150217905550565b60006111e382600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061274690919063ffffffff16565b905092915050565b61120683838360405180602001604052806000815250611aeb565b505050565b61121c611216612276565b82612451565b61125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125290614edb565b60405180910390fd5b61126481612760565b50565b60008061127e83600261289a90919063ffffffff16565b50905080915050919050565b600d5481565b600b5481565b60106020528060005260406000206000915090505481565b60006112de8260405180606001604052806029815260200161527f6029913960026128c69092919063ffffffff16565b9050919050565b600c60009054906101000a900460ff1681565b600f8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561138e5780601f106113635761010080835404028352916020019161138e565b820191906000526020600020905b81548152906001019060200180831161137157829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561142e5780601f106114035761010080835404028352916020019161142e565b820191906000526020600020905b81548152906001019060200180831161141157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a090614d1b565b60405180910390fd5b6114f0600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128e5565b9050919050565b6114ff612276565b73ffffffffffffffffffffffffffffffffffffffff1661151d6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90614ddb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611662612276565b73ffffffffffffffffffffffffffffffffffffffff166116806116f3565b73ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614ddb565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117b55780601f1061178a576101008083540402835291602001916117b5565b820191906000526020600020905b81548152906001019060200180831161179857829003601f168201915b5050505050905090565b6117eb601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476128fa565b565b6117f5612276565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614c1b565b60405180910390fd5b8060056000611870612276565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661191d612276565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119629190614b03565b60405180910390a35050565b600c60009054906101000a900460ff16806119bb575061198c6116f3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190614efb565b60405180910390fd5b600d543414611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614e5b565b60405180910390fd5b611a4661227e565b50565b60608083830367ffffffffffffffff81118015611a6557600080fd5b50604051908082528060200260200182016040528015611a945781602001602082028036833780820191505090505b50905060008490505b83811015611ae05760106000828152602001908152602001600020548286830381518110611ac757fe5b6020026020010181815250508080600101915050611a9d565b508091505092915050565b611afc611af6612276565b83612451565b611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290614e9b565b60405180910390fd5b611b47848484846129ee565b50505050565b611b55612276565b73ffffffffffffffffffffffffffffffffffffffff16611b736116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090614ddb565b60405180910390fd5b6000611bd782600b54612a4a565b90506001611be3611eb9565b1015611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b90614cfb565b60405180910390fd5b600e54811115611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6090614d3b565b60405180910390fd5b80600e819055505050565b611c7c612276565b73ffffffffffffffffffffffffffffffffffffffff16611c9a6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790614ddb565b60405180910390fd5b6001600c60026101000a81548160ff021916908315150217905550565b6060611d1882612366565b611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90614e1b565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e005780601f10611dd557610100808354040283529160200191611e00565b820191906000526020600020905b815481529060010190602001808311611de357829003601f168201915b505050505090506060611e11611396565b9050600081511415611e27578192505050611e8b565b600082511115611e5c578082604051602001611e44929190614996565b60405160208183030381529060405292505050611e8b565b80611e6685612a63565b604051602001611e77929190614996565b604051602081830303815290604052925050505b919050565b600080611e9c836112ae565b601060008581526020019081526020016000205491509150915091565b6000600b54600e5403905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f89612276565b73ffffffffffffffffffffffffffffffffffffffff16611fa76116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614ddb565b60405180910390fd5b600c60019054906101000a900460ff161561204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614e7b565b60405180910390fd5b7fe8f30b9d9862f3798df7e4a021746bd26f66689199fed4a9f0a44c69da7f8cfe8160405161207c9190614b39565b60405180910390a180600f908051906020019061209a929190613727565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120cc612276565b73ffffffffffffffffffffffffffffffffffffffff166120ea6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614612140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213790614ddb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a790614bbb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b600033905090565b6000600161228a611eb9565b10156122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c290614d7b565b60405180910390fd5b60006001600b5401905080600b8190555060006122e6612baa565b90508060106000848152602001908152602001600020819055507f496d241fd8f974630e0bbc2c3e72a87eb83de274b7637d33ac4c6bb5050446d3333484846040516123359493929190614a51565b60405180910390a16123473383612cb6565b505090565b8060099080519060200190612362929190613727565b5050565b600061237c826002612e4490919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123f6836112ae565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061244a82600001612e5e565b9050919050565b600061245c82612366565b61249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614c9b565b60405180910390fd5b60006124a6836112ae565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061251557508373ffffffffffffffffffffffffffffffffffffffff166124fd84610e03565b73ffffffffffffffffffffffffffffffffffffffff16145b8061252657506125258185611eed565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661254f826112ae565b73ffffffffffffffffffffffffffffffffffffffff16146125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259c90614dfb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c90614bfb565b60405180910390fd5b612620838383612e6f565b61262b600082612383565b61267c81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e7490919063ffffffff16565b506126ce81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e8e90919063ffffffff16565b506126e581836002612ea89092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006127558360000183612edd565b60001c905092915050565b600061276b826112ae565b905061277981600084612e6f565b612784600083612383565b600060086000848152602001908152602001600020805460018160011615610100020316600290049050146127d3576008600083815260200190815260200160002060006127d291906137a7565b5b61282482600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e7490919063ffffffff16565b50612839826002612f4a90919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000806128ad8660000186612f64565b915091508160001c8160001c9350935050509250929050565b60006128d9846000018460001b84612fe7565b60001c90509392505050565b60006128f382600001613078565b9050919050565b8047101561293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293490614c5b565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612963906149ba565b60006040518083038185875af1925050503d80600081146129a0576040519150601f19603f3d011682016040523d82523d6000602084013e6129a5565b606091505b50509050806129e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e090614c3b565b60405180910390fd5b505050565b6129f984848461252f565b612a0584848484613089565b612a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3b90614b9b565b60405180910390fd5b50505050565b6000818311612a595781612a5b565b825b905092915050565b60606000821415612aab576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ba5565b600082905060005b60008214612ad5578080600101915050600a8281612acd57fe5b049150612ab3565b60608167ffffffffffffffff81118015612aee57600080fd5b506040519080825280601f01601f191660200182016040528015612b215781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612b9d57600a8481612b4257fe5b0660300160f81b82828060019003935081518110612b5c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612b9557fe5b049350612b30565b819450505050505b919050565b6000333a600b5443426001430340601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612c3591906149cf565b60206040518083038186803b158015612c4d57600080fd5b505afa158015612c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c859190613bfc565b604051602001612c9b97969594939291906148fe565b60405160208183030381529060405280519060200120905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d90614d9b565b60405180910390fd5b612d2f81612366565b15612d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6690614bdb565b60405180910390fd5b612d7b60008383612e6f565b612dcc81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e8e90919063ffffffff16565b50612de381836002612ea89092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612e56836000018360001b6131ed565b905092915050565b600081600001805490509050919050565b505050565b6000612e86836000018360001b613210565b905092915050565b6000612ea0836000018360001b6132f8565b905092915050565b6000612ed4846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613368565b90509392505050565b600081836000018054905011612f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1f90614b5b565b60405180910390fd5b826000018281548110612f3757fe5b9060005260206000200154905092915050565b6000612f5c836000018360001b613444565b905092915050565b60008082846000018054905011612fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa790614d5b565b60405180910390fd5b6000846000018481548110612fc157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130409190614b39565b60405180910390fd5b5084600001600182038154811061305c57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006130aa8473ffffffffffffffffffffffffffffffffffffffff1661355d565b6130b757600190506131e5565b606061317e63150b7a0260e01b6130cc612276565b8887876040516024016130e29493929190614a05565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161524d603291398773ffffffffffffffffffffffffffffffffffffffff166135709092919063ffffffff16565b90506000818060200190518101906131969190613b69565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146132ec576000600182039050600060018660000180549050039050600086600001828154811061325b57fe5b906000526020600020015490508087600001848154811061327857fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806132b057fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506132f2565b60009150505b92915050565b60006133048383613588565b61335d578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613362565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561340f5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061343d565b8285600001600183038154811061342257fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60008083600101600084815260200190815260200160002054905060008114613551576000600182039050600060018660000180549050039050600086600001828154811061348f57fe5b90600052602060002090600202019050808760000184815481106134af57fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061350257fe5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050613557565b60009150505b92915050565b600080823b905060008111915050919050565b606061357f84846000856135ab565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156135f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e790614c7b565b60405180910390fd5b6135f98561355d565b613638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362f90614ebb565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051613662919061497f565b60006040518083038185875af1925050503d806000811461369f576040519150601f19603f3d011682016040523d82523d6000602084013e6136a4565b606091505b50915091506136b48282866136c0565b92505050949350505050565b606083156136d057829050613720565b6000835111156136e35782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137179190614b39565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061376857805160ff1916838001178555613796565b82800160010185558215613796579182015b8281111561379557825182559160200191906001019061377a565b5b5090506137a391906137ef565b5090565b50805460018160011615610100020316600290046000825580601f106137cd57506137ec565b601f0160209004906000526020600020908101906137eb91906137ef565b5b50565b5b808211156138085760008160009055506001016137f0565b5090565b60008135905061381b816151d9565b92915050565b600081359050613830816151f0565b92915050565b60008135905061384581615207565b92915050565b60008135905061385a8161521e565b92915050565b60008151905061386f8161521e565b92915050565b600082601f83011261388657600080fd5b813561389961389482614f63565b614f36565b915080825260208301602083018583830111156138b557600080fd5b6138c0838284615141565b50505092915050565b600082601f8301126138da57600080fd5b81356138ed6138e882614f8f565b614f36565b9150808252602083016020830185838301111561390957600080fd5b613914838284615141565b50505092915050565b60008135905061392c81615235565b92915050565b60008151905061394181615235565b92915050565b60006020828403121561395957600080fd5b60006139678482850161380c565b91505092915050565b60006020828403121561398257600080fd5b600061399084828501613821565b91505092915050565b600080604083850312156139ac57600080fd5b60006139ba8582860161380c565b92505060206139cb8582860161380c565b9150509250929050565b6000806000606084860312156139ea57600080fd5b60006139f88682870161380c565b9350506020613a098682870161380c565b9250506040613a1a8682870161391d565b9150509250925092565b60008060008060808587031215613a3a57600080fd5b6000613a488782880161380c565b9450506020613a598782880161380c565b9350506040613a6a8782880161391d565b925050606085013567ffffffffffffffff811115613a8757600080fd5b613a9387828801613875565b91505092959194509250565b60008060408385031215613ab257600080fd5b6000613ac08582860161380c565b9250506020613ad185828601613836565b9150509250929050565b60008060408385031215613aee57600080fd5b6000613afc8582860161380c565b9250506020613b0d8582860161391d565b9150509250929050565b600060208284031215613b2957600080fd5b6000613b3784828501613836565b91505092915050565b600060208284031215613b5257600080fd5b6000613b608482850161384b565b91505092915050565b600060208284031215613b7b57600080fd5b6000613b8984828501613860565b91505092915050565b600060208284031215613ba457600080fd5b600082013567ffffffffffffffff811115613bbe57600080fd5b613bca848285016138c9565b91505092915050565b600060208284031215613be557600080fd5b6000613bf38482850161391d565b91505092915050565b600060208284031215613c0e57600080fd5b6000613c1c84828501613932565b91505092915050565b60008060408385031215613c3857600080fd5b6000613c468582860161391d565b9250506020613c578582860161391d565b9150509250929050565b6000613c6d8383613cc6565b60208301905092915050565b6000613c858383613daf565b60208301905092915050565b613c9a8161510b565b82525050565b613ca98161508d565b82525050565b613cc0613cbb8261508d565b615183565b82525050565b613ccf8161507b565b82525050565b613cde8161507b565b82525050565b6000613cef82614fdb565b613cf98185615021565b9350613d0483614fbb565b8060005b83811015613d35578151613d1c8882613c61565b9750613d2783615007565b925050600181019050613d08565b5085935050505092915050565b6000613d4d82614fe6565b613d578185615032565b9350613d6283614fcb565b8060005b83811015613d93578151613d7a8882613c79565b9750613d8583615014565b925050600181019050613d66565b5085935050505092915050565b613da98161509f565b82525050565b613db8816150ab565b82525050565b613dc7816150ab565b82525050565b613dde613dd9826150ab565b615195565b82525050565b6000613def82614ff1565b613df98185615043565b9350613e09818560208601615150565b613e12816151bb565b840191505092915050565b6000613e2882614ff1565b613e328185615054565b9350613e42818560208601615150565b80840191505092915050565b6000613e5982614ffc565b613e63818561505f565b9350613e73818560208601615150565b613e7c816151bb565b840191505092915050565b6000613e9282614ffc565b613e9c8185615070565b9350613eac818560208601615150565b80840191505092915050565b6000613ec560228361505f565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f2b60248361505f565b91507f63616e74206265206d6f7265207468616e206f6e65207069656365206578697360008301527f74696e67000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f9160328361505f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ff760268361505f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061405d601c8361505f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061409d60248361505f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061410360198361505f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614143603a8361505f565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006141a9601d8361505f565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006141e960268361505f565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061424f602c8361505f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142b560108361505f565b91507f746f6b656e20757269206c6f636b6564000000000000000000000000000000006000830152602082019050919050565b60006142f560388361505f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061435b60158361505f565b91507f6d757374206861766520706965636573206c65667400000000000000000000006000830152602082019050919050565b600061439b602a8361505f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061440160178361505f565b91507f63616e7420637265617465206d6f7265207069656365730000000000000000006000830152602082019050919050565b600061444160228361505f565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144a760138361505f565b91507f616c6c2070696563657320736f6c64206f7574000000000000000000000000006000830152602082019050919050565b60006144e760208361505f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614527602c8361505f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061458d60208361505f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006145cd60298361505f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614633602f8361505f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061469960218361505f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ff601b8361505f565b91507f6d7573742073656e6420696e20636f727265637420616d6f756e7400000000006000830152602082019050919050565b600061473f60118361505f565b91507f61727765617665206964206c6f636b65640000000000000000000000000000006000830152602082019050919050565b600061477f600083615054565b9150600082019050919050565b600061479960318361505f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006147ff601d8361505f565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061483f60308361505f565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b60006148a560138361505f565b91507f73616c65206d75737420626520616374697665000000000000000000000000006000830152602082019050919050565b6148e181615101565b82525050565b6148f86148f382615101565b6151b1565b82525050565b600061490a828a613caf565b60148201915061491a82896148e7565b60208201915061492a82886148e7565b60208201915061493a82876148e7565b60208201915061494a82866148e7565b60208201915061495a8285613dcd565b60208201915061496a82846148e7565b60208201915081905098975050505050505050565b600061498b8284613e1d565b915081905092915050565b60006149a28285613e87565b91506149ae8284613e87565b91508190509392505050565b60006149c582614772565b9150819050919050565b60006020820190506149e46000830184613cd5565b92915050565b60006020820190506149ff6000830184613ca0565b92915050565b6000608082019050614a1a6000830187613ca0565b614a276020830186613cd5565b614a3460408301856148d8565b8181036060830152614a468184613de4565b905095945050505050565b6000608082019050614a666000830187613c91565b614a7360208301866148d8565b614a8060408301856148d8565b614a8d6060830184613dbe565b95945050505050565b6000604082019050614aab6000830185613cd5565b614ab86020830184613dbe565b9392505050565b60006020820190508181036000830152614ad98184613ce4565b905092915050565b60006020820190508181036000830152614afb8184613d42565b905092915050565b6000602082019050614b186000830184613da0565b92915050565b6000602082019050614b336000830184613dbe565b92915050565b60006020820190508181036000830152614b538184613e4e565b905092915050565b60006020820190508181036000830152614b7481613eb8565b9050919050565b60006020820190508181036000830152614b9481613f1e565b9050919050565b60006020820190508181036000830152614bb481613f84565b9050919050565b60006020820190508181036000830152614bd481613fea565b9050919050565b60006020820190508181036000830152614bf481614050565b9050919050565b60006020820190508181036000830152614c1481614090565b9050919050565b60006020820190508181036000830152614c34816140f6565b9050919050565b60006020820190508181036000830152614c5481614136565b9050919050565b60006020820190508181036000830152614c748161419c565b9050919050565b60006020820190508181036000830152614c94816141dc565b9050919050565b60006020820190508181036000830152614cb481614242565b9050919050565b60006020820190508181036000830152614cd4816142a8565b9050919050565b60006020820190508181036000830152614cf4816142e8565b9050919050565b60006020820190508181036000830152614d148161434e565b9050919050565b60006020820190508181036000830152614d348161438e565b9050919050565b60006020820190508181036000830152614d54816143f4565b9050919050565b60006020820190508181036000830152614d7481614434565b9050919050565b60006020820190508181036000830152614d948161449a565b9050919050565b60006020820190508181036000830152614db4816144da565b9050919050565b60006020820190508181036000830152614dd48161451a565b9050919050565b60006020820190508181036000830152614df481614580565b9050919050565b60006020820190508181036000830152614e14816145c0565b9050919050565b60006020820190508181036000830152614e3481614626565b9050919050565b60006020820190508181036000830152614e548161468c565b9050919050565b60006020820190508181036000830152614e74816146f2565b9050919050565b60006020820190508181036000830152614e9481614732565b9050919050565b60006020820190508181036000830152614eb48161478c565b9050919050565b60006020820190508181036000830152614ed4816147f2565b9050919050565b60006020820190508181036000830152614ef481614832565b9050919050565b60006020820190508181036000830152614f1481614898565b9050919050565b6000602082019050614f3060008301846148d8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614f5957600080fd5b8060405250919050565b600067ffffffffffffffff821115614f7a57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614fa657600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615086826150e1565b9050919050565b6000615098826150e1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006151168261511d565b9050919050565b60006151288261512f565b9050919050565b600061513a826150e1565b9050919050565b82818337600083830152505050565b60005b8381101561516e578082015181840152602081019050615153565b8381111561517d576000848401525b50505050565b600061518e8261519f565b9050919050565b6000819050919050565b60006151aa826151cc565b9050919050565b6000819050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6151e28161507b565b81146151ed57600080fd5b50565b6151f98161508d565b811461520457600080fd5b50565b6152108161509f565b811461521b57600080fd5b50565b615227816150b5565b811461523257600080fd5b50565b61523e81615101565b811461524957600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212201026bccd3153247a7a30b9f73fe814467b0444686c105ed0a32b226460a4540c64736f6c634300060c003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001200000000000000000000000005d3b03b452b4bb528a77f5d1e6a1b53ed18786d7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc000000000000000000000000000000000000000000000000000000000000001968747470733a2f2f736f6c76656e63792e6172742f6170692f0000000000000000000000000000000000000000000000000000000000000000000000000000035442440000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061027d5760003560e01c80636c0360eb1161014f578063b88d4fde116100c1578063e7c597361161007a578063e7c5973614610968578063e985e9c514610993578063ef8a187c146109d0578063f2bcd022146109f9578063f2fde38b14610a24578063fe3c465714610a4d5761027d565b8063b88d4fde14610859578063be883a0414610882578063c0c53f51146108ab578063c87b56dd146108c2578063cc33c875146108ff578063e1d41a281461093d5761027d565b80638da5cb5b116101135780638da5cb5b1461077c57806395d89b41146107a7578063a0ef91df146107d2578063a22cb465146107e9578063a6f2ae3a14610812578063b5c904b91461081c5761027d565b80636c0360eb146106a957806370a08231146106d4578063715018a61461071157806383472fcf14610728578063841718a6146107535761027d565b806323b872dd116101f3578063575ca2c7116101ac578063575ca2c714610583578063620a2358146105ae578063621a1f74146105d95780636352211e1461061657806368428a1b146106535780636b1786be1461067e5761027d565b806323b872dd146104775780632d589345146104a05780632f745c59146104b757806342842e0e146104f457806342966c681461051d5780634f6ccce7146105465761027d565b8063081812fc11610245578063081812fc14610367578063095ea7b3146103a457806318160ddd146103cd5780631e8e9e22146103f857806320fb9e8a1461042357806321b8092e1461044e5761027d565b806301ffc9a71461028257806304822058146102bf57806305ea13fb146102fc5780630675b7c61461031357806306fdde031461033c575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613b40565b610a78565b6040516102b69190614b03565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613c25565b610adf565b6040516102f39190614abf565b60405180910390f35b34801561030857600080fd5b50610311610ba4565b005b34801561031f57600080fd5b5061033a60048036038101906103359190613b92565b610c89565b005b34801561034857600080fd5b50610351610d61565b60405161035e9190614b39565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613bd3565b610e03565b60405161039b91906149cf565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c69190613adb565b610e88565b005b3480156103d957600080fd5b506103e2610fa0565b6040516103ef9190614f1b565b60405180910390f35b34801561040457600080fd5b5061040d610fb1565b60405161041a9190614b03565b60405180910390f35b34801561042f57600080fd5b50610438610fc4565b6040516104459190614b03565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190613970565b610fd7565b005b34801561048357600080fd5b5061049e600480360381019061049991906139d5565b611097565b005b3480156104ac57600080fd5b506104b56110f7565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613adb565b611190565b6040516104eb9190614f1b565b60405180910390f35b34801561050057600080fd5b5061051b600480360381019061051691906139d5565b6111eb565b005b34801561052957600080fd5b50610544600480360381019061053f9190613bd3565b61120b565b005b34801561055257600080fd5b5061056d60048036038101906105689190613bd3565b611267565b60405161057a9190614f1b565b60405180910390f35b34801561058f57600080fd5b5061059861128a565b6040516105a59190614f1b565b60405180910390f35b3480156105ba57600080fd5b506105c3611290565b6040516105d09190614f1b565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190613bd3565b611296565b60405161060d9190614b1e565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190613bd3565b6112ae565b60405161064a91906149cf565b60405180910390f35b34801561065f57600080fd5b506106686112e5565b6040516106759190614b03565b60405180910390f35b34801561068a57600080fd5b506106936112f8565b6040516106a09190614b39565b60405180910390f35b3480156106b557600080fd5b506106be611396565b6040516106cb9190614b39565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f69190613947565b611438565b6040516107089190614f1b565b60405180910390f35b34801561071d57600080fd5b506107266114f7565b005b34801561073457600080fd5b5061073d611634565b60405161074a91906149cf565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613b17565b61165a565b005b34801561078857600080fd5b506107916116f3565b60405161079e91906149cf565b60405180910390f35b3480156107b357600080fd5b506107bc61171d565b6040516107c99190614b39565b60405180910390f35b3480156107de57600080fd5b506107e76117bf565b005b3480156107f557600080fd5b50610810600480360381019061080b9190613a9f565b6117ed565b005b61081a61196e565b005b34801561082857600080fd5b50610843600480360381019061083e9190613c25565b611a49565b6040516108509190614ae1565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190613a24565b611aeb565b005b34801561088e57600080fd5b506108a960048036038101906108a49190613bd3565b611b4d565b005b3480156108b757600080fd5b506108c0611c74565b005b3480156108ce57600080fd5b506108e960048036038101906108e49190613bd3565b611d0d565b6040516108f69190614b39565b60405180910390f35b34801561090b57600080fd5b5061092660048036038101906109219190613bd3565b611e90565b604051610934929190614a96565b60405180910390f35b34801561094957600080fd5b50610952611eb9565b60405161095f9190614f1b565b60405180910390f35b34801561097457600080fd5b5061097d611ec7565b60405161098a91906149cf565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190613999565b611eed565b6040516109c79190614b03565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613b92565b611f81565b005b348015610a0557600080fd5b50610a0e61209e565b604051610a1b91906149ea565b60405180910390f35b348015610a3057600080fd5b50610a4b6004803603810190610a469190613947565b6120c4565b005b348015610a5957600080fd5b50610a62612270565b604051610a6f9190614f1b565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60608083830367ffffffffffffffff81118015610afb57600080fd5b50604051908082528060200260200182016040528015610b2a5781602001602082028036833780820191505090505b50905060008490505b83811015610b9957610b44816112ae565b8286830381518110610b5257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610b33565b508091505092915050565b610bac612276565b73ffffffffffffffffffffffffffffffffffffffff16610bca6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1790614ddb565b60405180910390fd5b6001600b541115610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90614b7b565b60405180910390fd5b60005b6009811015610c8657610c7a61227e565b50806001019050610c69565b50565b610c91612276565b73ffffffffffffffffffffffffffffffffffffffff16610caf6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc90614ddb565b60405180910390fd5b600c60029054906101000a900460ff1615610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c90614cbb565b60405180910390fd5b610d5e8161234c565b50565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610df95780601f10610dce57610100808354040283529160200191610df9565b820191906000526020600020905b815481529060010190602001808311610ddc57829003601f168201915b5050505050905090565b6000610e0e82612366565b610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4490614dbb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e93826112ae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614e3b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f23612276565b73ffffffffffffffffffffffffffffffffffffffff161480610f525750610f5181610f4c612276565b611eed565b5b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890614cdb565b60405180910390fd5b610f9b8383612383565b505050565b6000610fac600261243c565b905090565b600c60019054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b610fdf612276565b73ffffffffffffffffffffffffffffffffffffffff16610ffd6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90614ddb565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110a86110a2612276565b82612451565b6110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90614e9b565b60405180910390fd5b6110f283838361252f565b505050565b6110ff612276565b73ffffffffffffffffffffffffffffffffffffffff1661111d6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614ddb565b60405180910390fd5b6001600c60016101000a81548160ff021916908315150217905550565b60006111e382600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061274690919063ffffffff16565b905092915050565b61120683838360405180602001604052806000815250611aeb565b505050565b61121c611216612276565b82612451565b61125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125290614edb565b60405180910390fd5b61126481612760565b50565b60008061127e83600261289a90919063ffffffff16565b50905080915050919050565b600d5481565b600b5481565b60106020528060005260406000206000915090505481565b60006112de8260405180606001604052806029815260200161527f6029913960026128c69092919063ffffffff16565b9050919050565b600c60009054906101000a900460ff1681565b600f8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561138e5780601f106113635761010080835404028352916020019161138e565b820191906000526020600020905b81548152906001019060200180831161137157829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561142e5780601f106114035761010080835404028352916020019161142e565b820191906000526020600020905b81548152906001019060200180831161141157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a090614d1b565b60405180910390fd5b6114f0600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128e5565b9050919050565b6114ff612276565b73ffffffffffffffffffffffffffffffffffffffff1661151d6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90614ddb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611662612276565b73ffffffffffffffffffffffffffffffffffffffff166116806116f3565b73ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614ddb565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117b55780601f1061178a576101008083540402835291602001916117b5565b820191906000526020600020905b81548152906001019060200180831161179857829003601f168201915b5050505050905090565b6117eb601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476128fa565b565b6117f5612276565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614c1b565b60405180910390fd5b8060056000611870612276565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661191d612276565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119629190614b03565b60405180910390a35050565b600c60009054906101000a900460ff16806119bb575061198c6116f3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190614efb565b60405180910390fd5b600d543414611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614e5b565b60405180910390fd5b611a4661227e565b50565b60608083830367ffffffffffffffff81118015611a6557600080fd5b50604051908082528060200260200182016040528015611a945781602001602082028036833780820191505090505b50905060008490505b83811015611ae05760106000828152602001908152602001600020548286830381518110611ac757fe5b6020026020010181815250508080600101915050611a9d565b508091505092915050565b611afc611af6612276565b83612451565b611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290614e9b565b60405180910390fd5b611b47848484846129ee565b50505050565b611b55612276565b73ffffffffffffffffffffffffffffffffffffffff16611b736116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090614ddb565b60405180910390fd5b6000611bd782600b54612a4a565b90506001611be3611eb9565b1015611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b90614cfb565b60405180910390fd5b600e54811115611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6090614d3b565b60405180910390fd5b80600e819055505050565b611c7c612276565b73ffffffffffffffffffffffffffffffffffffffff16611c9a6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790614ddb565b60405180910390fd5b6001600c60026101000a81548160ff021916908315150217905550565b6060611d1882612366565b611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90614e1b565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e005780601f10611dd557610100808354040283529160200191611e00565b820191906000526020600020905b815481529060010190602001808311611de357829003601f168201915b505050505090506060611e11611396565b9050600081511415611e27578192505050611e8b565b600082511115611e5c578082604051602001611e44929190614996565b60405160208183030381529060405292505050611e8b565b80611e6685612a63565b604051602001611e77929190614996565b604051602081830303815290604052925050505b919050565b600080611e9c836112ae565b601060008581526020019081526020016000205491509150915091565b6000600b54600e5403905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f89612276565b73ffffffffffffffffffffffffffffffffffffffff16611fa76116f3565b73ffffffffffffffffffffffffffffffffffffffff1614611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614ddb565b60405180910390fd5b600c60019054906101000a900460ff161561204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614e7b565b60405180910390fd5b7fe8f30b9d9862f3798df7e4a021746bd26f66689199fed4a9f0a44c69da7f8cfe8160405161207c9190614b39565b60405180910390a180600f908051906020019061209a929190613727565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120cc612276565b73ffffffffffffffffffffffffffffffffffffffff166120ea6116f3565b73ffffffffffffffffffffffffffffffffffffffff1614612140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213790614ddb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a790614bbb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b600033905090565b6000600161228a611eb9565b10156122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c290614d7b565b60405180910390fd5b60006001600b5401905080600b8190555060006122e6612baa565b90508060106000848152602001908152602001600020819055507f496d241fd8f974630e0bbc2c3e72a87eb83de274b7637d33ac4c6bb5050446d3333484846040516123359493929190614a51565b60405180910390a16123473383612cb6565b505090565b8060099080519060200190612362929190613727565b5050565b600061237c826002612e4490919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123f6836112ae565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061244a82600001612e5e565b9050919050565b600061245c82612366565b61249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614c9b565b60405180910390fd5b60006124a6836112ae565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061251557508373ffffffffffffffffffffffffffffffffffffffff166124fd84610e03565b73ffffffffffffffffffffffffffffffffffffffff16145b8061252657506125258185611eed565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661254f826112ae565b73ffffffffffffffffffffffffffffffffffffffff16146125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259c90614dfb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c90614bfb565b60405180910390fd5b612620838383612e6f565b61262b600082612383565b61267c81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e7490919063ffffffff16565b506126ce81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e8e90919063ffffffff16565b506126e581836002612ea89092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006127558360000183612edd565b60001c905092915050565b600061276b826112ae565b905061277981600084612e6f565b612784600083612383565b600060086000848152602001908152602001600020805460018160011615610100020316600290049050146127d3576008600083815260200190815260200160002060006127d291906137a7565b5b61282482600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e7490919063ffffffff16565b50612839826002612f4a90919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000806128ad8660000186612f64565b915091508160001c8160001c9350935050509250929050565b60006128d9846000018460001b84612fe7565b60001c90509392505050565b60006128f382600001613078565b9050919050565b8047101561293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293490614c5b565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612963906149ba565b60006040518083038185875af1925050503d80600081146129a0576040519150601f19603f3d011682016040523d82523d6000602084013e6129a5565b606091505b50509050806129e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e090614c3b565b60405180910390fd5b505050565b6129f984848461252f565b612a0584848484613089565b612a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3b90614b9b565b60405180910390fd5b50505050565b6000818311612a595781612a5b565b825b905092915050565b60606000821415612aab576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ba5565b600082905060005b60008214612ad5578080600101915050600a8281612acd57fe5b049150612ab3565b60608167ffffffffffffffff81118015612aee57600080fd5b506040519080825280601f01601f191660200182016040528015612b215781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612b9d57600a8481612b4257fe5b0660300160f81b82828060019003935081518110612b5c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612b9557fe5b049350612b30565b819450505050505b919050565b6000333a600b5443426001430340601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612c3591906149cf565b60206040518083038186803b158015612c4d57600080fd5b505afa158015612c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c859190613bfc565b604051602001612c9b97969594939291906148fe565b60405160208183030381529060405280519060200120905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d90614d9b565b60405180910390fd5b612d2f81612366565b15612d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6690614bdb565b60405180910390fd5b612d7b60008383612e6f565b612dcc81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e8e90919063ffffffff16565b50612de381836002612ea89092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612e56836000018360001b6131ed565b905092915050565b600081600001805490509050919050565b505050565b6000612e86836000018360001b613210565b905092915050565b6000612ea0836000018360001b6132f8565b905092915050565b6000612ed4846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613368565b90509392505050565b600081836000018054905011612f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1f90614b5b565b60405180910390fd5b826000018281548110612f3757fe5b9060005260206000200154905092915050565b6000612f5c836000018360001b613444565b905092915050565b60008082846000018054905011612fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa790614d5b565b60405180910390fd5b6000846000018481548110612fc157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130409190614b39565b60405180910390fd5b5084600001600182038154811061305c57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006130aa8473ffffffffffffffffffffffffffffffffffffffff1661355d565b6130b757600190506131e5565b606061317e63150b7a0260e01b6130cc612276565b8887876040516024016130e29493929190614a05565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161524d603291398773ffffffffffffffffffffffffffffffffffffffff166135709092919063ffffffff16565b90506000818060200190518101906131969190613b69565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146132ec576000600182039050600060018660000180549050039050600086600001828154811061325b57fe5b906000526020600020015490508087600001848154811061327857fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806132b057fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506132f2565b60009150505b92915050565b60006133048383613588565b61335d578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613362565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561340f5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061343d565b8285600001600183038154811061342257fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60008083600101600084815260200190815260200160002054905060008114613551576000600182039050600060018660000180549050039050600086600001828154811061348f57fe5b90600052602060002090600202019050808760000184815481106134af57fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061350257fe5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050613557565b60009150505b92915050565b600080823b905060008111915050919050565b606061357f84846000856135ab565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156135f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e790614c7b565b60405180910390fd5b6135f98561355d565b613638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362f90614ebb565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051613662919061497f565b60006040518083038185875af1925050503d806000811461369f576040519150601f19603f3d011682016040523d82523d6000602084013e6136a4565b606091505b50915091506136b48282866136c0565b92505050949350505050565b606083156136d057829050613720565b6000835111156136e35782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137179190614b39565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061376857805160ff1916838001178555613796565b82800160010185558215613796579182015b8281111561379557825182559160200191906001019061377a565b5b5090506137a391906137ef565b5090565b50805460018160011615610100020316600290046000825580601f106137cd57506137ec565b601f0160209004906000526020600020908101906137eb91906137ef565b5b50565b5b808211156138085760008160009055506001016137f0565b5090565b60008135905061381b816151d9565b92915050565b600081359050613830816151f0565b92915050565b60008135905061384581615207565b92915050565b60008135905061385a8161521e565b92915050565b60008151905061386f8161521e565b92915050565b600082601f83011261388657600080fd5b813561389961389482614f63565b614f36565b915080825260208301602083018583830111156138b557600080fd5b6138c0838284615141565b50505092915050565b600082601f8301126138da57600080fd5b81356138ed6138e882614f8f565b614f36565b9150808252602083016020830185838301111561390957600080fd5b613914838284615141565b50505092915050565b60008135905061392c81615235565b92915050565b60008151905061394181615235565b92915050565b60006020828403121561395957600080fd5b60006139678482850161380c565b91505092915050565b60006020828403121561398257600080fd5b600061399084828501613821565b91505092915050565b600080604083850312156139ac57600080fd5b60006139ba8582860161380c565b92505060206139cb8582860161380c565b9150509250929050565b6000806000606084860312156139ea57600080fd5b60006139f88682870161380c565b9350506020613a098682870161380c565b9250506040613a1a8682870161391d565b9150509250925092565b60008060008060808587031215613a3a57600080fd5b6000613a488782880161380c565b9450506020613a598782880161380c565b9350506040613a6a8782880161391d565b925050606085013567ffffffffffffffff811115613a8757600080fd5b613a9387828801613875565b91505092959194509250565b60008060408385031215613ab257600080fd5b6000613ac08582860161380c565b9250506020613ad185828601613836565b9150509250929050565b60008060408385031215613aee57600080fd5b6000613afc8582860161380c565b9250506020613b0d8582860161391d565b9150509250929050565b600060208284031215613b2957600080fd5b6000613b3784828501613836565b91505092915050565b600060208284031215613b5257600080fd5b6000613b608482850161384b565b91505092915050565b600060208284031215613b7b57600080fd5b6000613b8984828501613860565b91505092915050565b600060208284031215613ba457600080fd5b600082013567ffffffffffffffff811115613bbe57600080fd5b613bca848285016138c9565b91505092915050565b600060208284031215613be557600080fd5b6000613bf38482850161391d565b91505092915050565b600060208284031215613c0e57600080fd5b6000613c1c84828501613932565b91505092915050565b60008060408385031215613c3857600080fd5b6000613c468582860161391d565b9250506020613c578582860161391d565b9150509250929050565b6000613c6d8383613cc6565b60208301905092915050565b6000613c858383613daf565b60208301905092915050565b613c9a8161510b565b82525050565b613ca98161508d565b82525050565b613cc0613cbb8261508d565b615183565b82525050565b613ccf8161507b565b82525050565b613cde8161507b565b82525050565b6000613cef82614fdb565b613cf98185615021565b9350613d0483614fbb565b8060005b83811015613d35578151613d1c8882613c61565b9750613d2783615007565b925050600181019050613d08565b5085935050505092915050565b6000613d4d82614fe6565b613d578185615032565b9350613d6283614fcb565b8060005b83811015613d93578151613d7a8882613c79565b9750613d8583615014565b925050600181019050613d66565b5085935050505092915050565b613da98161509f565b82525050565b613db8816150ab565b82525050565b613dc7816150ab565b82525050565b613dde613dd9826150ab565b615195565b82525050565b6000613def82614ff1565b613df98185615043565b9350613e09818560208601615150565b613e12816151bb565b840191505092915050565b6000613e2882614ff1565b613e328185615054565b9350613e42818560208601615150565b80840191505092915050565b6000613e5982614ffc565b613e63818561505f565b9350613e73818560208601615150565b613e7c816151bb565b840191505092915050565b6000613e9282614ffc565b613e9c8185615070565b9350613eac818560208601615150565b80840191505092915050565b6000613ec560228361505f565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f2b60248361505f565b91507f63616e74206265206d6f7265207468616e206f6e65207069656365206578697360008301527f74696e67000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f9160328361505f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ff760268361505f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061405d601c8361505f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061409d60248361505f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061410360198361505f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614143603a8361505f565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006141a9601d8361505f565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006141e960268361505f565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061424f602c8361505f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142b560108361505f565b91507f746f6b656e20757269206c6f636b6564000000000000000000000000000000006000830152602082019050919050565b60006142f560388361505f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061435b60158361505f565b91507f6d757374206861766520706965636573206c65667400000000000000000000006000830152602082019050919050565b600061439b602a8361505f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061440160178361505f565b91507f63616e7420637265617465206d6f7265207069656365730000000000000000006000830152602082019050919050565b600061444160228361505f565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144a760138361505f565b91507f616c6c2070696563657320736f6c64206f7574000000000000000000000000006000830152602082019050919050565b60006144e760208361505f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614527602c8361505f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061458d60208361505f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006145cd60298361505f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614633602f8361505f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061469960218361505f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ff601b8361505f565b91507f6d7573742073656e6420696e20636f727265637420616d6f756e7400000000006000830152602082019050919050565b600061473f60118361505f565b91507f61727765617665206964206c6f636b65640000000000000000000000000000006000830152602082019050919050565b600061477f600083615054565b9150600082019050919050565b600061479960318361505f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006147ff601d8361505f565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061483f60308361505f565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b60006148a560138361505f565b91507f73616c65206d75737420626520616374697665000000000000000000000000006000830152602082019050919050565b6148e181615101565b82525050565b6148f86148f382615101565b6151b1565b82525050565b600061490a828a613caf565b60148201915061491a82896148e7565b60208201915061492a82886148e7565b60208201915061493a82876148e7565b60208201915061494a82866148e7565b60208201915061495a8285613dcd565b60208201915061496a82846148e7565b60208201915081905098975050505050505050565b600061498b8284613e1d565b915081905092915050565b60006149a28285613e87565b91506149ae8284613e87565b91508190509392505050565b60006149c582614772565b9150819050919050565b60006020820190506149e46000830184613cd5565b92915050565b60006020820190506149ff6000830184613ca0565b92915050565b6000608082019050614a1a6000830187613ca0565b614a276020830186613cd5565b614a3460408301856148d8565b8181036060830152614a468184613de4565b905095945050505050565b6000608082019050614a666000830187613c91565b614a7360208301866148d8565b614a8060408301856148d8565b614a8d6060830184613dbe565b95945050505050565b6000604082019050614aab6000830185613cd5565b614ab86020830184613dbe565b9392505050565b60006020820190508181036000830152614ad98184613ce4565b905092915050565b60006020820190508181036000830152614afb8184613d42565b905092915050565b6000602082019050614b186000830184613da0565b92915050565b6000602082019050614b336000830184613dbe565b92915050565b60006020820190508181036000830152614b538184613e4e565b905092915050565b60006020820190508181036000830152614b7481613eb8565b9050919050565b60006020820190508181036000830152614b9481613f1e565b9050919050565b60006020820190508181036000830152614bb481613f84565b9050919050565b60006020820190508181036000830152614bd481613fea565b9050919050565b60006020820190508181036000830152614bf481614050565b9050919050565b60006020820190508181036000830152614c1481614090565b9050919050565b60006020820190508181036000830152614c34816140f6565b9050919050565b60006020820190508181036000830152614c5481614136565b9050919050565b60006020820190508181036000830152614c748161419c565b9050919050565b60006020820190508181036000830152614c94816141dc565b9050919050565b60006020820190508181036000830152614cb481614242565b9050919050565b60006020820190508181036000830152614cd4816142a8565b9050919050565b60006020820190508181036000830152614cf4816142e8565b9050919050565b60006020820190508181036000830152614d148161434e565b9050919050565b60006020820190508181036000830152614d348161438e565b9050919050565b60006020820190508181036000830152614d54816143f4565b9050919050565b60006020820190508181036000830152614d7481614434565b9050919050565b60006020820190508181036000830152614d948161449a565b9050919050565b60006020820190508181036000830152614db4816144da565b9050919050565b60006020820190508181036000830152614dd48161451a565b9050919050565b60006020820190508181036000830152614df481614580565b9050919050565b60006020820190508181036000830152614e14816145c0565b9050919050565b60006020820190508181036000830152614e3481614626565b9050919050565b60006020820190508181036000830152614e548161468c565b9050919050565b60006020820190508181036000830152614e74816146f2565b9050919050565b60006020820190508181036000830152614e9481614732565b9050919050565b60006020820190508181036000830152614eb48161478c565b9050919050565b60006020820190508181036000830152614ed4816147f2565b9050919050565b60006020820190508181036000830152614ef481614832565b9050919050565b60006020820190508181036000830152614f1481614898565b9050919050565b6000602082019050614f3060008301846148d8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614f5957600080fd5b8060405250919050565b600067ffffffffffffffff821115614f7a57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614fa657600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615086826150e1565b9050919050565b6000615098826150e1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006151168261511d565b9050919050565b60006151288261512f565b9050919050565b600061513a826150e1565b9050919050565b82818337600083830152505050565b60005b8381101561516e578082015181840152602081019050615153565b8381111561517d576000848401525b50505050565b600061518e8261519f565b9050919050565b6000819050919050565b60006151aa826151cc565b9050919050565b6000819050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6151e28161507b565b81146151ed57600080fd5b50565b6151f98161508d565b811461520457600080fd5b50565b6152108161509f565b811461521b57600080fd5b50565b615227816150b5565b811461523257600080fd5b50565b61523e81615101565b811461524957600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212201026bccd3153247a7a30b9f73fe814467b0444686c105ed0a32b226460a4540c64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001200000000000000000000000005d3b03b452b4bb528a77f5d1e6a1b53ed18786d7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc000000000000000000000000000000000000000000000000000000000000001968747470733a2f2f736f6c76656e63792e6172742f6170692f0000000000000000000000000000000000000000000000000000000000000000000000000000035442440000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : givenTokenUriBase (string): https://solvency.art/api/
Arg [1] : givenPricePerPiece (uint256): 400000000000000000
Arg [2] : givenMaxNumberOfPieces (uint256): 500
Arg [3] : givenArweaveId (string): TBD
Arg [4] : givenWithdrawalAddress (address): 0x5d3B03b452B4bb528a77F5d1E6A1b53ed18786d7
Arg [5] : givenOracleToken (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [6] : givenOracleAccount (address): 0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 000000000000000000000000000000000000000000000000058d15e176280000
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000005d3b03b452b4bb528a77f5d1e6a1b53ed18786d7
Arg [5] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [6] : 000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [8] : 68747470733a2f2f736f6c76656e63792e6172742f6170692f00000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 5442440000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
70967:5082:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13171:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74395:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72474:211;;;;;;;;;;;;;:::i;:::-;;73003:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54509:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57295:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56825:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56303:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71090:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71124:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73496:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58185:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73405:83;;;;;;;;;;;;;:::i;:::-;;56065:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58561:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67796:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56591:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71157:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71027:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71261:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54265:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71061:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71231:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55884:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53982:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3375:148;;;;;;;;;;;;;:::i;:::-;;71363:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72811:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2724:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54678:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74128:108;;;;;;;;;;;;;:::i;:::-;;57588:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72250:216;;;:::i;:::-;;74709:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58783:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73675:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72914:81;;;;;;;;;;;;;:::i;:::-;;54853:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74244:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;72693:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71396:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57954:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73178:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71316:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3678:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71192:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13171:150;13256:4;13280:20;:33;13301:11;13280:33;;;;;;;;;;;;;;;;;;;;;;;;;;;13273:40;;13171:150;;;:::o;74395:306::-;74490:16;74524:19;74566:5;74560:3;:11;74546:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74524:48;;74588:9;74600:5;74588:17;;74583:91;74611:3;74607:1;:7;74583:91;;;74652:10;74660:1;74652:7;:10::i;:::-;74636:2;74643:5;74639:1;:9;74636:13;;;;;;;;;;;;;:26;;;;;;;;;;;74616:3;;;;;;;74583:91;;;;74691:2;74684:9;;;74395:306;;;;:::o;72474:211::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72554:1:::1;72538:12;;:17;;72530:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;72612:9;72607:71;72631:1;72627;:5;72607:71;;;72654:12;:10;:12::i;:::-;;72634:3;;;;;72607:71;;;;72474:211::o:0;73003:167::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73090:14:::1;;;;;;;;;;;73089:15;73081:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;73136:26;73148:13;73136:11;:26::i;:::-;73003:167:::0;:::o;54509:100::-;54563:13;54596:5;54589:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54509:100;:::o;57295:221::-;57371:7;57399:16;57407:7;57399;:16::i;:::-;57391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57484:15;:24;57500:7;57484:24;;;;;;;;;;;;;;;;;;;;;57477:31;;57295:221;;;:::o;56825:404::-;56906:13;56922:23;56937:7;56922:14;:23::i;:::-;56906:39;;56970:5;56964:11;;:2;:11;;;;56956:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;57050:5;57034:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;57059:44;57083:5;57090:12;:10;:12::i;:::-;57059:23;:44::i;:::-;57034:69;57026:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;57200:21;57209:2;57213:7;57200:8;:21::i;:::-;56825:404;;;:::o;56303:211::-;56364:7;56485:21;:12;:19;:21::i;:::-;56478:28;;56303:211;:::o;71090:27::-;;;;;;;;;;;;;:::o;71124:26::-;;;;;;;;;;;;;:::o;73496:171::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73637:22:::1;73617:17;;:42;;;;;;;;;;;;;;;;;;73496:171:::0;:::o;58185:305::-;58346:41;58365:12;:10;:12::i;:::-;58379:7;58346:18;:41::i;:::-;58338:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;58454:28;58464:4;58470:2;58474:7;58454:9;:28::i;:::-;58185:305;;;:::o;73405:83::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73476:4:::1;73458:15;;:22;;;;;;;;;;;;;;;;;;73405:83::o:0;56065:162::-;56162:7;56189:30;56213:5;56189:13;:20;56203:5;56189:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;56182:37;;56065:162;;;;:::o;58561:151::-;58665:39;58682:4;58688:2;58692:7;58665:39;;;;;;;;;;;;:16;:39::i;:::-;58561:151;;;:::o;67796:245::-;67914:41;67933:12;:10;:12::i;:::-;67947:7;67914:18;:41::i;:::-;67906:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;68019:14;68025:7;68019:5;:14::i;:::-;67796:245;:::o;56591:172::-;56666:7;56687:15;56708:22;56724:5;56708:12;:15;;:22;;;;:::i;:::-;56686:44;;;56748:7;56741:14;;;56591:172;;;:::o;71157:28::-;;;;:::o;71027:27::-;;;;:::o;71261:48::-;;;;;;;;;;;;;;;;;:::o;54265:177::-;54337:7;54364:70;54381:7;54364:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;54357:77;;54265:177;;;:::o;71061:22::-;;;;;;;;;;;;;:::o;71231:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55884:97::-;55932:13;55965:8;55958:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55884:97;:::o;53982:221::-;54054:7;54099:1;54082:19;;:5;:19;;;;54074:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;54166:29;:13;:20;54180:5;54166:20;;;;;;;;;;;;;;;:27;:29::i;:::-;54159:36;;53982:221;;;:::o;3375:148::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3482:1:::1;3445:40;;3466:6;;;;;;;;;;;3445:40;;;;;;;;;;;;3513:1;3496:6;;:19;;;;;;;;;;;;;;;;;;3375:148::o:0;71363:26::-;;;;;;;;;;;;;:::o;72811:95::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72890:8:::1;72877:10;;:21;;;;;;;;;;;;;;;;;;72811:95:::0;:::o;2724:87::-;2770:7;2797:6;;;;;;;;;;;2790:13;;2724:87;:::o;54678:104::-;54734:13;54767:7;54760:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54678:104;:::o;74128:108::-;74169:59;74187:17;;;;;;;;;;;74206:21;74169:17;:59::i;:::-;74128:108::o;57588:295::-;57703:12;:10;:12::i;:::-;57691:24;;:8;:24;;;;57683:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57803:8;57758:18;:32;57777:12;:10;:12::i;:::-;57758:32;;;;;;;;;;;;;;;:42;57791:8;57758:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;57856:8;57827:48;;57842:12;:10;:12::i;:::-;57827:48;;;57866:8;57827:48;;;;;;:::i;:::-;;;;;;;;57588:295;;:::o;72250:216::-;72299:10;;;;;;;;;;;:35;;;;72327:7;:5;:7::i;:::-;72313:21;;:10;:21;;;72299:35;72291:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;72390:13;;72377:9;:26;72369:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;72446:12;:10;:12::i;:::-;;72250:216::o;74709:317::-;74809:16;74843:19;74885:5;74879:3;:11;74865:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74843:48;;74907:9;74919:5;74907:17;;74902:97;74930:3;74926:1;:7;74902:97;;;74971:13;:16;74985:1;74971:16;;;;;;;;;;;;74955:2;74962:5;74958:1;:9;74955:13;;;;;;;;;;;;;:32;;;;;74935:3;;;;;;;74902:97;;;;75016:2;75009:9;;;74709:317;;;;:::o;58783:285::-;58915:41;58934:12;:10;:12::i;:::-;58948:7;58915:18;:41::i;:::-;58907:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;59021:39;59035:4;59041:2;59045:7;59054:5;59021:13;:39::i;:::-;58783:285;;;;:::o;73675:445::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73788:28:::1;73832:42;73837:22;73861:12;;73832:4;:42::i;:::-;73788:86;;73909:1;73893:12;:10;:12::i;:::-;:17;;73885:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;73993:17;;73969:20;:41;;73947:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;74092:20;74072:17;:40;;;;3015:1;73675:445:::0;:::o;72914:81::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72983:4:::1;72966:14;;:21;;;;;;;;;;;;;;;;;;72914:81::o:0;54853:792::-;54926:13;54960:16;54968:7;54960;:16::i;:::-;54952:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55041:23;55067:10;:19;55078:7;55067:19;;;;;;;;;;;55041:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55097:18;55118:9;:7;:9::i;:::-;55097:30;;55225:1;55209:4;55203:18;:23;55199:72;;;55250:9;55243:16;;;;;;55199:72;55401:1;55381:9;55375:23;:27;55371:108;;;55450:4;55456:9;55433:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55419:48;;;;;;55371:108;55611:4;55617:18;:7;:16;:18::i;:::-;55594:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55580:57;;;;54853:792;;;;:::o;74244:143::-;74301:7;74310;74338:16;74346:7;74338;:16::i;:::-;74356:13;:22;74370:7;74356:22;;;;;;;;;;;;74330:49;;;;74244:143;;;:::o;72693:110::-;72736:7;72783:12;;72763:17;;:32;72756:39;;72693:110;:::o;71396:28::-;;;;;;;;;;;;;:::o;57954:164::-;58051:4;58075:18;:25;58094:5;58075:25;;;;;;;;;;;;;;;:35;58101:8;58075:35;;;;;;;;;;;;;;;;;;;;;;;;;58068:42;;57954:164;;;;:::o;73178:219::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73267:15:::1;;;;;;;;;;;73266:16;73258:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73320:32;73337:14;73320:32;;;;;;:::i;:::-;;;;;;;;73375:14;73363:9;:26;;;;;;;;;;;;:::i;:::-;;73178:219:::0;:::o;71316:40::-;;;;;;;;;;;;;:::o;3678:244::-;2955:12;:10;:12::i;:::-;2944:23;;:7;:5;:7::i;:::-;:23;;;2936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3787:1:::1;3767:22;;:8;:22;;;;3759:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3877:8;3848:38;;3869:6;;;;;;;;;;;3848:38;;;;;;;;;;;;3906:8;3897:6;;:17;;;;;;;;;;;;;;;;;;3678:244:::0;:::o;71192:32::-;;;;:::o;1253:106::-;1306:15;1341:10;1334:17;;1253:106;:::o;75034:421::-;75073:7;75117:1;75101:12;:10;:12::i;:::-;:17;;75093:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;75155:18;75191:1;75176:12;;:16;75155:37;;75218:10;75203:12;:25;;;;75241:20;75264:19;:17;:19::i;:::-;75241:42;;75322:12;75294:13;:25;75308:10;75294:25;;;;;;;;;;;:40;;;;75350:57;75359:10;75371:9;75382:10;75394:12;75350:57;;;;;;;;;:::i;:::-;;;;;;;;75418:29;75424:10;75436;75418:5;:29::i;:::-;75034:421;;;:::o;65165:100::-;65249:8;65238;:19;;;;;;;;;;;;:::i;:::-;;65165:100;:::o;60535:127::-;60600:4;60624:30;60646:7;60624:12;:21;;:30;;;;:::i;:::-;60617:37;;60535:127;;;:::o;66442:183::-;66535:2;66508:15;:24;66524:7;66508:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;66591:7;66587:2;66553:46;;66562:23;66577:7;66562:14;:23::i;:::-;66553:46;;;;;;;;;;;;66442:183;;:::o;47238:123::-;47307:7;47334:19;47342:3;:10;;47334:7;:19::i;:::-;47327:26;;47238:123;;;:::o;60829:355::-;60922:4;60947:16;60955:7;60947;:16::i;:::-;60939:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;61023:13;61039:23;61054:7;61039:14;:23::i;:::-;61023:39;;61092:5;61081:16;;:7;:16;;;:51;;;;61125:7;61101:31;;:20;61113:7;61101:11;:20::i;:::-;:31;;;61081:51;:94;;;;61136:39;61160:5;61167:7;61136:23;:39::i;:::-;61081:94;61073:103;;;60829:355;;;;:::o;63965:599::-;64090:4;64063:31;;:23;64078:7;64063:14;:23::i;:::-;:31;;;64055:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;64191:1;64177:16;;:2;:16;;;;64169:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;64247:39;64268:4;64274:2;64278:7;64247:20;:39::i;:::-;64351:29;64368:1;64372:7;64351:8;:29::i;:::-;64393:35;64420:7;64393:13;:19;64407:4;64393:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;64439:30;64461:7;64439:13;:17;64453:2;64439:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;64482:29;64499:7;64508:2;64482:12;:16;;:29;;;;;:::i;:::-;;64548:7;64544:2;64529:27;;64538:4;64529:27;;;;;;;;;;;;63965:599;;;:::o;39023:137::-;39094:7;39129:22;39133:3;:10;;39145:5;39129:3;:22::i;:::-;39121:31;;39114:38;;39023:137;;;;:::o;63083:545::-;63143:13;63159:23;63174:7;63159:14;:23::i;:::-;63143:39;;63213:48;63234:5;63249:1;63253:7;63213:20;:48::i;:::-;63302:29;63319:1;63323:7;63302:8;:29::i;:::-;63421:1;63390:10;:19;63401:7;63390:19;;;;;;;;;;;63384:33;;;;;;;;;;;;;;;;:38;63380:97;;63446:10;:19;63457:7;63446:19;;;;;;;;;;;;63439:26;;;;:::i;:::-;63380:97;63489:36;63517:7;63489:13;:20;63503:5;63489:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;63538:28;63558:7;63538:12;:19;;:28;;;;:::i;:::-;;63612:7;63608:1;63584:36;;63593:5;63584:36;;;;;;;;;;;;63083:545;;:::o;47700:236::-;47780:7;47789;47810:11;47823:13;47840:22;47844:3;:10;;47856:5;47840:3;:22::i;:::-;47809:53;;;;47889:3;47881:12;;47919:5;47911:14;;47873:55;;;;;;47700:236;;;;;:::o;48986:213::-;49093:7;49144:44;49149:3;:10;;49169:3;49161:12;;49175;49144:4;:44::i;:::-;49136:53;;49113:78;;48986:213;;;;;:::o;38565:114::-;38625:7;38652:19;38660:3;:10;;38652:7;:19::i;:::-;38645:26;;38565:114;;;:::o;23543:397::-;23658:6;23633:21;:31;;23625:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23790:12;23808:9;:14;;23831:6;23808:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23789:54;;;23862:7;23854:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;23543:397;;;:::o;59950:272::-;60064:28;60074:4;60080:2;60084:7;60064:9;:28::i;:::-;60111:48;60134:4;60140:2;60144:7;60153:5;60111:22;:48::i;:::-;60103:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;59950:272;;;;:::o;75940:106::-;75998:7;76029:1;76025;:5;:13;;76037:1;76025:13;;;76033:1;76025:13;76018:20;;75940:106;;;;:::o;49456:746::-;49512:13;49742:1;49733:5;:10;49729:53;;;49760:10;;;;;;;;;;;;;;;;;;;;;49729:53;49792:12;49807:5;49792:20;;49823:14;49848:78;49863:1;49855:4;:9;49848:78;;49881:8;;;;;;;49912:2;49904:10;;;;;;;;;49848:78;;;49936:19;49968:6;49958:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49936:39;;49986:13;50011:1;50002:6;:10;49986:26;;50030:5;50023:12;;50046:117;50061:1;50053:4;:9;50046:117;;50122:2;50115:4;:9;;;;;;50110:2;:14;50097:29;;50079:6;50086:7;;;;;;;50079:15;;;;;;;;;;;:47;;;;;;;;;;;50149:2;50141:10;;;;;;;;;50046:117;;;50187:6;50173:21;;;;;;49456:746;;;;:::o;75463:469::-;75514:7;75621:10;75654:11;75688:12;;75723;75758:15;75821:1;75806:12;:16;75796:27;75853:11;;;;;;;;;;;75846:29;;;75876:13;;;;;;;;;;;75846:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75582:327;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75554:370;;;;;;75534:390;;75463:469;:::o;62450:404::-;62544:1;62530:16;;:2;:16;;;;62522:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;62603:16;62611:7;62603;:16::i;:::-;62602:17;62594:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62665:45;62694:1;62698:2;62702:7;62665:20;:45::i;:::-;62723:30;62745:7;62723:13;:17;62737:2;62723:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;62766:29;62783:7;62792:2;62766:12;:16;;:29;;;;;:::i;:::-;;62838:7;62834:2;62813:33;;62830:1;62813:33;;;;;;;;;;;;62450:404;;:::o;46999:151::-;47083:4;47107:35;47117:3;:10;;47137:3;47129:12;;47107:9;:35::i;:::-;47100:42;;46999:151;;;;:::o;43817:110::-;43873:7;43900:3;:12;;:19;;;;43893:26;;43817:110;;;:::o;67238:93::-;;;;:::o;38110:137::-;38180:4;38204:35;38212:3;:10;;38232:5;38224:14;;38204:7;:35::i;:::-;38197:42;;38110:137;;;;:::o;37803:131::-;37870:4;37894:32;37899:3;:10;;37919:5;37911:14;;37894:4;:32::i;:::-;37887:39;;37803:131;;;;:::o;46422:185::-;46511:4;46535:64;46540:3;:10;;46560:3;46552:12;;46590:5;46574:23;;46566:32;;46535:4;:64::i;:::-;46528:71;;46422:185;;;;;:::o;34061:204::-;34128:7;34177:5;34156:3;:11;;:18;;;;:26;34148:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34239:3;:11;;34251:5;34239:18;;;;;;;;;;;;;;;;34232:25;;34061:204;;;;:::o;46773:142::-;46850:4;46874:33;46882:3;:10;;46902:3;46894:12;;46874:7;:33::i;:::-;46867:40;;46773:142;;;;:::o;44282:279::-;44349:7;44358;44408:5;44386:3;:12;;:19;;;;:27;44378:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44465:22;44490:3;:12;;44503:5;44490:19;;;;;;;;;;;;;;;;;;44465:44;;44528:5;:10;;;44540:5;:12;;;44520:33;;;;;44282:279;;;;;:::o;45779:319::-;45873:7;45893:16;45912:3;:12;;:17;45925:3;45912:17;;;;;;;;;;;;45893:36;;45960:1;45948:8;:13;;45963:12;45940:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;46030:3;:12;;46054:1;46043:8;:12;46030:26;;;;;;;;;;;;;;;;;;:33;;;46023:40;;;45779:319;;;;;:::o;33608:109::-;33664:7;33691:3;:11;;:18;;;;33684:25;;33608:109;;;:::o;65830:604::-;65951:4;65978:15;:2;:13;;;:15::i;:::-;65973:60;;66017:4;66010:11;;;;65973:60;66043:23;66069:252;66122:45;;;66182:12;:10;:12::i;:::-;66209:4;66228:7;66250:5;66085:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66069:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;66043:278;;66332:13;66359:10;66348:32;;;;;;;;;;;;:::i;:::-;66332:48;;50979:10;66409:16;;66399:26;;;:6;:26;;;;66391:35;;;;65830:604;;;;;;;:::o;43597:125::-;43668:4;43713:1;43692:3;:12;;:17;43705:3;43692:17;;;;;;;;;;;;:22;;43685:29;;43597:125;;;;:::o;31763:1544::-;31829:4;31947:18;31968:3;:12;;:19;31981:5;31968:19;;;;;;;;;;;;31947:40;;32018:1;32004:10;:15;32000:1300;;32366:21;32403:1;32390:10;:14;32366:38;;32419:17;32460:1;32439:3;:11;;:18;;;;:22;32419:42;;32706:17;32726:3;:11;;32738:9;32726:22;;;;;;;;;;;;;;;;32706:42;;32872:9;32843:3;:11;;32855:13;32843:26;;;;;;;;;;;;;;;:38;;;;32991:1;32975:13;:17;32949:3;:12;;:23;32962:9;32949:23;;;;;;;;;;;:43;;;;33101:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;33196:3;:12;;:19;33209:5;33196:19;;;;;;;;;;;33189:26;;;33239:4;33232:11;;;;;;;;32000:1300;33283:5;33276:12;;;31763:1544;;;;;:::o;31173:414::-;31236:4;31258:21;31268:3;31273:5;31258:9;:21::i;:::-;31253:327;;31296:3;:11;;31313:5;31296:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31479:3;:11;;:18;;;;31457:3;:12;;:19;31470:5;31457:19;;;;;;;;;;;:40;;;;31519:4;31512:11;;;;31253:327;31563:5;31556:12;;31173:414;;;;;:::o;41097:692::-;41173:4;41289:16;41308:3;:12;;:17;41321:3;41308:17;;;;;;;;;;;;41289:36;;41354:1;41342:8;:13;41338:444;;;41409:3;:12;;41427:38;;;;;;;;41444:3;41427:38;;;;41457:5;41427:38;;;41409:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41624:3;:12;;:19;;;;41604:3;:12;;:17;41617:3;41604:17;;;;;;;;;;;:39;;;;41665:4;41658:11;;;;;41338:444;41738:5;41702:3;:12;;41726:1;41715:8;:12;41702:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;41765:5;41758:12;;;41097:692;;;;;;:::o;41964:1549::-;42028:4;42144:16;42163:3;:12;;:17;42176:3;42163:17;;;;;;;;;;;;42144:36;;42209:1;42197:8;:13;42193:1313;;42558:21;42593:1;42582:8;:12;42558:36;;42609:17;42651:1;42629:3;:12;;:19;;;;:23;42609:43;;42897:26;42926:3;:12;;42939:9;42926:23;;;;;;;;;;;;;;;;;;42897:52;;43074:9;43044:3;:12;;43057:13;43044:27;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;43198:1;43182:13;:17;43151:3;:12;;:28;43164:9;:14;;;43151:28;;;;;;;;;;;:48;;;;43308:3;:12;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43404:3;:12;;:17;43417:3;43404:17;;;;;;;;;;;43397:24;;;43445:4;43438:11;;;;;;;;42193:1313;43489:5;43482:12;;;41964:1549;;;;;:::o;22186:422::-;22246:4;22454:12;22565:7;22553:20;22545:28;;22599:1;22592:4;:8;22585:15;;;22186:422;;;:::o;25104:195::-;25207:12;25239:52;25261:6;25269:4;25275:1;25278:12;25239:21;:52::i;:::-;25232:59;;25104:195;;;;;:::o;33393:129::-;33466:4;33513:1;33490:3;:12;;:19;33503:5;33490:19;;;;;;;;;;;;:24;;33483:31;;33393:129;;;;:::o;26156:530::-;26283:12;26341:5;26316:21;:30;;26308:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;26408:18;26419:6;26408:10;:18::i;:::-;26400:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;26534:12;26548:23;26575:6;:11;;26595:5;26603:4;26575:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26533:75;;;;26626:52;26644:7;26653:10;26665:12;26626:17;:52::i;:::-;26619:59;;;;26156:530;;;;;;:::o;28696:742::-;28811:12;28840:7;28836:595;;;28871:10;28864:17;;;;28836:595;29005:1;28985:10;:17;:21;28981:439;;;29248:10;29242:17;29309:15;29296:10;29292:2;29288:19;29281:44;29196:148;29391:12;29384:20;;;;;;;;;;;:::i;:::-;;;;;;;;28696:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:146::-;;230:6;217:20;208:29;;242:41;277:5;242:41;:::i;:::-;202:86;;;;:::o;295:124::-;;372:6;359:20;350:29;;384:30;408:5;384:30;:::i;:::-;344:75;;;;:::o;426:128::-;;505:6;492:20;483:29;;517:32;543:5;517:32;:::i;:::-;477:77;;;;:::o;561:132::-;;644:6;638:13;629:22;;656:32;682:5;656:32;:::i;:::-;623:70;;;;:::o;701:440::-;;802:3;795:4;787:6;783:17;779:27;769:2;;820:1;817;810:12;769:2;857:6;844:20;879:64;894:48;935:6;894:48;:::i;:::-;879:64;:::i;:::-;870:73;;963:6;956:5;949:21;999:4;991:6;987:17;1032:4;1025:5;1021:16;1067:3;1058:6;1053:3;1049:16;1046:25;1043:2;;;1084:1;1081;1074:12;1043:2;1094:41;1128:6;1123:3;1118;1094:41;:::i;:::-;762:379;;;;;;;:::o;1150:442::-;;1252:3;1245:4;1237:6;1233:17;1229:27;1219:2;;1270:1;1267;1260:12;1219:2;1307:6;1294:20;1329:65;1344:49;1386:6;1344:49;:::i;:::-;1329:65;:::i;:::-;1320:74;;1414:6;1407:5;1400:21;1450:4;1442:6;1438:17;1483:4;1476:5;1472:16;1518:3;1509:6;1504:3;1500:16;1497:25;1494:2;;;1535:1;1532;1525:12;1494:2;1545:41;1579:6;1574:3;1569;1545:41;:::i;:::-;1212:380;;;;;;;:::o;1600:130::-;;1680:6;1667:20;1658:29;;1692:33;1719:5;1692:33;:::i;:::-;1652:78;;;;:::o;1737:134::-;;1821:6;1815:13;1806:22;;1833:33;1860:5;1833:33;:::i;:::-;1800:71;;;;:::o;1878:241::-;;1982:2;1970:9;1961:7;1957:23;1953:32;1950:2;;;1998:1;1995;1988:12;1950:2;2033:1;2050:53;2095:7;2086:6;2075:9;2071:22;2050:53;:::i;:::-;2040:63;;2012:97;1944:175;;;;:::o;2126:257::-;;2238:2;2226:9;2217:7;2213:23;2209:32;2206:2;;;2254:1;2251;2244:12;2206:2;2289:1;2306:61;2359:7;2350:6;2339:9;2335:22;2306:61;:::i;:::-;2296:71;;2268:105;2200:183;;;;:::o;2390:366::-;;;2511:2;2499:9;2490:7;2486:23;2482:32;2479:2;;;2527:1;2524;2517:12;2479:2;2562:1;2579:53;2624:7;2615:6;2604:9;2600:22;2579:53;:::i;:::-;2569:63;;2541:97;2669:2;2687:53;2732:7;2723:6;2712:9;2708:22;2687:53;:::i;:::-;2677:63;;2648:98;2473:283;;;;;:::o;2763:491::-;;;;2901:2;2889:9;2880:7;2876:23;2872:32;2869:2;;;2917:1;2914;2907:12;2869:2;2952:1;2969:53;3014:7;3005:6;2994:9;2990:22;2969:53;:::i;:::-;2959:63;;2931:97;3059:2;3077:53;3122:7;3113:6;3102:9;3098:22;3077:53;:::i;:::-;3067:63;;3038:98;3167:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3146:98;2863:391;;;;;:::o;3261:721::-;;;;;3425:3;3413:9;3404:7;3400:23;3396:33;3393:2;;;3442:1;3439;3432:12;3393:2;3477:1;3494:53;3539:7;3530:6;3519:9;3515:22;3494:53;:::i;:::-;3484:63;;3456:97;3584:2;3602:53;3647:7;3638:6;3627:9;3623:22;3602:53;:::i;:::-;3592:63;;3563:98;3692:2;3710:53;3755:7;3746:6;3735:9;3731:22;3710:53;:::i;:::-;3700:63;;3671:98;3828:2;3817:9;3813:18;3800:32;3852:18;3844:6;3841:30;3838:2;;;3884:1;3881;3874:12;3838:2;3904:62;3958:7;3949:6;3938:9;3934:22;3904:62;:::i;:::-;3894:72;;3779:193;3387:595;;;;;;;:::o;3989:360::-;;;4107:2;4095:9;4086:7;4082:23;4078:32;4075:2;;;4123:1;4120;4113:12;4075:2;4158:1;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4137:97;4265:2;4283:50;4325:7;4316:6;4305:9;4301:22;4283:50;:::i;:::-;4273:60;;4244:95;4069:280;;;;;:::o;4356:366::-;;;4477:2;4465:9;4456:7;4452:23;4448:32;4445:2;;;4493:1;4490;4483:12;4445:2;4528:1;4545:53;4590:7;4581:6;4570:9;4566:22;4545:53;:::i;:::-;4535:63;;4507:97;4635:2;4653:53;4698:7;4689:6;4678:9;4674:22;4653:53;:::i;:::-;4643:63;;4614:98;4439:283;;;;;:::o;4729:235::-;;4830:2;4818:9;4809:7;4805:23;4801:32;4798:2;;;4846:1;4843;4836:12;4798:2;4881:1;4898:50;4940:7;4931:6;4920:9;4916:22;4898:50;:::i;:::-;4888:60;;4860:94;4792:172;;;;:::o;4971:239::-;;5074:2;5062:9;5053:7;5049:23;5045:32;5042:2;;;5090:1;5087;5080:12;5042:2;5125:1;5142:52;5186:7;5177:6;5166:9;5162:22;5142:52;:::i;:::-;5132:62;;5104:96;5036:174;;;;:::o;5217:261::-;;5331:2;5319:9;5310:7;5306:23;5302:32;5299:2;;;5347:1;5344;5337:12;5299:2;5382:1;5399:63;5454:7;5445:6;5434:9;5430:22;5399:63;:::i;:::-;5389:73;;5361:107;5293:185;;;;:::o;5485:347::-;;5599:2;5587:9;5578:7;5574:23;5570:32;5567:2;;;5615:1;5612;5605:12;5567:2;5678:1;5667:9;5663:17;5650:31;5701:18;5693:6;5690:30;5687:2;;;5733:1;5730;5723:12;5687:2;5753:63;5808:7;5799:6;5788:9;5784:22;5753:63;:::i;:::-;5743:73;;5629:193;5561:271;;;;:::o;5839:241::-;;5943:2;5931:9;5922:7;5918:23;5914:32;5911:2;;;5959:1;5956;5949:12;5911:2;5994:1;6011:53;6056:7;6047:6;6036:9;6032:22;6011:53;:::i;:::-;6001:63;;5973:97;5905:175;;;;:::o;6087:263::-;;6202:2;6190:9;6181:7;6177:23;6173:32;6170:2;;;6218:1;6215;6208:12;6170:2;6253:1;6270:64;6326:7;6317:6;6306:9;6302:22;6270:64;:::i;:::-;6260:74;;6232:108;6164:186;;;;:::o;6357:366::-;;;6478:2;6466:9;6457:7;6453:23;6449:32;6446:2;;;6494:1;6491;6484:12;6446:2;6529:1;6546:53;6591:7;6582:6;6571:9;6567:22;6546:53;:::i;:::-;6536:63;;6508:97;6636:2;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6615:98;6440:283;;;;;:::o;6731:173::-;;6818:46;6860:3;6852:6;6818:46;:::i;:::-;6893:4;6888:3;6884:14;6870:28;;6811:93;;;;:::o;6913:173::-;;7000:46;7042:3;7034:6;7000:46;:::i;:::-;7075:4;7070:3;7066:14;7052:28;;6993:93;;;;:::o;7094:142::-;7185:45;7224:5;7185:45;:::i;:::-;7180:3;7173:58;7167:69;;:::o;7243:137::-;7342:32;7368:5;7342:32;:::i;:::-;7337:3;7330:45;7324:56;;:::o;7387:184::-;7504:61;7532:32;7558:5;7532:32;:::i;:::-;7504:61;:::i;:::-;7499:3;7492:74;7486:85;;:::o;7578:103::-;7651:24;7669:5;7651:24;:::i;:::-;7646:3;7639:37;7633:48;;:::o;7688:113::-;7771:24;7789:5;7771:24;:::i;:::-;7766:3;7759:37;7753:48;;:::o;7839:690::-;;7984:54;8032:5;7984:54;:::i;:::-;8051:86;8130:6;8125:3;8051:86;:::i;:::-;8044:93;;8158:56;8208:5;8158:56;:::i;:::-;8234:7;8262:1;8247:260;8272:6;8269:1;8266:13;8247:260;;;8339:6;8333:13;8360:63;8419:3;8404:13;8360:63;:::i;:::-;8353:70;;8440:60;8493:6;8440:60;:::i;:::-;8430:70;;8304:203;8294:1;8291;8287:9;8282:14;;8247:260;;;8251:14;8520:3;8513:10;;7963:566;;;;;;;:::o;8568:690::-;;8713:54;8761:5;8713:54;:::i;:::-;8780:86;8859:6;8854:3;8780:86;:::i;:::-;8773:93;;8887:56;8937:5;8887:56;:::i;:::-;8963:7;8991:1;8976:260;9001:6;8998:1;8995:13;8976:260;;;9068:6;9062:13;9089:63;9148:3;9133:13;9089:63;:::i;:::-;9082:70;;9169:60;9222:6;9169:60;:::i;:::-;9159:70;;9033:203;9023:1;9020;9016:9;9011:14;;8976:260;;;8980:14;9249:3;9242:10;;8692:566;;;;;;;:::o;9266:104::-;9343:21;9358:5;9343:21;:::i;:::-;9338:3;9331:34;9325:45;;:::o;9377:103::-;9450:24;9468:5;9450:24;:::i;:::-;9445:3;9438:37;9432:48;;:::o;9487:113::-;9570:24;9588:5;9570:24;:::i;:::-;9565:3;9558:37;9552:48;;:::o;9607:152::-;9708:45;9728:24;9746:5;9728:24;:::i;:::-;9708:45;:::i;:::-;9703:3;9696:58;9690:69;;:::o;9766:343::-;;9876:38;9908:5;9876:38;:::i;:::-;9926:70;9989:6;9984:3;9926:70;:::i;:::-;9919:77;;10001:52;10046:6;10041:3;10034:4;10027:5;10023:16;10001:52;:::i;:::-;10074:29;10096:6;10074:29;:::i;:::-;10069:3;10065:39;10058:46;;9856:253;;;;;:::o;10116:356::-;;10244:38;10276:5;10244:38;:::i;:::-;10294:88;10375:6;10370:3;10294:88;:::i;:::-;10287:95;;10387:52;10432:6;10427:3;10420:4;10413:5;10409:16;10387:52;:::i;:::-;10460:6;10455:3;10451:16;10444:23;;10224:248;;;;;:::o;10479:347::-;;10591:39;10624:5;10591:39;:::i;:::-;10642:71;10706:6;10701:3;10642:71;:::i;:::-;10635:78;;10718:52;10763:6;10758:3;10751:4;10744:5;10740:16;10718:52;:::i;:::-;10791:29;10813:6;10791:29;:::i;:::-;10786:3;10782:39;10775:46;;10571:255;;;;;:::o;10833:360::-;;10963:39;10996:5;10963:39;:::i;:::-;11014:89;11096:6;11091:3;11014:89;:::i;:::-;11007:96;;11108:52;11153:6;11148:3;11141:4;11134:5;11130:16;11108:52;:::i;:::-;11181:6;11176:3;11172:16;11165:23;;10943:250;;;;;:::o;11201:371::-;;11361:67;11425:2;11420:3;11361:67;:::i;:::-;11354:74;;11461:34;11457:1;11452:3;11448:11;11441:55;11530:4;11525:2;11520:3;11516:12;11509:26;11563:2;11558:3;11554:12;11547:19;;11347:225;;;:::o;11581:373::-;;11741:67;11805:2;11800:3;11741:67;:::i;:::-;11734:74;;11841:34;11837:1;11832:3;11828:11;11821:55;11910:6;11905:2;11900:3;11896:12;11889:28;11945:2;11940:3;11936:12;11929:19;;11727:227;;;:::o;11963:387::-;;12123:67;12187:2;12182:3;12123:67;:::i;:::-;12116:74;;12223:34;12219:1;12214:3;12210:11;12203:55;12292:20;12287:2;12282:3;12278:12;12271:42;12341:2;12336:3;12332:12;12325:19;;12109:241;;;:::o;12359:375::-;;12519:67;12583:2;12578:3;12519:67;:::i;:::-;12512:74;;12619:34;12615:1;12610:3;12606:11;12599:55;12688:8;12683:2;12678:3;12674:12;12667:30;12725:2;12720:3;12716:12;12709:19;;12505:229;;;:::o;12743:328::-;;12903:67;12967:2;12962:3;12903:67;:::i;:::-;12896:74;;13003:30;12999:1;12994:3;12990:11;12983:51;13062:2;13057:3;13053:12;13046:19;;12889:182;;;:::o;13080:373::-;;13240:67;13304:2;13299:3;13240:67;:::i;:::-;13233:74;;13340:34;13336:1;13331:3;13327:11;13320:55;13409:6;13404:2;13399:3;13395:12;13388:28;13444:2;13439:3;13435:12;13428:19;;13226:227;;;:::o;13462:325::-;;13622:67;13686:2;13681:3;13622:67;:::i;:::-;13615:74;;13722:27;13718:1;13713:3;13709:11;13702:48;13778:2;13773:3;13769:12;13762:19;;13608:179;;;:::o;13796:395::-;;13956:67;14020:2;14015:3;13956:67;:::i;:::-;13949:74;;14056:34;14052:1;14047:3;14043:11;14036:55;14125:28;14120:2;14115:3;14111:12;14104:50;14182:2;14177:3;14173:12;14166:19;;13942:249;;;:::o;14200:329::-;;14360:67;14424:2;14419:3;14360:67;:::i;:::-;14353:74;;14460:31;14456:1;14451:3;14447:11;14440:52;14520:2;14515:3;14511:12;14504:19;;14346:183;;;:::o;14538:375::-;;14698:67;14762:2;14757:3;14698:67;:::i;:::-;14691:74;;14798:34;14794:1;14789:3;14785:11;14778:55;14867:8;14862:2;14857:3;14853:12;14846:30;14904:2;14899:3;14895:12;14888:19;;14684:229;;;:::o;14922:381::-;;15082:67;15146:2;15141:3;15082:67;:::i;:::-;15075:74;;15182:34;15178:1;15173:3;15169:11;15162:55;15251:14;15246:2;15241:3;15237:12;15230:36;15294:2;15289:3;15285:12;15278:19;;15068:235;;;:::o;15312:316::-;;15472:67;15536:2;15531:3;15472:67;:::i;:::-;15465:74;;15572:18;15568:1;15563:3;15559:11;15552:39;15619:2;15614:3;15610:12;15603:19;;15458:170;;;:::o;15637:393::-;;15797:67;15861:2;15856:3;15797:67;:::i;:::-;15790:74;;15897:34;15893:1;15888:3;15884:11;15877:55;15966:26;15961:2;15956:3;15952:12;15945:48;16021:2;16016:3;16012:12;16005:19;;15783:247;;;:::o;16039:321::-;;16199:67;16263:2;16258:3;16199:67;:::i;:::-;16192:74;;16299:23;16295:1;16290:3;16286:11;16279:44;16351:2;16346:3;16342:12;16335:19;;16185:175;;;:::o;16369:379::-;;16529:67;16593:2;16588:3;16529:67;:::i;:::-;16522:74;;16629:34;16625:1;16620:3;16616:11;16609:55;16698:12;16693:2;16688:3;16684:12;16677:34;16739:2;16734:3;16730:12;16723:19;;16515:233;;;:::o;16757:323::-;;16917:67;16981:2;16976:3;16917:67;:::i;:::-;16910:74;;17017:25;17013:1;17008:3;17004:11;16997:46;17071:2;17066:3;17062:12;17055:19;;16903:177;;;:::o;17089:371::-;;17249:67;17313:2;17308:3;17249:67;:::i;:::-;17242:74;;17349:34;17345:1;17340:3;17336:11;17329:55;17418:4;17413:2;17408:3;17404:12;17397:26;17451:2;17446:3;17442:12;17435:19;;17235:225;;;:::o;17469:319::-;;17629:67;17693:2;17688:3;17629:67;:::i;:::-;17622:74;;17729:21;17725:1;17720:3;17716:11;17709:42;17779:2;17774:3;17770:12;17763:19;;17615:173;;;:::o;17797:332::-;;17957:67;18021:2;18016:3;17957:67;:::i;:::-;17950:74;;18057:34;18053:1;18048:3;18044:11;18037:55;18120:2;18115:3;18111:12;18104:19;;17943:186;;;:::o;18138:381::-;;18298:67;18362:2;18357:3;18298:67;:::i;:::-;18291:74;;18398:34;18394:1;18389:3;18385:11;18378:55;18467:14;18462:2;18457:3;18453:12;18446:36;18510:2;18505:3;18501:12;18494:19;;18284:235;;;:::o;18528:332::-;;18688:67;18752:2;18747:3;18688:67;:::i;:::-;18681:74;;18788:34;18784:1;18779:3;18775:11;18768:55;18851:2;18846:3;18842:12;18835:19;;18674:186;;;:::o;18869:378::-;;19029:67;19093:2;19088:3;19029:67;:::i;:::-;19022:74;;19129:34;19125:1;19120:3;19116:11;19109:55;19198:11;19193:2;19188:3;19184:12;19177:33;19238:2;19233:3;19229:12;19222:19;;19015:232;;;:::o;19256:384::-;;19416:67;19480:2;19475:3;19416:67;:::i;:::-;19409:74;;19516:34;19512:1;19507:3;19503:11;19496:55;19585:17;19580:2;19575:3;19571:12;19564:39;19631:2;19626:3;19622:12;19615:19;;19402:238;;;:::o;19649:370::-;;19809:67;19873:2;19868:3;19809:67;:::i;:::-;19802:74;;19909:34;19905:1;19900:3;19896:11;19889:55;19978:3;19973:2;19968:3;19964:12;19957:25;20010:2;20005:3;20001:12;19994:19;;19795:224;;;:::o;20028:327::-;;20188:67;20252:2;20247:3;20188:67;:::i;:::-;20181:74;;20288:29;20284:1;20279:3;20275:11;20268:50;20346:2;20341:3;20337:12;20330:19;;20174:181;;;:::o;20364:317::-;;20524:67;20588:2;20583:3;20524:67;:::i;:::-;20517:74;;20624:19;20620:1;20615:3;20611:11;20604:40;20672:2;20667:3;20663:12;20656:19;;20510:171;;;:::o;20690:296::-;;20867:83;20948:1;20943:3;20867:83;:::i;:::-;20860:90;;20978:1;20973:3;20969:11;20962:18;;20853:133;;;:::o;20995:386::-;;21155:67;21219:2;21214:3;21155:67;:::i;:::-;21148:74;;21255:34;21251:1;21246:3;21242:11;21235:55;21324:19;21319:2;21314:3;21310:12;21303:41;21372:2;21367:3;21363:12;21356:19;;21141:240;;;:::o;21390:329::-;;21550:67;21614:2;21609:3;21550:67;:::i;:::-;21543:74;;21650:31;21646:1;21641:3;21637:11;21630:52;21710:2;21705:3;21701:12;21694:19;;21536:183;;;:::o;21728:385::-;;21888:67;21952:2;21947:3;21888:67;:::i;:::-;21881:74;;21988:34;21984:1;21979:3;21975:11;21968:55;22057:18;22052:2;22047:3;22043:12;22036:40;22104:2;22099:3;22095:12;22088:19;;21874:239;;;:::o;22122:319::-;;22282:67;22346:2;22341:3;22282:67;:::i;:::-;22275:74;;22382:21;22378:1;22373:3;22369:11;22362:42;22432:2;22427:3;22423:12;22416:19;;22268:173;;;:::o;22449:113::-;22532:24;22550:5;22532:24;:::i;:::-;22527:3;22520:37;22514:48;;:::o;22569:152::-;22670:45;22690:24;22708:5;22690:24;:::i;:::-;22670:45;:::i;:::-;22665:3;22658:58;22652:69;;:::o;22728:1119::-;;23040:91;23127:3;23118:6;23040:91;:::i;:::-;23153:2;23148:3;23144:12;23137:19;;23167:75;23238:3;23229:6;23167:75;:::i;:::-;23264:2;23259:3;23255:12;23248:19;;23278:75;23349:3;23340:6;23278:75;:::i;:::-;23375:2;23370:3;23366:12;23359:19;;23389:75;23460:3;23451:6;23389:75;:::i;:::-;23486:2;23481:3;23477:12;23470:19;;23500:75;23571:3;23562:6;23500:75;:::i;:::-;23597:2;23592:3;23588:12;23581:19;;23611:75;23682:3;23673:6;23611:75;:::i;:::-;23708:2;23703:3;23699:12;23692:19;;23722:75;23793:3;23784:6;23722:75;:::i;:::-;23819:2;23814:3;23810:12;23803:19;;23839:3;23832:10;;23028:819;;;;;;;;;;:::o;23854:271::-;;24007:93;24096:3;24087:6;24007:93;:::i;:::-;24000:100;;24117:3;24110:10;;23988:137;;;;:::o;24132:436::-;;24335:95;24426:3;24417:6;24335:95;:::i;:::-;24328:102;;24448:95;24539:3;24530:6;24448:95;:::i;:::-;24441:102;;24560:3;24553:10;;24316:252;;;;;:::o;24575:379::-;;24782:147;24925:3;24782:147;:::i;:::-;24775:154;;24946:3;24939:10;;24763:191;;;:::o;24961:222::-;;25088:2;25077:9;25073:18;25065:26;;25102:71;25170:1;25159:9;25155:17;25146:6;25102:71;:::i;:::-;25059:124;;;;:::o;25190:254::-;;25333:2;25322:9;25318:18;25310:26;;25347:87;25431:1;25420:9;25416:17;25407:6;25347:87;:::i;:::-;25304:140;;;;:::o;25451:672::-;;25696:3;25685:9;25681:19;25673:27;;25711:87;25795:1;25784:9;25780:17;25771:6;25711:87;:::i;:::-;25809:72;25877:2;25866:9;25862:18;25853:6;25809:72;:::i;:::-;25892;25960:2;25949:9;25945:18;25936:6;25892:72;:::i;:::-;26012:9;26006:4;26002:20;25997:2;25986:9;25982:18;25975:48;26037:76;26108:4;26099:6;26037:76;:::i;:::-;26029:84;;25667:456;;;;;;;:::o;26130:572::-;;26349:3;26338:9;26334:19;26326:27;;26364:79;26440:1;26429:9;26425:17;26416:6;26364:79;:::i;:::-;26454:72;26522:2;26511:9;26507:18;26498:6;26454:72;:::i;:::-;26537;26605:2;26594:9;26590:18;26581:6;26537:72;:::i;:::-;26620;26688:2;26677:9;26673:18;26664:6;26620:72;:::i;:::-;26320:382;;;;;;;:::o;26709:333::-;;26864:2;26853:9;26849:18;26841:26;;26878:71;26946:1;26935:9;26931:17;26922:6;26878:71;:::i;:::-;26960:72;27028:2;27017:9;27013:18;27004:6;26960:72;:::i;:::-;26835:207;;;;;:::o;27049:370::-;;27226:2;27215:9;27211:18;27203:26;;27276:9;27270:4;27266:20;27262:1;27251:9;27247:17;27240:47;27301:108;27404:4;27395:6;27301:108;:::i;:::-;27293:116;;27197:222;;;;:::o;27426:370::-;;27603:2;27592:9;27588:18;27580:26;;27653:9;27647:4;27643:20;27639:1;27628:9;27624:17;27617:47;27678:108;27781:4;27772:6;27678:108;:::i;:::-;27670:116;;27574:222;;;;:::o;27803:210::-;;27924:2;27913:9;27909:18;27901:26;;27938:65;28000:1;27989:9;27985:17;27976:6;27938:65;:::i;:::-;27895:118;;;;:::o;28020:222::-;;28147:2;28136:9;28132:18;28124:26;;28161:71;28229:1;28218:9;28214:17;28205:6;28161:71;:::i;:::-;28118:124;;;;:::o;28249:310::-;;28396:2;28385:9;28381:18;28373:26;;28446:9;28440:4;28436:20;28432:1;28421:9;28417:17;28410:47;28471:78;28544:4;28535:6;28471:78;:::i;:::-;28463:86;;28367:192;;;;:::o;28566:416::-;;28766:2;28755:9;28751:18;28743:26;;28816:9;28810:4;28806:20;28802:1;28791:9;28787:17;28780:47;28841:131;28967:4;28841:131;:::i;:::-;28833:139;;28737:245;;;:::o;28989:416::-;;29189:2;29178:9;29174:18;29166:26;;29239:9;29233:4;29229:20;29225:1;29214:9;29210:17;29203:47;29264:131;29390:4;29264:131;:::i;:::-;29256:139;;29160:245;;;:::o;29412:416::-;;29612:2;29601:9;29597:18;29589:26;;29662:9;29656:4;29652:20;29648:1;29637:9;29633:17;29626:47;29687:131;29813:4;29687:131;:::i;:::-;29679:139;;29583:245;;;:::o;29835:416::-;;30035:2;30024:9;30020:18;30012:26;;30085:9;30079:4;30075:20;30071:1;30060:9;30056:17;30049:47;30110:131;30236:4;30110:131;:::i;:::-;30102:139;;30006:245;;;:::o;30258:416::-;;30458:2;30447:9;30443:18;30435:26;;30508:9;30502:4;30498:20;30494:1;30483:9;30479:17;30472:47;30533:131;30659:4;30533:131;:::i;:::-;30525:139;;30429:245;;;:::o;30681:416::-;;30881:2;30870:9;30866:18;30858:26;;30931:9;30925:4;30921:20;30917:1;30906:9;30902:17;30895:47;30956:131;31082:4;30956:131;:::i;:::-;30948:139;;30852:245;;;:::o;31104:416::-;;31304:2;31293:9;31289:18;31281:26;;31354:9;31348:4;31344:20;31340:1;31329:9;31325:17;31318:47;31379:131;31505:4;31379:131;:::i;:::-;31371:139;;31275:245;;;:::o;31527:416::-;;31727:2;31716:9;31712:18;31704:26;;31777:9;31771:4;31767:20;31763:1;31752:9;31748:17;31741:47;31802:131;31928:4;31802:131;:::i;:::-;31794:139;;31698:245;;;:::o;31950:416::-;;32150:2;32139:9;32135:18;32127:26;;32200:9;32194:4;32190:20;32186:1;32175:9;32171:17;32164:47;32225:131;32351:4;32225:131;:::i;:::-;32217:139;;32121:245;;;:::o;32373:416::-;;32573:2;32562:9;32558:18;32550:26;;32623:9;32617:4;32613:20;32609:1;32598:9;32594:17;32587:47;32648:131;32774:4;32648:131;:::i;:::-;32640:139;;32544:245;;;:::o;32796:416::-;;32996:2;32985:9;32981:18;32973:26;;33046:9;33040:4;33036:20;33032:1;33021:9;33017:17;33010:47;33071:131;33197:4;33071:131;:::i;:::-;33063:139;;32967:245;;;:::o;33219:416::-;;33419:2;33408:9;33404:18;33396:26;;33469:9;33463:4;33459:20;33455:1;33444:9;33440:17;33433:47;33494:131;33620:4;33494:131;:::i;:::-;33486:139;;33390:245;;;:::o;33642:416::-;;33842:2;33831:9;33827:18;33819:26;;33892:9;33886:4;33882:20;33878:1;33867:9;33863:17;33856:47;33917:131;34043:4;33917:131;:::i;:::-;33909:139;;33813:245;;;:::o;34065:416::-;;34265:2;34254:9;34250:18;34242:26;;34315:9;34309:4;34305:20;34301:1;34290:9;34286:17;34279:47;34340:131;34466:4;34340:131;:::i;:::-;34332:139;;34236:245;;;:::o;34488:416::-;;34688:2;34677:9;34673:18;34665:26;;34738:9;34732:4;34728:20;34724:1;34713:9;34709:17;34702:47;34763:131;34889:4;34763:131;:::i;:::-;34755:139;;34659:245;;;:::o;34911:416::-;;35111:2;35100:9;35096:18;35088:26;;35161:9;35155:4;35151:20;35147:1;35136:9;35132:17;35125:47;35186:131;35312:4;35186:131;:::i;:::-;35178:139;;35082:245;;;:::o;35334:416::-;;35534:2;35523:9;35519:18;35511:26;;35584:9;35578:4;35574:20;35570:1;35559:9;35555:17;35548:47;35609:131;35735:4;35609:131;:::i;:::-;35601:139;;35505:245;;;:::o;35757:416::-;;35957:2;35946:9;35942:18;35934:26;;36007:9;36001:4;35997:20;35993:1;35982:9;35978:17;35971:47;36032:131;36158:4;36032:131;:::i;:::-;36024:139;;35928:245;;;:::o;36180:416::-;;36380:2;36369:9;36365:18;36357:26;;36430:9;36424:4;36420:20;36416:1;36405:9;36401:17;36394:47;36455:131;36581:4;36455:131;:::i;:::-;36447:139;;36351:245;;;:::o;36603:416::-;;36803:2;36792:9;36788:18;36780:26;;36853:9;36847:4;36843:20;36839:1;36828:9;36824:17;36817:47;36878:131;37004:4;36878:131;:::i;:::-;36870:139;;36774:245;;;:::o;37026:416::-;;37226:2;37215:9;37211:18;37203:26;;37276:9;37270:4;37266:20;37262:1;37251:9;37247:17;37240:47;37301:131;37427:4;37301:131;:::i;:::-;37293:139;;37197:245;;;:::o;37449:416::-;;37649:2;37638:9;37634:18;37626:26;;37699:9;37693:4;37689:20;37685:1;37674:9;37670:17;37663:47;37724:131;37850:4;37724:131;:::i;:::-;37716:139;;37620:245;;;:::o;37872:416::-;;38072:2;38061:9;38057:18;38049:26;;38122:9;38116:4;38112:20;38108:1;38097:9;38093:17;38086:47;38147:131;38273:4;38147:131;:::i;:::-;38139:139;;38043:245;;;:::o;38295:416::-;;38495:2;38484:9;38480:18;38472:26;;38545:9;38539:4;38535:20;38531:1;38520:9;38516:17;38509:47;38570:131;38696:4;38570:131;:::i;:::-;38562:139;;38466:245;;;:::o;38718:416::-;;38918:2;38907:9;38903:18;38895:26;;38968:9;38962:4;38958:20;38954:1;38943:9;38939:17;38932:47;38993:131;39119:4;38993:131;:::i;:::-;38985:139;;38889:245;;;:::o;39141:416::-;;39341:2;39330:9;39326:18;39318:26;;39391:9;39385:4;39381:20;39377:1;39366:9;39362:17;39355:47;39416:131;39542:4;39416:131;:::i;:::-;39408:139;;39312:245;;;:::o;39564:416::-;;39764:2;39753:9;39749:18;39741:26;;39814:9;39808:4;39804:20;39800:1;39789:9;39785:17;39778:47;39839:131;39965:4;39839:131;:::i;:::-;39831:139;;39735:245;;;:::o;39987:416::-;;40187:2;40176:9;40172:18;40164:26;;40237:9;40231:4;40227:20;40223:1;40212:9;40208:17;40201:47;40262:131;40388:4;40262:131;:::i;:::-;40254:139;;40158:245;;;:::o;40410:416::-;;40610:2;40599:9;40595:18;40587:26;;40660:9;40654:4;40650:20;40646:1;40635:9;40631:17;40624:47;40685:131;40811:4;40685:131;:::i;:::-;40677:139;;40581:245;;;:::o;40833:416::-;;41033:2;41022:9;41018:18;41010:26;;41083:9;41077:4;41073:20;41069:1;41058:9;41054:17;41047:47;41108:131;41234:4;41108:131;:::i;:::-;41100:139;;41004:245;;;:::o;41256:222::-;;41383:2;41372:9;41368:18;41360:26;;41397:71;41465:1;41454:9;41450:17;41441:6;41397:71;:::i;:::-;41354:124;;;;:::o;41485:256::-;;41547:2;41541:9;41531:19;;41585:4;41577:6;41573:17;41684:6;41672:10;41669:22;41648:18;41636:10;41633:34;41630:62;41627:2;;;41705:1;41702;41695:12;41627:2;41725:10;41721:2;41714:22;41525:216;;;;:::o;41748:321::-;;41891:18;41883:6;41880:30;41877:2;;;41923:1;41920;41913:12;41877:2;41990:4;41986:9;41979:4;41971:6;41967:17;41963:33;41955:41;;42054:4;42048;42044:15;42036:23;;41814:255;;;:::o;42076:322::-;;42220:18;42212:6;42209:30;42206:2;;;42252:1;42249;42242:12;42206:2;42319:4;42315:9;42308:4;42300:6;42296:17;42292:33;42284:41;;42383:4;42377;42373:15;42365:23;;42143:255;;;:::o;42405:151::-;;42491:3;42483:11;;42529:4;42524:3;42520:14;42512:22;;42477:79;;;:::o;42563:151::-;;42649:3;42641:11;;42687:4;42682:3;42678:14;42670:22;;42635:79;;;:::o;42721:137::-;;42830:5;42824:12;42814:22;;42795:63;;;:::o;42865:137::-;;42974:5;42968:12;42958:22;;42939:63;;;:::o;43009:121::-;;43102:5;43096:12;43086:22;;43067:63;;;:::o;43137:122::-;;43231:5;43225:12;43215:22;;43196:63;;;:::o;43266:108::-;;43364:4;43359:3;43355:14;43347:22;;43341:33;;;:::o;43381:108::-;;43479:4;43474:3;43470:14;43462:22;;43456:33;;;:::o;43497:178::-;;43627:6;43622:3;43615:19;43664:4;43659:3;43655:14;43640:29;;43608:67;;;;:::o;43684:178::-;;43814:6;43809:3;43802:19;43851:4;43846:3;43842:14;43827:29;;43795:67;;;;:::o;43871:162::-;;43985:6;43980:3;43973:19;44022:4;44017:3;44013:14;43998:29;;43966:67;;;;:::o;44042:144::-;;44177:3;44162:18;;44155:31;;;;:::o;44195:163::-;;44310:6;44305:3;44298:19;44347:4;44342:3;44338:14;44323:29;;44291:67;;;;:::o;44367:145::-;;44503:3;44488:18;;44481:31;;;;:::o;44520:91::-;;44582:24;44600:5;44582:24;:::i;:::-;44571:35;;44565:46;;;:::o;44618:99::-;;44688:24;44706:5;44688:24;:::i;:::-;44677:35;;44671:46;;;:::o;44724:85::-;;44797:5;44790:13;44783:21;44772:32;;44766:43;;;:::o;44816:72::-;;44878:5;44867:16;;44861:27;;;:::o;44895:144::-;;44967:66;44960:5;44956:78;44945:89;;44939:100;;;:::o;45046:121::-;;45119:42;45112:5;45108:54;45097:65;;45091:76;;;:::o;45174:72::-;;45236:5;45225:16;;45219:27;;;:::o;45253:129::-;;45340:37;45371:5;45340:37;:::i;:::-;45327:50;;45321:61;;;:::o;45389:121::-;;45468:37;45499:5;45468:37;:::i;:::-;45455:50;;45449:61;;;:::o;45517:108::-;;45596:24;45614:5;45596:24;:::i;:::-;45583:37;;45577:48;;;:::o;45633:145::-;45714:6;45709:3;45704;45691:30;45770:1;45761:6;45756:3;45752:16;45745:27;45684:94;;;:::o;45787:268::-;45852:1;45859:101;45873:6;45870:1;45867:13;45859:101;;;45949:1;45944:3;45940:11;45934:18;45930:1;45925:3;45921:11;45914:39;45895:2;45892:1;45888:10;45883:15;;45859:101;;;45975:6;45972:1;45969:13;45966:2;;;46040:1;46031:6;46026:3;46022:16;46015:27;45966:2;45836:219;;;;:::o;46063:103::-;;46135:26;46155:5;46135:26;:::i;:::-;46124:37;;46118:48;;;:::o;46173:74::-;;46237:5;46226:16;;46220:27;;;:::o;46254:89::-;;46318:20;46332:5;46318:20;:::i;:::-;46307:31;;46301:42;;;:::o;46350:74::-;;46414:5;46403:16;;46397:27;;;:::o;46431:97::-;;46519:2;46515:7;46510:2;46503:5;46499:14;46495:28;46485:38;;46479:49;;;:::o;46536:94::-;;46614:5;46610:2;46606:14;46584:36;;46578:52;;;:::o;46638:117::-;46707:24;46725:5;46707:24;:::i;:::-;46700:5;46697:35;46687:2;;46746:1;46743;46736:12;46687:2;46681:74;:::o;46762:133::-;46839:32;46865:5;46839:32;:::i;:::-;46832:5;46829:43;46819:2;;46886:1;46883;46876:12;46819:2;46813:82;:::o;46902:111::-;46968:21;46983:5;46968:21;:::i;:::-;46961:5;46958:32;46948:2;;47004:1;47001;46994:12;46948:2;46942:71;:::o;47020:115::-;47088:23;47105:5;47088:23;:::i;:::-;47081:5;47078:34;47068:2;;47126:1;47123;47116:12;47068:2;47062:73;:::o;47142:117::-;47211:24;47229:5;47211:24;:::i;:::-;47204:5;47201:35;47191:2;;47250:1;47247;47240:12;47191:2;47185:74;:::o
Swarm Source
ipfs://1026bccd3153247a7a30b9f73fe814467b0444686c105ed0a32b226460a4540c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.