Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,154 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 143298163 | 4 days ago | IN | 0 ETH | 0.000000007602 | ||||
| Set Approval For... | 142335977 | 26 days ago | IN | 0 ETH | 0.000000006019 | ||||
| Set Approval For... | 142217170 | 29 days ago | IN | 0 ETH | 0.000000008651 | ||||
| Set Approval For... | 141710128 | 41 days ago | IN | 0 ETH | 0.000000047771 | ||||
| Set Approval For... | 140780283 | 62 days ago | IN | 0 ETH | 0.000000001724 | ||||
| Set Approval For... | 140431283 | 70 days ago | IN | 0 ETH | 0.000000049581 | ||||
| Set Approval For... | 138791396 | 108 days ago | IN | 0 ETH | 0.000000053906 | ||||
| Set Approval For... | 138699677 | 111 days ago | IN | 0 ETH | 0.000000011425 | ||||
| Set Approval For... | 138673602 | 111 days ago | IN | 0 ETH | 0.000000011117 | ||||
| Set Approval For... | 138122431 | 124 days ago | IN | 0 ETH | 0.000000048663 | ||||
| Set Approval For... | 137121896 | 147 days ago | IN | 0 ETH | 0.000000055707 | ||||
| Set Approval For... | 136603106 | 159 days ago | IN | 0 ETH | 0.000000056514 | ||||
| Set Approval For... | 136557069 | 160 days ago | IN | 0 ETH | 0.000000020519 | ||||
| Set Approval For... | 136554794 | 160 days ago | IN | 0 ETH | 0.000000026757 | ||||
| Set Approval For... | 136351703 | 165 days ago | IN | 0 ETH | 0.000000009022 | ||||
| Set Approval For... | 135865502 | 176 days ago | IN | 0 ETH | 0.000000073426 | ||||
| Set Approval For... | 135472744 | 185 days ago | IN | 0 ETH | 0.000000362747 | ||||
| Set Approval For... | 135081784 | 194 days ago | IN | 0 ETH | 0.000000462079 | ||||
| Set Approval For... | 134007852 | 219 days ago | IN | 0 ETH | 0.000000064536 | ||||
| Set Approval For... | 133480894 | 231 days ago | IN | 0 ETH | 0.000000014035 | ||||
| Set Approval For... | 132043916 | 265 days ago | IN | 0 ETH | 0.000000010624 | ||||
| Set Approval For... | 132017410 | 265 days ago | IN | 0 ETH | 0.000000011133 | ||||
| Set Approval For... | 131768230 | 271 days ago | IN | 0 ETH | 0.000000013239 | ||||
| Set Approval For... | 129613968 | 321 days ago | IN | 0 ETH | 0.000000183165 | ||||
| Set Approval For... | 129378171 | 326 days ago | IN | 0 ETH | 0.000002666506 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 109083675 | 796 days ago | 0.01002 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OpMagic
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/**
*Submitted for verification at optimistic.etherscan.io on 2023-09-03
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
/**
* @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);
}
// File: erc721a/contracts/ERC721A.sol
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @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)
}
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: contracts/Allure.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
contract OpMagic is ERC721A, Ownable {
uint256 public constant MAX_SUPPLY = 10000000;
uint256 public constant FREE_SUPPLY = 5;
uint256 public constant PAID_SUPPLY = 10;
uint256 private _flag;
string private _defTokenURI = "https://bafybeifpikk25j3boqvingebyubf5swp62mexkotjjeciwntuhv76fki4a.ipfs.nftstorage.link/MD";
string private _baseTokenURI = "";
mapping(address => bool) private _hasMinted;
event NewMint(address indexed msgSender, uint256 indexed mintQuantity);
constructor() ERC721A("Op Magic", "om") {
}
function _startTokenId() internal view override virtual returns (uint256) {
return 1;
}
function transferOut(address _to) public onlyOwner {
uint256 balance = address(this).balance;
payable(_to).transfer(balance);
}
function changeTokenURIFlag(uint256 flag) external onlyOwner {
_flag = flag;
}
function changeDefURI(string calldata _tokenURI) external onlyOwner {
_defTokenURI = _tokenURI;
}
function changeURI(string calldata _tokenURI) external onlyOwner {
_baseTokenURI = _tokenURI;
}
function _baseURI() internal view virtual override returns (string memory) {
return _baseTokenURI;
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
if (_flag == 0) {
return _defTokenURI;
} else {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
return string(abi.encodePacked(_baseTokenURI, Strings.toString(tokenId)));
}
}
function mint(uint256 quantity) public payable {
require(totalSupply() + quantity <= MAX_SUPPLY, "ERC721: Exceeds maximum supply");
require(quantity == 1 || quantity == FREE_SUPPLY || quantity == PAID_SUPPLY || quantity == 100 || quantity == 1000 , "ERC721: Invalid quantity");
if (quantity == 1 ) {
require(msg.value >= 0.00003 ether, "ERC721: Insufficient payment");
_safeMint(msg.sender,quantity);
} else if (quantity == FREE_SUPPLY ) {
_safeMint(msg.sender,quantity);
} else if (quantity == 100 ) {
require(msg.value >= 0.0015 ether, "ERC721: Insufficient payment");
_safeMint(msg.sender,quantity);
} else if (quantity == 1000 ) {
require(msg.value >= 0.01 ether, "ERC721: Insufficient payment");
_safeMint(msg.sender,quantity);
} else {
require(msg.value >= 0.0002 ether, "ERC721: Insufficient payment");
_safeMint(msg.sender,quantity);
}
emit NewMint(msg.sender, quantity);
}
}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":"msgSender","type":"address"},{"indexed":true,"internalType":"uint256","name":"mintQuantity","type":"uint256"}],"name":"NewMint","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":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAID_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"changeDefURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"flag","type":"uint256"}],"name":"changeTokenURIFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"_to","type":"address"}],"name":"transferOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526040518060800160405280605b81526020016200347a605b9139600a90816200002e91906200047d565b5060405180602001604052806000815250600b90816200004f91906200047d565b503480156200005d57600080fd5b506040518060400160405280600881526020017f4f70204d616769630000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f6f6d0000000000000000000000000000000000000000000000000000000000008152508160029081620000db91906200047d565b508060039081620000ed91906200047d565b50620000fe6200012c60201b60201c565b6000819055505050620001266200011a6200013560201b60201c565b6200013d60201b60201c565b62000564565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028557607f821691505b6020821081036200029b576200029a6200023d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003057fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c6565b620003118683620002c6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200035e62000358620003528462000329565b62000333565b62000329565b9050919050565b6000819050919050565b6200037a836200033d565b62000392620003898262000365565b848454620002d3565b825550505050565b600090565b620003a96200039a565b620003b68184846200036f565b505050565b5b81811015620003de57620003d26000826200039f565b600181019050620003bc565b5050565b601f8211156200042d57620003f781620002a1565b6200040284620002b6565b8101602085101562000412578190505b6200042a6200042185620002b6565b830182620003bb565b50505b505050565b600082821c905092915050565b6000620004526000198460080262000432565b1980831691505092915050565b60006200046d83836200043f565b9150826002028217905092915050565b620004888262000203565b67ffffffffffffffff811115620004a457620004a36200020e565b5b620004b082546200026c565b620004bd828285620003e2565b600060209050601f831160018114620004f55760008415620004e0578287015190505b620004ec85826200045f565b8655506200055c565b601f1984166200050586620002a1565b60005b828110156200052f5784890151825560018201915060208501945060208101905062000508565b868310156200054f57848901516200054b601f8916826200043f565b8355505b6001600288020188555050505b505050505050565b612f0680620005746000396000f3fe6080604052600436106101665760003560e01c8063715018a6116100d1578063a22cb4651161008a578063e5e01c1111610064578063e5e01c11146104e5578063e985e9c51461050e578063f2fde38b1461054b578063fe878b1d1461057457610166565b8063a22cb46514610463578063b88d4fde1461048c578063c87b56dd146104a857610166565b8063715018a6146103865780638da5cb5b1461039d57806395d89b41146103c85780639858cf19146103f35780639894ba7c1461041e578063a0712d681461044757610166565b806323b872dd1161012357806323b872dd1461028057806332cb6b0c1461029c57806342842e0e146102c7578063528c06cc146102e35780636352211e1461030c57806370a082311461034957610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b3146102105780630e5c19191461022c57806318160ddd14610255575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190611fb5565b61059f565b60405161019f9190611ffd565b60405180910390f35b3480156101b457600080fd5b506101bd610631565b6040516101ca91906120a8565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612100565b6106c3565b604051610207919061216e565b60405180910390f35b61022a600480360381019061022591906121b5565b610742565b005b34801561023857600080fd5b50610253600480360381019061024e919061225a565b610886565b005b34801561026157600080fd5b5061026a610918565b60405161027791906122b6565b60405180910390f35b61029a600480360381019061029591906122d1565b61092f565b005b3480156102a857600080fd5b506102b1610c51565b6040516102be91906122b6565b60405180910390f35b6102e160048036038101906102dc91906122d1565b610c58565b005b3480156102ef57600080fd5b5061030a60048036038101906103059190612100565b610c78565b005b34801561031857600080fd5b50610333600480360381019061032e9190612100565b610cfe565b604051610340919061216e565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b9190612324565b610d10565b60405161037d91906122b6565b60405180910390f35b34801561039257600080fd5b5061039b610dc8565b005b3480156103a957600080fd5b506103b2610e50565b6040516103bf919061216e565b60405180910390f35b3480156103d457600080fd5b506103dd610e7a565b6040516103ea91906120a8565b60405180910390f35b3480156103ff57600080fd5b50610408610f0c565b60405161041591906122b6565b60405180910390f35b34801561042a57600080fd5b5061044560048036038101906104409190612324565b610f11565b005b610461600480360381019061045c9190612100565b610fdd565b005b34801561046f57600080fd5b5061048a6004803603810190610485919061237d565b61127d565b005b6104a660048036038101906104a191906124ed565b611388565b005b3480156104b457600080fd5b506104cf60048036038101906104ca9190612100565b6113fb565b6040516104dc91906120a8565b60405180910390f35b3480156104f157600080fd5b5061050c6004803603810190610507919061225a565b611514565b005b34801561051a57600080fd5b5061053560048036038101906105309190612570565b6115a6565b6040516105429190611ffd565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190612324565b61163a565b005b34801561058057600080fd5b50610589611731565b60405161059691906122b6565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105fa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061062a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610640906125df565b80601f016020809104026020016040519081016040528092919081815260200182805461066c906125df565b80156106b95780601f1061068e576101008083540402835291602001916106b9565b820191906000526020600020905b81548152906001019060200180831161069c57829003601f168201915b5050505050905090565b60006106ce82611736565b610704576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074d82610cfe565b90508073ffffffffffffffffffffffffffffffffffffffff1661076e611795565b73ffffffffffffffffffffffffffffffffffffffff16146107d15761079a81610795611795565b6115a6565b6107d0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61088e61179d565b73ffffffffffffffffffffffffffffffffffffffff166108ac610e50565b73ffffffffffffffffffffffffffffffffffffffff1614610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f99061265c565b60405180910390fd5b8181600a9182610913929190612833565b505050565b60006109226117a5565b6001546000540303905090565b600061093a826117ae565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109a1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806109ad8461187a565b915091506109c381876109be611795565b6118a1565b610a0f576109d8866109d3611795565b6115a6565b610a0e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610a75576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a8286868660016118e5565b8015610a8d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b5b85610b378888876118eb565b7c020000000000000000000000000000000000000000000000000000000017611913565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610be15760006001850190506000600460008381526020019081526020016000205403610bdf576000548114610bde578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c49868686600161193e565b505050505050565b6298968081565b610c7383838360405180602001604052806000815250611388565b505050565b610c8061179d565b73ffffffffffffffffffffffffffffffffffffffff16610c9e610e50565b73ffffffffffffffffffffffffffffffffffffffff1614610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb9061265c565b60405180910390fd5b8060098190555050565b6000610d09826117ae565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d77576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610dd061179d565b73ffffffffffffffffffffffffffffffffffffffff16610dee610e50565b73ffffffffffffffffffffffffffffffffffffffff1614610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b9061265c565b60405180910390fd5b610e4e6000611944565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e89906125df565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb5906125df565b8015610f025780601f10610ed757610100808354040283529160200191610f02565b820191906000526020600020905b815481529060010190602001808311610ee557829003601f168201915b5050505050905090565b600581565b610f1961179d565b73ffffffffffffffffffffffffffffffffffffffff16610f37610e50565b73ffffffffffffffffffffffffffffffffffffffff1614610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f849061265c565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fd8573d6000803e3d6000fd5b505050565b6298968081610fea610918565b610ff49190612932565b1115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c906129b2565b60405180910390fd5b60018114806110445750600581145b8061104f5750600a81145b8061105a5750606481145b8061106657506103e881145b6110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90612a1e565b60405180910390fd5b6001810361110557651b48eb57e0003410156110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90612a8a565b60405180910390fd5b6111003382611a0a565b611236565b6005810361111c576111173382611a0a565b611235565b6064810361117d576605543df729c00034101561116e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116590612a8a565b60405180910390fd5b6111783382611a0a565b611234565b6103e881036111df57662386f26fc100003410156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790612a8a565b60405180910390fd5b6111da3382611a0a565b611233565b65b5e620f48000341015611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f90612a8a565b60405180910390fd5b6112323382611a0a565b5b5b5b5b803373ffffffffffffffffffffffffffffffffffffffff167f52277f0b4a9b555c5aa96900a13546f972bda413737ec164aac947c87eec602460405160405180910390a350565b806007600061128a611795565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611337611795565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161137c9190611ffd565b60405180910390a35050565b61139384848461092f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113f5576113be84848484611a28565b6113f4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060006009540361149957600a8054611414906125df565b80601f0160208091040260200160405190810160405280929190818152602001828054611440906125df565b801561148d5780601f106114625761010080835404028352916020019161148d565b820191906000526020600020905b81548152906001019060200180831161147057829003601f168201915b5050505050905061150f565b6114a282611736565b6114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890612b1c565b60405180910390fd5b600b6114ec83611b78565b6040516020016114fd929190612bfb565b60405160208183030381529060405290505b919050565b61151c61179d565b73ffffffffffffffffffffffffffffffffffffffff1661153a610e50565b73ffffffffffffffffffffffffffffffffffffffff1614611590576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115879061265c565b60405180910390fd5b8181600b91826115a1929190612833565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61164261179d565b73ffffffffffffffffffffffffffffffffffffffff16611660610e50565b73ffffffffffffffffffffffffffffffffffffffff16146116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad9061265c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c90612c91565b60405180910390fd5b61172e81611944565b50565b600a81565b6000816117416117a5565b11158015611750575060005482105b801561178e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b600080829050806117bd6117a5565b11611843576000548110156118425760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611840575b6000810361183657600460008360019003935083815260200190815260200160002054905061180c565b8092505050611875565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611902868684611cd8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611a24828260405180602001604052806000815250611ce1565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a4e611795565b8786866040518563ffffffff1660e01b8152600401611a709493929190612d06565b6020604051808303816000875af1925050508015611aac57506040513d601f19601f82011682018060405250810190611aa99190612d67565b60015b611b25573d8060008114611adc576040519150601f19603f3d011682016040523d82523d6000602084013e611ae1565b606091505b506000815103611b1d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611bbf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611cd3565b600082905060005b60008214611bf1578080611bda90612d94565b915050600a82611bea9190612e0b565b9150611bc7565b60008167ffffffffffffffff811115611c0d57611c0c6123c2565b5b6040519080825280601f01601f191660200182016040528015611c3f5781602001600182028036833780820191505090505b5090505b60008514611ccc57600182611c589190612e3c565b9150600a85611c679190612e70565b6030611c739190612932565b60f81b818381518110611c8957611c88612ea1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611cc59190612e0b565b9450611c43565b8093505050505b919050565b60009392505050565b611ceb8383611d7e565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d7957600080549050600083820390505b611d2b6000868380600101945086611a28565b611d61576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611d18578160005414611d7657600080fd5b50505b505050565b60008054905060008203611dbe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dcb60008483856118e5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611e4283611e3360008660006118eb565b611e3c85611f39565b17611913565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611ee357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611ea8565b5060008203611f1e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611f34600084838561193e565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f9281611f5d565b8114611f9d57600080fd5b50565b600081359050611faf81611f89565b92915050565b600060208284031215611fcb57611fca611f53565b5b6000611fd984828501611fa0565b91505092915050565b60008115159050919050565b611ff781611fe2565b82525050565b60006020820190506120126000830184611fee565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612052578082015181840152602081019050612037565b60008484015250505050565b6000601f19601f8301169050919050565b600061207a82612018565b6120848185612023565b9350612094818560208601612034565b61209d8161205e565b840191505092915050565b600060208201905081810360008301526120c2818461206f565b905092915050565b6000819050919050565b6120dd816120ca565b81146120e857600080fd5b50565b6000813590506120fa816120d4565b92915050565b60006020828403121561211657612115611f53565b5b6000612124848285016120eb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121588261212d565b9050919050565b6121688161214d565b82525050565b6000602082019050612183600083018461215f565b92915050565b6121928161214d565b811461219d57600080fd5b50565b6000813590506121af81612189565b92915050565b600080604083850312156121cc576121cb611f53565b5b60006121da858286016121a0565b92505060206121eb858286016120eb565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261221a576122196121f5565b5b8235905067ffffffffffffffff811115612237576122366121fa565b5b602083019150836001820283011115612253576122526121ff565b5b9250929050565b6000806020838503121561227157612270611f53565b5b600083013567ffffffffffffffff81111561228f5761228e611f58565b5b61229b85828601612204565b92509250509250929050565b6122b0816120ca565b82525050565b60006020820190506122cb60008301846122a7565b92915050565b6000806000606084860312156122ea576122e9611f53565b5b60006122f8868287016121a0565b9350506020612309868287016121a0565b925050604061231a868287016120eb565b9150509250925092565b60006020828403121561233a57612339611f53565b5b6000612348848285016121a0565b91505092915050565b61235a81611fe2565b811461236557600080fd5b50565b60008135905061237781612351565b92915050565b6000806040838503121561239457612393611f53565b5b60006123a2858286016121a0565b92505060206123b385828601612368565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123fa8261205e565b810181811067ffffffffffffffff82111715612419576124186123c2565b5b80604052505050565b600061242c611f49565b905061243882826123f1565b919050565b600067ffffffffffffffff821115612458576124576123c2565b5b6124618261205e565b9050602081019050919050565b82818337600083830152505050565b600061249061248b8461243d565b612422565b9050828152602081018484840111156124ac576124ab6123bd565b5b6124b784828561246e565b509392505050565b600082601f8301126124d4576124d36121f5565b5b81356124e484826020860161247d565b91505092915050565b6000806000806080858703121561250757612506611f53565b5b6000612515878288016121a0565b9450506020612526878288016121a0565b9350506040612537878288016120eb565b925050606085013567ffffffffffffffff81111561255857612557611f58565b5b612564878288016124bf565b91505092959194509250565b6000806040838503121561258757612586611f53565b5b6000612595858286016121a0565b92505060206125a6858286016121a0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806125f757607f821691505b60208210810361260a576126096125b0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612646602083612023565b915061265182612610565b602082019050919050565b6000602082019050818103600083015261267581612639565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026126e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826126ac565b6126f386836126ac565b95508019841693508086168417925050509392505050565b6000819050919050565b600061273061272b612726846120ca565b61270b565b6120ca565b9050919050565b6000819050919050565b61274a83612715565b61275e61275682612737565b8484546126b9565b825550505050565b600090565b612773612766565b61277e818484612741565b505050565b5b818110156127a25761279760008261276b565b600181019050612784565b5050565b601f8211156127e7576127b881612687565b6127c18461269c565b810160208510156127d0578190505b6127e46127dc8561269c565b830182612783565b50505b505050565b600082821c905092915050565b600061280a600019846008026127ec565b1980831691505092915050565b600061282383836127f9565b9150826002028217905092915050565b61283d838361267c565b67ffffffffffffffff811115612856576128556123c2565b5b61286082546125df565b61286b8282856127a6565b6000601f83116001811461289a5760008415612888578287013590505b6128928582612817565b8655506128fa565b601f1984166128a886612687565b60005b828110156128d0578489013582556001820191506020850194506020810190506128ab565b868310156128ed57848901356128e9601f8916826127f9565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061293d826120ca565b9150612948836120ca565b92508282019050808211156129605761295f612903565b5b92915050565b7f4552433732313a2045786365656473206d6178696d756d20737570706c790000600082015250565b600061299c601e83612023565b91506129a782612966565b602082019050919050565b600060208201905081810360008301526129cb8161298f565b9050919050565b7f4552433732313a20496e76616c6964207175616e746974790000000000000000600082015250565b6000612a08601883612023565b9150612a13826129d2565b602082019050919050565b60006020820190508181036000830152612a37816129fb565b9050919050565b7f4552433732313a20496e73756666696369656e74207061796d656e7400000000600082015250565b6000612a74601c83612023565b9150612a7f82612a3e565b602082019050919050565b60006020820190508181036000830152612aa381612a67565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612b06602f83612023565b9150612b1182612aaa565b604082019050919050565b60006020820190508181036000830152612b3581612af9565b9050919050565b600081905092915050565b60008154612b54816125df565b612b5e8186612b3c565b94506001821660008114612b795760018114612b8e57612bc1565b60ff1983168652811515820286019350612bc1565b612b9785612687565b60005b83811015612bb957815481890152600182019150602081019050612b9a565b838801955050505b50505092915050565b6000612bd582612018565b612bdf8185612b3c565b9350612bef818560208601612034565b80840191505092915050565b6000612c078285612b47565b9150612c138284612bca565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c7b602683612023565b9150612c8682612c1f565b604082019050919050565b60006020820190508181036000830152612caa81612c6e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612cd882612cb1565b612ce28185612cbc565b9350612cf2818560208601612034565b612cfb8161205e565b840191505092915050565b6000608082019050612d1b600083018761215f565b612d28602083018661215f565b612d3560408301856122a7565b8181036060830152612d478184612ccd565b905095945050505050565b600081519050612d6181611f89565b92915050565b600060208284031215612d7d57612d7c611f53565b5b6000612d8b84828501612d52565b91505092915050565b6000612d9f826120ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612dd157612dd0612903565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e16826120ca565b9150612e21836120ca565b925082612e3157612e30612ddc565b5b828204905092915050565b6000612e47826120ca565b9150612e52836120ca565b9250828203905081811115612e6a57612e69612903565b5b92915050565b6000612e7b826120ca565b9150612e86836120ca565b925082612e9657612e95612ddc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220e95c4625326bf3645c7493fbaab1883e7b15cc4b4afa06eacddb662ac71b692464736f6c6343000812003368747470733a2f2f626166796265696670696b6b32356a33626f7176696e676562797562663573777036326d65786b6f746a6a656369776e747568763736666b6934612e697066732e6e667473746f726167652e6c696e6b2f4d44
Deployed Bytecode
0x6080604052600436106101665760003560e01c8063715018a6116100d1578063a22cb4651161008a578063e5e01c1111610064578063e5e01c11146104e5578063e985e9c51461050e578063f2fde38b1461054b578063fe878b1d1461057457610166565b8063a22cb46514610463578063b88d4fde1461048c578063c87b56dd146104a857610166565b8063715018a6146103865780638da5cb5b1461039d57806395d89b41146103c85780639858cf19146103f35780639894ba7c1461041e578063a0712d681461044757610166565b806323b872dd1161012357806323b872dd1461028057806332cb6b0c1461029c57806342842e0e146102c7578063528c06cc146102e35780636352211e1461030c57806370a082311461034957610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b3146102105780630e5c19191461022c57806318160ddd14610255575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190611fb5565b61059f565b60405161019f9190611ffd565b60405180910390f35b3480156101b457600080fd5b506101bd610631565b6040516101ca91906120a8565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612100565b6106c3565b604051610207919061216e565b60405180910390f35b61022a600480360381019061022591906121b5565b610742565b005b34801561023857600080fd5b50610253600480360381019061024e919061225a565b610886565b005b34801561026157600080fd5b5061026a610918565b60405161027791906122b6565b60405180910390f35b61029a600480360381019061029591906122d1565b61092f565b005b3480156102a857600080fd5b506102b1610c51565b6040516102be91906122b6565b60405180910390f35b6102e160048036038101906102dc91906122d1565b610c58565b005b3480156102ef57600080fd5b5061030a60048036038101906103059190612100565b610c78565b005b34801561031857600080fd5b50610333600480360381019061032e9190612100565b610cfe565b604051610340919061216e565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b9190612324565b610d10565b60405161037d91906122b6565b60405180910390f35b34801561039257600080fd5b5061039b610dc8565b005b3480156103a957600080fd5b506103b2610e50565b6040516103bf919061216e565b60405180910390f35b3480156103d457600080fd5b506103dd610e7a565b6040516103ea91906120a8565b60405180910390f35b3480156103ff57600080fd5b50610408610f0c565b60405161041591906122b6565b60405180910390f35b34801561042a57600080fd5b5061044560048036038101906104409190612324565b610f11565b005b610461600480360381019061045c9190612100565b610fdd565b005b34801561046f57600080fd5b5061048a6004803603810190610485919061237d565b61127d565b005b6104a660048036038101906104a191906124ed565b611388565b005b3480156104b457600080fd5b506104cf60048036038101906104ca9190612100565b6113fb565b6040516104dc91906120a8565b60405180910390f35b3480156104f157600080fd5b5061050c6004803603810190610507919061225a565b611514565b005b34801561051a57600080fd5b5061053560048036038101906105309190612570565b6115a6565b6040516105429190611ffd565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190612324565b61163a565b005b34801561058057600080fd5b50610589611731565b60405161059691906122b6565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105fa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061062a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610640906125df565b80601f016020809104026020016040519081016040528092919081815260200182805461066c906125df565b80156106b95780601f1061068e576101008083540402835291602001916106b9565b820191906000526020600020905b81548152906001019060200180831161069c57829003601f168201915b5050505050905090565b60006106ce82611736565b610704576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074d82610cfe565b90508073ffffffffffffffffffffffffffffffffffffffff1661076e611795565b73ffffffffffffffffffffffffffffffffffffffff16146107d15761079a81610795611795565b6115a6565b6107d0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61088e61179d565b73ffffffffffffffffffffffffffffffffffffffff166108ac610e50565b73ffffffffffffffffffffffffffffffffffffffff1614610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f99061265c565b60405180910390fd5b8181600a9182610913929190612833565b505050565b60006109226117a5565b6001546000540303905090565b600061093a826117ae565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109a1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806109ad8461187a565b915091506109c381876109be611795565b6118a1565b610a0f576109d8866109d3611795565b6115a6565b610a0e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610a75576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a8286868660016118e5565b8015610a8d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b5b85610b378888876118eb565b7c020000000000000000000000000000000000000000000000000000000017611913565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610be15760006001850190506000600460008381526020019081526020016000205403610bdf576000548114610bde578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c49868686600161193e565b505050505050565b6298968081565b610c7383838360405180602001604052806000815250611388565b505050565b610c8061179d565b73ffffffffffffffffffffffffffffffffffffffff16610c9e610e50565b73ffffffffffffffffffffffffffffffffffffffff1614610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb9061265c565b60405180910390fd5b8060098190555050565b6000610d09826117ae565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d77576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610dd061179d565b73ffffffffffffffffffffffffffffffffffffffff16610dee610e50565b73ffffffffffffffffffffffffffffffffffffffff1614610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b9061265c565b60405180910390fd5b610e4e6000611944565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e89906125df565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb5906125df565b8015610f025780601f10610ed757610100808354040283529160200191610f02565b820191906000526020600020905b815481529060010190602001808311610ee557829003601f168201915b5050505050905090565b600581565b610f1961179d565b73ffffffffffffffffffffffffffffffffffffffff16610f37610e50565b73ffffffffffffffffffffffffffffffffffffffff1614610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f849061265c565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fd8573d6000803e3d6000fd5b505050565b6298968081610fea610918565b610ff49190612932565b1115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c906129b2565b60405180910390fd5b60018114806110445750600581145b8061104f5750600a81145b8061105a5750606481145b8061106657506103e881145b6110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90612a1e565b60405180910390fd5b6001810361110557651b48eb57e0003410156110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90612a8a565b60405180910390fd5b6111003382611a0a565b611236565b6005810361111c576111173382611a0a565b611235565b6064810361117d576605543df729c00034101561116e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116590612a8a565b60405180910390fd5b6111783382611a0a565b611234565b6103e881036111df57662386f26fc100003410156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790612a8a565b60405180910390fd5b6111da3382611a0a565b611233565b65b5e620f48000341015611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f90612a8a565b60405180910390fd5b6112323382611a0a565b5b5b5b5b803373ffffffffffffffffffffffffffffffffffffffff167f52277f0b4a9b555c5aa96900a13546f972bda413737ec164aac947c87eec602460405160405180910390a350565b806007600061128a611795565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611337611795565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161137c9190611ffd565b60405180910390a35050565b61139384848461092f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113f5576113be84848484611a28565b6113f4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060006009540361149957600a8054611414906125df565b80601f0160208091040260200160405190810160405280929190818152602001828054611440906125df565b801561148d5780601f106114625761010080835404028352916020019161148d565b820191906000526020600020905b81548152906001019060200180831161147057829003601f168201915b5050505050905061150f565b6114a282611736565b6114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890612b1c565b60405180910390fd5b600b6114ec83611b78565b6040516020016114fd929190612bfb565b60405160208183030381529060405290505b919050565b61151c61179d565b73ffffffffffffffffffffffffffffffffffffffff1661153a610e50565b73ffffffffffffffffffffffffffffffffffffffff1614611590576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115879061265c565b60405180910390fd5b8181600b91826115a1929190612833565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61164261179d565b73ffffffffffffffffffffffffffffffffffffffff16611660610e50565b73ffffffffffffffffffffffffffffffffffffffff16146116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad9061265c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c90612c91565b60405180910390fd5b61172e81611944565b50565b600a81565b6000816117416117a5565b11158015611750575060005482105b801561178e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b600080829050806117bd6117a5565b11611843576000548110156118425760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611840575b6000810361183657600460008360019003935083815260200190815260200160002054905061180c565b8092505050611875565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611902868684611cd8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611a24828260405180602001604052806000815250611ce1565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a4e611795565b8786866040518563ffffffff1660e01b8152600401611a709493929190612d06565b6020604051808303816000875af1925050508015611aac57506040513d601f19601f82011682018060405250810190611aa99190612d67565b60015b611b25573d8060008114611adc576040519150601f19603f3d011682016040523d82523d6000602084013e611ae1565b606091505b506000815103611b1d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611bbf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611cd3565b600082905060005b60008214611bf1578080611bda90612d94565b915050600a82611bea9190612e0b565b9150611bc7565b60008167ffffffffffffffff811115611c0d57611c0c6123c2565b5b6040519080825280601f01601f191660200182016040528015611c3f5781602001600182028036833780820191505090505b5090505b60008514611ccc57600182611c589190612e3c565b9150600a85611c679190612e70565b6030611c739190612932565b60f81b818381518110611c8957611c88612ea1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611cc59190612e0b565b9450611c43565b8093505050505b919050565b60009392505050565b611ceb8383611d7e565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d7957600080549050600083820390505b611d2b6000868380600101945086611a28565b611d61576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611d18578160005414611d7657600080fd5b50505b505050565b60008054905060008203611dbe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dcb60008483856118e5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611e4283611e3360008660006118eb565b611e3c85611f39565b17611913565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611ee357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611ea8565b5060008203611f1e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611f34600084838561193e565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f9281611f5d565b8114611f9d57600080fd5b50565b600081359050611faf81611f89565b92915050565b600060208284031215611fcb57611fca611f53565b5b6000611fd984828501611fa0565b91505092915050565b60008115159050919050565b611ff781611fe2565b82525050565b60006020820190506120126000830184611fee565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612052578082015181840152602081019050612037565b60008484015250505050565b6000601f19601f8301169050919050565b600061207a82612018565b6120848185612023565b9350612094818560208601612034565b61209d8161205e565b840191505092915050565b600060208201905081810360008301526120c2818461206f565b905092915050565b6000819050919050565b6120dd816120ca565b81146120e857600080fd5b50565b6000813590506120fa816120d4565b92915050565b60006020828403121561211657612115611f53565b5b6000612124848285016120eb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121588261212d565b9050919050565b6121688161214d565b82525050565b6000602082019050612183600083018461215f565b92915050565b6121928161214d565b811461219d57600080fd5b50565b6000813590506121af81612189565b92915050565b600080604083850312156121cc576121cb611f53565b5b60006121da858286016121a0565b92505060206121eb858286016120eb565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261221a576122196121f5565b5b8235905067ffffffffffffffff811115612237576122366121fa565b5b602083019150836001820283011115612253576122526121ff565b5b9250929050565b6000806020838503121561227157612270611f53565b5b600083013567ffffffffffffffff81111561228f5761228e611f58565b5b61229b85828601612204565b92509250509250929050565b6122b0816120ca565b82525050565b60006020820190506122cb60008301846122a7565b92915050565b6000806000606084860312156122ea576122e9611f53565b5b60006122f8868287016121a0565b9350506020612309868287016121a0565b925050604061231a868287016120eb565b9150509250925092565b60006020828403121561233a57612339611f53565b5b6000612348848285016121a0565b91505092915050565b61235a81611fe2565b811461236557600080fd5b50565b60008135905061237781612351565b92915050565b6000806040838503121561239457612393611f53565b5b60006123a2858286016121a0565b92505060206123b385828601612368565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123fa8261205e565b810181811067ffffffffffffffff82111715612419576124186123c2565b5b80604052505050565b600061242c611f49565b905061243882826123f1565b919050565b600067ffffffffffffffff821115612458576124576123c2565b5b6124618261205e565b9050602081019050919050565b82818337600083830152505050565b600061249061248b8461243d565b612422565b9050828152602081018484840111156124ac576124ab6123bd565b5b6124b784828561246e565b509392505050565b600082601f8301126124d4576124d36121f5565b5b81356124e484826020860161247d565b91505092915050565b6000806000806080858703121561250757612506611f53565b5b6000612515878288016121a0565b9450506020612526878288016121a0565b9350506040612537878288016120eb565b925050606085013567ffffffffffffffff81111561255857612557611f58565b5b612564878288016124bf565b91505092959194509250565b6000806040838503121561258757612586611f53565b5b6000612595858286016121a0565b92505060206125a6858286016121a0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806125f757607f821691505b60208210810361260a576126096125b0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612646602083612023565b915061265182612610565b602082019050919050565b6000602082019050818103600083015261267581612639565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026126e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826126ac565b6126f386836126ac565b95508019841693508086168417925050509392505050565b6000819050919050565b600061273061272b612726846120ca565b61270b565b6120ca565b9050919050565b6000819050919050565b61274a83612715565b61275e61275682612737565b8484546126b9565b825550505050565b600090565b612773612766565b61277e818484612741565b505050565b5b818110156127a25761279760008261276b565b600181019050612784565b5050565b601f8211156127e7576127b881612687565b6127c18461269c565b810160208510156127d0578190505b6127e46127dc8561269c565b830182612783565b50505b505050565b600082821c905092915050565b600061280a600019846008026127ec565b1980831691505092915050565b600061282383836127f9565b9150826002028217905092915050565b61283d838361267c565b67ffffffffffffffff811115612856576128556123c2565b5b61286082546125df565b61286b8282856127a6565b6000601f83116001811461289a5760008415612888578287013590505b6128928582612817565b8655506128fa565b601f1984166128a886612687565b60005b828110156128d0578489013582556001820191506020850194506020810190506128ab565b868310156128ed57848901356128e9601f8916826127f9565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061293d826120ca565b9150612948836120ca565b92508282019050808211156129605761295f612903565b5b92915050565b7f4552433732313a2045786365656473206d6178696d756d20737570706c790000600082015250565b600061299c601e83612023565b91506129a782612966565b602082019050919050565b600060208201905081810360008301526129cb8161298f565b9050919050565b7f4552433732313a20496e76616c6964207175616e746974790000000000000000600082015250565b6000612a08601883612023565b9150612a13826129d2565b602082019050919050565b60006020820190508181036000830152612a37816129fb565b9050919050565b7f4552433732313a20496e73756666696369656e74207061796d656e7400000000600082015250565b6000612a74601c83612023565b9150612a7f82612a3e565b602082019050919050565b60006020820190508181036000830152612aa381612a67565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612b06602f83612023565b9150612b1182612aaa565b604082019050919050565b60006020820190508181036000830152612b3581612af9565b9050919050565b600081905092915050565b60008154612b54816125df565b612b5e8186612b3c565b94506001821660008114612b795760018114612b8e57612bc1565b60ff1983168652811515820286019350612bc1565b612b9785612687565b60005b83811015612bb957815481890152600182019150602081019050612b9a565b838801955050505b50505092915050565b6000612bd582612018565b612bdf8185612b3c565b9350612bef818560208601612034565b80840191505092915050565b6000612c078285612b47565b9150612c138284612bca565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c7b602683612023565b9150612c8682612c1f565b604082019050919050565b60006020820190508181036000830152612caa81612c6e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612cd882612cb1565b612ce28185612cbc565b9350612cf2818560208601612034565b612cfb8161205e565b840191505092915050565b6000608082019050612d1b600083018761215f565b612d28602083018661215f565b612d3560408301856122a7565b8181036060830152612d478184612ccd565b905095945050505050565b600081519050612d6181611f89565b92915050565b600060208284031215612d7d57612d7c611f53565b5b6000612d8b84828501612d52565b91505092915050565b6000612d9f826120ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612dd157612dd0612903565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e16826120ca565b9150612e21836120ca565b925082612e3157612e30612ddc565b5b828204905092915050565b6000612e47826120ca565b9150612e52836120ca565b9250828203905081811115612e6a57612e69612903565b5b92915050565b6000612e7b826120ca565b9150612e86836120ca565b925082612e9657612e95612ddc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220e95c4625326bf3645c7493fbaab1883e7b15cc4b4afa06eacddb662ac71b692464736f6c63430008120033
Deployed Bytecode Sourcemap
57058:2771:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18340:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19242:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25733:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25166:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58005:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14993:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29372:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57104:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32293:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57905:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20635:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16177:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56101:103;;;;;;;;;;;;;:::i;:::-;;55450:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19418:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57156:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57747:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58728:1096;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26291:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33084:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58363:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58124:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26682:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56359:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57202:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18340:639;18425:4;18764:10;18749:25;;:11;:25;;;;:102;;;;18841:10;18826:25;;:11;:25;;;;18749:102;:179;;;;18918:10;18903:25;;:11;:25;;;;18749:179;18729:199;;18340:639;;;:::o;19242:100::-;19296:13;19329:5;19322:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19242:100;:::o;25733:218::-;25809:7;25834:16;25842:7;25834;:16::i;:::-;25829:64;;25859:34;;;;;;;;;;;;;;25829:64;25913:15;:24;25929:7;25913:24;;;;;;;;;;;:30;;;;;;;;;;;;25906:37;;25733:218;;;:::o;25166:408::-;25255:13;25271:16;25279:7;25271;:16::i;:::-;25255:32;;25327:5;25304:28;;:19;:17;:19::i;:::-;:28;;;25300:175;;25352:44;25369:5;25376:19;:17;:19::i;:::-;25352:16;:44::i;:::-;25347:128;;25424:35;;;;;;;;;;;;;;25347:128;25300:175;25520:2;25487:15;:24;25503:7;25487:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25558:7;25554:2;25538:28;;25547:5;25538:28;;;;;;;;;;;;25244:330;25166:408;;:::o;58005:111::-;55681:12;:10;:12::i;:::-;55670:23;;:7;:5;:7::i;:::-;:23;;;55662:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58099:9:::1;;58084:12;:24;;;;;;;:::i;:::-;;58005:111:::0;;:::o;14993:323::-;15054:7;15282:15;:13;:15::i;:::-;15267:12;;15251:13;;:28;:46;15244:53;;14993:323;:::o;29372:2825::-;29514:27;29544;29563:7;29544:18;:27::i;:::-;29514:57;;29629:4;29588:45;;29604:19;29588:45;;;29584:86;;29642:28;;;;;;;;;;;;;;29584:86;29684:27;29713:23;29740:35;29767:7;29740:26;:35::i;:::-;29683:92;;;;29875:68;29900:15;29917:4;29923:19;:17;:19::i;:::-;29875:24;:68::i;:::-;29870:180;;29963:43;29980:4;29986:19;:17;:19::i;:::-;29963:16;:43::i;:::-;29958:92;;30015:35;;;;;;;;;;;;;;29958:92;29870:180;30081:1;30067:16;;:2;:16;;;30063:52;;30092:23;;;;;;;;;;;;;;30063:52;30128:43;30150:4;30156:2;30160:7;30169:1;30128:21;:43::i;:::-;30264:15;30261:160;;;30404:1;30383:19;30376:30;30261:160;30801:18;:24;30820:4;30801:24;;;;;;;;;;;;;;;;30799:26;;;;;;;;;;;;30870:18;:22;30889:2;30870:22;;;;;;;;;;;;;;;;30868:24;;;;;;;;;;;31192:146;31229:2;31278:45;31293:4;31299:2;31303:19;31278:14;:45::i;:::-;11392:8;31250:73;31192:18;:146::i;:::-;31163:17;:26;31181:7;31163:26;;;;;;;;;;;:175;;;;31509:1;11392:8;31458:19;:47;:52;31454:627;;31531:19;31563:1;31553:7;:11;31531:33;;31720:1;31686:17;:30;31704:11;31686:30;;;;;;;;;;;;:35;31682:384;;31824:13;;31809:11;:28;31805:242;;32004:19;31971:17;:30;31989:11;31971:30;;;;;;;;;;;:52;;;;31805:242;31682:384;31512:569;31454:627;32128:7;32124:2;32109:27;;32118:4;32109:27;;;;;;;;;;;;32147:42;32168:4;32174:2;32178:7;32187:1;32147:20;:42::i;:::-;29503:2694;;;29372:2825;;;:::o;57104:45::-;57141:8;57104:45;:::o;32293:193::-;32439:39;32456:4;32462:2;32466:7;32439:39;;;;;;;;;;;;:16;:39::i;:::-;32293:193;;;:::o;57905:92::-;55681:12;:10;:12::i;:::-;55670:23;;:7;:5;:7::i;:::-;:23;;;55662:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57985:4:::1;57977:5;:12;;;;57905:92:::0;:::o;20635:152::-;20707:7;20750:27;20769:7;20750:18;:27::i;:::-;20727:52;;20635:152;;;:::o;16177:233::-;16249:7;16290:1;16273:19;;:5;:19;;;16269:60;;16301:28;;;;;;;;;;;;;;16269:60;10336:13;16347:18;:25;16366:5;16347:25;;;;;;;;;;;;;;;;:55;16340:62;;16177:233;;;:::o;56101:103::-;55681:12;:10;:12::i;:::-;55670:23;;:7;:5;:7::i;:::-;:23;;;55662:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56166:30:::1;56193:1;56166:18;:30::i;:::-;56101:103::o:0;55450:87::-;55496:7;55523:6;;;;;;;;;;;55516:13;;55450:87;:::o;19418:104::-;19474:13;19507:7;19500:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19418:104;:::o;57156:39::-;57194:1;57156:39;:::o;57747:150::-;55681:12;:10;:12::i;:::-;55670:23;;:7;:5;:7::i;:::-;:23;;;55662:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57809:15:::1;57827:21;57809:39;;57867:3;57859:21;;:30;57881:7;57859:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57798:99;57747:150:::0;:::o;58728:1096::-;57141:8;58810;58794:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;58786:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58898:1;58886:8;:13;:40;;;;57194:1;58903:8;:23;58886:40;:67;;;;57240:2;58930:8;:23;58886:67;:86;;;;58969:3;58957:8;:15;58886:86;:106;;;;58988:4;58976:8;:16;58886:106;58878:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;59051:1;59039:8;:13;59035:727;;59091:13;59078:9;:26;;59070:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59152:30;59162:10;59173:8;59152:9;:30::i;:::-;59035:727;;;57194:1;59204:8;:23;59200:562;;59245:30;59255:10;59266:8;59245:9;:30::i;:::-;59200:562;;;59309:3;59297:8;:15;59293:469;;59351:12;59338:9;:25;;59330:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59411:30;59421:10;59432:8;59411:9;:30::i;:::-;59293:469;;;59475:4;59463:8;:16;59459:303;;59518:10;59505:9;:23;;59497:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59576:30;59586:10;59597:8;59576:9;:30::i;:::-;59459:303;;;59660:12;59647:9;:25;;59639:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59720:30;59730:10;59741:8;59720:9;:30::i;:::-;59459:303;59293:469;59200:562;59035:727;59807:8;59795:10;59787:29;;;;;;;;;;;;58728:1096;:::o;26291:234::-;26438:8;26386:18;:39;26405:19;:17;:19::i;:::-;26386:39;;;;;;;;;;;;;;;:49;26426:8;26386:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26498:8;26462:55;;26477:19;:17;:19::i;:::-;26462:55;;;26508:8;26462:55;;;;;;:::i;:::-;;;;;;;;26291:234;;:::o;33084:407::-;33259:31;33272:4;33278:2;33282:7;33259:12;:31::i;:::-;33323:1;33305:2;:14;;;:19;33301:183;;33344:56;33375:4;33381:2;33385:7;33394:5;33344:30;:56::i;:::-;33339:145;;33428:40;;;;;;;;;;;;;;33339:145;33301:183;33084:407;;;;:::o;58363:357::-;58428:13;58467:1;58458:5;;:10;58454:259;;58492:12;58485:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58454:259;58545:16;58553:7;58545;:16::i;:::-;58537:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;58659:13;58674:25;58691:7;58674:16;:25::i;:::-;58642:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58628:73;;58363:357;;;;:::o;58124:109::-;55681:12;:10;:12::i;:::-;55670:23;;:7;:5;:7::i;:::-;:23;;;55662:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58216:9:::1;;58200:13;:25;;;;;;;:::i;:::-;;58124:109:::0;;:::o;26682:164::-;26779:4;26803:18;:25;26822:5;26803:25;;;;;;;;;;;;;;;:35;26829:8;26803:35;;;;;;;;;;;;;;;;;;;;;;;;;26796:42;;26682:164;;;;:::o;56359:201::-;55681:12;:10;:12::i;:::-;55670:23;;:7;:5;:7::i;:::-;:23;;;55662:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56468:1:::1;56448:22;;:8;:22;;::::0;56440:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56524:28;56543:8;56524:18;:28::i;:::-;56359:201:::0;:::o;57202:40::-;57240:2;57202:40;:::o;27104:282::-;27169:4;27225:7;27206:15;:13;:15::i;:::-;:26;;:66;;;;;27259:13;;27249:7;:23;27206:66;:153;;;;;27358:1;11112:8;27310:17;:26;27328:7;27310:26;;;;;;;;;;;;:44;:49;27206:153;27186:173;;27104:282;;;:::o;49412:105::-;49472:7;49499:10;49492:17;;49412:105;:::o;54174:98::-;54227:7;54254:10;54247:17;;54174:98;:::o;57638:101::-;57703:7;57730:1;57723:8;;57638:101;:::o;21790:1275::-;21857:7;21877:12;21892:7;21877:22;;21960:4;21941:15;:13;:15::i;:::-;:23;21937:1061;;21994:13;;21987:4;:20;21983:1015;;;22032:14;22049:17;:23;22067:4;22049:23;;;;;;;;;;;;22032:40;;22166:1;11112:8;22138:6;:24;:29;22134:845;;22803:113;22820:1;22810:6;:11;22803:113;;22863:17;:25;22881:6;;;;;;;22863:25;;;;;;;;;;;;22854:34;;22803:113;;;22949:6;22942:13;;;;;;22134:845;22009:989;21983:1015;21937:1061;23026:31;;;;;;;;;;;;;;21790:1275;;;;:::o;28267:485::-;28369:27;28398:23;28439:38;28480:15;:24;28496:7;28480:24;;;;;;;;;;;28439:65;;28657:18;28634:41;;28714:19;28708:26;28689:45;;28619:126;28267:485;;;:::o;27495:659::-;27644:11;27809:16;27802:5;27798:28;27789:37;;27969:16;27958:9;27954:32;27941:45;;28119:15;28108:9;28105:30;28097:5;28086:9;28083:20;28080:56;28070:66;;27495:659;;;;;:::o;34153:159::-;;;;;:::o;48721:311::-;48856:7;48876:16;11516:3;48902:19;:41;;48876:68;;11516:3;48970:31;48981:4;48987:2;48991:9;48970:10;:31::i;:::-;48962:40;;:62;;48955:69;;;48721:311;;;;;:::o;23613:450::-;23693:14;23861:16;23854:5;23850:28;23841:37;;24038:5;24024:11;23999:23;23995:41;23992:52;23985:5;23982:63;23972:73;;23613:450;;;;:::o;34977:158::-;;;;;:::o;56720:191::-;56794:16;56813:6;;;;;;;;;;;56794:25;;56839:8;56830:6;;:17;;;;;;;;;;;;;;;;;;56894:8;56863:40;;56884:8;56863:40;;;;;;;;;;;;56783:128;56720:191;:::o;43244:112::-;43321:27;43331:2;43335:8;43321:27;;;;;;;;;;;;:9;:27::i;:::-;43244:112;;:::o;35575:716::-;35738:4;35784:2;35759:45;;;35805:19;:17;:19::i;:::-;35826:4;35832:7;35841:5;35759:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35755:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36059:1;36042:6;:13;:18;36038:235;;36088:40;;;;;;;;;;;;;;36038:235;36231:6;36225:13;36216:6;36212:2;36208:15;36201:38;35755:529;35928:54;;;35918:64;;;:6;:64;;;;35911:71;;;35575:716;;;;;;:::o;51736:723::-;51792:13;52022:1;52013:5;:10;52009:53;;52040:10;;;;;;;;;;;;;;;;;;;;;52009:53;52072:12;52087:5;52072:20;;52103:14;52128:78;52143:1;52135:4;:9;52128:78;;52161:8;;;;;:::i;:::-;;;;52192:2;52184:10;;;;;:::i;:::-;;;52128:78;;;52216:19;52248:6;52238:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52216:39;;52266:154;52282:1;52273:5;:10;52266:154;;52310:1;52300:11;;;;;:::i;:::-;;;52377:2;52369:5;:10;;;;:::i;:::-;52356:2;:24;;;;:::i;:::-;52343:39;;52326:6;52333;52326:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;52406:2;52397:11;;;;;:::i;:::-;;;52266:154;;;52444:6;52430:21;;;;;51736:723;;;;:::o;48422:147::-;48559:6;48422:147;;;;;:::o;42471:689::-;42602:19;42608:2;42612:8;42602:5;:19::i;:::-;42681:1;42663:2;:14;;;:19;42659:483;;42703:11;42717:13;;42703:27;;42749:13;42771:8;42765:3;:14;42749:30;;42798:233;42829:62;42868:1;42872:2;42876:7;;;;;;42885:5;42829:30;:62::i;:::-;42824:167;;42927:40;;;;;;;;;;;;;;42824:167;43026:3;43018:5;:11;42798:233;;43113:3;43096:13;;:20;43092:34;;43118:8;;;43092:34;42684:458;;42659:483;42471:689;;;:::o;36753:2966::-;36826:20;36849:13;;36826:36;;36889:1;36877:8;:13;36873:44;;36899:18;;;;;;;;;;;;;;36873:44;36930:61;36960:1;36964:2;36968:12;36982:8;36930:21;:61::i;:::-;37474:1;10474:2;37444:1;:26;;37443:32;37431:8;:45;37405:18;:22;37424:2;37405:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37753:139;37790:2;37844:33;37867:1;37871:2;37875:1;37844:14;:33::i;:::-;37811:30;37832:8;37811:20;:30::i;:::-;:66;37753:18;:139::i;:::-;37719:17;:31;37737:12;37719:31;;;;;;;;;;;:173;;;;37909:16;37940:11;37969:8;37954:12;:23;37940:37;;38490:16;38486:2;38482:25;38470:37;;38862:12;38822:8;38781:1;38719:25;38660:1;38599;38572:335;39233:1;39219:12;39215:20;39173:346;39274:3;39265:7;39262:16;39173:346;;39492:7;39482:8;39479:1;39452:25;39449:1;39446;39441:59;39327:1;39318:7;39314:15;39303:26;;39173:346;;;39177:77;39564:1;39552:8;:13;39548:45;;39574:19;;;;;;;;;;;;;;39548:45;39626:3;39610:13;:19;;;;37179:2462;;39651:60;39680:1;39684:2;39688:12;39702:8;39651:20;:60::i;:::-;36815:2904;36753:2966;;:::o;24165:324::-;24235:14;24468:1;24458:8;24455:15;24429:24;24425:46;24415:56;;24165:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:117;5245:1;5242;5235:12;5273:553;5331:8;5341:6;5391:3;5384:4;5376:6;5372:17;5368:27;5358:122;;5399:79;;:::i;:::-;5358:122;5512:6;5499:20;5489:30;;5542:18;5534:6;5531:30;5528:117;;;5564:79;;:::i;:::-;5528:117;5678:4;5670:6;5666:17;5654:29;;5732:3;5724:4;5716:6;5712:17;5702:8;5698:32;5695:41;5692:128;;;5739:79;;:::i;:::-;5692:128;5273:553;;;;;:::o;5832:529::-;5903:6;5911;5960:2;5948:9;5939:7;5935:23;5931:32;5928:119;;;5966:79;;:::i;:::-;5928:119;6114:1;6103:9;6099:17;6086:31;6144:18;6136:6;6133:30;6130:117;;;6166:79;;:::i;:::-;6130:117;6279:65;6336:7;6327:6;6316:9;6312:22;6279:65;:::i;:::-;6261:83;;;;6057:297;5832:529;;;;;:::o;6367:118::-;6454:24;6472:5;6454:24;:::i;:::-;6449:3;6442:37;6367:118;;:::o;6491:222::-;6584:4;6622:2;6611:9;6607:18;6599:26;;6635:71;6703:1;6692:9;6688:17;6679:6;6635:71;:::i;:::-;6491:222;;;;:::o;6719:619::-;6796:6;6804;6812;6861:2;6849:9;6840:7;6836:23;6832:32;6829:119;;;6867:79;;:::i;:::-;6829:119;6987:1;7012:53;7057:7;7048:6;7037:9;7033:22;7012:53;:::i;:::-;7002:63;;6958:117;7114:2;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7085:118;7242:2;7268:53;7313:7;7304:6;7293:9;7289:22;7268:53;:::i;:::-;7258:63;;7213:118;6719:619;;;;;:::o;7344:329::-;7403:6;7452:2;7440:9;7431:7;7427:23;7423:32;7420:119;;;7458:79;;:::i;:::-;7420:119;7578:1;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7549:117;7344:329;;;;:::o;7679:116::-;7749:21;7764:5;7749:21;:::i;:::-;7742:5;7739:32;7729:60;;7785:1;7782;7775:12;7729:60;7679:116;:::o;7801:133::-;7844:5;7882:6;7869:20;7860:29;;7898:30;7922:5;7898:30;:::i;:::-;7801:133;;;;:::o;7940:468::-;8005:6;8013;8062:2;8050:9;8041:7;8037:23;8033:32;8030:119;;;8068:79;;:::i;:::-;8030:119;8188:1;8213:53;8258:7;8249:6;8238:9;8234:22;8213:53;:::i;:::-;8203:63;;8159:117;8315:2;8341:50;8383:7;8374:6;8363:9;8359:22;8341:50;:::i;:::-;8331:60;;8286:115;7940:468;;;;;:::o;8414:117::-;8523:1;8520;8513:12;8537:180;8585:77;8582:1;8575:88;8682:4;8679:1;8672:15;8706:4;8703:1;8696:15;8723:281;8806:27;8828:4;8806:27;:::i;:::-;8798:6;8794:40;8936:6;8924:10;8921:22;8900:18;8888:10;8885:34;8882:62;8879:88;;;8947:18;;:::i;:::-;8879:88;8987:10;8983:2;8976:22;8766:238;8723:281;;:::o;9010:129::-;9044:6;9071:20;;:::i;:::-;9061:30;;9100:33;9128:4;9120:6;9100:33;:::i;:::-;9010:129;;;:::o;9145:307::-;9206:4;9296:18;9288:6;9285:30;9282:56;;;9318:18;;:::i;:::-;9282:56;9356:29;9378:6;9356:29;:::i;:::-;9348:37;;9440:4;9434;9430:15;9422:23;;9145:307;;;:::o;9458:146::-;9555:6;9550:3;9545;9532:30;9596:1;9587:6;9582:3;9578:16;9571:27;9458:146;;;:::o;9610:423::-;9687:5;9712:65;9728:48;9769:6;9728:48;:::i;:::-;9712:65;:::i;:::-;9703:74;;9800:6;9793:5;9786:21;9838:4;9831:5;9827:16;9876:3;9867:6;9862:3;9858:16;9855:25;9852:112;;;9883:79;;:::i;:::-;9852:112;9973:54;10020:6;10015:3;10010;9973:54;:::i;:::-;9693:340;9610:423;;;;;:::o;10052:338::-;10107:5;10156:3;10149:4;10141:6;10137:17;10133:27;10123:122;;10164:79;;:::i;:::-;10123:122;10281:6;10268:20;10306:78;10380:3;10372:6;10365:4;10357:6;10353:17;10306:78;:::i;:::-;10297:87;;10113:277;10052:338;;;;:::o;10396:943::-;10491:6;10499;10507;10515;10564:3;10552:9;10543:7;10539:23;10535:33;10532:120;;;10571:79;;:::i;:::-;10532:120;10691:1;10716:53;10761:7;10752:6;10741:9;10737:22;10716:53;:::i;:::-;10706:63;;10662:117;10818:2;10844:53;10889:7;10880:6;10869:9;10865:22;10844:53;:::i;:::-;10834:63;;10789:118;10946:2;10972:53;11017:7;11008:6;10997:9;10993:22;10972:53;:::i;:::-;10962:63;;10917:118;11102:2;11091:9;11087:18;11074:32;11133:18;11125:6;11122:30;11119:117;;;11155:79;;:::i;:::-;11119:117;11260:62;11314:7;11305:6;11294:9;11290:22;11260:62;:::i;:::-;11250:72;;11045:287;10396:943;;;;;;;:::o;11345:474::-;11413:6;11421;11470:2;11458:9;11449:7;11445:23;11441:32;11438:119;;;11476:79;;:::i;:::-;11438:119;11596:1;11621:53;11666:7;11657:6;11646:9;11642:22;11621:53;:::i;:::-;11611:63;;11567:117;11723:2;11749:53;11794:7;11785:6;11774:9;11770:22;11749:53;:::i;:::-;11739:63;;11694:118;11345:474;;;;;:::o;11825:180::-;11873:77;11870:1;11863:88;11970:4;11967:1;11960:15;11994:4;11991:1;11984:15;12011:320;12055:6;12092:1;12086:4;12082:12;12072:22;;12139:1;12133:4;12129:12;12160:18;12150:81;;12216:4;12208:6;12204:17;12194:27;;12150:81;12278:2;12270:6;12267:14;12247:18;12244:38;12241:84;;12297:18;;:::i;:::-;12241:84;12062:269;12011:320;;;:::o;12337:182::-;12477:34;12473:1;12465:6;12461:14;12454:58;12337:182;:::o;12525:366::-;12667:3;12688:67;12752:2;12747:3;12688:67;:::i;:::-;12681:74;;12764:93;12853:3;12764:93;:::i;:::-;12882:2;12877:3;12873:12;12866:19;;12525:366;;;:::o;12897:419::-;13063:4;13101:2;13090:9;13086:18;13078:26;;13150:9;13144:4;13140:20;13136:1;13125:9;13121:17;13114:47;13178:131;13304:4;13178:131;:::i;:::-;13170:139;;12897:419;;;:::o;13322:97::-;13381:6;13409:3;13399:13;;13322:97;;;;:::o;13425:141::-;13474:4;13497:3;13489:11;;13520:3;13517:1;13510:14;13554:4;13551:1;13541:18;13533:26;;13425:141;;;:::o;13572:93::-;13609:6;13656:2;13651;13644:5;13640:14;13636:23;13626:33;;13572:93;;;:::o;13671:107::-;13715:8;13765:5;13759:4;13755:16;13734:37;;13671:107;;;;:::o;13784:393::-;13853:6;13903:1;13891:10;13887:18;13926:97;13956:66;13945:9;13926:97;:::i;:::-;14044:39;14074:8;14063:9;14044:39;:::i;:::-;14032:51;;14116:4;14112:9;14105:5;14101:21;14092:30;;14165:4;14155:8;14151:19;14144:5;14141:30;14131:40;;13860:317;;13784:393;;;;;:::o;14183:60::-;14211:3;14232:5;14225:12;;14183:60;;;:::o;14249:142::-;14299:9;14332:53;14350:34;14359:24;14377:5;14359:24;:::i;:::-;14350:34;:::i;:::-;14332:53;:::i;:::-;14319:66;;14249:142;;;:::o;14397:75::-;14440:3;14461:5;14454:12;;14397:75;;;:::o;14478:269::-;14588:39;14619:7;14588:39;:::i;:::-;14649:91;14698:41;14722:16;14698:41;:::i;:::-;14690:6;14683:4;14677:11;14649:91;:::i;:::-;14643:4;14636:105;14554:193;14478:269;;;:::o;14753:73::-;14798:3;14753:73;:::o;14832:189::-;14909:32;;:::i;:::-;14950:65;15008:6;15000;14994:4;14950:65;:::i;:::-;14885:136;14832:189;;:::o;15027:186::-;15087:120;15104:3;15097:5;15094:14;15087:120;;;15158:39;15195:1;15188:5;15158:39;:::i;:::-;15131:1;15124:5;15120:13;15111:22;;15087:120;;;15027:186;;:::o;15219:543::-;15320:2;15315:3;15312:11;15309:446;;;15354:38;15386:5;15354:38;:::i;:::-;15438:29;15456:10;15438:29;:::i;:::-;15428:8;15424:44;15621:2;15609:10;15606:18;15603:49;;;15642:8;15627:23;;15603:49;15665:80;15721:22;15739:3;15721:22;:::i;:::-;15711:8;15707:37;15694:11;15665:80;:::i;:::-;15324:431;;15309:446;15219:543;;;:::o;15768:117::-;15822:8;15872:5;15866:4;15862:16;15841:37;;15768:117;;;;:::o;15891:169::-;15935:6;15968:51;16016:1;16012:6;16004:5;16001:1;15997:13;15968:51;:::i;:::-;15964:56;16049:4;16043;16039:15;16029:25;;15942:118;15891:169;;;;:::o;16065:295::-;16141:4;16287:29;16312:3;16306:4;16287:29;:::i;:::-;16279:37;;16349:3;16346:1;16342:11;16336:4;16333:21;16325:29;;16065:295;;;;:::o;16365:1403::-;16489:44;16529:3;16524;16489:44;:::i;:::-;16598:18;16590:6;16587:30;16584:56;;;16620:18;;:::i;:::-;16584:56;16664:38;16696:4;16690:11;16664:38;:::i;:::-;16749:67;16809:6;16801;16795:4;16749:67;:::i;:::-;16843:1;16872:2;16864:6;16861:14;16889:1;16884:632;;;;17560:1;17577:6;17574:84;;;17633:9;17628:3;17624:19;17611:33;17602:42;;17574:84;17684:67;17744:6;17737:5;17684:67;:::i;:::-;17678:4;17671:81;17533:229;16854:908;;16884:632;16936:4;16932:9;16924:6;16920:22;16970:37;17002:4;16970:37;:::i;:::-;17029:1;17043:215;17057:7;17054:1;17051:14;17043:215;;;17143:9;17138:3;17134:19;17121:33;17113:6;17106:49;17194:1;17186:6;17182:14;17172:24;;17241:2;17230:9;17226:18;17213:31;;17080:4;17077:1;17073:12;17068:17;;17043:215;;;17286:6;17277:7;17274:19;17271:186;;;17351:9;17346:3;17342:19;17329:33;17394:48;17436:4;17428:6;17424:17;17413:9;17394:48;:::i;:::-;17386:6;17379:64;17294:163;17271:186;17503:1;17499;17491:6;17487:14;17483:22;17477:4;17470:36;16891:625;;;16854:908;;16464:1304;;;16365:1403;;;:::o;17774:180::-;17822:77;17819:1;17812:88;17919:4;17916:1;17909:15;17943:4;17940:1;17933:15;17960:191;18000:3;18019:20;18037:1;18019:20;:::i;:::-;18014:25;;18053:20;18071:1;18053:20;:::i;:::-;18048:25;;18096:1;18093;18089:9;18082:16;;18117:3;18114:1;18111:10;18108:36;;;18124:18;;:::i;:::-;18108:36;17960:191;;;;:::o;18157:180::-;18297:32;18293:1;18285:6;18281:14;18274:56;18157:180;:::o;18343:366::-;18485:3;18506:67;18570:2;18565:3;18506:67;:::i;:::-;18499:74;;18582:93;18671:3;18582:93;:::i;:::-;18700:2;18695:3;18691:12;18684:19;;18343:366;;;:::o;18715:419::-;18881:4;18919:2;18908:9;18904:18;18896:26;;18968:9;18962:4;18958:20;18954:1;18943:9;18939:17;18932:47;18996:131;19122:4;18996:131;:::i;:::-;18988:139;;18715:419;;;:::o;19140:174::-;19280:26;19276:1;19268:6;19264:14;19257:50;19140:174;:::o;19320:366::-;19462:3;19483:67;19547:2;19542:3;19483:67;:::i;:::-;19476:74;;19559:93;19648:3;19559:93;:::i;:::-;19677:2;19672:3;19668:12;19661:19;;19320:366;;;:::o;19692:419::-;19858:4;19896:2;19885:9;19881:18;19873:26;;19945:9;19939:4;19935:20;19931:1;19920:9;19916:17;19909:47;19973:131;20099:4;19973:131;:::i;:::-;19965:139;;19692:419;;;:::o;20117:178::-;20257:30;20253:1;20245:6;20241:14;20234:54;20117:178;:::o;20301:366::-;20443:3;20464:67;20528:2;20523:3;20464:67;:::i;:::-;20457:74;;20540:93;20629:3;20540:93;:::i;:::-;20658:2;20653:3;20649:12;20642:19;;20301:366;;;:::o;20673:419::-;20839:4;20877:2;20866:9;20862:18;20854:26;;20926:9;20920:4;20916:20;20912:1;20901:9;20897:17;20890:47;20954:131;21080:4;20954:131;:::i;:::-;20946:139;;20673:419;;;:::o;21098:234::-;21238:34;21234:1;21226:6;21222:14;21215:58;21307:17;21302:2;21294:6;21290:15;21283:42;21098:234;:::o;21338:366::-;21480:3;21501:67;21565:2;21560:3;21501:67;:::i;:::-;21494:74;;21577:93;21666:3;21577:93;:::i;:::-;21695:2;21690:3;21686:12;21679:19;;21338:366;;;:::o;21710:419::-;21876:4;21914:2;21903:9;21899:18;21891:26;;21963:9;21957:4;21953:20;21949:1;21938:9;21934:17;21927:47;21991:131;22117:4;21991:131;:::i;:::-;21983:139;;21710:419;;;:::o;22135:148::-;22237:11;22274:3;22259:18;;22135:148;;;;:::o;22313:874::-;22416:3;22453:5;22447:12;22482:36;22508:9;22482:36;:::i;:::-;22534:89;22616:6;22611:3;22534:89;:::i;:::-;22527:96;;22654:1;22643:9;22639:17;22670:1;22665:166;;;;22845:1;22840:341;;;;22632:549;;22665:166;22749:4;22745:9;22734;22730:25;22725:3;22718:38;22811:6;22804:14;22797:22;22789:6;22785:35;22780:3;22776:45;22769:52;;22665:166;;22840:341;22907:38;22939:5;22907:38;:::i;:::-;22967:1;22981:154;22995:6;22992:1;22989:13;22981:154;;;23069:7;23063:14;23059:1;23054:3;23050:11;23043:35;23119:1;23110:7;23106:15;23095:26;;23017:4;23014:1;23010:12;23005:17;;22981:154;;;23164:6;23159:3;23155:16;23148:23;;22847:334;;22632:549;;22420:767;;22313:874;;;;:::o;23193:390::-;23299:3;23327:39;23360:5;23327:39;:::i;:::-;23382:89;23464:6;23459:3;23382:89;:::i;:::-;23375:96;;23480:65;23538:6;23533:3;23526:4;23519:5;23515:16;23480:65;:::i;:::-;23570:6;23565:3;23561:16;23554:23;;23303:280;23193:390;;;;:::o;23589:429::-;23766:3;23788:92;23876:3;23867:6;23788:92;:::i;:::-;23781:99;;23897:95;23988:3;23979:6;23897:95;:::i;:::-;23890:102;;24009:3;24002:10;;23589:429;;;;;:::o;24024:225::-;24164:34;24160:1;24152:6;24148:14;24141:58;24233:8;24228:2;24220:6;24216:15;24209:33;24024:225;:::o;24255:366::-;24397:3;24418:67;24482:2;24477:3;24418:67;:::i;:::-;24411:74;;24494:93;24583:3;24494:93;:::i;:::-;24612:2;24607:3;24603:12;24596:19;;24255:366;;;:::o;24627:419::-;24793:4;24831:2;24820:9;24816:18;24808:26;;24880:9;24874:4;24870:20;24866:1;24855:9;24851:17;24844:47;24908:131;25034:4;24908:131;:::i;:::-;24900:139;;24627:419;;;:::o;25052:98::-;25103:6;25137:5;25131:12;25121:22;;25052:98;;;:::o;25156:168::-;25239:11;25273:6;25268:3;25261:19;25313:4;25308:3;25304:14;25289:29;;25156:168;;;;:::o;25330:373::-;25416:3;25444:38;25476:5;25444:38;:::i;:::-;25498:70;25561:6;25556:3;25498:70;:::i;:::-;25491:77;;25577:65;25635:6;25630:3;25623:4;25616:5;25612:16;25577:65;:::i;:::-;25667:29;25689:6;25667:29;:::i;:::-;25662:3;25658:39;25651:46;;25420:283;25330:373;;;;:::o;25709:640::-;25904:4;25942:3;25931:9;25927:19;25919:27;;25956:71;26024:1;26013:9;26009:17;26000:6;25956:71;:::i;:::-;26037:72;26105:2;26094:9;26090:18;26081:6;26037:72;:::i;:::-;26119;26187:2;26176:9;26172:18;26163:6;26119:72;:::i;:::-;26238:9;26232:4;26228:20;26223:2;26212:9;26208:18;26201:48;26266:76;26337:4;26328:6;26266:76;:::i;:::-;26258:84;;25709:640;;;;;;;:::o;26355:141::-;26411:5;26442:6;26436:13;26427:22;;26458:32;26484:5;26458:32;:::i;:::-;26355:141;;;;:::o;26502:349::-;26571:6;26620:2;26608:9;26599:7;26595:23;26591:32;26588:119;;;26626:79;;:::i;:::-;26588:119;26746:1;26771:63;26826:7;26817:6;26806:9;26802:22;26771:63;:::i;:::-;26761:73;;26717:127;26502:349;;;;:::o;26857:233::-;26896:3;26919:24;26937:5;26919:24;:::i;:::-;26910:33;;26965:66;26958:5;26955:77;26952:103;;27035:18;;:::i;:::-;26952:103;27082:1;27075:5;27071:13;27064:20;;26857:233;;;:::o;27096:180::-;27144:77;27141:1;27134:88;27241:4;27238:1;27231:15;27265:4;27262:1;27255:15;27282:185;27322:1;27339:20;27357:1;27339:20;:::i;:::-;27334:25;;27373:20;27391:1;27373:20;:::i;:::-;27368:25;;27412:1;27402:35;;27417:18;;:::i;:::-;27402:35;27459:1;27456;27452:9;27447:14;;27282:185;;;;:::o;27473:194::-;27513:4;27533:20;27551:1;27533:20;:::i;:::-;27528:25;;27567:20;27585:1;27567:20;:::i;:::-;27562:25;;27611:1;27608;27604:9;27596:17;;27635:1;27629:4;27626:11;27623:37;;;27640:18;;:::i;:::-;27623:37;27473:194;;;;:::o;27673:176::-;27705:1;27722:20;27740:1;27722:20;:::i;:::-;27717:25;;27756:20;27774:1;27756:20;:::i;:::-;27751:25;;27795:1;27785:35;;27800:18;;:::i;:::-;27785:35;27841:1;27838;27834:9;27829:14;;27673:176;;;;:::o;27855:180::-;27903:77;27900:1;27893:88;28000:4;27997:1;27990:15;28024:4;28021:1;28014:15
Swarm Source
ipfs://e95c4625326bf3645c7493fbaab1883e7b15cc4b4afa06eacddb662ac71b6924
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| OP | 100.00% | $3,460.73 | 0.00023 | $0.795968 |
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.