More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 464 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 24023334 | 84 days ago | IN | 0 ETH | 0.00001511 | ||||
| Safe Transfer Fr... | 23518119 | 155 days ago | IN | 0 ETH | 0.00002617 | ||||
| Safe Transfer Fr... | 23518117 | 155 days ago | IN | 0 ETH | 0.00003992 | ||||
| Set Approval For... | 19018147 | 784 days ago | IN | 0 ETH | 0.00109574 | ||||
| Set Approval For... | 18616175 | 840 days ago | IN | 0 ETH | 0.0014823 | ||||
| Set Approval For... | 17692043 | 970 days ago | IN | 0 ETH | 0.00127473 | ||||
| Set Approval For... | 17670584 | 973 days ago | IN | 0 ETH | 0.00149866 | ||||
| Set Approval For... | 17660591 | 974 days ago | IN | 0 ETH | 0.0007439 | ||||
| Set Approval For... | 17612476 | 981 days ago | IN | 0 ETH | 0.00096758 | ||||
| Set Approval For... | 17611492 | 981 days ago | IN | 0 ETH | 0.00062347 | ||||
| Set Approval For... | 17610433 | 981 days ago | IN | 0 ETH | 0.00061288 | ||||
| Set Approval For... | 17610427 | 981 days ago | IN | 0 ETH | 0.00063487 | ||||
| Set Approval For... | 17610408 | 981 days ago | IN | 0 ETH | 0.00034159 | ||||
| Set Approval For... | 17610402 | 981 days ago | IN | 0 ETH | 0.00043049 | ||||
| Set Approval For... | 17610401 | 981 days ago | IN | 0 ETH | 0.00039119 | ||||
| Set Approval For... | 17608133 | 982 days ago | IN | 0 ETH | 0.00060819 | ||||
| Set Approval For... | 17608060 | 982 days ago | IN | 0 ETH | 0.0006246 | ||||
| Set Approval For... | 17608048 | 982 days ago | IN | 0 ETH | 0.00071085 | ||||
| Set Approval For... | 17608035 | 982 days ago | IN | 0 ETH | 0.00066752 | ||||
| Set Approval For... | 17608019 | 982 days ago | IN | 0 ETH | 0.00060537 | ||||
| Set Approval For... | 17608009 | 982 days ago | IN | 0 ETH | 0.00064931 | ||||
| Set Approval For... | 17607914 | 982 days ago | IN | 0 ETH | 0.00062902 | ||||
| Set Approval For... | 17607899 | 982 days ago | IN | 0 ETH | 0.00064896 | ||||
| Set Approval For... | 17607853 | 982 days ago | IN | 0 ETH | 0.00069144 | ||||
| Set Approval For... | 17607843 | 982 days ago | IN | 0 ETH | 0.00068311 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 17471425 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471422 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471416 | 1001 days ago | 0.45 ETH | ||||
| Transfer | 17471412 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471409 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471405 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471402 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471395 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471392 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471388 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471385 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471381 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471376 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471371 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471370 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471370 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471370 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471369 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471369 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471369 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471368 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471367 | 1001 days ago | 0.25 ETH | ||||
| Transfer | 17471367 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471366 | 1001 days ago | 0.35 ETH | ||||
| Transfer | 17471366 | 1001 days ago | 0.35 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PowerMan
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-06-13
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
/**
* @dev Interface of ERC721A.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the
* ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
// =============================================================
// STRUCTS
// =============================================================
struct TokenOwnership {
// The address of the owner.
address addr;
// Stores the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
uint24 extraData;
}
// =============================================================
// TOKEN COUNTERS
// =============================================================
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() external view returns (uint256);
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// =============================================================
// IERC721
// =============================================================
/**
* @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,
bytes calldata data
) external payable;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @dev Transfers `tokenId` 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 payable;
/**
* @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 payable;
/**
* @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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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);
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @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);
// =============================================================
// IERC2309
// =============================================================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId`
* (inclusive) is transferred from `from` to `to`, as defined in the
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
*
* See {_mintERC2309} for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC721A
*
* @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
* Non-Fungible Token Standard, including the Metadata extension.
* Optimized for lower gas during batch mints.
*
* Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
* starting from `_startTokenId()`.
*
* Assumptions:
*
* - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
* - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
struct TokenApprovalRef {
address value;
}
// =============================================================
// CONSTANTS
// =============================================================
// Mask of an entry in packed address data.
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
// The bit position of `numberMinted` in packed address data.
uint256 private constant _BITPOS_NUMBER_MINTED = 64;
// The bit position of `numberBurned` in packed address data.
uint256 private constant _BITPOS_NUMBER_BURNED = 128;
// The bit position of `aux` in packed address data.
uint256 private constant _BITPOS_AUX = 192;
// Mask of all 256 bits in packed address data except the 64 bits for `aux`.
uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
// The bit position of `startTimestamp` in packed ownership.
uint256 private constant _BITPOS_START_TIMESTAMP = 160;
// The bit mask of the `burned` bit in packed ownership.
uint256 private constant _BITMASK_BURNED = 1 << 224;
// The bit position of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
// The bit mask of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
// The bit position of `extraData` in packed ownership.
uint256 private constant _BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with {_mintERC2309}.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
// is required to cause an overflow, which is unrealistic.
uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The `Transfer` event signature is given by:
// `keccak256(bytes("Transfer(address,address,uint256)"))`.
bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
// =============================================================
// STORAGE
// =============================================================
// The next token ID to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _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 {_packedOwnershipOf} implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [232..255] `extraData`
mapping(uint256 => uint256) private _packedOwnerships;
// Mapping owner address to address data.
//
// Bits Layout:
// - [0..63] `balance`
// - [64..127] `numberMinted`
// - [128..191] `numberBurned`
// - [192..255] `aux`
mapping(address => uint256) private _packedAddressData;
// Mapping from token ID to approved address.
mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// =============================================================
// CONSTRUCTOR
// =============================================================
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
// =============================================================
// TOKEN COUNTING OPERATIONS
// =============================================================
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view virtual returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() public view virtual override returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than `_currentIndex - _startTokenId()` times.
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view virtual returns (uint256) {
// Counter underflow is impossible as `_currentIndex` does not decrement,
// and it is initialized to `_startTokenId()`.
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev Returns the total number of tokens burned.
*/
function _totalBurned() internal view virtual returns (uint256) {
return _burnCounter;
}
// =============================================================
// ADDRESS DATA OPERATIONS
// =============================================================
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
}
/**
* Sets the auxiliary 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 virtual {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
_packedAddressData[owner] = packed;
}
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes
// of the XOR of all function selectors in the interface.
// See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
// (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the token collection symbol.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
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, _toString(tokenId))) : '';
}
/**
* @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, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
// =============================================================
// OWNERSHIPS OPERATIONS
// =============================================================
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around over time.
*/
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal virtual {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr)
if (curr < _currentIndex) {
uint256 packed = _packedOwnerships[curr];
// If not burned.
if (packed & _BITMASK_BURNED == 0) {
// Invariant:
// There will always be an initialized ownership slot
// (i.e. `ownership.addr != address(0) && ownership.burned == false`)
// before an unintialized ownership slot
// (i.e. `ownership.addr == address(0) && ownership.burned == false`)
// Hence, `curr` will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed will be zero.
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
ownership.burned = packed & _BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @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) public payable virtual override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId].value;
}
/**
* @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) public virtual override {
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @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. See {_mint}.
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
*/
function _isSenderApprovedOrOwner(
address approvedAddress,
address owner,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, _BITMASK_ADDRESS)
// `msgSender == owner || msgSender == approvedAddress`.
result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
}
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
// =============================================================
// TRANSFER OPERATIONS
// =============================================================
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* 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
) public payable virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// 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 {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @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 memory _data
) public payable virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @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 {}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* `from` - Previous owner of the given token ID.
* `to` - Target address that will receive the token.
* `tokenId` - Token ID to be transferred.
* `_data` - Optional data to send along with the call.
*
* Returns whether the call correctly returned the expected magic value.
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
// =============================================================
// MINT OPERATIONS
// =============================================================
/**
* @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 for each mint.
*/
function _mint(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 toMasked;
uint256 end = startTokenId + quantity;
// Use assembly to loop and emit the `Transfer` event for gas savings.
// The duplicated `log4` removes an extra check and reduces stack juggling.
// The assembly, together with the surrounding Solidity code, have been
// delicately arranged to nudge the compiler into producing optimized opcodes.
assembly {
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
toMasked := and(to, _BITMASK_ADDRESS)
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
0, // `address(0)`.
toMasked, // `to`.
startTokenId // `tokenId`.
)
// The `iszero(eq(,))` check ensures that large values of `quantity`
// that overflows uint256 will make the loop run out of gas.
// The compiler will optimize the `iszero` away for performance.
for {
let tokenId := add(startTokenId, 1)
} iszero(eq(tokenId, end)) {
tokenId := add(tokenId, 1)
} {
// Emit the `Transfer` event. Similar to above.
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
}
}
if (toMasked == 0) revert MintToZeroAddress();
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, 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.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal virtual {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
// =============================================================
// BURN OPERATIONS
// =============================================================
/**
* @dev 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 {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// 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 {
// Updates:
// - `balance -= 1`.
// - `numberBurned += 1`.
//
// We can directly decrement the balance, and increment the number burned.
// This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
_packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
// Updates:
// - `address` to the last owner.
// - `startTimestamp` to the timestamp of burning.
// - `burned` to `true`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
// =============================================================
// EXTRA DATA OPERATIONS
// =============================================================
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* 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 _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}
// =============================================================
// OTHER OPERATIONS
// =============================================================
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a uint256 to its ASCII string decimal representation.
*/
function _toString(uint256 value) internal pure virtual returns (string memory str) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit), but
// we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
// We will need 1 word for the trailing zeros padding, 1 word for the length,
// and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
let m := add(mload(0x40), 0xa0)
// Update the free memory pointer to allocate.
mstore(0x40, m)
// Assign the `str` to the end.
str := sub(m, 0x20)
// Zeroize the slot after the string.
mstore(str, 0)
// Cache the end of the memory to calculate the length later.
let end := str
// We write the string from rightmost digit to leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// prettier-ignore
for { let temp := value } 1 {} {
str := sub(str, 1)
// Write the character to the pointer.
// The ASCII index of the '0' character is 48.
mstore8(str, add(48, mod(temp, 10)))
// Keep dividing `temp` until zero.
temp := div(temp, 10)
// prettier-ignore
if iszero(temp) { break }
}
let length := sub(end, str)
// Move the pointer 32 bytes leftwards to make room for the length.
str := sub(str, 0x20)
// Store the length.
mstore(str, length)
}
}
}
/**
* @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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @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;
}
}
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @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);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
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 Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
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);
}
}
// White list contract
contract Whitelist is Ownable{
constructor() {}
// white list wallets
mapping(address => uint256) public whitelistWallets;
// add wallets to white list
function addWhitelist(address[] calldata receivers) external onlyOwner {
for (uint256 i = 0; i < receivers.length; i++) {
whitelistWallets[receivers[i]] = 1;
}
}
// is a wallet in whitelist
function isInWhitelist(address wallet) public view returns(bool){
return whitelistWallets[wallet] == 1;
}
}
contract PowerMan is ERC721A, Whitelist {
using Strings for uint256;
uint256 public constant MAX_SUPPLY = 2000;
//
string private _tokenBaseURI;
uint256 public price = 0.05 ether;
uint256 public count;
uint256 public startTime;
uint256 public endTime;
uint256 public saleTime = 24 hours;
//
uint256 public teamCount;
uint256 public tokenId;
mapping (address=>uint) public userInfo;
constructor() ERC721A("Power Man", "Power Man") {}
function launch() public onlyOwner(){
require(startTime == 0, "already started!");
startTime = block.timestamp;
endTime = startTime + saleTime;
}
//
function mint(uint256 _amount)
public
payable
callerIsUser
{
require(block.timestamp>=startTime && block.timestamp<=endTime , "not sale time!");
require(_amount > 0 && userInfo[msg.sender] + _amount <= 15,"Exceed sales max limit!");
require(_amount+count <= MAX_SUPPLY,"Maximum count exceeded!");
require(isInWhitelist(msg.sender),"Not in whitelist yet!");
uint256 cost = price * _amount;
require(cost == msg.value,"invalid value!");
safeTransfer(owner(),msg.value);
count = count + _amount;
userInfo[msg.sender] = userInfo[msg.sender] + _amount;
// safe mint for every NFT
_mint(msg.sender, _amount);
}
function burn(uint256 _tokenId) public {
_burn(_tokenId);
}
function safeTransfer(address to, uint value) internal {
(bool success,) = to.call{value:value}(new bytes(0));
require(success, 'Transfer: ETH_TRANSFER_FAILED');
}
function setPrice(uint256 _price) public onlyOwner{
require(price > 0,"Invalid price!");
price = _price;
}
function setBaseURI(string calldata URI) external onlyOwner {
_tokenBaseURI = URI;
}
function _baseURI()
internal
view
override(ERC721A)
returns (string memory)
{
return _tokenBaseURI;
}
function _startTokenId() internal view virtual override returns (uint256) {
return 1;
}
//
modifier callerIsUser() {
require(tx.origin == msg.sender, "not user!");
_;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"receivers","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"address","name":"wallet","type":"address"}],"name":"isInWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[],"name":"saleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"teamCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistWallets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405266b1a2bc2ec50000600b5562015180600f553480156200002357600080fd5b506040518060400160405280600981526020017f506f776572204d616e00000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f506f776572204d616e00000000000000000000000000000000000000000000008152508160029080519060200190620000a8929190620001d7565b508060039080519060200190620000c1929190620001d7565b50620000d26200010060201b60201c565b6000819055505050620000fa620000ee6200010960201b60201c565b6200011160201b60201c565b620002ec565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e59062000287565b90600052602060002090601f01602090048101928262000209576000855562000255565b82601f106200022457805160ff191683800117855562000255565b8280016001018555821562000255579182015b828111156200025457825182559160200191906001019062000237565b5b50905062000264919062000268565b5090565b5b808211156200028357600081600090555060010162000269565b5090565b60006002820490506001821680620002a057607f821691505b60208210811415620002b757620002b6620002bd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6132a980620002fc6000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063a035b1fe116100a0578063c87b56dd1161006f578063c87b56dd146106ce578063e985e9c51461070b578063edac985b14610748578063f2fde38b14610771578063f7e78e9d1461079a576101f9565b8063a035b1fe14610642578063a0712d681461066d578063a22cb46514610689578063b88d4fde146106b2576101f9565b80638caa0083116100dc5780638caa0083146105985780638da5cb5b146105c357806391b7f5ed146105ee57806395d89b4114610617576101f9565b80636352211e146104dc57806370a0823114610519578063715018a61461055657806378e979251461056d576101f9565b806317d70f7c116101905780633197cbb61161015f5780633197cbb61461041857806332cb6b0c1461044357806342842e0e1461046e57806342966c681461048a57806355f804b3146104b3576101f9565b806317d70f7c1461036957806318160ddd146103945780631959a002146103bf57806323b872dd146103fc576101f9565b8063081812fc116101cc578063081812fc146102a8578063095ea7b3146102e557806309fd8212146103015780631596facb1461033e576101f9565b806301339c21146101fe57806301ffc9a71461021557806306661abd1461025257806306fdde031461027d575b600080fd5b34801561020a57600080fd5b506102136107d7565b005b34801561022157600080fd5b5061023c6004803603810190610237919061273e565b610843565b6040516102499190612b22565b60405180910390f35b34801561025e57600080fd5b506102676108d5565b6040516102749190612cbf565b60405180910390f35b34801561028957600080fd5b506102926108db565b60405161029f9190612b3d565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca91906127d5565b61096d565b6040516102dc9190612abb565b60405180910390f35b6102ff60048036038101906102fa91906126bd565b6109ec565b005b34801561030d57600080fd5b5061032860048036038101906103239190612552565b610b30565b6040516103359190612b22565b60405180910390f35b34801561034a57600080fd5b50610353610b7c565b6040516103609190612cbf565b60405180910390f35b34801561037557600080fd5b5061037e610b82565b60405161038b9190612cbf565b60405180910390f35b3480156103a057600080fd5b506103a9610b88565b6040516103b69190612cbf565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190612552565b610b9f565b6040516103f39190612cbf565b60405180910390f35b610416600480360381019061041191906125b7565b610bb7565b005b34801561042457600080fd5b5061042d610edc565b60405161043a9190612cbf565b60405180910390f35b34801561044f57600080fd5b50610458610ee2565b6040516104659190612cbf565b60405180910390f35b610488600480360381019061048391906125b7565b610ee8565b005b34801561049657600080fd5b506104b160048036038101906104ac91906127d5565b610f08565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612790565b610f14565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906127d5565b610f32565b6040516105109190612abb565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190612552565b610f44565b60405161054d9190612cbf565b60405180910390f35b34801561056257600080fd5b5061056b610ffd565b005b34801561057957600080fd5b50610582611011565b60405161058f9190612cbf565b60405180910390f35b3480156105a457600080fd5b506105ad611017565b6040516105ba9190612cbf565b60405180910390f35b3480156105cf57600080fd5b506105d861101d565b6040516105e59190612abb565b60405180910390f35b3480156105fa57600080fd5b50610615600480360381019061061091906127d5565b611047565b005b34801561062357600080fd5b5061062c61109e565b6040516106399190612b3d565b60405180910390f35b34801561064e57600080fd5b50610657611130565b6040516106649190612cbf565b60405180910390f35b610687600480360381019061068291906127d5565b611136565b005b34801561069557600080fd5b506106b060048036038101906106ab9190612681565b611440565b005b6106cc60048036038101906106c79190612606565b61154b565b005b3480156106da57600080fd5b506106f560048036038101906106f091906127d5565b6115be565b6040516107029190612b3d565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d919061257b565b61165d565b60405161073f9190612b22565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a91906126f9565b6116f1565b005b34801561077d57600080fd5b5061079860048036038101906107939190612552565b6117b1565b005b3480156107a657600080fd5b506107c160048036038101906107bc9190612552565b611835565b6040516107ce9190612cbf565b60405180910390f35b6107df61184d565b6000600d5414610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b90612bbf565b60405180910390fd5b42600d81905550600f54600d5461083b9190612d7e565b600e81905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ce5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600c5481565b6060600280546108ea90612ee4565b80601f016020809104026020016040519081016040528092919081815260200182805461091690612ee4565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050905090565b6000610978826118cb565b6109ae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f782610f32565b90508073ffffffffffffffffffffffffffffffffffffffff16610a1861192a565b73ffffffffffffffffffffffffffffffffffffffff1614610a7b57610a4481610a3f61192a565b61165d565b610a7a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054149050919050565b600f5481565b60115481565b6000610b92611932565b6001546000540303905090565b60126020528060005260406000206000915090505481565b6000610bc28261193b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c29576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c3584611a09565b91509150610c4b8187610c4661192a565b611a30565b610c9757610c6086610c5b61192a565b61165d565b610c96576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610cfe576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0b8686866001611a74565b8015610d1657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610de485610dc0888887611a7a565b7c020000000000000000000000000000000000000000000000000000000017611aa2565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e6c576000600185019050600060046000838152602001908152602001600020541415610e6a576000548114610e69578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ed48686866001611acd565b505050505050565b600e5481565b6107d081565b610f038383836040518060200160405280600081525061154b565b505050565b610f1181611ad3565b50565b610f1c61184d565b8181600a9190610f2d92919061234a565b505050565b6000610f3d8261193b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fac576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61100561184d565b61100f6000611ae1565b565b600d5481565b60105481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61104f61184d565b6000600b5411611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90612c7f565b60405180910390fd5b80600b8190555050565b6060600380546110ad90612ee4565b80601f01602080910402602001604051908101604052809291908181526020018280546110d990612ee4565b80156111265780601f106110fb57610100808354040283529160200191611126565b820191906000526020600020905b81548152906001019060200180831161110957829003601f168201915b5050505050905090565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b90612b5f565b60405180910390fd5b600d5442101580156111b85750600e544211155b6111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee90612b7f565b60405180910390fd5b6000811180156112525750600f81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461124f9190612d7e565b11155b611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128890612c3f565b60405180910390fd5b6107d0600c54826112a29190612d7e565b11156112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da90612c9f565b60405180910390fd5b6112ec33610b30565b61132b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132290612c1f565b60405180910390fd5b600081600b5461133b9190612dd4565b905034811461137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690612bdf565b60405180910390fd5b61139061138a61101d565b34611ba7565b81600c5461139e9190612d7e565b600c8190555081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113ef9190612d7e565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061143c3383611ccd565b5050565b806007600061144d61192a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114fa61192a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161153f9190612b22565b60405180910390a35050565b611556848484610bb7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115b85761158184848484611e8a565b6115b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606115c9826118cb565b6115ff576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611609611fea565b905060008151141561162a5760405180602001604052806000815250611655565b806116348461207c565b604051602001611645929190612a97565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116f961184d565b60005b828290508110156117ac57600160096000858585818110611746577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061175b9190612552565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806117a490612f47565b9150506116fc565b505050565b6117b961184d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182090612b9f565b60405180910390fd5b61183281611ae1565b50565b60096020528060005260406000206000915090505481565b6118556120d5565b73ffffffffffffffffffffffffffffffffffffffff1661187361101d565b73ffffffffffffffffffffffffffffffffffffffff16146118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090612c5f565b60405180910390fd5b565b6000816118d6611932565b111580156118e5575060005482105b8015611923575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061194a611932565b116119d2576000548110156119d15760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156119cf575b60008114156119c557600460008360019003935083815260200190815260200160002054905061199a565b8092505050611a04565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611a918686846120dd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611ade8160006120e6565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115611c02577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c345781602001600182028036833780820191505090505b50604051611c429190612a80565b60006040518083038185875af1925050503d8060008114611c7f576040519150601f19603f3d011682016040523d82523d6000602084013e611c84565b606091505b5050905080611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf90612bff565b60405180910390fd5b505050565b6000805490506000821415611d0e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1b6000848385611a74565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611d9283611d836000866000611a7a565b611d8c8561233a565b17611aa2565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e3357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611df8565b506000821415611e6f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611e856000848385611acd565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eb061192a565b8786866040518563ffffffff1660e01b8152600401611ed29493929190612ad6565b602060405180830381600087803b158015611eec57600080fd5b505af1925050508015611f1d57506040513d601f19601f82011682018060405250810190611f1a9190612767565b60015b611f97573d8060008114611f4d576040519150601f19603f3d011682016040523d82523d6000602084013e611f52565b606091505b50600081511415611f8f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611ff990612ee4565b80601f016020809104026020016040519081016040528092919081815260200182805461202590612ee4565b80156120725780601f1061204757610100808354040283529160200191612072565b820191906000526020600020905b81548152906001019060200180831161205557829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156120c057600184039350600a81066030018453600a81049050806120bb576120c0565b612095565b50828103602084039350808452505050919050565b600033905090565b60009392505050565b60006120f18361193b565b9050600081905060008061210486611a09565b91509150841561216d57612120818461211b61192a565b611a30565b61216c576121358361213061192a565b61165d565b61216b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61217b836000886001611a74565b801561218657600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061222e836121eb85600088611a7a565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611aa2565b600460008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851614156122b65760006001870190506000600460008381526020019081526020016000205414156122b45760005481146122b3578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612320836000886001611acd565b600160008154809291906001019190505550505050505050565b60006001821460e11b9050919050565b82805461235690612ee4565b90600052602060002090601f01602090048101928261237857600085556123bf565b82601f1061239157803560ff19168380011785556123bf565b828001600101855582156123bf579182015b828111156123be5782358255916020019190600101906123a3565b5b5090506123cc91906123d0565b5090565b5b808211156123e95760008160009055506001016123d1565b5090565b60006124006123fb84612cff565b612cda565b90508281526020810184848401111561241857600080fd5b612423848285612ea2565b509392505050565b60008135905061243a81613217565b92915050565b60008083601f84011261245257600080fd5b8235905067ffffffffffffffff81111561246b57600080fd5b60208301915083602082028301111561248357600080fd5b9250929050565b6000813590506124998161322e565b92915050565b6000813590506124ae81613245565b92915050565b6000815190506124c381613245565b92915050565b600082601f8301126124da57600080fd5b81356124ea8482602086016123ed565b91505092915050565b60008083601f84011261250557600080fd5b8235905067ffffffffffffffff81111561251e57600080fd5b60208301915083600182028301111561253657600080fd5b9250929050565b60008135905061254c8161325c565b92915050565b60006020828403121561256457600080fd5b60006125728482850161242b565b91505092915050565b6000806040838503121561258e57600080fd5b600061259c8582860161242b565b92505060206125ad8582860161242b565b9150509250929050565b6000806000606084860312156125cc57600080fd5b60006125da8682870161242b565b93505060206125eb8682870161242b565b92505060406125fc8682870161253d565b9150509250925092565b6000806000806080858703121561261c57600080fd5b600061262a8782880161242b565b945050602061263b8782880161242b565b935050604061264c8782880161253d565b925050606085013567ffffffffffffffff81111561266957600080fd5b612675878288016124c9565b91505092959194509250565b6000806040838503121561269457600080fd5b60006126a28582860161242b565b92505060206126b38582860161248a565b9150509250929050565b600080604083850312156126d057600080fd5b60006126de8582860161242b565b92505060206126ef8582860161253d565b9150509250929050565b6000806020838503121561270c57600080fd5b600083013567ffffffffffffffff81111561272657600080fd5b61273285828601612440565b92509250509250929050565b60006020828403121561275057600080fd5b600061275e8482850161249f565b91505092915050565b60006020828403121561277957600080fd5b6000612787848285016124b4565b91505092915050565b600080602083850312156127a357600080fd5b600083013567ffffffffffffffff8111156127bd57600080fd5b6127c9858286016124f3565b92509250509250929050565b6000602082840312156127e757600080fd5b60006127f58482850161253d565b91505092915050565b61280781612e2e565b82525050565b61281681612e40565b82525050565b600061282782612d30565b6128318185612d46565b9350612841818560208601612eb1565b61284a8161301d565b840191505092915050565b600061286082612d30565b61286a8185612d57565b935061287a818560208601612eb1565b80840191505092915050565b600061289182612d3b565b61289b8185612d62565b93506128ab818560208601612eb1565b6128b48161301d565b840191505092915050565b60006128ca82612d3b565b6128d48185612d73565b93506128e4818560208601612eb1565b80840191505092915050565b60006128fd600983612d62565b91506129088261302e565b602082019050919050565b6000612920600e83612d62565b915061292b82613057565b602082019050919050565b6000612943602683612d62565b915061294e82613080565b604082019050919050565b6000612966601083612d62565b9150612971826130cf565b602082019050919050565b6000612989600e83612d62565b9150612994826130f8565b602082019050919050565b60006129ac601d83612d62565b91506129b782613121565b602082019050919050565b60006129cf601583612d62565b91506129da8261314a565b602082019050919050565b60006129f2601783612d62565b91506129fd82613173565b602082019050919050565b6000612a15602083612d62565b9150612a208261319c565b602082019050919050565b6000612a38600e83612d62565b9150612a43826131c5565b602082019050919050565b6000612a5b601783612d62565b9150612a66826131ee565b602082019050919050565b612a7a81612e98565b82525050565b6000612a8c8284612855565b915081905092915050565b6000612aa382856128bf565b9150612aaf82846128bf565b91508190509392505050565b6000602082019050612ad060008301846127fe565b92915050565b6000608082019050612aeb60008301876127fe565b612af860208301866127fe565b612b056040830185612a71565b8181036060830152612b17818461281c565b905095945050505050565b6000602082019050612b37600083018461280d565b92915050565b60006020820190508181036000830152612b578184612886565b905092915050565b60006020820190508181036000830152612b78816128f0565b9050919050565b60006020820190508181036000830152612b9881612913565b9050919050565b60006020820190508181036000830152612bb881612936565b9050919050565b60006020820190508181036000830152612bd881612959565b9050919050565b60006020820190508181036000830152612bf88161297c565b9050919050565b60006020820190508181036000830152612c188161299f565b9050919050565b60006020820190508181036000830152612c38816129c2565b9050919050565b60006020820190508181036000830152612c58816129e5565b9050919050565b60006020820190508181036000830152612c7881612a08565b9050919050565b60006020820190508181036000830152612c9881612a2b565b9050919050565b60006020820190508181036000830152612cb881612a4e565b9050919050565b6000602082019050612cd46000830184612a71565b92915050565b6000612ce4612cf5565b9050612cf08282612f16565b919050565b6000604051905090565b600067ffffffffffffffff821115612d1a57612d19612fee565b5b612d238261301d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d8982612e98565b9150612d9483612e98565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dc957612dc8612f90565b5b828201905092915050565b6000612ddf82612e98565b9150612dea83612e98565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2357612e22612f90565b5b828202905092915050565b6000612e3982612e78565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ecf578082015181840152602081019050612eb4565b83811115612ede576000848401525b50505050565b60006002820490506001821680612efc57607f821691505b60208210811415612f1057612f0f612fbf565b5b50919050565b612f1f8261301d565b810181811067ffffffffffffffff82111715612f3e57612f3d612fee565b5b80604052505050565b6000612f5282612e98565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f8557612f84612f90565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6e6f742075736572210000000000000000000000000000000000000000000000600082015250565b7f6e6f742073616c652074696d6521000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f616c726561647920737461727465642100000000000000000000000000000000600082015250565b7f696e76616c69642076616c756521000000000000000000000000000000000000600082015250565b7f5472616e736665723a204554485f5452414e534645525f4641494c4544000000600082015250565b7f4e6f7420696e2077686974656c69737420796574210000000000000000000000600082015250565b7f4578636565642073616c6573206d6178206c696d697421000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420707269636521000000000000000000000000000000000000600082015250565b7f4d6178696d756d20636f756e7420657863656564656421000000000000000000600082015250565b61322081612e2e565b811461322b57600080fd5b50565b61323781612e40565b811461324257600080fd5b50565b61324e81612e4c565b811461325957600080fd5b50565b61326581612e98565b811461327057600080fd5b5056fea264697066735822122051f558ce4f49e727e8e1df7019e83f96bfa939d1cea0ae0e7f1d465b47c3a11664736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80636352211e1161010d578063a035b1fe116100a0578063c87b56dd1161006f578063c87b56dd146106ce578063e985e9c51461070b578063edac985b14610748578063f2fde38b14610771578063f7e78e9d1461079a576101f9565b8063a035b1fe14610642578063a0712d681461066d578063a22cb46514610689578063b88d4fde146106b2576101f9565b80638caa0083116100dc5780638caa0083146105985780638da5cb5b146105c357806391b7f5ed146105ee57806395d89b4114610617576101f9565b80636352211e146104dc57806370a0823114610519578063715018a61461055657806378e979251461056d576101f9565b806317d70f7c116101905780633197cbb61161015f5780633197cbb61461041857806332cb6b0c1461044357806342842e0e1461046e57806342966c681461048a57806355f804b3146104b3576101f9565b806317d70f7c1461036957806318160ddd146103945780631959a002146103bf57806323b872dd146103fc576101f9565b8063081812fc116101cc578063081812fc146102a8578063095ea7b3146102e557806309fd8212146103015780631596facb1461033e576101f9565b806301339c21146101fe57806301ffc9a71461021557806306661abd1461025257806306fdde031461027d575b600080fd5b34801561020a57600080fd5b506102136107d7565b005b34801561022157600080fd5b5061023c6004803603810190610237919061273e565b610843565b6040516102499190612b22565b60405180910390f35b34801561025e57600080fd5b506102676108d5565b6040516102749190612cbf565b60405180910390f35b34801561028957600080fd5b506102926108db565b60405161029f9190612b3d565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca91906127d5565b61096d565b6040516102dc9190612abb565b60405180910390f35b6102ff60048036038101906102fa91906126bd565b6109ec565b005b34801561030d57600080fd5b5061032860048036038101906103239190612552565b610b30565b6040516103359190612b22565b60405180910390f35b34801561034a57600080fd5b50610353610b7c565b6040516103609190612cbf565b60405180910390f35b34801561037557600080fd5b5061037e610b82565b60405161038b9190612cbf565b60405180910390f35b3480156103a057600080fd5b506103a9610b88565b6040516103b69190612cbf565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190612552565b610b9f565b6040516103f39190612cbf565b60405180910390f35b610416600480360381019061041191906125b7565b610bb7565b005b34801561042457600080fd5b5061042d610edc565b60405161043a9190612cbf565b60405180910390f35b34801561044f57600080fd5b50610458610ee2565b6040516104659190612cbf565b60405180910390f35b610488600480360381019061048391906125b7565b610ee8565b005b34801561049657600080fd5b506104b160048036038101906104ac91906127d5565b610f08565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612790565b610f14565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906127d5565b610f32565b6040516105109190612abb565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190612552565b610f44565b60405161054d9190612cbf565b60405180910390f35b34801561056257600080fd5b5061056b610ffd565b005b34801561057957600080fd5b50610582611011565b60405161058f9190612cbf565b60405180910390f35b3480156105a457600080fd5b506105ad611017565b6040516105ba9190612cbf565b60405180910390f35b3480156105cf57600080fd5b506105d861101d565b6040516105e59190612abb565b60405180910390f35b3480156105fa57600080fd5b50610615600480360381019061061091906127d5565b611047565b005b34801561062357600080fd5b5061062c61109e565b6040516106399190612b3d565b60405180910390f35b34801561064e57600080fd5b50610657611130565b6040516106649190612cbf565b60405180910390f35b610687600480360381019061068291906127d5565b611136565b005b34801561069557600080fd5b506106b060048036038101906106ab9190612681565b611440565b005b6106cc60048036038101906106c79190612606565b61154b565b005b3480156106da57600080fd5b506106f560048036038101906106f091906127d5565b6115be565b6040516107029190612b3d565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d919061257b565b61165d565b60405161073f9190612b22565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a91906126f9565b6116f1565b005b34801561077d57600080fd5b5061079860048036038101906107939190612552565b6117b1565b005b3480156107a657600080fd5b506107c160048036038101906107bc9190612552565b611835565b6040516107ce9190612cbf565b60405180910390f35b6107df61184d565b6000600d5414610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b90612bbf565b60405180910390fd5b42600d81905550600f54600d5461083b9190612d7e565b600e81905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ce5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600c5481565b6060600280546108ea90612ee4565b80601f016020809104026020016040519081016040528092919081815260200182805461091690612ee4565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050905090565b6000610978826118cb565b6109ae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f782610f32565b90508073ffffffffffffffffffffffffffffffffffffffff16610a1861192a565b73ffffffffffffffffffffffffffffffffffffffff1614610a7b57610a4481610a3f61192a565b61165d565b610a7a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054149050919050565b600f5481565b60115481565b6000610b92611932565b6001546000540303905090565b60126020528060005260406000206000915090505481565b6000610bc28261193b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c29576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c3584611a09565b91509150610c4b8187610c4661192a565b611a30565b610c9757610c6086610c5b61192a565b61165d565b610c96576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610cfe576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0b8686866001611a74565b8015610d1657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610de485610dc0888887611a7a565b7c020000000000000000000000000000000000000000000000000000000017611aa2565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e6c576000600185019050600060046000838152602001908152602001600020541415610e6a576000548114610e69578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ed48686866001611acd565b505050505050565b600e5481565b6107d081565b610f038383836040518060200160405280600081525061154b565b505050565b610f1181611ad3565b50565b610f1c61184d565b8181600a9190610f2d92919061234a565b505050565b6000610f3d8261193b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fac576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61100561184d565b61100f6000611ae1565b565b600d5481565b60105481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61104f61184d565b6000600b5411611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90612c7f565b60405180910390fd5b80600b8190555050565b6060600380546110ad90612ee4565b80601f01602080910402602001604051908101604052809291908181526020018280546110d990612ee4565b80156111265780601f106110fb57610100808354040283529160200191611126565b820191906000526020600020905b81548152906001019060200180831161110957829003601f168201915b5050505050905090565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b90612b5f565b60405180910390fd5b600d5442101580156111b85750600e544211155b6111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee90612b7f565b60405180910390fd5b6000811180156112525750600f81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461124f9190612d7e565b11155b611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128890612c3f565b60405180910390fd5b6107d0600c54826112a29190612d7e565b11156112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da90612c9f565b60405180910390fd5b6112ec33610b30565b61132b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132290612c1f565b60405180910390fd5b600081600b5461133b9190612dd4565b905034811461137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690612bdf565b60405180910390fd5b61139061138a61101d565b34611ba7565b81600c5461139e9190612d7e565b600c8190555081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113ef9190612d7e565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061143c3383611ccd565b5050565b806007600061144d61192a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114fa61192a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161153f9190612b22565b60405180910390a35050565b611556848484610bb7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115b85761158184848484611e8a565b6115b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606115c9826118cb565b6115ff576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611609611fea565b905060008151141561162a5760405180602001604052806000815250611655565b806116348461207c565b604051602001611645929190612a97565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116f961184d565b60005b828290508110156117ac57600160096000858585818110611746577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061175b9190612552565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806117a490612f47565b9150506116fc565b505050565b6117b961184d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182090612b9f565b60405180910390fd5b61183281611ae1565b50565b60096020528060005260406000206000915090505481565b6118556120d5565b73ffffffffffffffffffffffffffffffffffffffff1661187361101d565b73ffffffffffffffffffffffffffffffffffffffff16146118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090612c5f565b60405180910390fd5b565b6000816118d6611932565b111580156118e5575060005482105b8015611923575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061194a611932565b116119d2576000548110156119d15760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156119cf575b60008114156119c557600460008360019003935083815260200190815260200160002054905061199a565b8092505050611a04565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611a918686846120dd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611ade8160006120e6565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115611c02577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c345781602001600182028036833780820191505090505b50604051611c429190612a80565b60006040518083038185875af1925050503d8060008114611c7f576040519150601f19603f3d011682016040523d82523d6000602084013e611c84565b606091505b5050905080611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf90612bff565b60405180910390fd5b505050565b6000805490506000821415611d0e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1b6000848385611a74565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611d9283611d836000866000611a7a565b611d8c8561233a565b17611aa2565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e3357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611df8565b506000821415611e6f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611e856000848385611acd565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eb061192a565b8786866040518563ffffffff1660e01b8152600401611ed29493929190612ad6565b602060405180830381600087803b158015611eec57600080fd5b505af1925050508015611f1d57506040513d601f19601f82011682018060405250810190611f1a9190612767565b60015b611f97573d8060008114611f4d576040519150601f19603f3d011682016040523d82523d6000602084013e611f52565b606091505b50600081511415611f8f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611ff990612ee4565b80601f016020809104026020016040519081016040528092919081815260200182805461202590612ee4565b80156120725780601f1061204757610100808354040283529160200191612072565b820191906000526020600020905b81548152906001019060200180831161205557829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156120c057600184039350600a81066030018453600a81049050806120bb576120c0565b612095565b50828103602084039350808452505050919050565b600033905090565b60009392505050565b60006120f18361193b565b9050600081905060008061210486611a09565b91509150841561216d57612120818461211b61192a565b611a30565b61216c576121358361213061192a565b61165d565b61216b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61217b836000886001611a74565b801561218657600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061222e836121eb85600088611a7a565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611aa2565b600460008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851614156122b65760006001870190506000600460008381526020019081526020016000205414156122b45760005481146122b3578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612320836000886001611acd565b600160008154809291906001019190505550505050505050565b60006001821460e11b9050919050565b82805461235690612ee4565b90600052602060002090601f01602090048101928261237857600085556123bf565b82601f1061239157803560ff19168380011785556123bf565b828001600101855582156123bf579182015b828111156123be5782358255916020019190600101906123a3565b5b5090506123cc91906123d0565b5090565b5b808211156123e95760008160009055506001016123d1565b5090565b60006124006123fb84612cff565b612cda565b90508281526020810184848401111561241857600080fd5b612423848285612ea2565b509392505050565b60008135905061243a81613217565b92915050565b60008083601f84011261245257600080fd5b8235905067ffffffffffffffff81111561246b57600080fd5b60208301915083602082028301111561248357600080fd5b9250929050565b6000813590506124998161322e565b92915050565b6000813590506124ae81613245565b92915050565b6000815190506124c381613245565b92915050565b600082601f8301126124da57600080fd5b81356124ea8482602086016123ed565b91505092915050565b60008083601f84011261250557600080fd5b8235905067ffffffffffffffff81111561251e57600080fd5b60208301915083600182028301111561253657600080fd5b9250929050565b60008135905061254c8161325c565b92915050565b60006020828403121561256457600080fd5b60006125728482850161242b565b91505092915050565b6000806040838503121561258e57600080fd5b600061259c8582860161242b565b92505060206125ad8582860161242b565b9150509250929050565b6000806000606084860312156125cc57600080fd5b60006125da8682870161242b565b93505060206125eb8682870161242b565b92505060406125fc8682870161253d565b9150509250925092565b6000806000806080858703121561261c57600080fd5b600061262a8782880161242b565b945050602061263b8782880161242b565b935050604061264c8782880161253d565b925050606085013567ffffffffffffffff81111561266957600080fd5b612675878288016124c9565b91505092959194509250565b6000806040838503121561269457600080fd5b60006126a28582860161242b565b92505060206126b38582860161248a565b9150509250929050565b600080604083850312156126d057600080fd5b60006126de8582860161242b565b92505060206126ef8582860161253d565b9150509250929050565b6000806020838503121561270c57600080fd5b600083013567ffffffffffffffff81111561272657600080fd5b61273285828601612440565b92509250509250929050565b60006020828403121561275057600080fd5b600061275e8482850161249f565b91505092915050565b60006020828403121561277957600080fd5b6000612787848285016124b4565b91505092915050565b600080602083850312156127a357600080fd5b600083013567ffffffffffffffff8111156127bd57600080fd5b6127c9858286016124f3565b92509250509250929050565b6000602082840312156127e757600080fd5b60006127f58482850161253d565b91505092915050565b61280781612e2e565b82525050565b61281681612e40565b82525050565b600061282782612d30565b6128318185612d46565b9350612841818560208601612eb1565b61284a8161301d565b840191505092915050565b600061286082612d30565b61286a8185612d57565b935061287a818560208601612eb1565b80840191505092915050565b600061289182612d3b565b61289b8185612d62565b93506128ab818560208601612eb1565b6128b48161301d565b840191505092915050565b60006128ca82612d3b565b6128d48185612d73565b93506128e4818560208601612eb1565b80840191505092915050565b60006128fd600983612d62565b91506129088261302e565b602082019050919050565b6000612920600e83612d62565b915061292b82613057565b602082019050919050565b6000612943602683612d62565b915061294e82613080565b604082019050919050565b6000612966601083612d62565b9150612971826130cf565b602082019050919050565b6000612989600e83612d62565b9150612994826130f8565b602082019050919050565b60006129ac601d83612d62565b91506129b782613121565b602082019050919050565b60006129cf601583612d62565b91506129da8261314a565b602082019050919050565b60006129f2601783612d62565b91506129fd82613173565b602082019050919050565b6000612a15602083612d62565b9150612a208261319c565b602082019050919050565b6000612a38600e83612d62565b9150612a43826131c5565b602082019050919050565b6000612a5b601783612d62565b9150612a66826131ee565b602082019050919050565b612a7a81612e98565b82525050565b6000612a8c8284612855565b915081905092915050565b6000612aa382856128bf565b9150612aaf82846128bf565b91508190509392505050565b6000602082019050612ad060008301846127fe565b92915050565b6000608082019050612aeb60008301876127fe565b612af860208301866127fe565b612b056040830185612a71565b8181036060830152612b17818461281c565b905095945050505050565b6000602082019050612b37600083018461280d565b92915050565b60006020820190508181036000830152612b578184612886565b905092915050565b60006020820190508181036000830152612b78816128f0565b9050919050565b60006020820190508181036000830152612b9881612913565b9050919050565b60006020820190508181036000830152612bb881612936565b9050919050565b60006020820190508181036000830152612bd881612959565b9050919050565b60006020820190508181036000830152612bf88161297c565b9050919050565b60006020820190508181036000830152612c188161299f565b9050919050565b60006020820190508181036000830152612c38816129c2565b9050919050565b60006020820190508181036000830152612c58816129e5565b9050919050565b60006020820190508181036000830152612c7881612a08565b9050919050565b60006020820190508181036000830152612c9881612a2b565b9050919050565b60006020820190508181036000830152612cb881612a4e565b9050919050565b6000602082019050612cd46000830184612a71565b92915050565b6000612ce4612cf5565b9050612cf08282612f16565b919050565b6000604051905090565b600067ffffffffffffffff821115612d1a57612d19612fee565b5b612d238261301d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d8982612e98565b9150612d9483612e98565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dc957612dc8612f90565b5b828201905092915050565b6000612ddf82612e98565b9150612dea83612e98565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2357612e22612f90565b5b828202905092915050565b6000612e3982612e78565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ecf578082015181840152602081019050612eb4565b83811115612ede576000848401525b50505050565b60006002820490506001821680612efc57607f821691505b60208210811415612f1057612f0f612fbf565b5b50919050565b612f1f8261301d565b810181811067ffffffffffffffff82111715612f3e57612f3d612fee565b5b80604052505050565b6000612f5282612e98565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f8557612f84612f90565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6e6f742075736572210000000000000000000000000000000000000000000000600082015250565b7f6e6f742073616c652074696d6521000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f616c726561647920737461727465642100000000000000000000000000000000600082015250565b7f696e76616c69642076616c756521000000000000000000000000000000000000600082015250565b7f5472616e736665723a204554485f5452414e534645525f4641494c4544000000600082015250565b7f4e6f7420696e2077686974656c69737420796574210000000000000000000000600082015250565b7f4578636565642073616c6573206d6178206c696d697421000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420707269636521000000000000000000000000000000000000600082015250565b7f4d6178696d756d20636f756e7420657863656564656421000000000000000000600082015250565b61322081612e2e565b811461322b57600080fd5b50565b61323781612e40565b811461324257600080fd5b50565b61324e81612e4c565b811461325957600080fd5b50565b61326581612e98565b811461327057600080fd5b5056fea264697066735822122051f558ce4f49e727e8e1df7019e83f96bfa939d1cea0ae0e7f1d465b47c3a11664736f6c63430008040033
Deployed Bytecode Sourcemap
65343:2365:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65863:177;;;;;;;;;;;;;:::i;:::-;;18208:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65559:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19110:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25601:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25034:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65217:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65646:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65726:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14861:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65755:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29240:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65617:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65426:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32161:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66805:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67217:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20503:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16045:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63953:103;;;;;;;;;;;;;:::i;:::-;;65586:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65695;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63305:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67080:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19286:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65519:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66057:740;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26159:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32952:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19496:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26550:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64979:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64211:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64883:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65863:177;63191:13;:11;:13::i;:::-;65931:1:::1;65918:9;;:14;65910:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;65976:15;65964:9;:27;;;;66024:8;;66012:9;;:20;;;;:::i;:::-;66002:7;:30;;;;65863:177::o:0;18208:639::-;18293:4;18632:10;18617:25;;:11;:25;;;;:102;;;;18709:10;18694:25;;:11;:25;;;;18617:102;:179;;;;18786:10;18771:25;;:11;:25;;;;18617:179;18597:199;;18208:639;;;:::o;65559:20::-;;;;:::o;19110:100::-;19164:13;19197:5;19190:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19110:100;:::o;25601:218::-;25677:7;25702:16;25710:7;25702;:16::i;:::-;25697:64;;25727:34;;;;;;;;;;;;;;25697:64;25781:15;:24;25797:7;25781:24;;;;;;;;;;;:30;;;;;;;;;;;;25774:37;;25601:218;;;:::o;25034:408::-;25123:13;25139:16;25147:7;25139;:16::i;:::-;25123:32;;25195:5;25172:28;;:19;:17;:19::i;:::-;:28;;;25168:175;;25220:44;25237:5;25244:19;:17;:19::i;:::-;25220:16;:44::i;:::-;25215:128;;25292:35;;;;;;;;;;;;;;25215:128;25168:175;25388:2;25355:15;:24;25371:7;25355:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25426:7;25422:2;25406:28;;25415:5;25406:28;;;;;;;;;;;;25034:408;;;:::o;65217:119::-;65276:4;65327:1;65299:16;:24;65316:6;65299:24;;;;;;;;;;;;;;;;:29;65292:36;;65217:119;;;:::o;65646:34::-;;;;:::o;65726:22::-;;;;:::o;14861:323::-;14922:7;15150:15;:13;:15::i;:::-;15135:12;;15119:13;;:28;:46;15112:53;;14861:323;:::o;65755:39::-;;;;;;;;;;;;;;;;;:::o;29240:2825::-;29382:27;29412;29431:7;29412:18;:27::i;:::-;29382:57;;29497:4;29456:45;;29472:19;29456:45;;;29452:86;;29510:28;;;;;;;;;;;;;;29452:86;29552:27;29581:23;29608:35;29635:7;29608:26;:35::i;:::-;29551:92;;;;29743:68;29768:15;29785:4;29791:19;:17;:19::i;:::-;29743:24;:68::i;:::-;29738:180;;29831:43;29848:4;29854:19;:17;:19::i;:::-;29831:16;:43::i;:::-;29826:92;;29883:35;;;;;;;;;;;;;;29826:92;29738:180;29949:1;29935:16;;:2;:16;;;29931:52;;;29960:23;;;;;;;;;;;;;;29931:52;29996:43;30018:4;30024:2;30028:7;30037:1;29996:21;:43::i;:::-;30132:15;30129:2;;;30272:1;30251:19;30244:30;30129:2;30669:18;:24;30688:4;30669:24;;;;;;;;;;;;;;;;30667:26;;;;;;;;;;;;30738:18;:22;30757:2;30738:22;;;;;;;;;;;;;;;;30736:24;;;;;;;;;;;31060:146;31097:2;31146:45;31161:4;31167:2;31171:19;31146:14;:45::i;:::-;11260:8;31118:73;31060:18;:146::i;:::-;31031:17;:26;31049:7;31031:26;;;;;;;;;;;:175;;;;31377:1;11260:8;31326:19;:47;:52;31322:627;;;31399:19;31431:1;31421:7;:11;31399:33;;31588:1;31554:17;:30;31572:11;31554:30;;;;;;;;;;;;:35;31550:384;;;31692:13;;31677:11;:28;31673:242;;31872:19;31839:17;:30;31857:11;31839:30;;;;;;;;;;;:52;;;;31673:242;31550:384;31322:627;;31996:7;31992:2;31977:27;;31986:4;31977:27;;;;;;;;;;;;32015:42;32036:4;32042:2;32046:7;32055:1;32015:20;:42::i;:::-;29240:2825;;;;;;:::o;65617:22::-;;;;:::o;65426:41::-;65463:4;65426:41;:::o;32161:193::-;32307:39;32324:4;32330:2;32334:7;32307:39;;;;;;;;;;;;:16;:39::i;:::-;32161:193;;;:::o;66805:73::-;66855:15;66861:8;66855:5;:15::i;:::-;66805:73;:::o;67217:98::-;63191:13;:11;:13::i;:::-;67304:3:::1;;67288:13;:19;;;;;;;:::i;:::-;;67217:98:::0;;:::o;20503:152::-;20575:7;20618:27;20637:7;20618:18;:27::i;:::-;20595:52;;20503:152;;;:::o;16045:233::-;16117:7;16158:1;16141:19;;:5;:19;;;16137:60;;;16169:28;;;;;;;;;;;;;;16137:60;10204:13;16215:18;:25;16234:5;16215:25;;;;;;;;;;;;;;;;:55;16208:62;;16045:233;;;:::o;63953:103::-;63191:13;:11;:13::i;:::-;64018:30:::1;64045:1;64018:18;:30::i;:::-;63953:103::o:0;65586:24::-;;;;:::o;65695:::-;;;;:::o;63305:87::-;63351:7;63378:6;;;;;;;;;;;63371:13;;63305:87;:::o;67080:129::-;63191:13;:11;:13::i;:::-;67157:1:::1;67149:5;;:9;67141:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;67195:6;67187:5;:14;;;;67080:129:::0;:::o;19286:104::-;19342:13;19375:7;19368:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19286:104;:::o;65519:33::-;;;;:::o;66057:740::-;67661:10;67648:23;;:9;:23;;;67640:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;66184:9:::1;;66167:15;:26;;:54;;;;;66214:7;;66197:15;:24;;66167:54;66159:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;66270:1;66260:7;:11;:52;;;;;66310:2;66298:7;66275:8;:20;66284:10;66275:20;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;:37;;66260:52;66252:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;65463:4;66366:5;;66358:7;:13;;;;:::i;:::-;:27;;66350:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;66431:25;66445:10;66431:13;:25::i;:::-;66423:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66492:12;66515:7;66507:5;;:15;;;;:::i;:::-;66492:30;;66549:9;66541:4;:17;66533:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;66587:31;66600:7;:5;:7::i;:::-;66608:9;66587:12;:31::i;:::-;66645:7;66637:5;;:15;;;;:::i;:::-;66629:5;:23;;;;66709:7;66686:8;:20;66695:10;66686:20;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;66663:8;:20;66672:10;66663:20;;;;;;;;;;;;;;;:53;;;;66763:26;66769:10;66781:7;66763:5;:26::i;:::-;67696:1;66057:740:::0;:::o;26159:234::-;26306:8;26254:18;:39;26273:19;:17;:19::i;:::-;26254:39;;;;;;;;;;;;;;;:49;26294:8;26254:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26366:8;26330:55;;26345:19;:17;:19::i;:::-;26330:55;;;26376:8;26330:55;;;;;;:::i;:::-;;;;;;;;26159:234;;:::o;32952:407::-;33127:31;33140:4;33146:2;33150:7;33127:12;:31::i;:::-;33191:1;33173:2;:14;;;:19;33169:183;;33212:56;33243:4;33249:2;33253:7;33262:5;33212:30;:56::i;:::-;33207:145;;33296:40;;;;;;;;;;;;;;33207:145;33169:183;32952:407;;;;:::o;19496:318::-;19569:13;19600:16;19608:7;19600;:16::i;:::-;19595:59;;19625:29;;;;;;;;;;;;;;19595:59;19667:21;19691:10;:8;:10::i;:::-;19667:34;;19744:1;19725:7;19719:21;:26;;:87;;;;;;;;;;;;;;;;;19772:7;19781:18;19791:7;19781:9;:18::i;:::-;19755:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19719:87;19712:94;;;19496:318;;;:::o;26550:164::-;26647:4;26671:18;:25;26690:5;26671:25;;;;;;;;;;;;;;;:35;26697:8;26671:35;;;;;;;;;;;;;;;;;;;;;;;;;26664:42;;26550:164;;;;:::o;64979:197::-;63191:13;:11;:13::i;:::-;65066:9:::1;65061:108;65085:9;;:16;;65081:1;:20;65061:108;;;65156:1;65123:16;:30;65140:9;;65150:1;65140:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65123:30;;;;;;;;;;;;;;;:34;;;;65103:3;;;;;:::i;:::-;;;;65061:108;;;;64979:197:::0;;:::o;64211:201::-;63191:13;:11;:13::i;:::-;64320:1:::1;64300:22;;:8;:22;;;;64292:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64376:28;64395:8;64376:18;:28::i;:::-;64211:201:::0;:::o;64883:51::-;;;;;;;;;;;;;;;;;:::o;63470:132::-;63545:12;:10;:12::i;:::-;63534:23;;:7;:5;:7::i;:::-;:23;;;63526:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63470:132::o;26972:282::-;27037:4;27093:7;27074:15;:13;:15::i;:::-;:26;;:66;;;;;27127:13;;27117:7;:23;27074:66;:153;;;;;27226:1;10980:8;27178:17;:26;27196:7;27178:26;;;;;;;;;;;;:44;:49;27074:153;27054:173;;26972:282;;;:::o;49280:105::-;49340:7;49367:10;49360:17;;49280:105;:::o;67487:101::-;67552:7;67579:1;67572:8;;67487:101;:::o;21658:1275::-;21725:7;21745:12;21760:7;21745:22;;21828:4;21809:15;:13;:15::i;:::-;:23;21805:1061;;21862:13;;21855:4;:20;21851:1015;;;21900:14;21917:17;:23;21935:4;21917:23;;;;;;;;;;;;21900:40;;22034:1;10980:8;22006:6;:24;:29;22002:845;;;22671:113;22688:1;22678:6;:11;22671:113;;;22731:17;:25;22749:6;;;;;;;22731:25;;;;;;;;;;;;22722:34;;22671:113;;;22817:6;22810:13;;;;;;22002:845;21851:1015;;21805:1061;22894:31;;;;;;;;;;;;;;21658:1275;;;;:::o;28135:485::-;28237:27;28266:23;28307:38;28348:15;:24;28364:7;28348:24;;;;;;;;;;;28307:65;;28525:18;28502:41;;28582:19;28576:26;28557:45;;28487:126;;;;:::o;27363:659::-;27512:11;27677:16;27670:5;27666:28;27657:37;;27837:16;27826:9;27822:32;27809:45;;27987:15;27976:9;27973:30;27965:5;27954:9;27951:20;27948:56;27938:66;;27545:470;;;;;:::o;34021:159::-;;;;;:::o;48589:311::-;48724:7;48744:16;11384:3;48770:19;:41;;48744:68;;11384:3;48838:31;48849:4;48855:2;48859:9;48838:10;:31::i;:::-;48830:40;;:62;;48823:69;;;48589:311;;;;;:::o;23481:450::-;23561:14;23729:16;23722:5;23718:28;23709:37;;23906:5;23892:11;23867:23;23863:41;23860:52;23853:5;23850:63;23840:73;;23597:327;;;;:::o;34845:158::-;;;;;:::o;43491:89::-;43551:21;43557:7;43566:5;43551;:21::i;:::-;43491:89;:::o;64572:191::-;64646:16;64665:6;;;;;;;;;;;64646:25;;64691:8;64682:6;;:17;;;;;;;;;;;;;;;;;;64746:8;64715:40;;64736:8;64715:40;;;;;;;;;;;;64572:191;;:::o;66886:186::-;66953:12;66970:2;:7;;66984:5;67001:1;66991:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66970:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66952:52;;;67023:7;67015:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;66886:186;;;:::o;36621:2966::-;36694:20;36717:13;;36694:36;;36757:1;36745:8;:13;36741:44;;;36767:18;;;;;;;;;;;;;;36741:44;36798:61;36828:1;36832:2;36836:12;36850:8;36798:21;:61::i;:::-;37342:1;10342:2;37312:1;:26;;37311:32;37299:8;:45;37273:18;:22;37292:2;37273:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37621:139;37658:2;37712:33;37735:1;37739:2;37743:1;37712:14;:33::i;:::-;37679:30;37700:8;37679:20;:30::i;:::-;:66;37621:18;:139::i;:::-;37587:17;:31;37605:12;37587:31;;;;;;;;;;;:173;;;;37777:16;37808:11;37837:8;37822:12;:23;37808:37;;38358:16;38354:2;38350:25;38338:37;;38730:12;38690:8;38649:1;38587:25;38528:1;38467;38440:335;39101:1;39087:12;39083:20;39041:346;39142:3;39133:7;39130:16;39041:346;;39360:7;39350:8;39347:1;39320:25;39317:1;39314;39309:59;39195:1;39186:7;39182:15;39171:26;;39041:346;;;39045:77;39432:1;39420:8;:13;39416:45;;;39442:19;;;;;;;;;;;;;;39416:45;39494:3;39478:13;:19;;;;36621:2966;;39519:60;39548:1;39552:2;39556:12;39570:8;39519:20;:60::i;:::-;36621:2966;;;:::o;35443:716::-;35606:4;35652:2;35627:45;;;35673:19;:17;:19::i;:::-;35694:4;35700:7;35709:5;35627:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35623:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35927:1;35910:6;:13;:18;35906:235;;;35956:40;;;;;;;;;;;;;;35906:235;36099:6;36093:13;36084:6;36080:2;36076:15;36069:38;35623:529;35796:54;;;35786:64;;;:6;:64;;;;35779:71;;;35443:716;;;;;;:::o;67323:156::-;67420:13;67458;67451:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67323:156;:::o;49487:1745::-;49552:17;49986:4;49979;49973:11;49969:22;50078:1;50072:4;50065:15;50153:4;50150:1;50146:12;50139:19;;50235:1;50230:3;50223:14;50339:3;50578:5;50560:428;50586:1;50560:428;;;50626:1;50621:3;50617:11;50610:18;;50797:2;50791:4;50787:13;50783:2;50779:22;50774:3;50766:36;50891:2;50885:4;50881:13;50873:21;;50958:4;50948:2;;50966:5;;50948:2;50560:428;;;50564:21;51027:3;51022;51018:13;51142:4;51137:3;51133:14;51126:21;;51207:6;51202:3;51195:19;49591:1634;;;;;;:::o;60178:98::-;60231:7;60258:10;60251:17;;60178:98;:::o;48290:147::-;48427:6;48290:147;;;;;:::o;43809:3081::-;43889:27;43919;43938:7;43919:18;:27::i;:::-;43889:57;;43959:12;43990:19;43959:52;;44025:27;44054:23;44081:35;44108:7;44081:26;:35::i;:::-;44024:92;;;;44133:13;44129:316;;;44254:68;44279:15;44296:4;44302:19;:17;:19::i;:::-;44254:24;:68::i;:::-;44249:184;;44346:43;44363:4;44369:19;:17;:19::i;:::-;44346:16;:43::i;:::-;44341:92;;44398:35;;;;;;;;;;;;;;44341:92;44249:184;44129:316;44457:51;44479:4;44493:1;44497:7;44506:1;44457:21;:51::i;:::-;44601:15;44598:2;;;44741:1;44720:19;44713:30;44598:2;45419:1;10469:3;45389:1;:26;;45388:32;45360:18;:24;45379:4;45360:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;45687:176;45724:4;45795:53;45810:4;45824:1;45828:19;45795:14;:53::i;:::-;11260:8;10980;45748:43;45747:101;45687:18;:176::i;:::-;45658:17;:26;45676:7;45658:26;;;;;;;;;;;:205;;;;46034:1;11260:8;45983:19;:47;:52;45979:627;;;46056:19;46088:1;46078:7;:11;46056:33;;46245:1;46211:17;:30;46229:11;46211:30;;;;;;;;;;;;:35;46207:384;;;46349:13;;46334:11;:28;46330:242;;46529:19;46496:17;:30;46514:11;46496:30;;;;;;;;;;;:52;;;;46330:242;46207:384;45979:627;;46661:7;46657:1;46634:35;;46643:4;46634:35;;;;;;;;;;;;46680:50;46701:4;46715:1;46719:7;46728:1;46680:20;:50::i;:::-;46857:12;;:14;;;;;;;;;;;;;43809:3081;;;;;;:::o;24033:324::-;24103:14;24336:1;24326:8;24323:15;24297:24;24293:46;24283:56;;24205:145;;;:::o;-1:-1:-1:-;;;;;;;:::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;518:367::-;591:8;601:6;651:3;644:4;636:6;632:17;628:27;618:2;;669:1;666;659:12;618:2;705:6;692:20;682:30;;735:18;727:6;724:30;721:2;;;767:1;764;757:12;721:2;804:4;796:6;792:17;780:29;;858:3;850:4;842:6;838:17;828:8;824:32;821:41;818:2;;;875:1;872;865:12;818:2;608:277;;;;;:::o;891:133::-;934:5;972:6;959:20;950:29;;988:30;1012:5;988:30;:::i;:::-;940:84;;;;:::o;1030:137::-;1075:5;1113:6;1100:20;1091:29;;1129:32;1155:5;1129:32;:::i;:::-;1081:86;;;;:::o;1173:141::-;1229:5;1260:6;1254:13;1245:22;;1276:32;1302:5;1276:32;:::i;:::-;1235:79;;;;:::o;1333:271::-;1388:5;1437:3;1430:4;1422:6;1418:17;1414:27;1404:2;;1455:1;1452;1445:12;1404:2;1495:6;1482:20;1520:78;1594:3;1586:6;1579:4;1571:6;1567:17;1520:78;:::i;:::-;1511:87;;1394:210;;;;;:::o;1624:352::-;1682:8;1692:6;1742:3;1735:4;1727:6;1723:17;1719:27;1709:2;;1760:1;1757;1750:12;1709:2;1796:6;1783:20;1773:30;;1826:18;1818:6;1815:30;1812:2;;;1858:1;1855;1848:12;1812:2;1895:4;1887:6;1883:17;1871:29;;1949:3;1941:4;1933:6;1929:17;1919:8;1915:32;1912:41;1909:2;;;1966:1;1963;1956:12;1909:2;1699:277;;;;;:::o;1982:139::-;2028:5;2066:6;2053:20;2044:29;;2082:33;2109:5;2082:33;:::i;:::-;2034:87;;;;:::o;2127:262::-;2186:6;2235:2;2223:9;2214:7;2210:23;2206:32;2203:2;;;2251:1;2248;2241:12;2203:2;2294:1;2319:53;2364:7;2355:6;2344:9;2340:22;2319:53;:::i;:::-;2309:63;;2265:117;2193:196;;;;:::o;2395:407::-;2463:6;2471;2520:2;2508:9;2499:7;2495:23;2491:32;2488:2;;;2536:1;2533;2526:12;2488:2;2579:1;2604:53;2649:7;2640:6;2629:9;2625:22;2604:53;:::i;:::-;2594:63;;2550:117;2706:2;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2677:118;2478:324;;;;;:::o;2808:552::-;2885:6;2893;2901;2950:2;2938:9;2929:7;2925:23;2921:32;2918:2;;;2966:1;2963;2956:12;2918:2;3009:1;3034:53;3079:7;3070:6;3059:9;3055:22;3034:53;:::i;:::-;3024:63;;2980:117;3136:2;3162:53;3207:7;3198:6;3187:9;3183:22;3162:53;:::i;:::-;3152:63;;3107:118;3264:2;3290:53;3335:7;3326:6;3315:9;3311:22;3290:53;:::i;:::-;3280:63;;3235:118;2908:452;;;;;:::o;3366:809::-;3461:6;3469;3477;3485;3534:3;3522:9;3513:7;3509:23;3505:33;3502:2;;;3551:1;3548;3541:12;3502:2;3594:1;3619:53;3664:7;3655:6;3644:9;3640:22;3619:53;:::i;:::-;3609:63;;3565:117;3721:2;3747:53;3792:7;3783:6;3772:9;3768:22;3747:53;:::i;:::-;3737:63;;3692:118;3849:2;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3820:118;4005:2;3994:9;3990:18;3977:32;4036:18;4028:6;4025:30;4022:2;;;4068:1;4065;4058:12;4022:2;4096:62;4150:7;4141:6;4130:9;4126:22;4096:62;:::i;:::-;4086:72;;3948:220;3492:683;;;;;;;:::o;4181:401::-;4246:6;4254;4303:2;4291:9;4282:7;4278:23;4274:32;4271:2;;;4319:1;4316;4309:12;4271:2;4362:1;4387:53;4432:7;4423:6;4412:9;4408:22;4387:53;:::i;:::-;4377:63;;4333:117;4489:2;4515:50;4557:7;4548:6;4537:9;4533:22;4515:50;:::i;:::-;4505:60;;4460:115;4261:321;;;;;:::o;4588:407::-;4656:6;4664;4713:2;4701:9;4692:7;4688:23;4684:32;4681:2;;;4729:1;4726;4719:12;4681:2;4772:1;4797:53;4842:7;4833:6;4822:9;4818:22;4797:53;:::i;:::-;4787:63;;4743:117;4899:2;4925:53;4970:7;4961:6;4950:9;4946:22;4925:53;:::i;:::-;4915:63;;4870:118;4671:324;;;;;:::o;5001:425::-;5087:6;5095;5144:2;5132:9;5123:7;5119:23;5115:32;5112:2;;;5160:1;5157;5150:12;5112:2;5231:1;5220:9;5216:17;5203:31;5261:18;5253:6;5250:30;5247:2;;;5293:1;5290;5283:12;5247:2;5329:80;5401:7;5392:6;5381:9;5377:22;5329:80;:::i;:::-;5311:98;;;;5174:245;5102:324;;;;;:::o;5432:260::-;5490:6;5539:2;5527:9;5518:7;5514:23;5510:32;5507:2;;;5555:1;5552;5545:12;5507:2;5598:1;5623:52;5667:7;5658:6;5647:9;5643:22;5623:52;:::i;:::-;5613:62;;5569:116;5497:195;;;;:::o;5698:282::-;5767:6;5816:2;5804:9;5795:7;5791:23;5787:32;5784:2;;;5832:1;5829;5822:12;5784:2;5875:1;5900:63;5955:7;5946:6;5935:9;5931:22;5900:63;:::i;:::-;5890:73;;5846:127;5774:206;;;;:::o;5986:395::-;6057:6;6065;6114:2;6102:9;6093:7;6089:23;6085:32;6082:2;;;6130:1;6127;6120:12;6082:2;6201:1;6190:9;6186:17;6173:31;6231:18;6223:6;6220:30;6217:2;;;6263:1;6260;6253:12;6217:2;6299:65;6356:7;6347:6;6336:9;6332:22;6299:65;:::i;:::-;6281:83;;;;6144:230;6072:309;;;;;:::o;6387:262::-;6446:6;6495:2;6483:9;6474:7;6470:23;6466:32;6463:2;;;6511:1;6508;6501:12;6463:2;6554:1;6579:53;6624:7;6615:6;6604:9;6600:22;6579:53;:::i;:::-;6569:63;;6525:117;6453:196;;;;:::o;6655:118::-;6742:24;6760:5;6742:24;:::i;:::-;6737:3;6730:37;6720:53;;:::o;6779:109::-;6860:21;6875:5;6860:21;:::i;:::-;6855:3;6848:34;6838:50;;:::o;6894:360::-;6980:3;7008:38;7040:5;7008:38;:::i;:::-;7062:70;7125:6;7120:3;7062:70;:::i;:::-;7055:77;;7141:52;7186:6;7181:3;7174:4;7167:5;7163:16;7141:52;:::i;:::-;7218:29;7240:6;7218:29;:::i;:::-;7213:3;7209:39;7202:46;;6984:270;;;;;:::o;7260:373::-;7364:3;7392:38;7424:5;7392:38;:::i;:::-;7446:88;7527:6;7522:3;7446:88;:::i;:::-;7439:95;;7543:52;7588:6;7583:3;7576:4;7569:5;7565:16;7543:52;:::i;:::-;7620:6;7615:3;7611:16;7604:23;;7368:265;;;;;:::o;7639:364::-;7727:3;7755:39;7788:5;7755:39;:::i;:::-;7810:71;7874:6;7869:3;7810:71;:::i;:::-;7803:78;;7890:52;7935:6;7930:3;7923:4;7916:5;7912:16;7890:52;:::i;:::-;7967:29;7989:6;7967:29;:::i;:::-;7962:3;7958:39;7951:46;;7731:272;;;;;:::o;8009:377::-;8115:3;8143:39;8176:5;8143:39;:::i;:::-;8198:89;8280:6;8275:3;8198:89;:::i;:::-;8191:96;;8296:52;8341:6;8336:3;8329:4;8322:5;8318:16;8296:52;:::i;:::-;8373:6;8368:3;8364:16;8357:23;;8119:267;;;;;:::o;8392:365::-;8534:3;8555:66;8619:1;8614:3;8555:66;:::i;:::-;8548:73;;8630:93;8719:3;8630:93;:::i;:::-;8748:2;8743:3;8739:12;8732:19;;8538:219;;;:::o;8763:366::-;8905:3;8926:67;8990:2;8985:3;8926:67;:::i;:::-;8919:74;;9002:93;9091:3;9002:93;:::i;:::-;9120:2;9115:3;9111:12;9104:19;;8909:220;;;:::o;9135:366::-;9277:3;9298:67;9362:2;9357:3;9298:67;:::i;:::-;9291:74;;9374:93;9463:3;9374:93;:::i;:::-;9492:2;9487:3;9483:12;9476:19;;9281:220;;;:::o;9507:366::-;9649:3;9670:67;9734:2;9729:3;9670:67;:::i;:::-;9663:74;;9746:93;9835:3;9746:93;:::i;:::-;9864:2;9859:3;9855:12;9848:19;;9653:220;;;:::o;9879:366::-;10021:3;10042:67;10106:2;10101:3;10042:67;:::i;:::-;10035:74;;10118:93;10207:3;10118:93;:::i;:::-;10236:2;10231:3;10227:12;10220:19;;10025:220;;;:::o;10251:366::-;10393:3;10414:67;10478:2;10473:3;10414:67;:::i;:::-;10407:74;;10490:93;10579:3;10490:93;:::i;:::-;10608:2;10603:3;10599:12;10592:19;;10397:220;;;:::o;10623:366::-;10765:3;10786:67;10850:2;10845:3;10786:67;:::i;:::-;10779:74;;10862:93;10951:3;10862:93;:::i;:::-;10980:2;10975:3;10971:12;10964:19;;10769:220;;;:::o;10995:366::-;11137:3;11158:67;11222:2;11217:3;11158:67;:::i;:::-;11151:74;;11234:93;11323:3;11234:93;:::i;:::-;11352:2;11347:3;11343:12;11336:19;;11141:220;;;:::o;11367:366::-;11509:3;11530:67;11594:2;11589:3;11530:67;:::i;:::-;11523:74;;11606:93;11695:3;11606:93;:::i;:::-;11724:2;11719:3;11715:12;11708:19;;11513:220;;;:::o;11739:366::-;11881:3;11902:67;11966:2;11961:3;11902:67;:::i;:::-;11895:74;;11978:93;12067:3;11978:93;:::i;:::-;12096:2;12091:3;12087:12;12080:19;;11885:220;;;:::o;12111:366::-;12253:3;12274:67;12338:2;12333:3;12274:67;:::i;:::-;12267:74;;12350:93;12439:3;12350:93;:::i;:::-;12468:2;12463:3;12459:12;12452:19;;12257:220;;;:::o;12483:118::-;12570:24;12588:5;12570:24;:::i;:::-;12565:3;12558:37;12548:53;;:::o;12607:271::-;12737:3;12759:93;12848:3;12839:6;12759:93;:::i;:::-;12752:100;;12869:3;12862:10;;12741:137;;;;:::o;12884:435::-;13064:3;13086:95;13177:3;13168:6;13086:95;:::i;:::-;13079:102;;13198:95;13289:3;13280:6;13198:95;:::i;:::-;13191:102;;13310:3;13303:10;;13068:251;;;;;:::o;13325:222::-;13418:4;13456:2;13445:9;13441:18;13433:26;;13469:71;13537:1;13526:9;13522:17;13513:6;13469:71;:::i;:::-;13423:124;;;;:::o;13553:640::-;13748:4;13786:3;13775:9;13771:19;13763:27;;13800:71;13868:1;13857:9;13853:17;13844:6;13800:71;:::i;:::-;13881:72;13949:2;13938:9;13934:18;13925:6;13881:72;:::i;:::-;13963;14031:2;14020:9;14016:18;14007:6;13963:72;:::i;:::-;14082:9;14076:4;14072:20;14067:2;14056:9;14052:18;14045:48;14110:76;14181:4;14172:6;14110:76;:::i;:::-;14102:84;;13753:440;;;;;;;:::o;14199:210::-;14286:4;14324:2;14313:9;14309:18;14301:26;;14337:65;14399:1;14388:9;14384:17;14375:6;14337:65;:::i;:::-;14291:118;;;;:::o;14415:313::-;14528:4;14566:2;14555:9;14551:18;14543:26;;14615:9;14609:4;14605:20;14601:1;14590:9;14586:17;14579:47;14643:78;14716:4;14707:6;14643:78;:::i;:::-;14635:86;;14533:195;;;;:::o;14734:419::-;14900:4;14938:2;14927:9;14923:18;14915:26;;14987:9;14981:4;14977:20;14973:1;14962:9;14958:17;14951:47;15015:131;15141:4;15015:131;:::i;:::-;15007:139;;14905:248;;;:::o;15159:419::-;15325:4;15363:2;15352:9;15348:18;15340:26;;15412:9;15406:4;15402:20;15398:1;15387:9;15383:17;15376:47;15440:131;15566:4;15440:131;:::i;:::-;15432:139;;15330:248;;;:::o;15584:419::-;15750:4;15788:2;15777:9;15773:18;15765:26;;15837:9;15831:4;15827:20;15823:1;15812:9;15808:17;15801:47;15865:131;15991:4;15865:131;:::i;:::-;15857:139;;15755:248;;;:::o;16009:419::-;16175:4;16213:2;16202:9;16198:18;16190:26;;16262:9;16256:4;16252:20;16248:1;16237:9;16233:17;16226:47;16290:131;16416:4;16290:131;:::i;:::-;16282:139;;16180:248;;;:::o;16434:419::-;16600:4;16638:2;16627:9;16623:18;16615:26;;16687:9;16681:4;16677:20;16673:1;16662:9;16658:17;16651:47;16715:131;16841:4;16715:131;:::i;:::-;16707:139;;16605:248;;;:::o;16859:419::-;17025:4;17063:2;17052:9;17048:18;17040:26;;17112:9;17106:4;17102:20;17098:1;17087:9;17083:17;17076:47;17140:131;17266:4;17140:131;:::i;:::-;17132:139;;17030:248;;;:::o;17284:419::-;17450:4;17488:2;17477:9;17473:18;17465:26;;17537:9;17531:4;17527:20;17523:1;17512:9;17508:17;17501:47;17565:131;17691:4;17565:131;:::i;:::-;17557:139;;17455:248;;;:::o;17709:419::-;17875:4;17913:2;17902:9;17898:18;17890:26;;17962:9;17956:4;17952:20;17948:1;17937:9;17933:17;17926:47;17990:131;18116:4;17990:131;:::i;:::-;17982:139;;17880:248;;;:::o;18134:419::-;18300:4;18338:2;18327:9;18323:18;18315:26;;18387:9;18381:4;18377:20;18373:1;18362:9;18358:17;18351:47;18415:131;18541:4;18415:131;:::i;:::-;18407:139;;18305:248;;;:::o;18559:419::-;18725:4;18763:2;18752:9;18748:18;18740:26;;18812:9;18806:4;18802:20;18798:1;18787:9;18783:17;18776:47;18840:131;18966:4;18840:131;:::i;:::-;18832:139;;18730:248;;;:::o;18984:419::-;19150:4;19188:2;19177:9;19173:18;19165:26;;19237:9;19231:4;19227:20;19223:1;19212:9;19208:17;19201:47;19265:131;19391:4;19265:131;:::i;:::-;19257:139;;19155:248;;;:::o;19409:222::-;19502:4;19540:2;19529:9;19525:18;19517:26;;19553:71;19621:1;19610:9;19606:17;19597:6;19553:71;:::i;:::-;19507:124;;;;:::o;19637:129::-;19671:6;19698:20;;:::i;:::-;19688:30;;19727:33;19755:4;19747:6;19727:33;:::i;:::-;19678:88;;;:::o;19772:75::-;19805:6;19838:2;19832:9;19822:19;;19812:35;:::o;19853:307::-;19914:4;20004:18;19996:6;19993:30;19990:2;;;20026:18;;:::i;:::-;19990:2;20064:29;20086:6;20064:29;:::i;:::-;20056:37;;20148:4;20142;20138:15;20130:23;;19919:241;;;:::o;20166:98::-;20217:6;20251:5;20245:12;20235:22;;20224:40;;;:::o;20270:99::-;20322:6;20356:5;20350:12;20340:22;;20329:40;;;:::o;20375:168::-;20458:11;20492:6;20487:3;20480:19;20532:4;20527:3;20523:14;20508:29;;20470:73;;;;:::o;20549:147::-;20650:11;20687:3;20672:18;;20662:34;;;;:::o;20702:169::-;20786:11;20820:6;20815:3;20808:19;20860:4;20855:3;20851:14;20836:29;;20798:73;;;;:::o;20877:148::-;20979:11;21016:3;21001:18;;20991:34;;;;:::o;21031:305::-;21071:3;21090:20;21108:1;21090:20;:::i;:::-;21085:25;;21124:20;21142:1;21124:20;:::i;:::-;21119:25;;21278:1;21210:66;21206:74;21203:1;21200:81;21197:2;;;21284:18;;:::i;:::-;21197:2;21328:1;21325;21321:9;21314:16;;21075:261;;;;:::o;21342:348::-;21382:7;21405:20;21423:1;21405:20;:::i;:::-;21400:25;;21439:20;21457:1;21439:20;:::i;:::-;21434:25;;21627:1;21559:66;21555:74;21552:1;21549:81;21544:1;21537:9;21530:17;21526:105;21523:2;;;21634:18;;:::i;:::-;21523:2;21682:1;21679;21675:9;21664:20;;21390:300;;;;:::o;21696:96::-;21733:7;21762:24;21780:5;21762:24;:::i;:::-;21751:35;;21741:51;;;:::o;21798:90::-;21832:7;21875:5;21868:13;21861:21;21850:32;;21840:48;;;:::o;21894:149::-;21930:7;21970:66;21963:5;21959:78;21948:89;;21938:105;;;:::o;22049:126::-;22086:7;22126:42;22119:5;22115:54;22104:65;;22094:81;;;:::o;22181:77::-;22218:7;22247:5;22236:16;;22226:32;;;:::o;22264:154::-;22348:6;22343:3;22338;22325:30;22410:1;22401:6;22396:3;22392:16;22385:27;22315:103;;;:::o;22424:307::-;22492:1;22502:113;22516:6;22513:1;22510:13;22502:113;;;22601:1;22596:3;22592:11;22586:18;22582:1;22577:3;22573:11;22566:39;22538:2;22535:1;22531:10;22526:15;;22502:113;;;22633:6;22630:1;22627:13;22624:2;;;22713:1;22704:6;22699:3;22695:16;22688:27;22624:2;22473:258;;;;:::o;22737:320::-;22781:6;22818:1;22812:4;22808:12;22798:22;;22865:1;22859:4;22855:12;22886:18;22876:2;;22942:4;22934:6;22930:17;22920:27;;22876:2;23004;22996:6;22993:14;22973:18;22970:38;22967:2;;;23023:18;;:::i;:::-;22967:2;22788:269;;;;:::o;23063:281::-;23146:27;23168:4;23146:27;:::i;:::-;23138:6;23134:40;23276:6;23264:10;23261:22;23240:18;23228:10;23225:34;23222:62;23219:2;;;23287:18;;:::i;:::-;23219:2;23327:10;23323:2;23316:22;23106:238;;;:::o;23350:233::-;23389:3;23412:24;23430:5;23412:24;:::i;:::-;23403:33;;23458:66;23451:5;23448:77;23445:2;;;23528:18;;:::i;:::-;23445:2;23575:1;23568:5;23564:13;23557:20;;23393:190;;;:::o;23589:180::-;23637:77;23634:1;23627:88;23734:4;23731:1;23724:15;23758:4;23755:1;23748:15;23775:180;23823:77;23820:1;23813:88;23920:4;23917:1;23910:15;23944:4;23941:1;23934:15;23961:180;24009:77;24006:1;23999:88;24106:4;24103:1;24096:15;24130:4;24127:1;24120:15;24147:102;24188:6;24239:2;24235:7;24230:2;24223:5;24219:14;24215:28;24205:38;;24195:54;;;:::o;24255:159::-;24395:11;24391:1;24383:6;24379:14;24372:35;24361:53;:::o;24420:164::-;24560:16;24556:1;24548:6;24544:14;24537:40;24526:58;:::o;24590:225::-;24730:34;24726:1;24718:6;24714:14;24707:58;24799:8;24794:2;24786:6;24782:15;24775:33;24696:119;:::o;24821:166::-;24961:18;24957:1;24949:6;24945:14;24938:42;24927:60;:::o;24993:164::-;25133:16;25129:1;25121:6;25117:14;25110:40;25099:58;:::o;25163:179::-;25303:31;25299:1;25291:6;25287:14;25280:55;25269:73;:::o;25348:171::-;25488:23;25484:1;25476:6;25472:14;25465:47;25454:65;:::o;25525:173::-;25665:25;25661:1;25653:6;25649:14;25642:49;25631:67;:::o;25704:182::-;25844:34;25840:1;25832:6;25828:14;25821:58;25810:76;:::o;25892:164::-;26032:16;26028:1;26020:6;26016:14;26009:40;25998:58;:::o;26062:173::-;26202:25;26198:1;26190:6;26186:14;26179:49;26168:67;:::o;26241:122::-;26314:24;26332:5;26314:24;:::i;:::-;26307:5;26304:35;26294:2;;26353:1;26350;26343:12;26294:2;26284:79;:::o;26369:116::-;26439:21;26454:5;26439:21;:::i;:::-;26432:5;26429:32;26419:2;;26475:1;26472;26465:12;26419:2;26409:76;:::o;26491:120::-;26563:23;26580:5;26563:23;:::i;:::-;26556:5;26553:34;26543:2;;26601:1;26598;26591:12;26543:2;26533:78;:::o;26617:122::-;26690:24;26708:5;26690:24;:::i;:::-;26683:5;26680:35;26670:2;;26729:1;26726;26719:12;26670:2;26660:79;:::o
Swarm Source
ipfs://51f558ce4f49e727e8e1df7019e83f96bfa939d1cea0ae0e7f1d465b47c3a116
Loading...
Loading
Loading...
Loading
OVERVIEW
Power Man is the NFT of Power Swap, a DEX where users can discover the latest and best projects.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 ]
[ 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.