Source Code
Overview
ETH Balance
0.0009 ETH
Eth Value
$1.84 (@ $2,048.89/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 83 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 17568635 | 1010 days ago | IN | 0 ETH | 0.0003273 | ||||
| Set Approval For... | 17553194 | 1012 days ago | IN | 0 ETH | 0.0004183 | ||||
| Set Approval For... | 17553187 | 1012 days ago | IN | 0 ETH | 0.00032533 | ||||
| Mint | 16872749 | 1108 days ago | IN | 0 ETH | 0.00208341 | ||||
| Mint | 16872725 | 1108 days ago | IN | 0 ETH | 0.00246518 | ||||
| Mint | 16872712 | 1108 days ago | IN | 0 ETH | 0.00206368 | ||||
| Setmax Free Per ... | 16872697 | 1108 days ago | IN | 0 ETH | 0.00043286 | ||||
| Mint | 16872692 | 1108 days ago | IN | 0 ETH | 0.00225325 | ||||
| Mint | 16872670 | 1108 days ago | IN | 0 ETH | 0.00228912 | ||||
| Mint | 16872660 | 1108 days ago | IN | 0 ETH | 0.00225459 | ||||
| Mint | 16872652 | 1108 days ago | IN | 0 ETH | 0.00236034 | ||||
| Mint | 16872647 | 1108 days ago | IN | 0 ETH | 0.00246398 | ||||
| Mint | 16872641 | 1108 days ago | IN | 0 ETH | 0.00227677 | ||||
| Mint | 16869934 | 1108 days ago | IN | 0 ETH | 0.00409973 | ||||
| Mint | 16868939 | 1108 days ago | IN | 0.0009 ETH | 0.00338087 | ||||
| Setmax Free Per ... | 16868927 | 1108 days ago | IN | 0 ETH | 0.00057551 | ||||
| Set Approval For... | 16868860 | 1108 days ago | IN | 0 ETH | 0.00070078 | ||||
| Setmax Free Per ... | 16868854 | 1108 days ago | IN | 0 ETH | 0.00048802 | ||||
| Mint | 16868846 | 1108 days ago | IN | 0 ETH | 0.00208277 | ||||
| Mint | 16868845 | 1108 days ago | IN | 0 ETH | 0.00226607 | ||||
| Mint | 16868838 | 1108 days ago | IN | 0 ETH | 0.00240145 | ||||
| Mint | 16868817 | 1108 days ago | IN | 0 ETH | 0.00243593 | ||||
| Mint | 16868816 | 1108 days ago | IN | 0 ETH | 0.00256902 | ||||
| Mint | 16868814 | 1108 days ago | IN | 0 ETH | 0.0026073 | ||||
| Mint | 16868807 | 1108 days ago | IN | 0 ETH | 0.00274393 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MysteryOfTheKeysNFT
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.9 <0.9.0;
import 'erc721a/contracts/ERC721A.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/token/common/ERC2981.sol';
contract MysteryOfTheKeysNFT is ERC721A, ERC2981, Ownable, ReentrancyGuard {
using Strings for uint256;
bytes32 public merkleRoot;
mapping(address => bool) public presaleClaimed;
mapping(address => uint256) public mintCounter;
mapping (address => bool) private _mintedFree;
string public uriPrefix = '';
string public uriSuffix = '.json';
string public hiddenMetadataUri;
uint256 public price = 0.0029 ether;
uint256 public freeMinted = 0;
uint256 public maxFreePerWallet = 1;
uint256 public totalFree = 2000;
uint256 public maxSupply;
uint256 public maxMintAmountPerTx;
uint256 public maxMintAmountPerW;
bool public paused = false;
bool public publicM = true;
bool public revealed = false;
constructor(
string memory _tokenName,
string memory _tokenSymbol,
uint256 _maxSupply,
uint256 _maxMintAmountPerTx,
uint256 _maxMintAmountPerW,
string memory _hiddenMetadataUri
) ERC721A(_tokenName, _tokenSymbol) {
_setDefaultRoyalty(0xb1435616439458c8012A7cc29e66E39eAF9587Ae, 500);
maxSupply = _maxSupply;
setMaxMintAmountPerTx(_maxMintAmountPerTx);
setMaxMintAmountPerW(_maxMintAmountPerW);
setHiddenMetadataUri(_hiddenMetadataUri);
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
return super.supportsInterface(interfaceId);
}
function setDefaultRoyalty(
address _receiver,
uint96 _feeNumerator
) external onlyOwner {
super._setDefaultRoyalty(_receiver, _feeNumerator);
}
function deleteDefaultRoyalty() external onlyOwner {
super._deleteDefaultRoyalty();
}
modifier mintCompliance(uint256 _mintAmount) {
require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
require(
mintCounter[_msgSender()] + _mintAmount <= maxMintAmountPerW,
"exceeds max per address"
);
require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
mintCounter[_msgSender()] = mintCounter[_msgSender()] + _mintAmount;
_;
}
modifier mintPriceCompliance(uint256 _mintAmount) {
require(msg.value >= price * _mintAmount, 'Insufficient funds!');
_;
}
modifier onlyAccounts () {
require(msg.sender == tx.origin, "Not allowed origin");
_;
}
function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
require(!paused, 'The contract is paused!');
require(publicM, "PublicSale is OFF");
require(totalSupply() + _mintAmount <= maxSupply, "reached Max Supply");
bool isFreeLeft = !(_mintedFree[msg.sender]) &&
(freeMinted < totalFree);
bool isEqual = _mintAmount == maxFreePerWallet;
uint256 cost = price;
if (isFreeLeft && isEqual) {
cost = 0;
}
if (isFreeLeft && !isEqual) {
require(
msg.value >= (_mintAmount - maxFreePerWallet) * cost,
"Please send the exact amount."
);
} else {
require(msg.value >= _mintAmount * cost, "Please send the exact amount.");
}
require(
_numberMinted(msg.sender) + _mintAmount <= maxMintAmountPerW,
"Can not mint more than 10"
);
_mintedFree[msg.sender] = true;
if (isFreeLeft) {
freeMinted++;
}
_safeMint(msg.sender, _mintAmount);
}
function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
require(totalSupply() + _mintAmount <= maxSupply, "reached Max Supply");
_safeMint(_receiver, _mintAmount);
}
function _startTokenId() internal view virtual override returns (uint256) {
return 1;
}
function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');
if (revealed == false) {
return hiddenMetadataUri;
}
string memory currentBaseURI = _baseURI();
return bytes(currentBaseURI).length > 0
? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
: '';
}
function setRevealed(bool _state) public onlyOwner {
revealed = _state;
}
function setprice(uint256 _price) public onlyOwner {
price = _price;
}
function setmaxFreePerWallet(uint256 _maxFreePerWallet) public onlyOwner {
maxFreePerWallet = _maxFreePerWallet;
}
function settotalFree(uint256 _totalFree) public onlyOwner {
totalFree = _totalFree;
}
function setmaxSupply(uint256 _maxSupply) public onlyOwner {
maxSupply = _maxSupply;
}
function setMaxMintAmountPerW(uint256 _maxMintAmountPerW) public onlyOwner {
maxMintAmountPerW = _maxMintAmountPerW;
}
function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
maxMintAmountPerTx = _maxMintAmountPerTx;
}
function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
hiddenMetadataUri = _hiddenMetadataUri;
}
function setUriPrefix(string memory _uriPrefix) public onlyOwner {
uriPrefix = _uriPrefix;
}
function setUriSuffix(string memory _uriSuffix) public onlyOwner {
uriSuffix = _uriSuffix;
}
function _mintedAmount(address minter) external view returns (uint256) {
return _numberMinted(minter);
}
function togglePause() public onlyOwner {
paused = !paused;
}
function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
merkleRoot = _merkleRoot;
}
function togglePublicSale() public onlyOwner {
publicM = !publicM;
}
function withdraw() public onlyOwner nonReentrant {
(bool os, ) = payable(owner()).call{value: address(this).balance}('');
require(os);
}
function _baseURI() internal view virtual override returns (string memory) {
return uriPrefix;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)
pragma solidity ^0.8.0;
import "../../interfaces/IERC2981.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
*
* Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
* specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
*
* Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
* fee is specified in basis points by default.
*
* IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
* https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
* voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
*
* _Available since v4.5._
*/
abstract contract ERC2981 is IERC2981, ERC165 {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
RoyaltyInfo private _defaultRoyaltyInfo;
mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @inheritdoc IERC2981
*/
function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];
if (royalty.receiver == address(0)) {
royalty = _defaultRoyaltyInfo;
}
uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();
return (royalty.receiver, royaltyAmount);
}
/**
* @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
* fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
* override.
*/
function _feeDenominator() internal pure virtual returns (uint96) {
return 10000;
}
/**
* @dev Sets the royalty information that all ids in this contract will default to.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: invalid receiver");
_defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Removes default royalty information.
*/
function _deleteDefaultRoyalty() internal virtual {
delete _defaultRoyaltyInfo;
}
/**
* @dev Sets the royalty information for a specific token id, overriding the global default.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setTokenRoyalty(
uint256 tokenId,
address receiver,
uint96 feeNumerator
) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: Invalid parameters");
_tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Resets royalty information for the token id back to the global default.
*/
function _resetTokenRoyalty(uint256 tokenId) internal virtual {
delete _tokenRoyaltyInfo[tokenId];
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
// 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;
}
}// SPDX-License-Identifier: MIT
// 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)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @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);
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721A.sol';
/**
* @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)
}
}
}// SPDX-License-Identifier: MIT
// 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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
import "../utils/introspection/IERC165.sol";
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}// SPDX-License-Identifier: MIT
// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerW","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"_mintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMinted","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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerW","type":"uint256"}],"name":"setMaxMintAmountPerW","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreePerWallet","type":"uint256"}],"name":"setmaxFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalFree","type":"uint256"}],"name":"settotalFree","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":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFree","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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526040518060200160405280600081525060109081620000249190620007f1565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601190816200006b9190620007f1565b50660a4d88ddd94000601355600060145560016015556107d06016556000601a60006101000a81548160ff0219169083151502179055506001601a60016101000a81548160ff0219169083151502179055506000601a60026101000a81548160ff021916908315150217905550348015620000e557600080fd5b50604051620052f4380380620052f483398181016040528101906200010b919062000a6d565b858581600290816200011e9190620007f1565b508060039081620001309190620007f1565b5062000141620001df60201b60201c565b6000819055505050620001696200015d620001e860201b60201c565b620001f060201b60201c565b6001600b819055506200019973b1435616439458c8012a7cc29e66e39eaf9587ae6101f4620002b660201b60201c565b83601781905550620001b1836200045960201b60201c565b620001c2826200047360201b60201c565b620001d3816200048d60201b60201c565b50505050505062000cf3565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002c6620004b260201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031e9062000bed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000399576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003909062000c5f565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b62000469620004bc60201b60201c565b8060188190555050565b62000483620004bc60201b60201c565b8060198190555050565b6200049d620004bc60201b60201c565b8060129081620004ae9190620007f1565b5050565b6000612710905090565b620004cc620001e860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004f26200054d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200054b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005429062000cd1565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005f957607f821691505b6020821081036200060f576200060e620005b1565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200063a565b6200068586836200063a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006d2620006cc620006c6846200069d565b620006a7565b6200069d565b9050919050565b6000819050919050565b620006ee83620006b1565b62000706620006fd82620006d9565b84845462000647565b825550505050565b600090565b6200071d6200070e565b6200072a818484620006e3565b505050565b5b8181101562000752576200074660008262000713565b60018101905062000730565b5050565b601f821115620007a1576200076b8162000615565b62000776846200062a565b8101602085101562000786578190505b6200079e62000795856200062a565b8301826200072f565b50505b505050565b600082821c905092915050565b6000620007c660001984600802620007a6565b1980831691505092915050565b6000620007e18383620007b3565b9150826002028217905092915050565b620007fc8262000577565b67ffffffffffffffff81111562000818576200081762000582565b5b620008248254620005e0565b6200083182828562000756565b600060209050601f83116001811462000869576000841562000854578287015190505b620008608582620007d3565b865550620008d0565b601f198416620008798662000615565b60005b82811015620008a3578489015182556001820191506020850194506020810190506200087c565b86831015620008c35784890151620008bf601f891682620007b3565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200091282620008f6565b810181811067ffffffffffffffff8211171562000934576200093362000582565b5b80604052505050565b600062000949620008d8565b905062000957828262000907565b919050565b600067ffffffffffffffff8211156200097a576200097962000582565b5b6200098582620008f6565b9050602081019050919050565b60005b83811015620009b257808201518184015260208101905062000995565b60008484015250505050565b6000620009d5620009cf846200095c565b6200093d565b905082815260208101848484011115620009f457620009f3620008f1565b5b62000a0184828562000992565b509392505050565b600082601f83011262000a215762000a20620008ec565b5b815162000a33848260208601620009be565b91505092915050565b62000a47816200069d565b811462000a5357600080fd5b50565b60008151905062000a678162000a3c565b92915050565b60008060008060008060c0878903121562000a8d5762000a8c620008e2565b5b600087015167ffffffffffffffff81111562000aae5762000aad620008e7565b5b62000abc89828a0162000a09565b965050602087015167ffffffffffffffff81111562000ae05762000adf620008e7565b5b62000aee89828a0162000a09565b955050604062000b0189828a0162000a56565b945050606062000b1489828a0162000a56565b935050608062000b2789828a0162000a56565b92505060a087015167ffffffffffffffff81111562000b4b5762000b4a620008e7565b5b62000b5989828a0162000a09565b9150509295509295509295565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000bd5602a8362000b66565b915062000be28262000b77565b604082019050919050565b6000602082019050818103600083015262000c088162000bc6565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000c4760198362000b66565b915062000c548262000c0f565b602082019050919050565b6000602082019050818103600083015262000c7a8162000c38565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000cb960208362000b66565b915062000cc68262000c81565b602082019050919050565b6000602082019050818103600083015262000cec8162000caa565b9050919050565b6145f18062000d036000396000f3fe60806040526004361061031a5760003560e01c80637ec4a659116101ab578063b071401b116100f7578063e0a8085311610095578063ed64892b1161006f578063ed64892b14610b22578063efbd73f414610b5f578063f2fde38b14610b88578063f9765bc114610bb15761031a565b8063e0a8085314610aa5578063e222c7f914610ace578063e985e9c514610ae55761031a565b8063c87b56dd116100d1578063c87b56dd146109e9578063d10a1a2b14610a26578063d49f0fa514610a51578063d5abeb0114610a7a5761031a565b8063b071401b1461098d578063b88d4fde146109b6578063c4ae3168146109d25761031a565b8063a035b1fe11610164578063a45063c01161013e578063a45063c0146108f5578063a45ba8e714610920578063a70273571461094b578063aa1b103f146109765761031a565b8063a035b1fe14610885578063a0712d68146108b0578063a22cb465146108cc5761031a565b80637ec4a65914610787578063867cb30e146107b05780638da5cb5b146107db5780639254d4f41461080657806394354fd01461082f57806395d89b411461085a5761031a565b8063333e44e61161026a5780635c975abb1161022357806365ee9a78116101fd57806365ee9a78146106e157806370a082311461070a578063715018a6146107475780637cb647591461075e5761031a565b80635c975abb1461064e57806362b99ad4146106795780636352211e146106a45761031a565b8063333e44e6146105715780633ccfd60b1461059c57806342842e0e146105b35780634fdd43cb146105cf57806351830227146105f85780635503a0e8146106235761031a565b806318160ddd116102d757806323b872dd116102b157806323b872dd146104c357806326b092df146104df5780632a55205a146105085780632eb4a7ab146105465761031a565b806318160ddd146104325780631cdce9fe1461045d578063228025e81461049a5761031a565b806301ffc9a71461031f57806304634d8d1461035c57806306fdde0314610385578063081812fc146103b0578063095ea7b3146103ed57806316ba10e014610409575b600080fd5b34801561032b57600080fd5b50610346600480360381019061034191906130ca565b610bee565b6040516103539190613112565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e91906131cf565b610c00565b005b34801561039157600080fd5b5061039a610c16565b6040516103a7919061329f565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d291906132f7565b610ca8565b6040516103e49190613333565b60405180910390f35b6104076004803603810190610402919061334e565b610d27565b005b34801561041557600080fd5b50610430600480360381019061042b91906134c3565b610e6b565b005b34801561043e57600080fd5b50610447610e86565b604051610454919061351b565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613536565b610e9d565b604051610491919061351b565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc91906132f7565b610eb5565b005b6104dd60048036038101906104d89190613563565b610ec7565b005b3480156104eb57600080fd5b50610506600480360381019061050191906132f7565b6111e9565b005b34801561051457600080fd5b5061052f600480360381019061052a91906135b6565b6111fb565b60405161053d9291906135f6565b60405180910390f35b34801561055257600080fd5b5061055b6113e5565b6040516105689190613638565b60405180910390f35b34801561057d57600080fd5b506105866113eb565b604051610593919061351b565b60405180910390f35b3480156105a857600080fd5b506105b16113f1565b005b6105cd60048036038101906105c89190613563565b611489565b005b3480156105db57600080fd5b506105f660048036038101906105f191906134c3565b6114a9565b005b34801561060457600080fd5b5061060d6114c4565b60405161061a9190613112565b60405180910390f35b34801561062f57600080fd5b506106386114d7565b604051610645919061329f565b60405180910390f35b34801561065a57600080fd5b50610663611565565b6040516106709190613112565b60405180910390f35b34801561068557600080fd5b5061068e611578565b60405161069b919061329f565b60405180910390f35b3480156106b057600080fd5b506106cb60048036038101906106c691906132f7565b611606565b6040516106d89190613333565b60405180910390f35b3480156106ed57600080fd5b50610708600480360381019061070391906132f7565b611618565b005b34801561071657600080fd5b50610731600480360381019061072c9190613536565b61162a565b60405161073e919061351b565b60405180910390f35b34801561075357600080fd5b5061075c6116e2565b005b34801561076a57600080fd5b506107856004803603810190610780919061367f565b6116f6565b005b34801561079357600080fd5b506107ae60048036038101906107a991906134c3565b611708565b005b3480156107bc57600080fd5b506107c5611723565b6040516107d2919061351b565b60405180910390f35b3480156107e757600080fd5b506107f0611729565b6040516107fd9190613333565b60405180910390f35b34801561081257600080fd5b5061082d600480360381019061082891906132f7565b611753565b005b34801561083b57600080fd5b50610844611765565b604051610851919061351b565b60405180910390f35b34801561086657600080fd5b5061086f61176b565b60405161087c919061329f565b60405180910390f35b34801561089157600080fd5b5061089a6117fd565b6040516108a7919061351b565b60405180910390f35b6108ca60048036038101906108c591906132f7565b611803565b005b3480156108d857600080fd5b506108f360048036038101906108ee91906136d8565b611cf8565b005b34801561090157600080fd5b5061090a611e03565b6040516109179190613112565b60405180910390f35b34801561092c57600080fd5b50610935611e16565b604051610942919061329f565b60405180910390f35b34801561095757600080fd5b50610960611ea4565b60405161096d919061351b565b60405180910390f35b34801561098257600080fd5b5061098b611eaa565b005b34801561099957600080fd5b506109b460048036038101906109af91906132f7565b611ebc565b005b6109d060048036038101906109cb91906137b9565b611ece565b005b3480156109de57600080fd5b506109e7611f41565b005b3480156109f557600080fd5b50610a106004803603810190610a0b91906132f7565b611f75565b604051610a1d919061329f565b60405180910390f35b348015610a3257600080fd5b50610a3b6120cd565b604051610a48919061351b565b60405180910390f35b348015610a5d57600080fd5b50610a786004803603810190610a7391906132f7565b6120d3565b005b348015610a8657600080fd5b50610a8f6120e5565b604051610a9c919061351b565b60405180910390f35b348015610ab157600080fd5b50610acc6004803603810190610ac7919061383c565b6120eb565b005b348015610ada57600080fd5b50610ae3612110565b005b348015610af157600080fd5b50610b0c6004803603810190610b079190613869565b612144565b604051610b199190613112565b60405180910390f35b348015610b2e57600080fd5b50610b496004803603810190610b449190613536565b6121d8565b604051610b56919061351b565b60405180910390f35b348015610b6b57600080fd5b50610b866004803603810190610b8191906138a9565b6121ea565b005b348015610b9457600080fd5b50610baf6004803603810190610baa9190613536565b612257565b005b348015610bbd57600080fd5b50610bd86004803603810190610bd39190613536565b6122da565b604051610be59190613112565b60405180910390f35b6000610bf9826122fa565b9050919050565b610c08612374565b610c1282826123f2565b5050565b606060028054610c2590613918565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5190613918565b8015610c9e5780601f10610c7357610100808354040283529160200191610c9e565b820191906000526020600020905b815481529060010190602001808311610c8157829003601f168201915b5050505050905090565b6000610cb382612587565b610ce9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3282611606565b90508073ffffffffffffffffffffffffffffffffffffffff16610d536125e6565b73ffffffffffffffffffffffffffffffffffffffff1614610db657610d7f81610d7a6125e6565b612144565b610db5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610e73612374565b8060119081610e829190613af5565b5050565b6000610e906125ee565b6001546000540303905090565b600e6020528060005260406000206000915090505481565b610ebd612374565b8060178190555050565b6000610ed2826125f7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f39576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f45846126c3565b91509150610f5b8187610f566125e6565b6126ea565b610fa757610f7086610f6b6125e6565b612144565b610fa6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361100d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61101a868686600161272e565b801561102557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110f3856110cf888887612734565b7c02000000000000000000000000000000000000000000000000000000001761275c565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036111795760006001850190506000600460008381526020019081526020016000205403611177576000548114611176578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111e18686866001612787565b505050505050565b6111f1612374565b8060198190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036113905760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061139a61278d565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113c69190613bf6565b6113d09190613c67565b90508160000151819350935050509250929050565b600c5481565b60165481565b6113f9612374565b611401612797565b600061140b611729565b73ffffffffffffffffffffffffffffffffffffffff164760405161142e90613cc9565b60006040518083038185875af1925050503d806000811461146b576040519150601f19603f3d011682016040523d82523d6000602084013e611470565b606091505b505090508061147e57600080fd5b506114876127e6565b565b6114a483838360405180602001604052806000815250611ece565b505050565b6114b1612374565b80601290816114c09190613af5565b5050565b601a60029054906101000a900460ff1681565b601180546114e490613918565b80601f016020809104026020016040519081016040528092919081815260200182805461151090613918565b801561155d5780601f106115325761010080835404028352916020019161155d565b820191906000526020600020905b81548152906001019060200180831161154057829003601f168201915b505050505081565b601a60009054906101000a900460ff1681565b6010805461158590613918565b80601f01602080910402602001604051908101604052809291908181526020018280546115b190613918565b80156115fe5780601f106115d3576101008083540402835291602001916115fe565b820191906000526020600020905b8154815290600101906020018083116115e157829003601f168201915b505050505081565b6000611611826125f7565b9050919050565b611620612374565b8060168190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611691576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116ea612374565b6116f460006127f0565b565b6116fe612374565b80600c8190555050565b611710612374565b806010908161171f9190613af5565b5050565b60195481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61175b612374565b8060158190555050565b60185481565b60606003805461177a90613918565b80601f01602080910402602001604051908101604052809291908181526020018280546117a690613918565b80156117f35780601f106117c8576101008083540402835291602001916117f3565b820191906000526020600020905b8154815290600101906020018083116117d657829003601f168201915b5050505050905090565b60135481565b8060008111801561181657506018548111155b611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613d2a565b60405180910390fd5b60195481600e60006118656128b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118aa9190613d4a565b11156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290613dca565b60405180910390fd5b601754816118f7610e86565b6119019190613d4a565b1115611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613e36565b60405180910390fd5b80600e600061194f6128b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119949190613d4a565b600e60006119a06128b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601a60009054906101000a900460ff1615611a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2590613ea2565b60405180910390fd5b601a60019054906101000a900460ff16611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490613f0e565b60405180910390fd5b60175482611a89610e86565b611a939190613d4a565b1115611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90613f7a565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611b335750601654601454105b905060006015548414905060006013549050828015611b4f5750815b15611b5957600090505b828015611b64575081155b15611bc9578060155486611b789190613f9a565b611b829190613bf6565b341015611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb9061401a565b60405180910390fd5b611c18565b8085611bd59190613bf6565b341015611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e9061401a565b60405180910390fd5b5b60195485611c25336128be565b611c2f9190613d4a565b1115611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790614086565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508215611ce75760146000815480929190611ce1906140a6565b91905055505b611cf13386612915565b5050505050565b8060076000611d056125e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611db26125e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611df79190613112565b60405180910390a35050565b601a60019054906101000a900460ff1681565b60128054611e2390613918565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4f90613918565b8015611e9c5780601f10611e7157610100808354040283529160200191611e9c565b820191906000526020600020905b815481529060010190602001808311611e7f57829003601f168201915b505050505081565b60155481565b611eb2612374565b611eba612933565b565b611ec4612374565b8060188190555050565b611ed9848484610ec7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f3b57611f0484848484612980565b611f3a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611f49612374565b601a60009054906101000a900460ff1615601a60006101000a81548160ff021916908315150217905550565b6060611f8082612587565b611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690614160565b60405180910390fd5b60001515601a60029054906101000a900460ff1615150361206c5760128054611fe790613918565b80601f016020809104026020016040519081016040528092919081815260200182805461201390613918565b80156120605780601f1061203557610100808354040283529160200191612060565b820191906000526020600020905b81548152906001019060200180831161204357829003601f168201915b505050505090506120c8565b6000612076612ad0565b9050600081511161209657604051806020016040528060008152506120c4565b806120a084612b62565b60116040516020016120b49392919061423f565b6040516020818303038152906040525b9150505b919050565b60145481565b6120db612374565b8060138190555050565b60175481565b6120f3612374565b80601a60026101000a81548160ff02191690831515021790555050565b612118612374565b601a60019054906101000a900460ff1615601a60016101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006121e3826128be565b9050919050565b6121f2612374565b601754826121fe610e86565b6122089190613d4a565b1115612249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224090613f7a565b60405180910390fd5b6122538183612915565b5050565b61225f612374565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c5906142e2565b60405180910390fd5b6122d7816127f0565b50565b600d6020528060005260406000206000915054906101000a900460ff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061236d575061236c82612c30565b5b9050919050565b61237c6128b6565b73ffffffffffffffffffffffffffffffffffffffff1661239a611729565b73ffffffffffffffffffffffffffffffffffffffff16146123f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e79061434e565b60405180910390fd5b565b6123fa61278d565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f906143e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124be9061444c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816125926125ee565b111580156125a1575060005482105b80156125df575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806126066125ee565b1161268c5760005481101561268b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612689575b6000810361267f576004600083600190039350838152602001908152602001600020549050612655565b80925050506126be565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861274b868684612c9a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b6002600b54036127dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d3906144b8565b60405180910390fd5b6002600b81905550565b6001600b81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b61292f828260405180602001604052806000815250612ca3565b5050565b6008600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129a66125e6565b8786866040518563ffffffff1660e01b81526004016129c8949392919061452d565b6020604051808303816000875af1925050508015612a0457506040513d601f19601f82011682018060405250810190612a01919061458e565b60015b612a7d573d8060008114612a34576040519150601f19603f3d011682016040523d82523d6000602084013e612a39565b606091505b506000815103612a75576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060108054612adf90613918565b80601f0160208091040260200160405190810160405280929190818152602001828054612b0b90613918565b8015612b585780601f10612b2d57610100808354040283529160200191612b58565b820191906000526020600020905b815481529060010190602001808311612b3b57829003601f168201915b5050505050905090565b606060006001612b7184612d40565b01905060008167ffffffffffffffff811115612b9057612b8f613398565b5b6040519080825280601f01601f191660200182016040528015612bc25781602001600182028036833780820191505090505b509050600082602001820190505b600115612c25578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c1957612c18613c38565b5b04945060008503612bd0575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60009392505050565b612cad8383612e93565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612d3b57600080549050600083820390505b612ced6000868380600101945086612980565b612d23576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612cda578160005414612d3857600080fd5b50505b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d9e577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d9457612d93613c38565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ddb576d04ee2d6d415b85acef81000000008381612dd157612dd0613c38565b5b0492506020810190505b662386f26fc100008310612e0a57662386f26fc100008381612e0057612dff613c38565b5b0492506010810190505b6305f5e1008310612e33576305f5e1008381612e2957612e28613c38565b5b0492506008810190505b6127108310612e58576127108381612e4e57612e4d613c38565b5b0492506004810190505b60648310612e7b5760648381612e7157612e70613c38565b5b0492506002810190505b600a8310612e8a576001810190505b80915050919050565b60008054905060008203612ed3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee0600084838561272e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612f5783612f486000866000612734565b612f518561304e565b1761275c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612ff857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612fbd565b5060008203613033576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506130496000848385612787565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130a781613072565b81146130b257600080fd5b50565b6000813590506130c48161309e565b92915050565b6000602082840312156130e0576130df613068565b5b60006130ee848285016130b5565b91505092915050565b60008115159050919050565b61310c816130f7565b82525050565b60006020820190506131276000830184613103565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131588261312d565b9050919050565b6131688161314d565b811461317357600080fd5b50565b6000813590506131858161315f565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6131ac8161318b565b81146131b757600080fd5b50565b6000813590506131c9816131a3565b92915050565b600080604083850312156131e6576131e5613068565b5b60006131f485828601613176565b9250506020613205858286016131ba565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561324957808201518184015260208101905061322e565b60008484015250505050565b6000601f19601f8301169050919050565b60006132718261320f565b61327b818561321a565b935061328b81856020860161322b565b61329481613255565b840191505092915050565b600060208201905081810360008301526132b98184613266565b905092915050565b6000819050919050565b6132d4816132c1565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b60006020828403121561330d5761330c613068565b5b600061331b848285016132e2565b91505092915050565b61332d8161314d565b82525050565b60006020820190506133486000830184613324565b92915050565b6000806040838503121561336557613364613068565b5b600061337385828601613176565b9250506020613384858286016132e2565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133d082613255565b810181811067ffffffffffffffff821117156133ef576133ee613398565b5b80604052505050565b600061340261305e565b905061340e82826133c7565b919050565b600067ffffffffffffffff82111561342e5761342d613398565b5b61343782613255565b9050602081019050919050565b82818337600083830152505050565b600061346661346184613413565b6133f8565b90508281526020810184848401111561348257613481613393565b5b61348d848285613444565b509392505050565b600082601f8301126134aa576134a961338e565b5b81356134ba848260208601613453565b91505092915050565b6000602082840312156134d9576134d8613068565b5b600082013567ffffffffffffffff8111156134f7576134f661306d565b5b61350384828501613495565b91505092915050565b613515816132c1565b82525050565b6000602082019050613530600083018461350c565b92915050565b60006020828403121561354c5761354b613068565b5b600061355a84828501613176565b91505092915050565b60008060006060848603121561357c5761357b613068565b5b600061358a86828701613176565b935050602061359b86828701613176565b92505060406135ac868287016132e2565b9150509250925092565b600080604083850312156135cd576135cc613068565b5b60006135db858286016132e2565b92505060206135ec858286016132e2565b9150509250929050565b600060408201905061360b6000830185613324565b613618602083018461350c565b9392505050565b6000819050919050565b6136328161361f565b82525050565b600060208201905061364d6000830184613629565b92915050565b61365c8161361f565b811461366757600080fd5b50565b60008135905061367981613653565b92915050565b60006020828403121561369557613694613068565b5b60006136a38482850161366a565b91505092915050565b6136b5816130f7565b81146136c057600080fd5b50565b6000813590506136d2816136ac565b92915050565b600080604083850312156136ef576136ee613068565b5b60006136fd85828601613176565b925050602061370e858286016136c3565b9150509250929050565b600067ffffffffffffffff82111561373357613732613398565b5b61373c82613255565b9050602081019050919050565b600061375c61375784613718565b6133f8565b90508281526020810184848401111561377857613777613393565b5b613783848285613444565b509392505050565b600082601f8301126137a05761379f61338e565b5b81356137b0848260208601613749565b91505092915050565b600080600080608085870312156137d3576137d2613068565b5b60006137e187828801613176565b94505060206137f287828801613176565b9350506040613803878288016132e2565b925050606085013567ffffffffffffffff8111156138245761382361306d565b5b6138308782880161378b565b91505092959194509250565b60006020828403121561385257613851613068565b5b6000613860848285016136c3565b91505092915050565b600080604083850312156138805761387f613068565b5b600061388e85828601613176565b925050602061389f85828601613176565b9150509250929050565b600080604083850312156138c0576138bf613068565b5b60006138ce858286016132e2565b92505060206138df85828601613176565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061393057607f821691505b602082108103613943576139426138e9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261396e565b6139b5868361396e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006139f26139ed6139e8846132c1565b6139cd565b6132c1565b9050919050565b6000819050919050565b613a0c836139d7565b613a20613a18826139f9565b84845461397b565b825550505050565b600090565b613a35613a28565b613a40818484613a03565b505050565b5b81811015613a6457613a59600082613a2d565b600181019050613a46565b5050565b601f821115613aa957613a7a81613949565b613a838461395e565b81016020851015613a92578190505b613aa6613a9e8561395e565b830182613a45565b50505b505050565b600082821c905092915050565b6000613acc60001984600802613aae565b1980831691505092915050565b6000613ae58383613abb565b9150826002028217905092915050565b613afe8261320f565b67ffffffffffffffff811115613b1757613b16613398565b5b613b218254613918565b613b2c828285613a68565b600060209050601f831160018114613b5f5760008415613b4d578287015190505b613b578582613ad9565b865550613bbf565b601f198416613b6d86613949565b60005b82811015613b9557848901518255600182019150602085019450602081019050613b70565b86831015613bb25784890151613bae601f891682613abb565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613c01826132c1565b9150613c0c836132c1565b9250828202613c1a816132c1565b91508282048414831517613c3157613c30613bc7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c72826132c1565b9150613c7d836132c1565b925082613c8d57613c8c613c38565b5b828204905092915050565b600081905092915050565b50565b6000613cb3600083613c98565b9150613cbe82613ca3565b600082019050919050565b6000613cd482613ca6565b9150819050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613d1460148361321a565b9150613d1f82613cde565b602082019050919050565b60006020820190508181036000830152613d4381613d07565b9050919050565b6000613d55826132c1565b9150613d60836132c1565b9250828201905080821115613d7857613d77613bc7565b5b92915050565b7f65786365656473206d6178207065722061646472657373000000000000000000600082015250565b6000613db460178361321a565b9150613dbf82613d7e565b602082019050919050565b60006020820190508181036000830152613de381613da7565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613e2060148361321a565b9150613e2b82613dea565b602082019050919050565b60006020820190508181036000830152613e4f81613e13565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613e8c60178361321a565b9150613e9782613e56565b602082019050919050565b60006020820190508181036000830152613ebb81613e7f565b9050919050565b7f5075626c696353616c65206973204f4646000000000000000000000000000000600082015250565b6000613ef860118361321a565b9150613f0382613ec2565b602082019050919050565b60006020820190508181036000830152613f2781613eeb565b9050919050565b7f72656163686564204d617820537570706c790000000000000000000000000000600082015250565b6000613f6460128361321a565b9150613f6f82613f2e565b602082019050919050565b60006020820190508181036000830152613f9381613f57565b9050919050565b6000613fa5826132c1565b9150613fb0836132c1565b9250828203905081811115613fc857613fc7613bc7565b5b92915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000614004601d8361321a565b915061400f82613fce565b602082019050919050565b6000602082019050818103600083015261403381613ff7565b9050919050565b7f43616e206e6f74206d696e74206d6f7265207468616e20313000000000000000600082015250565b600061407060198361321a565b915061407b8261403a565b602082019050919050565b6000602082019050818103600083015261409f81614063565b9050919050565b60006140b1826132c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140e3576140e2613bc7565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061414a602f8361321a565b9150614155826140ee565b604082019050919050565b600060208201905081810360008301526141798161413d565b9050919050565b600081905092915050565b60006141968261320f565b6141a08185614180565b93506141b081856020860161322b565b80840191505092915050565b600081546141c981613918565b6141d38186614180565b945060018216600081146141ee576001811461420357614236565b60ff1983168652811515820286019350614236565b61420c85613949565b60005b8381101561422e5781548189015260018201915060208101905061420f565b838801955050505b50505092915050565b600061424b828661418b565b9150614257828561418b565b915061426382846141bc565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142cc60268361321a565b91506142d782614270565b604082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061433860208361321a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006143ca602a8361321a565b91506143d58261436e565b604082019050919050565b600060208201905081810360008301526143f9816143bd565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061443660198361321a565b915061444182614400565b602082019050919050565b6000602082019050818103600083015261446581614429565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006144a2601f8361321a565b91506144ad8261446c565b602082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006144ff826144d8565b61450981856144e3565b935061451981856020860161322b565b61452281613255565b840191505092915050565b60006080820190506145426000830187613324565b61454f6020830186613324565b61455c604083018561350c565b818103606083015261456e81846144f4565b905095945050505050565b6000815190506145888161309e565b92915050565b6000602082840312156145a4576145a3613068565b5b60006145b284828501614579565b9150509291505056fea2646970667358221220e51de53d0468ae29d974e9c9ebef5547ea365e6db5dc698341c2288c8fb3f01a64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000134d7973746572794f665468654b6579734e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d6f4b4e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5344445768613431527050525035364556734170435573696e5064436b39336d713367705a39414c384776682f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061031a5760003560e01c80637ec4a659116101ab578063b071401b116100f7578063e0a8085311610095578063ed64892b1161006f578063ed64892b14610b22578063efbd73f414610b5f578063f2fde38b14610b88578063f9765bc114610bb15761031a565b8063e0a8085314610aa5578063e222c7f914610ace578063e985e9c514610ae55761031a565b8063c87b56dd116100d1578063c87b56dd146109e9578063d10a1a2b14610a26578063d49f0fa514610a51578063d5abeb0114610a7a5761031a565b8063b071401b1461098d578063b88d4fde146109b6578063c4ae3168146109d25761031a565b8063a035b1fe11610164578063a45063c01161013e578063a45063c0146108f5578063a45ba8e714610920578063a70273571461094b578063aa1b103f146109765761031a565b8063a035b1fe14610885578063a0712d68146108b0578063a22cb465146108cc5761031a565b80637ec4a65914610787578063867cb30e146107b05780638da5cb5b146107db5780639254d4f41461080657806394354fd01461082f57806395d89b411461085a5761031a565b8063333e44e61161026a5780635c975abb1161022357806365ee9a78116101fd57806365ee9a78146106e157806370a082311461070a578063715018a6146107475780637cb647591461075e5761031a565b80635c975abb1461064e57806362b99ad4146106795780636352211e146106a45761031a565b8063333e44e6146105715780633ccfd60b1461059c57806342842e0e146105b35780634fdd43cb146105cf57806351830227146105f85780635503a0e8146106235761031a565b806318160ddd116102d757806323b872dd116102b157806323b872dd146104c357806326b092df146104df5780632a55205a146105085780632eb4a7ab146105465761031a565b806318160ddd146104325780631cdce9fe1461045d578063228025e81461049a5761031a565b806301ffc9a71461031f57806304634d8d1461035c57806306fdde0314610385578063081812fc146103b0578063095ea7b3146103ed57806316ba10e014610409575b600080fd5b34801561032b57600080fd5b50610346600480360381019061034191906130ca565b610bee565b6040516103539190613112565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e91906131cf565b610c00565b005b34801561039157600080fd5b5061039a610c16565b6040516103a7919061329f565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d291906132f7565b610ca8565b6040516103e49190613333565b60405180910390f35b6104076004803603810190610402919061334e565b610d27565b005b34801561041557600080fd5b50610430600480360381019061042b91906134c3565b610e6b565b005b34801561043e57600080fd5b50610447610e86565b604051610454919061351b565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613536565b610e9d565b604051610491919061351b565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc91906132f7565b610eb5565b005b6104dd60048036038101906104d89190613563565b610ec7565b005b3480156104eb57600080fd5b50610506600480360381019061050191906132f7565b6111e9565b005b34801561051457600080fd5b5061052f600480360381019061052a91906135b6565b6111fb565b60405161053d9291906135f6565b60405180910390f35b34801561055257600080fd5b5061055b6113e5565b6040516105689190613638565b60405180910390f35b34801561057d57600080fd5b506105866113eb565b604051610593919061351b565b60405180910390f35b3480156105a857600080fd5b506105b16113f1565b005b6105cd60048036038101906105c89190613563565b611489565b005b3480156105db57600080fd5b506105f660048036038101906105f191906134c3565b6114a9565b005b34801561060457600080fd5b5061060d6114c4565b60405161061a9190613112565b60405180910390f35b34801561062f57600080fd5b506106386114d7565b604051610645919061329f565b60405180910390f35b34801561065a57600080fd5b50610663611565565b6040516106709190613112565b60405180910390f35b34801561068557600080fd5b5061068e611578565b60405161069b919061329f565b60405180910390f35b3480156106b057600080fd5b506106cb60048036038101906106c691906132f7565b611606565b6040516106d89190613333565b60405180910390f35b3480156106ed57600080fd5b50610708600480360381019061070391906132f7565b611618565b005b34801561071657600080fd5b50610731600480360381019061072c9190613536565b61162a565b60405161073e919061351b565b60405180910390f35b34801561075357600080fd5b5061075c6116e2565b005b34801561076a57600080fd5b506107856004803603810190610780919061367f565b6116f6565b005b34801561079357600080fd5b506107ae60048036038101906107a991906134c3565b611708565b005b3480156107bc57600080fd5b506107c5611723565b6040516107d2919061351b565b60405180910390f35b3480156107e757600080fd5b506107f0611729565b6040516107fd9190613333565b60405180910390f35b34801561081257600080fd5b5061082d600480360381019061082891906132f7565b611753565b005b34801561083b57600080fd5b50610844611765565b604051610851919061351b565b60405180910390f35b34801561086657600080fd5b5061086f61176b565b60405161087c919061329f565b60405180910390f35b34801561089157600080fd5b5061089a6117fd565b6040516108a7919061351b565b60405180910390f35b6108ca60048036038101906108c591906132f7565b611803565b005b3480156108d857600080fd5b506108f360048036038101906108ee91906136d8565b611cf8565b005b34801561090157600080fd5b5061090a611e03565b6040516109179190613112565b60405180910390f35b34801561092c57600080fd5b50610935611e16565b604051610942919061329f565b60405180910390f35b34801561095757600080fd5b50610960611ea4565b60405161096d919061351b565b60405180910390f35b34801561098257600080fd5b5061098b611eaa565b005b34801561099957600080fd5b506109b460048036038101906109af91906132f7565b611ebc565b005b6109d060048036038101906109cb91906137b9565b611ece565b005b3480156109de57600080fd5b506109e7611f41565b005b3480156109f557600080fd5b50610a106004803603810190610a0b91906132f7565b611f75565b604051610a1d919061329f565b60405180910390f35b348015610a3257600080fd5b50610a3b6120cd565b604051610a48919061351b565b60405180910390f35b348015610a5d57600080fd5b50610a786004803603810190610a7391906132f7565b6120d3565b005b348015610a8657600080fd5b50610a8f6120e5565b604051610a9c919061351b565b60405180910390f35b348015610ab157600080fd5b50610acc6004803603810190610ac7919061383c565b6120eb565b005b348015610ada57600080fd5b50610ae3612110565b005b348015610af157600080fd5b50610b0c6004803603810190610b079190613869565b612144565b604051610b199190613112565b60405180910390f35b348015610b2e57600080fd5b50610b496004803603810190610b449190613536565b6121d8565b604051610b56919061351b565b60405180910390f35b348015610b6b57600080fd5b50610b866004803603810190610b8191906138a9565b6121ea565b005b348015610b9457600080fd5b50610baf6004803603810190610baa9190613536565b612257565b005b348015610bbd57600080fd5b50610bd86004803603810190610bd39190613536565b6122da565b604051610be59190613112565b60405180910390f35b6000610bf9826122fa565b9050919050565b610c08612374565b610c1282826123f2565b5050565b606060028054610c2590613918565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5190613918565b8015610c9e5780601f10610c7357610100808354040283529160200191610c9e565b820191906000526020600020905b815481529060010190602001808311610c8157829003601f168201915b5050505050905090565b6000610cb382612587565b610ce9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3282611606565b90508073ffffffffffffffffffffffffffffffffffffffff16610d536125e6565b73ffffffffffffffffffffffffffffffffffffffff1614610db657610d7f81610d7a6125e6565b612144565b610db5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610e73612374565b8060119081610e829190613af5565b5050565b6000610e906125ee565b6001546000540303905090565b600e6020528060005260406000206000915090505481565b610ebd612374565b8060178190555050565b6000610ed2826125f7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f39576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f45846126c3565b91509150610f5b8187610f566125e6565b6126ea565b610fa757610f7086610f6b6125e6565b612144565b610fa6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361100d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61101a868686600161272e565b801561102557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110f3856110cf888887612734565b7c02000000000000000000000000000000000000000000000000000000001761275c565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036111795760006001850190506000600460008381526020019081526020016000205403611177576000548114611176578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111e18686866001612787565b505050505050565b6111f1612374565b8060198190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036113905760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061139a61278d565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113c69190613bf6565b6113d09190613c67565b90508160000151819350935050509250929050565b600c5481565b60165481565b6113f9612374565b611401612797565b600061140b611729565b73ffffffffffffffffffffffffffffffffffffffff164760405161142e90613cc9565b60006040518083038185875af1925050503d806000811461146b576040519150601f19603f3d011682016040523d82523d6000602084013e611470565b606091505b505090508061147e57600080fd5b506114876127e6565b565b6114a483838360405180602001604052806000815250611ece565b505050565b6114b1612374565b80601290816114c09190613af5565b5050565b601a60029054906101000a900460ff1681565b601180546114e490613918565b80601f016020809104026020016040519081016040528092919081815260200182805461151090613918565b801561155d5780601f106115325761010080835404028352916020019161155d565b820191906000526020600020905b81548152906001019060200180831161154057829003601f168201915b505050505081565b601a60009054906101000a900460ff1681565b6010805461158590613918565b80601f01602080910402602001604051908101604052809291908181526020018280546115b190613918565b80156115fe5780601f106115d3576101008083540402835291602001916115fe565b820191906000526020600020905b8154815290600101906020018083116115e157829003601f168201915b505050505081565b6000611611826125f7565b9050919050565b611620612374565b8060168190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611691576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116ea612374565b6116f460006127f0565b565b6116fe612374565b80600c8190555050565b611710612374565b806010908161171f9190613af5565b5050565b60195481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61175b612374565b8060158190555050565b60185481565b60606003805461177a90613918565b80601f01602080910402602001604051908101604052809291908181526020018280546117a690613918565b80156117f35780601f106117c8576101008083540402835291602001916117f3565b820191906000526020600020905b8154815290600101906020018083116117d657829003601f168201915b5050505050905090565b60135481565b8060008111801561181657506018548111155b611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613d2a565b60405180910390fd5b60195481600e60006118656128b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118aa9190613d4a565b11156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290613dca565b60405180910390fd5b601754816118f7610e86565b6119019190613d4a565b1115611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613e36565b60405180910390fd5b80600e600061194f6128b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119949190613d4a565b600e60006119a06128b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601a60009054906101000a900460ff1615611a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2590613ea2565b60405180910390fd5b601a60019054906101000a900460ff16611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490613f0e565b60405180910390fd5b60175482611a89610e86565b611a939190613d4a565b1115611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90613f7a565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611b335750601654601454105b905060006015548414905060006013549050828015611b4f5750815b15611b5957600090505b828015611b64575081155b15611bc9578060155486611b789190613f9a565b611b829190613bf6565b341015611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb9061401a565b60405180910390fd5b611c18565b8085611bd59190613bf6565b341015611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e9061401a565b60405180910390fd5b5b60195485611c25336128be565b611c2f9190613d4a565b1115611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790614086565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508215611ce75760146000815480929190611ce1906140a6565b91905055505b611cf13386612915565b5050505050565b8060076000611d056125e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611db26125e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611df79190613112565b60405180910390a35050565b601a60019054906101000a900460ff1681565b60128054611e2390613918565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4f90613918565b8015611e9c5780601f10611e7157610100808354040283529160200191611e9c565b820191906000526020600020905b815481529060010190602001808311611e7f57829003601f168201915b505050505081565b60155481565b611eb2612374565b611eba612933565b565b611ec4612374565b8060188190555050565b611ed9848484610ec7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f3b57611f0484848484612980565b611f3a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611f49612374565b601a60009054906101000a900460ff1615601a60006101000a81548160ff021916908315150217905550565b6060611f8082612587565b611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690614160565b60405180910390fd5b60001515601a60029054906101000a900460ff1615150361206c5760128054611fe790613918565b80601f016020809104026020016040519081016040528092919081815260200182805461201390613918565b80156120605780601f1061203557610100808354040283529160200191612060565b820191906000526020600020905b81548152906001019060200180831161204357829003601f168201915b505050505090506120c8565b6000612076612ad0565b9050600081511161209657604051806020016040528060008152506120c4565b806120a084612b62565b60116040516020016120b49392919061423f565b6040516020818303038152906040525b9150505b919050565b60145481565b6120db612374565b8060138190555050565b60175481565b6120f3612374565b80601a60026101000a81548160ff02191690831515021790555050565b612118612374565b601a60019054906101000a900460ff1615601a60016101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006121e3826128be565b9050919050565b6121f2612374565b601754826121fe610e86565b6122089190613d4a565b1115612249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224090613f7a565b60405180910390fd5b6122538183612915565b5050565b61225f612374565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c5906142e2565b60405180910390fd5b6122d7816127f0565b50565b600d6020528060005260406000206000915054906101000a900460ff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061236d575061236c82612c30565b5b9050919050565b61237c6128b6565b73ffffffffffffffffffffffffffffffffffffffff1661239a611729565b73ffffffffffffffffffffffffffffffffffffffff16146123f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e79061434e565b60405180910390fd5b565b6123fa61278d565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f906143e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124be9061444c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816125926125ee565b111580156125a1575060005482105b80156125df575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806126066125ee565b1161268c5760005481101561268b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612689575b6000810361267f576004600083600190039350838152602001908152602001600020549050612655565b80925050506126be565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861274b868684612c9a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b6002600b54036127dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d3906144b8565b60405180910390fd5b6002600b81905550565b6001600b81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b61292f828260405180602001604052806000815250612ca3565b5050565b6008600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129a66125e6565b8786866040518563ffffffff1660e01b81526004016129c8949392919061452d565b6020604051808303816000875af1925050508015612a0457506040513d601f19601f82011682018060405250810190612a01919061458e565b60015b612a7d573d8060008114612a34576040519150601f19603f3d011682016040523d82523d6000602084013e612a39565b606091505b506000815103612a75576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060108054612adf90613918565b80601f0160208091040260200160405190810160405280929190818152602001828054612b0b90613918565b8015612b585780601f10612b2d57610100808354040283529160200191612b58565b820191906000526020600020905b815481529060010190602001808311612b3b57829003601f168201915b5050505050905090565b606060006001612b7184612d40565b01905060008167ffffffffffffffff811115612b9057612b8f613398565b5b6040519080825280601f01601f191660200182016040528015612bc25781602001600182028036833780820191505090505b509050600082602001820190505b600115612c25578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c1957612c18613c38565b5b04945060008503612bd0575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60009392505050565b612cad8383612e93565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612d3b57600080549050600083820390505b612ced6000868380600101945086612980565b612d23576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612cda578160005414612d3857600080fd5b50505b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d9e577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d9457612d93613c38565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ddb576d04ee2d6d415b85acef81000000008381612dd157612dd0613c38565b5b0492506020810190505b662386f26fc100008310612e0a57662386f26fc100008381612e0057612dff613c38565b5b0492506010810190505b6305f5e1008310612e33576305f5e1008381612e2957612e28613c38565b5b0492506008810190505b6127108310612e58576127108381612e4e57612e4d613c38565b5b0492506004810190505b60648310612e7b5760648381612e7157612e70613c38565b5b0492506002810190505b600a8310612e8a576001810190505b80915050919050565b60008054905060008203612ed3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee0600084838561272e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612f5783612f486000866000612734565b612f518561304e565b1761275c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612ff857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612fbd565b5060008203613033576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506130496000848385612787565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130a781613072565b81146130b257600080fd5b50565b6000813590506130c48161309e565b92915050565b6000602082840312156130e0576130df613068565b5b60006130ee848285016130b5565b91505092915050565b60008115159050919050565b61310c816130f7565b82525050565b60006020820190506131276000830184613103565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131588261312d565b9050919050565b6131688161314d565b811461317357600080fd5b50565b6000813590506131858161315f565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6131ac8161318b565b81146131b757600080fd5b50565b6000813590506131c9816131a3565b92915050565b600080604083850312156131e6576131e5613068565b5b60006131f485828601613176565b9250506020613205858286016131ba565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561324957808201518184015260208101905061322e565b60008484015250505050565b6000601f19601f8301169050919050565b60006132718261320f565b61327b818561321a565b935061328b81856020860161322b565b61329481613255565b840191505092915050565b600060208201905081810360008301526132b98184613266565b905092915050565b6000819050919050565b6132d4816132c1565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b60006020828403121561330d5761330c613068565b5b600061331b848285016132e2565b91505092915050565b61332d8161314d565b82525050565b60006020820190506133486000830184613324565b92915050565b6000806040838503121561336557613364613068565b5b600061337385828601613176565b9250506020613384858286016132e2565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133d082613255565b810181811067ffffffffffffffff821117156133ef576133ee613398565b5b80604052505050565b600061340261305e565b905061340e82826133c7565b919050565b600067ffffffffffffffff82111561342e5761342d613398565b5b61343782613255565b9050602081019050919050565b82818337600083830152505050565b600061346661346184613413565b6133f8565b90508281526020810184848401111561348257613481613393565b5b61348d848285613444565b509392505050565b600082601f8301126134aa576134a961338e565b5b81356134ba848260208601613453565b91505092915050565b6000602082840312156134d9576134d8613068565b5b600082013567ffffffffffffffff8111156134f7576134f661306d565b5b61350384828501613495565b91505092915050565b613515816132c1565b82525050565b6000602082019050613530600083018461350c565b92915050565b60006020828403121561354c5761354b613068565b5b600061355a84828501613176565b91505092915050565b60008060006060848603121561357c5761357b613068565b5b600061358a86828701613176565b935050602061359b86828701613176565b92505060406135ac868287016132e2565b9150509250925092565b600080604083850312156135cd576135cc613068565b5b60006135db858286016132e2565b92505060206135ec858286016132e2565b9150509250929050565b600060408201905061360b6000830185613324565b613618602083018461350c565b9392505050565b6000819050919050565b6136328161361f565b82525050565b600060208201905061364d6000830184613629565b92915050565b61365c8161361f565b811461366757600080fd5b50565b60008135905061367981613653565b92915050565b60006020828403121561369557613694613068565b5b60006136a38482850161366a565b91505092915050565b6136b5816130f7565b81146136c057600080fd5b50565b6000813590506136d2816136ac565b92915050565b600080604083850312156136ef576136ee613068565b5b60006136fd85828601613176565b925050602061370e858286016136c3565b9150509250929050565b600067ffffffffffffffff82111561373357613732613398565b5b61373c82613255565b9050602081019050919050565b600061375c61375784613718565b6133f8565b90508281526020810184848401111561377857613777613393565b5b613783848285613444565b509392505050565b600082601f8301126137a05761379f61338e565b5b81356137b0848260208601613749565b91505092915050565b600080600080608085870312156137d3576137d2613068565b5b60006137e187828801613176565b94505060206137f287828801613176565b9350506040613803878288016132e2565b925050606085013567ffffffffffffffff8111156138245761382361306d565b5b6138308782880161378b565b91505092959194509250565b60006020828403121561385257613851613068565b5b6000613860848285016136c3565b91505092915050565b600080604083850312156138805761387f613068565b5b600061388e85828601613176565b925050602061389f85828601613176565b9150509250929050565b600080604083850312156138c0576138bf613068565b5b60006138ce858286016132e2565b92505060206138df85828601613176565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061393057607f821691505b602082108103613943576139426138e9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261396e565b6139b5868361396e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006139f26139ed6139e8846132c1565b6139cd565b6132c1565b9050919050565b6000819050919050565b613a0c836139d7565b613a20613a18826139f9565b84845461397b565b825550505050565b600090565b613a35613a28565b613a40818484613a03565b505050565b5b81811015613a6457613a59600082613a2d565b600181019050613a46565b5050565b601f821115613aa957613a7a81613949565b613a838461395e565b81016020851015613a92578190505b613aa6613a9e8561395e565b830182613a45565b50505b505050565b600082821c905092915050565b6000613acc60001984600802613aae565b1980831691505092915050565b6000613ae58383613abb565b9150826002028217905092915050565b613afe8261320f565b67ffffffffffffffff811115613b1757613b16613398565b5b613b218254613918565b613b2c828285613a68565b600060209050601f831160018114613b5f5760008415613b4d578287015190505b613b578582613ad9565b865550613bbf565b601f198416613b6d86613949565b60005b82811015613b9557848901518255600182019150602085019450602081019050613b70565b86831015613bb25784890151613bae601f891682613abb565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613c01826132c1565b9150613c0c836132c1565b9250828202613c1a816132c1565b91508282048414831517613c3157613c30613bc7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c72826132c1565b9150613c7d836132c1565b925082613c8d57613c8c613c38565b5b828204905092915050565b600081905092915050565b50565b6000613cb3600083613c98565b9150613cbe82613ca3565b600082019050919050565b6000613cd482613ca6565b9150819050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613d1460148361321a565b9150613d1f82613cde565b602082019050919050565b60006020820190508181036000830152613d4381613d07565b9050919050565b6000613d55826132c1565b9150613d60836132c1565b9250828201905080821115613d7857613d77613bc7565b5b92915050565b7f65786365656473206d6178207065722061646472657373000000000000000000600082015250565b6000613db460178361321a565b9150613dbf82613d7e565b602082019050919050565b60006020820190508181036000830152613de381613da7565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613e2060148361321a565b9150613e2b82613dea565b602082019050919050565b60006020820190508181036000830152613e4f81613e13565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613e8c60178361321a565b9150613e9782613e56565b602082019050919050565b60006020820190508181036000830152613ebb81613e7f565b9050919050565b7f5075626c696353616c65206973204f4646000000000000000000000000000000600082015250565b6000613ef860118361321a565b9150613f0382613ec2565b602082019050919050565b60006020820190508181036000830152613f2781613eeb565b9050919050565b7f72656163686564204d617820537570706c790000000000000000000000000000600082015250565b6000613f6460128361321a565b9150613f6f82613f2e565b602082019050919050565b60006020820190508181036000830152613f9381613f57565b9050919050565b6000613fa5826132c1565b9150613fb0836132c1565b9250828203905081811115613fc857613fc7613bc7565b5b92915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000614004601d8361321a565b915061400f82613fce565b602082019050919050565b6000602082019050818103600083015261403381613ff7565b9050919050565b7f43616e206e6f74206d696e74206d6f7265207468616e20313000000000000000600082015250565b600061407060198361321a565b915061407b8261403a565b602082019050919050565b6000602082019050818103600083015261409f81614063565b9050919050565b60006140b1826132c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140e3576140e2613bc7565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061414a602f8361321a565b9150614155826140ee565b604082019050919050565b600060208201905081810360008301526141798161413d565b9050919050565b600081905092915050565b60006141968261320f565b6141a08185614180565b93506141b081856020860161322b565b80840191505092915050565b600081546141c981613918565b6141d38186614180565b945060018216600081146141ee576001811461420357614236565b60ff1983168652811515820286019350614236565b61420c85613949565b60005b8381101561422e5781548189015260018201915060208101905061420f565b838801955050505b50505092915050565b600061424b828661418b565b9150614257828561418b565b915061426382846141bc565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142cc60268361321a565b91506142d782614270565b604082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061433860208361321a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006143ca602a8361321a565b91506143d58261436e565b604082019050919050565b600060208201905081810360008301526143f9816143bd565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061443660198361321a565b915061444182614400565b602082019050919050565b6000602082019050818103600083015261446581614429565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006144a2601f8361321a565b91506144ad8261446c565b602082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006144ff826144d8565b61450981856144e3565b935061451981856020860161322b565b61452281613255565b840191505092915050565b60006080820190506145426000830187613324565b61454f6020830186613324565b61455c604083018561350c565b818103606083015261456e81846144f4565b905095945050505050565b6000815190506145888161309e565b92915050565b6000602082840312156145a4576145a3613068565b5b60006145b284828501614579565b9150509291505056fea2646970667358221220e51de53d0468ae29d974e9c9ebef5547ea365e6db5dc698341c2288c8fb3f01a64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000134d7973746572794f665468654b6579734e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d6f4b4e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5344445768613431527050525035364556734170435573696e5064436b39336d713367705a39414c384776682f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): MysteryOfTheKeysNFT
Arg [1] : _tokenSymbol (string): MoKNFT
Arg [2] : _maxSupply (uint256): 10000
Arg [3] : _maxMintAmountPerTx (uint256): 7
Arg [4] : _maxMintAmountPerW (uint256): 10
Arg [5] : _hiddenMetadataUri (string): ipfs://QmSDDWha41RpPRP56EVsApCUsinPdCk93mq3gpZ9AL8Gvh/hidden.json
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [7] : 4d7973746572794f665468654b6579734e465400000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [9] : 4d6f4b4e46540000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [11] : 697066733a2f2f516d5344445768613431527050525035364556734170435573
Arg [12] : 696e5064436b39336d713367705a39414c384776682f68696464656e2e6a736f
Arg [13] : 6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
414:6038:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1740:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1905:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10039:98:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16360:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15812:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5723:98:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5894:317:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;609:46:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5131:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19903:2764:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5227:126:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1671:432:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;528:25:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;943:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6190:153;;;;;;;;;;;;;:::i;:::-;;22758:187:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5487:130:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1152:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;745:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1090:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;712:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11391:150:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5035:92:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7045:230:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;6010:96:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5621:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1046:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4911:120:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1008:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10208:102:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;823:35:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2853:1136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16901:231:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1121:26:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;783:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;902:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2073:91;;;;;;;;;;;;;:::i;:::-;;5355:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23526:396:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5939:67:10;;;;;;;;;;;;;:::i;:::-;;4299:443;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;868:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4829:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;979:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4746:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6112:74;;;;;;;;;;;;;:::i;:::-;;17282:162:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5825:110:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3995:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;558:46:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1740:163;1843:4;1863:36;1887:11;1863:23;:36::i;:::-;1856:43;;1740:163;;;:::o;1905:160::-;1094:13:0;:11;:13::i;:::-;2011:50:10::1;2036:9;2047:13;2011:24;:50::i;:::-;1905:160:::0;;:::o;10039:98:11:-;10093:13;10125:5;10118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:98;:::o;16360:214::-;16436:7;16460:16;16468:7;16460;:16::i;:::-;16455:64;;16485:34;;;;;;;;;;;;;;16455:64;16537:15;:24;16553:7;16537:24;;;;;;;;;;;:30;;;;;;;;;;;;16530:37;;16360:214;;;:::o;15812:398::-;15900:13;15916:16;15924:7;15916;:16::i;:::-;15900:32;;15970:5;15947:28;;:19;:17;:19::i;:::-;:28;;;15943:172;;15994:44;16011:5;16018:19;:17;:19::i;:::-;15994:16;:44::i;:::-;15989:126;;16065:35;;;;;;;;;;;;;;15989:126;15943:172;16158:2;16125:15;:24;16141:7;16125:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16195:7;16191:2;16175:28;;16184:5;16175:28;;;;;;;;;;;;15890:320;15812:398;;:::o;5723:98:10:-;1094:13:0;:11;:13::i;:::-;5807:10:10::1;5795:9;:22;;;;;;:::i;:::-;;5723:98:::0;:::o;5894:317:11:-;5955:7;6179:15;:13;:15::i;:::-;6164:12;;6148:13;;:28;:46;6141:53;;5894:317;:::o;609:46:10:-;;;;;;;;;;;;;;;;;:::o;5131:92::-;1094:13:0;:11;:13::i;:::-;5209:10:10::1;5197:9;:22;;;;5131:92:::0;:::o;19903:2764:11:-;20040:27;20070;20089:7;20070:18;:27::i;:::-;20040:57;;20153:4;20112:45;;20128:19;20112:45;;;20108:86;;20166:28;;;;;;;;;;;;;;20108:86;20206:27;20235:23;20262:35;20289:7;20262:26;:35::i;:::-;20205:92;;;;20394:68;20419:15;20436:4;20442:19;:17;:19::i;:::-;20394:24;:68::i;:::-;20389:179;;20481:43;20498:4;20504:19;:17;:19::i;:::-;20481:16;:43::i;:::-;20476:92;;20533:35;;;;;;;;;;;;;;20476:92;20389:179;20597:1;20583:16;;:2;:16;;;20579:52;;20608:23;;;;;;;;;;;;;;20579:52;20642:43;20664:4;20670:2;20674:7;20683:1;20642:21;:43::i;:::-;20774:15;20771:157;;;20912:1;20891:19;20884:30;20771:157;21300:18;:24;21319:4;21300:24;;;;;;;;;;;;;;;;21298:26;;;;;;;;;;;;21368:18;:22;21387:2;21368:22;;;;;;;;;;;;;;;;21366:24;;;;;;;;;;;21683:143;21719:2;21767:45;21782:4;21788:2;21792:19;21767:14;:45::i;:::-;2392:8;21739:73;21683:18;:143::i;:::-;21654:17;:26;21672:7;21654:26;;;;;;;;;;;:172;;;;21994:1;2392:8;21943:19;:47;:52;21939:617;;22015:19;22047:1;22037:7;:11;22015:33;;22202:1;22168:17;:30;22186:11;22168:30;;;;;;;;;;;;:35;22164:378;;22304:13;;22289:11;:28;22285:239;;22482:19;22449:17;:30;22467:11;22449:30;;;;;;;;;;;:52;;;;22285:239;22164:378;21997:559;21939:617;22600:7;22596:2;22581:27;;22590:4;22581:27;;;;;;;;;;;;22618:42;22639:4;22645:2;22649:7;22658:1;22618:20;:42::i;:::-;20030:2637;;;19903:2764;;;:::o;5227:126:10:-;1094:13:0;:11;:13::i;:::-;5331:18:10::1;5311:17;:38;;;;5227:126:::0;:::o;1671:432:3:-;1768:7;1777;1796:26;1825:17;:27;1843:8;1825:27;;;;;;;;;;;1796:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1895:1;1867:30;;:7;:16;;;:30;;;1863:90;;1923:19;1913:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1863:90;1963:21;2028:17;:15;:17::i;:::-;1987:58;;2001:7;:23;;;1988:36;;:10;:36;;;;:::i;:::-;1987:58;;;;:::i;:::-;1963:82;;2064:7;:16;;;2082:13;2056:40;;;;;;1671:432;;;;;:::o;528:25:10:-;;;;:::o;943:31::-;;;;:::o;6190:153::-;1094:13:0;:11;:13::i;:::-;2261:21:2::1;:19;:21::i;:::-;6253:7:10::2;6274;:5;:7::i;:::-;6266:21;;6295;6266:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6252:69;;;6336:2;6328:11;;;::::0;::::2;;6240:103;2303:20:2::1;:18;:20::i;:::-;6190:153:10:o:0;22758:187:11:-;22899:39;22916:4;22922:2;22926:7;22899:39;;;;;;;;;;;;:16;:39::i;:::-;22758:187;;;:::o;5487:130:10:-;1094:13:0;:11;:13::i;:::-;5595:18:10::1;5575:17;:38;;;;;;:::i;:::-;;5487:130:::0;:::o;1152:28::-;;;;;;;;;;;;;:::o;745:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1090:26::-;;;;;;;;;;;;;:::o;712:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11391:150:11:-;11463:7;11505:27;11524:7;11505:18;:27::i;:::-;11482:52;;11391:150;;;:::o;5035:92:10:-;1094:13:0;:11;:13::i;:::-;5113:10:10::1;5101:9;:22;;;;5035:92:::0;:::o;7045:230:11:-;7117:7;7157:1;7140:19;;:5;:19;;;7136:60;;7168:28;;;;;;;;;;;;;;7136:60;1360:13;7213:18;:25;7232:5;7213:25;;;;;;;;;;;;;;;;:55;7206:62;;7045:230;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;6010:96:10:-;1094:13:0;:11;:13::i;:::-;6091:11:10::1;6078:10;:24;;;;6010:96:::0;:::o;5621:98::-;1094:13:0;:11;:13::i;:::-;5705:10:10::1;5693:9;:22;;;;;;:::i;:::-;;5621:98:::0;:::o;1046:32::-;;;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;4911:120:10:-;1094:13:0;:11;:13::i;:::-;5010:17:10::1;4991:16;:36;;;;4911:120:::0;:::o;1008:33::-;;;;:::o;10208:102:11:-;10264:13;10296:7;10289:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10208:102;:::o;823:35:10:-;;;;:::o;2853:1136::-;2918:11;2244:1;2230:11;:15;:52;;;;;2264:18;;2249:11;:33;;2230:52;2222:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;2375:17;;2360:11;2332;:25;2344:12;:10;:12::i;:::-;2332:25;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:60;;2314:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;2485:9;;2470:11;2454:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;2446:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2582:11;2554;:25;2566:12;:10;:12::i;:::-;2554:25;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;2526:11;:25;2538:12;:10;:12::i;:::-;2526:25;;;;;;;;;;;;;;;:67;;;;2948:6:::1;;;;;;;;;;;2947:7;2939:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;2997:7;;;;;;;;;;;2989:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;3072:9;;3057:11;3041:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;3033:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3113:15;3133:11;:23;3145:10;3133:23;;;;;;;;;;;;;;;;;;;;;;;;;3131:26;:67;;;;;3188:9;;3175:10;;:22;3131:67;3113:85;;3209:12;3239:16;;3224:11;:31;3209:46;;3268:12;3283:5;;3268:20;;3305:10;:21;;;;;3319:7;3305:21;3301:62;;;3350:1;3343:8;;3301:62;3379:10;:22;;;;;3394:7;3393:8;3379:22;3375:304;;;3492:4;3472:16;;3458:11;:30;;;;:::i;:::-;3457:39;;;;:::i;:::-;3444:9;:52;;3418:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;3375:304;;;3629:4;3615:11;:18;;;;:::i;:::-;3602:9;:31;;3594:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3375:304;3754:17;;3739:11;3711:25;3725:10;3711:13;:25::i;:::-;:39;;;;:::i;:::-;:60;;3689:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;3863:4;3837:11;:23;3849:10;3837:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;3884:10;3880:55;;;3911:10;;:12;;;;;;;;;:::i;:::-;;;;;;3880:55;3947:34;3957:10;3969:11;3947:9;:34::i;:::-;2932:1057;;;2853:1136:::0;;:::o;16901:231:11:-;17047:8;16995:18;:39;17014:19;:17;:19::i;:::-;16995:39;;;;;;;;;;;;;;;:49;17035:8;16995:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17106:8;17070:55;;17085:19;:17;:19::i;:::-;17070:55;;;17116:8;17070:55;;;;;;:::i;:::-;;;;;;;;16901:231;;:::o;1121:26:10:-;;;;;;;;;;;;;:::o;783:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;902:35::-;;;;:::o;2073:91::-;1094:13:0;:11;:13::i;:::-;2131:29:10::1;:27;:29::i;:::-;2073:91::o:0;5355:128::-;1094:13:0;:11;:13::i;:::-;5460:19:10::1;5439:18;:40;;;;5355:128:::0;:::o;23526:396:11:-;23695:31;23708:4;23714:2;23718:7;23695:12;:31::i;:::-;23758:1;23740:2;:14;;;:19;23736:180;;23778:56;23809:4;23815:2;23819:7;23828:5;23778:30;:56::i;:::-;23773:143;;23861:40;;;;;;;;;;;;;;23773:143;23736:180;23526:396;;;;:::o;5939:67:10:-;1094:13:0;:11;:13::i;:::-;5996:6:10::1;;;;;;;;;;;5995:7;5986:6;;:16;;;;;;;;;;;;;;;;;;5939:67::o:0;4299:443::-;4373:13;4403:17;4411:8;4403:7;:17::i;:::-;4395:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;4497:5;4485:17;;:8;;;;;;;;;;;:17;;;4481:64;;4520:17;4513:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4481:64;4553:28;4584:10;:8;:10::i;:::-;4553:41;;4639:1;4614:14;4608:28;:32;:130;;;;;;;;;;;;;;;;;4676:14;4692:19;:8;:17;:19::i;:::-;4713:9;4659:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4608:130;4601:137;;;4299:443;;;;:::o;868:29::-;;;;:::o;4829:76::-;1094:13:0;:11;:13::i;:::-;4895:6:10::1;4887:5;:14;;;;4829:76:::0;:::o;979:24::-;;;;:::o;4746:79::-;1094:13:0;:11;:13::i;:::-;4815:6:10::1;4804:8;;:17;;;;;;;;;;;;;;;;;;4746:79:::0;:::o;6112:74::-;1094:13:0;:11;:13::i;:::-;6175:7:10::1;;;;;;;;;;;6174:8;6164:7;;:18;;;;;;;;;;;;;;;;;;6112:74::o:0;17282:162:11:-;17379:4;17402:18;:25;17421:5;17402:25;;;;;;;;;;;;;;;:35;17428:8;17402:35;;;;;;;;;;;;;;;;;;;;;;;;;17395:42;;17282:162;;;;:::o;5825:110:10:-;5887:7;5910:21;5924:6;5910:13;:21::i;:::-;5903:28;;5825:110;;;:::o;3995:203::-;1094:13:0;:11;:13::i;:::-;4122:9:10::1;;4107:11;4091:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;4083:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4161:33;4171:9;4182:11;4161:9;:33::i;:::-;3995:203:::0;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;558:46:10:-;;;;;;;;;;;;;;;;;;;;;;:::o;1408:213:3:-;1510:4;1548:26;1533:41;;;:11;:41;;;;:81;;;;1578:36;1602:11;1578:23;:36::i;:::-;1533:81;1526:88;;1408:213;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;2734:327:3:-;2852:17;:15;:17::i;:::-;2836:33;;:12;:33;;;;2828:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;2954:1;2934:22;;:8;:22;;;2926:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;3019:35;;;;;;;;3031:8;3019:35;;;;;;3041:12;3019:35;;;;;2997:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2734:327;;:::o;17693:277:11:-;17758:4;17812:7;17793:15;:13;:15::i;:::-;:26;;:65;;;;;17845:13;;17835:7;:23;17793:65;:151;;;;;17943:1;2118:8;17895:17;:26;17913:7;17895:26;;;;;;;;;;;;:44;:49;17793:151;17774:170;;17693:277;;;:::o;39437:103::-;39497:7;39523:10;39516:17;;39437:103;:::o;4202:93:10:-;4267:7;4290:1;4283:8;;4202:93;:::o;12515:1249:11:-;12582:7;12601:12;12616:7;12601:22;;12681:4;12662:15;:13;:15::i;:::-;:23;12658:1042;;12714:13;;12707:4;:20;12703:997;;;12751:14;12768:17;:23;12786:4;12768:23;;;;;;;;;;;;12751:40;;12883:1;2118:8;12855:6;:24;:29;12851:831;;13510:111;13527:1;13517:6;:11;13510:111;;13569:17;:25;13587:6;;;;;;;13569:25;;;;;;;;;;;;13560:34;;13510:111;;;13653:6;13646:13;;;;;;12851:831;12729:971;12703:997;12658:1042;13726:31;;;;;;;;;;;;;;12515:1249;;;;:::o;18828:474::-;18927:27;18956:23;18995:38;19036:15;:24;19052:7;19036:24;;;;;;;;;;;18995:65;;19210:18;19187:41;;19266:19;19260:26;19241:45;;19173:123;18828:474;;;:::o;18074:646::-;18219:11;18381:16;18374:5;18370:28;18361:37;;18539:16;18528:9;18524:32;18511:45;;18687:15;18676:9;18673:30;18665:5;18654:9;18651:20;18648:56;18638:66;;18074:646;;;;;:::o;24566:154::-;;;;;:::o;38764:304::-;38895:7;38914:16;2513:3;38940:19;:41;;38914:68;;2513:3;39007:31;39018:4;39024:2;39028:9;39007:10;:31::i;:::-;38999:40;;:62;;38992:69;;;38764:304;;;;;:::o;14297:443::-;14377:14;14542:16;14535:5;14531:28;14522:37;;14717:5;14703:11;14678:23;14674:41;14671:52;14664:5;14661:63;14651:73;;14297:443;;;;:::o;25367:153::-;;;;;:::o;2378:95:3:-;2436:6;2461:5;2454:12;;2378:95;:::o;2336:287:2:-;1759:1;2468:7;;:19;2460:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:1;2598:7;:18;;;;2336:287::o;2629:209::-;1716:1;2809:7;:22;;;;2629:209::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;640:96:4:-;693:7;719:10;712:17;;640:96;:::o;7352:176:11:-;7413:7;1360:13;1495:2;7440:18;:25;7459:5;7440:25;;;;;;;;;;;;;;;;:50;;7439:82;7432:89;;7352:176;;;:::o;33423:110::-;33499:27;33509:2;33513:8;33499:27;;;;;;;;;;;;:9;:27::i;:::-;33423:110;;:::o;3132:93:3:-;3199:19;;3192:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3132:93::o;25948:697:11:-;26106:4;26151:2;26126:45;;;26172:19;:17;:19::i;:::-;26193:4;26199:7;26208:5;26126:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26122:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26421:1;26404:6;:13;:18;26400:229;;26449:40;;;;;;;;;;;;;;26400:229;26589:6;26583:13;26574:6;26570:2;26566:15;26559:38;26122:517;26292:54;;;26282:64;;;:6;:64;;;;26275:71;;;25948:697;;;;;;:::o;6347:102:10:-;6407:13;6436:9;6429:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6347:102;:::o;415:696:5:-;471:13;520:14;557:1;537:17;548:5;537:10;:17::i;:::-;:21;520:38;;572:20;606:6;595:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;572:41;;627:11;753:6;749:2;745:15;737:6;733:28;726:35;;788:280;795:4;788:280;;;819:5;;;;;;;;958:8;953:2;946:5;942:14;937:30;932:3;924:44;1012:2;1003:11;;;;;;:::i;:::-;;;;;1045:1;1036:5;:10;788:280;1032:21;788:280;1088:6;1081:13;;;;;415:696;;;:::o;829:155:7:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;38475:143:11:-;38608:6;38475:143;;;;;:::o;32675:669::-;32801:19;32807:2;32811:8;32801:5;:19::i;:::-;32877:1;32859:2;:14;;;:19;32855:473;;32898:11;32912:13;;32898:27;;32943:13;32965:8;32959:3;:14;32943:30;;32991:229;33021:62;33060:1;33064:2;33068:7;;;;;;33077:5;33021:30;:62::i;:::-;33016:165;;33118:40;;;;;;;;;;;;;;33016:165;33215:3;33207:5;:11;32991:229;;33300:3;33283:13;;:20;33279:34;;33305:8;;;33279:34;32880:448;;32855:473;32675:669;;;:::o;9889:890:9:-;9942:7;9961:14;9978:1;9961:18;;10026:6;10017:5;:15;10013:99;;10061:6;10052:15;;;;;;:::i;:::-;;;;;10095:2;10085:12;;;;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;;;;:::i;:::-;;;;;10207:2;10197:12;;;;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;;;;:::i;:::-;;;;;10319:2;10309:12;;;;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;;;;:::i;:::-;;;;;10429:1;10419:11;;;;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;;;;:::i;:::-;;;;;10538:1;10528:11;;;;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;;;;:::i;:::-;;;;;10647:1;10637:11;;;;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;;;;10676:64;10766:6;10759:13;;;9889:890;;;:::o;27091:2902:11:-;27163:20;27186:13;;27163:36;;27225:1;27213:8;:13;27209:44;;27235:18;;;;;;;;;;;;;;27209:44;27264:61;27294:1;27298:2;27302:12;27316:8;27264:21;:61::i;:::-;27797:1;1495:2;27767:1;:26;;27766:32;27754:8;:45;27728:18;:22;27747:2;27728:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28069:136;28105:2;28158:33;28181:1;28185:2;28189:1;28158:14;:33::i;:::-;28125:30;28146:8;28125:20;:30::i;:::-;:66;28069:18;:136::i;:::-;28035:17;:31;28053:12;28035:31;;;;;;;;;;;:170;;;;28220:16;28250:11;28279:8;28264:12;:23;28250:37;;28792:16;28788:2;28784:25;28772:37;;29156:12;29117:8;29077:1;29016:25;28958:1;28898;28872:328;29520:1;29506:12;29502:20;29461:339;29560:3;29551:7;29548:16;29461:339;;29774:7;29764:8;29761:1;29734:25;29731:1;29728;29723:59;29612:1;29603:7;29599:15;29588:26;;29461:339;;;29465:75;29843:1;29831:8;:13;29827:45;;29853:19;;;;;;;;;;;;;;29827:45;29903:3;29887:13;:19;;;;27508:2409;;29926:60;29955:1;29959:2;29963:12;29977:8;29926:20;:60::i;:::-;27153:2840;27091:2902;;:::o;14837:318::-;14907:14;15136:1;15126:8;15123:15;15097:24;15093:46;15083:56;;14837:318;;;:::o;7:75:13:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:246::-;3248:1;3258:113;3272:6;3269:1;3266:13;3258:113;;;3357:1;3352:3;3348:11;3342:18;3338:1;3333:3;3329:11;3322:39;3294:2;3291:1;3287:10;3282:15;;3258:113;;;3405:1;3396:6;3391:3;3387:16;3380:27;3229:184;3167:246;;;:::o;3419:102::-;3460:6;3511:2;3507:7;3502:2;3495:5;3491:14;3487:28;3477:38;;3419:102;;;:::o;3527:377::-;3615:3;3643:39;3676:5;3643:39;:::i;:::-;3698:71;3762:6;3757:3;3698:71;:::i;:::-;3691:78;;3778:65;3836:6;3831:3;3824:4;3817:5;3813:16;3778:65;:::i;:::-;3868:29;3890:6;3868:29;:::i;:::-;3863:3;3859:39;3852:46;;3619:285;3527:377;;;;:::o;3910:313::-;4023:4;4061:2;4050:9;4046:18;4038:26;;4110:9;4104:4;4100:20;4096:1;4085:9;4081:17;4074:47;4138:78;4211:4;4202:6;4138:78;:::i;:::-;4130:86;;3910:313;;;;:::o;4229:77::-;4266:7;4295:5;4284:16;;4229:77;;;:::o;4312:122::-;4385:24;4403:5;4385:24;:::i;:::-;4378:5;4375:35;4365:63;;4424:1;4421;4414:12;4365:63;4312:122;:::o;4440:139::-;4486:5;4524:6;4511:20;4502:29;;4540:33;4567:5;4540:33;:::i;:::-;4440:139;;;;:::o;4585:329::-;4644:6;4693:2;4681:9;4672:7;4668:23;4664:32;4661:119;;;4699:79;;:::i;:::-;4661:119;4819:1;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4790:117;4585:329;;;;:::o;4920:118::-;5007:24;5025:5;5007:24;:::i;:::-;5002:3;4995:37;4920:118;;:::o;5044:222::-;5137:4;5175:2;5164:9;5160:18;5152:26;;5188:71;5256:1;5245:9;5241:17;5232:6;5188:71;:::i;:::-;5044:222;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:117::-;5861:1;5858;5851:12;5875:117;5984:1;5981;5974:12;5998:180;6046:77;6043:1;6036:88;6143:4;6140:1;6133:15;6167:4;6164:1;6157:15;6184:281;6267:27;6289:4;6267:27;:::i;:::-;6259:6;6255:40;6397:6;6385:10;6382:22;6361:18;6349:10;6346:34;6343:62;6340:88;;;6408:18;;:::i;:::-;6340:88;6448:10;6444:2;6437:22;6227:238;6184:281;;:::o;6471:129::-;6505:6;6532:20;;:::i;:::-;6522:30;;6561:33;6589:4;6581:6;6561:33;:::i;:::-;6471:129;;;:::o;6606:308::-;6668:4;6758:18;6750:6;6747:30;6744:56;;;6780:18;;:::i;:::-;6744:56;6818:29;6840:6;6818:29;:::i;:::-;6810:37;;6902:4;6896;6892:15;6884:23;;6606:308;;;:::o;6920:146::-;7017:6;7012:3;7007;6994:30;7058:1;7049:6;7044:3;7040:16;7033:27;6920:146;;;:::o;7072:425::-;7150:5;7175:66;7191:49;7233:6;7191:49;:::i;:::-;7175:66;:::i;:::-;7166:75;;7264:6;7257:5;7250:21;7302:4;7295:5;7291:16;7340:3;7331:6;7326:3;7322:16;7319:25;7316:112;;;7347:79;;:::i;:::-;7316:112;7437:54;7484:6;7479:3;7474;7437:54;:::i;:::-;7156:341;7072:425;;;;;:::o;7517:340::-;7573:5;7622:3;7615:4;7607:6;7603:17;7599:27;7589:122;;7630:79;;:::i;:::-;7589:122;7747:6;7734:20;7772:79;7847:3;7839:6;7832:4;7824:6;7820:17;7772:79;:::i;:::-;7763:88;;7579:278;7517:340;;;;:::o;7863:509::-;7932:6;7981:2;7969:9;7960:7;7956:23;7952:32;7949:119;;;7987:79;;:::i;:::-;7949:119;8135:1;8124:9;8120:17;8107:31;8165:18;8157:6;8154:30;8151:117;;;8187:79;;:::i;:::-;8151:117;8292:63;8347:7;8338:6;8327:9;8323:22;8292:63;:::i;:::-;8282:73;;8078:287;7863:509;;;;:::o;8378:118::-;8465:24;8483:5;8465:24;:::i;:::-;8460:3;8453:37;8378:118;;:::o;8502:222::-;8595:4;8633:2;8622:9;8618:18;8610:26;;8646:71;8714:1;8703:9;8699:17;8690:6;8646:71;:::i;:::-;8502:222;;;;:::o;8730:329::-;8789:6;8838:2;8826:9;8817:7;8813:23;8809:32;8806:119;;;8844:79;;:::i;:::-;8806:119;8964:1;8989:53;9034:7;9025:6;9014:9;9010:22;8989:53;:::i;:::-;8979:63;;8935:117;8730:329;;;;:::o;9065:619::-;9142:6;9150;9158;9207:2;9195:9;9186:7;9182:23;9178:32;9175:119;;;9213:79;;:::i;:::-;9175:119;9333:1;9358:53;9403:7;9394:6;9383:9;9379:22;9358:53;:::i;:::-;9348:63;;9304:117;9460:2;9486:53;9531:7;9522:6;9511:9;9507:22;9486:53;:::i;:::-;9476:63;;9431:118;9588:2;9614:53;9659:7;9650:6;9639:9;9635:22;9614:53;:::i;:::-;9604:63;;9559:118;9065:619;;;;;:::o;9690:474::-;9758:6;9766;9815:2;9803:9;9794:7;9790:23;9786:32;9783:119;;;9821:79;;:::i;:::-;9783:119;9941:1;9966:53;10011:7;10002:6;9991:9;9987:22;9966:53;:::i;:::-;9956:63;;9912:117;10068:2;10094:53;10139:7;10130:6;10119:9;10115:22;10094:53;:::i;:::-;10084:63;;10039:118;9690:474;;;;;:::o;10170:332::-;10291:4;10329:2;10318:9;10314:18;10306:26;;10342:71;10410:1;10399:9;10395:17;10386:6;10342:71;:::i;:::-;10423:72;10491:2;10480:9;10476:18;10467:6;10423:72;:::i;:::-;10170:332;;;;;:::o;10508:77::-;10545:7;10574:5;10563:16;;10508:77;;;:::o;10591:118::-;10678:24;10696:5;10678:24;:::i;:::-;10673:3;10666:37;10591:118;;:::o;10715:222::-;10808:4;10846:2;10835:9;10831:18;10823:26;;10859:71;10927:1;10916:9;10912:17;10903:6;10859:71;:::i;:::-;10715:222;;;;:::o;10943:122::-;11016:24;11034:5;11016:24;:::i;:::-;11009:5;11006:35;10996:63;;11055:1;11052;11045:12;10996:63;10943:122;:::o;11071:139::-;11117:5;11155:6;11142:20;11133:29;;11171:33;11198:5;11171:33;:::i;:::-;11071:139;;;;:::o;11216:329::-;11275:6;11324:2;11312:9;11303:7;11299:23;11295:32;11292:119;;;11330:79;;:::i;:::-;11292:119;11450:1;11475:53;11520:7;11511:6;11500:9;11496:22;11475:53;:::i;:::-;11465:63;;11421:117;11216:329;;;;:::o;11551:116::-;11621:21;11636:5;11621:21;:::i;:::-;11614:5;11611:32;11601:60;;11657:1;11654;11647:12;11601:60;11551:116;:::o;11673:133::-;11716:5;11754:6;11741:20;11732:29;;11770:30;11794:5;11770:30;:::i;:::-;11673:133;;;;:::o;11812:468::-;11877:6;11885;11934:2;11922:9;11913:7;11909:23;11905:32;11902:119;;;11940:79;;:::i;:::-;11902:119;12060:1;12085:53;12130:7;12121:6;12110:9;12106:22;12085:53;:::i;:::-;12075:63;;12031:117;12187:2;12213:50;12255:7;12246:6;12235:9;12231:22;12213:50;:::i;:::-;12203:60;;12158:115;11812:468;;;;;:::o;12286:307::-;12347:4;12437:18;12429:6;12426:30;12423:56;;;12459:18;;:::i;:::-;12423:56;12497:29;12519:6;12497:29;:::i;:::-;12489:37;;12581:4;12575;12571:15;12563:23;;12286:307;;;:::o;12599:423::-;12676:5;12701:65;12717:48;12758:6;12717:48;:::i;:::-;12701:65;:::i;:::-;12692:74;;12789:6;12782:5;12775:21;12827:4;12820:5;12816:16;12865:3;12856:6;12851:3;12847:16;12844:25;12841:112;;;12872:79;;:::i;:::-;12841:112;12962:54;13009:6;13004:3;12999;12962:54;:::i;:::-;12682:340;12599:423;;;;;:::o;13041:338::-;13096:5;13145:3;13138:4;13130:6;13126:17;13122:27;13112:122;;13153:79;;:::i;:::-;13112:122;13270:6;13257:20;13295:78;13369:3;13361:6;13354:4;13346:6;13342:17;13295:78;:::i;:::-;13286:87;;13102:277;13041:338;;;;:::o;13385:943::-;13480:6;13488;13496;13504;13553:3;13541:9;13532:7;13528:23;13524:33;13521:120;;;13560:79;;:::i;:::-;13521:120;13680:1;13705:53;13750:7;13741:6;13730:9;13726:22;13705:53;:::i;:::-;13695:63;;13651:117;13807:2;13833:53;13878:7;13869:6;13858:9;13854:22;13833:53;:::i;:::-;13823:63;;13778:118;13935:2;13961:53;14006:7;13997:6;13986:9;13982:22;13961:53;:::i;:::-;13951:63;;13906:118;14091:2;14080:9;14076:18;14063:32;14122:18;14114:6;14111:30;14108:117;;;14144:79;;:::i;:::-;14108:117;14249:62;14303:7;14294:6;14283:9;14279:22;14249:62;:::i;:::-;14239:72;;14034:287;13385:943;;;;;;;:::o;14334:323::-;14390:6;14439:2;14427:9;14418:7;14414:23;14410:32;14407:119;;;14445:79;;:::i;:::-;14407:119;14565:1;14590:50;14632:7;14623:6;14612:9;14608:22;14590:50;:::i;:::-;14580:60;;14536:114;14334:323;;;;:::o;14663:474::-;14731:6;14739;14788:2;14776:9;14767:7;14763:23;14759:32;14756:119;;;14794:79;;:::i;:::-;14756:119;14914:1;14939:53;14984:7;14975:6;14964:9;14960:22;14939:53;:::i;:::-;14929:63;;14885:117;15041:2;15067:53;15112:7;15103:6;15092:9;15088:22;15067:53;:::i;:::-;15057:63;;15012:118;14663:474;;;;;:::o;15143:::-;15211:6;15219;15268:2;15256:9;15247:7;15243:23;15239:32;15236:119;;;15274:79;;:::i;:::-;15236:119;15394:1;15419:53;15464:7;15455:6;15444:9;15440:22;15419:53;:::i;:::-;15409:63;;15365:117;15521:2;15547:53;15592:7;15583:6;15572:9;15568:22;15547:53;:::i;:::-;15537:63;;15492:118;15143:474;;;;;:::o;15623:180::-;15671:77;15668:1;15661:88;15768:4;15765:1;15758:15;15792:4;15789:1;15782:15;15809:320;15853:6;15890:1;15884:4;15880:12;15870:22;;15937:1;15931:4;15927:12;15958:18;15948:81;;16014:4;16006:6;16002:17;15992:27;;15948:81;16076:2;16068:6;16065:14;16045:18;16042:38;16039:84;;16095:18;;:::i;:::-;16039:84;15860:269;15809:320;;;:::o;16135:141::-;16184:4;16207:3;16199:11;;16230:3;16227:1;16220:14;16264:4;16261:1;16251:18;16243:26;;16135:141;;;:::o;16282:93::-;16319:6;16366:2;16361;16354:5;16350:14;16346:23;16336:33;;16282:93;;;:::o;16381:107::-;16425:8;16475:5;16469:4;16465:16;16444:37;;16381:107;;;;:::o;16494:393::-;16563:6;16613:1;16601:10;16597:18;16636:97;16666:66;16655:9;16636:97;:::i;:::-;16754:39;16784:8;16773:9;16754:39;:::i;:::-;16742:51;;16826:4;16822:9;16815:5;16811:21;16802:30;;16875:4;16865:8;16861:19;16854:5;16851:30;16841:40;;16570:317;;16494:393;;;;;:::o;16893:60::-;16921:3;16942:5;16935:12;;16893:60;;;:::o;16959:142::-;17009:9;17042:53;17060:34;17069:24;17087:5;17069:24;:::i;:::-;17060:34;:::i;:::-;17042:53;:::i;:::-;17029:66;;16959:142;;;:::o;17107:75::-;17150:3;17171:5;17164:12;;17107:75;;;:::o;17188:269::-;17298:39;17329:7;17298:39;:::i;:::-;17359:91;17408:41;17432:16;17408:41;:::i;:::-;17400:6;17393:4;17387:11;17359:91;:::i;:::-;17353:4;17346:105;17264:193;17188:269;;;:::o;17463:73::-;17508:3;17463:73;:::o;17542:189::-;17619:32;;:::i;:::-;17660:65;17718:6;17710;17704:4;17660:65;:::i;:::-;17595:136;17542:189;;:::o;17737:186::-;17797:120;17814:3;17807:5;17804:14;17797:120;;;17868:39;17905:1;17898:5;17868:39;:::i;:::-;17841:1;17834:5;17830:13;17821:22;;17797:120;;;17737:186;;:::o;17929:543::-;18030:2;18025:3;18022:11;18019:446;;;18064:38;18096:5;18064:38;:::i;:::-;18148:29;18166:10;18148:29;:::i;:::-;18138:8;18134:44;18331:2;18319:10;18316:18;18313:49;;;18352:8;18337:23;;18313:49;18375:80;18431:22;18449:3;18431:22;:::i;:::-;18421:8;18417:37;18404:11;18375:80;:::i;:::-;18034:431;;18019:446;17929:543;;;:::o;18478:117::-;18532:8;18582:5;18576:4;18572:16;18551:37;;18478:117;;;;:::o;18601:169::-;18645:6;18678:51;18726:1;18722:6;18714:5;18711:1;18707:13;18678:51;:::i;:::-;18674:56;18759:4;18753;18749:15;18739:25;;18652:118;18601:169;;;;:::o;18775:295::-;18851:4;18997:29;19022:3;19016:4;18997:29;:::i;:::-;18989:37;;19059:3;19056:1;19052:11;19046:4;19043:21;19035:29;;18775:295;;;;:::o;19075:1395::-;19192:37;19225:3;19192:37;:::i;:::-;19294:18;19286:6;19283:30;19280:56;;;19316:18;;:::i;:::-;19280:56;19360:38;19392:4;19386:11;19360:38;:::i;:::-;19445:67;19505:6;19497;19491:4;19445:67;:::i;:::-;19539:1;19563:4;19550:17;;19595:2;19587:6;19584:14;19612:1;19607:618;;;;20269:1;20286:6;20283:77;;;20335:9;20330:3;20326:19;20320:26;20311:35;;20283:77;20386:67;20446:6;20439:5;20386:67;:::i;:::-;20380:4;20373:81;20242:222;19577:887;;19607:618;19659:4;19655:9;19647:6;19643:22;19693:37;19725:4;19693:37;:::i;:::-;19752:1;19766:208;19780:7;19777:1;19774:14;19766:208;;;19859:9;19854:3;19850:19;19844:26;19836:6;19829:42;19910:1;19902:6;19898:14;19888:24;;19957:2;19946:9;19942:18;19929:31;;19803:4;19800:1;19796:12;19791:17;;19766:208;;;20002:6;19993:7;19990:19;19987:179;;;20060:9;20055:3;20051:19;20045:26;20103:48;20145:4;20137:6;20133:17;20122:9;20103:48;:::i;:::-;20095:6;20088:64;20010:156;19987:179;20212:1;20208;20200:6;20196:14;20192:22;20186:4;20179:36;19614:611;;;19577:887;;19167:1303;;;19075:1395;;:::o;20476:180::-;20524:77;20521:1;20514:88;20621:4;20618:1;20611:15;20645:4;20642:1;20635:15;20662:410;20702:7;20725:20;20743:1;20725:20;:::i;:::-;20720:25;;20759:20;20777:1;20759:20;:::i;:::-;20754:25;;20814:1;20811;20807:9;20836:30;20854:11;20836:30;:::i;:::-;20825:41;;21015:1;21006:7;21002:15;20999:1;20996:22;20976:1;20969:9;20949:83;20926:139;;21045:18;;:::i;:::-;20926:139;20710:362;20662:410;;;;:::o;21078:180::-;21126:77;21123:1;21116:88;21223:4;21220:1;21213:15;21247:4;21244:1;21237:15;21264:185;21304:1;21321:20;21339:1;21321:20;:::i;:::-;21316:25;;21355:20;21373:1;21355:20;:::i;:::-;21350:25;;21394:1;21384:35;;21399:18;;:::i;:::-;21384:35;21441:1;21438;21434:9;21429:14;;21264:185;;;;:::o;21455:147::-;21556:11;21593:3;21578:18;;21455:147;;;;:::o;21608:114::-;;:::o;21728:398::-;21887:3;21908:83;21989:1;21984:3;21908:83;:::i;:::-;21901:90;;22000:93;22089:3;22000:93;:::i;:::-;22118:1;22113:3;22109:11;22102:18;;21728:398;;;:::o;22132:379::-;22316:3;22338:147;22481:3;22338:147;:::i;:::-;22331:154;;22502:3;22495:10;;22132:379;;;:::o;22517:170::-;22657:22;22653:1;22645:6;22641:14;22634:46;22517:170;:::o;22693:366::-;22835:3;22856:67;22920:2;22915:3;22856:67;:::i;:::-;22849:74;;22932:93;23021:3;22932:93;:::i;:::-;23050:2;23045:3;23041:12;23034:19;;22693:366;;;:::o;23065:419::-;23231:4;23269:2;23258:9;23254:18;23246:26;;23318:9;23312:4;23308:20;23304:1;23293:9;23289:17;23282:47;23346:131;23472:4;23346:131;:::i;:::-;23338:139;;23065:419;;;:::o;23490:191::-;23530:3;23549:20;23567:1;23549:20;:::i;:::-;23544:25;;23583:20;23601:1;23583:20;:::i;:::-;23578:25;;23626:1;23623;23619:9;23612:16;;23647:3;23644:1;23641:10;23638:36;;;23654:18;;:::i;:::-;23638:36;23490:191;;;;:::o;23687:173::-;23827:25;23823:1;23815:6;23811:14;23804:49;23687:173;:::o;23866:366::-;24008:3;24029:67;24093:2;24088:3;24029:67;:::i;:::-;24022:74;;24105:93;24194:3;24105:93;:::i;:::-;24223:2;24218:3;24214:12;24207:19;;23866:366;;;:::o;24238:419::-;24404:4;24442:2;24431:9;24427:18;24419:26;;24491:9;24485:4;24481:20;24477:1;24466:9;24462:17;24455:47;24519:131;24645:4;24519:131;:::i;:::-;24511:139;;24238:419;;;:::o;24663:170::-;24803:22;24799:1;24791:6;24787:14;24780:46;24663:170;:::o;24839:366::-;24981:3;25002:67;25066:2;25061:3;25002:67;:::i;:::-;24995:74;;25078:93;25167:3;25078:93;:::i;:::-;25196:2;25191:3;25187:12;25180:19;;24839:366;;;:::o;25211:419::-;25377:4;25415:2;25404:9;25400:18;25392:26;;25464:9;25458:4;25454:20;25450:1;25439:9;25435:17;25428:47;25492:131;25618:4;25492:131;:::i;:::-;25484:139;;25211:419;;;:::o;25636:173::-;25776:25;25772:1;25764:6;25760:14;25753:49;25636:173;:::o;25815:366::-;25957:3;25978:67;26042:2;26037:3;25978:67;:::i;:::-;25971:74;;26054:93;26143:3;26054:93;:::i;:::-;26172:2;26167:3;26163:12;26156:19;;25815:366;;;:::o;26187:419::-;26353:4;26391:2;26380:9;26376:18;26368:26;;26440:9;26434:4;26430:20;26426:1;26415:9;26411:17;26404:47;26468:131;26594:4;26468:131;:::i;:::-;26460:139;;26187:419;;;:::o;26612:167::-;26752:19;26748:1;26740:6;26736:14;26729:43;26612:167;:::o;26785:366::-;26927:3;26948:67;27012:2;27007:3;26948:67;:::i;:::-;26941:74;;27024:93;27113:3;27024:93;:::i;:::-;27142:2;27137:3;27133:12;27126:19;;26785:366;;;:::o;27157:419::-;27323:4;27361:2;27350:9;27346:18;27338:26;;27410:9;27404:4;27400:20;27396:1;27385:9;27381:17;27374:47;27438:131;27564:4;27438:131;:::i;:::-;27430:139;;27157:419;;;:::o;27582:168::-;27722:20;27718:1;27710:6;27706:14;27699:44;27582:168;:::o;27756:366::-;27898:3;27919:67;27983:2;27978:3;27919:67;:::i;:::-;27912:74;;27995:93;28084:3;27995:93;:::i;:::-;28113:2;28108:3;28104:12;28097:19;;27756:366;;;:::o;28128:419::-;28294:4;28332:2;28321:9;28317:18;28309:26;;28381:9;28375:4;28371:20;28367:1;28356:9;28352:17;28345:47;28409:131;28535:4;28409:131;:::i;:::-;28401:139;;28128:419;;;:::o;28553:194::-;28593:4;28613:20;28631:1;28613:20;:::i;:::-;28608:25;;28647:20;28665:1;28647:20;:::i;:::-;28642:25;;28691:1;28688;28684:9;28676:17;;28715:1;28709:4;28706:11;28703:37;;;28720:18;;:::i;:::-;28703:37;28553:194;;;;:::o;28753:179::-;28893:31;28889:1;28881:6;28877:14;28870:55;28753:179;:::o;28938:366::-;29080:3;29101:67;29165:2;29160:3;29101:67;:::i;:::-;29094:74;;29177:93;29266:3;29177:93;:::i;:::-;29295:2;29290:3;29286:12;29279:19;;28938:366;;;:::o;29310:419::-;29476:4;29514:2;29503:9;29499:18;29491:26;;29563:9;29557:4;29553:20;29549:1;29538:9;29534:17;29527:47;29591:131;29717:4;29591:131;:::i;:::-;29583:139;;29310:419;;;:::o;29735:175::-;29875:27;29871:1;29863:6;29859:14;29852:51;29735:175;:::o;29916:366::-;30058:3;30079:67;30143:2;30138:3;30079:67;:::i;:::-;30072:74;;30155:93;30244:3;30155:93;:::i;:::-;30273:2;30268:3;30264:12;30257:19;;29916:366;;;:::o;30288:419::-;30454:4;30492:2;30481:9;30477:18;30469:26;;30541:9;30535:4;30531:20;30527:1;30516:9;30512:17;30505:47;30569:131;30695:4;30569:131;:::i;:::-;30561:139;;30288:419;;;:::o;30713:233::-;30752:3;30775:24;30793:5;30775:24;:::i;:::-;30766:33;;30821:66;30814:5;30811:77;30808:103;;30891:18;;:::i;:::-;30808:103;30938:1;30931:5;30927:13;30920:20;;30713:233;;;:::o;30952:234::-;31092:34;31088:1;31080:6;31076:14;31069:58;31161:17;31156:2;31148:6;31144:15;31137:42;30952:234;:::o;31192:366::-;31334:3;31355:67;31419:2;31414:3;31355:67;:::i;:::-;31348:74;;31431:93;31520:3;31431:93;:::i;:::-;31549:2;31544:3;31540:12;31533:19;;31192:366;;;:::o;31564:419::-;31730:4;31768:2;31757:9;31753:18;31745:26;;31817:9;31811:4;31807:20;31803:1;31792:9;31788:17;31781:47;31845:131;31971:4;31845:131;:::i;:::-;31837:139;;31564:419;;;:::o;31989:148::-;32091:11;32128:3;32113:18;;31989:148;;;;:::o;32143:390::-;32249:3;32277:39;32310:5;32277:39;:::i;:::-;32332:89;32414:6;32409:3;32332:89;:::i;:::-;32325:96;;32430:65;32488:6;32483:3;32476:4;32469:5;32465:16;32430:65;:::i;:::-;32520:6;32515:3;32511:16;32504:23;;32253:280;32143:390;;;;:::o;32563:874::-;32666:3;32703:5;32697:12;32732:36;32758:9;32732:36;:::i;:::-;32784:89;32866:6;32861:3;32784:89;:::i;:::-;32777:96;;32904:1;32893:9;32889:17;32920:1;32915:166;;;;33095:1;33090:341;;;;32882:549;;32915:166;32999:4;32995:9;32984;32980:25;32975:3;32968:38;33061:6;33054:14;33047:22;33039:6;33035:35;33030:3;33026:45;33019:52;;32915:166;;33090:341;33157:38;33189:5;33157:38;:::i;:::-;33217:1;33231:154;33245:6;33242:1;33239:13;33231:154;;;33319:7;33313:14;33309:1;33304:3;33300:11;33293:35;33369:1;33360:7;33356:15;33345:26;;33267:4;33264:1;33260:12;33255:17;;33231:154;;;33414:6;33409:3;33405:16;33398:23;;33097:334;;32882:549;;32670:767;;32563:874;;;;:::o;33443:589::-;33668:3;33690:95;33781:3;33772:6;33690:95;:::i;:::-;33683:102;;33802:95;33893:3;33884:6;33802:95;:::i;:::-;33795:102;;33914:92;34002:3;33993:6;33914:92;:::i;:::-;33907:99;;34023:3;34016:10;;33443:589;;;;;;:::o;34038:225::-;34178:34;34174:1;34166:6;34162:14;34155:58;34247:8;34242:2;34234:6;34230:15;34223:33;34038:225;:::o;34269:366::-;34411:3;34432:67;34496:2;34491:3;34432:67;:::i;:::-;34425:74;;34508:93;34597:3;34508:93;:::i;:::-;34626:2;34621:3;34617:12;34610:19;;34269:366;;;:::o;34641:419::-;34807:4;34845:2;34834:9;34830:18;34822:26;;34894:9;34888:4;34884:20;34880:1;34869:9;34865:17;34858:47;34922:131;35048:4;34922:131;:::i;:::-;34914:139;;34641:419;;;:::o;35066:182::-;35206:34;35202:1;35194:6;35190:14;35183:58;35066:182;:::o;35254:366::-;35396:3;35417:67;35481:2;35476:3;35417:67;:::i;:::-;35410:74;;35493:93;35582:3;35493:93;:::i;:::-;35611:2;35606:3;35602:12;35595:19;;35254:366;;;:::o;35626:419::-;35792:4;35830:2;35819:9;35815:18;35807:26;;35879:9;35873:4;35869:20;35865:1;35854:9;35850:17;35843:47;35907:131;36033:4;35907:131;:::i;:::-;35899:139;;35626:419;;;:::o;36051:229::-;36191:34;36187:1;36179:6;36175:14;36168:58;36260:12;36255:2;36247:6;36243:15;36236:37;36051:229;:::o;36286:366::-;36428:3;36449:67;36513:2;36508:3;36449:67;:::i;:::-;36442:74;;36525:93;36614:3;36525:93;:::i;:::-;36643:2;36638:3;36634:12;36627:19;;36286:366;;;:::o;36658:419::-;36824:4;36862:2;36851:9;36847:18;36839:26;;36911:9;36905:4;36901:20;36897:1;36886:9;36882:17;36875:47;36939:131;37065:4;36939:131;:::i;:::-;36931:139;;36658:419;;;:::o;37083:175::-;37223:27;37219:1;37211:6;37207:14;37200:51;37083:175;:::o;37264:366::-;37406:3;37427:67;37491:2;37486:3;37427:67;:::i;:::-;37420:74;;37503:93;37592:3;37503:93;:::i;:::-;37621:2;37616:3;37612:12;37605:19;;37264:366;;;:::o;37636:419::-;37802:4;37840:2;37829:9;37825:18;37817:26;;37889:9;37883:4;37879:20;37875:1;37864:9;37860:17;37853:47;37917:131;38043:4;37917:131;:::i;:::-;37909:139;;37636:419;;;:::o;38061:181::-;38201:33;38197:1;38189:6;38185:14;38178:57;38061:181;:::o;38248:366::-;38390:3;38411:67;38475:2;38470:3;38411:67;:::i;:::-;38404:74;;38487:93;38576:3;38487:93;:::i;:::-;38605:2;38600:3;38596:12;38589:19;;38248:366;;;:::o;38620:419::-;38786:4;38824:2;38813:9;38809:18;38801:26;;38873:9;38867:4;38863:20;38859:1;38848:9;38844:17;38837:47;38901:131;39027:4;38901:131;:::i;:::-;38893:139;;38620:419;;;:::o;39045:98::-;39096:6;39130:5;39124:12;39114:22;;39045:98;;;:::o;39149:168::-;39232:11;39266:6;39261:3;39254:19;39306:4;39301:3;39297:14;39282:29;;39149:168;;;;:::o;39323:373::-;39409:3;39437:38;39469:5;39437:38;:::i;:::-;39491:70;39554:6;39549:3;39491:70;:::i;:::-;39484:77;;39570:65;39628:6;39623:3;39616:4;39609:5;39605:16;39570:65;:::i;:::-;39660:29;39682:6;39660:29;:::i;:::-;39655:3;39651:39;39644:46;;39413:283;39323:373;;;;:::o;39702:640::-;39897:4;39935:3;39924:9;39920:19;39912:27;;39949:71;40017:1;40006:9;40002:17;39993:6;39949:71;:::i;:::-;40030:72;40098:2;40087:9;40083:18;40074:6;40030:72;:::i;:::-;40112;40180:2;40169:9;40165:18;40156:6;40112:72;:::i;:::-;40231:9;40225:4;40221:20;40216:2;40205:9;40201:18;40194:48;40259:76;40330:4;40321:6;40259:76;:::i;:::-;40251:84;;39702:640;;;;;;;:::o;40348:141::-;40404:5;40435:6;40429:13;40420:22;;40451:32;40477:5;40451:32;:::i;:::-;40348:141;;;;:::o;40495:349::-;40564:6;40613:2;40601:9;40592:7;40588:23;40584:32;40581:119;;;40619:79;;:::i;:::-;40581:119;40739:1;40764:63;40819:7;40810:6;40799:9;40795:22;40764:63;:::i;:::-;40754:73;;40710:127;40495:349;;;;:::o
Swarm Source
ipfs://e51de53d0468ae29d974e9c9ebef5547ea365e6db5dc698341c2288c8fb3f01a
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1.84
Net Worth in ETH
0.0009
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,049.95 | 0.0009 | $1.84 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.