ERC-721
Overview
Max Total Supply
157 TAS
Holders
70
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TASLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TeenApeSquad
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-07 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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 payable(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; } } /** * @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); } /** * @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; } /** * @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); } /** * @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); } /** * @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); } /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } /** * @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; } } /** * @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); } } } } /** * @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)); } } /** * @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)))); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); { counter._value = value - 1; } } } /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev These functions deal with verification of Merkle trees (hash trees), */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } contract TeenApeSquad is ERC721, Ownable, Pausable { using SafeMath for uint256; using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; using MerkleProof for bytes32[]; uint256 public maxUserCanMint = 10; string public _tokenBaseURI = ""; bytes32 public merkleRoot; uint256 public maxSupply; uint256 public tokenPrice; uint256 public PresaleStartTime; uint256 public PresaleEndTime; uint256 public publicSaleStartTime; mapping(address => uint256[]) public tokenIdNumber; constructor( uint256 _maxSupply, uint256 _preSaleStartTime, uint256 _preSaleEndTime, uint256 _publicSaleStartTime, uint256 _tokenPrice) ERC721("Teen Ape Squad", "TAS") { require(_preSaleStartTime <= _preSaleEndTime); PresaleStartTime = _preSaleStartTime; PresaleEndTime = _preSaleEndTime; publicSaleStartTime = _publicSaleStartTime; maxSupply = _maxSupply; tokenPrice = _tokenPrice; } function mintToken(uint256 numberOfTokens) external payable { require(block.timestamp >= publicSaleStartTime, "block Time >= Sale start time"); require(numberOfTokens <= maxUserCanMint, "Can't mint more than 10"); _mint(numberOfTokens); } function _mint(uint256 numberOfTokens) internal{ require(numberOfTokens <= maxSupply.sub(_tokenIdCounter.current()), "Maxsupply limit has been Exeeded"); require(tokenPrice * numberOfTokens <= msg.value,"ETH amount is not sufficient"); for (uint256 i = 0; i < numberOfTokens; i++) { if (_tokenIdCounter.current() < maxSupply) { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId); tokenIdNumber[msg.sender].push(tokenId); } } } function preMint(bytes32[] memory proof,uint256 numberOfTokens) public payable { require(merkleRoot != 0, "Merkle root is not set"); uint256 remain = maxUserCanMint.sub(tokenIdNumber[msg.sender].length); require(remain >= numberOfTokens, "Your limit has been Exeeded"); require(numberOfTokens <= maxUserCanMint, "You can't mint more then 10 in a single transaction"); require(block.timestamp >= PresaleStartTime && block.timestamp <= PresaleEndTime, "Time is out of Presale Time"); require(proof.verify(merkleRoot, keccak256(abi.encodePacked(msg.sender))), "You are not in the list"); _mint(numberOfTokens); } function userTokens(address user) public view returns (uint256[] memory) { return tokenIdNumber[user]; } function setBaseURI(string calldata _uri) public onlyOwner { if (bytes(_uri).length != 0) _tokenBaseURI = _uri; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); return bytes(_tokenBaseURI).length > 0 ? string(abi.encodePacked(_tokenBaseURI, _tokenId.toString())) : "" ; } function maxMinted() public view returns(uint256){ uint256 tokenId = _tokenIdCounter.current(); return tokenId; } function setMintPrice(uint256 _mintPrice) external onlyOwner { tokenPrice = _mintPrice; } function getBalance() public view onlyOwner returns(uint256) { return address(this).balance; } function setPresaleTime(uint256 _start, uint256 _end) onlyOwner public{ require(_start <= _end, "Start <= End"); PresaleStartTime = _start; PresaleEndTime = _end; } function setPublicSale(uint256 _publicSale) onlyOwner public { publicSaleStartTime = _publicSale; } function burnToken( uint256 _tokenId) public { _burn( _tokenId); } function setMerkleRoot(bytes32 _root) public onlyOwner { merkleRoot = _root; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override { super._beforeTokenTransfer(from, to, tokenId); } event Received(address, uint); receive() external payable { emit Received(msg.sender, msg.value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_preSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"_preSaleEndTime","type":"uint256"},{"internalType":"uint256","name":"_publicSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"PresaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PresaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUserCanMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleStartTime","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"setPresaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSale","type":"uint256"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","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":"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600a600c5560405180602001604052806000815250600d9080519060200190620000309291906200034c565b503480156200003e57600080fd5b5060405162005d5338038062005d53833981810160405281019062000064919062000413565b6040518060400160405280600e81526020017f5465656e204170652053717561640000000000000000000000000000000000008152506040518060400160405280600381526020017f5441530000000000000000000000000000000000000000000000000000000000815250620000e86301ffc9a760e01b6200026c60201b60201c565b8160069080519060200190620001009291906200034c565b508060079080519060200190620001199291906200034c565b50620001326380ac58cd60e01b6200026c60201b60201c565b6200014a635b5e139f60e01b6200026c60201b60201c565b6200016263780e9d6360e01b6200026c60201b60201c565b50506000620001766200034460201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000600a60146101000a81548160ff021916908315150217905550828411156200023e57600080fd5b83601181905550826012819055508160138190555084600f81905550806010819055505050505050620005ac565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002cf90620004c2565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b8280546200035a90620004ff565b90600052602060002090601f0160209004810192826200037e5760008555620003ca565b82601f106200039957805160ff1916838001178555620003ca565b82800160010185558215620003ca579182015b82811115620003c9578251825591602001919060010190620003ac565b5b509050620003d99190620003dd565b5090565b5b80821115620003f8576000816000905550600101620003de565b5090565b6000815190506200040d8162000592565b92915050565b600080600080600060a0868803121562000432576200043162000564565b5b60006200044288828901620003fc565b95505060206200045588828901620003fc565b94505060406200046888828901620003fc565b93505060606200047b88828901620003fc565b92505060806200048e88828901620003fc565b9150509295509295909350565b6000620004aa601c83620004e4565b9150620004b78262000569565b602082019050919050565b60006020820190508181036000830152620004dd816200049b565b9050919050565b600082825260208201905092915050565b6000819050919050565b600060028204905060018216806200051857607f821691505b602082108114156200052f576200052e62000535565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b6200059d81620004f5565b8114620005a957600080fd5b50565b61579780620005bc6000396000f3fe60806040526004361061026b5760003560e01c806370a0823111610144578063c3e30196116100b6578063e3e184eb1161007a578063e3e184eb14610910578063e985e9c514610939578063ecb103e314610976578063ed498fa8146109b3578063f2fde38b146109f0578063f4a0a52814610a19576102ab565b8063c3e3019614610845578063c634d03214610861578063c87b56dd1461087d578063d5abeb01146108ba578063dd39ef5e146108e5576102ab565b80638456cb59116101085780638456cb591461075b5780638da5cb5b1461077257806395d89b411461079d578063a22cb465146107c8578063ad997f66146107f1578063b88d4fde1461081c576102ab565b806370a082311461068a578063715018a6146106c75780637b47ec1a146106de5780637cb64759146107075780637ff9b59614610730576102ab565b80633ccfd60b116101dd5780635c40329e116101a15780635c40329e146105785780635c975abb146105a15780636352211e146105cc5780636b5adc84146106095780636bb7b1d9146106345780636c0360eb1461065f576102ab565b80633ccfd60b146104bb5780633f4ba83a146104d257806342842e0e146104e95780634f6ccce71461051257806355f804b31461054f576102ab565b806318160ddd1161022f57806318160ddd146103a957806323b872dd146103d457806326352258146103fd5780632eb4a7ab146104285780632f745c59146104535780633ca4fb7614610490576102ab565b806301ffc9a7146102b057806306fdde03146102ed578063081812fc14610318578063095ea7b31461035557806312065fe01461037e576102ab565b366102ab577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587433346040516102a19291906144df565b60405180910390a1005b600080fd5b3480156102bc57600080fd5b506102d760048036038101906102d29190613c07565b610a42565b6040516102e4919061452a565b60405180910390f35b3480156102f957600080fd5b50610302610aa9565b60405161030f9190614560565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613cae565b610b3b565b60405161034c919061445d565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190613b3e565b610bc0565b005b34801561038a57600080fd5b50610393610cd8565b6040516103a09190614982565b60405180910390f35b3480156103b557600080fd5b506103be610d5c565b6040516103cb9190614982565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190613a28565b610d6d565b005b34801561040957600080fd5b50610412610dcd565b60405161041f9190614982565b60405180910390f35b34801561043457600080fd5b5061043d610de3565b60405161044a9190614545565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613b3e565b610de9565b6040516104879190614982565b60405180910390f35b34801561049c57600080fd5b506104a5610e44565b6040516104b29190614560565b60405180910390f35b3480156104c757600080fd5b506104d0610ed2565b005b3480156104de57600080fd5b506104e7610f9d565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613a28565b611023565b005b34801561051e57600080fd5b5061053960048036038101906105349190613cae565b611043565b6040516105469190614982565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190613c61565b611066565b005b34801561058457600080fd5b5061059f600480360381019061059a9190613cdb565b611104565b005b3480156105ad57600080fd5b506105b66111d5565b6040516105c3919061452a565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613cae565b6111ec565b604051610600919061445d565b60405180910390f35b34801561061557600080fd5b5061061e611223565b60405161062b9190614982565b60405180910390f35b34801561064057600080fd5b50610649611229565b6040516106569190614982565b60405180910390f35b34801561066b57600080fd5b5061067461122f565b6040516106819190614560565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac91906139bb565b6112c1565b6040516106be9190614982565b60405180910390f35b3480156106d357600080fd5b506106dc611380565b005b3480156106ea57600080fd5b5061070560048036038101906107009190613cae565b6114bd565b005b34801561071357600080fd5b5061072e60048036038101906107299190613bda565b6114c9565b005b34801561073c57600080fd5b5061074561154f565b6040516107529190614982565b60405180910390f35b34801561076757600080fd5b50610770611555565b005b34801561077e57600080fd5b506107876115db565b604051610794919061445d565b60405180910390f35b3480156107a957600080fd5b506107b2611605565b6040516107bf9190614560565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190613afe565b611697565b005b3480156107fd57600080fd5b50610806611818565b6040516108139190614982565b60405180910390f35b34801561082857600080fd5b50610843600480360381019061083e9190613a7b565b61181e565b005b61085f600480360381019061085a9190613b7e565b611880565b005b61087b60048036038101906108769190613cae565b611a88565b005b34801561088957600080fd5b506108a4600480360381019061089f9190613cae565b611b1e565b6040516108b19190614560565b60405180910390f35b3480156108c657600080fd5b506108cf611bc6565b6040516108dc9190614982565b60405180910390f35b3480156108f157600080fd5b506108fa611bcc565b6040516109079190614982565b60405180910390f35b34801561091c57600080fd5b5061093760048036038101906109329190613cae565b611bd2565b005b34801561094557600080fd5b50610960600480360381019061095b91906139e8565b611c58565b60405161096d919061452a565b60405180910390f35b34801561098257600080fd5b5061099d60048036038101906109989190613b3e565b611cec565b6040516109aa9190614982565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d591906139bb565b611d1d565b6040516109e79190614508565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a1291906139bb565b611db4565b005b348015610a2557600080fd5b50610a406004803603810190610a3b9190613cae565b611f60565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054610ab890614cd8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae490614cd8565b8015610b315780601f10610b0657610100808354040283529160200191610b31565b820191906000526020600020905b815481529060010190602001808311610b1457829003601f168201915b5050505050905090565b6000610b4682611fe6565b610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90614802565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bcb826111ec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c33906148c2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c5b612003565b73ffffffffffffffffffffffffffffffffffffffff161480610c8a5750610c8981610c84612003565b611c58565b5b610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090614762565b60405180910390fd5b610cd3838361200b565b505050565b6000610ce2612003565b73ffffffffffffffffffffffffffffffffffffffff16610d006115db565b73ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90614822565b60405180910390fd5b47905090565b6000610d6860026120c4565b905090565b610d7e610d78612003565b826120d9565b610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906148e2565b60405180910390fd5b610dc88383836121b7565b505050565b600080610dda600b6123ce565b90508091505090565b600e5481565b6000610e3c82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206123dc90919063ffffffff16565b905092915050565b600d8054610e5190614cd8565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7d90614cd8565b8015610eca5780601f10610e9f57610100808354040283529160200191610eca565b820191906000526020600020905b815481529060010190602001808311610ead57829003601f168201915b505050505081565b610eda612003565b73ffffffffffffffffffffffffffffffffffffffff16610ef86115db565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590614822565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f99573d6000803e3d6000fd5b5050565b610fa5612003565b73ffffffffffffffffffffffffffffffffffffffff16610fc36115db565b73ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090614822565b60405180910390fd5b6110216123f6565b565b61103e8383836040518060200160405280600081525061181e565b505050565b60008061105a83600261249890919063ffffffff16565b50905080915050919050565b61106e612003565b73ffffffffffffffffffffffffffffffffffffffff1661108c6115db565b73ffffffffffffffffffffffffffffffffffffffff16146110e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d990614822565b60405180910390fd5b60008282905014611100578181600d91906110fe9291906136f6565b505b5050565b61110c612003565b73ffffffffffffffffffffffffffffffffffffffff1661112a6115db565b73ffffffffffffffffffffffffffffffffffffffff1614611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614822565b60405180910390fd5b808211156111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba906147c2565b60405180910390fd5b81601181905550806012819055505050565b6000600a60149054906101000a900460ff16905090565b600061121c826040518060600160405280602981526020016157396029913960026124c49092919063ffffffff16565b9050919050565b60115481565b60135481565b60606009805461123e90614cd8565b80601f016020809104026020016040519081016040528092919081815260200182805461126a90614cd8565b80156112b75780601f1061128c576101008083540402835291602001916112b7565b820191906000526020600020905b81548152906001019060200180831161129a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132990614782565b60405180910390fd5b611379600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124e3565b9050919050565b611388612003565b73ffffffffffffffffffffffffffffffffffffffff166113a66115db565b73ffffffffffffffffffffffffffffffffffffffff16146113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f390614822565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114c6816124f8565b50565b6114d1612003565b73ffffffffffffffffffffffffffffffffffffffff166114ef6115db565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614822565b60405180910390fd5b80600e8190555050565b60105481565b61155d612003565b73ffffffffffffffffffffffffffffffffffffffff1661157b6115db565b73ffffffffffffffffffffffffffffffffffffffff16146115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614822565b60405180910390fd5b6115d961262a565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606007805461161490614cd8565b80601f016020809104026020016040519081016040528092919081815260200182805461164090614cd8565b801561168d5780601f106116625761010080835404028352916020019161168d565b820191906000526020600020905b81548152906001019060200180831161167057829003601f168201915b5050505050905090565b61169f612003565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490614662565b60405180910390fd5b806005600061171a612003565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117c7612003565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161180c919061452a565b60405180910390a35050565b60125481565b61182f611829612003565b836120d9565b61186e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611865906148e2565b60405180910390fd5b61187a848484846126cd565b50505050565b6000801b600e5414156118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf90614702565b60405180910390fd5b6000611921601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050600c5461272990919063ffffffff16565b905081811015611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614922565b60405180910390fd5b600c548211156119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a290614962565b60405180910390fd5b60115442101580156119bf57506012544211155b6119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f5906148a2565b60405180910390fd5b611a3b600e5433604051602001611a1591906143db565b60405160208183030381529060405280519060200120856127829092919063ffffffff16565b611a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7190614742565b60405180910390fd5b611a8382612838565b505050565b601354421015611acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac490614842565b60405180910390fd5b600c54811115611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614942565b60405180910390fd5b611b1b81612838565b50565b6060611b2982611fe6565b611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f90614882565b60405180910390fd5b6000600d8054611b7790614cd8565b905011611b935760405180602001604052806000815250611bbf565b600d611b9e836129a7565b604051602001611baf929190614439565b6040516020818303038152906040525b9050919050565b600f5481565b600c5481565b611bda612003565b73ffffffffffffffffffffffffffffffffffffffff16611bf86115db565b73ffffffffffffffffffffffffffffffffffffffff1614611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590614822565b60405180910390fd5b8060138190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60146020528160005260406000208181548110611d0857600080fd5b90600052602060002001600091509150505481565b6060601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611da857602002820191906000526020600020905b815481526020019060010190808311611d94575b50505050509050919050565b611dbc612003565b73ffffffffffffffffffffffffffffffffffffffff16611dda6115db565b73ffffffffffffffffffffffffffffffffffffffff1614611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790614822565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e97906145e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f68612003565b73ffffffffffffffffffffffffffffffffffffffff16611f866115db565b73ffffffffffffffffffffffffffffffffffffffff1614611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390614822565b60405180910390fd5b8060108190555050565b6000611ffc826002612b0890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661207e836111ec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006120d282600001612b22565b9050919050565b60006120e482611fe6565b612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a906146e2565b60405180910390fd5b600061212e836111ec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061219d57508373ffffffffffffffffffffffffffffffffffffffff1661218584610b3b565b73ffffffffffffffffffffffffffffffffffffffff16145b806121ae57506121ad8185611c58565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121d7826111ec565b73ffffffffffffffffffffffffffffffffffffffff161461222d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222490614862565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229490614642565b60405180910390fd5b6122a8838383612b33565b6122b360008261200b565b61230481600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b8b90919063ffffffff16565b5061235681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ba590919063ffffffff16565b5061236d81836002612bbf9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b60006123eb8360000183612bf4565b60001c905092915050565b6123fe6111d5565b61243d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612434906145a2565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612481612003565b60405161248e9190614478565b60405180910390a1565b6000806000806124ab8660000186612c68565b915091508160001c8160001c9350935050509250929050565b60006124d7846000018460001b84612cf2565b60001c90509392505050565b60006124f182600001612d93565b9050919050565b6000612503826111ec565b905061251181600084612b33565b61251c60008361200b565b600060086000848152602001908152602001600020805461253c90614cd8565b90501461256357600860008381526020019081526020016000206000612562919061377c565b5b6125b482600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b8b90919063ffffffff16565b506125c9826002612da490919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6126326111d5565b15612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990614722565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126b6612003565b6040516126c39190614478565b60405180910390a1565b6126d88484846121b7565b6126e484848484612dbe565b612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a906145c2565b60405180910390fd5b50505050565b60008282111561276e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276590614682565b60405180910390fd5b818361277a9190614b9c565b905092915050565b60008082905060005b855181101561282a5760008682815181106127a9576127a8614e9f565b5b602002602001015190508083116127ea5782816040516020016127cd9291906143f6565b604051602081830303815290604052805190602001209250612816565b80836040516020016127fd9291906143f6565b6040516020818303038152906040528051906020012092505b50808061282290614d3b565b91505061278b565b508381149150509392505050565b612856612845600b6123ce565b600f5461272990919063ffffffff16565b811115612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f90614622565b60405180910390fd5b34816010546128a79190614b42565b11156128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906146c2565b60405180910390fd5b60005b818110156129a357600f54612900600b6123ce565b1015612990576000612912600b6123ce565b905061291e600b612f22565b6129283382612f41565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055505b808061299b90614d3b565b9150506128eb565b5050565b606060008214156129ef576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b03565b600082905060005b60008214612a21578080612a0a90614d3b565b915050600a82612a1a9190614b11565b91506129f7565b60008167ffffffffffffffff811115612a3d57612a3c614ece565b5b6040519080825280601f01601f191660200182016040528015612a6f5781602001600182028036833780820191505090505b5090505b60008514612afc57600182612a889190614b9c565b9150600a85612a979190614db2565b6030612aa39190614abb565b60f81b818381518110612ab957612ab8614e9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612af59190614b11565b9450612a73565b8093505050505b919050565b6000612b1a836000018360001b612f5f565b905092915050565b600081600001805490509050919050565b612b3b6111d5565b15612b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7290614722565b60405180910390fd5b612b86838383612f82565b505050565b6000612b9d836000018360001b612f87565b905092915050565b6000612bb7836000018360001b61309f565b905092915050565b6000612beb846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61310f565b90509392505050565b600081836000018054905011612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690614582565b60405180910390fd5b826000018281548110612c5557612c54614e9f565b5b9060005260206000200154905092915050565b60008082846000018054905011612cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cab906147a2565b60405180910390fd5b6000846000018481548110612ccc57612ccb614e9f565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b9190614560565b60405180910390fd5b5084600001600182612d669190614b9c565b81548110612d7757612d76614e9f565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612db6836000018360001b6131fb565b905092915050565b6000612ddf8473ffffffffffffffffffffffffffffffffffffffff16613344565b612dec5760019050612f1a565b6000612eb363150b7a0260e01b612e01612003565b888787604051602401612e179493929190614493565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615707603291398773ffffffffffffffffffffffffffffffffffffffff166133579092919063ffffffff16565b9050600081806020019051810190612ecb9190613c34565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6001816000016000828254612f379190614abb565b9250508190555050565b612f5b82826040518060200160405280600081525061336f565b5050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b60008083600101600084815260200190815260200160002054905060008114613093576000600182612fb99190614b9c565b9050600060018660000180549050612fd19190614b9c565b90506000866000018281548110612feb57612fea614e9f565b5b906000526020600020015490508087600001848154811061300f5761300e614e9f565b5b906000526020600020018190555060018361302a9190614abb565b876001016000838152602001908152602001600020819055508660000180548061305757613056614e70565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613099565b60009150505b92915050565b60006130ab83836133ca565b613104578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613109565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156131b6578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506131f4565b82856000016001836131c89190614b9c565b815481106131d9576131d8614e9f565b5b90600052602060002090600202016001018190555060009150505b9392505050565b6000808360010160008481526020019081526020016000205490506000811461333857600060018261322d9190614b9c565b90506000600186600001805490506132459190614b9c565b9050600086600001828154811061325f5761325e614e9f565b5b906000526020600020906002020190508087600001848154811061328657613285614e9f565b5b906000526020600020906002020160008201548160000155600182015481600101559050506001836132b89190614abb565b8760010160008360000154815260200190815260200160002081905550866000018054806132e9576132e8614e70565b5b600190038181906000526020600020906002020160008082016000905560018201600090555050905586600101600087815260200190815260200160002060009055600194505050505061333e565b60009150505b92915050565b600080823b905060008111915050919050565b606061336684846000856133ed565b90509392505050565b6133798383613501565b6133866000848484612dbe565b6133c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bc906145c2565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613429906146a2565b60405180910390fd5b61343b85613344565b61347a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347190614902565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516134a39190614422565b60006040518083038185875af1925050503d80600081146134e0576040519150601f19603f3d011682016040523d82523d6000602084013e6134e5565b606091505b50915091506134f582828661368f565b92505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613568906147e2565b60405180910390fd5b61357a81611fe6565b156135ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b190614602565b60405180910390fd5b6135c660008383612b33565b61361781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ba590919063ffffffff16565b5061362e81836002612bbf9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6060831561369f578290506136ef565b6000835111156136b25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e69190614560565b60405180910390fd5b9392505050565b82805461370290614cd8565b90600052602060002090601f016020900481019282613724576000855561376b565b82601f1061373d57803560ff191683800117855561376b565b8280016001018555821561376b579182015b8281111561376a57823582559160200191906001019061374f565b5b50905061377891906137bc565b5090565b50805461378890614cd8565b6000825580601f1061379a57506137b9565b601f0160209004906000526020600020908101906137b891906137bc565b5b50565b5b808211156137d55760008160009055506001016137bd565b5090565b60006137ec6137e7846149c2565b61499d565b9050808382526020820190508285602086028201111561380f5761380e614f07565b5b60005b8581101561383f578161382588826138e3565b845260208401935060208301925050600181019050613812565b5050509392505050565b600061385c613857846149ee565b61499d565b90508281526020810184848401111561387857613877614f0c565b5b613883848285614c96565b509392505050565b60008135905061389a81615693565b92915050565b600082601f8301126138b5576138b4614f02565b5b81356138c58482602086016137d9565b91505092915050565b6000813590506138dd816156aa565b92915050565b6000813590506138f2816156c1565b92915050565b600081359050613907816156d8565b92915050565b60008151905061391c816156d8565b92915050565b600082601f83011261393757613936614f02565b5b8135613947848260208601613849565b91505092915050565b60008083601f84011261396657613965614f02565b5b8235905067ffffffffffffffff81111561398357613982614efd565b5b60208301915083600182028301111561399f5761399e614f07565b5b9250929050565b6000813590506139b5816156ef565b92915050565b6000602082840312156139d1576139d0614f16565b5b60006139df8482850161388b565b91505092915050565b600080604083850312156139ff576139fe614f16565b5b6000613a0d8582860161388b565b9250506020613a1e8582860161388b565b9150509250929050565b600080600060608486031215613a4157613a40614f16565b5b6000613a4f8682870161388b565b9350506020613a608682870161388b565b9250506040613a71868287016139a6565b9150509250925092565b60008060008060808587031215613a9557613a94614f16565b5b6000613aa38782880161388b565b9450506020613ab48782880161388b565b9350506040613ac5878288016139a6565b925050606085013567ffffffffffffffff811115613ae657613ae5614f11565b5b613af287828801613922565b91505092959194509250565b60008060408385031215613b1557613b14614f16565b5b6000613b238582860161388b565b9250506020613b34858286016138ce565b9150509250929050565b60008060408385031215613b5557613b54614f16565b5b6000613b638582860161388b565b9250506020613b74858286016139a6565b9150509250929050565b60008060408385031215613b9557613b94614f16565b5b600083013567ffffffffffffffff811115613bb357613bb2614f11565b5b613bbf858286016138a0565b9250506020613bd0858286016139a6565b9150509250929050565b600060208284031215613bf057613bef614f16565b5b6000613bfe848285016138e3565b91505092915050565b600060208284031215613c1d57613c1c614f16565b5b6000613c2b848285016138f8565b91505092915050565b600060208284031215613c4a57613c49614f16565b5b6000613c588482850161390d565b91505092915050565b60008060208385031215613c7857613c77614f16565b5b600083013567ffffffffffffffff811115613c9657613c95614f11565b5b613ca285828601613950565b92509250509250929050565b600060208284031215613cc457613cc3614f16565b5b6000613cd2848285016139a6565b91505092915050565b60008060408385031215613cf257613cf1614f16565b5b6000613d00858286016139a6565b9250506020613d11858286016139a6565b9150509250929050565b6000613d2783836143bd565b60208301905092915050565b613d3c81614c60565b82525050565b613d4b81614be2565b82525050565b613d5a81614bd0565b82525050565b613d71613d6c82614bd0565b614d84565b82525050565b6000613d8282614a44565b613d8c8185614a72565b9350613d9783614a1f565b8060005b83811015613dc8578151613daf8882613d1b565b9750613dba83614a65565b925050600181019050613d9b565b5085935050505092915050565b613dde81614bf4565b82525050565b613ded81614c00565b82525050565b613e04613dff82614c00565b614d96565b82525050565b6000613e1582614a4f565b613e1f8185614a83565b9350613e2f818560208601614ca5565b613e3881614f1b565b840191505092915050565b6000613e4e82614a4f565b613e588185614a94565b9350613e68818560208601614ca5565b80840191505092915050565b6000613e7f82614a5a565b613e898185614a9f565b9350613e99818560208601614ca5565b613ea281614f1b565b840191505092915050565b6000613eb882614a5a565b613ec28185614ab0565b9350613ed2818560208601614ca5565b80840191505092915050565b60008154613eeb81614cd8565b613ef58186614ab0565b94506001821660008114613f105760018114613f2157613f54565b60ff19831686528186019350613f54565b613f2a85614a2f565b60005b83811015613f4c57815481890152600182019150602081019050613f2d565b838801955050505b50505092915050565b6000613f6a602283614a9f565b9150613f7582614f39565b604082019050919050565b6000613f8d601483614a9f565b9150613f9882614f88565b602082019050919050565b6000613fb0603283614a9f565b9150613fbb82614fb1565b604082019050919050565b6000613fd3602683614a9f565b9150613fde82615000565b604082019050919050565b6000613ff6601c83614a9f565b91506140018261504f565b602082019050919050565b6000614019602083614a9f565b915061402482615078565b602082019050919050565b600061403c602483614a9f565b9150614047826150a1565b604082019050919050565b600061405f601983614a9f565b915061406a826150f0565b602082019050919050565b6000614082601e83614a9f565b915061408d82615119565b602082019050919050565b60006140a5602683614a9f565b91506140b082615142565b604082019050919050565b60006140c8601c83614a9f565b91506140d382615191565b602082019050919050565b60006140eb602c83614a9f565b91506140f6826151ba565b604082019050919050565b600061410e601683614a9f565b915061411982615209565b602082019050919050565b6000614131601083614a9f565b915061413c82615232565b602082019050919050565b6000614154601783614a9f565b915061415f8261525b565b602082019050919050565b6000614177603883614a9f565b915061418282615284565b604082019050919050565b600061419a602a83614a9f565b91506141a5826152d3565b604082019050919050565b60006141bd602283614a9f565b91506141c882615322565b604082019050919050565b60006141e0600c83614a9f565b91506141eb82615371565b602082019050919050565b6000614203602083614a9f565b915061420e8261539a565b602082019050919050565b6000614226602c83614a9f565b9150614231826153c3565b604082019050919050565b6000614249602083614a9f565b915061425482615412565b602082019050919050565b600061426c601d83614a9f565b91506142778261543b565b602082019050919050565b600061428f602983614a9f565b915061429a82615464565b604082019050919050565b60006142b2602f83614a9f565b91506142bd826154b3565b604082019050919050565b60006142d5601b83614a9f565b91506142e082615502565b602082019050919050565b60006142f8602183614a9f565b91506143038261552b565b604082019050919050565b600061431b603183614a9f565b91506143268261557a565b604082019050919050565b600061433e601d83614a9f565b9150614349826155c9565b602082019050919050565b6000614361601b83614a9f565b915061436c826155f2565b602082019050919050565b6000614384601783614a9f565b915061438f8261561b565b602082019050919050565b60006143a7603383614a9f565b91506143b282615644565b604082019050919050565b6143c681614c56565b82525050565b6143d581614c56565b82525050565b60006143e78284613d60565b60148201915081905092915050565b60006144028285613df3565b6020820191506144128284613df3565b6020820191508190509392505050565b600061442e8284613e43565b915081905092915050565b60006144458285613ede565b91506144518284613ead565b91508190509392505050565b60006020820190506144726000830184613d51565b92915050565b600060208201905061448d6000830184613d33565b92915050565b60006080820190506144a86000830187613d42565b6144b56020830186613d51565b6144c260408301856143cc565b81810360608301526144d48184613e0a565b905095945050505050565b60006040820190506144f46000830185613d51565b61450160208301846143cc565b9392505050565b600060208201905081810360008301526145228184613d77565b905092915050565b600060208201905061453f6000830184613dd5565b92915050565b600060208201905061455a6000830184613de4565b92915050565b6000602082019050818103600083015261457a8184613e74565b905092915050565b6000602082019050818103600083015261459b81613f5d565b9050919050565b600060208201905081810360008301526145bb81613f80565b9050919050565b600060208201905081810360008301526145db81613fa3565b9050919050565b600060208201905081810360008301526145fb81613fc6565b9050919050565b6000602082019050818103600083015261461b81613fe9565b9050919050565b6000602082019050818103600083015261463b8161400c565b9050919050565b6000602082019050818103600083015261465b8161402f565b9050919050565b6000602082019050818103600083015261467b81614052565b9050919050565b6000602082019050818103600083015261469b81614075565b9050919050565b600060208201905081810360008301526146bb81614098565b9050919050565b600060208201905081810360008301526146db816140bb565b9050919050565b600060208201905081810360008301526146fb816140de565b9050919050565b6000602082019050818103600083015261471b81614101565b9050919050565b6000602082019050818103600083015261473b81614124565b9050919050565b6000602082019050818103600083015261475b81614147565b9050919050565b6000602082019050818103600083015261477b8161416a565b9050919050565b6000602082019050818103600083015261479b8161418d565b9050919050565b600060208201905081810360008301526147bb816141b0565b9050919050565b600060208201905081810360008301526147db816141d3565b9050919050565b600060208201905081810360008301526147fb816141f6565b9050919050565b6000602082019050818103600083015261481b81614219565b9050919050565b6000602082019050818103600083015261483b8161423c565b9050919050565b6000602082019050818103600083015261485b8161425f565b9050919050565b6000602082019050818103600083015261487b81614282565b9050919050565b6000602082019050818103600083015261489b816142a5565b9050919050565b600060208201905081810360008301526148bb816142c8565b9050919050565b600060208201905081810360008301526148db816142eb565b9050919050565b600060208201905081810360008301526148fb8161430e565b9050919050565b6000602082019050818103600083015261491b81614331565b9050919050565b6000602082019050818103600083015261493b81614354565b9050919050565b6000602082019050818103600083015261495b81614377565b9050919050565b6000602082019050818103600083015261497b8161439a565b9050919050565b600060208201905061499760008301846143cc565b92915050565b60006149a76149b8565b90506149b38282614d0a565b919050565b6000604051905090565b600067ffffffffffffffff8211156149dd576149dc614ece565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a0957614a08614ece565b5b614a1282614f1b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ac682614c56565b9150614ad183614c56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b0657614b05614de3565b5b828201905092915050565b6000614b1c82614c56565b9150614b2783614c56565b925082614b3757614b36614e12565b5b828204905092915050565b6000614b4d82614c56565b9150614b5883614c56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b9157614b90614de3565b5b828202905092915050565b6000614ba782614c56565b9150614bb283614c56565b925082821015614bc557614bc4614de3565b5b828203905092915050565b6000614bdb82614c36565b9050919050565b6000614bed82614c36565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614c6b82614c72565b9050919050565b6000614c7d82614c84565b9050919050565b6000614c8f82614c36565b9050919050565b82818337600083830152505050565b60005b83811015614cc3578082015181840152602081019050614ca8565b83811115614cd2576000848401525b50505050565b60006002820490506001821680614cf057607f821691505b60208210811415614d0457614d03614e41565b5b50919050565b614d1382614f1b565b810181811067ffffffffffffffff82111715614d3257614d31614ece565b5b80604052505050565b6000614d4682614c56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d7957614d78614de3565b5b600182019050919050565b6000614d8f82614da0565b9050919050565b6000819050919050565b6000614dab82614f2c565b9050919050565b6000614dbd82614c56565b9150614dc883614c56565b925082614dd857614dd7614e12565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d6178737570706c79206c696d697420686173206265656e2045786565646564600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d65726b6c6520726f6f74206973206e6f742073657400000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e20746865206c697374000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274203c3d20456e640000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f626c6f636b2054696d65203e3d2053616c652073746172742074696d65000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54696d65206973206f7574206f662050726573616c652054696d650000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f596f7572206c696d697420686173206265656e20457865656465640000000000600082015250565b7f43616e2774206d696e74206d6f7265207468616e203130000000000000000000600082015250565b7f596f752063616e2774206d696e74206d6f7265207468656e20313020696e206160008201527f2073696e676c65207472616e73616374696f6e00000000000000000000000000602082015250565b61569c81614bd0565b81146156a757600080fd5b50565b6156b381614bf4565b81146156be57600080fd5b50565b6156ca81614c00565b81146156d557600080fd5b50565b6156e181614c0a565b81146156ec57600080fd5b50565b6156f881614c56565b811461570357600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220544df123e3291c114c8d3ea1d61b65b11634612105ae44d9bade8d5c6251729264736f6c6343000807003300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000061f404f00000000000000000000000000000000000000000000000000000000061f556700000000000000000000000000000000000000000000000000000000061f56480000000000000000000000000000000000000000000000000011c37937e080000
Deployed Bytecode
0x60806040526004361061026b5760003560e01c806370a0823111610144578063c3e30196116100b6578063e3e184eb1161007a578063e3e184eb14610910578063e985e9c514610939578063ecb103e314610976578063ed498fa8146109b3578063f2fde38b146109f0578063f4a0a52814610a19576102ab565b8063c3e3019614610845578063c634d03214610861578063c87b56dd1461087d578063d5abeb01146108ba578063dd39ef5e146108e5576102ab565b80638456cb59116101085780638456cb591461075b5780638da5cb5b1461077257806395d89b411461079d578063a22cb465146107c8578063ad997f66146107f1578063b88d4fde1461081c576102ab565b806370a082311461068a578063715018a6146106c75780637b47ec1a146106de5780637cb64759146107075780637ff9b59614610730576102ab565b80633ccfd60b116101dd5780635c40329e116101a15780635c40329e146105785780635c975abb146105a15780636352211e146105cc5780636b5adc84146106095780636bb7b1d9146106345780636c0360eb1461065f576102ab565b80633ccfd60b146104bb5780633f4ba83a146104d257806342842e0e146104e95780634f6ccce71461051257806355f804b31461054f576102ab565b806318160ddd1161022f57806318160ddd146103a957806323b872dd146103d457806326352258146103fd5780632eb4a7ab146104285780632f745c59146104535780633ca4fb7614610490576102ab565b806301ffc9a7146102b057806306fdde03146102ed578063081812fc14610318578063095ea7b31461035557806312065fe01461037e576102ab565b366102ab577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587433346040516102a19291906144df565b60405180910390a1005b600080fd5b3480156102bc57600080fd5b506102d760048036038101906102d29190613c07565b610a42565b6040516102e4919061452a565b60405180910390f35b3480156102f957600080fd5b50610302610aa9565b60405161030f9190614560565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613cae565b610b3b565b60405161034c919061445d565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190613b3e565b610bc0565b005b34801561038a57600080fd5b50610393610cd8565b6040516103a09190614982565b60405180910390f35b3480156103b557600080fd5b506103be610d5c565b6040516103cb9190614982565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190613a28565b610d6d565b005b34801561040957600080fd5b50610412610dcd565b60405161041f9190614982565b60405180910390f35b34801561043457600080fd5b5061043d610de3565b60405161044a9190614545565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613b3e565b610de9565b6040516104879190614982565b60405180910390f35b34801561049c57600080fd5b506104a5610e44565b6040516104b29190614560565b60405180910390f35b3480156104c757600080fd5b506104d0610ed2565b005b3480156104de57600080fd5b506104e7610f9d565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613a28565b611023565b005b34801561051e57600080fd5b5061053960048036038101906105349190613cae565b611043565b6040516105469190614982565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190613c61565b611066565b005b34801561058457600080fd5b5061059f600480360381019061059a9190613cdb565b611104565b005b3480156105ad57600080fd5b506105b66111d5565b6040516105c3919061452a565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613cae565b6111ec565b604051610600919061445d565b60405180910390f35b34801561061557600080fd5b5061061e611223565b60405161062b9190614982565b60405180910390f35b34801561064057600080fd5b50610649611229565b6040516106569190614982565b60405180910390f35b34801561066b57600080fd5b5061067461122f565b6040516106819190614560565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac91906139bb565b6112c1565b6040516106be9190614982565b60405180910390f35b3480156106d357600080fd5b506106dc611380565b005b3480156106ea57600080fd5b5061070560048036038101906107009190613cae565b6114bd565b005b34801561071357600080fd5b5061072e60048036038101906107299190613bda565b6114c9565b005b34801561073c57600080fd5b5061074561154f565b6040516107529190614982565b60405180910390f35b34801561076757600080fd5b50610770611555565b005b34801561077e57600080fd5b506107876115db565b604051610794919061445d565b60405180910390f35b3480156107a957600080fd5b506107b2611605565b6040516107bf9190614560565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190613afe565b611697565b005b3480156107fd57600080fd5b50610806611818565b6040516108139190614982565b60405180910390f35b34801561082857600080fd5b50610843600480360381019061083e9190613a7b565b61181e565b005b61085f600480360381019061085a9190613b7e565b611880565b005b61087b60048036038101906108769190613cae565b611a88565b005b34801561088957600080fd5b506108a4600480360381019061089f9190613cae565b611b1e565b6040516108b19190614560565b60405180910390f35b3480156108c657600080fd5b506108cf611bc6565b6040516108dc9190614982565b60405180910390f35b3480156108f157600080fd5b506108fa611bcc565b6040516109079190614982565b60405180910390f35b34801561091c57600080fd5b5061093760048036038101906109329190613cae565b611bd2565b005b34801561094557600080fd5b50610960600480360381019061095b91906139e8565b611c58565b60405161096d919061452a565b60405180910390f35b34801561098257600080fd5b5061099d60048036038101906109989190613b3e565b611cec565b6040516109aa9190614982565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d591906139bb565b611d1d565b6040516109e79190614508565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a1291906139bb565b611db4565b005b348015610a2557600080fd5b50610a406004803603810190610a3b9190613cae565b611f60565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054610ab890614cd8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae490614cd8565b8015610b315780601f10610b0657610100808354040283529160200191610b31565b820191906000526020600020905b815481529060010190602001808311610b1457829003601f168201915b5050505050905090565b6000610b4682611fe6565b610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90614802565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bcb826111ec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c33906148c2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c5b612003565b73ffffffffffffffffffffffffffffffffffffffff161480610c8a5750610c8981610c84612003565b611c58565b5b610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090614762565b60405180910390fd5b610cd3838361200b565b505050565b6000610ce2612003565b73ffffffffffffffffffffffffffffffffffffffff16610d006115db565b73ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90614822565b60405180910390fd5b47905090565b6000610d6860026120c4565b905090565b610d7e610d78612003565b826120d9565b610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906148e2565b60405180910390fd5b610dc88383836121b7565b505050565b600080610dda600b6123ce565b90508091505090565b600e5481565b6000610e3c82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206123dc90919063ffffffff16565b905092915050565b600d8054610e5190614cd8565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7d90614cd8565b8015610eca5780601f10610e9f57610100808354040283529160200191610eca565b820191906000526020600020905b815481529060010190602001808311610ead57829003601f168201915b505050505081565b610eda612003565b73ffffffffffffffffffffffffffffffffffffffff16610ef86115db565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590614822565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f99573d6000803e3d6000fd5b5050565b610fa5612003565b73ffffffffffffffffffffffffffffffffffffffff16610fc36115db565b73ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090614822565b60405180910390fd5b6110216123f6565b565b61103e8383836040518060200160405280600081525061181e565b505050565b60008061105a83600261249890919063ffffffff16565b50905080915050919050565b61106e612003565b73ffffffffffffffffffffffffffffffffffffffff1661108c6115db565b73ffffffffffffffffffffffffffffffffffffffff16146110e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d990614822565b60405180910390fd5b60008282905014611100578181600d91906110fe9291906136f6565b505b5050565b61110c612003565b73ffffffffffffffffffffffffffffffffffffffff1661112a6115db565b73ffffffffffffffffffffffffffffffffffffffff1614611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614822565b60405180910390fd5b808211156111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba906147c2565b60405180910390fd5b81601181905550806012819055505050565b6000600a60149054906101000a900460ff16905090565b600061121c826040518060600160405280602981526020016157396029913960026124c49092919063ffffffff16565b9050919050565b60115481565b60135481565b60606009805461123e90614cd8565b80601f016020809104026020016040519081016040528092919081815260200182805461126a90614cd8565b80156112b75780601f1061128c576101008083540402835291602001916112b7565b820191906000526020600020905b81548152906001019060200180831161129a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132990614782565b60405180910390fd5b611379600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124e3565b9050919050565b611388612003565b73ffffffffffffffffffffffffffffffffffffffff166113a66115db565b73ffffffffffffffffffffffffffffffffffffffff16146113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f390614822565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114c6816124f8565b50565b6114d1612003565b73ffffffffffffffffffffffffffffffffffffffff166114ef6115db565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614822565b60405180910390fd5b80600e8190555050565b60105481565b61155d612003565b73ffffffffffffffffffffffffffffffffffffffff1661157b6115db565b73ffffffffffffffffffffffffffffffffffffffff16146115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614822565b60405180910390fd5b6115d961262a565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606007805461161490614cd8565b80601f016020809104026020016040519081016040528092919081815260200182805461164090614cd8565b801561168d5780601f106116625761010080835404028352916020019161168d565b820191906000526020600020905b81548152906001019060200180831161167057829003601f168201915b5050505050905090565b61169f612003565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490614662565b60405180910390fd5b806005600061171a612003565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117c7612003565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161180c919061452a565b60405180910390a35050565b60125481565b61182f611829612003565b836120d9565b61186e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611865906148e2565b60405180910390fd5b61187a848484846126cd565b50505050565b6000801b600e5414156118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf90614702565b60405180910390fd5b6000611921601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050600c5461272990919063ffffffff16565b905081811015611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614922565b60405180910390fd5b600c548211156119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a290614962565b60405180910390fd5b60115442101580156119bf57506012544211155b6119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f5906148a2565b60405180910390fd5b611a3b600e5433604051602001611a1591906143db565b60405160208183030381529060405280519060200120856127829092919063ffffffff16565b611a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7190614742565b60405180910390fd5b611a8382612838565b505050565b601354421015611acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac490614842565b60405180910390fd5b600c54811115611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614942565b60405180910390fd5b611b1b81612838565b50565b6060611b2982611fe6565b611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f90614882565b60405180910390fd5b6000600d8054611b7790614cd8565b905011611b935760405180602001604052806000815250611bbf565b600d611b9e836129a7565b604051602001611baf929190614439565b6040516020818303038152906040525b9050919050565b600f5481565b600c5481565b611bda612003565b73ffffffffffffffffffffffffffffffffffffffff16611bf86115db565b73ffffffffffffffffffffffffffffffffffffffff1614611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590614822565b60405180910390fd5b8060138190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60146020528160005260406000208181548110611d0857600080fd5b90600052602060002001600091509150505481565b6060601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611da857602002820191906000526020600020905b815481526020019060010190808311611d94575b50505050509050919050565b611dbc612003565b73ffffffffffffffffffffffffffffffffffffffff16611dda6115db565b73ffffffffffffffffffffffffffffffffffffffff1614611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790614822565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e97906145e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f68612003565b73ffffffffffffffffffffffffffffffffffffffff16611f866115db565b73ffffffffffffffffffffffffffffffffffffffff1614611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390614822565b60405180910390fd5b8060108190555050565b6000611ffc826002612b0890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661207e836111ec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006120d282600001612b22565b9050919050565b60006120e482611fe6565b612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a906146e2565b60405180910390fd5b600061212e836111ec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061219d57508373ffffffffffffffffffffffffffffffffffffffff1661218584610b3b565b73ffffffffffffffffffffffffffffffffffffffff16145b806121ae57506121ad8185611c58565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121d7826111ec565b73ffffffffffffffffffffffffffffffffffffffff161461222d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222490614862565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229490614642565b60405180910390fd5b6122a8838383612b33565b6122b360008261200b565b61230481600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b8b90919063ffffffff16565b5061235681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ba590919063ffffffff16565b5061236d81836002612bbf9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b60006123eb8360000183612bf4565b60001c905092915050565b6123fe6111d5565b61243d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612434906145a2565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612481612003565b60405161248e9190614478565b60405180910390a1565b6000806000806124ab8660000186612c68565b915091508160001c8160001c9350935050509250929050565b60006124d7846000018460001b84612cf2565b60001c90509392505050565b60006124f182600001612d93565b9050919050565b6000612503826111ec565b905061251181600084612b33565b61251c60008361200b565b600060086000848152602001908152602001600020805461253c90614cd8565b90501461256357600860008381526020019081526020016000206000612562919061377c565b5b6125b482600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b8b90919063ffffffff16565b506125c9826002612da490919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6126326111d5565b15612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990614722565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126b6612003565b6040516126c39190614478565b60405180910390a1565b6126d88484846121b7565b6126e484848484612dbe565b612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a906145c2565b60405180910390fd5b50505050565b60008282111561276e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276590614682565b60405180910390fd5b818361277a9190614b9c565b905092915050565b60008082905060005b855181101561282a5760008682815181106127a9576127a8614e9f565b5b602002602001015190508083116127ea5782816040516020016127cd9291906143f6565b604051602081830303815290604052805190602001209250612816565b80836040516020016127fd9291906143f6565b6040516020818303038152906040528051906020012092505b50808061282290614d3b565b91505061278b565b508381149150509392505050565b612856612845600b6123ce565b600f5461272990919063ffffffff16565b811115612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f90614622565b60405180910390fd5b34816010546128a79190614b42565b11156128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906146c2565b60405180910390fd5b60005b818110156129a357600f54612900600b6123ce565b1015612990576000612912600b6123ce565b905061291e600b612f22565b6129283382612f41565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055505b808061299b90614d3b565b9150506128eb565b5050565b606060008214156129ef576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b03565b600082905060005b60008214612a21578080612a0a90614d3b565b915050600a82612a1a9190614b11565b91506129f7565b60008167ffffffffffffffff811115612a3d57612a3c614ece565b5b6040519080825280601f01601f191660200182016040528015612a6f5781602001600182028036833780820191505090505b5090505b60008514612afc57600182612a889190614b9c565b9150600a85612a979190614db2565b6030612aa39190614abb565b60f81b818381518110612ab957612ab8614e9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612af59190614b11565b9450612a73565b8093505050505b919050565b6000612b1a836000018360001b612f5f565b905092915050565b600081600001805490509050919050565b612b3b6111d5565b15612b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7290614722565b60405180910390fd5b612b86838383612f82565b505050565b6000612b9d836000018360001b612f87565b905092915050565b6000612bb7836000018360001b61309f565b905092915050565b6000612beb846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61310f565b90509392505050565b600081836000018054905011612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690614582565b60405180910390fd5b826000018281548110612c5557612c54614e9f565b5b9060005260206000200154905092915050565b60008082846000018054905011612cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cab906147a2565b60405180910390fd5b6000846000018481548110612ccc57612ccb614e9f565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b9190614560565b60405180910390fd5b5084600001600182612d669190614b9c565b81548110612d7757612d76614e9f565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612db6836000018360001b6131fb565b905092915050565b6000612ddf8473ffffffffffffffffffffffffffffffffffffffff16613344565b612dec5760019050612f1a565b6000612eb363150b7a0260e01b612e01612003565b888787604051602401612e179493929190614493565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615707603291398773ffffffffffffffffffffffffffffffffffffffff166133579092919063ffffffff16565b9050600081806020019051810190612ecb9190613c34565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6001816000016000828254612f379190614abb565b9250508190555050565b612f5b82826040518060200160405280600081525061336f565b5050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b60008083600101600084815260200190815260200160002054905060008114613093576000600182612fb99190614b9c565b9050600060018660000180549050612fd19190614b9c565b90506000866000018281548110612feb57612fea614e9f565b5b906000526020600020015490508087600001848154811061300f5761300e614e9f565b5b906000526020600020018190555060018361302a9190614abb565b876001016000838152602001908152602001600020819055508660000180548061305757613056614e70565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613099565b60009150505b92915050565b60006130ab83836133ca565b613104578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613109565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156131b6578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506131f4565b82856000016001836131c89190614b9c565b815481106131d9576131d8614e9f565b5b90600052602060002090600202016001018190555060009150505b9392505050565b6000808360010160008481526020019081526020016000205490506000811461333857600060018261322d9190614b9c565b90506000600186600001805490506132459190614b9c565b9050600086600001828154811061325f5761325e614e9f565b5b906000526020600020906002020190508087600001848154811061328657613285614e9f565b5b906000526020600020906002020160008201548160000155600182015481600101559050506001836132b89190614abb565b8760010160008360000154815260200190815260200160002081905550866000018054806132e9576132e8614e70565b5b600190038181906000526020600020906002020160008082016000905560018201600090555050905586600101600087815260200190815260200160002060009055600194505050505061333e565b60009150505b92915050565b600080823b905060008111915050919050565b606061336684846000856133ed565b90509392505050565b6133798383613501565b6133866000848484612dbe565b6133c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bc906145c2565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613429906146a2565b60405180910390fd5b61343b85613344565b61347a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347190614902565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516134a39190614422565b60006040518083038185875af1925050503d80600081146134e0576040519150601f19603f3d011682016040523d82523d6000602084013e6134e5565b606091505b50915091506134f582828661368f565b92505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613568906147e2565b60405180910390fd5b61357a81611fe6565b156135ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b190614602565b60405180910390fd5b6135c660008383612b33565b61361781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ba590919063ffffffff16565b5061362e81836002612bbf9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6060831561369f578290506136ef565b6000835111156136b25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e69190614560565b60405180910390fd5b9392505050565b82805461370290614cd8565b90600052602060002090601f016020900481019282613724576000855561376b565b82601f1061373d57803560ff191683800117855561376b565b8280016001018555821561376b579182015b8281111561376a57823582559160200191906001019061374f565b5b50905061377891906137bc565b5090565b50805461378890614cd8565b6000825580601f1061379a57506137b9565b601f0160209004906000526020600020908101906137b891906137bc565b5b50565b5b808211156137d55760008160009055506001016137bd565b5090565b60006137ec6137e7846149c2565b61499d565b9050808382526020820190508285602086028201111561380f5761380e614f07565b5b60005b8581101561383f578161382588826138e3565b845260208401935060208301925050600181019050613812565b5050509392505050565b600061385c613857846149ee565b61499d565b90508281526020810184848401111561387857613877614f0c565b5b613883848285614c96565b509392505050565b60008135905061389a81615693565b92915050565b600082601f8301126138b5576138b4614f02565b5b81356138c58482602086016137d9565b91505092915050565b6000813590506138dd816156aa565b92915050565b6000813590506138f2816156c1565b92915050565b600081359050613907816156d8565b92915050565b60008151905061391c816156d8565b92915050565b600082601f83011261393757613936614f02565b5b8135613947848260208601613849565b91505092915050565b60008083601f84011261396657613965614f02565b5b8235905067ffffffffffffffff81111561398357613982614efd565b5b60208301915083600182028301111561399f5761399e614f07565b5b9250929050565b6000813590506139b5816156ef565b92915050565b6000602082840312156139d1576139d0614f16565b5b60006139df8482850161388b565b91505092915050565b600080604083850312156139ff576139fe614f16565b5b6000613a0d8582860161388b565b9250506020613a1e8582860161388b565b9150509250929050565b600080600060608486031215613a4157613a40614f16565b5b6000613a4f8682870161388b565b9350506020613a608682870161388b565b9250506040613a71868287016139a6565b9150509250925092565b60008060008060808587031215613a9557613a94614f16565b5b6000613aa38782880161388b565b9450506020613ab48782880161388b565b9350506040613ac5878288016139a6565b925050606085013567ffffffffffffffff811115613ae657613ae5614f11565b5b613af287828801613922565b91505092959194509250565b60008060408385031215613b1557613b14614f16565b5b6000613b238582860161388b565b9250506020613b34858286016138ce565b9150509250929050565b60008060408385031215613b5557613b54614f16565b5b6000613b638582860161388b565b9250506020613b74858286016139a6565b9150509250929050565b60008060408385031215613b9557613b94614f16565b5b600083013567ffffffffffffffff811115613bb357613bb2614f11565b5b613bbf858286016138a0565b9250506020613bd0858286016139a6565b9150509250929050565b600060208284031215613bf057613bef614f16565b5b6000613bfe848285016138e3565b91505092915050565b600060208284031215613c1d57613c1c614f16565b5b6000613c2b848285016138f8565b91505092915050565b600060208284031215613c4a57613c49614f16565b5b6000613c588482850161390d565b91505092915050565b60008060208385031215613c7857613c77614f16565b5b600083013567ffffffffffffffff811115613c9657613c95614f11565b5b613ca285828601613950565b92509250509250929050565b600060208284031215613cc457613cc3614f16565b5b6000613cd2848285016139a6565b91505092915050565b60008060408385031215613cf257613cf1614f16565b5b6000613d00858286016139a6565b9250506020613d11858286016139a6565b9150509250929050565b6000613d2783836143bd565b60208301905092915050565b613d3c81614c60565b82525050565b613d4b81614be2565b82525050565b613d5a81614bd0565b82525050565b613d71613d6c82614bd0565b614d84565b82525050565b6000613d8282614a44565b613d8c8185614a72565b9350613d9783614a1f565b8060005b83811015613dc8578151613daf8882613d1b565b9750613dba83614a65565b925050600181019050613d9b565b5085935050505092915050565b613dde81614bf4565b82525050565b613ded81614c00565b82525050565b613e04613dff82614c00565b614d96565b82525050565b6000613e1582614a4f565b613e1f8185614a83565b9350613e2f818560208601614ca5565b613e3881614f1b565b840191505092915050565b6000613e4e82614a4f565b613e588185614a94565b9350613e68818560208601614ca5565b80840191505092915050565b6000613e7f82614a5a565b613e898185614a9f565b9350613e99818560208601614ca5565b613ea281614f1b565b840191505092915050565b6000613eb882614a5a565b613ec28185614ab0565b9350613ed2818560208601614ca5565b80840191505092915050565b60008154613eeb81614cd8565b613ef58186614ab0565b94506001821660008114613f105760018114613f2157613f54565b60ff19831686528186019350613f54565b613f2a85614a2f565b60005b83811015613f4c57815481890152600182019150602081019050613f2d565b838801955050505b50505092915050565b6000613f6a602283614a9f565b9150613f7582614f39565b604082019050919050565b6000613f8d601483614a9f565b9150613f9882614f88565b602082019050919050565b6000613fb0603283614a9f565b9150613fbb82614fb1565b604082019050919050565b6000613fd3602683614a9f565b9150613fde82615000565b604082019050919050565b6000613ff6601c83614a9f565b91506140018261504f565b602082019050919050565b6000614019602083614a9f565b915061402482615078565b602082019050919050565b600061403c602483614a9f565b9150614047826150a1565b604082019050919050565b600061405f601983614a9f565b915061406a826150f0565b602082019050919050565b6000614082601e83614a9f565b915061408d82615119565b602082019050919050565b60006140a5602683614a9f565b91506140b082615142565b604082019050919050565b60006140c8601c83614a9f565b91506140d382615191565b602082019050919050565b60006140eb602c83614a9f565b91506140f6826151ba565b604082019050919050565b600061410e601683614a9f565b915061411982615209565b602082019050919050565b6000614131601083614a9f565b915061413c82615232565b602082019050919050565b6000614154601783614a9f565b915061415f8261525b565b602082019050919050565b6000614177603883614a9f565b915061418282615284565b604082019050919050565b600061419a602a83614a9f565b91506141a5826152d3565b604082019050919050565b60006141bd602283614a9f565b91506141c882615322565b604082019050919050565b60006141e0600c83614a9f565b91506141eb82615371565b602082019050919050565b6000614203602083614a9f565b915061420e8261539a565b602082019050919050565b6000614226602c83614a9f565b9150614231826153c3565b604082019050919050565b6000614249602083614a9f565b915061425482615412565b602082019050919050565b600061426c601d83614a9f565b91506142778261543b565b602082019050919050565b600061428f602983614a9f565b915061429a82615464565b604082019050919050565b60006142b2602f83614a9f565b91506142bd826154b3565b604082019050919050565b60006142d5601b83614a9f565b91506142e082615502565b602082019050919050565b60006142f8602183614a9f565b91506143038261552b565b604082019050919050565b600061431b603183614a9f565b91506143268261557a565b604082019050919050565b600061433e601d83614a9f565b9150614349826155c9565b602082019050919050565b6000614361601b83614a9f565b915061436c826155f2565b602082019050919050565b6000614384601783614a9f565b915061438f8261561b565b602082019050919050565b60006143a7603383614a9f565b91506143b282615644565b604082019050919050565b6143c681614c56565b82525050565b6143d581614c56565b82525050565b60006143e78284613d60565b60148201915081905092915050565b60006144028285613df3565b6020820191506144128284613df3565b6020820191508190509392505050565b600061442e8284613e43565b915081905092915050565b60006144458285613ede565b91506144518284613ead565b91508190509392505050565b60006020820190506144726000830184613d51565b92915050565b600060208201905061448d6000830184613d33565b92915050565b60006080820190506144a86000830187613d42565b6144b56020830186613d51565b6144c260408301856143cc565b81810360608301526144d48184613e0a565b905095945050505050565b60006040820190506144f46000830185613d51565b61450160208301846143cc565b9392505050565b600060208201905081810360008301526145228184613d77565b905092915050565b600060208201905061453f6000830184613dd5565b92915050565b600060208201905061455a6000830184613de4565b92915050565b6000602082019050818103600083015261457a8184613e74565b905092915050565b6000602082019050818103600083015261459b81613f5d565b9050919050565b600060208201905081810360008301526145bb81613f80565b9050919050565b600060208201905081810360008301526145db81613fa3565b9050919050565b600060208201905081810360008301526145fb81613fc6565b9050919050565b6000602082019050818103600083015261461b81613fe9565b9050919050565b6000602082019050818103600083015261463b8161400c565b9050919050565b6000602082019050818103600083015261465b8161402f565b9050919050565b6000602082019050818103600083015261467b81614052565b9050919050565b6000602082019050818103600083015261469b81614075565b9050919050565b600060208201905081810360008301526146bb81614098565b9050919050565b600060208201905081810360008301526146db816140bb565b9050919050565b600060208201905081810360008301526146fb816140de565b9050919050565b6000602082019050818103600083015261471b81614101565b9050919050565b6000602082019050818103600083015261473b81614124565b9050919050565b6000602082019050818103600083015261475b81614147565b9050919050565b6000602082019050818103600083015261477b8161416a565b9050919050565b6000602082019050818103600083015261479b8161418d565b9050919050565b600060208201905081810360008301526147bb816141b0565b9050919050565b600060208201905081810360008301526147db816141d3565b9050919050565b600060208201905081810360008301526147fb816141f6565b9050919050565b6000602082019050818103600083015261481b81614219565b9050919050565b6000602082019050818103600083015261483b8161423c565b9050919050565b6000602082019050818103600083015261485b8161425f565b9050919050565b6000602082019050818103600083015261487b81614282565b9050919050565b6000602082019050818103600083015261489b816142a5565b9050919050565b600060208201905081810360008301526148bb816142c8565b9050919050565b600060208201905081810360008301526148db816142eb565b9050919050565b600060208201905081810360008301526148fb8161430e565b9050919050565b6000602082019050818103600083015261491b81614331565b9050919050565b6000602082019050818103600083015261493b81614354565b9050919050565b6000602082019050818103600083015261495b81614377565b9050919050565b6000602082019050818103600083015261497b8161439a565b9050919050565b600060208201905061499760008301846143cc565b92915050565b60006149a76149b8565b90506149b38282614d0a565b919050565b6000604051905090565b600067ffffffffffffffff8211156149dd576149dc614ece565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a0957614a08614ece565b5b614a1282614f1b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ac682614c56565b9150614ad183614c56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b0657614b05614de3565b5b828201905092915050565b6000614b1c82614c56565b9150614b2783614c56565b925082614b3757614b36614e12565b5b828204905092915050565b6000614b4d82614c56565b9150614b5883614c56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b9157614b90614de3565b5b828202905092915050565b6000614ba782614c56565b9150614bb283614c56565b925082821015614bc557614bc4614de3565b5b828203905092915050565b6000614bdb82614c36565b9050919050565b6000614bed82614c36565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614c6b82614c72565b9050919050565b6000614c7d82614c84565b9050919050565b6000614c8f82614c36565b9050919050565b82818337600083830152505050565b60005b83811015614cc3578082015181840152602081019050614ca8565b83811115614cd2576000848401525b50505050565b60006002820490506001821680614cf057607f821691505b60208210811415614d0457614d03614e41565b5b50919050565b614d1382614f1b565b810181811067ffffffffffffffff82111715614d3257614d31614ece565b5b80604052505050565b6000614d4682614c56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d7957614d78614de3565b5b600182019050919050565b6000614d8f82614da0565b9050919050565b6000819050919050565b6000614dab82614f2c565b9050919050565b6000614dbd82614c56565b9150614dc883614c56565b925082614dd857614dd7614e12565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d6178737570706c79206c696d697420686173206265656e2045786565646564600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d65726b6c6520726f6f74206973206e6f742073657400000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e20746865206c697374000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274203c3d20456e640000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f626c6f636b2054696d65203e3d2053616c652073746172742074696d65000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54696d65206973206f7574206f662050726573616c652054696d650000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f596f7572206c696d697420686173206265656e20457865656465640000000000600082015250565b7f43616e2774206d696e74206d6f7265207468616e203130000000000000000000600082015250565b7f596f752063616e2774206d696e74206d6f7265207468656e20313020696e206160008201527f2073696e676c65207472616e73616374696f6e00000000000000000000000000602082015250565b61569c81614bd0565b81146156a757600080fd5b50565b6156b381614bf4565b81146156be57600080fd5b50565b6156ca81614c00565b81146156d557600080fd5b50565b6156e181614c0a565b81146156ec57600080fd5b50565b6156f881614c56565b811461570357600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220544df123e3291c114c8d3ea1d61b65b11634612105ae44d9bade8d5c6251729264736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000061f404f00000000000000000000000000000000000000000000000000000000061f556700000000000000000000000000000000000000000000000000000000061f56480000000000000000000000000000000000000000000000000011c37937e080000
-----Decoded View---------------
Arg [0] : _maxSupply (uint256): 10000
Arg [1] : _preSaleStartTime (uint256): 1643382000
Arg [2] : _preSaleEndTime (uint256): 1643468400
Arg [3] : _publicSaleStartTime (uint256): 1643472000
Arg [4] : _tokenPrice (uint256): 80000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [1] : 0000000000000000000000000000000000000000000000000000000061f404f0
Arg [2] : 0000000000000000000000000000000000000000000000000000000061f55670
Arg [3] : 0000000000000000000000000000000000000000000000000000000061f56480
Arg [4] : 000000000000000000000000000000000000000000000000011c37937e080000
Deployed Bytecode Sourcemap
71135:4876:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75969:31;75978:10;75990:9;75969:31;;;;;;;:::i;:::-;;;;;;;;71135:4876;;;;;9535:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52550:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55336:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54866:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74743:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54344:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56226:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74481:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71466:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54106:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71427:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75382:145;;;;;;;;;;;;;:::i;:::-;;75608:65;;;;;;;;;;;;;:::i;:::-;;56602:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54632:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73960:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74863:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68697:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52306:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71561:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71635:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53925:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52023:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67159:148;;;;;;;;;;;;;:::i;:::-;;75188:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75276:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71529:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75539:61;;;;;;;;;;;;;:::i;:::-;;66508:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52719:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55629:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71599:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56824:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73146:677;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72241:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74095:378;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71498:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71386:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75067:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55995:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71682:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73831:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67462:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74632:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9535:150;9620:4;9644:20;:33;9665:11;9644:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9637:40;;9535:150;;;:::o;52550:100::-;52604:13;52637:5;52630:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52550:100;:::o;55336:221::-;55412:7;55440:16;55448:7;55440;:16::i;:::-;55432:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55525:15;:24;55541:7;55525:24;;;;;;;;;;;;;;;;;;;;;55518:31;;55336:221;;;:::o;54866:404::-;54947:13;54963:23;54978:7;54963:14;:23::i;:::-;54947:39;;55011:5;55005:11;;:2;:11;;;;54997:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55091:5;55075:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;55100:44;55124:5;55131:12;:10;:12::i;:::-;55100:23;:44::i;:::-;55075:69;55067:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;55241:21;55250:2;55254:7;55241:8;:21::i;:::-;54936:334;54866:404;;:::o;74743:108::-;74795:7;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74822:21:::1;74815:28;;74743:108:::0;:::o;54344:211::-;54405:7;54526:21;:12;:19;:21::i;:::-;54519:28;;54344:211;:::o;56226:305::-;56387:41;56406:12;:10;:12::i;:::-;56420:7;56387:18;:41::i;:::-;56379:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56495:28;56505:4;56511:2;56515:7;56495:9;:28::i;:::-;56226:305;;;:::o;74481:136::-;74522:7;74541:15;74559:25;:15;:23;:25::i;:::-;74541:43;;74602:7;74595:14;;;74481:136;:::o;71466:25::-;;;;:::o;54106:162::-;54203:7;54230:30;54254:5;54230:13;:20;54244:5;54230:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;54223:37;;54106:162;;;;:::o;71427:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75382:145::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75432:15:::1;75450:21;75432:39;;75490:10;75482:28;;:37;75511:7;75482:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;75421:106;75382:145::o:0;75608:65::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75655:10:::1;:8;:10::i;:::-;75608:65::o:0;56602:151::-;56706:39;56723:4;56729:2;56733:7;56706:39;;;;;;;;;;;;:16;:39::i;:::-;56602:151;;;:::o;54632:172::-;54707:7;54728:15;54749:22;54765:5;54749:12;:15;;:22;;;;:::i;:::-;54727:44;;;54789:7;54782:14;;;54632:172;;;:::o;73960:127::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74056:1:::1;74040:4;;74034:18;;:23;74030:49;;74075:4;;74059:13;:20;;;;;;;:::i;:::-;;74030:49;73960:127:::0;;:::o;74863:196::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74962:4:::1;74952:6;:14;;74944:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;75013:6;74994:16;:25;;;;75047:4;75030:14;:21;;;;74863:196:::0;;:::o;68697:86::-;68744:4;68768:7;;;;;;;;;;;68761:14;;68697:86;:::o;52306:177::-;52378:7;52405:70;52422:7;52405:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;52398:77;;52306:177;;;:::o;71561:31::-;;;;:::o;71635:34::-;;;;:::o;53925:97::-;53973:13;54006:8;53999:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53925:97;:::o;52023:221::-;52095:7;52140:1;52123:19;;:5;:19;;;;52115:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;52207:29;:13;:20;52221:5;52207:20;;;;;;;;;;;;;;;:27;:29::i;:::-;52200:36;;52023:221;;;:::o;67159:148::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67266:1:::1;67229:40;;67250:6;;;;;;;;;;;67229:40;;;;;;;;;;;;67297:1;67280:6;;:19;;;;;;;;;;;;;;;;;;67159:148::o:0;75188:80::-;75244:16;75251:8;75244:5;:16::i;:::-;75188:80;:::o;75276:98::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75361:5:::1;75348:10;:18;;;;75276:98:::0;:::o;71529:25::-;;;;:::o;75539:61::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75584:8:::1;:6;:8::i;:::-;75539:61::o:0;66508:87::-;66554:7;66581:6;;;;;;;;;;;66574:13;;66508:87;:::o;52719:104::-;52775:13;52808:7;52801:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52719:104;:::o;55629:295::-;55744:12;:10;:12::i;:::-;55732:24;;:8;:24;;;;55724:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;55844:8;55799:18;:32;55818:12;:10;:12::i;:::-;55799:32;;;;;;;;;;;;;;;:42;55832:8;55799:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;55897:8;55868:48;;55883:12;:10;:12::i;:::-;55868:48;;;55907:8;55868:48;;;;;;:::i;:::-;;;;;;;;55629:295;;:::o;71599:29::-;;;;:::o;56824:285::-;56956:41;56975:12;:10;:12::i;:::-;56989:7;56956:18;:41::i;:::-;56948:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;57062:39;57076:4;57082:2;57086:7;57095:5;57062:13;:39::i;:::-;56824:285;;;;:::o;73146:677::-;73258:1;73244:15;;:10;;:15;;73236:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;73297:14;73314:52;73333:13;:25;73347:10;73333:25;;;;;;;;;;;;;;;:32;;;;73314:14;;:18;;:52;;;;:::i;:::-;73297:69;;73395:14;73385:6;:24;;73377:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;73478:14;;73460;:32;;73452:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;73586:16;;73567:15;:35;;:72;;;;;73625:14;;73606:15;:33;;73567:72;73559:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;73690:65;73703:10;;73742;73725:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;73715:39;;;;;;73690:5;:12;;:65;;;;;:::i;:::-;73682:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;73794:21;73800:14;73794:5;:21::i;:::-;73225:598;73146:677;;:::o;72241:271::-;72340:19;;72321:15;:38;;72313:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;72430:14;;72412;:32;;72404:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72483:21;72489:14;72483:5;:21::i;:::-;72241:271;:::o;74095:378::-;74161:13;74208:17;74216:8;74208:7;:17::i;:::-;74186:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;74361:1;74337:13;74331:27;;;;;:::i;:::-;;;:31;:133;;;;;;;;;;;;;;;;;74406:13;74421:19;:8;:17;:19::i;:::-;74389:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74331:133;74311:153;;74095:378;;;:::o;71498:24::-;;;;:::o;71386:34::-;;;;:::o;75067:113::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75161:11:::1;75139:19;:33;;;;75067:113:::0;:::o;55995:164::-;56092:4;56116:18;:25;56135:5;56116:25;;;;;;;;;;;;;;;:35;56142:8;56116:35;;;;;;;;;;;;;;;;;;;;;;;;;56109:42;;55995:164;;;;:::o;71682:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73831:118::-;73886:16;73922:13;:19;73936:4;73922:19;;;;;;;;;;;;;;;73915:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73831:118;;;:::o;67462:244::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67571:1:::1;67551:22;;:8;:22;;;;67543:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67661:8;67632:38;;67653:6;;;;;;;;;;;67632:38;;;;;;;;;;;;67690:8;67681:6;;:17;;;;;;;;;;;;;;;;;;67462:244:::0;:::o;74632:103::-;66739:12;:10;:12::i;:::-;66728:23;;:7;:5;:7::i;:::-;:23;;;66720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74717:10:::1;74704;:23;;;;74632:103:::0;:::o;58576:127::-;58641:4;58665:30;58687:7;58665:12;:21;;:30;;;;:::i;:::-;58658:37;;58576:127;;;:::o;601:115::-;654:15;697:10;682:26;;601:115;:::o;64594:192::-;64696:2;64669:15;:24;64685:7;64669:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;64752:7;64748:2;64714:46;;64723:23;64738:7;64723:14;:23::i;:::-;64714:46;;;;;;;;;;;;64594:192;;:::o;43194:123::-;43263:7;43290:19;43298:3;:10;;43290:7;:19::i;:::-;43283:26;;43194:123;;;:::o;58870:355::-;58963:4;58988:16;58996:7;58988;:16::i;:::-;58980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59064:13;59080:23;59095:7;59080:14;:23::i;:::-;59064:39;;59133:5;59122:16;;:7;:16;;;:51;;;;59166:7;59142:31;;:20;59154:7;59142:11;:20::i;:::-;:31;;;59122:51;:94;;;;59177:39;59201:5;59208:7;59177:23;:39::i;:::-;59122:94;59114:103;;;58870:355;;;;:::o;62006:599::-;62131:4;62104:31;;:23;62119:7;62104:14;:23::i;:::-;:31;;;62096:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;62232:1;62218:16;;:2;:16;;;;62210:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62288:39;62309:4;62315:2;62319:7;62288:20;:39::i;:::-;62392:29;62409:1;62413:7;62392:8;:29::i;:::-;62434:35;62461:7;62434:13;:19;62448:4;62434:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;62480:30;62502:7;62480:13;:17;62494:2;62480:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;62523:29;62540:7;62549:2;62523:12;:16;;:29;;;;;:::i;:::-;;62589:7;62585:2;62570:27;;62579:4;62570:27;;;;;;;;;;;;62006:599;;;:::o;45893:114::-;45958:7;45985;:14;;;45978:21;;45893:114;;;:::o;35084:137::-;35155:7;35190:22;35194:3;:10;;35206:5;35190:3;:22::i;:::-;35182:31;;35175:38;;35084:137;;;;:::o;69756:120::-;69300:8;:6;:8::i;:::-;69292:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;69825:5:::1;69815:7;;:15;;;;;;;;;;;;;;;;;;69846:22;69855:12;:10;:12::i;:::-;69846:22;;;;;;:::i;:::-;;;;;;;;69756:120::o:0;43656:236::-;43736:7;43745;43766:11;43779:13;43796:22;43800:3;:10;;43812:5;43796:3;:22::i;:::-;43765:53;;;;43845:3;43837:12;;43875:5;43867:14;;43829:55;;;;;;43656:236;;;;;:::o;44942:213::-;45049:7;45100:44;45105:3;:10;;45125:3;45117:12;;45131;45100:4;:44::i;:::-;45092:53;;45069:78;;44942:213;;;;;:::o;34626:114::-;34686:7;34713:19;34721:3;:10;;34713:7;:19::i;:::-;34706:26;;34626:114;;;:::o;61124:545::-;61184:13;61200:23;61215:7;61200:14;:23::i;:::-;61184:39;;61254:48;61275:5;61290:1;61294:7;61254:20;:48::i;:::-;61343:29;61360:1;61364:7;61343:8;:29::i;:::-;61462:1;61431:10;:19;61442:7;61431:19;;;;;;;;;;;61425:33;;;;;:::i;:::-;;;:38;61421:97;;61487:10;:19;61498:7;61487:19;;;;;;;;;;;;61480:26;;;;:::i;:::-;61421:97;61530:36;61558:7;61530:13;:20;61544:5;61530:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;61579:28;61599:7;61579:12;:19;;:28;;;;:::i;:::-;;61653:7;61649:1;61625:36;;61634:5;61625:36;;;;;;;;;;;;61173:496;61124:545;:::o;69497:118::-;69023:8;:6;:8::i;:::-;69022:9;69014:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;69567:4:::1;69557:7;;:14;;;;;;;;;;;;;;;;;;69587:20;69594:12;:10;:12::i;:::-;69587:20;;;;;;:::i;:::-;;;;;;;;69497:118::o:0;57991:272::-;58105:28;58115:4;58121:2;58125:7;58105:9;:28::i;:::-;58152:48;58175:4;58181:2;58185:7;58194:5;58152:22;:48::i;:::-;58144:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57991:272;;;;:::o;13466:158::-;13524:7;13557:1;13552;:6;;13544:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;13615:1;13611;:5;;;;:::i;:::-;13604:12;;13466:158;;;;:::o;70330:796::-;70421:4;70438:20;70461:4;70438:27;;70483:9;70478:525;70502:5;:12;70498:1;:16;70478:525;;;70536:20;70559:5;70565:1;70559:8;;;;;;;;:::i;:::-;;;;;;;;70536:31;;70604:12;70588;:28;70584:408;;70758:12;70772;70741:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70731:55;;;;;;70716:70;;70584:408;;;70948:12;70962;70931:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70921:55;;;;;;70906:70;;70584:408;70521:482;70516:3;;;;;:::i;:::-;;;;70478:525;;;;71114:4;71098:12;:20;71091:27;;;70330:796;;;;;:::o;72520:618::-;72604:40;72618:25;:15;:23;:25::i;:::-;72604:9;;:13;;:40;;;;:::i;:::-;72586:14;:58;;72578:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;72731:9;72713:14;72700:10;;:27;;;;:::i;:::-;:40;;72692:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;72790:9;72785:346;72809:14;72805:1;:18;72785:346;;;72877:9;;72849:25;:15;:23;:25::i;:::-;:37;72845:275;;;72908:15;72926:25;:15;:23;:25::i;:::-;72908:43;;72970:27;:15;:25;:27::i;:::-;73016:30;73026:10;73038:7;73016:9;:30::i;:::-;73065:13;:25;73079:10;73065:25;;;;;;;;;;;;;;;73096:7;73065:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72888:232;72845:275;72825:3;;;;;:::i;:::-;;;;72785:346;;;;72520:618;:::o;46594:723::-;46650:13;46880:1;46871:5;:10;46867:53;;;46898:10;;;;;;;;;;;;;;;;;;;;;46867:53;46930:12;46945:5;46930:20;;46961:14;46986:78;47001:1;46993:4;:9;46986:78;;47019:8;;;;;:::i;:::-;;;;47050:2;47042:10;;;;;:::i;:::-;;;46986:78;;;47074:19;47106:6;47096:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47074:39;;47124:154;47140:1;47131:5;:10;47124:154;;47168:1;47158:11;;;;;:::i;:::-;;;47235:2;47227:5;:10;;;;:::i;:::-;47214:2;:24;;;;:::i;:::-;47201:39;;47184:6;47191;47184:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;47264:2;47255:11;;;;;:::i;:::-;;;47124:154;;;47302:6;47288:21;;;;;46594:723;;;;:::o;42955:151::-;43039:4;43063:35;43073:3;:10;;43093:3;43085:12;;43063:9;:35::i;:::-;43056:42;;42955:151;;;;:::o;39773:110::-;39829:7;39856:3;:12;;:19;;;;39849:26;;39773:110;;;:::o;75681:201::-;69023:8;:6;:8::i;:::-;69022:9;69014:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;75829:45:::1;75856:4;75862:2;75866:7;75829:26;:45::i;:::-;75681:201:::0;;;:::o;34171:137::-;34241:4;34265:35;34273:3;:10;;34293:5;34285:14;;34265:7;:35::i;:::-;34258:42;;34171:137;;;;:::o;33864:131::-;33931:4;33955:32;33960:3;:10;;33980:5;33972:14;;33955:4;:32::i;:::-;33948:39;;33864:131;;;;:::o;42378:185::-;42467:4;42491:64;42496:3;:10;;42516:3;42508:12;;42546:5;42530:23;;42522:32;;42491:4;:64::i;:::-;42484:71;;42378:185;;;;;:::o;30122:204::-;30189:7;30238:5;30217:3;:11;;:18;;;;:26;30209:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30300:3;:11;;30312:5;30300:18;;;;;;;;:::i;:::-;;;;;;;;;;30293:25;;30122:204;;;;:::o;40238:279::-;40305:7;40314;40364:5;40342:3;:12;;:19;;;;:27;40334:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40421:22;40446:3;:12;;40459:5;40446:19;;;;;;;;:::i;:::-;;;;;;;;;;;;40421:44;;40484:5;:10;;;40496:5;:12;;;40476:33;;;;;40238:279;;;;;:::o;41735:319::-;41829:7;41849:16;41868:3;:12;;:17;41881:3;41868:17;;;;;;;;;;;;41849:36;;41916:1;41904:8;:13;;41919:12;41896:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41986:3;:12;;42010:1;41999:8;:12;;;;:::i;:::-;41986:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;41979:40;;;41735:319;;;;;:::o;29669:109::-;29725:7;29752:3;:11;;:18;;;;29745:25;;29669:109;;;:::o;42729:142::-;42806:4;42830:33;42838:3;:10;;42858:3;42850:12;;42830:7;:33::i;:::-;42823:40;;42729:142;;;;:::o;63871:604::-;63992:4;64019:15;:2;:13;;;:15::i;:::-;64014:60;;64058:4;64051:11;;;;64014:60;64084:23;64110:252;64163:45;;;64223:12;:10;:12::i;:::-;64250:4;64269:7;64291:5;64126:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64110:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;64084:278;;64373:13;64400:10;64389:32;;;;;;;;;;;;:::i;:::-;64373:48;;49026:10;64450:16;;64440:26;;;:6;:26;;;;64432:35;;;;63871:604;;;;;;;:::o;46015:117::-;46112:1;46094:7;:14;;;:19;;;;;;;:::i;:::-;;;;;;;;46015:117;:::o;59568:110::-;59644:26;59654:2;59658:7;59644:26;;;;;;;;;;;;:9;:26::i;:::-;59568:110;;:::o;39553:125::-;39624:4;39669:1;39648:3;:12;;:17;39661:3;39648:17;;;;;;;;;;;;:22;;39641:29;;39553:125;;;;:::o;65399:93::-;;;;:::o;27824:1544::-;27890:4;28008:18;28029:3;:12;;:19;28042:5;28029:19;;;;;;;;;;;;28008:40;;28079:1;28065:10;:15;28061:1300;;28427:21;28464:1;28451:10;:14;;;;:::i;:::-;28427:38;;28480:17;28521:1;28500:3;:11;;:18;;;;:22;;;;:::i;:::-;28480:42;;28767:17;28787:3;:11;;28799:9;28787:22;;;;;;;;:::i;:::-;;;;;;;;;;28767:42;;28933:9;28904:3;:11;;28916:13;28904:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;29052:1;29036:13;:17;;;;:::i;:::-;29010:3;:12;;:23;29023:9;29010:23;;;;;;;;;;;:43;;;;29162:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29257:3;:12;;:19;29270:5;29257:19;;;;;;;;;;;29250:26;;;29300:4;29293:11;;;;;;;;28061:1300;29344:5;29337:12;;;27824:1544;;;;;:::o;27234:414::-;27297:4;27319:21;27329:3;27334:5;27319:9;:21::i;:::-;27314:327;;27357:3;:11;;27374:5;27357:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27540:3;:11;;:18;;;;27518:3;:12;;:19;27531:5;27518:19;;;;;;;;;;;:40;;;;27580:4;27573:11;;;;27314:327;27624:5;27617:12;;27234:414;;;;;:::o;37053:692::-;37129:4;37245:16;37264:3;:12;;:17;37277:3;37264:17;;;;;;;;;;;;37245:36;;37310:1;37298:8;:13;37294:444;;;37365:3;:12;;37383:38;;;;;;;;37400:3;37383:38;;;;37413:5;37383:38;;;37365:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37580:3;:12;;:19;;;;37560:3;:12;;:17;37573:3;37560:17;;;;;;;;;;;:39;;;;37621:4;37614:11;;;;;37294:444;37694:5;37658:3;:12;;37682:1;37671:8;:12;;;;:::i;:::-;37658:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;:41;;;;37721:5;37714:12;;;37053:692;;;;;;:::o;37920:1549::-;37984:4;38100:16;38119:3;:12;;:17;38132:3;38119:17;;;;;;;;;;;;38100:36;;38165:1;38153:8;:13;38149:1313;;38514:21;38549:1;38538:8;:12;;;;:::i;:::-;38514:36;;38565:17;38607:1;38585:3;:12;;:19;;;;:23;;;;:::i;:::-;38565:43;;38853:26;38882:3;:12;;38895:9;38882:23;;;;;;;;:::i;:::-;;;;;;;;;;;;38853:52;;39030:9;39000:3;:12;;39013:13;39000:27;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;39154:1;39138:13;:17;;;;:::i;:::-;39107:3;:12;;:28;39120:9;:14;;;39107:28;;;;;;;;;;;:48;;;;39264:3;:12;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39360:3;:12;;:17;39373:3;39360:17;;;;;;;;;;;39353:24;;;39401:4;39394:11;;;;;;;;38149:1313;39445:5;39438:12;;;37920:1549;;;;;:::o;18352:422::-;18412:4;18620:12;18731:7;18719:20;18711:28;;18765:1;18758:4;:8;18751:15;;;18352:422;;;:::o;21270:195::-;21373:12;21405:52;21427:6;21435:4;21441:1;21444:12;21405:21;:52::i;:::-;21398:59;;21270:195;;;;;:::o;59905:250::-;60001:18;60007:2;60011:7;60001:5;:18::i;:::-;60038:54;60069:1;60073:2;60077:7;60086:5;60038:22;:54::i;:::-;60030:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;59905:250;;;:::o;29454:129::-;29527:4;29574:1;29551:3;:12;;:19;29564:5;29551:19;;;;;;;;;;;;:24;;29544:31;;29454:129;;;;:::o;22322:530::-;22449:12;22507:5;22482:21;:30;;22474:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;22574:18;22585:6;22574:10;:18::i;:::-;22566:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;22700:12;22714:23;22741:6;:11;;22761:5;22769:4;22741:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22699:75;;;;22792:52;22810:7;22819:10;22831:12;22792:17;:52::i;:::-;22785:59;;;;22322:530;;;;;;:::o;60491:404::-;60585:1;60571:16;;:2;:16;;;;60563:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;60644:16;60652:7;60644;:16::i;:::-;60643:17;60635:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;60706:45;60735:1;60739:2;60743:7;60706:20;:45::i;:::-;60764:30;60786:7;60764:13;:17;60778:2;60764:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;60807:29;60824:7;60833:2;60807:12;:16;;:29;;;;;:::i;:::-;;60879:7;60875:2;60854:33;;60871:1;60854:33;;;;;;;;;;;;60491:404;;:::o;24862:742::-;24977:12;25006:7;25002:595;;;25037:10;25030:17;;;;25002:595;25171:1;25151:10;:17;:21;25147:439;;;25414:10;25408:17;25475:15;25462:10;25458:2;25454:19;25447:44;25147:439;25557:12;25550:20;;;;;;;;;;;:::i;:::-;;;;;;;;24862:742;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:139::-;1891:5;1929:6;1916:20;1907:29;;1945:33;1972:5;1945:33;:::i;:::-;1845:139;;;;:::o;1990:137::-;2035:5;2073:6;2060:20;2051:29;;2089:32;2115:5;2089:32;:::i;:::-;1990:137;;;;:::o;2133:141::-;2189:5;2220:6;2214:13;2205:22;;2236:32;2262:5;2236:32;:::i;:::-;2133:141;;;;:::o;2293:338::-;2348:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:122;;2405:79;;:::i;:::-;2364:122;2522:6;2509:20;2547:78;2621:3;2613:6;2606:4;2598:6;2594:17;2547:78;:::i;:::-;2538:87;;2354:277;2293:338;;;;:::o;2651:553::-;2709:8;2719:6;2769:3;2762:4;2754:6;2750:17;2746:27;2736:122;;2777:79;;:::i;:::-;2736:122;2890:6;2877:20;2867:30;;2920:18;2912:6;2909:30;2906:117;;;2942:79;;:::i;:::-;2906:117;3056:4;3048:6;3044:17;3032:29;;3110:3;3102:4;3094:6;3090:17;3080:8;3076:32;3073:41;3070:128;;;3117:79;;:::i;:::-;3070:128;2651:553;;;;;:::o;3210:139::-;3256:5;3294:6;3281:20;3272:29;;3310:33;3337:5;3310:33;:::i;:::-;3210:139;;;;:::o;3355:329::-;3414:6;3463:2;3451:9;3442:7;3438:23;3434:32;3431:119;;;3469:79;;:::i;:::-;3431:119;3589:1;3614:53;3659:7;3650:6;3639:9;3635:22;3614:53;:::i;:::-;3604:63;;3560:117;3355:329;;;;:::o;3690:474::-;3758:6;3766;3815:2;3803:9;3794:7;3790:23;3786:32;3783:119;;;3821:79;;:::i;:::-;3783:119;3941:1;3966:53;4011:7;4002:6;3991:9;3987:22;3966:53;:::i;:::-;3956:63;;3912:117;4068:2;4094:53;4139:7;4130:6;4119:9;4115:22;4094:53;:::i;:::-;4084:63;;4039:118;3690:474;;;;;:::o;4170:619::-;4247:6;4255;4263;4312:2;4300:9;4291:7;4287:23;4283:32;4280:119;;;4318:79;;:::i;:::-;4280:119;4438:1;4463:53;4508:7;4499:6;4488:9;4484:22;4463:53;:::i;:::-;4453:63;;4409:117;4565:2;4591:53;4636:7;4627:6;4616:9;4612:22;4591:53;:::i;:::-;4581:63;;4536:118;4693:2;4719:53;4764:7;4755:6;4744:9;4740:22;4719:53;:::i;:::-;4709:63;;4664:118;4170:619;;;;;:::o;4795:943::-;4890:6;4898;4906;4914;4963:3;4951:9;4942:7;4938:23;4934:33;4931:120;;;4970:79;;:::i;:::-;4931:120;5090:1;5115:53;5160:7;5151:6;5140:9;5136:22;5115:53;:::i;:::-;5105:63;;5061:117;5217:2;5243:53;5288:7;5279:6;5268:9;5264:22;5243:53;:::i;:::-;5233:63;;5188:118;5345:2;5371:53;5416:7;5407:6;5396:9;5392:22;5371:53;:::i;:::-;5361:63;;5316:118;5501:2;5490:9;5486:18;5473:32;5532:18;5524:6;5521:30;5518:117;;;5554:79;;:::i;:::-;5518:117;5659:62;5713:7;5704:6;5693:9;5689:22;5659:62;:::i;:::-;5649:72;;5444:287;4795:943;;;;;;;:::o;5744:468::-;5809:6;5817;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:53;6062:7;6053:6;6042:9;6038:22;6017:53;:::i;:::-;6007:63;;5963:117;6119:2;6145:50;6187:7;6178:6;6167:9;6163:22;6145:50;:::i;:::-;6135:60;;6090:115;5744:468;;;;;:::o;6218:474::-;6286:6;6294;6343:2;6331:9;6322:7;6318:23;6314:32;6311:119;;;6349:79;;:::i;:::-;6311:119;6469:1;6494:53;6539:7;6530:6;6519:9;6515:22;6494:53;:::i;:::-;6484:63;;6440:117;6596:2;6622:53;6667:7;6658:6;6647:9;6643:22;6622:53;:::i;:::-;6612:63;;6567:118;6218:474;;;;;:::o;6698:684::-;6791:6;6799;6848:2;6836:9;6827:7;6823:23;6819:32;6816:119;;;6854:79;;:::i;:::-;6816:119;7002:1;6991:9;6987:17;6974:31;7032:18;7024:6;7021:30;7018:117;;;7054:79;;:::i;:::-;7018:117;7159:78;7229:7;7220:6;7209:9;7205:22;7159:78;:::i;:::-;7149:88;;6945:302;7286:2;7312:53;7357:7;7348:6;7337:9;7333:22;7312:53;:::i;:::-;7302:63;;7257:118;6698:684;;;;;:::o;7388:329::-;7447:6;7496:2;7484:9;7475:7;7471:23;7467:32;7464:119;;;7502:79;;:::i;:::-;7464:119;7622:1;7647:53;7692:7;7683:6;7672:9;7668:22;7647:53;:::i;:::-;7637:63;;7593:117;7388:329;;;;:::o;7723:327::-;7781:6;7830:2;7818:9;7809:7;7805:23;7801:32;7798:119;;;7836:79;;:::i;:::-;7798:119;7956:1;7981:52;8025:7;8016:6;8005:9;8001:22;7981:52;:::i;:::-;7971:62;;7927:116;7723:327;;;;:::o;8056:349::-;8125:6;8174:2;8162:9;8153:7;8149:23;8145:32;8142:119;;;8180:79;;:::i;:::-;8142:119;8300:1;8325:63;8380:7;8371:6;8360:9;8356:22;8325:63;:::i;:::-;8315:73;;8271:127;8056:349;;;;:::o;8411:529::-;8482:6;8490;8539:2;8527:9;8518:7;8514:23;8510:32;8507:119;;;8545:79;;:::i;:::-;8507:119;8693:1;8682:9;8678:17;8665:31;8723:18;8715:6;8712:30;8709:117;;;8745:79;;:::i;:::-;8709:117;8858:65;8915:7;8906:6;8895:9;8891:22;8858:65;:::i;:::-;8840:83;;;;8636:297;8411:529;;;;;:::o;8946:329::-;9005:6;9054:2;9042:9;9033:7;9029:23;9025:32;9022:119;;;9060:79;;:::i;:::-;9022:119;9180:1;9205:53;9250:7;9241:6;9230:9;9226:22;9205:53;:::i;:::-;9195:63;;9151:117;8946:329;;;;:::o;9281:474::-;9349:6;9357;9406:2;9394:9;9385:7;9381:23;9377:32;9374:119;;;9412:79;;:::i;:::-;9374:119;9532:1;9557:53;9602:7;9593:6;9582:9;9578:22;9557:53;:::i;:::-;9547:63;;9503:117;9659:2;9685:53;9730:7;9721:6;9710:9;9706:22;9685:53;:::i;:::-;9675:63;;9630:118;9281:474;;;;;:::o;9761:179::-;9830:10;9851:46;9893:3;9885:6;9851:46;:::i;:::-;9929:4;9924:3;9920:14;9906:28;;9761:179;;;;:::o;9946:147::-;10041:45;10080:5;10041:45;:::i;:::-;10036:3;10029:58;9946:147;;:::o;10099:142::-;10202:32;10228:5;10202:32;:::i;:::-;10197:3;10190:45;10099:142;;:::o;10247:118::-;10334:24;10352:5;10334:24;:::i;:::-;10329:3;10322:37;10247:118;;:::o;10371:157::-;10476:45;10496:24;10514:5;10496:24;:::i;:::-;10476:45;:::i;:::-;10471:3;10464:58;10371:157;;:::o;10564:732::-;10683:3;10712:54;10760:5;10712:54;:::i;:::-;10782:86;10861:6;10856:3;10782:86;:::i;:::-;10775:93;;10892:56;10942:5;10892:56;:::i;:::-;10971:7;11002:1;10987:284;11012:6;11009:1;11006:13;10987:284;;;11088:6;11082:13;11115:63;11174:3;11159:13;11115:63;:::i;:::-;11108:70;;11201:60;11254:6;11201:60;:::i;:::-;11191:70;;11047:224;11034:1;11031;11027:9;11022:14;;10987:284;;;10991:14;11287:3;11280:10;;10688:608;;;10564:732;;;;:::o;11302:109::-;11383:21;11398:5;11383:21;:::i;:::-;11378:3;11371:34;11302:109;;:::o;11417:118::-;11504:24;11522:5;11504:24;:::i;:::-;11499:3;11492:37;11417:118;;:::o;11541:157::-;11646:45;11666:24;11684:5;11666:24;:::i;:::-;11646:45;:::i;:::-;11641:3;11634:58;11541:157;;:::o;11704:360::-;11790:3;11818:38;11850:5;11818:38;:::i;:::-;11872:70;11935:6;11930:3;11872:70;:::i;:::-;11865:77;;11951:52;11996:6;11991:3;11984:4;11977:5;11973:16;11951:52;:::i;:::-;12028:29;12050:6;12028:29;:::i;:::-;12023:3;12019:39;12012:46;;11794:270;11704:360;;;;:::o;12070:373::-;12174:3;12202:38;12234:5;12202:38;:::i;:::-;12256:88;12337:6;12332:3;12256:88;:::i;:::-;12249:95;;12353:52;12398:6;12393:3;12386:4;12379:5;12375:16;12353:52;:::i;:::-;12430:6;12425:3;12421:16;12414:23;;12178:265;12070:373;;;;:::o;12449:364::-;12537:3;12565:39;12598:5;12565:39;:::i;:::-;12620:71;12684:6;12679:3;12620:71;:::i;:::-;12613:78;;12700:52;12745:6;12740:3;12733:4;12726:5;12722:16;12700:52;:::i;:::-;12777:29;12799:6;12777:29;:::i;:::-;12772:3;12768:39;12761:46;;12541:272;12449:364;;;;:::o;12819:377::-;12925:3;12953:39;12986:5;12953:39;:::i;:::-;13008:89;13090:6;13085:3;13008:89;:::i;:::-;13001:96;;13106:52;13151:6;13146:3;13139:4;13132:5;13128:16;13106:52;:::i;:::-;13183:6;13178:3;13174:16;13167:23;;12929:267;12819:377;;;;:::o;13226:845::-;13329:3;13366:5;13360:12;13395:36;13421:9;13395:36;:::i;:::-;13447:89;13529:6;13524:3;13447:89;:::i;:::-;13440:96;;13567:1;13556:9;13552:17;13583:1;13578:137;;;;13729:1;13724:341;;;;13545:520;;13578:137;13662:4;13658:9;13647;13643:25;13638:3;13631:38;13698:6;13693:3;13689:16;13682:23;;13578:137;;13724:341;13791:38;13823:5;13791:38;:::i;:::-;13851:1;13865:154;13879:6;13876:1;13873:13;13865:154;;;13953:7;13947:14;13943:1;13938:3;13934:11;13927:35;14003:1;13994:7;13990:15;13979:26;;13901:4;13898:1;13894:12;13889:17;;13865:154;;;14048:6;14043:3;14039:16;14032:23;;13731:334;;13545:520;;13333:738;;13226:845;;;;:::o;14077:366::-;14219:3;14240:67;14304:2;14299:3;14240:67;:::i;:::-;14233:74;;14316:93;14405:3;14316:93;:::i;:::-;14434:2;14429:3;14425:12;14418:19;;14077:366;;;:::o;14449:::-;14591:3;14612:67;14676:2;14671:3;14612:67;:::i;:::-;14605:74;;14688:93;14777:3;14688:93;:::i;:::-;14806:2;14801:3;14797:12;14790:19;;14449:366;;;:::o;14821:::-;14963:3;14984:67;15048:2;15043:3;14984:67;:::i;:::-;14977:74;;15060:93;15149:3;15060:93;:::i;:::-;15178:2;15173:3;15169:12;15162:19;;14821:366;;;:::o;15193:::-;15335:3;15356:67;15420:2;15415:3;15356:67;:::i;:::-;15349:74;;15432:93;15521:3;15432:93;:::i;:::-;15550:2;15545:3;15541:12;15534:19;;15193:366;;;:::o;15565:::-;15707:3;15728:67;15792:2;15787:3;15728:67;:::i;:::-;15721:74;;15804:93;15893:3;15804:93;:::i;:::-;15922:2;15917:3;15913:12;15906:19;;15565:366;;;:::o;15937:::-;16079:3;16100:67;16164:2;16159:3;16100:67;:::i;:::-;16093:74;;16176:93;16265:3;16176:93;:::i;:::-;16294:2;16289:3;16285:12;16278:19;;15937:366;;;:::o;16309:::-;16451:3;16472:67;16536:2;16531:3;16472:67;:::i;:::-;16465:74;;16548:93;16637:3;16548:93;:::i;:::-;16666:2;16661:3;16657:12;16650:19;;16309:366;;;:::o;16681:::-;16823:3;16844:67;16908:2;16903:3;16844:67;:::i;:::-;16837:74;;16920:93;17009:3;16920:93;:::i;:::-;17038:2;17033:3;17029:12;17022:19;;16681:366;;;:::o;17053:::-;17195:3;17216:67;17280:2;17275:3;17216:67;:::i;:::-;17209:74;;17292:93;17381:3;17292:93;:::i;:::-;17410:2;17405:3;17401:12;17394:19;;17053:366;;;:::o;17425:::-;17567:3;17588:67;17652:2;17647:3;17588:67;:::i;:::-;17581:74;;17664:93;17753:3;17664:93;:::i;:::-;17782:2;17777:3;17773:12;17766:19;;17425:366;;;:::o;17797:::-;17939:3;17960:67;18024:2;18019:3;17960:67;:::i;:::-;17953:74;;18036:93;18125:3;18036:93;:::i;:::-;18154:2;18149:3;18145:12;18138:19;;17797:366;;;:::o;18169:::-;18311:3;18332:67;18396:2;18391:3;18332:67;:::i;:::-;18325:74;;18408:93;18497:3;18408:93;:::i;:::-;18526:2;18521:3;18517:12;18510:19;;18169:366;;;:::o;18541:::-;18683:3;18704:67;18768:2;18763:3;18704:67;:::i;:::-;18697:74;;18780:93;18869:3;18780:93;:::i;:::-;18898:2;18893:3;18889:12;18882:19;;18541:366;;;:::o;18913:::-;19055:3;19076:67;19140:2;19135:3;19076:67;:::i;:::-;19069:74;;19152:93;19241:3;19152:93;:::i;:::-;19270:2;19265:3;19261:12;19254:19;;18913:366;;;:::o;19285:::-;19427:3;19448:67;19512:2;19507:3;19448:67;:::i;:::-;19441:74;;19524:93;19613:3;19524:93;:::i;:::-;19642:2;19637:3;19633:12;19626:19;;19285:366;;;:::o;19657:::-;19799:3;19820:67;19884:2;19879:3;19820:67;:::i;:::-;19813:74;;19896:93;19985:3;19896:93;:::i;:::-;20014:2;20009:3;20005:12;19998:19;;19657:366;;;:::o;20029:::-;20171:3;20192:67;20256:2;20251:3;20192:67;:::i;:::-;20185:74;;20268:93;20357:3;20268:93;:::i;:::-;20386:2;20381:3;20377:12;20370:19;;20029:366;;;:::o;20401:::-;20543:3;20564:67;20628:2;20623:3;20564:67;:::i;:::-;20557:74;;20640:93;20729:3;20640:93;:::i;:::-;20758:2;20753:3;20749:12;20742:19;;20401:366;;;:::o;20773:::-;20915:3;20936:67;21000:2;20995:3;20936:67;:::i;:::-;20929:74;;21012:93;21101:3;21012:93;:::i;:::-;21130:2;21125:3;21121:12;21114:19;;20773:366;;;:::o;21145:::-;21287:3;21308:67;21372:2;21367:3;21308:67;:::i;:::-;21301:74;;21384:93;21473:3;21384:93;:::i;:::-;21502:2;21497:3;21493:12;21486:19;;21145:366;;;:::o;21517:::-;21659:3;21680:67;21744:2;21739:3;21680:67;:::i;:::-;21673:74;;21756:93;21845:3;21756:93;:::i;:::-;21874:2;21869:3;21865:12;21858:19;;21517:366;;;:::o;21889:::-;22031:3;22052:67;22116:2;22111:3;22052:67;:::i;:::-;22045:74;;22128:93;22217:3;22128:93;:::i;:::-;22246:2;22241:3;22237:12;22230:19;;21889:366;;;:::o;22261:::-;22403:3;22424:67;22488:2;22483:3;22424:67;:::i;:::-;22417:74;;22500:93;22589:3;22500:93;:::i;:::-;22618:2;22613:3;22609:12;22602:19;;22261:366;;;:::o;22633:::-;22775:3;22796:67;22860:2;22855:3;22796:67;:::i;:::-;22789:74;;22872:93;22961:3;22872:93;:::i;:::-;22990:2;22985:3;22981:12;22974:19;;22633:366;;;:::o;23005:::-;23147:3;23168:67;23232:2;23227:3;23168:67;:::i;:::-;23161:74;;23244:93;23333:3;23244:93;:::i;:::-;23362:2;23357:3;23353:12;23346:19;;23005:366;;;:::o;23377:::-;23519:3;23540:67;23604:2;23599:3;23540:67;:::i;:::-;23533:74;;23616:93;23705:3;23616:93;:::i;:::-;23734:2;23729:3;23725:12;23718:19;;23377:366;;;:::o;23749:::-;23891:3;23912:67;23976:2;23971:3;23912:67;:::i;:::-;23905:74;;23988:93;24077:3;23988:93;:::i;:::-;24106:2;24101:3;24097:12;24090:19;;23749:366;;;:::o;24121:::-;24263:3;24284:67;24348:2;24343:3;24284:67;:::i;:::-;24277:74;;24360:93;24449:3;24360:93;:::i;:::-;24478:2;24473:3;24469:12;24462:19;;24121:366;;;:::o;24493:::-;24635:3;24656:67;24720:2;24715:3;24656:67;:::i;:::-;24649:74;;24732:93;24821:3;24732:93;:::i;:::-;24850:2;24845:3;24841:12;24834:19;;24493:366;;;:::o;24865:::-;25007:3;25028:67;25092:2;25087:3;25028:67;:::i;:::-;25021:74;;25104:93;25193:3;25104:93;:::i;:::-;25222:2;25217:3;25213:12;25206:19;;24865:366;;;:::o;25237:::-;25379:3;25400:67;25464:2;25459:3;25400:67;:::i;:::-;25393:74;;25476:93;25565:3;25476:93;:::i;:::-;25594:2;25589:3;25585:12;25578:19;;25237:366;;;:::o;25609:::-;25751:3;25772:67;25836:2;25831:3;25772:67;:::i;:::-;25765:74;;25848:93;25937:3;25848:93;:::i;:::-;25966:2;25961:3;25957:12;25950:19;;25609:366;;;:::o;25981:108::-;26058:24;26076:5;26058:24;:::i;:::-;26053:3;26046:37;25981:108;;:::o;26095:118::-;26182:24;26200:5;26182:24;:::i;:::-;26177:3;26170:37;26095:118;;:::o;26219:256::-;26331:3;26346:75;26417:3;26408:6;26346:75;:::i;:::-;26446:2;26441:3;26437:12;26430:19;;26466:3;26459:10;;26219:256;;;;:::o;26481:397::-;26621:3;26636:75;26707:3;26698:6;26636:75;:::i;:::-;26736:2;26731:3;26727:12;26720:19;;26749:75;26820:3;26811:6;26749:75;:::i;:::-;26849:2;26844:3;26840:12;26833:19;;26869:3;26862:10;;26481:397;;;;;:::o;26884:271::-;27014:3;27036:93;27125:3;27116:6;27036:93;:::i;:::-;27029:100;;27146:3;27139:10;;26884:271;;;;:::o;27161:429::-;27338:3;27360:92;27448:3;27439:6;27360:92;:::i;:::-;27353:99;;27469:95;27560:3;27551:6;27469:95;:::i;:::-;27462:102;;27581:3;27574:10;;27161:429;;;;;:::o;27596:222::-;27689:4;27727:2;27716:9;27712:18;27704:26;;27740:71;27808:1;27797:9;27793:17;27784:6;27740:71;:::i;:::-;27596:222;;;;:::o;27824:238::-;27925:4;27963:2;27952:9;27948:18;27940:26;;27976:79;28052:1;28041:9;28037:17;28028:6;27976:79;:::i;:::-;27824:238;;;;:::o;28068:672::-;28279:4;28317:3;28306:9;28302:19;28294:27;;28331:87;28415:1;28404:9;28400:17;28391:6;28331:87;:::i;:::-;28428:72;28496:2;28485:9;28481:18;28472:6;28428:72;:::i;:::-;28510;28578:2;28567:9;28563:18;28554:6;28510:72;:::i;:::-;28629:9;28623:4;28619:20;28614:2;28603:9;28599:18;28592:48;28657:76;28728:4;28719:6;28657:76;:::i;:::-;28649:84;;28068:672;;;;;;;:::o;28746:332::-;28867:4;28905:2;28894:9;28890:18;28882:26;;28918:71;28986:1;28975:9;28971:17;28962:6;28918:71;:::i;:::-;28999:72;29067:2;29056:9;29052:18;29043:6;28999:72;:::i;:::-;28746:332;;;;;:::o;29084:373::-;29227:4;29265:2;29254:9;29250:18;29242:26;;29314:9;29308:4;29304:20;29300:1;29289:9;29285:17;29278:47;29342:108;29445:4;29436:6;29342:108;:::i;:::-;29334:116;;29084:373;;;;:::o;29463:210::-;29550:4;29588:2;29577:9;29573:18;29565:26;;29601:65;29663:1;29652:9;29648:17;29639:6;29601:65;:::i;:::-;29463:210;;;;:::o;29679:222::-;29772:4;29810:2;29799:9;29795:18;29787:26;;29823:71;29891:1;29880:9;29876:17;29867:6;29823:71;:::i;:::-;29679:222;;;;:::o;29907:313::-;30020:4;30058:2;30047:9;30043:18;30035:26;;30107:9;30101:4;30097:20;30093:1;30082:9;30078:17;30071:47;30135:78;30208:4;30199:6;30135:78;:::i;:::-;30127:86;;29907:313;;;;:::o;30226:419::-;30392:4;30430:2;30419:9;30415:18;30407:26;;30479:9;30473:4;30469:20;30465:1;30454:9;30450:17;30443:47;30507:131;30633:4;30507:131;:::i;:::-;30499:139;;30226:419;;;:::o;30651:::-;30817:4;30855:2;30844:9;30840:18;30832:26;;30904:9;30898:4;30894:20;30890:1;30879:9;30875:17;30868:47;30932:131;31058:4;30932:131;:::i;:::-;30924:139;;30651:419;;;:::o;31076:::-;31242:4;31280:2;31269:9;31265:18;31257:26;;31329:9;31323:4;31319:20;31315:1;31304:9;31300:17;31293:47;31357:131;31483:4;31357:131;:::i;:::-;31349:139;;31076:419;;;:::o;31501:::-;31667:4;31705:2;31694:9;31690:18;31682:26;;31754:9;31748:4;31744:20;31740:1;31729:9;31725:17;31718:47;31782:131;31908:4;31782:131;:::i;:::-;31774:139;;31501:419;;;:::o;31926:::-;32092:4;32130:2;32119:9;32115:18;32107:26;;32179:9;32173:4;32169:20;32165:1;32154:9;32150:17;32143:47;32207:131;32333:4;32207:131;:::i;:::-;32199:139;;31926:419;;;:::o;32351:::-;32517:4;32555:2;32544:9;32540:18;32532:26;;32604:9;32598:4;32594:20;32590:1;32579:9;32575:17;32568:47;32632:131;32758:4;32632:131;:::i;:::-;32624:139;;32351:419;;;:::o;32776:::-;32942:4;32980:2;32969:9;32965:18;32957:26;;33029:9;33023:4;33019:20;33015:1;33004:9;33000:17;32993:47;33057:131;33183:4;33057:131;:::i;:::-;33049:139;;32776:419;;;:::o;33201:::-;33367:4;33405:2;33394:9;33390:18;33382:26;;33454:9;33448:4;33444:20;33440:1;33429:9;33425:17;33418:47;33482:131;33608:4;33482:131;:::i;:::-;33474:139;;33201:419;;;:::o;33626:::-;33792:4;33830:2;33819:9;33815:18;33807:26;;33879:9;33873:4;33869:20;33865:1;33854:9;33850:17;33843:47;33907:131;34033:4;33907:131;:::i;:::-;33899:139;;33626:419;;;:::o;34051:::-;34217:4;34255:2;34244:9;34240:18;34232:26;;34304:9;34298:4;34294:20;34290:1;34279:9;34275:17;34268:47;34332:131;34458:4;34332:131;:::i;:::-;34324:139;;34051:419;;;:::o;34476:::-;34642:4;34680:2;34669:9;34665:18;34657:26;;34729:9;34723:4;34719:20;34715:1;34704:9;34700:17;34693:47;34757:131;34883:4;34757:131;:::i;:::-;34749:139;;34476:419;;;:::o;34901:::-;35067:4;35105:2;35094:9;35090:18;35082:26;;35154:9;35148:4;35144:20;35140:1;35129:9;35125:17;35118:47;35182:131;35308:4;35182:131;:::i;:::-;35174:139;;34901:419;;;:::o;35326:::-;35492:4;35530:2;35519:9;35515:18;35507:26;;35579:9;35573:4;35569:20;35565:1;35554:9;35550:17;35543:47;35607:131;35733:4;35607:131;:::i;:::-;35599:139;;35326:419;;;:::o;35751:::-;35917:4;35955:2;35944:9;35940:18;35932:26;;36004:9;35998:4;35994:20;35990:1;35979:9;35975:17;35968:47;36032:131;36158:4;36032:131;:::i;:::-;36024:139;;35751:419;;;:::o;36176:::-;36342:4;36380:2;36369:9;36365:18;36357:26;;36429:9;36423:4;36419:20;36415:1;36404:9;36400:17;36393:47;36457:131;36583:4;36457:131;:::i;:::-;36449:139;;36176:419;;;:::o;36601:::-;36767:4;36805:2;36794:9;36790:18;36782:26;;36854:9;36848:4;36844:20;36840:1;36829:9;36825:17;36818:47;36882:131;37008:4;36882:131;:::i;:::-;36874:139;;36601:419;;;:::o;37026:::-;37192:4;37230:2;37219:9;37215:18;37207:26;;37279:9;37273:4;37269:20;37265:1;37254:9;37250:17;37243:47;37307:131;37433:4;37307:131;:::i;:::-;37299:139;;37026:419;;;:::o;37451:::-;37617:4;37655:2;37644:9;37640:18;37632:26;;37704:9;37698:4;37694:20;37690:1;37679:9;37675:17;37668:47;37732:131;37858:4;37732:131;:::i;:::-;37724:139;;37451:419;;;:::o;37876:::-;38042:4;38080:2;38069:9;38065:18;38057:26;;38129:9;38123:4;38119:20;38115:1;38104:9;38100:17;38093:47;38157:131;38283:4;38157:131;:::i;:::-;38149:139;;37876:419;;;:::o;38301:::-;38467:4;38505:2;38494:9;38490:18;38482:26;;38554:9;38548:4;38544:20;38540:1;38529:9;38525:17;38518:47;38582:131;38708:4;38582:131;:::i;:::-;38574:139;;38301:419;;;:::o;38726:::-;38892:4;38930:2;38919:9;38915:18;38907:26;;38979:9;38973:4;38969:20;38965:1;38954:9;38950:17;38943:47;39007:131;39133:4;39007:131;:::i;:::-;38999:139;;38726:419;;;:::o;39151:::-;39317:4;39355:2;39344:9;39340:18;39332:26;;39404:9;39398:4;39394:20;39390:1;39379:9;39375:17;39368:47;39432:131;39558:4;39432:131;:::i;:::-;39424:139;;39151:419;;;:::o;39576:::-;39742:4;39780:2;39769:9;39765:18;39757:26;;39829:9;39823:4;39819:20;39815:1;39804:9;39800:17;39793:47;39857:131;39983:4;39857:131;:::i;:::-;39849:139;;39576:419;;;:::o;40001:::-;40167:4;40205:2;40194:9;40190:18;40182:26;;40254:9;40248:4;40244:20;40240:1;40229:9;40225:17;40218:47;40282:131;40408:4;40282:131;:::i;:::-;40274:139;;40001:419;;;:::o;40426:::-;40592:4;40630:2;40619:9;40615:18;40607:26;;40679:9;40673:4;40669:20;40665:1;40654:9;40650:17;40643:47;40707:131;40833:4;40707:131;:::i;:::-;40699:139;;40426:419;;;:::o;40851:::-;41017:4;41055:2;41044:9;41040:18;41032:26;;41104:9;41098:4;41094:20;41090:1;41079:9;41075:17;41068:47;41132:131;41258:4;41132:131;:::i;:::-;41124:139;;40851:419;;;:::o;41276:::-;41442:4;41480:2;41469:9;41465:18;41457:26;;41529:9;41523:4;41519:20;41515:1;41504:9;41500:17;41493:47;41557:131;41683:4;41557:131;:::i;:::-;41549:139;;41276:419;;;:::o;41701:::-;41867:4;41905:2;41894:9;41890:18;41882:26;;41954:9;41948:4;41944:20;41940:1;41929:9;41925:17;41918:47;41982:131;42108:4;41982:131;:::i;:::-;41974:139;;41701:419;;;:::o;42126:::-;42292:4;42330:2;42319:9;42315:18;42307:26;;42379:9;42373:4;42369:20;42365:1;42354:9;42350:17;42343:47;42407:131;42533:4;42407:131;:::i;:::-;42399:139;;42126:419;;;:::o;42551:::-;42717:4;42755:2;42744:9;42740:18;42732:26;;42804:9;42798:4;42794:20;42790:1;42779:9;42775:17;42768:47;42832:131;42958:4;42832:131;:::i;:::-;42824:139;;42551:419;;;:::o;42976:::-;43142:4;43180:2;43169:9;43165:18;43157:26;;43229:9;43223:4;43219:20;43215:1;43204:9;43200:17;43193:47;43257:131;43383:4;43257:131;:::i;:::-;43249:139;;42976:419;;;:::o;43401:::-;43567:4;43605:2;43594:9;43590:18;43582:26;;43654:9;43648:4;43644:20;43640:1;43629:9;43625:17;43618:47;43682:131;43808:4;43682:131;:::i;:::-;43674:139;;43401:419;;;:::o;43826:222::-;43919:4;43957:2;43946:9;43942:18;43934:26;;43970:71;44038:1;44027:9;44023:17;44014:6;43970:71;:::i;:::-;43826:222;;;;:::o;44054:129::-;44088:6;44115:20;;:::i;:::-;44105:30;;44144:33;44172:4;44164:6;44144:33;:::i;:::-;44054:129;;;:::o;44189:75::-;44222:6;44255:2;44249:9;44239:19;;44189:75;:::o;44270:311::-;44347:4;44437:18;44429:6;44426:30;44423:56;;;44459:18;;:::i;:::-;44423:56;44509:4;44501:6;44497:17;44489:25;;44569:4;44563;44559:15;44551:23;;44270:311;;;:::o;44587:307::-;44648:4;44738:18;44730:6;44727:30;44724:56;;;44760:18;;:::i;:::-;44724:56;44798:29;44820:6;44798:29;:::i;:::-;44790:37;;44882:4;44876;44872:15;44864:23;;44587:307;;;:::o;44900:132::-;44967:4;44990:3;44982:11;;45020:4;45015:3;45011:14;45003:22;;44900:132;;;:::o;45038:141::-;45087:4;45110:3;45102:11;;45133:3;45130:1;45123:14;45167:4;45164:1;45154:18;45146:26;;45038:141;;;:::o;45185:114::-;45252:6;45286:5;45280:12;45270:22;;45185:114;;;:::o;45305:98::-;45356:6;45390:5;45384:12;45374:22;;45305:98;;;:::o;45409:99::-;45461:6;45495:5;45489:12;45479:22;;45409:99;;;:::o;45514:113::-;45584:4;45616;45611:3;45607:14;45599:22;;45514:113;;;:::o;45633:184::-;45732:11;45766:6;45761:3;45754:19;45806:4;45801:3;45797:14;45782:29;;45633:184;;;;:::o;45823:168::-;45906:11;45940:6;45935:3;45928:19;45980:4;45975:3;45971:14;45956:29;;45823:168;;;;:::o;45997:147::-;46098:11;46135:3;46120:18;;45997:147;;;;:::o;46150:169::-;46234:11;46268:6;46263:3;46256:19;46308:4;46303:3;46299:14;46284:29;;46150:169;;;;:::o;46325:148::-;46427:11;46464:3;46449:18;;46325:148;;;;:::o;46479:305::-;46519:3;46538:20;46556:1;46538:20;:::i;:::-;46533:25;;46572:20;46590:1;46572:20;:::i;:::-;46567:25;;46726:1;46658:66;46654:74;46651:1;46648:81;46645:107;;;46732:18;;:::i;:::-;46645:107;46776:1;46773;46769:9;46762:16;;46479:305;;;;:::o;46790:185::-;46830:1;46847:20;46865:1;46847:20;:::i;:::-;46842:25;;46881:20;46899:1;46881:20;:::i;:::-;46876:25;;46920:1;46910:35;;46925:18;;:::i;:::-;46910:35;46967:1;46964;46960:9;46955:14;;46790:185;;;;:::o;46981:348::-;47021:7;47044:20;47062:1;47044:20;:::i;:::-;47039:25;;47078:20;47096:1;47078:20;:::i;:::-;47073:25;;47266:1;47198:66;47194:74;47191:1;47188:81;47183:1;47176:9;47169:17;47165:105;47162:131;;;47273:18;;:::i;:::-;47162:131;47321:1;47318;47314:9;47303:20;;46981:348;;;;:::o;47335:191::-;47375:4;47395:20;47413:1;47395:20;:::i;:::-;47390:25;;47429:20;47447:1;47429:20;:::i;:::-;47424:25;;47468:1;47465;47462:8;47459:34;;;47473:18;;:::i;:::-;47459:34;47518:1;47515;47511:9;47503:17;;47335:191;;;;:::o;47532:96::-;47569:7;47598:24;47616:5;47598:24;:::i;:::-;47587:35;;47532:96;;;:::o;47634:104::-;47679:7;47708:24;47726:5;47708:24;:::i;:::-;47697:35;;47634:104;;;:::o;47744:90::-;47778:7;47821:5;47814:13;47807:21;47796:32;;47744:90;;;:::o;47840:77::-;47877:7;47906:5;47895:16;;47840:77;;;:::o;47923:149::-;47959:7;47999:66;47992:5;47988:78;47977:89;;47923:149;;;:::o;48078:126::-;48115:7;48155:42;48148:5;48144:54;48133:65;;48078:126;;;:::o;48210:77::-;48247:7;48276:5;48265:16;;48210:77;;;:::o;48293:134::-;48351:9;48384:37;48415:5;48384:37;:::i;:::-;48371:50;;48293:134;;;:::o;48433:126::-;48483:9;48516:37;48547:5;48516:37;:::i;:::-;48503:50;;48433:126;;;:::o;48565:113::-;48615:9;48648:24;48666:5;48648:24;:::i;:::-;48635:37;;48565:113;;;:::o;48684:154::-;48768:6;48763:3;48758;48745:30;48830:1;48821:6;48816:3;48812:16;48805:27;48684:154;;;:::o;48844:307::-;48912:1;48922:113;48936:6;48933:1;48930:13;48922:113;;;49021:1;49016:3;49012:11;49006:18;49002:1;48997:3;48993:11;48986:39;48958:2;48955:1;48951:10;48946:15;;48922:113;;;49053:6;49050:1;49047:13;49044:101;;;49133:1;49124:6;49119:3;49115:16;49108:27;49044:101;48893:258;48844:307;;;:::o;49157:320::-;49201:6;49238:1;49232:4;49228:12;49218:22;;49285:1;49279:4;49275:12;49306:18;49296:81;;49362:4;49354:6;49350:17;49340:27;;49296:81;49424:2;49416:6;49413:14;49393:18;49390:38;49387:84;;;49443:18;;:::i;:::-;49387:84;49208:269;49157:320;;;:::o;49483:281::-;49566:27;49588:4;49566:27;:::i;:::-;49558:6;49554:40;49696:6;49684:10;49681:22;49660:18;49648:10;49645:34;49642:62;49639:88;;;49707:18;;:::i;:::-;49639:88;49747:10;49743:2;49736:22;49526:238;49483:281;;:::o;49770:233::-;49809:3;49832:24;49850:5;49832:24;:::i;:::-;49823:33;;49878:66;49871:5;49868:77;49865:103;;;49948:18;;:::i;:::-;49865:103;49995:1;49988:5;49984:13;49977:20;;49770:233;;;:::o;50009:100::-;50048:7;50077:26;50097:5;50077:26;:::i;:::-;50066:37;;50009:100;;;:::o;50115:79::-;50154:7;50183:5;50172:16;;50115:79;;;:::o;50200:94::-;50239:7;50268:20;50282:5;50268:20;:::i;:::-;50257:31;;50200:94;;;:::o;50300:176::-;50332:1;50349:20;50367:1;50349:20;:::i;:::-;50344:25;;50383:20;50401:1;50383:20;:::i;:::-;50378:25;;50422:1;50412:35;;50427:18;;:::i;:::-;50412:35;50468:1;50465;50461:9;50456:14;;50300:176;;;;:::o;50482:180::-;50530:77;50527:1;50520:88;50627:4;50624:1;50617:15;50651:4;50648:1;50641:15;50668:180;50716:77;50713:1;50706:88;50813:4;50810:1;50803:15;50837:4;50834:1;50827:15;50854:180;50902:77;50899:1;50892:88;50999:4;50996:1;50989:15;51023:4;51020:1;51013:15;51040:180;51088:77;51085:1;51078:88;51185:4;51182:1;51175:15;51209:4;51206:1;51199:15;51226:180;51274:77;51271:1;51264:88;51371:4;51368:1;51361:15;51395:4;51392:1;51385:15;51412:180;51460:77;51457:1;51450:88;51557:4;51554:1;51547:15;51581:4;51578:1;51571:15;51598:117;51707:1;51704;51697:12;51721:117;51830:1;51827;51820:12;51844:117;51953:1;51950;51943:12;51967:117;52076:1;52073;52066:12;52090:117;52199:1;52196;52189:12;52213:117;52322:1;52319;52312:12;52336:102;52377:6;52428:2;52424:7;52419:2;52412:5;52408:14;52404:28;52394:38;;52336:102;;;:::o;52444:94::-;52477:8;52525:5;52521:2;52517:14;52496:35;;52444:94;;;:::o;52544:221::-;52684:34;52680:1;52672:6;52668:14;52661:58;52753:4;52748:2;52740:6;52736:15;52729:29;52544:221;:::o;52771:170::-;52911:22;52907:1;52899:6;52895:14;52888:46;52771:170;:::o;52947:237::-;53087:34;53083:1;53075:6;53071:14;53064:58;53156:20;53151:2;53143:6;53139:15;53132:45;52947:237;:::o;53190:225::-;53330:34;53326:1;53318:6;53314:14;53307:58;53399:8;53394:2;53386:6;53382:15;53375:33;53190:225;:::o;53421:178::-;53561:30;53557:1;53549:6;53545:14;53538:54;53421:178;:::o;53605:182::-;53745:34;53741:1;53733:6;53729:14;53722:58;53605:182;:::o;53793:223::-;53933:34;53929:1;53921:6;53917:14;53910:58;54002:6;53997:2;53989:6;53985:15;53978:31;53793:223;:::o;54022:175::-;54162:27;54158:1;54150:6;54146:14;54139:51;54022:175;:::o;54203:180::-;54343:32;54339:1;54331:6;54327:14;54320:56;54203:180;:::o;54389:225::-;54529:34;54525:1;54517:6;54513:14;54506:58;54598:8;54593:2;54585:6;54581:15;54574:33;54389:225;:::o;54620:178::-;54760:30;54756:1;54748:6;54744:14;54737:54;54620:178;:::o;54804:231::-;54944:34;54940:1;54932:6;54928:14;54921:58;55013:14;55008:2;55000:6;54996:15;54989:39;54804:231;:::o;55041:172::-;55181:24;55177:1;55169:6;55165:14;55158:48;55041:172;:::o;55219:166::-;55359:18;55355:1;55347:6;55343:14;55336:42;55219:166;:::o;55391:173::-;55531:25;55527:1;55519:6;55515:14;55508:49;55391:173;:::o;55570:243::-;55710:34;55706:1;55698:6;55694:14;55687:58;55779:26;55774:2;55766:6;55762:15;55755:51;55570:243;:::o;55819:229::-;55959:34;55955:1;55947:6;55943:14;55936:58;56028:12;56023:2;56015:6;56011:15;56004:37;55819:229;:::o;56054:221::-;56194:34;56190:1;56182:6;56178:14;56171:58;56263:4;56258:2;56250:6;56246:15;56239:29;56054:221;:::o;56281:162::-;56421:14;56417:1;56409:6;56405:14;56398:38;56281:162;:::o;56449:182::-;56589:34;56585:1;56577:6;56573:14;56566:58;56449:182;:::o;56637:231::-;56777:34;56773:1;56765:6;56761:14;56754:58;56846:14;56841:2;56833:6;56829:15;56822:39;56637:231;:::o;56874:182::-;57014:34;57010:1;57002:6;56998:14;56991:58;56874:182;:::o;57062:179::-;57202:31;57198:1;57190:6;57186:14;57179:55;57062:179;:::o;57247:228::-;57387:34;57383:1;57375:6;57371:14;57364:58;57456:11;57451:2;57443:6;57439:15;57432:36;57247:228;:::o;57481:234::-;57621:34;57617:1;57609:6;57605:14;57598:58;57690:17;57685:2;57677:6;57673:15;57666:42;57481:234;:::o;57721:177::-;57861:29;57857:1;57849:6;57845:14;57838:53;57721:177;:::o;57904:220::-;58044:34;58040:1;58032:6;58028:14;58021:58;58113:3;58108:2;58100:6;58096:15;58089:28;57904:220;:::o;58130:236::-;58270:34;58266:1;58258:6;58254:14;58247:58;58339:19;58334:2;58326:6;58322:15;58315:44;58130:236;:::o;58372:179::-;58512:31;58508:1;58500:6;58496:14;58489:55;58372:179;:::o;58557:177::-;58697:29;58693:1;58685:6;58681:14;58674:53;58557:177;:::o;58740:173::-;58880:25;58876:1;58868:6;58864:14;58857:49;58740:173;:::o;58919:238::-;59059:34;59055:1;59047:6;59043:14;59036:58;59128:21;59123:2;59115:6;59111:15;59104:46;58919:238;:::o;59163:122::-;59236:24;59254:5;59236:24;:::i;:::-;59229:5;59226:35;59216:63;;59275:1;59272;59265:12;59216:63;59163:122;:::o;59291:116::-;59361:21;59376:5;59361:21;:::i;:::-;59354:5;59351:32;59341:60;;59397:1;59394;59387:12;59341:60;59291:116;:::o;59413:122::-;59486:24;59504:5;59486:24;:::i;:::-;59479:5;59476:35;59466:63;;59525:1;59522;59515:12;59466:63;59413:122;:::o;59541:120::-;59613:23;59630:5;59613:23;:::i;:::-;59606:5;59603:34;59593:62;;59651:1;59648;59641:12;59593:62;59541:120;:::o;59667:122::-;59740:24;59758:5;59740:24;:::i;:::-;59733:5;59730:35;59720:63;;59779:1;59776;59769:12;59720:63;59667:122;:::o
Swarm Source
ipfs://544df123e3291c114c8d3ea1d61b65b11634612105ae44d9bade8d5c62517292
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.