Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 6 from a total of 6 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 18945119 | 799 days ago | IN | 0 ETH | 0.00046924 | ||||
| Set Base Token U... | 14659963 | 1419 days ago | IN | 0 ETH | 0.00101478 | ||||
| Set Approval For... | 14653281 | 1420 days ago | IN | 0 ETH | 0.00133624 | ||||
| Set Base Token U... | 14627214 | 1424 days ago | IN | 0 ETH | 0.00132269 | ||||
| Mint | 14608760 | 1427 days ago | IN | 0 ETH | 0.01120869 | ||||
| Set Base Token U... | 14608742 | 1427 days ago | IN | 0 ETH | 0.00175721 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MeowPals
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-04-18
*/
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
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 meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: erc721a/contracts/ERC721A.sol
// Creator: Chiru Labs
pragma solidity ^0.8.4;
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Compiler will pack this into a single 256bit word.
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
}
// Compiler will pack this into a single 256bit word.
struct AddressData {
// Realistically, 2**64-1 is more than enough.
uint64 balance;
// Keeps track of mint count with minimal overhead for tokenomics.
uint64 numberMinted;
// Keeps track of burn count with minimal overhead for tokenomics.
uint64 numberBurned;
// For miscellaneous variable(s) pertaining to the address
// (e.g. number of whitelist mint slots used).
// If there are multiple variables, please pack them into a uint64.
uint64 aux;
}
// The tokenId of the next token to be minted.
uint256 internal _currentIndex;
// The number of tokens burned.
uint256 internal _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) internal _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// 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;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* To change the starting tokenId, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
*/
function totalSupply() public view returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than _currentIndex - _startTokenId() times
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view returns (uint256) {
// Counter underflow is impossible as _currentIndex does not decrement,
// and it is initialized to _startTokenId()
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return uint256(_addressData[owner].balance);
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberMinted);
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberBurned);
}
/**
* Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return _addressData[owner].aux;
}
/**
* Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal {
_addressData[owner].aux = aux;
}
/**
* Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around in the collection over time.
*/
function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr && curr < _currentIndex) {
TokenOwnership memory ownership = _ownerships[curr];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
return ownership;
}
// Invariant:
// There will always be an ownership that has an address and is not burned
// before an ownership that does not have an address and is not burned.
// Hence, curr will not underflow.
while (true) {
curr--;
ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return _ownershipOf(tokenId).addr;
}
/**
* @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) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ERC721A.ownerOf(tokenId);
if (to == owner) revert ApprovalToCurrentOwner();
if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_approve(to, tokenId, owner);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
if (operator == _msgSender()) revert ApproveToCaller();
_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 {
_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 {
_transfer(from, to, tokenId);
if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @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`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
}
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
_mint(to, quantity, _data, true);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _mint(
address to,
uint256 quantity,
bytes memory _data,
bool safe
) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
// updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
unchecked {
_addressData[to].balance += uint64(quantity);
_addressData[to].numberMinted += uint64(quantity);
_ownerships[startTokenId].addr = to;
_ownerships[startTokenId].startTimestamp = uint64(block.timestamp);
uint256 updatedIndex = startTokenId;
uint256 end = updatedIndex + quantity;
if (safe && to.isContract()) {
do {
emit Transfer(address(0), to, updatedIndex);
if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (updatedIndex != end);
// Reentrancy protection
if (_currentIndex != startTokenId) revert();
} else {
do {
emit Transfer(address(0), to, updatedIndex++);
} while (updatedIndex != end);
}
_currentIndex = updatedIndex;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* 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
) private {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = to;
currSlot.startTimestamp = uint64(block.timestamp);
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev This is equivalent to _burn(tokenId, false)
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
address from = prevOwnership.addr;
if (approvalCheck) {
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
AddressData storage addressData = _addressData[from];
addressData.balance -= 1;
addressData.numberBurned += 1;
// Keep track of who burned the token, and the timestamp of burning.
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = from;
currSlot.startTimestamp = uint64(block.timestamp);
currSlot.burned = true;
// If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* 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, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
* minting.
* And also called after one token has been burned.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
}
//////////////////////////////////////////
/////###/////////////###//////////////////
/////####///////////####//////////////////
/////###################//////////////////
/////####################/////////////////
///#######################////////####////
////#####################////////######///
/////###################///////########///
////########################//########////
////##################################////
////##############################////////
/////#############################////////
/////###############################//////
/////#####//////////########/#######//////
/////////////////////####/////######//////
//SHOGG///////////////////////////////////
// SPDX-License-Identifier: MIT
// File: MeowPals_ERC721A.sol
pragma solidity ^0.8.4;
contract MeowPals is ERC721A, Ownable {
uint256 public MAX_SUPPLY;
//This sets the ipfs uri, either add in below or request the change through the contract request "setBaseTokenURI"
string public baseTokenUri = "";
//Extension of metatadate file
string public baseTokenUriExt = ".json";
//This sets the token name and symbol
constructor() payable onlyOwner ERC721A("Meow Pals", "PALS") {
//inital max supply, change supply if needed
MAX_SUPPLY = 10001;
}
//This sends the minting function, remove onlyOwner if you want public to mint, consider adding minting
function mint(uint256 quantity) external payable onlyOwner{
// _safeMint's second argument now takes in a quantity, not a tokenId.
require(quantity + _numberMinted(msg.sender) <= MAX_SUPPLY, "Exceeded the limit");
require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left");
//Set 0 to cost for each mint or add in varible for public minting.
require(msg.value >= 0 ether * quantity, "Insufficient funds!");
_safeMint(msg.sender, quantity);
}
//This sets the metadata URI
function setBaseTokenUri(string calldata newBaseTokenUri_)
external
onlyOwner
{
baseTokenUri = newBaseTokenUri_;
}
//This sets the metadata to the NFT tokens
function getOwnershipData(uint256 tokenId)
external
view
returns (TokenOwnership memory)
{
return _ownershipOf(tokenId);
}
function tokenURI(uint256 tokenId_)
public
view
override
returns (string memory)
{
require(_exists(tokenId_), 'Token does not exist!');
return
string(
abi.encodePacked(
baseTokenUri,
Strings.toString(tokenId_),
baseTokenUriExt
)
);
}
// This will allow the owner to change the maximum supply.
function setMAX_SUPPLY(uint256 _MAX_SUPPLY) public onlyOwner {
MAX_SUPPLY = _MAX_SUPPLY;
}
function withdraw() public onlyOwner {
// This will transfer the remaining contract balance to the owner.
// Do not remove this otherwise you will not be able to withdraw the funds.
// =============================================================================
(bool os, ) = payable(owner()).call{value: address(this).balance}("");
require(os);
// =============================================================================
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenUriExt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"newBaseTokenUri_","type":"string"}],"name":"setBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_SUPPLY","type":"uint256"}],"name":"setMAX_SUPPLY","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":"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260405180602001604052806000815250600a90805190602001906200002b929190620002eb565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b908051906020019062000079929190620002eb565b506040518060400160405280600981526020017f4d656f772050616c7300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f50414c53000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000fe929190620002eb565b50806003908051906020019062000117929190620002eb565b5062000128620001ee60201b60201c565b60008190555050506200015062000144620001f360201b60201c565b620001fb60201b60201c565b62000160620001f360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000186620002c160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620001df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d690620003c2565b60405180910390fd5b61271160098190555062000483565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002f990620003f5565b90600052602060002090601f0160209004810192826200031d576000855562000369565b82601f106200033857805160ff191683800117855562000369565b8280016001018555821562000369579182015b82811115620003685782518255916020019190600101906200034b565b5b5090506200037891906200037c565b5090565b5b80821115620003975760008160009055506001016200037d565b5090565b6000620003aa602083620003e4565b9150620003b7826200045a565b602082019050919050565b60006020820190508181036000830152620003dd816200039b565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200040e57607f821691505b602082108114156200042557620004246200042b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61342980620004936000396000f3fe6080604052600436106101665760003560e01c80637a0101a2116100d1578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610509578063e985e9c514610546578063ec9496ba14610583578063f2fde38b146105ac57610166565b8063a22cb4651461048c578063b88d4fde146104b5578063bae77953146104de57610166565b80637a0101a2146103895780638da5cb5b146103b45780639231ab2a146103df57806395652cfa1461041c57806395d89b4114610445578063a0712d681461047057610166565b806332cb6b0c1161012357806332cb6b0c1461028d5780633ccfd60b146102b857806342842e0e146102cf5780636352211e146102f857806370a0823114610335578063715018a61461037257610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906128e3565b6105d5565b60405161019f9190612d03565b60405180910390f35b3480156101b457600080fd5b506101bd6106b7565b6040516101ca9190612d1e565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f5919061297a565b610749565b6040516102079190612c9c565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906128a7565b6107c5565b005b34801561024557600080fd5b5061024e6108d0565b60405161025b9190612e1b565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906127a1565b6108e7565b005b34801561029957600080fd5b506102a26108f7565b6040516102af9190612e1b565b60405180910390f35b3480156102c457600080fd5b506102cd6108fd565b005b3480156102db57600080fd5b506102f660048036038101906102f191906127a1565b6109f9565b005b34801561030457600080fd5b5061031f600480360381019061031a919061297a565b610a19565b60405161032c9190612c9c565b60405180910390f35b34801561034157600080fd5b5061035c6004803603810190610357919061273c565b610a2f565b6040516103699190612e1b565b60405180910390f35b34801561037e57600080fd5b50610387610aff565b005b34801561039557600080fd5b5061039e610b87565b6040516103ab9190612d1e565b60405180910390f35b3480156103c057600080fd5b506103c9610c15565b6040516103d69190612c9c565b60405180910390f35b3480156103eb57600080fd5b506104066004803603810190610401919061297a565b610c3f565b6040516104139190612e00565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190612935565b610c57565b005b34801561045157600080fd5b5061045a610ce9565b6040516104679190612d1e565b60405180910390f35b61048a6004803603810190610485919061297a565b610d7b565b005b34801561049857600080fd5b506104b360048036038101906104ae919061286b565b610f02565b005b3480156104c157600080fd5b506104dc60048036038101906104d791906127f0565b61107a565b005b3480156104ea57600080fd5b506104f36110f6565b6040516105009190612d1e565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b919061297a565b611184565b60405161053d9190612d1e565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190612765565b611203565b60405161057a9190612d03565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a5919061297a565b611297565b005b3480156105b857600080fd5b506105d360048036038101906105ce919061273c565b61131d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b057506106af82611415565b5b9050919050565b6060600280546106c6906130ce565b80601f01602080910402602001604051908101604052809291908181526020018280546106f2906130ce565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b60006107548261147f565b61078a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d082610a19565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610838576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108576114cd565b73ffffffffffffffffffffffffffffffffffffffff16141580156108895750610887816108826114cd565b611203565b155b156108c0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cb8383836114d5565b505050565b60006108da611587565b6001546000540303905090565b6108f283838361158c565b505050565b60095481565b6109056114cd565b73ffffffffffffffffffffffffffffffffffffffff16610923610c15565b73ffffffffffffffffffffffffffffffffffffffff1614610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090612da0565b60405180910390fd5b6000610983610c15565b73ffffffffffffffffffffffffffffffffffffffff16476040516109a690612c87565b60006040518083038185875af1925050503d80600081146109e3576040519150601f19603f3d011682016040523d82523d6000602084013e6109e8565b606091505b50509050806109f657600080fd5b50565b610a148383836040518060200160405280600081525061107a565b505050565b6000610a2482611a42565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a97576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610b076114cd565b73ffffffffffffffffffffffffffffffffffffffff16610b25610c15565b73ffffffffffffffffffffffffffffffffffffffff1614610b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7290612da0565b60405180910390fd5b610b856000611cd1565b565b600a8054610b94906130ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc0906130ce565b8015610c0d5780601f10610be257610100808354040283529160200191610c0d565b820191906000526020600020905b815481529060010190602001808311610bf057829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c4761253b565b610c5082611a42565b9050919050565b610c5f6114cd565b73ffffffffffffffffffffffffffffffffffffffff16610c7d610c15565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90612da0565b60405180910390fd5b8181600a9190610ce492919061257e565b505050565b606060038054610cf8906130ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610d24906130ce565b8015610d715780601f10610d4657610100808354040283529160200191610d71565b820191906000526020600020905b815481529060010190602001808311610d5457829003601f168201915b5050505050905090565b610d836114cd565b73ffffffffffffffffffffffffffffffffffffffff16610da1610c15565b73ffffffffffffffffffffffffffffffffffffffff1614610df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dee90612da0565b60405180910390fd5b600954610e0333611d97565b82610e0e9190612eef565b1115610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690612d60565b60405180910390fd5b60095481610e5b6108d0565b610e659190612eef565b1115610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90612d80565b60405180910390fd5b806000610eb39190612f76565b341015610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90612de0565b60405180910390fd5b610eff3382611e01565b50565b610f0a6114cd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610f7c6114cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110296114cd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161106e9190612d03565b60405180910390a35050565b61108584848461158c565b6110a48373ffffffffffffffffffffffffffffffffffffffff16611e1f565b80156110b957506110b784848484611e42565b155b156110f0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600b8054611103906130ce565b80601f016020809104026020016040519081016040528092919081815260200182805461112f906130ce565b801561117c5780601f106111515761010080835404028352916020019161117c565b820191906000526020600020905b81548152906001019060200180831161115f57829003601f168201915b505050505081565b606061118f8261147f565b6111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c590612dc0565b60405180910390fd5b600a6111d983611fa2565b600b6040516020016111ed93929190612c56565b6040516020818303038152906040529050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61129f6114cd565b73ffffffffffffffffffffffffffffffffffffffff166112bd610c15565b73ffffffffffffffffffffffffffffffffffffffff1614611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a90612da0565b60405180910390fd5b8060098190555050565b6113256114cd565b73ffffffffffffffffffffffffffffffffffffffff16611343610c15565b73ffffffffffffffffffffffffffffffffffffffff1614611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090612da0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090612d40565b60405180910390fd5b61141281611cd1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161148a611587565b11158015611499575060005482105b80156114c6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061159782611a42565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611602576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166116236114cd565b73ffffffffffffffffffffffffffffffffffffffff16148061165257506116518561164c6114cd565b611203565b5b8061169757506116606114cd565b73ffffffffffffffffffffffffffffffffffffffff1661167f84610749565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806116d0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611737576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611744858585600161214f565b611750600084876114d5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119d05760005482146119cf57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a3b8585856001612155565b5050505050565b611a4a61253b565b600082905080611a58611587565b11158015611a67575060005481105b15611c9a576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c9857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b7c578092505050611ccc565b5b600115611c9757818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c92578092505050611ccc565b611b7d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611e1b82826040518060200160405280600081525061215b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e686114cd565b8786866040518563ffffffff1660e01b8152600401611e8a9493929190612cb7565b602060405180830381600087803b158015611ea457600080fd5b505af1925050508015611ed557506040513d601f19601f82011682018060405250810190611ed2919061290c565b60015b611f4f573d8060008114611f05576040519150601f19603f3d011682016040523d82523d6000602084013e611f0a565b606091505b50600081511415611f47576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611fea576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061214a565b600082905060005b6000821461201c57808061200590613131565b915050600a826120159190612f45565b9150611ff2565b60008167ffffffffffffffff81111561205e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120905781602001600182028036833780820191505090505b5090505b60008514612143576001826120a99190612fd0565b9150600a856120b8919061317a565b60306120c49190612eef565b60f81b818381518110612100577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561213c9190612f45565b9450612094565b8093505050505b919050565b50505050565b50505050565b612168838383600161216d565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156121da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612215576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612222600086838761214f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156123ec57506123eb8773ffffffffffffffffffffffffffffffffffffffff16611e1f565b5b156124b2575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124616000888480600101955088611e42565b612497576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156123f25782600054146124ad57600080fd5b61251e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156124b3575b8160008190555050506125346000868387612155565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b82805461258a906130ce565b90600052602060002090601f0160209004810192826125ac57600085556125f3565b82601f106125c557803560ff19168380011785556125f3565b828001600101855582156125f3579182015b828111156125f25782358255916020019190600101906125d7565b5b5090506126009190612604565b5090565b5b8082111561261d576000816000905550600101612605565b5090565b600061263461262f84612e5b565b612e36565b90508281526020810184848401111561264c57600080fd5b61265784828561308c565b509392505050565b60008135905061266e81613397565b92915050565b600081359050612683816133ae565b92915050565b600081359050612698816133c5565b92915050565b6000815190506126ad816133c5565b92915050565b600082601f8301126126c457600080fd5b81356126d4848260208601612621565b91505092915050565b60008083601f8401126126ef57600080fd5b8235905067ffffffffffffffff81111561270857600080fd5b60208301915083600182028301111561272057600080fd5b9250929050565b600081359050612736816133dc565b92915050565b60006020828403121561274e57600080fd5b600061275c8482850161265f565b91505092915050565b6000806040838503121561277857600080fd5b60006127868582860161265f565b92505060206127978582860161265f565b9150509250929050565b6000806000606084860312156127b657600080fd5b60006127c48682870161265f565b93505060206127d58682870161265f565b92505060406127e686828701612727565b9150509250925092565b6000806000806080858703121561280657600080fd5b60006128148782880161265f565b94505060206128258782880161265f565b935050604061283687828801612727565b925050606085013567ffffffffffffffff81111561285357600080fd5b61285f878288016126b3565b91505092959194509250565b6000806040838503121561287e57600080fd5b600061288c8582860161265f565b925050602061289d85828601612674565b9150509250929050565b600080604083850312156128ba57600080fd5b60006128c88582860161265f565b92505060206128d985828601612727565b9150509250929050565b6000602082840312156128f557600080fd5b600061290384828501612689565b91505092915050565b60006020828403121561291e57600080fd5b600061292c8482850161269e565b91505092915050565b6000806020838503121561294857600080fd5b600083013567ffffffffffffffff81111561296257600080fd5b61296e858286016126dd565b92509250509250929050565b60006020828403121561298c57600080fd5b600061299a84828501612727565b91505092915050565b6129ac81613004565b82525050565b6129bb81613004565b82525050565b6129ca81613016565b82525050565b6129d981613016565b82525050565b60006129ea82612ea1565b6129f48185612eb7565b9350612a0481856020860161309b565b612a0d81613267565b840191505092915050565b6000612a2382612eac565b612a2d8185612ed3565b9350612a3d81856020860161309b565b612a4681613267565b840191505092915050565b6000612a5c82612eac565b612a668185612ee4565b9350612a7681856020860161309b565b80840191505092915050565b60008154612a8f816130ce565b612a998186612ee4565b94506001821660008114612ab45760018114612ac557612af8565b60ff19831686528186019350612af8565b612ace85612e8c565b60005b83811015612af057815481890152600182019150602081019050612ad1565b838801955050505b50505092915050565b6000612b0e602683612ed3565b9150612b1982613278565b604082019050919050565b6000612b31601283612ed3565b9150612b3c826132c7565b602082019050919050565b6000612b54601683612ed3565b9150612b5f826132f0565b602082019050919050565b6000612b77602083612ed3565b9150612b8282613319565b602082019050919050565b6000612b9a600083612ec8565b9150612ba582613342565b600082019050919050565b6000612bbd601583612ed3565b9150612bc882613345565b602082019050919050565b6000612be0601383612ed3565b9150612beb8261336e565b602082019050919050565b606082016000820151612c0c60008501826129a3565b506020820151612c1f6020850182612c47565b506040820151612c3260408501826129c1565b50505050565b612c418161306e565b82525050565b612c5081613078565b82525050565b6000612c628286612a82565b9150612c6e8285612a51565b9150612c7a8284612a82565b9150819050949350505050565b6000612c9282612b8d565b9150819050919050565b6000602082019050612cb160008301846129b2565b92915050565b6000608082019050612ccc60008301876129b2565b612cd960208301866129b2565b612ce66040830185612c38565b8181036060830152612cf881846129df565b905095945050505050565b6000602082019050612d1860008301846129d0565b92915050565b60006020820190508181036000830152612d388184612a18565b905092915050565b60006020820190508181036000830152612d5981612b01565b9050919050565b60006020820190508181036000830152612d7981612b24565b9050919050565b60006020820190508181036000830152612d9981612b47565b9050919050565b60006020820190508181036000830152612db981612b6a565b9050919050565b60006020820190508181036000830152612dd981612bb0565b9050919050565b60006020820190508181036000830152612df981612bd3565b9050919050565b6000606082019050612e156000830184612bf6565b92915050565b6000602082019050612e306000830184612c38565b92915050565b6000612e40612e51565b9050612e4c8282613100565b919050565b6000604051905090565b600067ffffffffffffffff821115612e7657612e75613238565b5b612e7f82613267565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612efa8261306e565b9150612f058361306e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f3a57612f396131ab565b5b828201905092915050565b6000612f508261306e565b9150612f5b8361306e565b925082612f6b57612f6a6131da565b5b828204905092915050565b6000612f818261306e565b9150612f8c8361306e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fc557612fc46131ab565b5b828202905092915050565b6000612fdb8261306e565b9150612fe68361306e565b925082821015612ff957612ff86131ab565b5b828203905092915050565b600061300f8261304e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156130b957808201518184015260208101905061309e565b838111156130c8576000848401525b50505050565b600060028204905060018216806130e657607f821691505b602082108114156130fa576130f9613209565b5b50919050565b61310982613267565b810181811067ffffffffffffffff8211171561312857613127613238565b5b80604052505050565b600061313c8261306e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561316f5761316e6131ab565b5b600182019050919050565b60006131858261306e565b91506131908361306e565b9250826131a05761319f6131da565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f546f6b656e20646f6573206e6f74206578697374210000000000000000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6133a081613004565b81146133ab57600080fd5b50565b6133b781613016565b81146133c257600080fd5b50565b6133ce81613022565b81146133d957600080fd5b50565b6133e58161306e565b81146133f057600080fd5b5056fea2646970667358221220dad95f763b0a462afd9dfe927ecac3bf8731dfb60b0a40eca9bf6348f6e025a064736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101665760003560e01c80637a0101a2116100d1578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610509578063e985e9c514610546578063ec9496ba14610583578063f2fde38b146105ac57610166565b8063a22cb4651461048c578063b88d4fde146104b5578063bae77953146104de57610166565b80637a0101a2146103895780638da5cb5b146103b45780639231ab2a146103df57806395652cfa1461041c57806395d89b4114610445578063a0712d681461047057610166565b806332cb6b0c1161012357806332cb6b0c1461028d5780633ccfd60b146102b857806342842e0e146102cf5780636352211e146102f857806370a0823114610335578063715018a61461037257610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906128e3565b6105d5565b60405161019f9190612d03565b60405180910390f35b3480156101b457600080fd5b506101bd6106b7565b6040516101ca9190612d1e565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f5919061297a565b610749565b6040516102079190612c9c565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906128a7565b6107c5565b005b34801561024557600080fd5b5061024e6108d0565b60405161025b9190612e1b565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906127a1565b6108e7565b005b34801561029957600080fd5b506102a26108f7565b6040516102af9190612e1b565b60405180910390f35b3480156102c457600080fd5b506102cd6108fd565b005b3480156102db57600080fd5b506102f660048036038101906102f191906127a1565b6109f9565b005b34801561030457600080fd5b5061031f600480360381019061031a919061297a565b610a19565b60405161032c9190612c9c565b60405180910390f35b34801561034157600080fd5b5061035c6004803603810190610357919061273c565b610a2f565b6040516103699190612e1b565b60405180910390f35b34801561037e57600080fd5b50610387610aff565b005b34801561039557600080fd5b5061039e610b87565b6040516103ab9190612d1e565b60405180910390f35b3480156103c057600080fd5b506103c9610c15565b6040516103d69190612c9c565b60405180910390f35b3480156103eb57600080fd5b506104066004803603810190610401919061297a565b610c3f565b6040516104139190612e00565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190612935565b610c57565b005b34801561045157600080fd5b5061045a610ce9565b6040516104679190612d1e565b60405180910390f35b61048a6004803603810190610485919061297a565b610d7b565b005b34801561049857600080fd5b506104b360048036038101906104ae919061286b565b610f02565b005b3480156104c157600080fd5b506104dc60048036038101906104d791906127f0565b61107a565b005b3480156104ea57600080fd5b506104f36110f6565b6040516105009190612d1e565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b919061297a565b611184565b60405161053d9190612d1e565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190612765565b611203565b60405161057a9190612d03565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a5919061297a565b611297565b005b3480156105b857600080fd5b506105d360048036038101906105ce919061273c565b61131d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b057506106af82611415565b5b9050919050565b6060600280546106c6906130ce565b80601f01602080910402602001604051908101604052809291908181526020018280546106f2906130ce565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b60006107548261147f565b61078a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d082610a19565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610838576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108576114cd565b73ffffffffffffffffffffffffffffffffffffffff16141580156108895750610887816108826114cd565b611203565b155b156108c0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cb8383836114d5565b505050565b60006108da611587565b6001546000540303905090565b6108f283838361158c565b505050565b60095481565b6109056114cd565b73ffffffffffffffffffffffffffffffffffffffff16610923610c15565b73ffffffffffffffffffffffffffffffffffffffff1614610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090612da0565b60405180910390fd5b6000610983610c15565b73ffffffffffffffffffffffffffffffffffffffff16476040516109a690612c87565b60006040518083038185875af1925050503d80600081146109e3576040519150601f19603f3d011682016040523d82523d6000602084013e6109e8565b606091505b50509050806109f657600080fd5b50565b610a148383836040518060200160405280600081525061107a565b505050565b6000610a2482611a42565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a97576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610b076114cd565b73ffffffffffffffffffffffffffffffffffffffff16610b25610c15565b73ffffffffffffffffffffffffffffffffffffffff1614610b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7290612da0565b60405180910390fd5b610b856000611cd1565b565b600a8054610b94906130ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc0906130ce565b8015610c0d5780601f10610be257610100808354040283529160200191610c0d565b820191906000526020600020905b815481529060010190602001808311610bf057829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c4761253b565b610c5082611a42565b9050919050565b610c5f6114cd565b73ffffffffffffffffffffffffffffffffffffffff16610c7d610c15565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90612da0565b60405180910390fd5b8181600a9190610ce492919061257e565b505050565b606060038054610cf8906130ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610d24906130ce565b8015610d715780601f10610d4657610100808354040283529160200191610d71565b820191906000526020600020905b815481529060010190602001808311610d5457829003601f168201915b5050505050905090565b610d836114cd565b73ffffffffffffffffffffffffffffffffffffffff16610da1610c15565b73ffffffffffffffffffffffffffffffffffffffff1614610df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dee90612da0565b60405180910390fd5b600954610e0333611d97565b82610e0e9190612eef565b1115610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690612d60565b60405180910390fd5b60095481610e5b6108d0565b610e659190612eef565b1115610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90612d80565b60405180910390fd5b806000610eb39190612f76565b341015610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90612de0565b60405180910390fd5b610eff3382611e01565b50565b610f0a6114cd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610f7c6114cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110296114cd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161106e9190612d03565b60405180910390a35050565b61108584848461158c565b6110a48373ffffffffffffffffffffffffffffffffffffffff16611e1f565b80156110b957506110b784848484611e42565b155b156110f0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600b8054611103906130ce565b80601f016020809104026020016040519081016040528092919081815260200182805461112f906130ce565b801561117c5780601f106111515761010080835404028352916020019161117c565b820191906000526020600020905b81548152906001019060200180831161115f57829003601f168201915b505050505081565b606061118f8261147f565b6111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c590612dc0565b60405180910390fd5b600a6111d983611fa2565b600b6040516020016111ed93929190612c56565b6040516020818303038152906040529050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61129f6114cd565b73ffffffffffffffffffffffffffffffffffffffff166112bd610c15565b73ffffffffffffffffffffffffffffffffffffffff1614611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a90612da0565b60405180910390fd5b8060098190555050565b6113256114cd565b73ffffffffffffffffffffffffffffffffffffffff16611343610c15565b73ffffffffffffffffffffffffffffffffffffffff1614611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090612da0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090612d40565b60405180910390fd5b61141281611cd1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161148a611587565b11158015611499575060005482105b80156114c6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061159782611a42565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611602576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166116236114cd565b73ffffffffffffffffffffffffffffffffffffffff16148061165257506116518561164c6114cd565b611203565b5b8061169757506116606114cd565b73ffffffffffffffffffffffffffffffffffffffff1661167f84610749565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806116d0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611737576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611744858585600161214f565b611750600084876114d5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119d05760005482146119cf57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a3b8585856001612155565b5050505050565b611a4a61253b565b600082905080611a58611587565b11158015611a67575060005481105b15611c9a576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c9857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b7c578092505050611ccc565b5b600115611c9757818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c92578092505050611ccc565b611b7d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611e1b82826040518060200160405280600081525061215b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e686114cd565b8786866040518563ffffffff1660e01b8152600401611e8a9493929190612cb7565b602060405180830381600087803b158015611ea457600080fd5b505af1925050508015611ed557506040513d601f19601f82011682018060405250810190611ed2919061290c565b60015b611f4f573d8060008114611f05576040519150601f19603f3d011682016040523d82523d6000602084013e611f0a565b606091505b50600081511415611f47576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611fea576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061214a565b600082905060005b6000821461201c57808061200590613131565b915050600a826120159190612f45565b9150611ff2565b60008167ffffffffffffffff81111561205e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120905781602001600182028036833780820191505090505b5090505b60008514612143576001826120a99190612fd0565b9150600a856120b8919061317a565b60306120c49190612eef565b60f81b818381518110612100577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561213c9190612f45565b9450612094565b8093505050505b919050565b50505050565b50505050565b612168838383600161216d565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156121da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612215576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612222600086838761214f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156123ec57506123eb8773ffffffffffffffffffffffffffffffffffffffff16611e1f565b5b156124b2575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124616000888480600101955088611e42565b612497576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156123f25782600054146124ad57600080fd5b61251e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156124b3575b8160008190555050506125346000868387612155565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b82805461258a906130ce565b90600052602060002090601f0160209004810192826125ac57600085556125f3565b82601f106125c557803560ff19168380011785556125f3565b828001600101855582156125f3579182015b828111156125f25782358255916020019190600101906125d7565b5b5090506126009190612604565b5090565b5b8082111561261d576000816000905550600101612605565b5090565b600061263461262f84612e5b565b612e36565b90508281526020810184848401111561264c57600080fd5b61265784828561308c565b509392505050565b60008135905061266e81613397565b92915050565b600081359050612683816133ae565b92915050565b600081359050612698816133c5565b92915050565b6000815190506126ad816133c5565b92915050565b600082601f8301126126c457600080fd5b81356126d4848260208601612621565b91505092915050565b60008083601f8401126126ef57600080fd5b8235905067ffffffffffffffff81111561270857600080fd5b60208301915083600182028301111561272057600080fd5b9250929050565b600081359050612736816133dc565b92915050565b60006020828403121561274e57600080fd5b600061275c8482850161265f565b91505092915050565b6000806040838503121561277857600080fd5b60006127868582860161265f565b92505060206127978582860161265f565b9150509250929050565b6000806000606084860312156127b657600080fd5b60006127c48682870161265f565b93505060206127d58682870161265f565b92505060406127e686828701612727565b9150509250925092565b6000806000806080858703121561280657600080fd5b60006128148782880161265f565b94505060206128258782880161265f565b935050604061283687828801612727565b925050606085013567ffffffffffffffff81111561285357600080fd5b61285f878288016126b3565b91505092959194509250565b6000806040838503121561287e57600080fd5b600061288c8582860161265f565b925050602061289d85828601612674565b9150509250929050565b600080604083850312156128ba57600080fd5b60006128c88582860161265f565b92505060206128d985828601612727565b9150509250929050565b6000602082840312156128f557600080fd5b600061290384828501612689565b91505092915050565b60006020828403121561291e57600080fd5b600061292c8482850161269e565b91505092915050565b6000806020838503121561294857600080fd5b600083013567ffffffffffffffff81111561296257600080fd5b61296e858286016126dd565b92509250509250929050565b60006020828403121561298c57600080fd5b600061299a84828501612727565b91505092915050565b6129ac81613004565b82525050565b6129bb81613004565b82525050565b6129ca81613016565b82525050565b6129d981613016565b82525050565b60006129ea82612ea1565b6129f48185612eb7565b9350612a0481856020860161309b565b612a0d81613267565b840191505092915050565b6000612a2382612eac565b612a2d8185612ed3565b9350612a3d81856020860161309b565b612a4681613267565b840191505092915050565b6000612a5c82612eac565b612a668185612ee4565b9350612a7681856020860161309b565b80840191505092915050565b60008154612a8f816130ce565b612a998186612ee4565b94506001821660008114612ab45760018114612ac557612af8565b60ff19831686528186019350612af8565b612ace85612e8c565b60005b83811015612af057815481890152600182019150602081019050612ad1565b838801955050505b50505092915050565b6000612b0e602683612ed3565b9150612b1982613278565b604082019050919050565b6000612b31601283612ed3565b9150612b3c826132c7565b602082019050919050565b6000612b54601683612ed3565b9150612b5f826132f0565b602082019050919050565b6000612b77602083612ed3565b9150612b8282613319565b602082019050919050565b6000612b9a600083612ec8565b9150612ba582613342565b600082019050919050565b6000612bbd601583612ed3565b9150612bc882613345565b602082019050919050565b6000612be0601383612ed3565b9150612beb8261336e565b602082019050919050565b606082016000820151612c0c60008501826129a3565b506020820151612c1f6020850182612c47565b506040820151612c3260408501826129c1565b50505050565b612c418161306e565b82525050565b612c5081613078565b82525050565b6000612c628286612a82565b9150612c6e8285612a51565b9150612c7a8284612a82565b9150819050949350505050565b6000612c9282612b8d565b9150819050919050565b6000602082019050612cb160008301846129b2565b92915050565b6000608082019050612ccc60008301876129b2565b612cd960208301866129b2565b612ce66040830185612c38565b8181036060830152612cf881846129df565b905095945050505050565b6000602082019050612d1860008301846129d0565b92915050565b60006020820190508181036000830152612d388184612a18565b905092915050565b60006020820190508181036000830152612d5981612b01565b9050919050565b60006020820190508181036000830152612d7981612b24565b9050919050565b60006020820190508181036000830152612d9981612b47565b9050919050565b60006020820190508181036000830152612db981612b6a565b9050919050565b60006020820190508181036000830152612dd981612bb0565b9050919050565b60006020820190508181036000830152612df981612bd3565b9050919050565b6000606082019050612e156000830184612bf6565b92915050565b6000602082019050612e306000830184612c38565b92915050565b6000612e40612e51565b9050612e4c8282613100565b919050565b6000604051905090565b600067ffffffffffffffff821115612e7657612e75613238565b5b612e7f82613267565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612efa8261306e565b9150612f058361306e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f3a57612f396131ab565b5b828201905092915050565b6000612f508261306e565b9150612f5b8361306e565b925082612f6b57612f6a6131da565b5b828204905092915050565b6000612f818261306e565b9150612f8c8361306e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fc557612fc46131ab565b5b828202905092915050565b6000612fdb8261306e565b9150612fe68361306e565b925082821015612ff957612ff86131ab565b5b828203905092915050565b600061300f8261304e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156130b957808201518184015260208101905061309e565b838111156130c8576000848401525b50505050565b600060028204905060018216806130e657607f821691505b602082108114156130fa576130f9613209565b5b50919050565b61310982613267565b810181811067ffffffffffffffff8211171561312857613127613238565b5b80604052505050565b600061313c8261306e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561316f5761316e6131ab565b5b600182019050919050565b60006131858261306e565b91506131908361306e565b9250826131a05761319f6131da565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f546f6b656e20646f6573206e6f74206578697374210000000000000000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6133a081613004565b81146133ab57600080fd5b50565b6133b781613016565b81146133c257600080fd5b50565b6133ce81613022565b81146133d957600080fd5b50565b6133e58161306e565b81146133f057600080fd5b5056fea2646970667358221220dad95f763b0a462afd9dfe927ecac3bf8731dfb60b0a40eca9bf6348f6e025a064736f6c63430008040033
Deployed Bytecode Sourcemap
45520:2507:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26972:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30085:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31588:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31151:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26221:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32453:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45565:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47562:462;;;;;;;;;;;;;:::i;:::-;;32694:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29893:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27341:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;45717:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46887:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46698:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30254:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46143:515;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31864:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32950:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45791:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47042:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32222:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47450:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26972:305;27074:4;27126:25;27111:40;;;:11;:40;;;;:105;;;;27183:33;27168:48;;;:11;:48;;;;27111:105;:158;;;;27233:36;27257:11;27233:23;:36::i;:::-;27111:158;27091:178;;26972:305;;;:::o;30085:100::-;30139:13;30172:5;30165:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30085:100;:::o;31588:204::-;31656:7;31681:16;31689:7;31681;:16::i;:::-;31676:64;;31706:34;;;;;;;;;;;;;;31676:64;31760:15;:24;31776:7;31760:24;;;;;;;;;;;;;;;;;;;;;31753:31;;31588:204;;;:::o;31151:371::-;31224:13;31240:24;31256:7;31240:15;:24::i;:::-;31224:40;;31285:5;31279:11;;:2;:11;;;31275:48;;;31299:24;;;;;;;;;;;;;;31275:48;31356:5;31340:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;31366:37;31383:5;31390:12;:10;:12::i;:::-;31366:16;:37::i;:::-;31365:38;31340:63;31336:138;;;31427:35;;;;;;;;;;;;;;31336:138;31486:28;31495:2;31499:7;31508:5;31486:8;:28::i;:::-;31151:371;;;:::o;26221:303::-;26265:7;26490:15;:13;:15::i;:::-;26475:12;;26459:13;;:28;:46;26452:53;;26221:303;:::o;32453:170::-;32587:28;32597:4;32603:2;32607:7;32587:9;:28::i;:::-;32453:170;;;:::o;45565:25::-;;;;:::o;47562:462::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47846:7:::1;47867;:5;:7::i;:::-;47859:21;;47888;47859:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47845:69;;;47929:2;47921:11;;;::::0;::::1;;4370:1;47562:462::o:0;32694:185::-;32832:39;32849:4;32855:2;32859:7;32832:39;;;;;;;;;;;;:16;:39::i;:::-;32694:185;;;:::o;29893:125::-;29957:7;29984:21;29997:7;29984:12;:21::i;:::-;:26;;;29977:33;;29893:125;;;:::o;27341:206::-;27405:7;27446:1;27429:19;;:5;:19;;;27425:60;;;27457:28;;;;;;;;;;;;;;27425:60;27511:12;:19;27524:5;27511:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27503:36;;27496:43;;27341:206;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;45717:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;46887:148::-;46968:21;;:::i;:::-;47008;47021:7;47008:12;:21::i;:::-;47001:28;;46887:148;;;:::o;46698:135::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46811:16:::1;;46796:12;:31;;;;;;;:::i;:::-;;46698:135:::0;;:::o;30254:104::-;30310:13;30343:7;30336:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30254:104;:::o;46143:515::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46340:10:::1;;46311:25;46325:10;46311:13;:25::i;:::-;46300:8;:36;;;;:::i;:::-;:50;;46292:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46420:10;;46408:8;46392:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;46384:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46576:8;46566:7;:18;;;;:::i;:::-;46553:9;:31;;46545:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46619:31;46629:10;46641:8;46619:9;:31::i;:::-;46143:515:::0;:::o;31864:287::-;31975:12;:10;:12::i;:::-;31963:24;;:8;:24;;;31959:54;;;31996:17;;;;;;;;;;;;;;31959:54;32071:8;32026:18;:32;32045:12;:10;:12::i;:::-;32026:32;;;;;;;;;;;;;;;:42;32059:8;32026:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32124:8;32095:48;;32110:12;:10;:12::i;:::-;32095:48;;;32134:8;32095:48;;;;;;:::i;:::-;;;;;;;;31864:287;;:::o;32950:369::-;33117:28;33127:4;33133:2;33137:7;33117:9;:28::i;:::-;33160:15;:2;:13;;;:15::i;:::-;:76;;;;;33180:56;33211:4;33217:2;33221:7;33230:5;33180:30;:56::i;:::-;33179:57;33160:76;33156:156;;;33260:40;;;;;;;;;;;;;;33156:156;32950:369;;;;:::o;45791:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47042:334::-;47128:13;47161:17;47169:8;47161:7;:17::i;:::-;47153:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;47271:12;47296:26;47313:8;47296:16;:26::i;:::-;47335:15;47242:119;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47211:159;;47042:334;;;:::o;32222:164::-;32319:4;32343:18;:25;32362:5;32343:25;;;;;;;;;;;;;;;:35;32369:8;32343:35;;;;;;;;;;;;;;;;;;;;;;;;;32336:42;;32222:164;;;;:::o;47450:104::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47535:11:::1;47522:10;:24;;;;47450:104:::0;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;16863:157::-;16948:4;16987:25;16972:40;;;:11;:40;;;;16965:47;;16863:157;;;:::o;33574:174::-;33631:4;33674:7;33655:15;:13;:15::i;:::-;:26;;:53;;;;;33695:13;;33685:7;:23;33655:53;:85;;;;;33713:11;:20;33725:7;33713:20;;;;;;;;;;;:27;;;;;;;;;;;;33712:28;33655:85;33648:92;;33574:174;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;41731:196::-;41873:2;41846:15;:24;41862:7;41846:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41911:7;41907:2;41891:28;;41900:5;41891:28;;;;;;;;;;;;41731:196;;;:::o;25995:92::-;26051:7;25995:92;:::o;36674:2130::-;36789:35;36827:21;36840:7;36827:12;:21::i;:::-;36789:59;;36887:4;36865:26;;:13;:18;;;:26;;;36861:67;;36900:28;;;;;;;;;;;;;;36861:67;36941:22;36983:4;36967:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;37004:36;37021:4;37027:12;:10;:12::i;:::-;37004:16;:36::i;:::-;36967:73;:126;;;;37081:12;:10;:12::i;:::-;37057:36;;:20;37069:7;37057:11;:20::i;:::-;:36;;;36967:126;36941:153;;37112:17;37107:66;;37138:35;;;;;;;;;;;;;;37107:66;37202:1;37188:16;;:2;:16;;;37184:52;;;37213:23;;;;;;;;;;;;;;37184:52;37249:43;37271:4;37277:2;37281:7;37290:1;37249:21;:43::i;:::-;37357:35;37374:1;37378:7;37387:4;37357:8;:35::i;:::-;37718:1;37688:12;:18;37701:4;37688:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37762:1;37734:12;:16;37747:2;37734:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37780:31;37814:11;:20;37826:7;37814:20;;;;;;;;;;;37780:54;;37865:2;37849:8;:13;;;:18;;;;;;;;;;;;;;;;;;37915:15;37882:8;:23;;;:49;;;;;;;;;;;;;;;;;;38183:19;38215:1;38205:7;:11;38183:33;;38231:31;38265:11;:24;38277:11;38265:24;;;;;;;;;;;38231:58;;38333:1;38308:27;;:8;:13;;;;;;;;;;;;:27;;;38304:384;;;38518:13;;38503:11;:28;38499:174;;38572:4;38556:8;:13;;;:20;;;;;;;;;;;;;;;;;;38625:13;:28;;;38599:8;:23;;;:54;;;;;;;;;;;;;;;;;;38499:174;38304:384;36674:2130;;;38735:7;38731:2;38716:27;;38725:4;38716:27;;;;;;;;;;;;38754:42;38775:4;38781:2;38785:7;38794:1;38754:20;:42::i;:::-;36674:2130;;;;;:::o;28722:1109::-;28784:21;;:::i;:::-;28818:12;28833:7;28818:22;;28901:4;28882:15;:13;:15::i;:::-;:23;;:47;;;;;28916:13;;28909:4;:20;28882:47;28878:886;;;28950:31;28984:11;:17;28996:4;28984:17;;;;;;;;;;;28950:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29025:9;:16;;;29020:729;;29096:1;29070:28;;:9;:14;;;:28;;;29066:101;;29134:9;29127:16;;;;;;29066:101;29469:261;29476:4;29469:261;;;29509:6;;;;;;;;29554:11;:17;29566:4;29554:17;;;;;;;;;;;29542:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29628:1;29602:28;;:9;:14;;;:28;;;29598:109;;29670:9;29663:16;;;;;;29598:109;29469:261;;;29020:729;28878:886;;29792:31;;;;;;;;;;;;;;28722:1109;;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5349:191;;:::o;27629:137::-;27690:7;27725:12;:19;27738:5;27725:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;27717:41;;27710:48;;27629:137;;;:::o;33756:104::-;33825:27;33835:2;33839:8;33825:27;;;;;;;;;;;;:9;:27::i;:::-;33756:104;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;42419:667::-;42582:4;42619:2;42603:36;;;42640:12;:10;:12::i;:::-;42654:4;42660:7;42669:5;42603:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42599:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42854:1;42837:6;:13;:18;42833:235;;;42883:40;;;;;;;;;;;;;;42833:235;43026:6;43020:13;43011:6;43007:2;43003:15;42996:38;42599:480;42732:45;;;42722:55;;;:6;:55;;;;42715:62;;;42419:667;;;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;43734:159::-;;;;;:::o;44552:158::-;;;;;:::o;34223:163::-;34346:32;34352:2;34356:8;34366:5;34373:4;34346:5;:32::i;:::-;34223:163;;;:::o;34645:1775::-;34784:20;34807:13;;34784:36;;34849:1;34835:16;;:2;:16;;;34831:48;;;34860:19;;;;;;;;;;;;;;34831:48;34906:1;34894:8;:13;34890:44;;;34916:18;;;;;;;;;;;;;;34890:44;34947:61;34977:1;34981:2;34985:12;34999:8;34947:21;:61::i;:::-;35320:8;35285:12;:16;35298:2;35285:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35384:8;35344:12;:16;35357:2;35344:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35443:2;35410:11;:25;35422:12;35410:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35510:15;35460:11;:25;35472:12;35460:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;35543:20;35566:12;35543:35;;35593:11;35622:8;35607:12;:23;35593:37;;35651:4;:23;;;;;35659:15;:2;:13;;;:15::i;:::-;35651:23;35647:641;;;35695:314;35751:12;35747:2;35726:38;;35743:1;35726:38;;;;;;;;;;;;35792:69;35831:1;35835:2;35839:14;;;;;;35855:5;35792:30;:69::i;:::-;35787:174;;35897:40;;;;;;;;;;;;;;35787:174;36004:3;35988:12;:19;;35695:314;;36090:12;36073:13;;:29;36069:43;;36104:8;;;36069:43;35647:641;;;36153:120;36209:14;;;;;;36205:2;36184:40;;36201:1;36184:40;;;;;;;;;;;;36268:3;36252:12;:19;;36153:120;;35647:641;36318:12;36302:13;:28;;;;34645:1775;;36352:60;36381:1;36385:2;36389:12;36403:8;36352:20;:60::i;:::-;34645:1775;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1234:352::-;1292:8;1302:6;1352:3;1345:4;1337:6;1333:17;1329:27;1319:2;;1370:1;1367;1360:12;1319:2;1406:6;1393:20;1383:30;;1436:18;1428:6;1425:30;1422:2;;;1468:1;1465;1458:12;1422:2;1505:4;1497:6;1493:17;1481:29;;1559:3;1551:4;1543:6;1539:17;1529:8;1525:32;1522:41;1519:2;;;1576:1;1573;1566:12;1519:2;1309:277;;;;;:::o;1592:139::-;1638:5;1676:6;1663:20;1654:29;;1692:33;1719:5;1692:33;:::i;:::-;1644:87;;;;:::o;1737:262::-;1796:6;1845:2;1833:9;1824:7;1820:23;1816:32;1813:2;;;1861:1;1858;1851:12;1813:2;1904:1;1929:53;1974:7;1965:6;1954:9;1950:22;1929:53;:::i;:::-;1919:63;;1875:117;1803:196;;;;:::o;2005:407::-;2073:6;2081;2130:2;2118:9;2109:7;2105:23;2101:32;2098:2;;;2146:1;2143;2136:12;2098:2;2189:1;2214:53;2259:7;2250:6;2239:9;2235:22;2214:53;:::i;:::-;2204:63;;2160:117;2316:2;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2287:118;2088:324;;;;;:::o;2418:552::-;2495:6;2503;2511;2560:2;2548:9;2539:7;2535:23;2531:32;2528:2;;;2576:1;2573;2566:12;2528:2;2619:1;2644:53;2689:7;2680:6;2669:9;2665:22;2644:53;:::i;:::-;2634:63;;2590:117;2746:2;2772:53;2817:7;2808:6;2797:9;2793:22;2772:53;:::i;:::-;2762:63;;2717:118;2874:2;2900:53;2945:7;2936:6;2925:9;2921:22;2900:53;:::i;:::-;2890:63;;2845:118;2518:452;;;;;:::o;2976:809::-;3071:6;3079;3087;3095;3144:3;3132:9;3123:7;3119:23;3115:33;3112:2;;;3161:1;3158;3151:12;3112:2;3204:1;3229:53;3274:7;3265:6;3254:9;3250:22;3229:53;:::i;:::-;3219:63;;3175:117;3331:2;3357:53;3402:7;3393:6;3382:9;3378:22;3357:53;:::i;:::-;3347:63;;3302:118;3459:2;3485:53;3530:7;3521:6;3510:9;3506:22;3485:53;:::i;:::-;3475:63;;3430:118;3615:2;3604:9;3600:18;3587:32;3646:18;3638:6;3635:30;3632:2;;;3678:1;3675;3668:12;3632:2;3706:62;3760:7;3751:6;3740:9;3736:22;3706:62;:::i;:::-;3696:72;;3558:220;3102:683;;;;;;;:::o;3791:401::-;3856:6;3864;3913:2;3901:9;3892:7;3888:23;3884:32;3881:2;;;3929:1;3926;3919:12;3881:2;3972:1;3997:53;4042:7;4033:6;4022:9;4018:22;3997:53;:::i;:::-;3987:63;;3943:117;4099:2;4125:50;4167:7;4158:6;4147:9;4143:22;4125:50;:::i;:::-;4115:60;;4070:115;3871:321;;;;;:::o;4198:407::-;4266:6;4274;4323:2;4311:9;4302:7;4298:23;4294:32;4291:2;;;4339:1;4336;4329:12;4291:2;4382:1;4407:53;4452:7;4443:6;4432:9;4428:22;4407:53;:::i;:::-;4397:63;;4353:117;4509:2;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4480:118;4281:324;;;;;:::o;4611:260::-;4669:6;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4777:1;4802:52;4846:7;4837:6;4826:9;4822:22;4802:52;:::i;:::-;4792:62;;4748:116;4676:195;;;;:::o;4877:282::-;4946:6;4995:2;4983:9;4974:7;4970:23;4966:32;4963:2;;;5011:1;5008;5001:12;4963:2;5054:1;5079:63;5134:7;5125:6;5114:9;5110:22;5079:63;:::i;:::-;5069:73;;5025:127;4953:206;;;;:::o;5165:395::-;5236:6;5244;5293:2;5281:9;5272:7;5268:23;5264:32;5261:2;;;5309:1;5306;5299:12;5261:2;5380:1;5369:9;5365:17;5352:31;5410:18;5402:6;5399:30;5396:2;;;5442:1;5439;5432:12;5396:2;5478:65;5535:7;5526:6;5515:9;5511:22;5478:65;:::i;:::-;5460:83;;;;5323:230;5251:309;;;;;:::o;5566:262::-;5625:6;5674:2;5662:9;5653:7;5649:23;5645:32;5642:2;;;5690:1;5687;5680:12;5642:2;5733:1;5758:53;5803:7;5794:6;5783:9;5779:22;5758:53;:::i;:::-;5748:63;;5704:117;5632:196;;;;:::o;5834:108::-;5911:24;5929:5;5911:24;:::i;:::-;5906:3;5899:37;5889:53;;:::o;5948:118::-;6035:24;6053:5;6035:24;:::i;:::-;6030:3;6023:37;6013:53;;:::o;6072:99::-;6143:21;6158:5;6143:21;:::i;:::-;6138:3;6131:34;6121:50;;:::o;6177:109::-;6258:21;6273:5;6258:21;:::i;:::-;6253:3;6246:34;6236:50;;:::o;6292:360::-;6378:3;6406:38;6438:5;6406:38;:::i;:::-;6460:70;6523:6;6518:3;6460:70;:::i;:::-;6453:77;;6539:52;6584:6;6579:3;6572:4;6565:5;6561:16;6539:52;:::i;:::-;6616:29;6638:6;6616:29;:::i;:::-;6611:3;6607:39;6600:46;;6382:270;;;;;:::o;6658:364::-;6746:3;6774:39;6807:5;6774:39;:::i;:::-;6829:71;6893:6;6888:3;6829:71;:::i;:::-;6822:78;;6909:52;6954:6;6949:3;6942:4;6935:5;6931:16;6909:52;:::i;:::-;6986:29;7008:6;6986:29;:::i;:::-;6981:3;6977:39;6970:46;;6750:272;;;;;:::o;7028:377::-;7134:3;7162:39;7195:5;7162:39;:::i;:::-;7217:89;7299:6;7294:3;7217:89;:::i;:::-;7210:96;;7315:52;7360:6;7355:3;7348:4;7341:5;7337:16;7315:52;:::i;:::-;7392:6;7387:3;7383:16;7376:23;;7138:267;;;;;:::o;7435:845::-;7538:3;7575:5;7569:12;7604:36;7630:9;7604:36;:::i;:::-;7656:89;7738:6;7733:3;7656:89;:::i;:::-;7649:96;;7776:1;7765:9;7761:17;7792:1;7787:137;;;;7938:1;7933:341;;;;7754:520;;7787:137;7871:4;7867:9;7856;7852:25;7847:3;7840:38;7907:6;7902:3;7898:16;7891:23;;7787:137;;7933:341;8000:38;8032:5;8000:38;:::i;:::-;8060:1;8074:154;8088:6;8085:1;8082:13;8074:154;;;8162:7;8156:14;8152:1;8147:3;8143:11;8136:35;8212:1;8203:7;8199:15;8188:26;;8110:4;8107:1;8103:12;8098:17;;8074:154;;;8257:6;8252:3;8248:16;8241:23;;7940:334;;7754:520;;7542:738;;;;;;:::o;8286:366::-;8428:3;8449:67;8513:2;8508:3;8449:67;:::i;:::-;8442:74;;8525:93;8614:3;8525:93;:::i;:::-;8643:2;8638:3;8634:12;8627:19;;8432:220;;;:::o;8658:366::-;8800:3;8821:67;8885:2;8880:3;8821:67;:::i;:::-;8814:74;;8897:93;8986:3;8897:93;:::i;:::-;9015:2;9010:3;9006:12;8999:19;;8804:220;;;:::o;9030:366::-;9172:3;9193:67;9257:2;9252:3;9193:67;:::i;:::-;9186:74;;9269:93;9358:3;9269:93;:::i;:::-;9387:2;9382:3;9378:12;9371:19;;9176:220;;;:::o;9402:366::-;9544:3;9565:67;9629:2;9624:3;9565:67;:::i;:::-;9558:74;;9641:93;9730:3;9641:93;:::i;:::-;9759:2;9754:3;9750:12;9743:19;;9548:220;;;:::o;9774:398::-;9933:3;9954:83;10035:1;10030:3;9954:83;:::i;:::-;9947:90;;10046:93;10135:3;10046:93;:::i;:::-;10164:1;10159:3;10155:11;10148:18;;9937:235;;;:::o;10178:366::-;10320:3;10341:67;10405:2;10400:3;10341:67;:::i;:::-;10334:74;;10417:93;10506:3;10417:93;:::i;:::-;10535:2;10530:3;10526:12;10519:19;;10324:220;;;:::o;10550:366::-;10692:3;10713:67;10777:2;10772:3;10713:67;:::i;:::-;10706:74;;10789:93;10878:3;10789:93;:::i;:::-;10907:2;10902:3;10898:12;10891:19;;10696:220;;;:::o;10992:697::-;11151:4;11146:3;11142:14;11238:4;11231:5;11227:16;11221:23;11257:63;11314:4;11309:3;11305:14;11291:12;11257:63;:::i;:::-;11166:164;11422:4;11415:5;11411:16;11405:23;11441:61;11496:4;11491:3;11487:14;11473:12;11441:61;:::i;:::-;11340:172;11596:4;11589:5;11585:16;11579:23;11615:57;11666:4;11661:3;11657:14;11643:12;11615:57;:::i;:::-;11522:160;11120:569;;;:::o;11695:118::-;11782:24;11800:5;11782:24;:::i;:::-;11777:3;11770:37;11760:53;;:::o;11819:105::-;11894:23;11911:5;11894:23;:::i;:::-;11889:3;11882:36;11872:52;;:::o;11930:583::-;12152:3;12174:92;12262:3;12253:6;12174:92;:::i;:::-;12167:99;;12283:95;12374:3;12365:6;12283:95;:::i;:::-;12276:102;;12395:92;12483:3;12474:6;12395:92;:::i;:::-;12388:99;;12504:3;12497:10;;12156:357;;;;;;:::o;12519:379::-;12703:3;12725:147;12868:3;12725:147;:::i;:::-;12718:154;;12889:3;12882:10;;12707:191;;;:::o;12904:222::-;12997:4;13035:2;13024:9;13020:18;13012:26;;13048:71;13116:1;13105:9;13101:17;13092:6;13048:71;:::i;:::-;13002:124;;;;:::o;13132:640::-;13327:4;13365:3;13354:9;13350:19;13342:27;;13379:71;13447:1;13436:9;13432:17;13423:6;13379:71;:::i;:::-;13460:72;13528:2;13517:9;13513:18;13504:6;13460:72;:::i;:::-;13542;13610:2;13599:9;13595:18;13586:6;13542:72;:::i;:::-;13661:9;13655:4;13651:20;13646:2;13635:9;13631:18;13624:48;13689:76;13760:4;13751:6;13689:76;:::i;:::-;13681:84;;13332:440;;;;;;;:::o;13778:210::-;13865:4;13903:2;13892:9;13888:18;13880:26;;13916:65;13978:1;13967:9;13963:17;13954:6;13916:65;:::i;:::-;13870:118;;;;:::o;13994:313::-;14107:4;14145:2;14134:9;14130:18;14122:26;;14194:9;14188:4;14184:20;14180:1;14169:9;14165:17;14158:47;14222:78;14295:4;14286:6;14222:78;:::i;:::-;14214:86;;14112:195;;;;:::o;14313:419::-;14479:4;14517:2;14506:9;14502:18;14494:26;;14566:9;14560:4;14556:20;14552:1;14541:9;14537:17;14530:47;14594:131;14720:4;14594:131;:::i;:::-;14586:139;;14484:248;;;:::o;14738:419::-;14904:4;14942:2;14931:9;14927:18;14919:26;;14991:9;14985:4;14981:20;14977:1;14966:9;14962:17;14955:47;15019:131;15145:4;15019:131;:::i;:::-;15011:139;;14909:248;;;:::o;15163:419::-;15329:4;15367:2;15356:9;15352:18;15344:26;;15416:9;15410:4;15406:20;15402:1;15391:9;15387:17;15380:47;15444:131;15570:4;15444:131;:::i;:::-;15436:139;;15334:248;;;:::o;15588:419::-;15754:4;15792:2;15781:9;15777:18;15769:26;;15841:9;15835:4;15831:20;15827:1;15816:9;15812:17;15805:47;15869:131;15995:4;15869:131;:::i;:::-;15861:139;;15759:248;;;:::o;16013:419::-;16179:4;16217:2;16206:9;16202:18;16194:26;;16266:9;16260:4;16256:20;16252:1;16241:9;16237:17;16230:47;16294:131;16420:4;16294:131;:::i;:::-;16286:139;;16184:248;;;:::o;16438:419::-;16604:4;16642:2;16631:9;16627:18;16619:26;;16691:9;16685:4;16681:20;16677:1;16666:9;16662:17;16655:47;16719:131;16845:4;16719:131;:::i;:::-;16711:139;;16609:248;;;:::o;16863:346::-;17018:4;17056:2;17045:9;17041:18;17033:26;;17069:133;17199:1;17188:9;17184:17;17175:6;17069:133;:::i;:::-;17023:186;;;;:::o;17215:222::-;17308:4;17346:2;17335:9;17331:18;17323:26;;17359:71;17427:1;17416:9;17412:17;17403:6;17359:71;:::i;:::-;17313:124;;;;:::o;17443:129::-;17477:6;17504:20;;:::i;:::-;17494:30;;17533:33;17561:4;17553:6;17533:33;:::i;:::-;17484:88;;;:::o;17578:75::-;17611:6;17644:2;17638:9;17628:19;;17618:35;:::o;17659:307::-;17720:4;17810:18;17802:6;17799:30;17796:2;;;17832:18;;:::i;:::-;17796:2;17870:29;17892:6;17870:29;:::i;:::-;17862:37;;17954:4;17948;17944:15;17936:23;;17725:241;;;:::o;17972:141::-;18021:4;18044:3;18036:11;;18067:3;18064:1;18057:14;18101:4;18098:1;18088:18;18080:26;;18026:87;;;:::o;18119:98::-;18170:6;18204:5;18198:12;18188:22;;18177:40;;;:::o;18223:99::-;18275:6;18309:5;18303:12;18293:22;;18282:40;;;:::o;18328:168::-;18411:11;18445:6;18440:3;18433:19;18485:4;18480:3;18476:14;18461:29;;18423:73;;;;:::o;18502:147::-;18603:11;18640:3;18625:18;;18615:34;;;;:::o;18655:169::-;18739:11;18773:6;18768:3;18761:19;18813:4;18808:3;18804:14;18789:29;;18751:73;;;;:::o;18830:148::-;18932:11;18969:3;18954:18;;18944:34;;;;:::o;18984:305::-;19024:3;19043:20;19061:1;19043:20;:::i;:::-;19038:25;;19077:20;19095:1;19077:20;:::i;:::-;19072:25;;19231:1;19163:66;19159:74;19156:1;19153:81;19150:2;;;19237:18;;:::i;:::-;19150:2;19281:1;19278;19274:9;19267:16;;19028:261;;;;:::o;19295:185::-;19335:1;19352:20;19370:1;19352:20;:::i;:::-;19347:25;;19386:20;19404:1;19386:20;:::i;:::-;19381:25;;19425:1;19415:2;;19430:18;;:::i;:::-;19415:2;19472:1;19469;19465:9;19460:14;;19337:143;;;;:::o;19486:348::-;19526:7;19549:20;19567:1;19549:20;:::i;:::-;19544:25;;19583:20;19601:1;19583:20;:::i;:::-;19578:25;;19771:1;19703:66;19699:74;19696:1;19693:81;19688:1;19681:9;19674:17;19670:105;19667:2;;;19778:18;;:::i;:::-;19667:2;19826:1;19823;19819:9;19808:20;;19534:300;;;;:::o;19840:191::-;19880:4;19900:20;19918:1;19900:20;:::i;:::-;19895:25;;19934:20;19952:1;19934:20;:::i;:::-;19929:25;;19973:1;19970;19967:8;19964:2;;;19978:18;;:::i;:::-;19964:2;20023:1;20020;20016:9;20008:17;;19885:146;;;;:::o;20037:96::-;20074:7;20103:24;20121:5;20103:24;:::i;:::-;20092:35;;20082:51;;;:::o;20139:90::-;20173:7;20216:5;20209:13;20202:21;20191:32;;20181:48;;;:::o;20235:149::-;20271:7;20311:66;20304:5;20300:78;20289:89;;20279:105;;;:::o;20390:126::-;20427:7;20467:42;20460:5;20456:54;20445:65;;20435:81;;;:::o;20522:77::-;20559:7;20588:5;20577:16;;20567:32;;;:::o;20605:101::-;20641:7;20681:18;20674:5;20670:30;20659:41;;20649:57;;;:::o;20712:154::-;20796:6;20791:3;20786;20773:30;20858:1;20849:6;20844:3;20840:16;20833:27;20763:103;;;:::o;20872:307::-;20940:1;20950:113;20964:6;20961:1;20958:13;20950:113;;;21049:1;21044:3;21040:11;21034:18;21030:1;21025:3;21021:11;21014:39;20986:2;20983:1;20979:10;20974:15;;20950:113;;;21081:6;21078:1;21075:13;21072:2;;;21161:1;21152:6;21147:3;21143:16;21136:27;21072:2;20921:258;;;;:::o;21185:320::-;21229:6;21266:1;21260:4;21256:12;21246:22;;21313:1;21307:4;21303:12;21334:18;21324:2;;21390:4;21382:6;21378:17;21368:27;;21324:2;21452;21444:6;21441:14;21421:18;21418:38;21415:2;;;21471:18;;:::i;:::-;21415:2;21236:269;;;;:::o;21511:281::-;21594:27;21616:4;21594:27;:::i;:::-;21586:6;21582:40;21724:6;21712:10;21709:22;21688:18;21676:10;21673:34;21670:62;21667:2;;;21735:18;;:::i;:::-;21667:2;21775:10;21771:2;21764:22;21554:238;;;:::o;21798:233::-;21837:3;21860:24;21878:5;21860:24;:::i;:::-;21851:33;;21906:66;21899:5;21896:77;21893:2;;;21976:18;;:::i;:::-;21893:2;22023:1;22016:5;22012:13;22005:20;;21841:190;;;:::o;22037:176::-;22069:1;22086:20;22104:1;22086:20;:::i;:::-;22081:25;;22120:20;22138:1;22120:20;:::i;:::-;22115:25;;22159:1;22149:2;;22164:18;;:::i;:::-;22149:2;22205:1;22202;22198:9;22193:14;;22071:142;;;;:::o;22219:180::-;22267:77;22264:1;22257:88;22364:4;22361:1;22354:15;22388:4;22385:1;22378:15;22405:180;22453:77;22450:1;22443:88;22550:4;22547:1;22540:15;22574:4;22571:1;22564:15;22591:180;22639:77;22636:1;22629:88;22736:4;22733:1;22726:15;22760:4;22757:1;22750:15;22777:180;22825:77;22822:1;22815:88;22922:4;22919:1;22912:15;22946:4;22943:1;22936:15;22963:102;23004:6;23055:2;23051:7;23046:2;23039:5;23035:14;23031:28;23021:38;;23011:54;;;:::o;23071:225::-;23211:34;23207:1;23199:6;23195:14;23188:58;23280:8;23275:2;23267:6;23263:15;23256:33;23177:119;:::o;23302:168::-;23442:20;23438:1;23430:6;23426:14;23419:44;23408:62;:::o;23476:172::-;23616:24;23612:1;23604:6;23600:14;23593:48;23582:66;:::o;23654:182::-;23794:34;23790:1;23782:6;23778:14;23771:58;23760:76;:::o;23842:114::-;23948:8;:::o;23962:171::-;24102:23;24098:1;24090:6;24086:14;24079:47;24068:65;:::o;24139:169::-;24279:21;24275:1;24267:6;24263:14;24256:45;24245:63;:::o;24314:122::-;24387:24;24405:5;24387:24;:::i;:::-;24380:5;24377:35;24367:2;;24426:1;24423;24416:12;24367:2;24357:79;:::o;24442:116::-;24512:21;24527:5;24512:21;:::i;:::-;24505:5;24502:32;24492:2;;24548:1;24545;24538:12;24492:2;24482:76;:::o;24564:120::-;24636:23;24653:5;24636:23;:::i;:::-;24629:5;24626:34;24616:2;;24674:1;24671;24664:12;24616:2;24606:78;:::o;24690:122::-;24763:24;24781:5;24763:24;:::i;:::-;24756:5;24753:35;24743:2;;24802:1;24799;24792:12;24743:2;24733:79;:::o
Swarm Source
ipfs://dad95f763b0a462afd9dfe927ecac3bf8731dfb60b0a40eca9bf6348f6e025a0
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.