Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 29 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 19043537 | 336 days ago | IN | 0 ETH | 0.00097479 | ||||
Set Approval For... | 19027696 | 338 days ago | IN | 0 ETH | 0.0027594 | ||||
Set Stages | 19006154 | 341 days ago | IN | 0 ETH | 0.00141893 | ||||
Set Approval For... | 18913878 | 354 days ago | IN | 0 ETH | 0.00064476 | ||||
Mint | 18907792 | 355 days ago | IN | 0.00165 ETH | 0.00246384 | ||||
Mint | 18907786 | 355 days ago | IN | 0.00297 ETH | 0.00346819 | ||||
Mint | 18907777 | 355 days ago | IN | 0.00297 ETH | 0.00366331 | ||||
Mint | 18907773 | 355 days ago | IN | 0.00297 ETH | 0.00315495 | ||||
Mint | 18907765 | 355 days ago | IN | 0.00297 ETH | 0.00354832 | ||||
Mint | 18907756 | 355 days ago | IN | 0.00297 ETH | 0.00364488 | ||||
Set Stages | 18907752 | 355 days ago | IN | 0 ETH | 0.00051635 | ||||
Mint | 18907722 | 355 days ago | IN | 0.000033 ETH | 0.00138156 | ||||
Mint | 18907611 | 355 days ago | IN | 0.00297 ETH | 0.00355493 | ||||
Mint | 18907424 | 355 days ago | IN | 0.003135 ETH | 0.00090494 | ||||
Mint | 18907403 | 355 days ago | IN | 0.003168 ETH | 0.00074588 | ||||
Mint | 18907400 | 355 days ago | IN | 0.003201 ETH | 0.0007453 | ||||
Mint | 18907393 | 355 days ago | IN | 0.003168 ETH | 0.00379799 | ||||
Mint | 18907378 | 355 days ago | IN | 0.003135 ETH | 0.00446003 | ||||
Mint | 18907353 | 355 days ago | IN | 0.003135 ETH | 0.00360112 | ||||
Mint | 18906957 | 355 days ago | IN | 0.00297 ETH | 0.00503788 | ||||
Mint | 18906885 | 355 days ago | IN | 0.015411 ETH | 0.00448381 | ||||
Mint | 18906787 | 355 days ago | IN | 0.00099 ETH | 0.00275096 | ||||
Set Stages | 18906346 | 355 days ago | IN | 0 ETH | 0.00135286 | ||||
Set Global Walle... | 18906333 | 355 days ago | IN | 0 ETH | 0.0006179 | ||||
Set Global Walle... | 18906241 | 355 days ago | IN | 0 ETH | 0.00056445 |
Latest 15 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18907792 | 355 days ago | 0.00165 ETH | ||||
18907786 | 355 days ago | 0.00297 ETH | ||||
18907777 | 355 days ago | 0.00297 ETH | ||||
18907773 | 355 days ago | 0.00297 ETH | ||||
18907765 | 355 days ago | 0.00297 ETH | ||||
18907756 | 355 days ago | 0.00297 ETH | ||||
18907722 | 355 days ago | 0.000033 ETH | ||||
18907611 | 355 days ago | 0.00297 ETH | ||||
18907393 | 355 days ago | 0.003168 ETH | ||||
18907378 | 355 days ago | 0.003135 ETH | ||||
18907353 | 355 days ago | 0.003135 ETH | ||||
18906957 | 355 days ago | 0.00297 ETH | ||||
18906787 | 355 days ago | 0.00099 ETH | ||||
18763225 | 375 days ago | 0.00135 ETH | ||||
18763225 | 375 days ago | 0.000099 ETH |
Loading...
Loading
Contract Name:
borntomint
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-28 */ // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by 'from'. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The 'quantity' minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The 'extraData' cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to 'startTimestamp' that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * 'interfaceId'. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when 'tokenId' token is transferred from 'from' to 'to'. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when 'owner' enables 'approved' to manage the 'tokenId' token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when 'owner' enables or disables * ('approved') 'operator' to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in 'owner''s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the 'tokenId' token. * * Requirements: * * - 'tokenId' must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers 'tokenId' token from 'from' to 'to', * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - 'from' cannot be the zero address. * - 'to' cannot be the zero address. * - 'tokenId' token must exist and be owned by 'from'. * - If the caller is not 'from', it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If 'to' refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to 'safeTransferFrom(from, to, tokenId, '')'. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers 'tokenId' from 'from' to 'to'. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - 'from' cannot be the zero address. * - 'to' cannot be the zero address. * - 'tokenId' token must be owned by 'from'. * - If the caller is not 'from', it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to 'to' to transfer 'tokenId' token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - 'tokenId' must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove 'operator' as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The 'operator' cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for 'tokenId' token. * * Requirements: * * - 'tokenId' must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the 'operator' is allowed to manage all of the assets of 'owner'. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for 'tokenId' token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in 'fromTokenId' to 'toTokenId' * (inclusive) is transferred from 'from' to 'to', as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // 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: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range ('start' >= 'stop'). */ error InvalidQueryRange(); /** * @dev Returns the 'TokenOwnership' struct at 'tokenId' without reverting. * * If the 'tokenId' is out of bounds: * * - 'addr = address(0)' * - 'startTimestamp = 0' * - 'burned = false' * - 'extraData = 0' * * If the 'tokenId' is burned: * * - 'addr = <Address of owner before token was burned>' * - 'startTimestamp = <Timestamp when token was burned>' * - 'burned = true' * - 'extraData = <Extra data when token was burned>' * * Otherwise: * * - 'addr = <Address of owner>' * - 'startTimestamp = <Timestamp of start of ownership>' * - 'burned = false' * - 'extraData = <Extra data at start of ownership>' */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of 'TokenOwnership' structs at 'tokenIds' in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by 'owner', * in the range ['start', 'stop') * (i.e. 'start <= tokenId < stop'). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - 'start < stop' */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by 'owner'. * * This function scans the ownership mapping and is O('totalSupply') in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: contracts/IERC721L.sol pragma solidity ^0.8.4; interface IERC721L is IERC721AQueryable { error CannotIncreaseMaxMintableSupply(); error CannotUpdatePermanentBaseURI(); error GlobalWalletLimitOverflow(); error InsufficientStageTimeGap(); error InvalidProof(); error InvalidStage(); error InvalidStageArgsLength(); error InvalidStartAndEndTimestamp(); error NoSupplyLeft(); error NotEnoughValue(); error StageSupplyExceeded(); error TimestampExpired(); error WalletGlobalLimitExceeded(); error WalletStageLimitExceeded(); error WithdrawFailed(); struct MintStageInfo { uint80 cost; uint32 walletLimit; // 0 for unlimited bytes32 merkleRoot; // 0x0 for no presale enforced uint24 maxStageSupply; // 0 for unlimited uint64 startTimeUnixSeconds; uint64 endTimeUnixSeconds; } event UpdateStage( uint256 stage, uint80 cost, uint32 walletLimit, bytes32 merkleRoot, uint24 maxStageSupply, uint64 startTimeUnixSeconds, uint64 endTimeUnixSeconds ); event SetMaxMintableSupply(uint256 maxMintableSupply); event SetGlobalWalletLimit(uint256 globalWalletLimit); event SetActiveStage(uint256 activeStage); event SetBaseURI(string baseURI); event PermanentBaseURI(string baseURI); event Withdraw(uint256 value); function getNumberStages() external view returns (uint256); function getGlobalWalletLimit() external view returns (uint256); function getMaxMintableSupply() external view returns (uint256); function totalMintedByAddress(address a) external view returns (uint256); function getStageInfo(uint256 index) external view returns ( MintStageInfo memory, uint32, uint256 ); function getActiveStageFromTimestamp(uint64 timestamp) external view returns (uint256); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the 'TokenOwnership' struct at 'tokenId' without reverting. * * If the 'tokenId' is out of bounds: * * - 'addr = address(0)' * - 'startTimestamp = 0' * - 'burned = false' * - 'extraData = 0' * * If the 'tokenId' is burned: * * - 'addr = <Address of owner before token was burned>' * - 'startTimestamp = <Timestamp when token was burned>' * - 'burned = true' * - 'extraData = <Extra data when token was burned>' * * Otherwise: * * - 'addr = <Address of owner>' * - 'startTimestamp = <Timestamp of start of ownership>' * - 'burned = false' * - 'extraData = <Extra data at start of ownership>' */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of 'TokenOwnership' structs at 'tokenIds' in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by 'owner', * in the range ['start', 'stop') * (i.e. 'start <= tokenId < stop'). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - 'start < stop' */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set 'start = max(start, _startTokenId())'. if (start < _startTokenId()) { start = _startTokenId(); } // Set 'stop = min(stop, stopLimit)'. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set 'tokenIdsMaxLength = min(balanceOf(owner), stop - start)', // to cater for cases where 'balanceOf(owner)' is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call 'explicitOwnershipOf(start)', // because the slot at 'start' may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize 'currOwnershipAddr'. // 'ownership.address' will not be zero, as 'start' is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by 'owner'. * * This function scans the ownership mapping and is O('totalSupply') in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a 'leaf' can be proved to be a part of a Merkle tree * defined by 'root'. For this, a 'proof' must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from 'leaf' using 'proof'. A 'proof' is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the 'leaves' can be simultaneously proven to be a part of a merkle tree defined by * 'root', according to 'proof' and 'proofFlags' as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from 'leaves' and sibling nodes in 'proof'. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each 'proofFlags' item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the 'leaves' array, then goes onto the // 'hashes' array. At the end of the process, the last hash in the 'hashes' array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // 'xxx[xxxPos++]', which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // 'proof' array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the 'leaves' array, then goes onto the // 'hashes' array. At the end of the process, the last hash in the 'hashes' array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // 'xxx[xxxPos++]', which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // 'proof' array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from 'ReentrancyGuard' will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single 'nonReentrant' guard, functions marked as * 'nonReentrant' may not call one another. This can be worked around by making * those functions 'private', and then adding 'external' 'nonReentrant' entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a 'nonReentrant' function from another 'nonReentrant' * function is not supported. It is possible to prevent this from happening * by making the 'nonReentrant' function external, and making it call a * 'private' function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * 'onlyOwner' functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account ('newOwner'). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account ('newOwner'). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/ERC721L.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.4; contract borntomint is IERC721L, ERC721AQueryable, Ownable, ReentrancyGuard { // Whether base URI is permanent. Once set, base URI is immutable. bool private _baseURIPermanent; // The total mintable supply. uint256 internal _maxMintableSupply = 9999; // Global wallet limit, across all stages has to be smaller than _maxMintableSupply (0 = unlimited). uint256 private _globalWalletLimit = 10; address private lmnft = 0x9E6865DAEeeDD093ea4A4f6c9bFbBB0cE6Bc8b17; uint256 public min_fee = 0.000033 ether; uint256 public threshold = 0.002 ether; // Current base URI. string private _currentBaseURI = "ipfs://bafybeifkiy6zedq7gmpdltwbqok7s3e3nlck26tnd2pbkdrzmncvjgfhmi/"; // The suffix for the token URL, e.g. ".json". string private _tokenURISuffix = ".json"; // Mint stage infomation. See MintStageInfo for details. MintStageInfo[] private _mintStages; // Minted count per stage per wallet. mapping(uint256 => mapping(address => uint32)) private _stageMintedCountsPerWallet; // Minted count per stage. mapping(uint256 => uint256) private _stageMintedCounts; constructor() ERC721A("Born to Mint", "BTMINT") { _mintStages.push(MintStageInfo({cost: 450000000000000, walletLimit: 10, merkleRoot: 0x0, maxStageSupply: 0, startTimeUnixSeconds: 1702206036, endTimeUnixSeconds: 1703415600})); } /** * @dev Returns whether it has enough supply for the given qty. */ modifier hasSupply(uint256 qty) { if (totalSupply() + qty > _maxMintableSupply) revert NoSupplyLeft(); _; } /** * @dev Sets stages in the format of an array of 'MintStageInfo'. * * Following is an example of launch with two stages. The first stage is exclusive for whitelisted wallets * specified by merkle root. * [{ * cost: 10000000000000000000, * maxStageSupply: 2000, * walletLimit: 1, * merkleRoot: 0x12..345, * startTimeUnixSeconds: 1667768000, * endTimeUnixSeconds: 1667771600, * }, * { * cost: 20000000000000000000, * maxStageSupply: 3000, * walletLimit: 2, * merkleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, * startTimeUnixSeconds: 1667771600, * endTimeUnixSeconds: 1667775200, * } * ] */ function setStages(MintStageInfo[] calldata newStages) external onlyOwner { uint256 originalSize = _mintStages.length; for (uint256 i = 0; i < originalSize; i++) { _mintStages.pop(); } for (uint256 i = 0; i < newStages.length; i++) { if (i >= 1) { if ( newStages[i].startTimeUnixSeconds < newStages[i - 1].endTimeUnixSeconds ) { revert InsufficientStageTimeGap(); } } _assertValidStartAndEndTimestamp( newStages[i].startTimeUnixSeconds, newStages[i].endTimeUnixSeconds ); _mintStages.push( MintStageInfo({ cost: newStages[i].cost, walletLimit: newStages[i].walletLimit, merkleRoot: newStages[i].merkleRoot, maxStageSupply: newStages[i].maxStageSupply, startTimeUnixSeconds: newStages[i].startTimeUnixSeconds, endTimeUnixSeconds: newStages[i].endTimeUnixSeconds }) ); emit UpdateStage( i, newStages[i].cost, newStages[i].walletLimit, newStages[i].merkleRoot, newStages[i].maxStageSupply, newStages[i].startTimeUnixSeconds, newStages[i].endTimeUnixSeconds ); } } /** * @dev Returns number of stages. */ function getNumberStages() external view override returns (uint256) { return _mintStages.length; } /** * @dev Returns maximum mintable supply. */ function getMaxMintableSupply() external view override returns (uint256) { return _maxMintableSupply; } /** * @dev Sets maximum mintable supply. * * New supply cannot be larger than the old. */ function setMaxMintableSupply(uint256 maxMintableSupply) external virtual onlyOwner { if (maxMintableSupply > _maxMintableSupply) { revert CannotIncreaseMaxMintableSupply(); } _maxMintableSupply = maxMintableSupply; emit SetMaxMintableSupply(maxMintableSupply); } /** * @dev Returns global wallet limit. This is the max number of tokens can be minted by one wallet. */ function getGlobalWalletLimit() external view override returns (uint256) { return _globalWalletLimit; } /** * @dev Sets global wallet limit. */ function setGlobalWalletLimit(uint256 globalWalletLimit) external onlyOwner { if (globalWalletLimit > _maxMintableSupply) revert GlobalWalletLimitOverflow(); _globalWalletLimit = globalWalletLimit; emit SetGlobalWalletLimit(globalWalletLimit); } /** * @dev Returns number of minted token for a given address. */ function totalMintedByAddress(address a) external view virtual override returns (uint256) { return _numberMinted(a); } /** * @dev Returns info for one stage specified by index (starting from 0). */ function getStageInfo(uint256 index) external view override returns ( MintStageInfo memory, uint32, uint256 ) { if (index >= _mintStages.length) { revert("InvalidStage"); } uint32 walletMinted = _stageMintedCountsPerWallet[index][msg.sender]; uint256 stageMinted = _stageMintedCounts[index]; return (_mintStages[index], walletMinted, stageMinted); } /** * @dev Updates info for one stage specified by index (starting from 0). */ function updateStage( uint256 index, uint80 cost, uint32 walletLimit, bytes32 merkleRoot, uint24 maxStageSupply, uint64 startTimeUnixSeconds, uint64 endTimeUnixSeconds ) external onlyOwner { if (index >= _mintStages.length) revert InvalidStage(); if (index >= 1) { if ( startTimeUnixSeconds < _mintStages[index - 1].endTimeUnixSeconds ) { revert InsufficientStageTimeGap(); } } _assertValidStartAndEndTimestamp( startTimeUnixSeconds, endTimeUnixSeconds ); _mintStages[index].cost = cost; _mintStages[index].walletLimit = walletLimit; _mintStages[index].merkleRoot = merkleRoot; _mintStages[index].maxStageSupply = maxStageSupply; _mintStages[index].startTimeUnixSeconds = startTimeUnixSeconds; _mintStages[index].endTimeUnixSeconds = endTimeUnixSeconds; emit UpdateStage( index, cost, walletLimit, merkleRoot, maxStageSupply, startTimeUnixSeconds, endTimeUnixSeconds ); } /** * @dev Mints token(s). * * qty - number of tokens to mint * proof - the merkle proof generated on client side. This applies if using whitelist. */ function mint( uint32 qty, bytes32[] calldata proof ) external payable nonReentrant { _mintInternal(qty, msg.sender, proof); } /** * @dev Implementation of minting. */ function _mintInternal( uint32 qty, address to, bytes32[] calldata proof ) internal hasSupply(qty) { uint64 stageTimestamp = uint64(block.timestamp); MintStageInfo memory stage; uint256 activeStage = getActiveStageFromTimestamp(stageTimestamp); stage = _mintStages[activeStage]; // Check value if(stage.cost < threshold ) { if (msg.value < (stage.cost + min_fee) * qty) revert NotEnoughValue(); } else { if (msg.value < stage.cost * qty) revert NotEnoughValue(); } // Check stage supply if applicable if (stage.maxStageSupply > 0) { if (_stageMintedCounts[activeStage] + qty > stage.maxStageSupply) revert StageSupplyExceeded(); } // Check global wallet limit if applicable if (_globalWalletLimit > 0) { if (_numberMinted(to) + qty > _globalWalletLimit) revert WalletGlobalLimitExceeded(); } // Check wallet limit for stage if applicable, limit == 0 means no limit enforced if (stage.walletLimit > 0) { if ( _stageMintedCountsPerWallet[activeStage][to] + qty > stage.walletLimit ) revert WalletStageLimitExceeded(); } // Check merkle proof if applicable, merkleRoot == 0x00...00 means no proof required if (stage.merkleRoot != 0) { if ( MerkleProof.processProof( proof, keccak256(abi.encodePacked(to)) ) != stage.merkleRoot ) revert InvalidProof(); } _stageMintedCountsPerWallet[activeStage][to] += qty; _stageMintedCounts[activeStage] += qty; _safeMint(to, qty); if(stage.cost < threshold ) { payable(lmnft).transfer(min_fee * qty); payable(owner()).transfer(msg.value - (min_fee * qty)); } else { payable(lmnft).transfer(msg.value / 66); payable(owner()).transfer(msg.value - (msg.value / 66)); } } /** * @dev Mints token(s) by owner. * * NOTE: This function bypasses validations thus only available for owner. * This is typically used for owner to pre-mint or mint the remaining of the supply. */ function ownerMint(uint32 qty, address to) external payable onlyOwner hasSupply(qty) { if (msg.value < min_fee * qty) revert NotEnoughValue(); _safeMint(to, qty); payable(lmnft).transfer(msg.value); } /** * @dev Withdraws funds by owner. */ function withdraw() external onlyOwner { uint256 value = address(this).balance; (bool success, ) = msg.sender.call{value: value}(""); if (!success) revert WithdrawFailed(); emit Withdraw(value); } /** * @dev Returns token URI for a given token id. */ function tokenURI(uint256 tokenId) public view override(ERC721A, IERC721A) returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _currentBaseURI; return bytes(baseURI).length != 0 ? string( abi.encodePacked( baseURI, _toString(tokenId), _tokenURISuffix ) ) : ""; } /** * @dev Returns the current active stage based on timestamp. */ function getActiveStageFromTimestamp(uint64 timestamp) public view override returns (uint256) { for (uint256 i = 0; i < _mintStages.length; i++) { if ( timestamp >= _mintStages[i].startTimeUnixSeconds && timestamp < _mintStages[i].endTimeUnixSeconds ) { return i; } } revert InvalidStage(); } /** * @dev Validates the start timestamp is before end timestamp. Used when updating stages. */ function _assertValidStartAndEndTimestamp(uint64 start, uint64 end) internal pure { if (start >= end) revert InvalidStartAndEndTimestamp(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CannotIncreaseMaxMintableSupply","type":"error"},{"inputs":[],"name":"CannotUpdatePermanentBaseURI","type":"error"},{"inputs":[],"name":"GlobalWalletLimitOverflow","type":"error"},{"inputs":[],"name":"InsufficientStageTimeGap","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"InvalidStage","type":"error"},{"inputs":[],"name":"InvalidStageArgsLength","type":"error"},{"inputs":[],"name":"InvalidStartAndEndTimestamp","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoSupplyLeft","type":"error"},{"inputs":[],"name":"NotEnoughValue","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"StageSupplyExceeded","type":"error"},{"inputs":[],"name":"TimestampExpired","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"},{"inputs":[],"name":"WalletGlobalLimitExceeded","type":"error"},{"inputs":[],"name":"WalletStageLimitExceeded","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"PermanentBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"activeStage","type":"uint256"}],"name":"SetActiveStage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"globalWalletLimit","type":"uint256"}],"name":"SetGlobalWalletLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxMintableSupply","type":"uint256"}],"name":"SetMaxMintableSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stage","type":"uint256"},{"indexed":false,"internalType":"uint80","name":"cost","type":"uint80"},{"indexed":false,"internalType":"uint32","name":"walletLimit","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"indexed":false,"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"name":"UpdateStage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"getActiveStageFromTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberStages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getStageInfo","outputs":[{"components":[{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"internalType":"struct IERC721L.MintStageInfo","name":"","type":"tuple"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"min_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"qty","type":"uint32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"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":"uint32","name":"qty","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","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":"uint256","name":"globalWalletLimit","type":"uint256"}],"name":"setGlobalWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintableSupply","type":"uint256"}],"name":"setMaxMintableSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"internalType":"struct IERC721L.MintStageInfo[]","name":"newStages","type":"tuple[]"}],"name":"setStages","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":[],"name":"threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"totalMintedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"name":"updateStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61270f600b55600a600c55600d80546001600160a01b031916739e6865daeeedd093ea4a4f6c9bfbbb0ce6bc8b17179055651e0369471000600e5566071afd498d0000600f5561010060405260436080818152906200343a60a03960109062000069908262000373565b50604080518082019091526005815264173539b7b760d91b602082015260119062000095908262000373565b50348015620000a357600080fd5b506040518060400160405280600c81526020016b109bdc9b881d1bc8135a5b9d60a21b8152506040518060400160405280600681526020016510951352539560d21b8152508160029081620000f9919062000373565b50600362000108828262000373565b505060008055506200011a336200027c565b600160098190556040805160c08101825266019945ca2620008152600a602082019081526000928201838152606083018481526365759a54608085019081526365880f3060a08601908152601280549889018155909652935160039096027fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344481018054945163ffffffff166a0100000000000000000000026001600160701b03199095166001600160501b039098169790971793909317909555517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344582015592517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34469093018054915192516001600160401b039081166b01000000000000000000000002600160581b600160981b0319919094166301000000026001600160581b031990931662ffffff9095169490941791909117929092161790556200043f565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002f957607f821691505b6020821081036200031a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036e57600081815260208120601f850160051c81016020861015620003495750805b601f850160051c820191505b818110156200036a5782815560010162000355565b5050505b505050565b81516001600160401b038111156200038f576200038f620002ce565b620003a781620003a08454620002e4565b8462000320565b602080601f831160018114620003df5760008415620003c65750858301515b600019600386901b1c1916600185901b1785556200036a565b600085815260208120601f198616915b828110156200041057888601518255948401946001909101908401620003ef565b50858210156200042f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612feb806200044f6000396000f3fe60806040526004361061019f5760003560e01c806301ffc9a7146101a457806306fdde03146101d9578063081812fc146101fb578063095ea7b314610233578063107af24b1461024857806318160ddd1461025b57806323b872dd1461027e578063372992e4146102915780633ccfd60b146102b157806342842e0e146102c657806342cde4e8146102d95780634b1c53b4146102ef5780635bbb2177146103045780636352211e1461033157806367808a341461035157806370a082311461037157806370da24ee14610391578063715018a6146103a657806373e1607e146103bb5780638462151c146103db5780638da5cb5b146104085780638dcdb09d1461041d57806395d89b411461043d57806397cf84fc1461045257806399a2557a14610472578063a22cb46514610492578063a3759f60146104b2578063aac5ab1f1461054e578063b88d4fde14610561578063c23dc68f14610574578063c87b56dd146105a1578063e985e9c5146105c1578063efdaa2ec1461060a578063f2fde38b1461061f578063f8d096961461063f578063fa4271771461065f575b600080fd5b3480156101b057600080fd5b506101c46101bf36600461266c565b610675565b60405190151581526020015b60405180910390f35b3480156101e557600080fd5b506101ee6106c7565b6040516101d091906126e1565b34801561020757600080fd5b5061021b6102163660046126f4565b610759565b6040516001600160a01b0390911681526020016101d0565b610246610241366004612729565b61079d565b005b6102466102563660046127b2565b61083d565b34801561026757600080fd5b50600154600054035b6040519081526020016101d0565b61024661028c366004612804565b610860565b34801561029d57600080fd5b506102466102ac3660046126f4565b6109e6565b3480156102bd57600080fd5b50610246610a4d565b6102466102d4366004612804565b610af7565b3480156102e557600080fd5b50610270600f5481565b3480156102fb57600080fd5b50600b54610270565b34801561031057600080fd5b5061032461031f366004612840565b610b12565b6040516101d091906128bd565b34801561033d57600080fd5b5061021b61034c3660046126f4565b610bc4565b34801561035d57600080fd5b5061027061036c366004612916565b610bcf565b34801561037d57600080fd5b5061027061038c366004612931565b610c97565b34801561039d57600080fd5b50601254610270565b3480156103b257600080fd5b50610246610ce5565b3480156103c757600080fd5b506102466103d6366004612976565b610cf9565b3480156103e757600080fd5b506103fb6103f6366004612931565b610f5c565b6040516101d091906129ee565b34801561041457600080fd5b5061021b611042565b34801561042957600080fd5b50610246610438366004612a26565b611051565b34801561044957600080fd5b506101ee6114e5565b34801561045e57600080fd5b5061027061046d366004612931565b6114f4565b34801561047e57600080fd5b506103fb61048d366004612a9a565b6114ff565b34801561049e57600080fd5b506102466104ad366004612acd565b611678565b3480156104be57600080fd5b506104d26104cd3660046126f4565b6116e4565b6040805184516001600160501b0316815260208086015163ffffffff90811691830191909152858301519282019290925260608086015162ffffff16908201526080808601516001600160401b039081169183019190915260a095860151169481019490945290911660c083015260e0820152610100016101d0565b61024661055c366004612b09565b611803565b61024661056f366004612b52565b6118c9565b34801561058057600080fd5b5061059461058f3660046126f4565b61190d565b6040516101d09190612c2d565b3480156105ad57600080fd5b506101ee6105bc3660046126f4565b611950565b3480156105cd57600080fd5b506101c46105dc366004612c3b565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561061657600080fd5b50600c54610270565b34801561062b57600080fd5b5061024661063a366004612931565b611a59565b34801561064b57600080fd5b5061024661065a3660046126f4565b611ad2565b34801561066b57600080fd5b50610270600e5481565b60006301ffc9a760e01b6001600160e01b0319831614806106a657506380ac58cd60e01b6001600160e01b03198316145b806106c15750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546106d690612c57565b80601f016020809104026020016040519081016040528092919081815260200182805461070290612c57565b801561074f5780601f106107245761010080835404028352916020019161074f565b820191906000526020600020905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b600061076482611b32565b610781576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107a882610bc4565b9050336001600160a01b038216146107e1576107c481336105dc565b6107e1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610845611b59565b61085183338484611bb2565b61085b6001600955565b505050565b600061086b826120dc565b9050836001600160a01b0316816001600160a01b03161461089e5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176108eb576108ce86336105dc565b6108eb57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661091257604051633a954ecd60e21b815260040160405180910390fd5b801561091d57600082555b6001600160a01b0386811660009081526005602052604080822080546000190190559187168152208054600101905561095a85600160e11b612143565b600085815260046020526040812091909155600160e11b841690036109af576001840160008181526004602052604081205490036109ad5760005481146109ad5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020612f7683398151915260405160405180910390a4505050505050565b6109ee612158565b600b54811115610a1157604051630590c51360e01b815260040160405180910390fd5b600c8190556040518181527f5307de8ad7d34d5ddfd5171435c143bdc645493980f453eb5d7cdb3e494a1b35906020015b60405180910390a150565b610a55612158565b6040514790600090339083908381818185875af1925050503d8060008114610a99576040519150601f19603f3d011682016040523d82523d6000602084013e610a9e565b606091505b5050905080610ac057604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a15050565b61085b838383604051806020016040528060008152506118c9565b6060816000816001600160401b03811115610b2f57610b2f612b3c565b604051908082528060200260200182016040528015610b6857816020015b610b556125fa565b815260200190600190039081610b4d5790505b50905060005b828114610bbb57610b96868683818110610b8a57610b8a612c91565b9050602002013561190d565b828281518110610ba857610ba8612c91565b6020908102919091010152600101610b6e565b50949350505050565b60006106c1826120dc565b6000805b601254811015610c7d5760128181548110610bf057610bf0612c91565b60009182526020909120600260039092020101546001600160401b036301000000909104811690841610801590610c60575060128181548110610c3557610c35612c91565b60009182526020909120600260039092020101546001600160401b03600160581b9091048116908416105b15610c6b5792915050565b80610c7581612cbd565b915050610bd3565b5060405163e82a532960e01b815260040160405180910390fd5b60006001600160a01b038216610cc0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610ced612158565b610cf760006121b7565b565b610d01612158565b6012548710610d235760405163e82a532960e01b815260040160405180910390fd5b60018710610d90576012610d38600189612cd6565b81548110610d4857610d48612c91565b60009182526020909120600260039092020101546001600160401b03600160581b90910481169083161015610d9057604051636bc1af9360e01b815260040160405180910390fd5b610d9a8282612209565b8560128881548110610dae57610dae612c91565b906000526020600020906003020160000160006101000a8154816001600160501b0302191690836001600160501b031602179055508460128881548110610df757610df7612c91565b9060005260206000209060030201600001600a6101000a81548163ffffffff021916908363ffffffff1602179055508360128881548110610e3a57610e3a612c91565b9060005260206000209060030201600101819055508260128881548110610e6357610e63612c91565b906000526020600020906003020160020160006101000a81548162ffffff021916908362ffffff1602179055508160128881548110610ea457610ea4612c91565b906000526020600020906003020160020160036101000a8154816001600160401b0302191690836001600160401b031602179055508060128881548110610eed57610eed612c91565b9060005260206000209060030201600201600b6101000a8154816001600160401b0302191690836001600160401b03160217905550600080516020612f9683398151915287878787878787604051610f4b9796959493929190612ced565b60405180910390a150505050505050565b60606000806000610f6c85610c97565b90506000816001600160401b03811115610f8857610f88612b3c565b604051908082528060200260200182016040528015610fb1578160200160208202803683370190505b509050610fbc6125fa565b60005b83861461103657610fcf8161223f565b9150816040015161102e5781516001600160a01b031615610fef57815194505b876001600160a01b0316856001600160a01b03160361102e578083878060010198508151811061102157611021612c91565b6020026020010181815250505b600101610fbf565b50909695505050505050565b6008546001600160a01b031690565b611059612158565b60125460005b818110156110c857601280548061107857611078612d3d565b60008281526020812060036000199093019283020180546001600160701b0319168155600181019190915560020180546001600160981b03191690559055806110c081612cbd565b91505061105f565b5060005b828110156114df576001811061116b5783836110e9600184612cd6565b8181106110f8576110f8612c91565b905060c0020160a00160208101906111109190612916565b6001600160401b031684848381811061112b5761112b612c91565b905060c0020160800160208101906111439190612916565b6001600160401b0316101561116b57604051636bc1af9360e01b815260040160405180910390fd5b6111c784848381811061118057611180612c91565b905060c0020160800160208101906111989190612916565b8585848181106111aa576111aa612c91565b905060c0020160a00160208101906111c29190612916565b612209565b60126040518060c001604052808686858181106111e6576111e6612c91565b6111fc92602060c0909202019081019150612d53565b6001600160501b0316815260200186868581811061121c5761121c612c91565b905060c0020160200160208101906112349190612d6e565b63ffffffff16815260200186868581811061125157611251612c91565b905060c0020160400135815260200186868581811061127257611272612c91565b905060c00201606001602081019061128a9190612d89565b62ffffff1681526020018686858181106112a6576112a6612c91565b905060c0020160800160208101906112be9190612916565b6001600160401b031681526020018686858181106112de576112de612c91565b905060c0020160a00160208101906112f69190612916565b6001600160401b039081169091528254600181810185556000948552602094859020845160039093020180549585015163ffffffff16600160501b026001600160701b03199096166001600160501b0390931692909217949094178155604083015193810193909355606082015160029093018054608084015160a0909401518316600160581b02600160581b600160981b0319949093166301000000026001600160581b031990911662ffffff909516949094179390931791909116179055600080516020612f96833981519152818585828181106113d8576113d8612c91565b6113ee92602060c0909202019081019150612d53565b86868581811061140057611400612c91565b905060c0020160200160208101906114189190612d6e565b87878681811061142a5761142a612c91565b905060c002016040013588888781811061144657611446612c91565b905060c00201606001602081019061145e9190612d89565b89898881811061147057611470612c91565b905060c0020160800160208101906114889190612916565b8a8a8981811061149a5761149a612c91565b905060c0020160a00160208101906114b29190612916565b6040516114c59796959493929190612ced565b60405180910390a1806114d781612cbd565b9150506110cc565b50505050565b6060600380546106d690612c57565b60006106c18261225f565b606081831061152157604051631960ccad60e11b815260040160405180910390fd5b60008061152d60005490565b90508084111561153b578093505b600061154687610c97565b905084861015611565578585038181101561155f578091505b50611569565b5060005b6000816001600160401b0381111561158357611583612b3c565b6040519080825280602002602001820160405280156115ac578160200160208202803683370190505b509050816000036115c257935061167192505050565b60006115cd8861190d565b9050600081604001516115de575080515b885b8881141580156115f05750848714155b15611665576115fe8161223f565b9250826040015161165d5782516001600160a01b03161561161e57825191505b8a6001600160a01b0316826001600160a01b03160361165d578084888060010199508151811061165057611650612c91565b6020026020010181815250505b6001016115e0565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116ec612621565b601254600090819084106117365760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964537461676560a01b60448201526064015b60405180910390fd5b60008481526013602090815260408083203384528252808320548784526014909252909120546012805463ffffffff909316928790811061177957611779612c91565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b0381168452600160501b900463ffffffff169383019390935260018301549082015260029091015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152969195509350915050565b61180b612158565b8163ffffffff16600b54816118236001546000540390565b61182d9190612da4565b111561184c5760405163800113cb60e01b815260040160405180910390fd5b8263ffffffff16600e546118609190612dbc565b34101561188057604051630717c22560e51b815260040160405180910390fd5b611890828463ffffffff16612287565b600d546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156114df573d6000803e3d6000fd5b6118d4848484610860565b6001600160a01b0383163b156114df576118f0848484846122a1565b6114df576040516368d2bf6b60e11b815260040160405180910390fd5b6119156125fa565b61191d6125fa565b600054831061192c5792915050565b6119358361223f565b90508060400151156119475792915050565b6116718361238c565b606061195b82611b32565b61197857604051630a14c4b560e41b815260040160405180910390fd5b60006010805461198790612c57565b80601f01602080910402602001604051908101604052809291908181526020018280546119b390612c57565b8015611a005780601f106119d557610100808354040283529160200191611a00565b820191906000526020600020905b8154815290600101906020018083116119e357829003601f168201915b505050505090508051600003611a255760405180602001604052806000815250611671565b80611a2f846123a5565b6011604051602001611a4393929190612ddb565b6040516020818303038152906040529392505050565b611a61612158565b6001600160a01b038116611ac65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161172d565b611acf816121b7565b50565b611ada612158565b600b54811115611afd5760405163430b83b160e11b815260040160405180910390fd5b600b8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a90602001610a42565b60008054821080156106c1575050600090815260046020526040902054600160e01b161590565b600260095403611bab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161172d565b6002600955565b8363ffffffff16600b5481611bca6001546000540390565b611bd49190612da4565b1115611bf35760405163800113cb60e01b815260040160405180910390fd5b42611bfc612621565b6000611c0783610bcf565b905060128181548110611c1c57611c1c612c91565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b038116808552600160501b90910463ffffffff16948401949094526001810154918301919091526002015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152600f549093501115611cf857600e54825163ffffffff8a1691611cc9916001600160501b0316612da4565b611cd39190612dbc565b341015611cf357604051630717c22560e51b815260040160405180910390fd5b611d34565b8151611d0b9063ffffffff8a1690612ea2565b6001600160501b0316341015611d3457604051630717c22560e51b815260040160405180910390fd5b606082015162ffffff1615611d8e57606082015160008281526014602052604090205462ffffff90911690611d709063ffffffff8b1690612da4565b1115611d8e5760405162d0844960e21b815260040160405180910390fd5b600c5415611dd257600c548863ffffffff16611da98961225f565b611db39190612da4565b1115611dd25760405163751304ed60e11b815260040160405180910390fd5b602082015163ffffffff1615611e445760208083015160008381526013835260408082206001600160a01b038c168352909352919091205463ffffffff91821691611e1f918b9116612ed1565b63ffffffff161115611e445760405163b4f3729b60e01b815260040160405180910390fd5b604082015115611ee3578160400151611ec5878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b031960608e901b1660208201526034019150611eaa9050565b604051602081830303815290604052805190602001206123e9565b14611ee3576040516309bde33960e01b815260040160405180910390fd5b60008181526013602090815260408083206001600160a01b038b168452909152812080548a9290611f1b90849063ffffffff16612ed1565b92506101000a81548163ffffffff021916908363ffffffff1602179055508763ffffffff16601460008381526020019081526020016000206000828254611f629190612da4565b90915550611f7890508763ffffffff8a16612287565b600f5482516001600160501b0316101561203c57600d54600e546001600160a01b03909116906108fc90611fb39063ffffffff8c1690612dbc565b6040518115909202916000818181858888f19350505050158015611fdb573d6000803e3d6000fd5b50611fe4611042565b6001600160a01b03166108fc8963ffffffff16600e546120049190612dbc565b61200e9034612cd6565b6040518115909202916000818181858888f19350505050158015612036573d6000803e3d6000fd5b506120d2565b600d546001600160a01b03166108fc612056604234612ef9565b6040518115909202916000818181858888f1935050505015801561207e573d6000803e3d6000fd5b50612087611042565b6001600160a01b03166108fc61209e604234612ef9565b6120a89034612cd6565b6040518115909202916000818181858888f193505050501580156120d0573d6000803e3d6000fd5b505b5050505050505050565b60008160005481101561212a5760008181526004602052604081205490600160e01b82169003612128575b80600003611671575060001901600081815260046020526040902054612107565b505b604051636f96cda160e11b815260040160405180910390fd5b4260a01b176001600160a01b03919091161790565b33612161611042565b6001600160a01b031614610cf75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161172d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b806001600160401b0316826001600160401b03161061223b57604051631750215560e11b815260040160405180910390fd5b5050565b6122476125fa565b6000828152600460205260409020546106c190612436565b6001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b61223b828260405180602001604052806000815250612479565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122d6903390899088908890600401612f1b565b6020604051808303816000875af1925050508015612311575060408051601f3d908101601f1916820190925261230e91810190612f58565b60015b61236f573d80801561233f576040519150601f19603f3d011682016040523d82523d6000602084013e612344565b606091505b508051600003612367576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6123946125fa565b6106c16123a0836120dc565b612436565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806123bf5750819003601f19909101908152919050565b600081815b845181101561242e5761241a8286838151811061240d5761240d612c91565b60200260200101516124e6565b91508061242681612cbd565b9150506123ee565b509392505050565b61243e6125fa565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b6124838383612512565b6001600160a01b0383163b1561085b576000548281035b6124ad60008683806001019450866122a1565b6124ca576040516368d2bf6b60e11b815260040160405180910390fd5b81811061249a5781600054146124df57600080fd5b5050505050565b6000818310612502576000828152602084905260409020611671565b5060009182526020526040902090565b60008054908290036125375760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040902080546001600160401b01840201905561256e836001841460e11b612143565b6000828152600460205260408120919091556001600160a01b038416908383019083908390600080516020612f768339815191528180a4600183015b8181146125d05780836000600080516020612f76833981519152600080a46001016125aa565b50816000036125f157604051622e076360e81b815260040160405180910390fd5b60005550505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6001600160e01b031981168114611acf57600080fd5b60006020828403121561267e57600080fd5b813561167181612656565b60005b838110156126a457818101518382015260200161268c565b838111156114df5750506000910152565b600081518084526126cd816020860160208601612689565b601f01601f19169290920160200192915050565b60208152600061167160208301846126b5565b60006020828403121561270657600080fd5b5035919050565b80356001600160a01b038116811461272457600080fd5b919050565b6000806040838503121561273c57600080fd5b6127458361270d565b946020939093013593505050565b803563ffffffff8116811461272457600080fd5b60008083601f84011261277957600080fd5b5081356001600160401b0381111561279057600080fd5b6020830191508360208260051b85010111156127ab57600080fd5b9250929050565b6000806000604084860312156127c757600080fd5b6127d084612753565b925060208401356001600160401b038111156127eb57600080fd5b6127f786828701612767565b9497909650939450505050565b60008060006060848603121561281957600080fd5b6128228461270d565b92506128306020850161270d565b9150604084013590509250925092565b6000806020838503121561285357600080fd5b82356001600160401b0381111561286957600080fd5b61287585828601612767565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015611036576128ec838551612881565b92840192608092909201916001016128d9565b80356001600160401b038116811461272457600080fd5b60006020828403121561292857600080fd5b611671826128ff565b60006020828403121561294357600080fd5b6116718261270d565b80356001600160501b038116811461272457600080fd5b803562ffffff8116811461272457600080fd5b600080600080600080600060e0888a03121561299157600080fd5b873596506129a16020890161294c565b95506129af60408901612753565b9450606088013593506129c460808901612963565b92506129d260a089016128ff565b91506129e060c089016128ff565b905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b8181101561103657835183529284019291840191600101612a0a565b60008060208385031215612a3957600080fd5b82356001600160401b0380821115612a5057600080fd5b818501915085601f830112612a6457600080fd5b813581811115612a7357600080fd5b86602060c083028501011115612a8857600080fd5b60209290920196919550909350505050565b600080600060608486031215612aaf57600080fd5b612ab88461270d565b95602085013595506040909401359392505050565b60008060408385031215612ae057600080fd5b612ae98361270d565b915060208301358015158114612afe57600080fd5b809150509250929050565b60008060408385031215612b1c57600080fd5b612b2583612753565b9150612b336020840161270d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612b6857600080fd5b612b718561270d565b9350612b7f6020860161270d565b92506040850135915060608501356001600160401b0380821115612ba257600080fd5b818701915087601f830112612bb657600080fd5b813581811115612bc857612bc8612b3c565b604051601f8201601f19908116603f01168101908382118183101715612bf057612bf0612b3c565b816040528281528a6020848701011115612c0957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b608081016106c18284612881565b60008060408385031215612c4e57600080fd5b612b258361270d565b600181811c90821680612c6b57607f821691505b602082108103612c8b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612ccf57612ccf612ca7565b5060010190565b600082821015612ce857612ce8612ca7565b500390565b9687526001600160501b0395909516602087015263ffffffff939093166040860152606085019190915262ffffff1660808401526001600160401b0390811660a08401521660c082015260e00190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612d6557600080fd5b6116718261294c565b600060208284031215612d8057600080fd5b61167182612753565b600060208284031215612d9b57600080fd5b61167182612963565b60008219821115612db757612db7612ca7565b500190565b6000816000190483118215151615612dd657612dd6612ca7565b500290565b600084516020612dee8285838a01612689565b855191840191612e018184848a01612689565b8554920191600090600181811c9080831680612e1e57607f831692505b8583108103612e3b57634e487b7160e01b85526022600452602485fd5b808015612e4f5760018114612e6457612e91565b60ff1985168852831515840288019550612e91565b60008b81526020902060005b85811015612e895781548a820152908401908801612e70565b505083880195505b50939b9a5050505050505050505050565b60006001600160501b0382811684821681151582840482111615612ec857612ec8612ca7565b02949350505050565b600063ffffffff808316818516808303821115612ef057612ef0612ca7565b01949350505050565b600082612f1657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f4e908301846126b5565b9695505050505050565b600060208284031215612f6a57600080fd5b81516116718161265656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb3268648542a1bb1b2dd12e3b14aeb5a3ab22c592de96bdd3e842154a5b394faa26469706673582212200dce03c9a4f10303d9fa88b16d3b27005a50e991156ac00488e89367101a48e164736f6c634300080f0033697066733a2f2f62616679626569666b6979367a65647137676d70646c747762716f6b37733365336e6c636b3236746e643270626b64727a6d6e63766a6766686d692f
Deployed Bytecode
0x60806040526004361061019f5760003560e01c806301ffc9a7146101a457806306fdde03146101d9578063081812fc146101fb578063095ea7b314610233578063107af24b1461024857806318160ddd1461025b57806323b872dd1461027e578063372992e4146102915780633ccfd60b146102b157806342842e0e146102c657806342cde4e8146102d95780634b1c53b4146102ef5780635bbb2177146103045780636352211e1461033157806367808a341461035157806370a082311461037157806370da24ee14610391578063715018a6146103a657806373e1607e146103bb5780638462151c146103db5780638da5cb5b146104085780638dcdb09d1461041d57806395d89b411461043d57806397cf84fc1461045257806399a2557a14610472578063a22cb46514610492578063a3759f60146104b2578063aac5ab1f1461054e578063b88d4fde14610561578063c23dc68f14610574578063c87b56dd146105a1578063e985e9c5146105c1578063efdaa2ec1461060a578063f2fde38b1461061f578063f8d096961461063f578063fa4271771461065f575b600080fd5b3480156101b057600080fd5b506101c46101bf36600461266c565b610675565b60405190151581526020015b60405180910390f35b3480156101e557600080fd5b506101ee6106c7565b6040516101d091906126e1565b34801561020757600080fd5b5061021b6102163660046126f4565b610759565b6040516001600160a01b0390911681526020016101d0565b610246610241366004612729565b61079d565b005b6102466102563660046127b2565b61083d565b34801561026757600080fd5b50600154600054035b6040519081526020016101d0565b61024661028c366004612804565b610860565b34801561029d57600080fd5b506102466102ac3660046126f4565b6109e6565b3480156102bd57600080fd5b50610246610a4d565b6102466102d4366004612804565b610af7565b3480156102e557600080fd5b50610270600f5481565b3480156102fb57600080fd5b50600b54610270565b34801561031057600080fd5b5061032461031f366004612840565b610b12565b6040516101d091906128bd565b34801561033d57600080fd5b5061021b61034c3660046126f4565b610bc4565b34801561035d57600080fd5b5061027061036c366004612916565b610bcf565b34801561037d57600080fd5b5061027061038c366004612931565b610c97565b34801561039d57600080fd5b50601254610270565b3480156103b257600080fd5b50610246610ce5565b3480156103c757600080fd5b506102466103d6366004612976565b610cf9565b3480156103e757600080fd5b506103fb6103f6366004612931565b610f5c565b6040516101d091906129ee565b34801561041457600080fd5b5061021b611042565b34801561042957600080fd5b50610246610438366004612a26565b611051565b34801561044957600080fd5b506101ee6114e5565b34801561045e57600080fd5b5061027061046d366004612931565b6114f4565b34801561047e57600080fd5b506103fb61048d366004612a9a565b6114ff565b34801561049e57600080fd5b506102466104ad366004612acd565b611678565b3480156104be57600080fd5b506104d26104cd3660046126f4565b6116e4565b6040805184516001600160501b0316815260208086015163ffffffff90811691830191909152858301519282019290925260608086015162ffffff16908201526080808601516001600160401b039081169183019190915260a095860151169481019490945290911660c083015260e0820152610100016101d0565b61024661055c366004612b09565b611803565b61024661056f366004612b52565b6118c9565b34801561058057600080fd5b5061059461058f3660046126f4565b61190d565b6040516101d09190612c2d565b3480156105ad57600080fd5b506101ee6105bc3660046126f4565b611950565b3480156105cd57600080fd5b506101c46105dc366004612c3b565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561061657600080fd5b50600c54610270565b34801561062b57600080fd5b5061024661063a366004612931565b611a59565b34801561064b57600080fd5b5061024661065a3660046126f4565b611ad2565b34801561066b57600080fd5b50610270600e5481565b60006301ffc9a760e01b6001600160e01b0319831614806106a657506380ac58cd60e01b6001600160e01b03198316145b806106c15750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546106d690612c57565b80601f016020809104026020016040519081016040528092919081815260200182805461070290612c57565b801561074f5780601f106107245761010080835404028352916020019161074f565b820191906000526020600020905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b600061076482611b32565b610781576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107a882610bc4565b9050336001600160a01b038216146107e1576107c481336105dc565b6107e1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610845611b59565b61085183338484611bb2565b61085b6001600955565b505050565b600061086b826120dc565b9050836001600160a01b0316816001600160a01b03161461089e5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176108eb576108ce86336105dc565b6108eb57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661091257604051633a954ecd60e21b815260040160405180910390fd5b801561091d57600082555b6001600160a01b0386811660009081526005602052604080822080546000190190559187168152208054600101905561095a85600160e11b612143565b600085815260046020526040812091909155600160e11b841690036109af576001840160008181526004602052604081205490036109ad5760005481146109ad5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020612f7683398151915260405160405180910390a4505050505050565b6109ee612158565b600b54811115610a1157604051630590c51360e01b815260040160405180910390fd5b600c8190556040518181527f5307de8ad7d34d5ddfd5171435c143bdc645493980f453eb5d7cdb3e494a1b35906020015b60405180910390a150565b610a55612158565b6040514790600090339083908381818185875af1925050503d8060008114610a99576040519150601f19603f3d011682016040523d82523d6000602084013e610a9e565b606091505b5050905080610ac057604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a15050565b61085b838383604051806020016040528060008152506118c9565b6060816000816001600160401b03811115610b2f57610b2f612b3c565b604051908082528060200260200182016040528015610b6857816020015b610b556125fa565b815260200190600190039081610b4d5790505b50905060005b828114610bbb57610b96868683818110610b8a57610b8a612c91565b9050602002013561190d565b828281518110610ba857610ba8612c91565b6020908102919091010152600101610b6e565b50949350505050565b60006106c1826120dc565b6000805b601254811015610c7d5760128181548110610bf057610bf0612c91565b60009182526020909120600260039092020101546001600160401b036301000000909104811690841610801590610c60575060128181548110610c3557610c35612c91565b60009182526020909120600260039092020101546001600160401b03600160581b9091048116908416105b15610c6b5792915050565b80610c7581612cbd565b915050610bd3565b5060405163e82a532960e01b815260040160405180910390fd5b60006001600160a01b038216610cc0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610ced612158565b610cf760006121b7565b565b610d01612158565b6012548710610d235760405163e82a532960e01b815260040160405180910390fd5b60018710610d90576012610d38600189612cd6565b81548110610d4857610d48612c91565b60009182526020909120600260039092020101546001600160401b03600160581b90910481169083161015610d9057604051636bc1af9360e01b815260040160405180910390fd5b610d9a8282612209565b8560128881548110610dae57610dae612c91565b906000526020600020906003020160000160006101000a8154816001600160501b0302191690836001600160501b031602179055508460128881548110610df757610df7612c91565b9060005260206000209060030201600001600a6101000a81548163ffffffff021916908363ffffffff1602179055508360128881548110610e3a57610e3a612c91565b9060005260206000209060030201600101819055508260128881548110610e6357610e63612c91565b906000526020600020906003020160020160006101000a81548162ffffff021916908362ffffff1602179055508160128881548110610ea457610ea4612c91565b906000526020600020906003020160020160036101000a8154816001600160401b0302191690836001600160401b031602179055508060128881548110610eed57610eed612c91565b9060005260206000209060030201600201600b6101000a8154816001600160401b0302191690836001600160401b03160217905550600080516020612f9683398151915287878787878787604051610f4b9796959493929190612ced565b60405180910390a150505050505050565b60606000806000610f6c85610c97565b90506000816001600160401b03811115610f8857610f88612b3c565b604051908082528060200260200182016040528015610fb1578160200160208202803683370190505b509050610fbc6125fa565b60005b83861461103657610fcf8161223f565b9150816040015161102e5781516001600160a01b031615610fef57815194505b876001600160a01b0316856001600160a01b03160361102e578083878060010198508151811061102157611021612c91565b6020026020010181815250505b600101610fbf565b50909695505050505050565b6008546001600160a01b031690565b611059612158565b60125460005b818110156110c857601280548061107857611078612d3d565b60008281526020812060036000199093019283020180546001600160701b0319168155600181019190915560020180546001600160981b03191690559055806110c081612cbd565b91505061105f565b5060005b828110156114df576001811061116b5783836110e9600184612cd6565b8181106110f8576110f8612c91565b905060c0020160a00160208101906111109190612916565b6001600160401b031684848381811061112b5761112b612c91565b905060c0020160800160208101906111439190612916565b6001600160401b0316101561116b57604051636bc1af9360e01b815260040160405180910390fd5b6111c784848381811061118057611180612c91565b905060c0020160800160208101906111989190612916565b8585848181106111aa576111aa612c91565b905060c0020160a00160208101906111c29190612916565b612209565b60126040518060c001604052808686858181106111e6576111e6612c91565b6111fc92602060c0909202019081019150612d53565b6001600160501b0316815260200186868581811061121c5761121c612c91565b905060c0020160200160208101906112349190612d6e565b63ffffffff16815260200186868581811061125157611251612c91565b905060c0020160400135815260200186868581811061127257611272612c91565b905060c00201606001602081019061128a9190612d89565b62ffffff1681526020018686858181106112a6576112a6612c91565b905060c0020160800160208101906112be9190612916565b6001600160401b031681526020018686858181106112de576112de612c91565b905060c0020160a00160208101906112f69190612916565b6001600160401b039081169091528254600181810185556000948552602094859020845160039093020180549585015163ffffffff16600160501b026001600160701b03199096166001600160501b0390931692909217949094178155604083015193810193909355606082015160029093018054608084015160a0909401518316600160581b02600160581b600160981b0319949093166301000000026001600160581b031990911662ffffff909516949094179390931791909116179055600080516020612f96833981519152818585828181106113d8576113d8612c91565b6113ee92602060c0909202019081019150612d53565b86868581811061140057611400612c91565b905060c0020160200160208101906114189190612d6e565b87878681811061142a5761142a612c91565b905060c002016040013588888781811061144657611446612c91565b905060c00201606001602081019061145e9190612d89565b89898881811061147057611470612c91565b905060c0020160800160208101906114889190612916565b8a8a8981811061149a5761149a612c91565b905060c0020160a00160208101906114b29190612916565b6040516114c59796959493929190612ced565b60405180910390a1806114d781612cbd565b9150506110cc565b50505050565b6060600380546106d690612c57565b60006106c18261225f565b606081831061152157604051631960ccad60e11b815260040160405180910390fd5b60008061152d60005490565b90508084111561153b578093505b600061154687610c97565b905084861015611565578585038181101561155f578091505b50611569565b5060005b6000816001600160401b0381111561158357611583612b3c565b6040519080825280602002602001820160405280156115ac578160200160208202803683370190505b509050816000036115c257935061167192505050565b60006115cd8861190d565b9050600081604001516115de575080515b885b8881141580156115f05750848714155b15611665576115fe8161223f565b9250826040015161165d5782516001600160a01b03161561161e57825191505b8a6001600160a01b0316826001600160a01b03160361165d578084888060010199508151811061165057611650612c91565b6020026020010181815250505b6001016115e0565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116ec612621565b601254600090819084106117365760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964537461676560a01b60448201526064015b60405180910390fd5b60008481526013602090815260408083203384528252808320548784526014909252909120546012805463ffffffff909316928790811061177957611779612c91565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b0381168452600160501b900463ffffffff169383019390935260018301549082015260029091015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152969195509350915050565b61180b612158565b8163ffffffff16600b54816118236001546000540390565b61182d9190612da4565b111561184c5760405163800113cb60e01b815260040160405180910390fd5b8263ffffffff16600e546118609190612dbc565b34101561188057604051630717c22560e51b815260040160405180910390fd5b611890828463ffffffff16612287565b600d546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156114df573d6000803e3d6000fd5b6118d4848484610860565b6001600160a01b0383163b156114df576118f0848484846122a1565b6114df576040516368d2bf6b60e11b815260040160405180910390fd5b6119156125fa565b61191d6125fa565b600054831061192c5792915050565b6119358361223f565b90508060400151156119475792915050565b6116718361238c565b606061195b82611b32565b61197857604051630a14c4b560e41b815260040160405180910390fd5b60006010805461198790612c57565b80601f01602080910402602001604051908101604052809291908181526020018280546119b390612c57565b8015611a005780601f106119d557610100808354040283529160200191611a00565b820191906000526020600020905b8154815290600101906020018083116119e357829003601f168201915b505050505090508051600003611a255760405180602001604052806000815250611671565b80611a2f846123a5565b6011604051602001611a4393929190612ddb565b6040516020818303038152906040529392505050565b611a61612158565b6001600160a01b038116611ac65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161172d565b611acf816121b7565b50565b611ada612158565b600b54811115611afd5760405163430b83b160e11b815260040160405180910390fd5b600b8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a90602001610a42565b60008054821080156106c1575050600090815260046020526040902054600160e01b161590565b600260095403611bab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161172d565b6002600955565b8363ffffffff16600b5481611bca6001546000540390565b611bd49190612da4565b1115611bf35760405163800113cb60e01b815260040160405180910390fd5b42611bfc612621565b6000611c0783610bcf565b905060128181548110611c1c57611c1c612c91565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b038116808552600160501b90910463ffffffff16948401949094526001810154918301919091526002015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152600f549093501115611cf857600e54825163ffffffff8a1691611cc9916001600160501b0316612da4565b611cd39190612dbc565b341015611cf357604051630717c22560e51b815260040160405180910390fd5b611d34565b8151611d0b9063ffffffff8a1690612ea2565b6001600160501b0316341015611d3457604051630717c22560e51b815260040160405180910390fd5b606082015162ffffff1615611d8e57606082015160008281526014602052604090205462ffffff90911690611d709063ffffffff8b1690612da4565b1115611d8e5760405162d0844960e21b815260040160405180910390fd5b600c5415611dd257600c548863ffffffff16611da98961225f565b611db39190612da4565b1115611dd25760405163751304ed60e11b815260040160405180910390fd5b602082015163ffffffff1615611e445760208083015160008381526013835260408082206001600160a01b038c168352909352919091205463ffffffff91821691611e1f918b9116612ed1565b63ffffffff161115611e445760405163b4f3729b60e01b815260040160405180910390fd5b604082015115611ee3578160400151611ec5878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b031960608e901b1660208201526034019150611eaa9050565b604051602081830303815290604052805190602001206123e9565b14611ee3576040516309bde33960e01b815260040160405180910390fd5b60008181526013602090815260408083206001600160a01b038b168452909152812080548a9290611f1b90849063ffffffff16612ed1565b92506101000a81548163ffffffff021916908363ffffffff1602179055508763ffffffff16601460008381526020019081526020016000206000828254611f629190612da4565b90915550611f7890508763ffffffff8a16612287565b600f5482516001600160501b0316101561203c57600d54600e546001600160a01b03909116906108fc90611fb39063ffffffff8c1690612dbc565b6040518115909202916000818181858888f19350505050158015611fdb573d6000803e3d6000fd5b50611fe4611042565b6001600160a01b03166108fc8963ffffffff16600e546120049190612dbc565b61200e9034612cd6565b6040518115909202916000818181858888f19350505050158015612036573d6000803e3d6000fd5b506120d2565b600d546001600160a01b03166108fc612056604234612ef9565b6040518115909202916000818181858888f1935050505015801561207e573d6000803e3d6000fd5b50612087611042565b6001600160a01b03166108fc61209e604234612ef9565b6120a89034612cd6565b6040518115909202916000818181858888f193505050501580156120d0573d6000803e3d6000fd5b505b5050505050505050565b60008160005481101561212a5760008181526004602052604081205490600160e01b82169003612128575b80600003611671575060001901600081815260046020526040902054612107565b505b604051636f96cda160e11b815260040160405180910390fd5b4260a01b176001600160a01b03919091161790565b33612161611042565b6001600160a01b031614610cf75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161172d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b806001600160401b0316826001600160401b03161061223b57604051631750215560e11b815260040160405180910390fd5b5050565b6122476125fa565b6000828152600460205260409020546106c190612436565b6001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b61223b828260405180602001604052806000815250612479565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122d6903390899088908890600401612f1b565b6020604051808303816000875af1925050508015612311575060408051601f3d908101601f1916820190925261230e91810190612f58565b60015b61236f573d80801561233f576040519150601f19603f3d011682016040523d82523d6000602084013e612344565b606091505b508051600003612367576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6123946125fa565b6106c16123a0836120dc565b612436565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806123bf5750819003601f19909101908152919050565b600081815b845181101561242e5761241a8286838151811061240d5761240d612c91565b60200260200101516124e6565b91508061242681612cbd565b9150506123ee565b509392505050565b61243e6125fa565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b6124838383612512565b6001600160a01b0383163b1561085b576000548281035b6124ad60008683806001019450866122a1565b6124ca576040516368d2bf6b60e11b815260040160405180910390fd5b81811061249a5781600054146124df57600080fd5b5050505050565b6000818310612502576000828152602084905260409020611671565b5060009182526020526040902090565b60008054908290036125375760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040902080546001600160401b01840201905561256e836001841460e11b612143565b6000828152600460205260408120919091556001600160a01b038416908383019083908390600080516020612f768339815191528180a4600183015b8181146125d05780836000600080516020612f76833981519152600080a46001016125aa565b50816000036125f157604051622e076360e81b815260040160405180910390fd5b60005550505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6001600160e01b031981168114611acf57600080fd5b60006020828403121561267e57600080fd5b813561167181612656565b60005b838110156126a457818101518382015260200161268c565b838111156114df5750506000910152565b600081518084526126cd816020860160208601612689565b601f01601f19169290920160200192915050565b60208152600061167160208301846126b5565b60006020828403121561270657600080fd5b5035919050565b80356001600160a01b038116811461272457600080fd5b919050565b6000806040838503121561273c57600080fd5b6127458361270d565b946020939093013593505050565b803563ffffffff8116811461272457600080fd5b60008083601f84011261277957600080fd5b5081356001600160401b0381111561279057600080fd5b6020830191508360208260051b85010111156127ab57600080fd5b9250929050565b6000806000604084860312156127c757600080fd5b6127d084612753565b925060208401356001600160401b038111156127eb57600080fd5b6127f786828701612767565b9497909650939450505050565b60008060006060848603121561281957600080fd5b6128228461270d565b92506128306020850161270d565b9150604084013590509250925092565b6000806020838503121561285357600080fd5b82356001600160401b0381111561286957600080fd5b61287585828601612767565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015611036576128ec838551612881565b92840192608092909201916001016128d9565b80356001600160401b038116811461272457600080fd5b60006020828403121561292857600080fd5b611671826128ff565b60006020828403121561294357600080fd5b6116718261270d565b80356001600160501b038116811461272457600080fd5b803562ffffff8116811461272457600080fd5b600080600080600080600060e0888a03121561299157600080fd5b873596506129a16020890161294c565b95506129af60408901612753565b9450606088013593506129c460808901612963565b92506129d260a089016128ff565b91506129e060c089016128ff565b905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b8181101561103657835183529284019291840191600101612a0a565b60008060208385031215612a3957600080fd5b82356001600160401b0380821115612a5057600080fd5b818501915085601f830112612a6457600080fd5b813581811115612a7357600080fd5b86602060c083028501011115612a8857600080fd5b60209290920196919550909350505050565b600080600060608486031215612aaf57600080fd5b612ab88461270d565b95602085013595506040909401359392505050565b60008060408385031215612ae057600080fd5b612ae98361270d565b915060208301358015158114612afe57600080fd5b809150509250929050565b60008060408385031215612b1c57600080fd5b612b2583612753565b9150612b336020840161270d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612b6857600080fd5b612b718561270d565b9350612b7f6020860161270d565b92506040850135915060608501356001600160401b0380821115612ba257600080fd5b818701915087601f830112612bb657600080fd5b813581811115612bc857612bc8612b3c565b604051601f8201601f19908116603f01168101908382118183101715612bf057612bf0612b3c565b816040528281528a6020848701011115612c0957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b608081016106c18284612881565b60008060408385031215612c4e57600080fd5b612b258361270d565b600181811c90821680612c6b57607f821691505b602082108103612c8b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612ccf57612ccf612ca7565b5060010190565b600082821015612ce857612ce8612ca7565b500390565b9687526001600160501b0395909516602087015263ffffffff939093166040860152606085019190915262ffffff1660808401526001600160401b0390811660a08401521660c082015260e00190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612d6557600080fd5b6116718261294c565b600060208284031215612d8057600080fd5b61167182612753565b600060208284031215612d9b57600080fd5b61167182612963565b60008219821115612db757612db7612ca7565b500190565b6000816000190483118215151615612dd657612dd6612ca7565b500290565b600084516020612dee8285838a01612689565b855191840191612e018184848a01612689565b8554920191600090600181811c9080831680612e1e57607f831692505b8583108103612e3b57634e487b7160e01b85526022600452602485fd5b808015612e4f5760018114612e6457612e91565b60ff1985168852831515840288019550612e91565b60008b81526020902060005b85811015612e895781548a820152908401908801612e70565b505083880195505b50939b9a5050505050505050505050565b60006001600160501b0382811684821681151582840482111615612ec857612ec8612ca7565b02949350505050565b600063ffffffff808316818516808303821115612ef057612ef0612ca7565b01949350505050565b600082612f1657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f4e908301846126b5565b9695505050505050565b600060208284031215612f6a57600080fd5b81516116718161265656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb3268648542a1bb1b2dd12e3b14aeb5a3ab22c592de96bdd3e842154a5b394faa26469706673582212200dce03c9a4f10303d9fa88b16d3b27005a50e991156ac00488e89367101a48e164736f6c634300080f0033
Deployed Bytecode Sourcemap
87220:14354:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20568:675;;;;;;;;;;-1:-1:-1;20568:675:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;20568:675:0;;;;;;;;21542:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28713:234::-;;;;;;;;;;-1:-1:-1;28713:234:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;28713:234:0;1528:203:1;28070:448:0;;;;;;:::i;:::-;;:::i;:::-;;96175:183;;;;;;:::i;:::-;;:::i;16877:347::-;;;;;;;;;;-1:-1:-1;17167:12:0;;16938:7;17151:13;:28;16877:347;;;3373:25:1;;;3361:2;3346:18;16877:347:0;3227:177:1;32736:3069:0;;;;;;:::i;:::-;;:::i;93044:345::-;;;;;;;;;;-1:-1:-1;93044:345:0;;;;;:::i;:::-;;:::i;99554:257::-;;;;;;;;;;;;;:::i;35921:217::-;;;;;;:::i;:::-;;:::i;87827:38::-;;;;;;;;;;;;;;;;92015:125;;;;;;;;;;-1:-1:-1;92110:18:0;;92015:125;;64064:588;;;;;;;;;;-1:-1:-1;64064:588:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23099:160::-;;;;;;;;;;-1:-1:-1;23099:160:0;;;;;:::i;:::-;;:::i;100691:515::-;;;;;;;;;;-1:-1:-1;100691:515:0;;;;;:::i;:::-;;:::i;18193:245::-;;;;;;;;;;-1:-1:-1;18193:245:0;;;;;:::i;:::-;;:::i;91803:120::-;;;;;;;;;;-1:-1:-1;91893:11:0;:18;91803:120;;86176:111;;;;;;;;;;;;;:::i;94527:1422::-;;;;;;;;;;-1:-1:-1;94527:1422:0;;;;;:::i;:::-;;:::i;68340:984::-;;;;;;;;;;-1:-1:-1;68340:984:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;85456:95::-;;;;;;;;;;;;;:::i;90000:1718::-;;;;;;;;;;-1:-1:-1;90000:1718:0;;;;;:::i;:::-;;:::i;21746:112::-;;;;;;;;;;;;;:::i;93500:214::-;;;;;;;;;;-1:-1:-1;93500:214:0;;;;;:::i;:::-;;:::i;65096:2749::-;;;;;;;;;;-1:-1:-1;65096:2749:0;;;;;:::i;:::-;;:::i;29339:246::-;;;;;;;;;;-1:-1:-1;29339:246:0;;;;;:::i;:::-;;:::i;93838:565::-;;;;;;;;;;-1:-1:-1;93838:565:0;;;;;:::i;:::-;;:::i;:::-;;;;9035:13:1;;-1:-1:-1;;;;;9031:38:1;9013:57;;9117:4;9105:17;;;9099:24;9142:10;9190:21;;;9168:20;;;9161:51;;;;9256:17;;;9250:24;9228:20;;;9221:54;;;;9335:4;9323:17;;;9317:24;9343:8;9313:39;9291:20;;;9284:69;9402:4;9390:17;;;9384:24;-1:-1:-1;;;;;9483:23:1;;;9461:20;;;9454:53;;;;9567:4;9555:17;;;9549:24;9545:33;9523:20;;;9516:63;;;;9616:15;;;9610:3;9595:19;;9588:44;9663:3;9648:19;;9641:35;9000:3;8985:19;93838:565:0;8750:932:1;99160:309:0;;;;;;:::i;:::-;;:::i;36804:451::-;;;;;;:::i;:::-;;:::i;63413:468::-;;;;;;;;;;-1:-1:-1;63413:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;99926:653::-;;;;;;;;;;-1:-1:-1;99926:653:0;;;;;:::i;:::-;;:::i;29770:172::-;;;;;;;;;;-1:-1:-1;29770:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;29895:25:0;;;29867:4;29895:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29770:172;92834:125;;;;;;;;;;-1:-1:-1;92929:18:0;;92834:125;;86466:213;;;;;;;;;;-1:-1:-1;86466:213:0;;;;;:::i;:::-;;:::i;92295:389::-;;;;;;;;;;-1:-1:-1;92295:389:0;;;;;:::i;:::-;;:::i;87777:39::-;;;;;;;;;;;;;;;;20568:675;20653:4;-1:-1:-1;;;;;;;;;21001:25:0;;;;:106;;-1:-1:-1;;;;;;;;;;21082:25:0;;;21001:106;:187;;;-1:-1:-1;;;;;;;;;;21163:25:0;;;21001:187;20977:211;20568:675;-1:-1:-1;;20568:675:0:o;21542:108::-;21596:13;21633:5;21626:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21542:108;:::o;28713:234::-;28789:7;28818:16;28826:7;28818;:16::i;:::-;28813:64;;28843:34;;-1:-1:-1;;;28843:34:0;;;;;;;;;;;28813:64;-1:-1:-1;28905:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;28905:30:0;;28713:234::o;28070:448::-;28163:13;28179:16;28187:7;28179;:16::i;:::-;28163:32;-1:-1:-1;54891:10:0;-1:-1:-1;;;;;28220:28:0;;;28216:187;;28272:44;28289:5;54891:10;29770:172;:::i;28272:44::-;28267:136;;28348:35;;-1:-1:-1;;;28348:35:0;;;;;;;;;;;28267:136;28423:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;28423:35:0;-1:-1:-1;;;;;28423:35:0;;;;;;;;;28478:28;;28423:24;;28478:28;;;;;;;28148:370;28070:448;;:::o;96175:183::-;82367:21;:19;:21::i;:::-;96309:37:::1;96323:3;96328:10;96340:5;;96309:13;:37::i;:::-;82419:20:::0;81737:1;82995:7;:22;82800:229;82419:20;96175:183;;;:::o;32736:3069::-;32898:27;32928;32947:7;32928:18;:27::i;:::-;32898:57;;33021:4;-1:-1:-1;;;;;32980:45:0;32996:19;-1:-1:-1;;;;;32980:45:0;;32976:86;;33034:28;;-1:-1:-1;;;33034:28:0;;;;;;;;;;;32976:86;33084:27;31744:24;;;:15;:24;;;;;31988:26;;54891:10;31321:30;;;-1:-1:-1;;;;;30998:28:0;;31299:20;;;31296:56;33282:184;;33379:43;33396:4;54891:10;29770:172;:::i;33379:43::-;33374:92;;33431:35;;-1:-1:-1;;;33431:35:0;;;;;;;;;;;33374:92;-1:-1:-1;;;;;33491:16:0;;33487:52;;33516:23;;-1:-1:-1;;;33516:23:0;;;;;;;;;;;33487:52;33712:15;33709:172;;;33860:1;33839:19;33832:30;33709:172;-1:-1:-1;;;;;34293:24:0;;;;;;;:18;:24;;;;;;34291:26;;-1:-1:-1;;34291:26:0;;;34366:22;;;;;;34364:24;;-1:-1:-1;34364:24:0;;;34716:158;34366:22;-1:-1:-1;;;34716:18:0;:158::i;:::-;34687:26;;;;:17;:26;;;;;:187;;;;-1:-1:-1;;;35006:47:0;;:52;;35002:667;;35115:1;35105:11;;35083:19;35246:30;;;:17;:30;;;;;;:35;;35242:408;;35392:13;;35377:11;:28;35373:254;;35547:30;;;;:17;:30;;;;;:52;;;35373:254;35060:609;35002:667;35728:7;35724:2;-1:-1:-1;;;;;35709:27:0;35718:4;-1:-1:-1;;;;;35709:27:0;-1:-1:-1;;;;;;;;;;;35709:27:0;;;;;;;;;32883:2922;;;32736:3069;;;:::o;93044:345::-;85314:13;:11;:13::i;:::-;93194:18:::1;;93174:17;:38;93170:95;;;93238:27;;-1:-1:-1::0;;;93238:27:0::1;;;;;;;;;;;93170:95;93280:18;:38:::0;;;93338:39:::1;::::0;3373:25:1;;;93338:39:0::1;::::0;3361:2:1;3346:18;93338:39:0::1;;;;;;;;93044:345:::0;:::o;99554:257::-;85314:13;:11;:13::i;:::-;99679:33:::1;::::0;99624:21:::1;::::0;99608:13:::1;::::0;99679:10:::1;::::0;99624:21;;99608:13;99679:33;99608:13;99679:33;99624:21;99679:10;:33:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99660:52;;;99732:7;99727:37;;99748:16;;-1:-1:-1::0;;;99748:16:0::1;;;;;;;;;;;99727:37;99784:15;::::0;3373:25:1;;;99784:15:0::1;::::0;3361:2:1;3346:18;99784:15:0::1;;;;;;;99593:218;;99554:257::o:0;35921:217::-;36087:39;36104:4;36110:2;36114:7;36087:39;;;;;;;;;;;;:16;:39::i;64064:588::-;64228:23;64331:8;64306:22;64331:8;-1:-1:-1;;;;;64402:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64365:73;;64462:9;64457:133;64478:14;64473:1;:19;64457:133;;64538:32;64558:8;;64567:1;64558:11;;;;;;;:::i;:::-;;;;;;;64538:19;:32::i;:::-;64522:10;64533:1;64522:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;64494:3;;64457:133;;;-1:-1:-1;64615:10:0;64064:588;-1:-1:-1;;;;64064:588:0:o;23099:160::-;23171:7;23218:27;23237:7;23218:18;:27::i;100691:515::-;100828:7;;100861:298;100885:11;:18;100881:22;;100861:298;;;100968:11;100980:1;100968:14;;;;;;;;:::i;:::-;;;;;;;;;:35;:14;;;;;:35;;-1:-1:-1;;;;;100968:35:0;;;;;;100955:48;;;;;;;:118;;;101040:11;101052:1;101040:14;;;;;;;;:::i;:::-;;;;;;;;;:33;:14;;;;;:33;;-1:-1:-1;;;;;;;;101040:33:0;;;;;101028:45;;;;100955:118;100929:215;;;101123:1;100691:515;-1:-1:-1;;100691:515:0:o;100929:215::-;100905:3;;;;:::i;:::-;;;;100861:298;;;;101180:14;;-1:-1:-1;;;101180:14:0;;;;;;;;;;;18193:245;18265:7;-1:-1:-1;;;;;18293:19:0;;18289:60;;18321:28;;-1:-1:-1;;;18321:28:0;;;;;;;;;;;18289:60;-1:-1:-1;;;;;;18371:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;18371:55:0;;18193:245::o;86176:111::-;85314:13;:11;:13::i;:::-;86245:30:::1;86272:1;86245:18;:30::i;:::-;86176:111::o:0;94527:1422::-;85314:13;:11;:13::i;:::-;94844:11:::1;:18:::0;94835:27;::::1;94831:54;;94871:14;;-1:-1:-1::0;;;94871:14:0::1;;;;;;;;;;;94831:54;94913:1;94904:5;:10;94900:257;;95005:11;95017:9;95025:1;95017:5:::0;:9:::1;:::i;:::-;95005:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:41:::1;:22;::::0;;::::1;;:41;::::0;-1:-1:-1;;;;;;;;95005:41:0;;::::1;::::0;::::1;94961:85:::0;;::::1;;94935:207;;;95096:26;;-1:-1:-1::0;;;95096:26:0::1;;;;;;;;;;;94935:207;95171:123;95222:20;95261:18;95171:32;:123::i;:::-;95335:4;95309:11;95321:5;95309:18;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:30;;;;;-1:-1:-1::0;;;;;95309:30:0::1;;;;;-1:-1:-1::0;;;;;95309:30:0::1;;;;;;95387:11;95354;95366:5;95354:18;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;:44;;;;;;;;;;;;;;;;;;95445:10;95413:11;95425:5;95413:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;:42;;;;95506:14;95470:11;95482:5;95470:18;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:50;;;;;;;;;;;;;;;;;;95577:20;95535:11;95547:5;95535:18;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:62;;;;;-1:-1:-1::0;;;;;95535:62:0::1;;;;;-1:-1:-1::0;;;;;95535:62:0::1;;;;;;95652:18;95612:11;95624:5;95612:18;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;;:58;;;;;-1:-1:-1::0;;;;;95612:58:0::1;;;;;-1:-1:-1::0;;;;;95612:58:0::1;;;;;;-1:-1:-1::0;;;;;;;;;;;95726:5:0::1;95750:4;95773:11;95803:10;95832:14;95865:20;95904:18;95696:241;;;;;;;;;;;;:::i;:::-;;;;;;;;94527:1422:::0;;;;;;;:::o;68340:984::-;68418:16;68480:19;68518:25;68562:22;68587:16;68597:5;68587:9;:16::i;:::-;68562:41;;68622:25;68664:14;-1:-1:-1;;;;;68650:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68650:29:0;;68622:57;;68698:31;;:::i;:::-;68753:9;68748:516;68797:14;68782:11;:29;68748:516;;68853:15;68866:1;68853:12;:15::i;:::-;68841:27;;68895:9;:16;;;68940:8;68891:81;68998:14;;-1:-1:-1;;;;;68998:28:0;;68994:119;;69075:14;;;-1:-1:-1;68994:119:0;69160:5;-1:-1:-1;;;;;69139:26:0;:17;-1:-1:-1;;;;;69139:26:0;;69135:110;;69220:1;69194:8;69203:13;;;;;;69194:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;69135:110;68813:3;;68748:516;;;-1:-1:-1;69289:8:0;;68340:984;-1:-1:-1;;;;;;68340:984:0:o;85456:95::-;85533:6;;-1:-1:-1;;;;;85533:6:0;;85456:95::o;90000:1718::-;85314:13;:11;:13::i;:::-;90112:11:::1;:18:::0;90089:20:::1;90145:95;90169:12;90165:1;:16;90145:95;;;90207:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;90207:17:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;90207:17:0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;;;;;90207:17:0;;;;;90183:3;::::1;::::0;::::1;:::i;:::-;;;;90145:95;;;;90271:9;90266:1441;90286:20:::0;;::::1;90266:1441;;;90341:1;90336;:6;90332:288;;90458:9:::0;;90468:5:::1;90472:1;90468::::0;:5:::1;:::i;:::-;90458:16;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90397:96:0::1;:9;;90407:1;90397:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90397:96:0::1;;90367:234;;;90551:26;;-1:-1:-1::0;;;90551:26:0::1;;;;;;;;;;;90367:234;90638:161;90693:9;;90703:1;90693:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;90749:9;;90759:1;90749:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;90638:32;:161::i;:::-;90818:11;90857:444;;;;;;;;90904:9;;90914:1;90904:12;;;;;;;:::i;:::-;:17;::::0;::::1;:12;::::0;;::::1;;:17:::0;;::::1;::::0;-1:-1:-1;90904:17:0::1;:::i;:::-;-1:-1:-1::0;;;;;90857:444:0::1;;;;;90961:9;;90971:1;90961:12;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;90857:444;;;;;;91024:9;;91034:1;91024:12;;;;;;;:::i;:::-;;;;;;:23;;;90857:444;;;;91090:9;;91100:1;91090:12;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;90857:444;;;;;;91166:9;;91176:1;91166:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90857:444:0::1;;;;;91246:9;;91256:1;91246:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90857:444:0;;::::1;::::0;;;90818:502;;::::1;::::0;;::::1;::::0;;-1:-1:-1;90818:502:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;;;::::1;::::0;::::1;;-1:-1:-1::0;;;90818:502:0::1;-1:-1:-1::0;;;;;;90818:502:0;;;-1:-1:-1;;;;;90818:502:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;90818:502:0::1;-1:-1:-1::0;;;;;;;;90818:502:0;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;90818:502:0;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;;;;;;;91378:1:0;91402:9;;91378:1;91402:12;;::::1;;;;;:::i;:::-;:17;::::0;::::1;:12;::::0;;::::1;;:17:::0;;::::1;::::0;-1:-1:-1;91402:17:0::1;:::i;:::-;91442:9;;91452:1;91442:12;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;91489:9;;91499:1;91489:12;;;;;;;:::i;:::-;;;;;;:23;;;91535:9;;91545:1;91535:12;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;91585:9;;91595:1;91585:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;91641:9;;91651:1;91641:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;91344:347;;;;;;;;;;;;:::i;:::-;;;;;;;;90308:3:::0;::::1;::::0;::::1;:::i;:::-;;;;90266:1441;;;;90074:1644;90000:1718:::0;;:::o;21746:112::-;21802:13;21839:7;21832:14;;;;;:::i;93500:214::-;93646:7;93686:16;93700:1;93686:13;:16::i;65096:2749::-;65255:16;65330:4;65321:5;:13;65317:45;;65343:19;;-1:-1:-1;;;65343:19:0;;;;;;;;;;;65317:45;65381:19;65419:17;65439:14;16583:7;16614:13;;16528:111;65439:14;65419:34;-1:-1:-1;65714:9:0;65707:4;:16;65703:81;;;65755:9;65748:16;;65703:81;65802:25;65830:16;65840:5;65830:9;:16::i;:::-;65802:44;;66036:4;66028:5;:12;66024:306;;;66087:12;;;66126:31;;;66122:119;;;66206:11;66186:31;;66122:119;66042:218;66024:306;;;-1:-1:-1;66309:1:0;66024:306;66348:25;66390:17;-1:-1:-1;;;;;66376:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66376:32:0;;66348:60;;66431:17;66452:1;66431:22;66427:86;;66485:8;-1:-1:-1;66478:15:0;;-1:-1:-1;;;66478:15:0;66427:86;66669:31;66703:26;66723:5;66703:19;:26::i;:::-;66669:60;;66748:25;67005:9;:16;;;67000:100;;-1:-1:-1;67066:14:0;;67000:100;67135:5;67118:522;67147:4;67142:1;:9;;:45;;;;;67170:17;67155:11;:32;;67142:45;67118:522;;;67229:15;67242:1;67229:12;:15::i;:::-;67217:27;;67271:9;:16;;;67316:8;67267:81;67374:14;;-1:-1:-1;;;;;67374:28:0;;67370:119;;67451:14;;;-1:-1:-1;67370:119:0;67536:5;-1:-1:-1;;;;;67515:26:0;:17;-1:-1:-1;;;;;67515:26:0;;67511:110;;67596:1;67570:8;67579:13;;;;;;67570:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;67511:110;67189:3;;67118:522;;;-1:-1:-1;;;67737:29:0;;;-1:-1:-1;67744:8:0;;-1:-1:-1;;65096:2749:0;;;;;;:::o;29339:246::-;54891:10;29438:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;29438:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;29438:60:0;;;;;;;;;;29518:55;;540:41:1;;;29438:49:0;;54891:10;29518:55;;513:18:1;29518:55:0;;;;;;;29339:246;;:::o;93838:565::-;93977:20;;:::i;:::-;94101:11;:18;94016:6;;;;94092:27;;94088:90;;94140:22;;-1:-1:-1;;;94140:22:0;;14503:2:1;94140:22:0;;;14485:21:1;14542:2;14522:18;;;14515:30;-1:-1:-1;;;14561:18:1;;;14554:42;14613:18;;94140:22:0;;;;;;;;94088:90;94192:19;94214:34;;;:27;:34;;;;;;;;94249:10;94214:46;;;;;;;;94297:25;;;:18;:25;;;;;;;94345:11;:18;;94214:46;;;;;94242:5;;94345:18;;;;;;:::i;:::-;;;;;;;;;;94337:54;;;;;;;;94345:18;;;;;;;;94337:54;;-1:-1:-1;;;;;94337:54:0;;;;-1:-1:-1;;;94337:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;94337:54:0;;;;;;;-1:-1:-1;;;94337:54:0;;;;;;;;;94365:12;;-1:-1:-1;94365:12:0;-1:-1:-1;93838:565:0;-1:-1:-1;;93838:565:0:o;99160:309::-;85314:13;:11;:13::i;:::-;99292:3:::1;88905:142;;88978:18;;88972:3;88956:13;17167:12:::0;;16938:7;17151:13;:28;;16877:347;88956:13:::1;:19;;;;:::i;:::-;:40;88952:67;;;89005:14;;-1:-1:-1::0;;;89005:14:0::1;;;;;;;;;;;88952:67;99347:3:::2;99337:13;;:7;;:13;;;;:::i;:::-;99325:9;:25;99321:54;;;99359:16;;-1:-1:-1::0;;;99359:16:0::2;;;;;;;;;;;99321:54;99390:18;99400:2;99404:3;99390:18;;:9;:18::i;:::-;99431:5;::::0;99423:34:::2;::::0;-1:-1:-1;;;;;99431:5:0;;::::2;::::0;99447:9:::2;99423:34:::0;::::2;;;::::0;99431:5:::2;99423:34:::0;99431:5;99423:34;99447:9;99431:5;99423:34;::::2;;;;;;;;;;;;;::::0;::::2;;;;36804:451:::0;37003:31;37016:4;37022:2;37026:7;37003:12;:31::i;:::-;-1:-1:-1;;;;;37053:14:0;;;:19;37049:195;;37096:56;37127:4;37133:2;37137:7;37146:5;37096:30;:56::i;:::-;37091:153;;37184:40;;-1:-1:-1;;;37184:40:0;;;;;;;;;;;63413:468;63497:21;;:::i;:::-;63535:31;;:::i;:::-;16583:7;16614:13;63614:7;:25;63581:111;;63667:9;63413:468;-1:-1:-1;;63413:468:0:o;63581:111::-;63718:21;63731:7;63718:12;:21::i;:::-;63706:33;;63758:9;:16;;;63754:73;;;63802:9;63413:468;-1:-1:-1;;63413:468:0:o;63754:73::-;63848:21;63861:7;63848:12;:21::i;99926:653::-;100062:13;100106:16;100114:7;100106;:16::i;:::-;100101:59;;100131:29;;-1:-1:-1;;;100131:29:0;;;;;;;;;;;100101:59;100181:21;100205:15;100181:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100265:7;100259:21;100284:1;100259:26;:308;;;;;;;;;;;;;;;;;100389:7;100427:18;100437:7;100427:9;:18::i;:::-;100476:15;100342:176;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;100235:332;99926:653;-1:-1:-1;;;99926:653:0:o;86466:213::-;85314:13;:11;:13::i;:::-;-1:-1:-1;;;;;86559:22:0;::::1;86551:73;;;::::0;-1:-1:-1;;;86551:73:0;;16839:2:1;86551:73:0::1;::::0;::::1;16821:21:1::0;16878:2;16858:18;;;16851:30;16917:34;16897:18;;;16890:62;-1:-1:-1;;;16968:18:1;;;16961:36;17014:19;;86551:73:0::1;16637:402:1::0;86551:73:0::1;86639:28;86658:8;86639:18;:28::i;:::-;86466:213:::0;:::o;92295:389::-;85314:13;:11;:13::i;:::-;92466:18:::1;;92446:17;:38;92442:119;;;92512:33;;-1:-1:-1::0;;;92512:33:0::1;;;;;;;;;;;92442:119;92575:18;:38:::0;;;92633:39:::1;::::0;3373:25:1;;;92633:39:0::1;::::0;3361:2:1;3346:18;92633:39:0::1;3227:177:1::0;30236:302:0;30301:4;30403:13;;30393:7;:23;30346:161;;;;-1:-1:-1;;30458:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;30458:44:0;:49;;30236:302::o;82467:317::-;81785:1;82609:7;;:19;82601:63;;;;-1:-1:-1;;;82601:63:0;;17246:2:1;82601:63:0;;;17228:21:1;17285:2;17265:18;;;17258:30;17324:33;17304:18;;;17297:61;17375:18;;82601:63:0;17044:355:1;82601:63:0;81785:1;82754:7;:18;82467:317::o;96450:2435::-;96592:3;88905:142;;88978:18;;88972:3;88956:13;17167:12;;16938:7;17151:13;:28;;16877:347;88956:13;:19;;;;:::i;:::-;:40;88952:67;;;89005:14;;-1:-1:-1;;;89005:14:0;;;;;;;;;;;88952:67;96643:15:::1;96680:26;;:::i;:::-;96727:19;96749:43;96777:14;96749:27;:43::i;:::-;96727:65;;96821:11;96833;96821:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;96813:32:::1;::::0;;::::1;::::0;::::1;::::0;;96821:24:::1;::::0;;;::::1;::::0;;::::1;96813:32:::0;;-1:-1:-1;;;;;96813:32:0;::::1;::::0;;;-1:-1:-1;;;96813:32:0;;::::1;;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;-1:-1:-1::0;;;;;96813:32:0;;::::1;::::0;;;;-1:-1:-1;;;96813:32:0;;::::1;;::::0;;;;96910:9:::1;::::0;96813:32;;-1:-1:-1;;96894:230:0::1;;;96971:7;::::0;96958:10;;96957:28:::1;::::0;::::1;::::0;96958:20:::1;::::0;-1:-1:-1;;;;;96958:20:0::1;;:::i;:::-;96957:28;;;;:::i;:::-;96945:9;:40;96941:69;;;96994:16;;-1:-1:-1::0;;;96994:16:0::1;;;;;;;;;;;96941:69;96894:230;;;97067:10:::0;;:16:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;97055:28:0::1;:9;:28;97051:57;;;97092:16;;-1:-1:-1::0;;;97092:16:0::1;;;;;;;;;;;97051:57;97197:20;::::0;::::1;::::0;:24:::1;;::::0;97193:180:::1;;97286:20;::::0;::::1;::::0;97246:31:::1;::::0;;;:18:::1;:31;::::0;;;;;:60:::1;::::0;;::::1;::::0;:37:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:60;97242:115;;;97336:21;;-1:-1:-1::0;;;97336:21:0::1;;;;;;;;;;;97242:115;97453:18;::::0;:22;97449:168:::1;;97526:18;;97520:3;97500:23;;:17;97514:2;97500:13;:17::i;:::-;:23;;;;:::i;:::-;:44;97496:105;;;97574:27;;-1:-1:-1::0;;;97574:27:0::1;;;;;;;;;;;97496:105;97736:17;::::0;::::1;::::0;:21:::1;;::::0;97732:232:::1;;97878:17;::::0;;::::1;::::0;97804:40:::1;::::0;;;:27:::1;:40:::0;;;;;;-1:-1:-1;;;;;97804:44:0;::::1;::::0;;;;;;;;;;:91:::1;::::0;;::::1;::::0;:50:::1;::::0;97851:3;;97804:44:::1;:50;:::i;:::-;:91;;;97778:170;;;97922:26;;-1:-1:-1::0;;;97922:26:0::1;;;;;;;;;;;97778:170;98086:16;::::0;::::1;::::0;:21;98082:286:::1;;98295:5;:16;;;98154:137;98205:5;;98154:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;98247:20:0::1;::::0;-1:-1:-1;;;;;;18086:2:1;18057:15;;;18053:45;98247:20:0::1;::::0;::::1;18041:58:1::0;18115:12;;;-1:-1:-1;98247:20:0::1;::::0;-1:-1:-1;17912:221:1;98247:20:0::1;;;;;;;;;;;;;98237:31;;;;;;98154:24;:137::i;:::-;:157;98128:224;;98338:14;;-1:-1:-1::0;;;98338:14:0::1;;;;;;;;;;;98128:224;98388:40;::::0;;;:27:::1;:40;::::0;;;;;;;-1:-1:-1;;;;;98388:44:0;::::1;::::0;;;;;;;:51;;98436:3;;98388:40;:51:::1;::::0;98436:3;;98388:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;98489:3;98454:38;;:18;:31;98473:11;98454:31;;;;;;;;;;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;98507:18:0::1;::::0;-1:-1:-1;98517:2:0;98507:18:::1;::::0;::::1;:9;:18::i;:::-;98562:9;::::0;98549:10;;-1:-1:-1;;;;;98549:22:0::1;;98546:328;;;98601:5;::::0;98617:7:::1;::::0;-1:-1:-1;;;;;98601:5:0;;::::1;::::0;98593:38:::1;::::0;98617:13:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;98593:38;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;98658:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;98650:25:0::1;:54;98699:3;98689:13;;:7;;:13;;;;:::i;:::-;98676:27;::::0;:9:::1;:27;:::i;:::-;98650:54;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;98546:328;;;98753:5;::::0;-1:-1:-1;;;;;98753:5:0::1;98745:39;98769:14;98781:2;98769:9;:14;:::i;:::-;98745:39;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;98811:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;98803:25:0::1;:55;98842:14;98854:2;98842:9;:14;:::i;:::-;98829:28;::::0;:9:::1;:28;:::i;:::-;98803:55;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;98546:328;96597:2288;;;96450:2435:::0;;;;;:::o;24378:1379::-;24445:7;24484;24602:13;;24595:4;:20;24591:1087;;;24644:14;24661:23;;;:17;:23;;;;;;;-1:-1:-1;;;24758:24:0;;:29;;24754:901;;25463:121;25470:6;25480:1;25470:11;25463:121;;-1:-1:-1;;;25545:6:0;25527:25;;;;:17;:25;;;;;;25463:121;;24754:901;24617:1061;24591:1087;25714:31;;-1:-1:-1;;;25714:31:0;;;;;;;;;;;26365:478;26796:11;26771:23;26767:41;26764:52;-1:-1:-1;;;;;26614:28:0;;;;26754:63;;26365:478::o;85649:140::-;54891:10;85717:7;:5;:7::i;:::-;-1:-1:-1;;;;;85717:23:0;;85709:68;;;;-1:-1:-1;;;85709:68:0;;18562:2:1;85709:68:0;;;18544:21:1;;;18581:18;;;18574:30;18640:34;18620:18;;;18613:62;18692:18;;85709:68:0;18360:356:1;86863:207:0;86960:6;;;-1:-1:-1;;;;;86981:17:0;;;-1:-1:-1;;;;;;86981:17:0;;;;;;;87018:40;;86960:6;;;86981:17;86960:6;;87018:40;;86941:16;;87018:40;86926:144;86863:207;:::o;101347:198::-;101492:3;-1:-1:-1;;;;;101483:12:0;:5;-1:-1:-1;;;;;101483:12:0;;101479:54;;101504:29;;-1:-1:-1;;;101504:29:0;;;;;;;;;;;101479:54;101347:198;;:::o;23762:169::-;23830:21;;:::i;:::-;23894:24;;;;:17;:24;;;;;;23875:44;;:18;:44::i;18540:186::-;-1:-1:-1;;;;;18633:25:0;18601:7;18633:25;;;:18;:25;;11878:2;18633:25;;;;;:50;;-1:-1:-1;;;;;18632:82:0;;18540:186::o;48016:120::-;48097:27;48107:2;48111:8;48097:27;;;;;;;;;;;;:9;:27::i;39571:792::-;39779:88;;-1:-1:-1;;;39779:88:0;;39754:4;;-1:-1:-1;;;;;39779:45:0;;;;;:88;;54891:10;;39846:4;;39852:7;;39861:5;;39779:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39779:88:0;;;;;;;;-1:-1:-1;;39779:88:0;;;;;;;;;;;;:::i;:::-;;;39775:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40082:6;:13;40099:1;40082:18;40078:259;;40132:40;;-1:-1:-1;;;40132:40:0;;;;;;;;;;;40078:259;40287:6;40281:13;40272:6;40268:2;40264:15;40257:38;39775:577;-1:-1:-1;;;;;;39950:64:0;-1:-1:-1;;;39950:64:0;;-1:-1:-1;39571:792:0;;;;;;:::o;23472:174::-;23542:21;;:::i;:::-;23587:47;23606:27;23625:7;23606:18;:27::i;:::-;23587:18;:47::i;55035:1893::-;55100:17;55558:4;55551;55545:11;55541:22;55658:1;55652:4;55645:15;55741:4;55738:1;55734:12;55727:19;;;55831:1;55826:3;55819:14;55947:3;56206:5;56188:464;56258:1;56253:3;56249:11;56242:18;;56441:2;56435:4;56431:13;56427:2;56423:22;56418:3;56410:36;56543:2;56533:13;;56608:25;56188:464;56608:25;-1:-1:-1;56690:13:0;;;-1:-1:-1;;56813:14:0;;;56883:19;;;56813:14;55035:1893;-1:-1:-1;55035:1893:0:o;71666:320::-;71749:7;71796:4;71749:7;71815:126;71839:5;:12;71835:1;:16;71815:126;;;71892:33;71902:12;71916:5;71922:1;71916:8;;;;;;;;:::i;:::-;;;;;;;71892:9;:33::i;:::-;71877:48;-1:-1:-1;71853:3:0;;;;:::i;:::-;;;;71815:126;;;-1:-1:-1;71962:12:0;71666:320;-1:-1:-1;;;71666:320:0:o;25876:386::-;25942:31;;:::i;:::-;-1:-1:-1;;;;;25990:41:0;;;;-1:-1:-1;;;;;12447:3:0;26080:33;;;26046:68;:24;;;:68;-1:-1:-1;;;26148:24:0;;:29;;26129:16;;;:48;13016:3;26221:28;;;;26192:19;;;:58;25990:9;25876:386::o;47143:769::-;47294:19;47300:2;47304:8;47294:5;:19::i;:::-;-1:-1:-1;;;;;47367:14:0;;;:19;47363:523;;47411:11;47425:13;47477:14;;;47514:249;47549:62;47588:1;47592:2;47596:7;;;;;;47605:5;47549:30;:62::i;:::-;47544:175;;47651:40;;-1:-1:-1;;;47651:40:0;;;;;;;;;;;47544:175;47758:3;47750:5;:11;47514:249;;47853:3;47836:13;;:20;47832:34;;47858:8;;;47832:34;47388:498;;47143:769;;;:::o;79326:157::-;79389:7;79424:1;79420;:5;:51;;79567:13;79673:15;;;79713:4;79706:15;;;79764:4;79748:21;;79420:51;;;-1:-1:-1;79567:13:0;79673:15;;;79713:4;79706:15;79764:4;79748:21;;;79326:157::o;40889:3222::-;40966:20;40989:13;;;41021;;;41017:44;;41043:18;;-1:-1:-1;;;41043:18:0;;;;;;;;;;;41017:44;-1:-1:-1;;;;;41601:22:0;;;;;;:18;:22;;11878:2;41601:22;;:71;;-1:-1:-1;;;;;41627:45:0;;41601:71;;;41977:151;41601:22;-1:-1:-1;27271:15:0;;27245:24;27241:46;41977:18;:151::i;:::-;41943:31;;;;:17;:31;;;;;:185;;;;-1:-1:-1;;;;;42762:25:0;;;42202:23;;;;41961:12;;42762:25;;-1:-1:-1;;;;;;;;;;;41943:31:0;;42860:363;43573:1;43559:12;43555:20;43509:374;43618:3;43609:7;43606:16;43509:374;;43852:7;43842:8;43839:1;-1:-1:-1;;;;;;;;;;;43809:1:0;43806;43801:59;43675:1;43662:15;43509:374;;;43513:85;43924:8;43936:1;43924:13;43920:45;;43946:19;;-1:-1:-1;;;43946:19:0;;;;;;;;;;;43920:45;43990:13;:19;-1:-1:-1;96175:183:0;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:163::-;2240:20;;2300:10;2289:22;;2279:33;;2269:61;;2326:1;2323;2316:12;2341:367;2404:8;2414:6;2468:3;2461:4;2453:6;2449:17;2445:27;2435:55;;2486:1;2483;2476:12;2435:55;-1:-1:-1;2509:20:1;;-1:-1:-1;;;;;2541:30:1;;2538:50;;;2584:1;2581;2574:12;2538:50;2621:4;2613:6;2609:17;2597:29;;2681:3;2674:4;2664:6;2661:1;2657:14;2649:6;2645:27;2641:38;2638:47;2635:67;;;2698:1;2695;2688:12;2635:67;2341:367;;;;;:::o;2713:509::-;2807:6;2815;2823;2876:2;2864:9;2855:7;2851:23;2847:32;2844:52;;;2892:1;2889;2882:12;2844:52;2915:28;2933:9;2915:28;:::i;:::-;2905:38;-1:-1:-1;2994:2:1;2979:18;;2966:32;-1:-1:-1;;;;;3010:30:1;;3007:50;;;3053:1;3050;3043:12;3007:50;3092:70;3154:7;3145:6;3134:9;3130:22;3092:70;:::i;:::-;2713:509;;3181:8;;-1:-1:-1;3066:96:1;;-1:-1:-1;;;;2713:509:1:o;3409:328::-;3486:6;3494;3502;3555:2;3543:9;3534:7;3530:23;3526:32;3523:52;;;3571:1;3568;3561:12;3523:52;3594:29;3613:9;3594:29;:::i;:::-;3584:39;;3642:38;3676:2;3665:9;3661:18;3642:38;:::i;:::-;3632:48;;3727:2;3716:9;3712:18;3699:32;3689:42;;3409:328;;;;;:::o;3742:437::-;3828:6;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;3932:23;;-1:-1:-1;;;;;3967:30:1;;3964:50;;;4010:1;4007;4000:12;3964:50;4049:70;4111:7;4102:6;4091:9;4087:22;4049:70;:::i;:::-;4138:8;;4023:96;;-1:-1:-1;3742:437:1;-1:-1:-1;;;;3742:437:1:o;4184:349::-;4268:12;;-1:-1:-1;;;;;4264:38:1;4252:51;;4356:4;4345:16;;;4339:23;-1:-1:-1;;;;;4335:48:1;4319:14;;;4312:72;4372:2;4436:16;;;4430:23;4423:31;4416:39;4400:14;;;4393:63;4509:4;4498:16;;;4492:23;4517:8;4488:38;4472:14;;4465:62;4184:349::o;4538:720::-;4769:2;4821:21;;;4891:13;;4794:18;;;4913:22;;;4740:4;;4769:2;4992:15;;;;4966:2;4951:18;;;4740:4;5035:197;5049:6;5046:1;5043:13;5035:197;;;5098:52;5146:3;5137:6;5131:13;5098:52;:::i;:::-;5207:15;;;;5179:4;5170:14;;;;;5071:1;5064:9;5035:197;;5263:171;5330:20;;-1:-1:-1;;;;;5379:30:1;;5369:41;;5359:69;;5424:1;5421;5414:12;5439:184;5497:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:52;;;5566:1;5563;5556:12;5518:52;5589:28;5607:9;5589:28;:::i;5628:186::-;5687:6;5740:2;5728:9;5719:7;5715:23;5711:32;5708:52;;;5756:1;5753;5746:12;5708:52;5779:29;5798:9;5779:29;:::i;5819:171::-;5886:20;;-1:-1:-1;;;;;5935:30:1;;5925:41;;5915:69;;5980:1;5977;5970:12;5995:161;6062:20;;6122:8;6111:20;;6101:31;;6091:59;;6146:1;6143;6136:12;6161:612;6269:6;6277;6285;6293;6301;6309;6317;6370:3;6358:9;6349:7;6345:23;6341:33;6338:53;;;6387:1;6384;6377:12;6338:53;6423:9;6410:23;6400:33;;6452:37;6485:2;6474:9;6470:18;6452:37;:::i;:::-;6442:47;;6508:37;6541:2;6530:9;6526:18;6508:37;:::i;:::-;6498:47;;6592:2;6581:9;6577:18;6564:32;6554:42;;6615:38;6648:3;6637:9;6633:19;6615:38;:::i;:::-;6605:48;;6672:38;6705:3;6694:9;6690:19;6672:38;:::i;:::-;6662:48;;6729:38;6762:3;6751:9;6747:19;6729:38;:::i;:::-;6719:48;;6161:612;;;;;;;;;;:::o;6778:632::-;6949:2;7001:21;;;7071:13;;6974:18;;;7093:22;;;6920:4;;6949:2;7172:15;;;;7146:2;7131:18;;;6920:4;7215:169;7229:6;7226:1;7223:13;7215:169;;;7290:13;;7278:26;;7359:15;;;;7324:12;;;;7251:1;7244:9;7215:169;;7415:651;7534:6;7542;7595:2;7583:9;7574:7;7570:23;7566:32;7563:52;;;7611:1;7608;7601:12;7563:52;7638:23;;-1:-1:-1;;;;;7710:14:1;;;7707:34;;;7737:1;7734;7727:12;7707:34;7775:6;7764:9;7760:22;7750:32;;7820:7;7813:4;7809:2;7805:13;7801:27;7791:55;;7842:1;7839;7832:12;7791:55;7882:2;7869:16;7908:2;7900:6;7897:14;7894:34;;;7924:1;7921;7914:12;7894:34;7980:7;7975:2;7967:4;7959:6;7955:17;7951:2;7947:26;7943:35;7940:48;7937:68;;;8001:1;7998;7991:12;7937:68;8032:2;8024:11;;;;;8054:6;;-1:-1:-1;7415:651:1;;-1:-1:-1;;;;7415:651:1:o;8071:322::-;8148:6;8156;8164;8217:2;8205:9;8196:7;8192:23;8188:32;8185:52;;;8233:1;8230;8223:12;8185:52;8256:29;8275:9;8256:29;:::i;:::-;8246:39;8332:2;8317:18;;8304:32;;-1:-1:-1;8383:2:1;8368:18;;;8355:32;;8071:322;-1:-1:-1;;;8071:322:1:o;8398:347::-;8463:6;8471;8524:2;8512:9;8503:7;8499:23;8495:32;8492:52;;;8540:1;8537;8530:12;8492:52;8563:29;8582:9;8563:29;:::i;:::-;8553:39;;8642:2;8631:9;8627:18;8614:32;8689:5;8682:13;8675:21;8668:5;8665:32;8655:60;;8711:1;8708;8701:12;8655:60;8734:5;8724:15;;;8398:347;;;;;:::o;9687:258::-;9754:6;9762;9815:2;9803:9;9794:7;9790:23;9786:32;9783:52;;;9831:1;9828;9821:12;9783:52;9854:28;9872:9;9854:28;:::i;:::-;9844:38;;9901;9935:2;9924:9;9920:18;9901:38;:::i;:::-;9891:48;;9687:258;;;;;:::o;9950:127::-;10011:10;10006:3;10002:20;9999:1;9992:31;10042:4;10039:1;10032:15;10066:4;10063:1;10056:15;10082:1138;10177:6;10185;10193;10201;10254:3;10242:9;10233:7;10229:23;10225:33;10222:53;;;10271:1;10268;10261:12;10222:53;10294:29;10313:9;10294:29;:::i;:::-;10284:39;;10342:38;10376:2;10365:9;10361:18;10342:38;:::i;:::-;10332:48;-1:-1:-1;10427:2:1;10412:18;;10399:32;;-1:-1:-1;10482:2:1;10467:18;;10454:32;-1:-1:-1;;;;;10535:14:1;;;10532:34;;;10562:1;10559;10552:12;10532:34;10600:6;10589:9;10585:22;10575:32;;10645:7;10638:4;10634:2;10630:13;10626:27;10616:55;;10667:1;10664;10657:12;10616:55;10703:2;10690:16;10725:2;10721;10718:10;10715:36;;;10731:18;;:::i;:::-;10806:2;10800:9;10774:2;10860:13;;-1:-1:-1;;10856:22:1;;;10880:2;10852:31;10848:40;10836:53;;;10904:18;;;10924:22;;;10901:46;10898:72;;;10950:18;;:::i;:::-;10990:10;10986:2;10979:22;11025:2;11017:6;11010:18;11065:7;11060:2;11055;11051;11047:11;11043:20;11040:33;11037:53;;;11086:1;11083;11076:12;11037:53;11142:2;11137;11133;11129:11;11124:2;11116:6;11112:15;11099:46;11187:1;11182:2;11177;11169:6;11165:15;11161:24;11154:35;11208:6;11198:16;;;;;;;10082:1138;;;;;;;:::o;11225:264::-;11419:3;11404:19;;11432:51;11408:9;11465:6;11432:51;:::i;11494:260::-;11562:6;11570;11623:2;11611:9;11602:7;11598:23;11594:32;11591:52;;;11639:1;11636;11629:12;11591:52;11662:29;11681:9;11662:29;:::i;11759:380::-;11838:1;11834:12;;;;11881;;;11902:61;;11956:4;11948:6;11944:17;11934:27;;11902:61;12009:2;12001:6;11998:14;11978:18;11975:38;11972:161;;12055:10;12050:3;12046:20;12043:1;12036:31;12090:4;12087:1;12080:15;12118:4;12115:1;12108:15;11972:161;;11759:380;;;:::o;12354:127::-;12415:10;12410:3;12406:20;12403:1;12396:31;12446:4;12443:1;12436:15;12470:4;12467:1;12460:15;12486:127;12547:10;12542:3;12538:20;12535:1;12528:31;12578:4;12575:1;12568:15;12602:4;12599:1;12592:15;12618:135;12657:3;12678:17;;;12675:43;;12698:18;;:::i;:::-;-1:-1:-1;12745:1:1;12734:13;;12618:135::o;12758:125::-;12798:4;12826:1;12823;12820:8;12817:34;;;12831:18;;:::i;:::-;-1:-1:-1;12868:9:1;;12758:125::o;12888:709::-;13193:25;;;-1:-1:-1;;;;;13254:31:1;;;;13249:2;13234:18;;13227:59;13334:10;13322:23;;;;13317:2;13302:18;;13295:51;13377:2;13362:18;;13355:34;;;;13438:8;13426:21;13420:3;13405:19;;13398:50;-1:-1:-1;;;;;13522:15:1;;;13516:3;13501:19;;13494:44;13575:15;13569:3;13554:19;;13547:44;13180:3;13165:19;;12888:709::o;13602:127::-;13663:10;13658:3;13654:20;13651:1;13644:31;13694:4;13691:1;13684:15;13718:4;13715:1;13708:15;13734:184;13792:6;13845:2;13833:9;13824:7;13820:23;13816:32;13813:52;;;13861:1;13858;13851:12;13813:52;13884:28;13902:9;13884:28;:::i;13923:184::-;13981:6;14034:2;14022:9;14013:7;14009:23;14005:32;14002:52;;;14050:1;14047;14040:12;14002:52;14073:28;14091:9;14073:28;:::i;14112:184::-;14170:6;14223:2;14211:9;14202:7;14198:23;14194:32;14191:52;;;14239:1;14236;14229:12;14191:52;14262:28;14280:9;14262:28;:::i;14642:128::-;14682:3;14713:1;14709:6;14706:1;14703:13;14700:39;;;14719:18;;:::i;:::-;-1:-1:-1;14755:9:1;;14642:128::o;14775:168::-;14815:7;14881:1;14877;14873:6;14869:14;14866:1;14863:21;14858:1;14851:9;14844:17;14840:45;14837:71;;;14888:18;;:::i;:::-;-1:-1:-1;14928:9:1;;14775:168::o;15074:1558::-;15298:3;15336:6;15330:13;15362:4;15375:51;15419:6;15414:3;15409:2;15401:6;15397:15;15375:51;:::i;:::-;15489:13;;15448:16;;;;15511:55;15489:13;15448:16;15533:15;;;15511:55;:::i;:::-;15655:13;;15588:20;;;15628:1;;15715;15737:18;;;;15790;;;;15817:93;;15895:4;15885:8;15881:19;15869:31;;15817:93;15958:2;15948:8;15945:16;15925:18;15922:40;15919:167;;-1:-1:-1;;;15985:33:1;;16041:4;16038:1;16031:15;16071:4;15992:3;16059:17;15919:167;16102:18;16129:141;;;;16284:1;16279:328;;;;16095:512;;16129:141;-1:-1:-1;;16164:24:1;;16150:39;;16241:16;;16234:24;16220:39;;16209:51;;;-1:-1:-1;16129:141:1;;16279:328;15021:1;15014:14;;;15058:4;15045:18;;16374:1;16388:169;16402:8;16399:1;16396:15;16388:169;;;16484:14;;16469:13;;;16462:37;16527:16;;;;16419:10;;16388:169;;;16392:3;;16588:8;16581:5;16577:20;16570:27;;16095:512;-1:-1:-1;16623:3:1;;15074:1558;-1:-1:-1;;;;;;;;;;;15074:1558:1:o;17404:270::-;17443:7;-1:-1:-1;;;;;17513:10:1;;;17543;;;17576:11;;17569:19;17598:12;;;17590:21;;17565:47;17562:73;;;17615:18;;:::i;:::-;17655:13;;17404:270;-1:-1:-1;;;;17404:270:1:o;17679:228::-;17718:3;17746:10;17783:2;17780:1;17776:10;17813:2;17810:1;17806:10;17844:3;17840:2;17836:12;17831:3;17828:21;17825:47;;;17852:18;;:::i;:::-;17888:13;;17679:228;-1:-1:-1;;;;17679:228:1:o;18138:217::-;18178:1;18204;18194:132;;18248:10;18243:3;18239:20;18236:1;18229:31;18283:4;18280:1;18273:15;18311:4;18308:1;18301:15;18194:132;-1:-1:-1;18340:9:1;;18138:217::o;18721:489::-;-1:-1:-1;;;;;18990:15:1;;;18972:34;;19042:15;;19037:2;19022:18;;19015:43;19089:2;19074:18;;19067:34;;;19137:3;19132:2;19117:18;;19110:31;;;18915:4;;19158:46;;19184:19;;19176:6;19158:46;:::i;:::-;19150:54;18721:489;-1:-1:-1;;;;;;18721:489:1:o;19215:249::-;19284:6;19337:2;19325:9;19316:7;19312:23;19308:32;19305:52;;;19353:1;19350;19343:12;19305:52;19385:9;19379:16;19404:30;19428:5;19404:30;:::i
Swarm Source
ipfs://0dce03c9a4f10303d9fa88b16d3b27005a50e991156ac00488e89367101a48e1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.