ERC-721
Overview
Max Total Supply
30 AC2022
Holders
30
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 AC2022Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AmadeusCreator2022
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /** @powered by: amadeus-nft.io */ pragma solidity ^0.8.7; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "./ERC721S.sol"; 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 Returns the rebuilt hash obtained by traversing a Merklee 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++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } contract AmadeusCreator2022 is Ownable, ERC721S, ReentrancyGuard { constructor() ERC721S("AmadeusCreator2022", "AC2022") {} address private manager; function setManager(address _manager) external onlyOwner { manager = _manager; } modifier onlyManager(address _manager) { require(manager == _manager, "Only Manager Can Call This Function"); _; } // For marketing etc. function reserveMintBatch(uint256[] calldata quantities, address[] calldata tos) external onlyOwner { for(uint256 i = 0; i < quantities.length; i++) { _safeMint(tos[i], quantities[i]); } } string private activeBaseUri = "ipfs://QmS4AKxvyHEyj8DdX4vsvRVUR2d3PyjvcratxhHSmGtGu3"; string private inActiveBaseUri = "ipfs://QmfDtmpFHCYJqJ2AANt2zJGafGo2vmwZVKtje4AoScBrcz"; function setBaseURI(string calldata _activeBaseUri, string calldata _inActiveBaseUri) external onlyOwner { activeBaseUri = _activeBaseUri; inActiveBaseUri = _inActiveBaseUri; } function tokenURI(uint256 tokenId) override public view returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); if (!isActive(tokenId)){ return inActiveBaseUri; } return activeBaseUri; } function isActive(uint256 tokenId) public view returns (bool) { if (block.timestamp - _ownershipOf(tokenId).startTimestamp > 365 days) { return false; } return true; } function withdrawMoney() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return _ownershipOf(tokenId); } bytes32 private root; function setRoot(bytes32 _root) external onlyOwner { root = _root; } function amadeusPassMint(bytes32[] memory proof) external { require(isInAllowList(proof), "Invalid Merkle Proof."); require(_numberMinted(msg.sender) == 0, "Every Address Can Only Mint One."); _safeMint(msg.sender, 1); } function isInAllowList(bytes32[] memory proof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); return MerkleProof.verify(proof, root, leaf); } // Public Mint uint256 public annualFee = 0.15 ether; function setAnnualFee(uint256 _annualFee) external onlyOwner { annualFee = _annualFee; } function publicMint() external payable { refundIfOver(annualFee); _safeMint(msg.sender, 1); } function publicMintWithRecommend(address to) external onlyManager(msg.sender) { _safeMint(to, 1); } function refundIfOver(uint256 price) private { require(msg.value >= price, "Need to send more ETH."); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // 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 pragma solidity ^0.8.4; import "./IERC721S.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.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 ERC721S * * @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 ERC721S is IERC721S { // ============================================================= // 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; // ============================================================= // 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; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply(), "global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), "owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownershipOf(i); if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("unable to get token of owner by index"); } // ============================================================= // 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. interfaceId == type(IERC721Enumerable).interfaceId; // ERC165 interface ID for ERC721Enumerable. } // ============================================================= // 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)) } } /** * @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 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 MintToNonERC721ReceiverImplementer(); } 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. 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`. ) 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 MintToNonERC721ReceiverImplementer(); } } 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, ''); } // ============================================================= // 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 ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// 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 pragma solidity ^0.8.4; /** * @dev Interface of ERC721S. */ interface IERC721S { /** * Cannot Mint To NonERC721Receiver */ error MintToNonERC721ReceiverImplementer(); /** * 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 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 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); // ============================================================= // 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.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// 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
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"amadeusPassMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"annualFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721S.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isInAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"publicMintWithRecommend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantities","type":"uint256[]"},{"internalType":"address[]","name":"tos","type":"address[]"}],"name":"reserveMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_annualFee","type":"uint256"}],"name":"setAnnualFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_activeBaseUri","type":"string"},{"internalType":"string","name":"_inActiveBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060600160405280603581526020016200320660359139600990805190602001906200003592919062000237565b506040518060600160405280603581526020016200323b60359139600a90805190602001906200006792919062000237565b50670214e8348c4f0000600c553480156200008157600080fd5b506040518060400160405280601281526020017f416d616465757343726561746f723230323200000000000000000000000000008152506040518060400160405280600681526020017f41433230323200000000000000000000000000000000000000000000000000008152506200010e620001026200016660201b60201c565b6200016e60201b60201c565b81600390805190602001906200012692919062000237565b5080600490805190602001906200013f92919062000237565b50620001506200023260201b60201c565b600181905550505060016007819055506200034c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200024590620002e7565b90600052602060002090601f016020900481019282620002695760008555620002b5565b82601f106200028457805160ff1916838001178555620002b5565b82800160010185558215620002b5579182015b82811115620002b457825182559160200191906001019062000297565b5b509050620002c49190620002c8565b5090565b5b80821115620002e3576000816000905550600101620002c9565b5090565b600060028204905060018216806200030057607f821691505b602082108114156200031757620003166200031d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612eaa806200035c6000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d157806395d89b411161008a578063d0ebdbe711610064578063d0ebdbe714610587578063dab5f340146105b0578063dc33e681146105d9578063f2fde38b1461061657610181565b806395d89b4114610508578063ac44600214610533578063c87b56dd1461054a57610181565b806370a08231146103e6578063715018a61461042357806382afd23b1461043a57806388b89a7d146104775780638da5cb5b146104a05780639231ab2a146104cb57610181565b80632f745c591161013e5780636352211e116101185780636352211e1461032e5780636790a9de1461036b5780636bfa1ac9146103945780636e2ee9c9146103bd57610181565b80632f745c591461028b5780633cd47537146102c85780634f6ccce7146102f157610181565b806301ffc9a71461018657806306fdde03146101c35780630804f418146101ee57806318160ddd1461022b5780631dfda2e71461025657806326092b8314610281575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612224565b61063f565b6040516101ba91906126ae565b60405180910390f35b3480156101cf57600080fd5b506101d8610739565b6040516101e591906126c9565b60405180910390f35b3480156101fa57600080fd5b506102156004803603810190610210919061212d565b6107cb565b60405161022291906126ae565b60405180910390f35b34801561023757600080fd5b5061024061080c565b60405161024d9190612866565b60405180910390f35b34801561026257600080fd5b5061026b610823565b6040516102789190612866565b60405180910390f35b610289610829565b005b34801561029757600080fd5b506102b260048036038101906102ad91906120ed565b610841565b6040516102bf9190612866565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190612176565b6109a2565b005b3480156102fd57600080fd5b50610318600480360381019061031391906122ff565b610a90565b6040516103259190612866565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906122ff565b610ae3565b6040516103629190612647565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d919061227e565b610af5565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906120c0565b610b9b565b005b3480156103c957600080fd5b506103e460048036038101906103df919061212d565b610c3b565b005b3480156103f257600080fd5b5061040d600480360381019061040891906120c0565b610cdc565b60405161041a9190612866565b60405180910390f35b34801561042f57600080fd5b50610438610d95565b005b34801561044657600080fd5b50610461600480360381019061045c91906122ff565b610e1d565b60405161046e91906126ae565b60405180910390f35b34801561048357600080fd5b5061049e600480360381019061049991906122ff565b610e5f565b005b3480156104ac57600080fd5b506104b5610ee5565b6040516104c29190612647565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed91906122ff565b610f0e565b6040516104ff919061284b565b60405180910390f35b34801561051457600080fd5b5061051d610f26565b60405161052a91906126c9565b60405180910390f35b34801561053f57600080fd5b50610548610fb8565b005b34801561055657600080fd5b50610571600480360381019061056c91906122ff565b611139565b60405161057e91906126c9565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906120c0565b6112ac565b005b3480156105bc57600080fd5b506105d760048036038101906105d291906121f7565b61136c565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906120c0565b6113f2565b60405161060d9190612866565b60405180910390f35b34801561062257600080fd5b5061063d600480360381019061063891906120c0565b611404565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ca5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461074890612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461077490612a1d565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b600080336040516020016107df9190612617565b60405160208183030381529060405280519060200120905061080483600b54836114fc565b915050919050565b6000610816611513565b6002546001540303905090565b600c5481565b610834600c54611518565b61083f3360016115b9565b565b600061084c83610cdc565b821061088d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610884906127ab565b60405180910390fd5b600061089761080c565b905060008060005b838110156109605760006108b2826115d7565b9050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146108f457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094c578684141561093d57819550505050505061099c565b838061094890612a80565b9450505b50808061095890612a80565b91505061089f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109939061280b565b60405180910390fd5b92915050565b6109aa6115f7565b73ffffffffffffffffffffffffffffffffffffffff166109c8610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a159061276b565b60405180910390fd5b60005b84849050811015610a8957610a76838383818110610a4257610a41612b4b565b5b9050602002016020810190610a5791906120c0565b868684818110610a6a57610a69612b4b565b5b905060200201356115b9565b8080610a8190612a80565b915050610a21565b5050505050565b6000610a9a61080c565b8210610adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad29061270b565b60405180910390fd5b819050919050565b6000610aee826115ff565b9050919050565b610afd6115f7565b73ffffffffffffffffffffffffffffffffffffffff16610b1b610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b689061276b565b60405180910390fd5b838360099190610b82929190611dc5565b508181600a9190610b94929190611dc5565b5050505050565b338073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c239061278b565b60405180910390fd5b610c378260016115b9565b5050565b610c44816107cb565b610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a9061274b565b60405180910390fd5b6000610c8e336116cd565b14610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc59061272b565b60405180910390fd5b610cd93360016115b9565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d44576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d9d6115f7565b73ffffffffffffffffffffffffffffffffffffffff16610dbb610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e089061276b565b60405180910390fd5b610e1b6000611724565b565b60006301e13380610e2d836115d7565b6020015167ffffffffffffffff1642610e469190612915565b1115610e555760009050610e5a565b600190505b919050565b610e676115f7565b73ffffffffffffffffffffffffffffffffffffffff16610e85610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed29061276b565b60405180910390fd5b80600c8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f16611e4b565b610f1f826115d7565b9050919050565b606060048054610f3590612a1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6190612a1d565b8015610fae5780601f10610f8357610100808354040283529160200191610fae565b820191906000526020600020905b815481529060010190602001808311610f9157829003601f168201915b5050505050905090565b610fc06115f7565b73ffffffffffffffffffffffffffffffffffffffff16610fde610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b9061276b565b60405180910390fd5b6002600754141561107a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110719061282b565b60405180910390fd5b600260078190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516110a890612632565b60006040518083038185875af1925050503d80600081146110e5576040519150601f19603f3d011682016040523d82523d6000602084013e6110ea565b606091505b505090508061112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906127cb565b60405180910390fd5b506001600781905550565b6060611144826117e8565b61117a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118382610e1d565b61121957600a805461119490612a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546111c090612a1d565b801561120d5780601f106111e25761010080835404028352916020019161120d565b820191906000526020600020905b8154815290600101906020018083116111f057829003601f168201915b505050505090506112a7565b6009805461122690612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461125290612a1d565b801561129f5780601f106112745761010080835404028352916020019161129f565b820191906000526020600020905b81548152906001019060200180831161128257829003601f168201915b505050505090505b919050565b6112b46115f7565b73ffffffffffffffffffffffffffffffffffffffff166112d2610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f9061276b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113746115f7565b73ffffffffffffffffffffffffffffffffffffffff16611392610ee5565b73ffffffffffffffffffffffffffffffffffffffff16146113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df9061276b565b60405180910390fd5b80600b8190555050565b60006113fd826116cd565b9050919050565b61140c6115f7565b73ffffffffffffffffffffffffffffffffffffffff1661142a610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114779061276b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e7906126eb565b60405180910390fd5b6114f981611724565b50565b6000826115098584611847565b1490509392505050565b600090565b8034101561155b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611552906127eb565b60405180910390fd5b803411156115b6573373ffffffffffffffffffffffffffffffffffffffff166108fc82346115899190612915565b9081150290604051600060405180830381858888f193505050501580156115b4573d6000803e3d6000fd5b505b50565b6115d38282604051806020016040528060008152506118bc565b5050565b6115df611e4b565b6115f06115eb836115ff565b61195a565b9050919050565b600033905090565b6000808290508061160e611513565b11611696576001548110156116955760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611693575b600081141561168957600560008360019003935083815260200190815260200160002054905061165e565b80925050506116c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816117f3611513565b11158015611802575060015482105b8015611840575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905060005b84518110156118b157600085828151811061186e5761186d612b4b565b5b60200260200101519050808311611890576118898382611a10565b925061189d565b61189a8184611a10565b92505b5080806118a990612a80565b915050611850565b508091505092915050565b6118c68383611a27565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119555760006001549050600083820390505b6119076000868380600101945086611be5565b61193d576040517fd099061d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106118f457816001541461195257600080fd5b50505b505050565b611962611e4b565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600082600052816020526040600020905092915050565b600060015490506000821415611a69576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a766000848385611d45565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611aed83611ade6000866000611d4b565b611ae785611d73565b17611d83565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611b8e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611b53565b506000821415611bca576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050611be06000848385611dae565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c0b611db4565b8786866040518563ffffffff1660e01b8152600401611c2d9493929190612662565b602060405180830381600087803b158015611c4757600080fd5b505af1925050508015611c7857506040513d601f19601f82011682018060405250810190611c759190612251565b60015b611cf2573d8060008114611ca8576040519150601f19603f3d011682016040523d82523d6000602084013e611cad565b606091505b50600081511415611cea576040517fd099061d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8611d62868684611dbc565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054611dd190612a1d565b90600052602060002090601f016020900481019282611df35760008555611e3a565b82601f10611e0c57803560ff1916838001178555611e3a565b82800160010185558215611e3a579182015b82811115611e39578235825591602001919060010190611e1e565b5b509050611e479190611e9a565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115611eb3576000816000905550600101611e9b565b5090565b6000611eca611ec5846128a6565b612881565b90508083825260208201905082856020860282011115611eed57611eec612bb3565b5b60005b85811015611f1d5781611f038882612016565b845260208401935060208301925050600181019050611ef0565b5050509392505050565b600081359050611f3681612e18565b92915050565b60008083601f840112611f5257611f51612bae565b5b8235905067ffffffffffffffff811115611f6f57611f6e612ba9565b5b602083019150836020820283011115611f8b57611f8a612bb3565b5b9250929050565b600082601f830112611fa757611fa6612bae565b5b8135611fb7848260208601611eb7565b91505092915050565b60008083601f840112611fd657611fd5612bae565b5b8235905067ffffffffffffffff811115611ff357611ff2612ba9565b5b60208301915083602082028301111561200f5761200e612bb3565b5b9250929050565b60008135905061202581612e2f565b92915050565b60008135905061203a81612e46565b92915050565b60008151905061204f81612e46565b92915050565b60008083601f84011261206b5761206a612bae565b5b8235905067ffffffffffffffff81111561208857612087612ba9565b5b6020830191508360018202830111156120a4576120a3612bb3565b5b9250929050565b6000813590506120ba81612e5d565b92915050565b6000602082840312156120d6576120d5612bbd565b5b60006120e484828501611f27565b91505092915050565b6000806040838503121561210457612103612bbd565b5b600061211285828601611f27565b9250506020612123858286016120ab565b9150509250929050565b60006020828403121561214357612142612bbd565b5b600082013567ffffffffffffffff81111561216157612160612bb8565b5b61216d84828501611f92565b91505092915050565b600080600080604085870312156121905761218f612bbd565b5b600085013567ffffffffffffffff8111156121ae576121ad612bb8565b5b6121ba87828801611fc0565b9450945050602085013567ffffffffffffffff8111156121dd576121dc612bb8565b5b6121e987828801611f3c565b925092505092959194509250565b60006020828403121561220d5761220c612bbd565b5b600061221b84828501612016565b91505092915050565b60006020828403121561223a57612239612bbd565b5b60006122488482850161202b565b91505092915050565b60006020828403121561226757612266612bbd565b5b600061227584828501612040565b91505092915050565b6000806000806040858703121561229857612297612bbd565b5b600085013567ffffffffffffffff8111156122b6576122b5612bb8565b5b6122c287828801612055565b9450945050602085013567ffffffffffffffff8111156122e5576122e4612bb8565b5b6122f187828801612055565b925092505092959194509250565b60006020828403121561231557612314612bbd565b5b6000612323848285016120ab565b91505092915050565b61233581612949565b82525050565b61234481612949565b82525050565b61235b61235682612949565b612ac9565b82525050565b61236a8161295b565b82525050565b6123798161295b565b82525050565b600061238a826128d2565b61239481856128e8565b93506123a48185602086016129ea565b6123ad81612bc2565b840191505092915050565b60006123c3826128dd565b6123cd8185612904565b93506123dd8185602086016129ea565b6123e681612bc2565b840191505092915050565b60006123fe602683612904565b915061240982612be0565b604082019050919050565b6000612421601a83612904565b915061242c82612c2f565b602082019050919050565b6000612444602083612904565b915061244f82612c58565b602082019050919050565b6000612467601583612904565b915061247282612c81565b602082019050919050565b600061248a602083612904565b915061249582612caa565b602082019050919050565b60006124ad602383612904565b91506124b882612cd3565b604082019050919050565b60006124d0601983612904565b91506124db82612d22565b602082019050919050565b60006124f36000836128f9565b91506124fe82612d4b565b600082019050919050565b6000612516601083612904565b915061252182612d4e565b602082019050919050565b6000612539601683612904565b915061254482612d77565b602082019050919050565b600061255c602583612904565b915061256782612da0565b604082019050919050565b600061257f601f83612904565b915061258a82612def565b602082019050919050565b6080820160008201516125ab600085018261232c565b5060208201516125be6020850182612608565b5060408201516125d16040850182612361565b5060608201516125e460608501826125ea565b50505050565b6125f3816129bd565b82525050565b612602816129cc565b82525050565b612611816129d6565b82525050565b6000612623828461234a565b60148201915081905092915050565b600061263d826124e6565b9150819050919050565b600060208201905061265c600083018461233b565b92915050565b6000608082019050612677600083018761233b565b612684602083018661233b565b61269160408301856125f9565b81810360608301526126a3818461237f565b905095945050505050565b60006020820190506126c36000830184612370565b92915050565b600060208201905081810360008301526126e381846123b8565b905092915050565b60006020820190508181036000830152612704816123f1565b9050919050565b6000602082019050818103600083015261272481612414565b9050919050565b6000602082019050818103600083015261274481612437565b9050919050565b600060208201905081810360008301526127648161245a565b9050919050565b600060208201905081810360008301526127848161247d565b9050919050565b600060208201905081810360008301526127a4816124a0565b9050919050565b600060208201905081810360008301526127c4816124c3565b9050919050565b600060208201905081810360008301526127e481612509565b9050919050565b600060208201905081810360008301526128048161252c565b9050919050565b600060208201905081810360008301526128248161254f565b9050919050565b6000602082019050818103600083015261284481612572565b9050919050565b60006080820190506128606000830184612595565b92915050565b600060208201905061287b60008301846125f9565b92915050565b600061288b61289c565b90506128978282612a4f565b919050565b6000604051905090565b600067ffffffffffffffff8211156128c1576128c0612b7a565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612920826129cc565b915061292b836129cc565b92508282101561293e5761293d612aed565b5b828203905092915050565b60006129548261299d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60005b83811015612a085780820151818401526020810190506129ed565b83811115612a17576000848401525b50505050565b60006002820490506001821680612a3557607f821691505b60208210811415612a4957612a48612b1c565b5b50919050565b612a5882612bc2565b810181811067ffffffffffffffff82111715612a7757612a76612b7a565b5b80604052505050565b6000612a8b826129cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612abe57612abd612aed565b5b600182019050919050565b6000612ad482612adb565b9050919050565b6000612ae682612bd3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f676c6f62616c20696e646578206f7574206f6620626f756e6473000000000000600082015250565b7f457665727920416464726573732043616e204f6e6c79204d696e74204f6e652e600082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f6e6c79204d616e616765722043616e2043616c6c20546869732046756e637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f6f776e657220696e646578206f7574206f6620626f756e647300000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f756e61626c6520746f2067657420746f6b656e206f66206f776e65722062792060008201527f696e646578000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b612e2181612949565b8114612e2c57600080fd5b50565b612e3881612967565b8114612e4357600080fd5b50565b612e4f81612971565b8114612e5a57600080fd5b50565b612e66816129cc565b8114612e7157600080fd5b5056fea26469706673582212201d1f667e36335620645079488b1baeda5fa5552db165d835e879b053085ebe3d64736f6c63430008070033697066733a2f2f516d5334414b7876794845796a38446458347673765256555232643350796a7663726174786848536d4774477533697066733a2f2f516d6644746d70464843594a714a3241414e74327a4a476166476f32766d775a564b746a6534416f53634272637a
Deployed Bytecode
0x6080604052600436106101815760003560e01c806370a08231116100d157806395d89b411161008a578063d0ebdbe711610064578063d0ebdbe714610587578063dab5f340146105b0578063dc33e681146105d9578063f2fde38b1461061657610181565b806395d89b4114610508578063ac44600214610533578063c87b56dd1461054a57610181565b806370a08231146103e6578063715018a61461042357806382afd23b1461043a57806388b89a7d146104775780638da5cb5b146104a05780639231ab2a146104cb57610181565b80632f745c591161013e5780636352211e116101185780636352211e1461032e5780636790a9de1461036b5780636bfa1ac9146103945780636e2ee9c9146103bd57610181565b80632f745c591461028b5780633cd47537146102c85780634f6ccce7146102f157610181565b806301ffc9a71461018657806306fdde03146101c35780630804f418146101ee57806318160ddd1461022b5780631dfda2e71461025657806326092b8314610281575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612224565b61063f565b6040516101ba91906126ae565b60405180910390f35b3480156101cf57600080fd5b506101d8610739565b6040516101e591906126c9565b60405180910390f35b3480156101fa57600080fd5b506102156004803603810190610210919061212d565b6107cb565b60405161022291906126ae565b60405180910390f35b34801561023757600080fd5b5061024061080c565b60405161024d9190612866565b60405180910390f35b34801561026257600080fd5b5061026b610823565b6040516102789190612866565b60405180910390f35b610289610829565b005b34801561029757600080fd5b506102b260048036038101906102ad91906120ed565b610841565b6040516102bf9190612866565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190612176565b6109a2565b005b3480156102fd57600080fd5b50610318600480360381019061031391906122ff565b610a90565b6040516103259190612866565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906122ff565b610ae3565b6040516103629190612647565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d919061227e565b610af5565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906120c0565b610b9b565b005b3480156103c957600080fd5b506103e460048036038101906103df919061212d565b610c3b565b005b3480156103f257600080fd5b5061040d600480360381019061040891906120c0565b610cdc565b60405161041a9190612866565b60405180910390f35b34801561042f57600080fd5b50610438610d95565b005b34801561044657600080fd5b50610461600480360381019061045c91906122ff565b610e1d565b60405161046e91906126ae565b60405180910390f35b34801561048357600080fd5b5061049e600480360381019061049991906122ff565b610e5f565b005b3480156104ac57600080fd5b506104b5610ee5565b6040516104c29190612647565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed91906122ff565b610f0e565b6040516104ff919061284b565b60405180910390f35b34801561051457600080fd5b5061051d610f26565b60405161052a91906126c9565b60405180910390f35b34801561053f57600080fd5b50610548610fb8565b005b34801561055657600080fd5b50610571600480360381019061056c91906122ff565b611139565b60405161057e91906126c9565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906120c0565b6112ac565b005b3480156105bc57600080fd5b506105d760048036038101906105d291906121f7565b61136c565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906120c0565b6113f2565b60405161060d9190612866565b60405180910390f35b34801561062257600080fd5b5061063d600480360381019061063891906120c0565b611404565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ca5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461074890612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461077490612a1d565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b600080336040516020016107df9190612617565b60405160208183030381529060405280519060200120905061080483600b54836114fc565b915050919050565b6000610816611513565b6002546001540303905090565b600c5481565b610834600c54611518565b61083f3360016115b9565b565b600061084c83610cdc565b821061088d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610884906127ab565b60405180910390fd5b600061089761080c565b905060008060005b838110156109605760006108b2826115d7565b9050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146108f457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094c578684141561093d57819550505050505061099c565b838061094890612a80565b9450505b50808061095890612a80565b91505061089f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109939061280b565b60405180910390fd5b92915050565b6109aa6115f7565b73ffffffffffffffffffffffffffffffffffffffff166109c8610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a159061276b565b60405180910390fd5b60005b84849050811015610a8957610a76838383818110610a4257610a41612b4b565b5b9050602002016020810190610a5791906120c0565b868684818110610a6a57610a69612b4b565b5b905060200201356115b9565b8080610a8190612a80565b915050610a21565b5050505050565b6000610a9a61080c565b8210610adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad29061270b565b60405180910390fd5b819050919050565b6000610aee826115ff565b9050919050565b610afd6115f7565b73ffffffffffffffffffffffffffffffffffffffff16610b1b610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b689061276b565b60405180910390fd5b838360099190610b82929190611dc5565b508181600a9190610b94929190611dc5565b5050505050565b338073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c239061278b565b60405180910390fd5b610c378260016115b9565b5050565b610c44816107cb565b610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a9061274b565b60405180910390fd5b6000610c8e336116cd565b14610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc59061272b565b60405180910390fd5b610cd93360016115b9565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d44576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d9d6115f7565b73ffffffffffffffffffffffffffffffffffffffff16610dbb610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e089061276b565b60405180910390fd5b610e1b6000611724565b565b60006301e13380610e2d836115d7565b6020015167ffffffffffffffff1642610e469190612915565b1115610e555760009050610e5a565b600190505b919050565b610e676115f7565b73ffffffffffffffffffffffffffffffffffffffff16610e85610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed29061276b565b60405180910390fd5b80600c8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f16611e4b565b610f1f826115d7565b9050919050565b606060048054610f3590612a1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6190612a1d565b8015610fae5780601f10610f8357610100808354040283529160200191610fae565b820191906000526020600020905b815481529060010190602001808311610f9157829003601f168201915b5050505050905090565b610fc06115f7565b73ffffffffffffffffffffffffffffffffffffffff16610fde610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b9061276b565b60405180910390fd5b6002600754141561107a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110719061282b565b60405180910390fd5b600260078190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516110a890612632565b60006040518083038185875af1925050503d80600081146110e5576040519150601f19603f3d011682016040523d82523d6000602084013e6110ea565b606091505b505090508061112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906127cb565b60405180910390fd5b506001600781905550565b6060611144826117e8565b61117a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118382610e1d565b61121957600a805461119490612a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546111c090612a1d565b801561120d5780601f106111e25761010080835404028352916020019161120d565b820191906000526020600020905b8154815290600101906020018083116111f057829003601f168201915b505050505090506112a7565b6009805461122690612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461125290612a1d565b801561129f5780601f106112745761010080835404028352916020019161129f565b820191906000526020600020905b81548152906001019060200180831161128257829003601f168201915b505050505090505b919050565b6112b46115f7565b73ffffffffffffffffffffffffffffffffffffffff166112d2610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f9061276b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113746115f7565b73ffffffffffffffffffffffffffffffffffffffff16611392610ee5565b73ffffffffffffffffffffffffffffffffffffffff16146113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df9061276b565b60405180910390fd5b80600b8190555050565b60006113fd826116cd565b9050919050565b61140c6115f7565b73ffffffffffffffffffffffffffffffffffffffff1661142a610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114779061276b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e7906126eb565b60405180910390fd5b6114f981611724565b50565b6000826115098584611847565b1490509392505050565b600090565b8034101561155b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611552906127eb565b60405180910390fd5b803411156115b6573373ffffffffffffffffffffffffffffffffffffffff166108fc82346115899190612915565b9081150290604051600060405180830381858888f193505050501580156115b4573d6000803e3d6000fd5b505b50565b6115d38282604051806020016040528060008152506118bc565b5050565b6115df611e4b565b6115f06115eb836115ff565b61195a565b9050919050565b600033905090565b6000808290508061160e611513565b11611696576001548110156116955760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611693575b600081141561168957600560008360019003935083815260200190815260200160002054905061165e565b80925050506116c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816117f3611513565b11158015611802575060015482105b8015611840575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905060005b84518110156118b157600085828151811061186e5761186d612b4b565b5b60200260200101519050808311611890576118898382611a10565b925061189d565b61189a8184611a10565b92505b5080806118a990612a80565b915050611850565b508091505092915050565b6118c68383611a27565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119555760006001549050600083820390505b6119076000868380600101945086611be5565b61193d576040517fd099061d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106118f457816001541461195257600080fd5b50505b505050565b611962611e4b565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600082600052816020526040600020905092915050565b600060015490506000821415611a69576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a766000848385611d45565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611aed83611ade6000866000611d4b565b611ae785611d73565b17611d83565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611b8e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611b53565b506000821415611bca576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050611be06000848385611dae565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c0b611db4565b8786866040518563ffffffff1660e01b8152600401611c2d9493929190612662565b602060405180830381600087803b158015611c4757600080fd5b505af1925050508015611c7857506040513d601f19601f82011682018060405250810190611c759190612251565b60015b611cf2573d8060008114611ca8576040519150601f19603f3d011682016040523d82523d6000602084013e611cad565b606091505b50600081511415611cea576040517fd099061d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8611d62868684611dbc565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054611dd190612a1d565b90600052602060002090601f016020900481019282611df35760008555611e3a565b82601f10611e0c57803560ff1916838001178555611e3a565b82800160010185558215611e3a579182015b82811115611e39578235825591602001919060010190611e1e565b5b509050611e479190611e9a565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115611eb3576000816000905550600101611e9b565b5090565b6000611eca611ec5846128a6565b612881565b90508083825260208201905082856020860282011115611eed57611eec612bb3565b5b60005b85811015611f1d5781611f038882612016565b845260208401935060208301925050600181019050611ef0565b5050509392505050565b600081359050611f3681612e18565b92915050565b60008083601f840112611f5257611f51612bae565b5b8235905067ffffffffffffffff811115611f6f57611f6e612ba9565b5b602083019150836020820283011115611f8b57611f8a612bb3565b5b9250929050565b600082601f830112611fa757611fa6612bae565b5b8135611fb7848260208601611eb7565b91505092915050565b60008083601f840112611fd657611fd5612bae565b5b8235905067ffffffffffffffff811115611ff357611ff2612ba9565b5b60208301915083602082028301111561200f5761200e612bb3565b5b9250929050565b60008135905061202581612e2f565b92915050565b60008135905061203a81612e46565b92915050565b60008151905061204f81612e46565b92915050565b60008083601f84011261206b5761206a612bae565b5b8235905067ffffffffffffffff81111561208857612087612ba9565b5b6020830191508360018202830111156120a4576120a3612bb3565b5b9250929050565b6000813590506120ba81612e5d565b92915050565b6000602082840312156120d6576120d5612bbd565b5b60006120e484828501611f27565b91505092915050565b6000806040838503121561210457612103612bbd565b5b600061211285828601611f27565b9250506020612123858286016120ab565b9150509250929050565b60006020828403121561214357612142612bbd565b5b600082013567ffffffffffffffff81111561216157612160612bb8565b5b61216d84828501611f92565b91505092915050565b600080600080604085870312156121905761218f612bbd565b5b600085013567ffffffffffffffff8111156121ae576121ad612bb8565b5b6121ba87828801611fc0565b9450945050602085013567ffffffffffffffff8111156121dd576121dc612bb8565b5b6121e987828801611f3c565b925092505092959194509250565b60006020828403121561220d5761220c612bbd565b5b600061221b84828501612016565b91505092915050565b60006020828403121561223a57612239612bbd565b5b60006122488482850161202b565b91505092915050565b60006020828403121561226757612266612bbd565b5b600061227584828501612040565b91505092915050565b6000806000806040858703121561229857612297612bbd565b5b600085013567ffffffffffffffff8111156122b6576122b5612bb8565b5b6122c287828801612055565b9450945050602085013567ffffffffffffffff8111156122e5576122e4612bb8565b5b6122f187828801612055565b925092505092959194509250565b60006020828403121561231557612314612bbd565b5b6000612323848285016120ab565b91505092915050565b61233581612949565b82525050565b61234481612949565b82525050565b61235b61235682612949565b612ac9565b82525050565b61236a8161295b565b82525050565b6123798161295b565b82525050565b600061238a826128d2565b61239481856128e8565b93506123a48185602086016129ea565b6123ad81612bc2565b840191505092915050565b60006123c3826128dd565b6123cd8185612904565b93506123dd8185602086016129ea565b6123e681612bc2565b840191505092915050565b60006123fe602683612904565b915061240982612be0565b604082019050919050565b6000612421601a83612904565b915061242c82612c2f565b602082019050919050565b6000612444602083612904565b915061244f82612c58565b602082019050919050565b6000612467601583612904565b915061247282612c81565b602082019050919050565b600061248a602083612904565b915061249582612caa565b602082019050919050565b60006124ad602383612904565b91506124b882612cd3565b604082019050919050565b60006124d0601983612904565b91506124db82612d22565b602082019050919050565b60006124f36000836128f9565b91506124fe82612d4b565b600082019050919050565b6000612516601083612904565b915061252182612d4e565b602082019050919050565b6000612539601683612904565b915061254482612d77565b602082019050919050565b600061255c602583612904565b915061256782612da0565b604082019050919050565b600061257f601f83612904565b915061258a82612def565b602082019050919050565b6080820160008201516125ab600085018261232c565b5060208201516125be6020850182612608565b5060408201516125d16040850182612361565b5060608201516125e460608501826125ea565b50505050565b6125f3816129bd565b82525050565b612602816129cc565b82525050565b612611816129d6565b82525050565b6000612623828461234a565b60148201915081905092915050565b600061263d826124e6565b9150819050919050565b600060208201905061265c600083018461233b565b92915050565b6000608082019050612677600083018761233b565b612684602083018661233b565b61269160408301856125f9565b81810360608301526126a3818461237f565b905095945050505050565b60006020820190506126c36000830184612370565b92915050565b600060208201905081810360008301526126e381846123b8565b905092915050565b60006020820190508181036000830152612704816123f1565b9050919050565b6000602082019050818103600083015261272481612414565b9050919050565b6000602082019050818103600083015261274481612437565b9050919050565b600060208201905081810360008301526127648161245a565b9050919050565b600060208201905081810360008301526127848161247d565b9050919050565b600060208201905081810360008301526127a4816124a0565b9050919050565b600060208201905081810360008301526127c4816124c3565b9050919050565b600060208201905081810360008301526127e481612509565b9050919050565b600060208201905081810360008301526128048161252c565b9050919050565b600060208201905081810360008301526128248161254f565b9050919050565b6000602082019050818103600083015261284481612572565b9050919050565b60006080820190506128606000830184612595565b92915050565b600060208201905061287b60008301846125f9565b92915050565b600061288b61289c565b90506128978282612a4f565b919050565b6000604051905090565b600067ffffffffffffffff8211156128c1576128c0612b7a565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612920826129cc565b915061292b836129cc565b92508282101561293e5761293d612aed565b5b828203905092915050565b60006129548261299d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60005b83811015612a085780820151818401526020810190506129ed565b83811115612a17576000848401525b50505050565b60006002820490506001821680612a3557607f821691505b60208210811415612a4957612a48612b1c565b5b50919050565b612a5882612bc2565b810181811067ffffffffffffffff82111715612a7757612a76612b7a565b5b80604052505050565b6000612a8b826129cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612abe57612abd612aed565b5b600182019050919050565b6000612ad482612adb565b9050919050565b6000612ae682612bd3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f676c6f62616c20696e646578206f7574206f6620626f756e6473000000000000600082015250565b7f457665727920416464726573732043616e204f6e6c79204d696e74204f6e652e600082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f6e6c79204d616e616765722043616e2043616c6c20546869732046756e637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f6f776e657220696e646578206f7574206f6620626f756e647300000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f756e61626c6520746f2067657420746f6b656e206f66206f776e65722062792060008201527f696e646578000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b612e2181612949565b8114612e2c57600080fd5b50565b612e3881612967565b8114612e4357600080fd5b50565b612e4f81612971565b8114612e5a57600080fd5b50565b612e66816129cc565b8114612e7157600080fd5b5056fea26469706673582212201d1f667e36335620645079488b1baeda5fa5552db165d835e879b053085ebe3d64736f6c63430008070033
Deployed Bytecode Sourcemap
2077:3275:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10359:735:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11357:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4494:202:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5690:311:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4724:37:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4880:116;;;:::i;:::-;;9015:797:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2521:224:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8543:169:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12750:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2943:199:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5004:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4234:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6850:233:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;3431:212:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4770:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3971:136:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11533:104:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3651:191:6;;;;;;;;;;;;;:::i;:::-;;3150:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2247:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4144:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3850:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10359:735:7;10444:4;10779:10;10764:25;;:11;:25;;;;:98;;;;10852:10;10837:25;;:11;:25;;;;10764:98;:171;;;;10925:10;10910:25;;:11;:25;;;;10764:171;:277;;;;11006:35;10991:50;;;:11;:50;;;;10764:277;10748:293;;10359:735;;;:::o;11357:100::-;11411:13;11444:5;11437:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11357:100;:::o;4494:202:6:-;4562:4;4579:12;4621:10;4604:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;4594:39;;;;;;4579:54;;4651:37;4670:5;4677:4;;4683;4651:18;:37::i;:::-;4644:44;;;4494:202;;;:::o;5690:311:7:-;5751:7;5971:15;:13;:15::i;:::-;5956:12;;5940:13;;:28;:46;5933:53;;5690:311;:::o;4724:37:6:-;;;;:::o;4880:116::-;4930:23;4943:9;;4930:12;:23::i;:::-;4964:24;4974:10;4986:1;4964:9;:24::i;:::-;4880:116::o;9015:797:7:-;9095:7;9131:16;9141:5;9131:9;:16::i;:::-;9123:5;:24;9115:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9188:22;9213:13;:11;:13::i;:::-;9188:38;;9237:19;9271:25;9325:9;9320:427;9344:14;9340:1;:18;9320:427;;;9380:31;9414:15;9427:1;9414:12;:15::i;:::-;9380:49;;9474:1;9448:28;;:9;:14;;;:28;;;9444:103;;9517:9;:14;;;9497:34;;9444:103;9586:5;9565:26;;:17;:26;;;9561:175;;;9631:5;9616:11;:20;9612:77;;;9668:1;9661:8;;;;;;;;;9612:77;9707:13;;;;;:::i;:::-;;;;9561:175;9365:382;9360:3;;;;;:::i;:::-;;;;9320:427;;;;9757:47;;;;;;;;;;:::i;:::-;;;;;;;;9015:797;;;;;:::o;2521:224:6:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2636:9:6::1;2632:106;2655:10;;:17;;2651:1;:21;2632:106;;;2694:32;2704:3;;2708:1;2704:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2712:10;;2723:1;2712:13;;;;;;;:::i;:::-;;;;;;;;2694:9;:32::i;:::-;2674:3;;;;;:::i;:::-;;;;2632:106;;;;2521:224:::0;;;;:::o;8543:169:7:-;8601:7;8637:13;:11;:13::i;:::-;8629:5;:21;8621:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8699:5;8692:12;;8543:169;;;:::o;12750:152::-;12822:7;12865:27;12884:7;12865:18;:27::i;:::-;12842:52;;12750:152;;;:::o;2943:199:6:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3075:14:6::1;;3059:13;:30;;;;;;;:::i;:::-;;3118:16;;3100:15;:34;;;;;;;:::i;:::-;;2943:199:::0;;;;:::o;5004:113::-;5070:10;2418:8;2407:19;;:7;;;;;;;;;;;:19;;;2399:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5093:16:::1;5103:2;5107:1;5093:9;:16::i;:::-;5004:113:::0;;:::o;4234:252::-;4311:20;4325:5;4311:13;:20::i;:::-;4303:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4405:1;4376:25;4390:10;4376:13;:25::i;:::-;:30;4368:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4454:24;4464:10;4476:1;4454:9;:24::i;:::-;4234:252;:::o;6850:233:7:-;6922:7;6963:1;6946:19;;:5;:19;;;6942:60;;;6974:28;;;;;;;;;;;;;;6942:60;1286:13;7020:18;:25;7039:5;7020:25;;;;;;;;;;;;;;;;:55;7013:62;;6850:233;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;3431:212:6:-;3487:4;3565:8;3526:21;3539:7;3526:12;:21::i;:::-;:36;;;3508:54;;:15;:54;;;;:::i;:::-;:65;3504:110;;;3597:5;3590:12;;;;3504:110;3631:4;3624:11;;3431:212;;;;:::o;4770:102::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4854:10:6::1;4842:9;:22;;;;4770:102:::0;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;3971:136:6:-;4037:21;;:::i;:::-;4078;4091:7;4078:12;:21::i;:::-;4071:28;;3971:136;;;:::o;11533:104:7:-;11589:13;11622:7;11615:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11533:104;:::o;3651:191:6:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3720:12:6::2;3738:10;:15;;3761:21;3738:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3719:68;;;3806:7;3798:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;3708:134;1701:1:1::1;2628:7;:22;;;;3651:191:6:o:0;3150:273::-;3215:13;3246:16;3254:7;3246;:16::i;:::-;3241:59;;3271:29;;;;;;;;;;;;;;3241:59;3318:17;3327:7;3318:8;:17::i;:::-;3313:72;;3358:15;3351:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3313:72;3402:13;3395:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3150:273;;;;:::o;2247:94::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2325:8:6::1;2315:7;;:18;;;;;;;;;;;;;;;;;;2247:94:::0;:::o;4144:82::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4213:5:6::1;4206:4;:12;;;;4144:82:::0;:::o;3850:113::-;3908:7;3935:20;3949:5;3935:13;:20::i;:::-;3928:27;;3850:113;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;611:190:6:-;736:4;789;760:25;773:5;780:4;760:12;:25::i;:::-;:33;753:40;;611:190;;;;;:::o;5206:92:7:-;5262:7;5206:92;:::o;5125:224:6:-;5202:5;5189:9;:18;;5181:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;5261:5;5249:9;:17;5245:97;;;5291:10;5283:28;;:47;5324:5;5312:9;:17;;;;:::i;:::-;5283:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5245:97;5125:224;:::o;25929:112:7:-;26006:27;26016:2;26020:8;26006:27;;;;;;;;;;;;:9;:27::i;:::-;25929:112;;:::o;13091:166::-;13161:21;;:::i;:::-;13202:47;13221:27;13240:7;13221:18;:27::i;:::-;13202:18;:47::i;:::-;13195:54;;13091:166;;;:::o;640:96:4:-;693:7;719:10;712:17;;640:96;:::o;13905:1187:7:-;13972:7;13992:12;14007:7;13992:22;;14067:4;14048:15;:13;:15::i;:::-;:23;14044:985;;14097:13;;14090:4;:20;14086:943;;;14131:14;14148:17;:23;14166:4;14148:23;;;;;;;;;;;;14131:40;;14257:1;2062:8;14229:6;:24;:29;14225:789;;;14854:105;14871:1;14861:6;:11;14854:105;;;14910:17;:25;14928:6;;;;;;;14910:25;;;;;;;;;;;;14901:34;;14854:105;;;14988:6;14981:13;;;;;;14225:789;14112:917;14086:943;14044:985;15053:31;;;;;;;;;;;;;;13905:1187;;;;:::o;7165:178::-;7226:7;1286:13;1424:2;7254:18;:25;7273:5;7254:25;;;;;;;;;;;;;;;;:50;;7253:82;7246:89;;7165:178;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;16762:270:7:-;16827:4;16879:7;16860:15;:13;:15::i;:::-;:26;;:62;;;;;16909:13;;16899:7;:23;16860:62;:145;;;;;17004:1;2062:8;16956:17;:26;16974:7;16956:26;;;;;;;;;;;;:44;:49;16860:145;16844:161;;16762:270;;;:::o;1163:675:6:-;1246:7;1266:20;1289:4;1266:27;;1309:9;1304:497;1328:5;:12;1324:1;:16;1304:497;;;1362:20;1385:5;1391:1;1385:8;;;;;;;;:::i;:::-;;;;;;;;1362:31;;1428:12;1412;:28;1408:382;;1555:42;1570:12;1584;1555:14;:42::i;:::-;1540:57;;1408:382;;;1732:42;1747:12;1761;1732:14;:42::i;:::-;1717:57;;1408:382;1347:454;1342:3;;;;;:::i;:::-;;;;1304:497;;;;1818:12;1811:19;;;1163:675;;;;:::o;25212:633:7:-;25343:19;25349:2;25353:8;25343:5;:19::i;:::-;25414:1;25396:2;:14;;;:19;25392:439;;25432:11;25446:13;;25432:27;;25474:13;25496:8;25490:3;:14;25474:30;;25519:213;25546:62;25585:1;25589:2;25593:7;;;;;;25602:5;25546:30;:62::i;:::-;25541:155;;25640:36;;;;;;;;;;;;;;25541:155;25727:3;25719:5;:11;25519:213;;25806:3;25789:13;;:20;25785:34;;25811:8;;;25785:34;25417:414;;25392:439;25212:633;;;:::o;15191:366::-;15257:31;;:::i;:::-;15334:6;15301:9;:14;;:41;;;;;;;;;;;1945:3;15387:6;:33;;15353:9;:24;;:68;;;;;;;;;;;15479:1;2062:8;15451:6;:24;:29;;15432:9;:16;;:48;;;;;;;;;;;2466:3;15520:6;:28;;15491:9;:19;;:58;;;;;;;;;;;15191:366;;;:::o;1846:224:6:-;1914:13;1977:1;1971:4;1964:15;2006:1;2000:4;1993:15;2047:4;2041;2031:21;2022:30;;1846:224;;;;:::o;20290:2246:7:-;20363:20;20386:13;;20363:36;;20426:1;20414:8;:13;20410:44;;;20436:18;;;;;;;;;;;;;;20410:44;20467:61;20497:1;20501:2;20505:12;20519:8;20467:21;:61::i;:::-;20983:1;1424:2;20953:1;:26;;20952:32;20940:8;:45;20914:18;:22;20933:2;20914:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;21238:127;21271:2;21321:33;21344:1;21348:2;21352:1;21321:14;:33::i;:::-;21288:30;21309:8;21288:20;:30::i;:::-;:66;21238:18;:127::i;:::-;21204:17;:31;21222:12;21204:31;;;;;;;;;;;:161;;;;21378:16;21405:11;21434:8;21419:12;:23;21405:37;;21669:16;21665:2;21661:25;21649:37;;21981:12;21949:8;21916:1;21862:25;21811:1;21758;21739:283;22094:1;22080:12;22076:20;22038:314;22131:3;22122:7;22119:16;22038:314;;22329:7;22319:8;22316:1;22289:25;22286:1;22283;22278:59;22180:1;22171:7;22167:15;22156:26;;22038:314;;;22042:69;22389:1;22377:8;:13;22373:45;;;22399:19;;;;;;;;;;;;;;22373:45;22447:3;22431:13;:19;;;;20712:1746;;22468:60;22497:1;22501:2;22505:12;22519:8;22468:20;:60::i;:::-;20352:2184;20290:2246;;:::o;19116:712::-;19279:4;19325:2;19300:45;;;19346:19;:17;:19::i;:::-;19367:4;19373:7;19382:5;19300:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19296:525;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19600:1;19583:6;:13;:18;19579:231;;;19629:36;;;;;;;;;;;;;;19579:231;19768:6;19762:13;19753:6;19749:2;19745:15;19738:38;19296:525;19469:54;;;19459:64;;;:6;:64;;;;19452:71;;;19116:712;;;;;;:::o;17694:159::-;;;;;:::o;27740:311::-;27875:7;27895:16;2466:3;27921:19;:41;;27895:68;;2466:3;27989:31;28000:4;28006:2;28010:9;27989:10;:31::i;:::-;27981:40;;:62;;27974:69;;;27740:311;;;;;:::o;16184:320::-;16254:14;16483:1;16473:8;16470:15;16444:24;16440:46;16430:56;;16184:320;;;:::o;15640:442::-;15720:14;15884:16;15877:5;15873:28;15864:37;;16057:5;16043:11;16018:23;16014:41;16011:52;16004:5;16001:63;15991:73;;15640:442;;;;:::o;18518:158::-;;;;;:::o;28431:105::-;28491:7;28518:10;28511:17;;28431:105;:::o;27441:147::-;27578:6;27441:147;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:9:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:139::-;798:5;836:6;823:20;814:29;;852:33;879:5;852:33;:::i;:::-;752:139;;;;:::o;914:568::-;987:8;997:6;1047:3;1040:4;1032:6;1028:17;1024:27;1014:122;;1055:79;;:::i;:::-;1014:122;1168:6;1155:20;1145:30;;1198:18;1190:6;1187:30;1184:117;;;1220:79;;:::i;:::-;1184:117;1334:4;1326:6;1322:17;1310:29;;1388:3;1380:4;1372:6;1368:17;1358:8;1354:32;1351:41;1348:128;;;1395:79;;:::i;:::-;1348:128;914:568;;;;;:::o;1505:370::-;1576:5;1625:3;1618:4;1610:6;1606:17;1602:27;1592:122;;1633:79;;:::i;:::-;1592:122;1750:6;1737:20;1775:94;1865:3;1857:6;1850:4;1842:6;1838:17;1775:94;:::i;:::-;1766:103;;1582:293;1505:370;;;;:::o;1898:568::-;1971:8;1981:6;2031:3;2024:4;2016:6;2012:17;2008:27;1998:122;;2039:79;;:::i;:::-;1998:122;2152:6;2139:20;2129:30;;2182:18;2174:6;2171:30;2168:117;;;2204:79;;:::i;:::-;2168:117;2318:4;2310:6;2306:17;2294:29;;2372:3;2364:4;2356:6;2352:17;2342:8;2338:32;2335:41;2332:128;;;2379:79;;:::i;:::-;2332:128;1898:568;;;;;:::o;2472:139::-;2518:5;2556:6;2543:20;2534:29;;2572:33;2599:5;2572:33;:::i;:::-;2472:139;;;;:::o;2617:137::-;2662:5;2700:6;2687:20;2678:29;;2716:32;2742:5;2716:32;:::i;:::-;2617:137;;;;:::o;2760:141::-;2816:5;2847:6;2841:13;2832:22;;2863:32;2889:5;2863:32;:::i;:::-;2760:141;;;;:::o;2921:553::-;2979:8;2989:6;3039:3;3032:4;3024:6;3020:17;3016:27;3006:122;;3047:79;;:::i;:::-;3006:122;3160:6;3147:20;3137:30;;3190:18;3182:6;3179:30;3176:117;;;3212:79;;:::i;:::-;3176:117;3326:4;3318:6;3314:17;3302:29;;3380:3;3372:4;3364:6;3360:17;3350:8;3346:32;3343:41;3340:128;;;3387:79;;:::i;:::-;3340:128;2921:553;;;;;:::o;3480:139::-;3526:5;3564:6;3551:20;3542:29;;3580:33;3607:5;3580:33;:::i;:::-;3480:139;;;;:::o;3625:329::-;3684:6;3733:2;3721:9;3712:7;3708:23;3704:32;3701:119;;;3739:79;;:::i;:::-;3701:119;3859:1;3884:53;3929:7;3920:6;3909:9;3905:22;3884:53;:::i;:::-;3874:63;;3830:117;3625:329;;;;:::o;3960:474::-;4028:6;4036;4085:2;4073:9;4064:7;4060:23;4056:32;4053:119;;;4091:79;;:::i;:::-;4053:119;4211:1;4236:53;4281:7;4272:6;4261:9;4257:22;4236:53;:::i;:::-;4226:63;;4182:117;4338:2;4364:53;4409:7;4400:6;4389:9;4385:22;4364:53;:::i;:::-;4354:63;;4309:118;3960:474;;;;;:::o;4440:539::-;4524:6;4573:2;4561:9;4552:7;4548:23;4544:32;4541:119;;;4579:79;;:::i;:::-;4541:119;4727:1;4716:9;4712:17;4699:31;4757:18;4749:6;4746:30;4743:117;;;4779:79;;:::i;:::-;4743:117;4884:78;4954:7;4945:6;4934:9;4930:22;4884:78;:::i;:::-;4874:88;;4670:302;4440:539;;;;:::o;4985:934::-;5107:6;5115;5123;5131;5180:2;5168:9;5159:7;5155:23;5151:32;5148:119;;;5186:79;;:::i;:::-;5148:119;5334:1;5323:9;5319:17;5306:31;5364:18;5356:6;5353:30;5350:117;;;5386:79;;:::i;:::-;5350:117;5499:80;5571:7;5562:6;5551:9;5547:22;5499:80;:::i;:::-;5481:98;;;;5277:312;5656:2;5645:9;5641:18;5628:32;5687:18;5679:6;5676:30;5673:117;;;5709:79;;:::i;:::-;5673:117;5822:80;5894:7;5885:6;5874:9;5870:22;5822:80;:::i;:::-;5804:98;;;;5599:313;4985:934;;;;;;;:::o;5925:329::-;5984:6;6033:2;6021:9;6012:7;6008:23;6004:32;6001:119;;;6039:79;;:::i;:::-;6001:119;6159:1;6184:53;6229:7;6220:6;6209:9;6205:22;6184:53;:::i;:::-;6174:63;;6130:117;5925:329;;;;:::o;6260:327::-;6318:6;6367:2;6355:9;6346:7;6342:23;6338:32;6335:119;;;6373:79;;:::i;:::-;6335:119;6493:1;6518:52;6562:7;6553:6;6542:9;6538:22;6518:52;:::i;:::-;6508:62;;6464:116;6260:327;;;;:::o;6593:349::-;6662:6;6711:2;6699:9;6690:7;6686:23;6682:32;6679:119;;;6717:79;;:::i;:::-;6679:119;6837:1;6862:63;6917:7;6908:6;6897:9;6893:22;6862:63;:::i;:::-;6852:73;;6808:127;6593:349;;;;:::o;6948:874::-;7040:6;7048;7056;7064;7113:2;7101:9;7092:7;7088:23;7084:32;7081:119;;;7119:79;;:::i;:::-;7081:119;7267:1;7256:9;7252:17;7239:31;7297:18;7289:6;7286:30;7283:117;;;7319:79;;:::i;:::-;7283:117;7432:65;7489:7;7480:6;7469:9;7465:22;7432:65;:::i;:::-;7414:83;;;;7210:297;7574:2;7563:9;7559:18;7546:32;7605:18;7597:6;7594:30;7591:117;;;7627:79;;:::i;:::-;7591:117;7740:65;7797:7;7788:6;7777:9;7773:22;7740:65;:::i;:::-;7722:83;;;;7517:298;6948:874;;;;;;;:::o;7828:329::-;7887:6;7936:2;7924:9;7915:7;7911:23;7907:32;7904:119;;;7942:79;;:::i;:::-;7904:119;8062:1;8087:53;8132:7;8123:6;8112:9;8108:22;8087:53;:::i;:::-;8077:63;;8033:117;7828:329;;;;:::o;8163:108::-;8240:24;8258:5;8240:24;:::i;:::-;8235:3;8228:37;8163:108;;:::o;8277:118::-;8364:24;8382:5;8364:24;:::i;:::-;8359:3;8352:37;8277:118;;:::o;8401:157::-;8506:45;8526:24;8544:5;8526:24;:::i;:::-;8506:45;:::i;:::-;8501:3;8494:58;8401:157;;:::o;8564:99::-;8635:21;8650:5;8635:21;:::i;:::-;8630:3;8623:34;8564:99;;:::o;8669:109::-;8750:21;8765:5;8750:21;:::i;:::-;8745:3;8738:34;8669:109;;:::o;8784:360::-;8870:3;8898:38;8930:5;8898:38;:::i;:::-;8952:70;9015:6;9010:3;8952:70;:::i;:::-;8945:77;;9031:52;9076:6;9071:3;9064:4;9057:5;9053:16;9031:52;:::i;:::-;9108:29;9130:6;9108:29;:::i;:::-;9103:3;9099:39;9092:46;;8874:270;8784:360;;;;:::o;9150:364::-;9238:3;9266:39;9299:5;9266:39;:::i;:::-;9321:71;9385:6;9380:3;9321:71;:::i;:::-;9314:78;;9401:52;9446:6;9441:3;9434:4;9427:5;9423:16;9401:52;:::i;:::-;9478:29;9500:6;9478:29;:::i;:::-;9473:3;9469:39;9462:46;;9242:272;9150:364;;;;:::o;9520:366::-;9662:3;9683:67;9747:2;9742:3;9683:67;:::i;:::-;9676:74;;9759:93;9848:3;9759:93;:::i;:::-;9877:2;9872:3;9868:12;9861:19;;9520:366;;;:::o;9892:::-;10034:3;10055:67;10119:2;10114:3;10055:67;:::i;:::-;10048:74;;10131:93;10220:3;10131:93;:::i;:::-;10249:2;10244:3;10240:12;10233:19;;9892:366;;;:::o;10264:::-;10406:3;10427:67;10491:2;10486:3;10427:67;:::i;:::-;10420:74;;10503:93;10592:3;10503:93;:::i;:::-;10621:2;10616:3;10612:12;10605:19;;10264:366;;;:::o;10636:::-;10778:3;10799:67;10863:2;10858:3;10799:67;:::i;:::-;10792:74;;10875:93;10964:3;10875:93;:::i;:::-;10993:2;10988:3;10984:12;10977:19;;10636:366;;;:::o;11008:::-;11150:3;11171:67;11235:2;11230:3;11171:67;:::i;:::-;11164:74;;11247:93;11336:3;11247:93;:::i;:::-;11365:2;11360:3;11356:12;11349:19;;11008:366;;;:::o;11380:::-;11522:3;11543:67;11607:2;11602:3;11543:67;:::i;:::-;11536:74;;11619:93;11708:3;11619:93;:::i;:::-;11737:2;11732:3;11728:12;11721:19;;11380:366;;;:::o;11752:::-;11894:3;11915:67;11979:2;11974:3;11915:67;:::i;:::-;11908:74;;11991:93;12080:3;11991:93;:::i;:::-;12109:2;12104:3;12100:12;12093:19;;11752:366;;;:::o;12124:398::-;12283:3;12304:83;12385:1;12380:3;12304:83;:::i;:::-;12297:90;;12396:93;12485:3;12396:93;:::i;:::-;12514:1;12509:3;12505:11;12498:18;;12124:398;;;:::o;12528:366::-;12670:3;12691:67;12755:2;12750:3;12691:67;:::i;:::-;12684:74;;12767:93;12856:3;12767:93;:::i;:::-;12885:2;12880:3;12876:12;12869:19;;12528:366;;;:::o;12900:::-;13042:3;13063:67;13127:2;13122:3;13063:67;:::i;:::-;13056:74;;13139:93;13228:3;13139:93;:::i;:::-;13257:2;13252:3;13248:12;13241:19;;12900:366;;;:::o;13272:::-;13414:3;13435:67;13499:2;13494:3;13435:67;:::i;:::-;13428:74;;13511:93;13600:3;13511:93;:::i;:::-;13629:2;13624:3;13620:12;13613:19;;13272:366;;;:::o;13644:::-;13786:3;13807:67;13871:2;13866:3;13807:67;:::i;:::-;13800:74;;13883:93;13972:3;13883:93;:::i;:::-;14001:2;13996:3;13992:12;13985:19;;13644:366;;;:::o;14088:876::-;14249:4;14244:3;14240:14;14336:4;14329:5;14325:16;14319:23;14355:63;14412:4;14407:3;14403:14;14389:12;14355:63;:::i;:::-;14264:164;14520:4;14513:5;14509:16;14503:23;14539:61;14594:4;14589:3;14585:14;14571:12;14539:61;:::i;:::-;14438:172;14694:4;14687:5;14683:16;14677:23;14713:57;14764:4;14759:3;14755:14;14741:12;14713:57;:::i;:::-;14620:160;14867:4;14860:5;14856:16;14850:23;14886:61;14941:4;14936:3;14932:14;14918:12;14886:61;:::i;:::-;14790:167;14218:746;14088:876;;:::o;14970:105::-;15045:23;15062:5;15045:23;:::i;:::-;15040:3;15033:36;14970:105;;:::o;15081:118::-;15168:24;15186:5;15168:24;:::i;:::-;15163:3;15156:37;15081:118;;:::o;15205:105::-;15280:23;15297:5;15280:23;:::i;:::-;15275:3;15268:36;15205:105;;:::o;15316:256::-;15428:3;15443:75;15514:3;15505:6;15443:75;:::i;:::-;15543:2;15538:3;15534:12;15527:19;;15563:3;15556:10;;15316:256;;;;:::o;15578:379::-;15762:3;15784:147;15927:3;15784:147;:::i;:::-;15777:154;;15948:3;15941:10;;15578:379;;;:::o;15963:222::-;16056:4;16094:2;16083:9;16079:18;16071:26;;16107:71;16175:1;16164:9;16160:17;16151:6;16107:71;:::i;:::-;15963:222;;;;:::o;16191:640::-;16386:4;16424:3;16413:9;16409:19;16401:27;;16438:71;16506:1;16495:9;16491:17;16482:6;16438:71;:::i;:::-;16519:72;16587:2;16576:9;16572:18;16563:6;16519:72;:::i;:::-;16601;16669:2;16658:9;16654:18;16645:6;16601:72;:::i;:::-;16720:9;16714:4;16710:20;16705:2;16694:9;16690:18;16683:48;16748:76;16819:4;16810:6;16748:76;:::i;:::-;16740:84;;16191:640;;;;;;;:::o;16837:210::-;16924:4;16962:2;16951:9;16947:18;16939:26;;16975:65;17037:1;17026:9;17022:17;17013:6;16975:65;:::i;:::-;16837:210;;;;:::o;17053:313::-;17166:4;17204:2;17193:9;17189:18;17181:26;;17253:9;17247:4;17243:20;17239:1;17228:9;17224:17;17217:47;17281:78;17354:4;17345:6;17281:78;:::i;:::-;17273:86;;17053:313;;;;:::o;17372:419::-;17538:4;17576:2;17565:9;17561:18;17553:26;;17625:9;17619:4;17615:20;17611:1;17600:9;17596:17;17589:47;17653:131;17779:4;17653:131;:::i;:::-;17645:139;;17372:419;;;:::o;17797:::-;17963:4;18001:2;17990:9;17986:18;17978:26;;18050:9;18044:4;18040:20;18036:1;18025:9;18021:17;18014:47;18078:131;18204:4;18078:131;:::i;:::-;18070:139;;17797:419;;;:::o;18222:::-;18388:4;18426:2;18415:9;18411:18;18403:26;;18475:9;18469:4;18465:20;18461:1;18450:9;18446:17;18439:47;18503:131;18629:4;18503:131;:::i;:::-;18495:139;;18222:419;;;:::o;18647:::-;18813:4;18851:2;18840:9;18836:18;18828:26;;18900:9;18894:4;18890:20;18886:1;18875:9;18871:17;18864:47;18928:131;19054:4;18928:131;:::i;:::-;18920:139;;18647:419;;;:::o;19072:::-;19238:4;19276:2;19265:9;19261:18;19253:26;;19325:9;19319:4;19315:20;19311:1;19300:9;19296:17;19289:47;19353:131;19479:4;19353:131;:::i;:::-;19345:139;;19072:419;;;:::o;19497:::-;19663:4;19701:2;19690:9;19686:18;19678:26;;19750:9;19744:4;19740:20;19736:1;19725:9;19721:17;19714:47;19778:131;19904:4;19778:131;:::i;:::-;19770:139;;19497:419;;;:::o;19922:::-;20088:4;20126:2;20115:9;20111:18;20103:26;;20175:9;20169:4;20165:20;20161:1;20150:9;20146:17;20139:47;20203:131;20329:4;20203:131;:::i;:::-;20195:139;;19922:419;;;:::o;20347:::-;20513:4;20551:2;20540:9;20536:18;20528:26;;20600:9;20594:4;20590:20;20586:1;20575:9;20571:17;20564:47;20628:131;20754:4;20628:131;:::i;:::-;20620:139;;20347:419;;;:::o;20772:::-;20938:4;20976:2;20965:9;20961:18;20953:26;;21025:9;21019:4;21015:20;21011:1;21000:9;20996:17;20989:47;21053:131;21179:4;21053:131;:::i;:::-;21045:139;;20772:419;;;:::o;21197:::-;21363:4;21401:2;21390:9;21386:18;21378:26;;21450:9;21444:4;21440:20;21436:1;21425:9;21421:17;21414:47;21478:131;21604:4;21478:131;:::i;:::-;21470:139;;21197:419;;;:::o;21622:::-;21788:4;21826:2;21815:9;21811:18;21803:26;;21875:9;21869:4;21865:20;21861:1;21850:9;21846:17;21839:47;21903:131;22029:4;21903:131;:::i;:::-;21895:139;;21622:419;;;:::o;22047:351::-;22204:4;22242:3;22231:9;22227:19;22219:27;;22256:135;22388:1;22377:9;22373:17;22364:6;22256:135;:::i;:::-;22047:351;;;;:::o;22404:222::-;22497:4;22535:2;22524:9;22520:18;22512:26;;22548:71;22616:1;22605:9;22601:17;22592:6;22548:71;:::i;:::-;22404:222;;;;:::o;22632:129::-;22666:6;22693:20;;:::i;:::-;22683:30;;22722:33;22750:4;22742:6;22722:33;:::i;:::-;22632:129;;;:::o;22767:75::-;22800:6;22833:2;22827:9;22817:19;;22767:75;:::o;22848:311::-;22925:4;23015:18;23007:6;23004:30;23001:56;;;23037:18;;:::i;:::-;23001:56;23087:4;23079:6;23075:17;23067:25;;23147:4;23141;23137:15;23129:23;;22848:311;;;:::o;23165:98::-;23216:6;23250:5;23244:12;23234:22;;23165:98;;;:::o;23269:99::-;23321:6;23355:5;23349:12;23339:22;;23269:99;;;:::o;23374:168::-;23457:11;23491:6;23486:3;23479:19;23531:4;23526:3;23522:14;23507:29;;23374:168;;;;:::o;23548:147::-;23649:11;23686:3;23671:18;;23548:147;;;;:::o;23701:169::-;23785:11;23819:6;23814:3;23807:19;23859:4;23854:3;23850:14;23835:29;;23701:169;;;;:::o;23876:191::-;23916:4;23936:20;23954:1;23936:20;:::i;:::-;23931:25;;23970:20;23988:1;23970:20;:::i;:::-;23965:25;;24009:1;24006;24003:8;24000:34;;;24014:18;;:::i;:::-;24000:34;24059:1;24056;24052:9;24044:17;;23876:191;;;;:::o;24073:96::-;24110:7;24139:24;24157:5;24139:24;:::i;:::-;24128:35;;24073:96;;;:::o;24175:90::-;24209:7;24252:5;24245:13;24238:21;24227:32;;24175:90;;;:::o;24271:77::-;24308:7;24337:5;24326:16;;24271:77;;;:::o;24354:149::-;24390:7;24430:66;24423:5;24419:78;24408:89;;24354:149;;;:::o;24509:126::-;24546:7;24586:42;24579:5;24575:54;24564:65;;24509:126;;;:::o;24641:91::-;24677:7;24717:8;24710:5;24706:20;24695:31;;24641:91;;;:::o;24738:77::-;24775:7;24804:5;24793:16;;24738:77;;;:::o;24821:101::-;24857:7;24897:18;24890:5;24886:30;24875:41;;24821:101;;;:::o;24928:307::-;24996:1;25006:113;25020:6;25017:1;25014:13;25006:113;;;25105:1;25100:3;25096:11;25090:18;25086:1;25081:3;25077:11;25070:39;25042:2;25039:1;25035:10;25030:15;;25006:113;;;25137:6;25134:1;25131:13;25128:101;;;25217:1;25208:6;25203:3;25199:16;25192:27;25128:101;24977:258;24928:307;;;:::o;25241:320::-;25285:6;25322:1;25316:4;25312:12;25302:22;;25369:1;25363:4;25359:12;25390:18;25380:81;;25446:4;25438:6;25434:17;25424:27;;25380:81;25508:2;25500:6;25497:14;25477:18;25474:38;25471:84;;;25527:18;;:::i;:::-;25471:84;25292:269;25241:320;;;:::o;25567:281::-;25650:27;25672:4;25650:27;:::i;:::-;25642:6;25638:40;25780:6;25768:10;25765:22;25744:18;25732:10;25729:34;25726:62;25723:88;;;25791:18;;:::i;:::-;25723:88;25831:10;25827:2;25820:22;25610:238;25567:281;;:::o;25854:233::-;25893:3;25916:24;25934:5;25916:24;:::i;:::-;25907:33;;25962:66;25955:5;25952:77;25949:103;;;26032:18;;:::i;:::-;25949:103;26079:1;26072:5;26068:13;26061:20;;25854:233;;;:::o;26093:100::-;26132:7;26161:26;26181:5;26161:26;:::i;:::-;26150:37;;26093:100;;;:::o;26199:94::-;26238:7;26267:20;26281:5;26267:20;:::i;:::-;26256:31;;26199:94;;;:::o;26299:180::-;26347:77;26344:1;26337:88;26444:4;26441:1;26434:15;26468:4;26465:1;26458:15;26485:180;26533:77;26530:1;26523:88;26630:4;26627:1;26620:15;26654:4;26651:1;26644:15;26671:180;26719:77;26716:1;26709:88;26816:4;26813:1;26806:15;26840:4;26837:1;26830:15;26857:180;26905:77;26902:1;26895:88;27002:4;26999:1;26992:15;27026:4;27023:1;27016:15;27043:117;27152:1;27149;27142:12;27166:117;27275:1;27272;27265:12;27289:117;27398:1;27395;27388:12;27412:117;27521:1;27518;27511:12;27535:117;27644:1;27641;27634:12;27658:102;27699:6;27750:2;27746:7;27741:2;27734:5;27730:14;27726:28;27716:38;;27658:102;;;:::o;27766:94::-;27799:8;27847:5;27843:2;27839:14;27818:35;;27766:94;;;:::o;27866:225::-;28006:34;28002:1;27994:6;27990:14;27983:58;28075:8;28070:2;28062:6;28058:15;28051:33;27866:225;:::o;28097:176::-;28237:28;28233:1;28225:6;28221:14;28214:52;28097:176;:::o;28279:182::-;28419:34;28415:1;28407:6;28403:14;28396:58;28279:182;:::o;28467:171::-;28607:23;28603:1;28595:6;28591:14;28584:47;28467:171;:::o;28644:182::-;28784:34;28780:1;28772:6;28768:14;28761:58;28644:182;:::o;28832:222::-;28972:34;28968:1;28960:6;28956:14;28949:58;29041:5;29036:2;29028:6;29024:15;29017:30;28832:222;:::o;29060:175::-;29200:27;29196:1;29188:6;29184:14;29177:51;29060:175;:::o;29241:114::-;;:::o;29361:166::-;29501:18;29497:1;29489:6;29485:14;29478:42;29361:166;:::o;29533:172::-;29673:24;29669:1;29661:6;29657:14;29650:48;29533:172;:::o;29711:224::-;29851:34;29847:1;29839:6;29835:14;29828:58;29920:7;29915:2;29907:6;29903:15;29896:32;29711:224;:::o;29941:181::-;30081:33;30077:1;30069:6;30065:14;30058:57;29941:181;:::o;30128:122::-;30201:24;30219:5;30201:24;:::i;:::-;30194:5;30191:35;30181:63;;30240:1;30237;30230:12;30181:63;30128:122;:::o;30256:::-;30329:24;30347:5;30329:24;:::i;:::-;30322:5;30319:35;30309:63;;30368:1;30365;30358:12;30309:63;30256:122;:::o;30384:120::-;30456:23;30473:5;30456:23;:::i;:::-;30449:5;30446:34;30436:62;;30494:1;30491;30484:12;30436:62;30384:120;:::o;30510:122::-;30583:24;30601:5;30583:24;:::i;:::-;30576:5;30573:35;30563:63;;30622:1;30619;30612:12;30563:63;30510:122;:::o
Swarm Source
ipfs://1d1f667e36335620645079488b1baeda5fa5552db165d835e879b053085ebe3d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.