Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
63 DREAM
Holders
33
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 DREAMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DreamNFT
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.16; import "./ReentrancyGuard.sol"; import "./MerkleProof.sol"; import "./Strings.sol"; import "./Delegated.sol"; import "./ERC721A.sol"; contract DreamNFT is Delegated, ReentrancyGuard, ERC721A { using Strings for uint256; uint256 public immutable maxSupply = 400; uint256 public personalCap = 10; string public baseURI; string public uriSuffix = ".json"; bytes32 public merkleRoot; uint256 public mintPrice = 20000000000000000; uint256 public exclusivePrice = 10000000000000000; uint256 public whitelistSold; bool public isPresaleActive; bool public isPublicSaleActive; address public registry = 0x04C626E451f8977303c340721b764c27d21E65DE; mapping(address => uint256) public whitelistAccountAmounts; event BaseURI(string baseUri); constructor() Delegated() ERC721A("Dream Hollywood", "DREAM") { } function setBaseURI(string calldata _baseUri) external onlyOwner onlyDelegates { baseURI = _baseUri; emit BaseURI(_baseUri); } function _baseURI() internal view override returns (string memory) { return baseURI; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "Token doesn't exist"); return string(abi.encodePacked(baseURI, _tokenId.toString(), uriSuffix)); } function setMerkleRoot(bytes32 root) external onlyOwner { merkleRoot = root; } function setPersonalCap(uint256 _personalCap) public onlyOwner onlyDelegates { personalCap = _personalCap; } function setMintPrice(uint256 _mintPrice) external onlyOwner onlyDelegates { mintPrice = _mintPrice; } function setExclusivePrice(uint256 _exclusivePrice) external onlyOwner onlyDelegates { exclusivePrice = _exclusivePrice; } function setSaleConfig( bool presaleState, bool publicState ) external onlyOwner onlyDelegates{ isPresaleActive = presaleState; isPublicSaleActive = publicState; } function isWhitelisted( address account, bytes32[] memory proof ) public view returns (bool) { return MerkleProof.verify( proof, merkleRoot, keccak256(abi.encodePacked(keccak256(abi.encodePacked(account)))) ); } function mint(uint256 qty) external payable { require(isPublicSaleActive, "public auction not started yet"); require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints"); require(totalSupply() + qty <= maxSupply, "max supply"); require(msg.value == qty * mintPrice, "wrong amount"); _safeMint(_msgSender(), qty); } function exclusiveMint (bytes32[] memory proof, uint256 qty) external payable { require(isWhitelisted(_msgSender(), proof), "not whitelisted"); require(isPresaleActive, "Exclusive Mint not started yet"); require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints"); require(totalSupply() + qty <= maxSupply, "max supply"); require(msg.value == qty * exclusivePrice, "wrong amount"); whitelistSold += qty; whitelistAccountAmounts[_msgSender()] += qty; _safeMint(_msgSender(), qty); } function crossmint(address _to, uint256 qty) public payable nonReentrant { require(isPublicSaleActive, "public auction not started yet"); require(msg.value == qty * mintPrice, "wrong amount"); require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints"); require(totalSupply() + qty <= maxSupply, "max supply"); require(msg.sender == 0xdAb1a1854214684acE522439684a145E62505233, "This function is for Crossmint only." ); _safeMint(_to, qty); } function setFailSafeRegistry(address _registry) external onlyOwner onlyDelegates { registry = _registry; } function withdraw() external onlyOwner onlyDelegates { (bool hs, ) = payable(0x5BbF11F39fBA82783cb1455e93C41Eee01fBdaeC).call{value: address(this).balance *20 / 100}(""); require(hs, "Transfer failed"); (bool success, ) = payable(registry).call{value: address(this).balance}(""); require(success, "transfer failed"); } function airdrop(uint256[] calldata qty, address[] calldata recipients) external payable onlyDelegates{ require(qty.length == recipients.length, "arguments must have equal counts"); uint256 total = 0; for( uint256 i = 0; i < qty.length; ++i ){ total += qty[i]; } require(totalSupply() + total <= maxSupply, "max supply"); for( uint256 i = 0; i < qty.length; ++i ){ _safeMint(recipients[i], qty[i]); } } function rescue( uint256 tokenId, address recipient ) external onlyOwner{ _tokenApprovals[tokenId] = TokenApprovalRef(owner()); address from = ownerOf( tokenId ); transferFrom( from, recipient, tokenId ); } }
// 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.16; import "./Ownable.sol"; contract Delegated is Ownable{ mapping(address => bool) internal _delegates; modifier onlyDelegates { require(_delegates[msg.sender], "Invalid delegate" ); _; } constructor() Ownable(){ setDelegate( owner(), true ); } //onlyOwner function isDelegate( address addr ) external view onlyOwner returns( bool ){ return _delegates[addr]; } function setDelegate( address addr, bool isDelegate_ ) public onlyOwner{ _delegates[addr] = isDelegate_; } function transferOwnership(address newOwner) public virtual override onlyOwner { _delegates[newOwner] = true; super.transferOwnership( newOwner ); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // 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 tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) internal _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @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; } /** * @dev See {IERC165-supportsInterface}. */ 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: 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. } /** * @dev See {IERC721-balanceOf}. */ 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 virtual 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 virtual 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 virtual 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; } /** * 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 ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * 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); } /** * 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); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @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 See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ 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 ''; } /** * @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 See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 (`_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 Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev 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 (to == address(0)) revert MintToZeroAddress(); 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 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _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 Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 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; } /** * @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 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 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. 48 is the ASCII index of '0'. 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 // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of 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 through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 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.7.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // 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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // 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; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseUri","type":"string"}],"name":"BaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"qty","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"crossmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"exclusiveMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"exclusivePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"personalCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_exclusivePrice","type":"uint256"}],"name":"setExclusivePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setFailSafeRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_personalCap","type":"uint256"}],"name":"setPersonalCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleState","type":"bool"},{"internalType":"bool","name":"publicState","type":"bool"}],"name":"setSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAccountAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052610190608090815250600a600b556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200005891906200063e565b5066470de4df820000600f55662386f26fc100006010557304c626e451f8977303c340721b764c27d21e65de601260026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d157600080fd5b506040518060400160405280600f81526020017f447265616d20486f6c6c79776f6f6400000000000000000000000000000000008152506040518060400160405280600581526020017f445245414d0000000000000000000000000000000000000000000000000000008152506200015e62000152620001ca60201b60201c565b620001d260201b60201c565b62000180620001726200029660201b60201c565b6001620002bf60201b60201c565b600160028190555081600590816200019991906200063e565b508060069081620001ab91906200063e565b50620001bc6200032a60201b60201c565b6003819055505050620007a8565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620002cf6200033360201b60201c565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006001905090565b62000343620001ca60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003696200029660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b99062000786565b60405180910390fd5b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044657607f821691505b6020821081036200045c576200045b620003fe565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004c67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000487565b620004d2868362000487565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200051f620005196200051384620004ea565b620004f4565b620004ea565b9050919050565b6000819050919050565b6200053b83620004fe565b620005536200054a8262000526565b84845462000494565b825550505050565b600090565b6200056a6200055b565b6200057781848462000530565b505050565b5b818110156200059f576200059360008262000560565b6001810190506200057d565b5050565b601f821115620005ee57620005b88162000462565b620005c38462000477565b81016020851015620005d3578190505b620005eb620005e28562000477565b8301826200057c565b50505b505050565b600082821c905092915050565b60006200061360001984600802620005f3565b1980831691505092915050565b60006200062e838362000600565b9150826002028217905092915050565b6200064982620003c4565b67ffffffffffffffff811115620006655762000664620003cf565b5b6200067182546200042d565b6200067e828285620005a3565b600060209050601f831160018114620006b65760008415620006a1578287015190505b620006ad858262000620565b8655506200071d565b601f198416620006c68662000462565b60005b82811015620006f057848901518255600182019150602085019450602081019050620006c9565b868310156200071057848901516200070c601f89168262000600565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200076e60208362000725565b91506200077b8262000736565b602082019050919050565b60006020820190508181036000830152620007a1816200075f565b9050919050565b608051614b52620007e0600039600081816116940152818161194501528181611e220152818161235c01526125300152614b526000f3fe6080604052600436106102725760003560e01c806370a082311161014f578063a923625c116100c1578063d5abeb011161007a578063d5abeb0114610918578063e78b9d0b14610943578063e985e9c51461096e578063f2fde38b146109ab578063f4a0a528146109d4578063f760f228146109fd57610272565b8063a923625c14610819578063b88d4fde14610842578063bfb396971461086b578063c24144d814610894578063c7c2aee3146108b0578063c87b56dd146108db57610272565b80638da5cb5b116101135780638da5cb5b1461072a57806391d6fc2814610755578063936762701461077e57806395d89b41146107a9578063a0712d68146107d4578063a22cb465146107f057610272565b806370a0823114610645578063715018a6146106825780637b103999146106995780637cb64759146106c457806385a8c937146106ed57610272565b806342842e0e116101e85780635a23dd99116101ac5780635a23dd991461052e57806360d938dc1461056b5780636352211e146105965780636673c4c2146105d35780636817c76c146105ef5780636c0360eb1461061a57610272565b806342842e0e1461046c5780634a994eef146104955780635503a0e8146104be57806355f804b3146104e957806358891a371461051257610272565b8063095ea7b31161023a578063095ea7b31461038257806318160ddd146103ab5780631e84c413146103d657806323b872dd146104015780632eb4a7ab1461042a5780633ccfd60b1461045557610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c57806308ea29ad14610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613348565b610a26565b6040516102ab9190613390565b60405180910390f35b3480156102c057600080fd5b506102c9610ab8565b6040516102d6919061343b565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906134bb565b610b4a565b6040516103139190613390565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061351e565b610ba8565b604051610350919061355a565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b919061351e565b610c27565b005b34801561038e57600080fd5b506103a960048036038101906103a49190613575565b610cc5565b005b3480156103b757600080fd5b506103c0610e09565b6040516103cd91906135c4565b60405180910390f35b3480156103e257600080fd5b506103eb610e20565b6040516103f89190613390565b60405180910390f35b34801561040d57600080fd5b50610428600480360381019061042391906135df565b610e33565b005b34801561043657600080fd5b5061043f611155565b60405161044c919061364b565b60405180910390f35b34801561046157600080fd5b5061046a61115b565b005b34801561047857600080fd5b50610493600480360381019061048e91906135df565b611399565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613692565b6113b9565b005b3480156104ca57600080fd5b506104d361141c565b6040516104e0919061343b565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613737565b6114aa565b005b61052c60048036038101906105279190613575565b61158d565b005b34801561053a57600080fd5b50610555600480360381019061055091906138ee565b61179f565b6040516105629190613390565b60405180910390f35b34801561057757600080fd5b50610580611802565b60405161058d9190613390565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b8919061351e565b611815565b6040516105ca919061355a565b60405180910390f35b6105ed60048036038101906105e891906139f6565b611827565b005b3480156105fb57600080fd5b50610604611a29565b60405161061191906135c4565b60405180910390f35b34801561062657600080fd5b5061062f611a2f565b60405161063c919061343b565b60405180910390f35b34801561065157600080fd5b5061066c600480360381019061066791906134bb565b611abd565b60405161067991906135c4565b60405180910390f35b34801561068e57600080fd5b50610697611b75565b005b3480156106a557600080fd5b506106ae611b89565b6040516106bb919061355a565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190613a77565b611baf565b005b3480156106f957600080fd5b50610714600480360381019061070f91906134bb565b611bc1565b60405161072191906135c4565b60405180910390f35b34801561073657600080fd5b5061073f611bd9565b60405161074c919061355a565b60405180910390f35b34801561076157600080fd5b5061077c600480360381019061077791906134bb565b611c02565b005b34801561078a57600080fd5b50610793611cda565b6040516107a091906135c4565b60405180910390f35b3480156107b557600080fd5b506107be611ce0565b6040516107cb919061343b565b60405180910390f35b6107ee60048036038101906107e9919061351e565b611d72565b005b3480156107fc57600080fd5b5061081760048036038101906108129190613692565b611ef8565b005b34801561082557600080fd5b50610840600480360381019061083b9190613aa4565b61206f565b005b34801561084e57600080fd5b5061086960048036038101906108649190613b99565b61211d565b005b34801561087757600080fd5b50610892600480360381019061088d9190613c1c565b612190565b005b6108ae60048036038101906108a99190613c5c565b61225c565b005b3480156108bc57600080fd5b506108c56124a9565b6040516108d291906135c4565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd919061351e565b6124af565b60405161090f919061343b565b60405180910390f35b34801561092457600080fd5b5061092d61252e565b60405161093a91906135c4565b60405180910390f35b34801561094f57600080fd5b50610958612552565b60405161096591906135c4565b60405180910390f35b34801561097a57600080fd5b5061099560048036038101906109909190613cb8565b612558565b6040516109a29190613390565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906134bb565b6125ec565b005b3480156109e057600080fd5b506109fb60048036038101906109f6919061351e565b612657565b005b348015610a0957600080fd5b50610a246004803603810190610a1f919061351e565b6126f5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ac790613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054610af390613d27565b8015610b405780601f10610b1557610100808354040283529160200191610b40565b820191906000526020600020905b815481529060010190602001808311610b2357829003601f168201915b5050505050905090565b6000610b54612793565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bb382612811565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c2f612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613da4565b60405180910390fd5b8060108190555050565b6000610cd082611815565b90508073ffffffffffffffffffffffffffffffffffffffff16610cf1612870565b73ffffffffffffffffffffffffffffffffffffffff1614610d5457610d1d81610d18612870565b612558565b610d53576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e13612878565b6004546003540303905090565b601260019054906101000a900460ff1681565b6000610e3e82612881565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eb18461294d565b91509150610ec78187610ec2612870565b612974565b610f1357610edc86610ed7612870565b612558565b610f12576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f79576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8686868660016129b8565b8015610f9157600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061105f8561103b8888876129be565b7c0200000000000000000000000000000000000000000000000000000000176129e6565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110e557600060018501905060006007600083815260200190815260200160002054036110e35760035481146110e2578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461114d8686866001612a11565b505050505050565b600e5481565b611163612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613da4565b60405180910390fd5b6000735bbf11f39fba82783cb1455e93c41eee01fbdaec73ffffffffffffffffffffffffffffffffffffffff16606460144761122b9190613df3565b6112359190613e7c565b60405161124190613ede565b60006040518083038185875af1925050503d806000811461127e576040519150601f19603f3d011682016040523d82523d6000602084013e611283565b606091505b50509050806112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90613f3f565b60405180910390fd5b6000601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161130f90613ede565b60006040518083038185875af1925050503d806000811461134c576040519150601f19603f3d011682016040523d82523d6000602084013e611351565b606091505b5050905080611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613fab565b60405180910390fd5b5050565b6113b48383836040518060200160405280600081525061211d565b505050565b6113c1612793565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600d805461142990613d27565b80601f016020809104026020016040519081016040528092919081815260200182805461145590613d27565b80156114a25780601f10611477576101008083540402835291602001916114a2565b820191906000526020600020905b81548152906001019060200180831161148557829003601f168201915b505050505081565b6114b2612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613da4565b60405180910390fd5b8181600c918261154f929190614182565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72828260405161158192919061427f565b60405180910390a15050565b611595612a17565b601260019054906101000a900460ff166115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906142ef565b60405180910390fd5b600f54816115f29190613df3565b3414611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a9061435b565b60405180910390fd5b600b5481611647611642612a64565b612a6c565b611651919061437b565b1115611692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611689906143fb565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816116bc610e09565b6116c6919061437b565b1115611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614467565b60405180910390fd5b73dab1a1854214684ace522439684a145e6250523373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611789576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611780906144f9565b60405180910390fd5b6117938282612ac3565b61179b612ae1565b5050565b60006117fa82600e54856040516020016117b99190614561565b604051602081830303815290604052805190602001206040516020016117df919061459d565b60405160208183030381529060405280519060200120612aeb565b905092915050565b601260009054906101000a900460ff1681565b600061182082612881565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90613da4565b60405180910390fd5b8181905084849050146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290614604565b60405180910390fd5b6000805b858590508110156119425785858281811061191d5761191c614624565b5b905060200201358261192f919061437b565b91508061193b90614653565b90506118ff565b507f00000000000000000000000000000000000000000000000000000000000000008161196d610e09565b611977919061437b565b11156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90614467565b60405180910390fd5b60005b85859050811015611a2157611a108484838181106119dc576119db614624565b5b90506020020160208101906119f191906134bb565b878784818110611a0457611a03614624565b5b90506020020135612ac3565b80611a1a90614653565b90506119bb565b505050505050565b600f5481565b600c8054611a3c90613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6890613d27565b8015611ab55780601f10611a8a57610100808354040283529160200191611ab5565b820191906000526020600020905b815481529060010190602001808311611a9857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b24576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b7d612793565b611b876000612b02565b565b601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611bb7612793565b80600e8190555050565b60136020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c0a612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d90613da4565b60405180910390fd5b80601260026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b606060068054611cef90613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1b90613d27565b8015611d685780601f10611d3d57610100808354040283529160200191611d68565b820191906000526020600020905b815481529060010190602001808311611d4b57829003601f168201915b5050505050905090565b601260019054906101000a900460ff16611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db8906142ef565b60405180910390fd5b600b5481611dd5611dd0612a64565b612a6c565b611ddf919061437b565b1115611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e17906143fb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611e4a610e09565b611e54919061437b565b1115611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614467565b60405180910390fd5b600f5481611ea39190613df3565b3414611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb9061435b565b60405180910390fd5b611ef5611eef612a64565b82612ac3565b50565b611f00612870565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611f71612870565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661201e612870565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120639190613390565b60405180910390a35050565b612077612793565b604051806020016040528061208a611bd9565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600061210b83611815565b9050612118818385610e33565b505050565b612128848484610e33565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461218a5761215384848484612bc6565b612189576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612198612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b90613da4565b60405180910390fd5b81601260006101000a81548160ff02191690831515021790555080601260016101000a81548160ff0219169083151502179055505050565b61226d612267612a64565b8361179f565b6122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a3906146e7565b60405180910390fd5b601260009054906101000a900460ff166122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290614753565b60405180910390fd5b600b548161230f61230a612a64565b612a6c565b612319919061437b565b111561235a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612351906143fb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081612384610e09565b61238e919061437b565b11156123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690614467565b60405180910390fd5b601054816123dd9190613df3565b341461241e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124159061435b565b60405180910390fd5b8060116000828254612430919061437b565b925050819055508060136000612444612a64565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461248d919061437b565b925050819055506124a561249f612a64565b82612ac3565b5050565b600b5481565b60606124ba82612811565b6124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f0906147bf565b60405180910390fd5b600c61250483612d16565b600d6040516020016125189392919061489e565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60115481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125f4612793565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061265481612de4565b50565b61265f612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290613da4565b60405180910390fd5b80600f8190555050565b6126fd612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278090613da4565b60405180910390fd5b80600b8190555050565b61279b612a64565b73ffffffffffffffffffffffffffffffffffffffff166127b9611bd9565b73ffffffffffffffffffffffffffffffffffffffff161461280f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128069061491b565b60405180910390fd5b565b60008161281c612878565b1115801561282b575060035482105b8015612869575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612890612878565b11612916576003548110156129155760006007600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612913575b600081036129095760076000836001900393508381526020019081526020016000205490506128df565b8092505050612948565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129d5868684612e67565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6002805403612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5290614987565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612add828260405180602001604052806000815250612e70565b5050565b6001600281905550565b600082612af88584612f0e565b1490509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bec612870565b8786866040518563ffffffff1660e01b8152600401612c0e94939291906149fc565b6020604051808303816000875af1925050508015612c4a57506040513d601f19601f82011682018060405250810190612c479190614a5d565b60015b612cc3573d8060008114612c7a576040519150601f19603f3d011682016040523d82523d6000602084013e612c7f565b606091505b506000815103612cbb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001612d2584612f64565b01905060008167ffffffffffffffff811115612d4457612d43613784565b5b6040519080825280601f01601f191660200182016040528015612d765781602001600182028036833780820191505090505b509050600082602001820190505b600115612dd9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612dcd57612dcc613e4d565b5b04945060008503612d84575b819350505050919050565b612dec612793565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614afc565b60405180910390fd5b612e6481612b02565b50565b60009392505050565b612e7a83836130b7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f095760006003549050600083820390505b612ebb6000868380600101945086612bc6565b612ef1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ea8578160035414612f0657600080fd5b50505b505050565b60008082905060005b8451811015612f5957612f4482868381518110612f3757612f36614624565b5b602002602001015161328a565b91508080612f5190614653565b915050612f17565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fc2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612fb857612fb7613e4d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612fff576d04ee2d6d415b85acef81000000008381612ff557612ff4613e4d565b5b0492506020810190505b662386f26fc10000831061302e57662386f26fc10000838161302457613023613e4d565b5b0492506010810190505b6305f5e1008310613057576305f5e100838161304d5761304c613e4d565b5b0492506008810190505b612710831061307c57612710838161307257613071613e4d565b5b0492506004810190505b6064831061309f576064838161309557613094613e4d565b5b0492506002810190505b600a83106130ae576001810190505b80915050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613124576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361315e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61316b60008483856129b8565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131e2836131d360008660006129be565b6131dc856132b5565b176129e6565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613206578060038190555050506132856000848385612a11565b505050565b60008183106132a25761329d82846132c5565b6132ad565b6132ac83836132c5565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613325816132f0565b811461333057600080fd5b50565b6000813590506133428161331c565b92915050565b60006020828403121561335e5761335d6132e6565b5b600061336c84828501613333565b91505092915050565b60008115159050919050565b61338a81613375565b82525050565b60006020820190506133a56000830184613381565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133e55780820151818401526020810190506133ca565b60008484015250505050565b6000601f19601f8301169050919050565b600061340d826133ab565b61341781856133b6565b93506134278185602086016133c7565b613430816133f1565b840191505092915050565b600060208201905081810360008301526134558184613402565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134888261345d565b9050919050565b6134988161347d565b81146134a357600080fd5b50565b6000813590506134b58161348f565b92915050565b6000602082840312156134d1576134d06132e6565b5b60006134df848285016134a6565b91505092915050565b6000819050919050565b6134fb816134e8565b811461350657600080fd5b50565b600081359050613518816134f2565b92915050565b600060208284031215613534576135336132e6565b5b600061354284828501613509565b91505092915050565b6135548161347d565b82525050565b600060208201905061356f600083018461354b565b92915050565b6000806040838503121561358c5761358b6132e6565b5b600061359a858286016134a6565b92505060206135ab85828601613509565b9150509250929050565b6135be816134e8565b82525050565b60006020820190506135d960008301846135b5565b92915050565b6000806000606084860312156135f8576135f76132e6565b5b6000613606868287016134a6565b9350506020613617868287016134a6565b925050604061362886828701613509565b9150509250925092565b6000819050919050565b61364581613632565b82525050565b6000602082019050613660600083018461363c565b92915050565b61366f81613375565b811461367a57600080fd5b50565b60008135905061368c81613666565b92915050565b600080604083850312156136a9576136a86132e6565b5b60006136b7858286016134a6565b92505060206136c88582860161367d565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126136f7576136f66136d2565b5b8235905067ffffffffffffffff811115613714576137136136d7565b5b6020830191508360018202830111156137305761372f6136dc565b5b9250929050565b6000806020838503121561374e5761374d6132e6565b5b600083013567ffffffffffffffff81111561376c5761376b6132eb565b5b613778858286016136e1565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137bc826133f1565b810181811067ffffffffffffffff821117156137db576137da613784565b5b80604052505050565b60006137ee6132dc565b90506137fa82826137b3565b919050565b600067ffffffffffffffff82111561381a57613819613784565b5b602082029050602081019050919050565b61383481613632565b811461383f57600080fd5b50565b6000813590506138518161382b565b92915050565b600061386a613865846137ff565b6137e4565b9050808382526020820190506020840283018581111561388d5761388c6136dc565b5b835b818110156138b657806138a28882613842565b84526020840193505060208101905061388f565b5050509392505050565b600082601f8301126138d5576138d46136d2565b5b81356138e5848260208601613857565b91505092915050565b60008060408385031215613905576139046132e6565b5b6000613913858286016134a6565b925050602083013567ffffffffffffffff811115613934576139336132eb565b5b613940858286016138c0565b9150509250929050565b60008083601f8401126139605761395f6136d2565b5b8235905067ffffffffffffffff81111561397d5761397c6136d7565b5b602083019150836020820283011115613999576139986136dc565b5b9250929050565b60008083601f8401126139b6576139b56136d2565b5b8235905067ffffffffffffffff8111156139d3576139d26136d7565b5b6020830191508360208202830111156139ef576139ee6136dc565b5b9250929050565b60008060008060408587031215613a1057613a0f6132e6565b5b600085013567ffffffffffffffff811115613a2e57613a2d6132eb565b5b613a3a8782880161394a565b9450945050602085013567ffffffffffffffff811115613a5d57613a5c6132eb565b5b613a69878288016139a0565b925092505092959194509250565b600060208284031215613a8d57613a8c6132e6565b5b6000613a9b84828501613842565b91505092915050565b60008060408385031215613abb57613aba6132e6565b5b6000613ac985828601613509565b9250506020613ada858286016134a6565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613b0457613b03613784565b5b613b0d826133f1565b9050602081019050919050565b82818337600083830152505050565b6000613b3c613b3784613ae9565b6137e4565b905082815260208101848484011115613b5857613b57613ae4565b5b613b63848285613b1a565b509392505050565b600082601f830112613b8057613b7f6136d2565b5b8135613b90848260208601613b29565b91505092915050565b60008060008060808587031215613bb357613bb26132e6565b5b6000613bc1878288016134a6565b9450506020613bd2878288016134a6565b9350506040613be387828801613509565b925050606085013567ffffffffffffffff811115613c0457613c036132eb565b5b613c1087828801613b6b565b91505092959194509250565b60008060408385031215613c3357613c326132e6565b5b6000613c418582860161367d565b9250506020613c528582860161367d565b9150509250929050565b60008060408385031215613c7357613c726132e6565b5b600083013567ffffffffffffffff811115613c9157613c906132eb565b5b613c9d858286016138c0565b9250506020613cae85828601613509565b9150509250929050565b60008060408385031215613ccf57613cce6132e6565b5b6000613cdd858286016134a6565b9250506020613cee858286016134a6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d3f57607f821691505b602082108103613d5257613d51613cf8565b5b50919050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b6000613d8e6010836133b6565b9150613d9982613d58565b602082019050919050565b60006020820190508181036000830152613dbd81613d81565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dfe826134e8565b9150613e09836134e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4257613e41613dc4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e87826134e8565b9150613e92836134e8565b925082613ea257613ea1613e4d565b5b828204905092915050565b600081905092915050565b50565b6000613ec8600083613ead565b9150613ed382613eb8565b600082019050919050565b6000613ee982613ebb565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613f29600f836133b6565b9150613f3482613ef3565b602082019050919050565b60006020820190508181036000830152613f5881613f1c565b9050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613f95600f836133b6565b9150613fa082613f5f565b602082019050919050565b60006020820190508181036000830152613fc481613f88565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ffb565b6140428683613ffb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061407f61407a614075846134e8565b61405a565b6134e8565b9050919050565b6000819050919050565b61409983614064565b6140ad6140a582614086565b848454614008565b825550505050565b600090565b6140c26140b5565b6140cd818484614090565b505050565b5b818110156140f1576140e66000826140ba565b6001810190506140d3565b5050565b601f8211156141365761410781613fd6565b61411084613feb565b8101602085101561411f578190505b61413361412b85613feb565b8301826140d2565b50505b505050565b600082821c905092915050565b60006141596000198460080261413b565b1980831691505092915050565b60006141728383614148565b9150826002028217905092915050565b61418c8383613fcb565b67ffffffffffffffff8111156141a5576141a4613784565b5b6141af8254613d27565b6141ba8282856140f5565b6000601f8311600181146141e957600084156141d7578287013590505b6141e18582614166565b865550614249565b601f1984166141f786613fd6565b60005b8281101561421f578489013582556001820191506020850194506020810190506141fa565b8683101561423c5784890135614238601f891682614148565b8355505b6001600288020188555050505b50505050505050565b600061425e83856133b6565b935061426b838584613b1a565b614274836133f1565b840190509392505050565b6000602082019050818103600083015261429a818486614252565b90509392505050565b7f7075626c69632061756374696f6e206e6f742073746172746564207965740000600082015250565b60006142d9601e836133b6565b91506142e4826142a3565b602082019050919050565b60006020820190508181036000830152614308816142cc565b9050919050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000614345600c836133b6565b91506143508261430f565b602082019050919050565b6000602082019050818103600083015261437481614338565b9050919050565b6000614386826134e8565b9150614391836134e8565b92508282019050808211156143a9576143a8613dc4565b5b92915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b60006143e5600e836133b6565b91506143f0826143af565b602082019050919050565b60006020820190508181036000830152614414816143d8565b9050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000614451600a836133b6565b915061445c8261441b565b602082019050919050565b6000602082019050818103600083015261448081614444565b9050919050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e36024836133b6565b91506144ee82614487565b604082019050919050565b60006020820190508181036000830152614512816144d6565b9050919050565b60008160601b9050919050565b600061453182614519565b9050919050565b600061454382614526565b9050919050565b61455b6145568261347d565b614538565b82525050565b600061456d828461454a565b60148201915081905092915050565b6000819050919050565b61459761459282613632565b61457c565b82525050565b60006145a98284614586565b60208201915081905092915050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b60006145ee6020836133b6565b91506145f9826145b8565b602082019050919050565b6000602082019050818103600083015261461d816145e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061465e826134e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146905761468f613dc4565b5b600182019050919050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b60006146d1600f836133b6565b91506146dc8261469b565b602082019050919050565b60006020820190508181036000830152614700816146c4565b9050919050565b7f4578636c7573697665204d696e74206e6f742073746172746564207965740000600082015250565b600061473d601e836133b6565b915061474882614707565b602082019050919050565b6000602082019050818103600083015261476c81614730565b9050919050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b60006147a96013836133b6565b91506147b482614773565b602082019050919050565b600060208201905081810360008301526147d88161479c565b9050919050565b600081905092915050565b600081546147f781613d27565b61480181866147df565b9450600182166000811461481c576001811461483157614864565b60ff1983168652811515820286019350614864565b61483a85613fd6565b60005b8381101561485c5781548189015260018201915060208101905061483d565b838801955050505b50505092915050565b6000614878826133ab565b61488281856147df565b93506148928185602086016133c7565b80840191505092915050565b60006148aa82866147ea565b91506148b6828561486d565b91506148c282846147ea565b9150819050949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149056020836133b6565b9150614910826148cf565b602082019050919050565b60006020820190508181036000830152614934816148f8565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614971601f836133b6565b915061497c8261493b565b602082019050919050565b600060208201905081810360008301526149a081614964565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149ce826149a7565b6149d881856149b2565b93506149e88185602086016133c7565b6149f1816133f1565b840191505092915050565b6000608082019050614a11600083018761354b565b614a1e602083018661354b565b614a2b60408301856135b5565b8181036060830152614a3d81846149c3565b905095945050505050565b600081519050614a578161331c565b92915050565b600060208284031215614a7357614a726132e6565b5b6000614a8184828501614a48565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ae66026836133b6565b9150614af182614a8a565b604082019050919050565b60006020820190508181036000830152614b1581614ad9565b905091905056fea264697066735822122060ff2734b3bbf6e9d9416d2a6458609955f8333132c46746db4944dc6a9528cd64736f6c63430008100033
Deployed Bytecode
0x6080604052600436106102725760003560e01c806370a082311161014f578063a923625c116100c1578063d5abeb011161007a578063d5abeb0114610918578063e78b9d0b14610943578063e985e9c51461096e578063f2fde38b146109ab578063f4a0a528146109d4578063f760f228146109fd57610272565b8063a923625c14610819578063b88d4fde14610842578063bfb396971461086b578063c24144d814610894578063c7c2aee3146108b0578063c87b56dd146108db57610272565b80638da5cb5b116101135780638da5cb5b1461072a57806391d6fc2814610755578063936762701461077e57806395d89b41146107a9578063a0712d68146107d4578063a22cb465146107f057610272565b806370a0823114610645578063715018a6146106825780637b103999146106995780637cb64759146106c457806385a8c937146106ed57610272565b806342842e0e116101e85780635a23dd99116101ac5780635a23dd991461052e57806360d938dc1461056b5780636352211e146105965780636673c4c2146105d35780636817c76c146105ef5780636c0360eb1461061a57610272565b806342842e0e1461046c5780634a994eef146104955780635503a0e8146104be57806355f804b3146104e957806358891a371461051257610272565b8063095ea7b31161023a578063095ea7b31461038257806318160ddd146103ab5780631e84c413146103d657806323b872dd146104015780632eb4a7ab1461042a5780633ccfd60b1461045557610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c57806308ea29ad14610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613348565b610a26565b6040516102ab9190613390565b60405180910390f35b3480156102c057600080fd5b506102c9610ab8565b6040516102d6919061343b565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906134bb565b610b4a565b6040516103139190613390565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061351e565b610ba8565b604051610350919061355a565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b919061351e565b610c27565b005b34801561038e57600080fd5b506103a960048036038101906103a49190613575565b610cc5565b005b3480156103b757600080fd5b506103c0610e09565b6040516103cd91906135c4565b60405180910390f35b3480156103e257600080fd5b506103eb610e20565b6040516103f89190613390565b60405180910390f35b34801561040d57600080fd5b50610428600480360381019061042391906135df565b610e33565b005b34801561043657600080fd5b5061043f611155565b60405161044c919061364b565b60405180910390f35b34801561046157600080fd5b5061046a61115b565b005b34801561047857600080fd5b50610493600480360381019061048e91906135df565b611399565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613692565b6113b9565b005b3480156104ca57600080fd5b506104d361141c565b6040516104e0919061343b565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613737565b6114aa565b005b61052c60048036038101906105279190613575565b61158d565b005b34801561053a57600080fd5b50610555600480360381019061055091906138ee565b61179f565b6040516105629190613390565b60405180910390f35b34801561057757600080fd5b50610580611802565b60405161058d9190613390565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b8919061351e565b611815565b6040516105ca919061355a565b60405180910390f35b6105ed60048036038101906105e891906139f6565b611827565b005b3480156105fb57600080fd5b50610604611a29565b60405161061191906135c4565b60405180910390f35b34801561062657600080fd5b5061062f611a2f565b60405161063c919061343b565b60405180910390f35b34801561065157600080fd5b5061066c600480360381019061066791906134bb565b611abd565b60405161067991906135c4565b60405180910390f35b34801561068e57600080fd5b50610697611b75565b005b3480156106a557600080fd5b506106ae611b89565b6040516106bb919061355a565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190613a77565b611baf565b005b3480156106f957600080fd5b50610714600480360381019061070f91906134bb565b611bc1565b60405161072191906135c4565b60405180910390f35b34801561073657600080fd5b5061073f611bd9565b60405161074c919061355a565b60405180910390f35b34801561076157600080fd5b5061077c600480360381019061077791906134bb565b611c02565b005b34801561078a57600080fd5b50610793611cda565b6040516107a091906135c4565b60405180910390f35b3480156107b557600080fd5b506107be611ce0565b6040516107cb919061343b565b60405180910390f35b6107ee60048036038101906107e9919061351e565b611d72565b005b3480156107fc57600080fd5b5061081760048036038101906108129190613692565b611ef8565b005b34801561082557600080fd5b50610840600480360381019061083b9190613aa4565b61206f565b005b34801561084e57600080fd5b5061086960048036038101906108649190613b99565b61211d565b005b34801561087757600080fd5b50610892600480360381019061088d9190613c1c565b612190565b005b6108ae60048036038101906108a99190613c5c565b61225c565b005b3480156108bc57600080fd5b506108c56124a9565b6040516108d291906135c4565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd919061351e565b6124af565b60405161090f919061343b565b60405180910390f35b34801561092457600080fd5b5061092d61252e565b60405161093a91906135c4565b60405180910390f35b34801561094f57600080fd5b50610958612552565b60405161096591906135c4565b60405180910390f35b34801561097a57600080fd5b5061099560048036038101906109909190613cb8565b612558565b6040516109a29190613390565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906134bb565b6125ec565b005b3480156109e057600080fd5b506109fb60048036038101906109f6919061351e565b612657565b005b348015610a0957600080fd5b50610a246004803603810190610a1f919061351e565b6126f5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ac790613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054610af390613d27565b8015610b405780601f10610b1557610100808354040283529160200191610b40565b820191906000526020600020905b815481529060010190602001808311610b2357829003601f168201915b5050505050905090565b6000610b54612793565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bb382612811565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c2f612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613da4565b60405180910390fd5b8060108190555050565b6000610cd082611815565b90508073ffffffffffffffffffffffffffffffffffffffff16610cf1612870565b73ffffffffffffffffffffffffffffffffffffffff1614610d5457610d1d81610d18612870565b612558565b610d53576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e13612878565b6004546003540303905090565b601260019054906101000a900460ff1681565b6000610e3e82612881565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eb18461294d565b91509150610ec78187610ec2612870565b612974565b610f1357610edc86610ed7612870565b612558565b610f12576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f79576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8686868660016129b8565b8015610f9157600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061105f8561103b8888876129be565b7c0200000000000000000000000000000000000000000000000000000000176129e6565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110e557600060018501905060006007600083815260200190815260200160002054036110e35760035481146110e2578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461114d8686866001612a11565b505050505050565b600e5481565b611163612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613da4565b60405180910390fd5b6000735bbf11f39fba82783cb1455e93c41eee01fbdaec73ffffffffffffffffffffffffffffffffffffffff16606460144761122b9190613df3565b6112359190613e7c565b60405161124190613ede565b60006040518083038185875af1925050503d806000811461127e576040519150601f19603f3d011682016040523d82523d6000602084013e611283565b606091505b50509050806112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90613f3f565b60405180910390fd5b6000601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161130f90613ede565b60006040518083038185875af1925050503d806000811461134c576040519150601f19603f3d011682016040523d82523d6000602084013e611351565b606091505b5050905080611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613fab565b60405180910390fd5b5050565b6113b48383836040518060200160405280600081525061211d565b505050565b6113c1612793565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600d805461142990613d27565b80601f016020809104026020016040519081016040528092919081815260200182805461145590613d27565b80156114a25780601f10611477576101008083540402835291602001916114a2565b820191906000526020600020905b81548152906001019060200180831161148557829003601f168201915b505050505081565b6114b2612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613da4565b60405180910390fd5b8181600c918261154f929190614182565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72828260405161158192919061427f565b60405180910390a15050565b611595612a17565b601260019054906101000a900460ff166115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906142ef565b60405180910390fd5b600f54816115f29190613df3565b3414611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a9061435b565b60405180910390fd5b600b5481611647611642612a64565b612a6c565b611651919061437b565b1115611692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611689906143fb565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000190816116bc610e09565b6116c6919061437b565b1115611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614467565b60405180910390fd5b73dab1a1854214684ace522439684a145e6250523373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611789576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611780906144f9565b60405180910390fd5b6117938282612ac3565b61179b612ae1565b5050565b60006117fa82600e54856040516020016117b99190614561565b604051602081830303815290604052805190602001206040516020016117df919061459d565b60405160208183030381529060405280519060200120612aeb565b905092915050565b601260009054906101000a900460ff1681565b600061182082612881565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90613da4565b60405180910390fd5b8181905084849050146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290614604565b60405180910390fd5b6000805b858590508110156119425785858281811061191d5761191c614624565b5b905060200201358261192f919061437b565b91508061193b90614653565b90506118ff565b507f00000000000000000000000000000000000000000000000000000000000001908161196d610e09565b611977919061437b565b11156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90614467565b60405180910390fd5b60005b85859050811015611a2157611a108484838181106119dc576119db614624565b5b90506020020160208101906119f191906134bb565b878784818110611a0457611a03614624565b5b90506020020135612ac3565b80611a1a90614653565b90506119bb565b505050505050565b600f5481565b600c8054611a3c90613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6890613d27565b8015611ab55780601f10611a8a57610100808354040283529160200191611ab5565b820191906000526020600020905b815481529060010190602001808311611a9857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b24576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b7d612793565b611b876000612b02565b565b601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611bb7612793565b80600e8190555050565b60136020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c0a612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d90613da4565b60405180910390fd5b80601260026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b606060068054611cef90613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1b90613d27565b8015611d685780601f10611d3d57610100808354040283529160200191611d68565b820191906000526020600020905b815481529060010190602001808311611d4b57829003601f168201915b5050505050905090565b601260019054906101000a900460ff16611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db8906142ef565b60405180910390fd5b600b5481611dd5611dd0612a64565b612a6c565b611ddf919061437b565b1115611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e17906143fb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000019081611e4a610e09565b611e54919061437b565b1115611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614467565b60405180910390fd5b600f5481611ea39190613df3565b3414611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb9061435b565b60405180910390fd5b611ef5611eef612a64565b82612ac3565b50565b611f00612870565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611f71612870565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661201e612870565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120639190613390565b60405180910390a35050565b612077612793565b604051806020016040528061208a611bd9565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600061210b83611815565b9050612118818385610e33565b505050565b612128848484610e33565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461218a5761215384848484612bc6565b612189576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612198612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b90613da4565b60405180910390fd5b81601260006101000a81548160ff02191690831515021790555080601260016101000a81548160ff0219169083151502179055505050565b61226d612267612a64565b8361179f565b6122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a3906146e7565b60405180910390fd5b601260009054906101000a900460ff166122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290614753565b60405180910390fd5b600b548161230f61230a612a64565b612a6c565b612319919061437b565b111561235a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612351906143fb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000019081612384610e09565b61238e919061437b565b11156123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690614467565b60405180910390fd5b601054816123dd9190613df3565b341461241e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124159061435b565b60405180910390fd5b8060116000828254612430919061437b565b925050819055508060136000612444612a64565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461248d919061437b565b925050819055506124a561249f612a64565b82612ac3565b5050565b600b5481565b60606124ba82612811565b6124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f0906147bf565b60405180910390fd5b600c61250483612d16565b600d6040516020016125189392919061489e565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000019081565b60115481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125f4612793565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061265481612de4565b50565b61265f612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290613da4565b60405180910390fd5b80600f8190555050565b6126fd612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278090613da4565b60405180910390fd5b80600b8190555050565b61279b612a64565b73ffffffffffffffffffffffffffffffffffffffff166127b9611bd9565b73ffffffffffffffffffffffffffffffffffffffff161461280f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128069061491b565b60405180910390fd5b565b60008161281c612878565b1115801561282b575060035482105b8015612869575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612890612878565b11612916576003548110156129155760006007600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612913575b600081036129095760076000836001900393508381526020019081526020016000205490506128df565b8092505050612948565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129d5868684612e67565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6002805403612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5290614987565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612add828260405180602001604052806000815250612e70565b5050565b6001600281905550565b600082612af88584612f0e565b1490509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bec612870565b8786866040518563ffffffff1660e01b8152600401612c0e94939291906149fc565b6020604051808303816000875af1925050508015612c4a57506040513d601f19601f82011682018060405250810190612c479190614a5d565b60015b612cc3573d8060008114612c7a576040519150601f19603f3d011682016040523d82523d6000602084013e612c7f565b606091505b506000815103612cbb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001612d2584612f64565b01905060008167ffffffffffffffff811115612d4457612d43613784565b5b6040519080825280601f01601f191660200182016040528015612d765781602001600182028036833780820191505090505b509050600082602001820190505b600115612dd9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612dcd57612dcc613e4d565b5b04945060008503612d84575b819350505050919050565b612dec612793565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614afc565b60405180910390fd5b612e6481612b02565b50565b60009392505050565b612e7a83836130b7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f095760006003549050600083820390505b612ebb6000868380600101945086612bc6565b612ef1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ea8578160035414612f0657600080fd5b50505b505050565b60008082905060005b8451811015612f5957612f4482868381518110612f3757612f36614624565b5b602002602001015161328a565b91508080612f5190614653565b915050612f17565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fc2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612fb857612fb7613e4d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612fff576d04ee2d6d415b85acef81000000008381612ff557612ff4613e4d565b5b0492506020810190505b662386f26fc10000831061302e57662386f26fc10000838161302457613023613e4d565b5b0492506010810190505b6305f5e1008310613057576305f5e100838161304d5761304c613e4d565b5b0492506008810190505b612710831061307c57612710838161307257613071613e4d565b5b0492506004810190505b6064831061309f576064838161309557613094613e4d565b5b0492506002810190505b600a83106130ae576001810190505b80915050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613124576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361315e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61316b60008483856129b8565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131e2836131d360008660006129be565b6131dc856132b5565b176129e6565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613206578060038190555050506132856000848385612a11565b505050565b60008183106132a25761329d82846132c5565b6132ad565b6132ac83836132c5565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613325816132f0565b811461333057600080fd5b50565b6000813590506133428161331c565b92915050565b60006020828403121561335e5761335d6132e6565b5b600061336c84828501613333565b91505092915050565b60008115159050919050565b61338a81613375565b82525050565b60006020820190506133a56000830184613381565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133e55780820151818401526020810190506133ca565b60008484015250505050565b6000601f19601f8301169050919050565b600061340d826133ab565b61341781856133b6565b93506134278185602086016133c7565b613430816133f1565b840191505092915050565b600060208201905081810360008301526134558184613402565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134888261345d565b9050919050565b6134988161347d565b81146134a357600080fd5b50565b6000813590506134b58161348f565b92915050565b6000602082840312156134d1576134d06132e6565b5b60006134df848285016134a6565b91505092915050565b6000819050919050565b6134fb816134e8565b811461350657600080fd5b50565b600081359050613518816134f2565b92915050565b600060208284031215613534576135336132e6565b5b600061354284828501613509565b91505092915050565b6135548161347d565b82525050565b600060208201905061356f600083018461354b565b92915050565b6000806040838503121561358c5761358b6132e6565b5b600061359a858286016134a6565b92505060206135ab85828601613509565b9150509250929050565b6135be816134e8565b82525050565b60006020820190506135d960008301846135b5565b92915050565b6000806000606084860312156135f8576135f76132e6565b5b6000613606868287016134a6565b9350506020613617868287016134a6565b925050604061362886828701613509565b9150509250925092565b6000819050919050565b61364581613632565b82525050565b6000602082019050613660600083018461363c565b92915050565b61366f81613375565b811461367a57600080fd5b50565b60008135905061368c81613666565b92915050565b600080604083850312156136a9576136a86132e6565b5b60006136b7858286016134a6565b92505060206136c88582860161367d565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126136f7576136f66136d2565b5b8235905067ffffffffffffffff811115613714576137136136d7565b5b6020830191508360018202830111156137305761372f6136dc565b5b9250929050565b6000806020838503121561374e5761374d6132e6565b5b600083013567ffffffffffffffff81111561376c5761376b6132eb565b5b613778858286016136e1565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137bc826133f1565b810181811067ffffffffffffffff821117156137db576137da613784565b5b80604052505050565b60006137ee6132dc565b90506137fa82826137b3565b919050565b600067ffffffffffffffff82111561381a57613819613784565b5b602082029050602081019050919050565b61383481613632565b811461383f57600080fd5b50565b6000813590506138518161382b565b92915050565b600061386a613865846137ff565b6137e4565b9050808382526020820190506020840283018581111561388d5761388c6136dc565b5b835b818110156138b657806138a28882613842565b84526020840193505060208101905061388f565b5050509392505050565b600082601f8301126138d5576138d46136d2565b5b81356138e5848260208601613857565b91505092915050565b60008060408385031215613905576139046132e6565b5b6000613913858286016134a6565b925050602083013567ffffffffffffffff811115613934576139336132eb565b5b613940858286016138c0565b9150509250929050565b60008083601f8401126139605761395f6136d2565b5b8235905067ffffffffffffffff81111561397d5761397c6136d7565b5b602083019150836020820283011115613999576139986136dc565b5b9250929050565b60008083601f8401126139b6576139b56136d2565b5b8235905067ffffffffffffffff8111156139d3576139d26136d7565b5b6020830191508360208202830111156139ef576139ee6136dc565b5b9250929050565b60008060008060408587031215613a1057613a0f6132e6565b5b600085013567ffffffffffffffff811115613a2e57613a2d6132eb565b5b613a3a8782880161394a565b9450945050602085013567ffffffffffffffff811115613a5d57613a5c6132eb565b5b613a69878288016139a0565b925092505092959194509250565b600060208284031215613a8d57613a8c6132e6565b5b6000613a9b84828501613842565b91505092915050565b60008060408385031215613abb57613aba6132e6565b5b6000613ac985828601613509565b9250506020613ada858286016134a6565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613b0457613b03613784565b5b613b0d826133f1565b9050602081019050919050565b82818337600083830152505050565b6000613b3c613b3784613ae9565b6137e4565b905082815260208101848484011115613b5857613b57613ae4565b5b613b63848285613b1a565b509392505050565b600082601f830112613b8057613b7f6136d2565b5b8135613b90848260208601613b29565b91505092915050565b60008060008060808587031215613bb357613bb26132e6565b5b6000613bc1878288016134a6565b9450506020613bd2878288016134a6565b9350506040613be387828801613509565b925050606085013567ffffffffffffffff811115613c0457613c036132eb565b5b613c1087828801613b6b565b91505092959194509250565b60008060408385031215613c3357613c326132e6565b5b6000613c418582860161367d565b9250506020613c528582860161367d565b9150509250929050565b60008060408385031215613c7357613c726132e6565b5b600083013567ffffffffffffffff811115613c9157613c906132eb565b5b613c9d858286016138c0565b9250506020613cae85828601613509565b9150509250929050565b60008060408385031215613ccf57613cce6132e6565b5b6000613cdd858286016134a6565b9250506020613cee858286016134a6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d3f57607f821691505b602082108103613d5257613d51613cf8565b5b50919050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b6000613d8e6010836133b6565b9150613d9982613d58565b602082019050919050565b60006020820190508181036000830152613dbd81613d81565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dfe826134e8565b9150613e09836134e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4257613e41613dc4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e87826134e8565b9150613e92836134e8565b925082613ea257613ea1613e4d565b5b828204905092915050565b600081905092915050565b50565b6000613ec8600083613ead565b9150613ed382613eb8565b600082019050919050565b6000613ee982613ebb565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613f29600f836133b6565b9150613f3482613ef3565b602082019050919050565b60006020820190508181036000830152613f5881613f1c565b9050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613f95600f836133b6565b9150613fa082613f5f565b602082019050919050565b60006020820190508181036000830152613fc481613f88565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ffb565b6140428683613ffb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061407f61407a614075846134e8565b61405a565b6134e8565b9050919050565b6000819050919050565b61409983614064565b6140ad6140a582614086565b848454614008565b825550505050565b600090565b6140c26140b5565b6140cd818484614090565b505050565b5b818110156140f1576140e66000826140ba565b6001810190506140d3565b5050565b601f8211156141365761410781613fd6565b61411084613feb565b8101602085101561411f578190505b61413361412b85613feb565b8301826140d2565b50505b505050565b600082821c905092915050565b60006141596000198460080261413b565b1980831691505092915050565b60006141728383614148565b9150826002028217905092915050565b61418c8383613fcb565b67ffffffffffffffff8111156141a5576141a4613784565b5b6141af8254613d27565b6141ba8282856140f5565b6000601f8311600181146141e957600084156141d7578287013590505b6141e18582614166565b865550614249565b601f1984166141f786613fd6565b60005b8281101561421f578489013582556001820191506020850194506020810190506141fa565b8683101561423c5784890135614238601f891682614148565b8355505b6001600288020188555050505b50505050505050565b600061425e83856133b6565b935061426b838584613b1a565b614274836133f1565b840190509392505050565b6000602082019050818103600083015261429a818486614252565b90509392505050565b7f7075626c69632061756374696f6e206e6f742073746172746564207965740000600082015250565b60006142d9601e836133b6565b91506142e4826142a3565b602082019050919050565b60006020820190508181036000830152614308816142cc565b9050919050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000614345600c836133b6565b91506143508261430f565b602082019050919050565b6000602082019050818103600083015261437481614338565b9050919050565b6000614386826134e8565b9150614391836134e8565b92508282019050808211156143a9576143a8613dc4565b5b92915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b60006143e5600e836133b6565b91506143f0826143af565b602082019050919050565b60006020820190508181036000830152614414816143d8565b9050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000614451600a836133b6565b915061445c8261441b565b602082019050919050565b6000602082019050818103600083015261448081614444565b9050919050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e36024836133b6565b91506144ee82614487565b604082019050919050565b60006020820190508181036000830152614512816144d6565b9050919050565b60008160601b9050919050565b600061453182614519565b9050919050565b600061454382614526565b9050919050565b61455b6145568261347d565b614538565b82525050565b600061456d828461454a565b60148201915081905092915050565b6000819050919050565b61459761459282613632565b61457c565b82525050565b60006145a98284614586565b60208201915081905092915050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b60006145ee6020836133b6565b91506145f9826145b8565b602082019050919050565b6000602082019050818103600083015261461d816145e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061465e826134e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146905761468f613dc4565b5b600182019050919050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b60006146d1600f836133b6565b91506146dc8261469b565b602082019050919050565b60006020820190508181036000830152614700816146c4565b9050919050565b7f4578636c7573697665204d696e74206e6f742073746172746564207965740000600082015250565b600061473d601e836133b6565b915061474882614707565b602082019050919050565b6000602082019050818103600083015261476c81614730565b9050919050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b60006147a96013836133b6565b91506147b482614773565b602082019050919050565b600060208201905081810360008301526147d88161479c565b9050919050565b600081905092915050565b600081546147f781613d27565b61480181866147df565b9450600182166000811461481c576001811461483157614864565b60ff1983168652811515820286019350614864565b61483a85613fd6565b60005b8381101561485c5781548189015260018201915060208101905061483d565b838801955050505b50505092915050565b6000614878826133ab565b61488281856147df565b93506148928185602086016133c7565b80840191505092915050565b60006148aa82866147ea565b91506148b6828561486d565b91506148c282846147ea565b9150819050949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149056020836133b6565b9150614910826148cf565b602082019050919050565b60006020820190508181036000830152614934816148f8565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614971601f836133b6565b915061497c8261493b565b602082019050919050565b600060208201905081810360008301526149a081614964565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149ce826149a7565b6149d881856149b2565b93506149e88185602086016133c7565b6149f1816133f1565b840191505092915050565b6000608082019050614a11600083018761354b565b614a1e602083018661354b565b614a2b60408301856135b5565b8181036060830152614a3d81846149c3565b905095945050505050565b600081519050614a578161331c565b92915050565b600060208284031215614a7357614a726132e6565b5b6000614a8184828501614a48565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ae66026836133b6565b9150614af182614a8a565b604082019050919050565b60006020820190508181036000830152614b1581614ad9565b905091905056fea264697066735822122060ff2734b3bbf6e9d9416d2a6458609955f8333132c46746db4944dc6a9528cd64736f6c63430008100033
Deployed Bytecode Sourcemap
207:4780:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5970:615:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11689:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;366:111:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13649:218:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1781:130:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13183:400:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5000:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;644:30:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22788:2800:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;446:25:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3938:343;;;;;;;;;;;;;:::i;:::-;;14553:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;483:114:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;408:33:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;945:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3306:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2101:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;612:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11470:152:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4289:457:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;476:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;382:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6649:232:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:7;;;;;;;;;;;;;:::i;:::-;;679:68:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1442:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;758:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1236:87:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3816:114:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;525:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11858:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2381:363:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13939:308:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4756:226:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14809:399:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1917:176:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2752:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;346:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1196:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;301:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;579:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14318:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;603:161:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1661:110:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1537:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5970:615:3;6055:4;6370:10;6355:25;;:11;:25;;;;:102;;;;6447:10;6432:25;;:11;:25;;;;6355:102;:179;;;;6524:10;6509:25;;:11;:25;;;;6355:179;6335:199;;5970:615;;;:::o;11689:100::-;11743:13;11776:5;11769:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11689:100;:::o;366:111:1:-;435:4;1122:13:7;:11;:13::i;:::-;455:10:1::1;:16;466:4;455:16;;;;;;;;;;;;;;;;;;;;;;;;;448:23;;366:111:::0;;;:::o;13649:218:3:-;13725:7;13750:16;13758:7;13750;:16::i;:::-;13745:64;;13775:34;;;;;;;;;;;;;;13745:64;13829:15;:24;13845:7;13829:24;;;;;;;;;;;:30;;;;;;;;;;;;13822:37;;13649:218;;;:::o;1781:130:2:-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1890:15:2::2;1873:14;:32;;;;1781:130:::0;:::o;13183:400:3:-;13264:13;13280:16;13288:7;13280;:16::i;:::-;13264:32;;13336:5;13313:28;;:19;:17;:19::i;:::-;:28;;;13309:175;;13361:44;13378:5;13385:19;:17;:19::i;:::-;13361:16;:44::i;:::-;13356:128;;13433:35;;;;;;;;;;;;;;13356:128;13309:175;13529:2;13496:15;:24;13512:7;13496:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13567:7;13563:2;13547:28;;13556:5;13547:28;;;;;;;;;;;;13253:330;13183:400;;:::o;5000:323::-;5061:7;5289:15;:13;:15::i;:::-;5274:12;;5258:13;;:28;:46;5251:53;;5000:323;:::o;644:30:2:-;;;;;;;;;;;;;:::o;22788:2800:3:-;22922:27;22952;22971:7;22952:18;:27::i;:::-;22922:57;;23037:4;22996:45;;23012:19;22996:45;;;22992:86;;23050:28;;;;;;;;;;;;;;22992:86;23092:27;23121:23;23148:28;23168:7;23148:19;:28::i;:::-;23091:85;;;;23276:62;23295:15;23312:4;23318:19;:17;:19::i;:::-;23276:18;:62::i;:::-;23271:174;;23358:43;23375:4;23381:19;:17;:19::i;:::-;23358:16;:43::i;:::-;23353:92;;23410:35;;;;;;;;;;;;;;23353:92;23271:174;23476:1;23462:16;;:2;:16;;;23458:52;;23487:23;;;;;;;;;;;;;;23458:52;23523:43;23545:4;23551:2;23555:7;23564:1;23523:21;:43::i;:::-;23659:15;23656:160;;;23799:1;23778:19;23771:30;23656:160;24194:18;:24;24213:4;24194:24;;;;;;;;;;;;;;;;24192:26;;;;;;;;;;;;24263:18;:22;24282:2;24263:22;;;;;;;;;;;;;;;;24261:24;;;;;;;;;;;24585:145;24622:2;24670:45;24685:4;24691:2;24695:19;24670:14;:45::i;:::-;2210:8;24643:72;24585:18;:145::i;:::-;24556:17;:26;24574:7;24556:26;;;;;;;;;;;:174;;;;24900:1;2210:8;24850:19;:46;:51;24846:626;;24922:19;24954:1;24944:7;:11;24922:33;;25111:1;25077:17;:30;25095:11;25077:30;;;;;;;;;;;;:35;25073:384;;25215:13;;25200:11;:28;25196:242;;25395:19;25362:17;:30;25380:11;25362:30;;;;;;;;;;;:52;;;;25196:242;25073:384;24903:569;24846:626;25519:7;25515:2;25500:27;;25509:4;25500:27;;;;;;;;;;;;25538:42;25559:4;25565:2;25569:7;25578:1;25538:20;:42::i;:::-;22911:2677;;;22788:2800;;;:::o;446:25:2:-;;;;:::o;3938:343::-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3999:7:2::2;4020:42;4012:56;;4104:3;4099:2;4076:21;:25;;;;:::i;:::-;:31;;;;:::i;:::-;4012:100;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3998:114;;;4127:2;4119:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;4159:12;4185:8;;;;;;;;;;;4177:22;;4207:21;4177:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4158:75;;;4248:7;4240:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;3991:290;;3938:343::o:0;14553:185:3:-;14691:39;14708:4;14714:2;14718:7;14691:39;;;;;;;;;;;;:16;:39::i;:::-;14553:185;;;:::o;483:114:1:-;1122:13:7;:11;:13::i;:::-;580:11:1::1;561:10;:16;572:4;561:16;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;483:114:::0;;:::o;408:33:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;945:139::-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1041:8:2::2;;1031:7;:18;;;;;;;:::i;:::-;;1061:17;1069:8;;1061:17;;;;;;;:::i;:::-;;;;;;;;945:139:::0;;:::o;3306:502::-;2296:21:8;:19;:21::i;:::-;3394:18:2::1;;;;;;;;;;;3386:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3481:9;;3475:3;:15;;;;:::i;:::-;3462:9;:28;3454:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3559:11;;3552:3;3522:27;3536:12;:10;:12::i;:::-;3522:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;3514:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3627:9;3620:3;3604:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;3596:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3680:42;3666:56;;:10;:56;;;3658:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;3783:19;3793:3;3798;3783:9;:19::i;:::-;2340:20:8::0;:18;:20::i;:::-;3306:502:2;;:::o;2101:273::-;2201:4;2228:140;2257:5;2273:10;;2348:7;2331:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;2321:36;;;;;;2304:54;;;;;;;;:::i;:::-;;;;;;;;;;;;;2294:65;;;;;;2228:18;:140::i;:::-;2214:154;;2101:273;;;;:::o;612:27::-;;;;;;;;;;;;;:::o;11470:152:3:-;11542:7;11585:27;11604:7;11585:18;:27::i;:::-;11562:52;;11470:152;;;:::o;4289:457:2:-;212:10:1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4420:10:2::1;;:17;;4406:3;;:10;;:31;4398:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4482:13;4511:9:::0;4506:73:::1;4530:3;;:10;;4526:1;:14;4506:73;;;4565:3;;4569:1;4565:6;;;;;;;:::i;:::-;;;;;;;;4556:15;;;;;:::i;:::-;;;4542:3;;;;:::i;:::-;;;4506:73;;;;4618:9;4609:5;4593:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;4585:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4654:9;4649:92;4673:3;;:10;;4669:1;:14;4649:92;;;4699:32;4709:10;;4720:1;4709:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4724:3;;4728:1;4724:6;;;;;;;:::i;:::-;;;;;;;;4699:9;:32::i;:::-;4685:3;;;;:::i;:::-;;;4649:92;;;;4391:355;4289:457:::0;;;;:::o;476:44::-;;;;:::o;382:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6649:232:3:-;6721:7;6762:1;6745:19;;:5;:19;;;6741:60;;6773:28;;;;;;;;;;;;;;6741:60;1162:13;6819:18;:25;6838:5;6819:25;;;;;;;;;;;;;;;;:54;6812:61;;6649:232;;;:::o;1884:103:7:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;679:68:2:-;;;;;;;;;;;;;:::o;1442:86::-;1122:13:7;:11;:13::i;:::-;1518:4:2::1;1505:10;:17;;;;1442:86:::0;:::o;758:58::-;;;;;;;;;;;;;;;;;:::o;1236:87:7:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;3816:114:2:-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3915:9:2::2;3904:8;;:20;;;;;;;;;;;;;;;;;;3816:114:::0;:::o;525:49::-;;;;:::o;11858:104:3:-;11914:13;11947:7;11940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11858:104;:::o;2381:363:2:-;2440:18;;;;;;;;;;;2432:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;2545:11;;2538:3;2508:27;2522:12;:10;:12::i;:::-;2508:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;2500:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2613:9;2606:3;2590:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;2582:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2671:9;;2665:3;:15;;;;:::i;:::-;2652:9;:28;2644:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2710:28;2720:12;:10;:12::i;:::-;2734:3;2710:9;:28::i;:::-;2381:363;:::o;13939:308:3:-;14050:19;:17;:19::i;:::-;14038:31;;:8;:31;;;14034:61;;14078:17;;;;;;;;;;;;;;14034:61;14160:8;14108:18;:39;14127:19;:17;:19::i;:::-;14108:39;;;;;;;;;;;;;;;:49;14148:8;14108:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;14220:8;14184:55;;14199:19;:17;:19::i;:::-;14184:55;;;14230:8;14184:55;;;;;;:::i;:::-;;;;;;;;13939:308;;:::o;4756:226:2:-;1122:13:7;:11;:13::i;:::-;4862:25:2::1;;;;;;;;4879:7;:5;:7::i;:::-;4862:25;;;;::::0;4835:15:::1;:24;4851:7;4835:24;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4894:12;4909:18;4918:7;4909;:18::i;:::-;4894:33;;4934:40;4948:4;4954:9;4965:7;4934:12;:40::i;:::-;4828:154;4756:226:::0;;:::o;14809:399:3:-;14976:31;14989:4;14995:2;14999:7;14976:12;:31::i;:::-;15040:1;15022:2;:14;;;:19;15018:183;;15061:56;15092:4;15098:2;15102:7;15111:5;15061:30;:56::i;:::-;15056:145;;15145:40;;;;;;;;;;;;;;15056:145;15018:183;14809:399;;;;:::o;1917:176:2:-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;2036:12:2::2;2018:15;;:30;;;;;;;;;;;;;;;;;;2076:11;2055:18;;:32;;;;;;;;;;;;;;;;;;1917:176:::0;;:::o;2752:546::-;2845:34;2859:12;:10;:12::i;:::-;2873:5;2845:13;:34::i;:::-;2837:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2914:15;;;;;;;;;;;2906:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3016:11;;3009:3;2979:27;2993:12;:10;:12::i;:::-;2979:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;2971:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3084:9;3077:3;3061:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;3053:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3142:14;;3136:3;:20;;;;:::i;:::-;3123:9;:33;3115:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3201:3;3184:13;;:20;;;;;;;:::i;:::-;;;;;;;;3252:3;3211:23;:37;3235:12;:10;:12::i;:::-;3211:37;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;3262:28;3272:12;:10;:12::i;:::-;3286:3;3262:9;:28::i;:::-;2752:546;;:::o;346:31::-;;;;:::o;1196:238::-;1270:13;1304:17;1312:8;1304:7;:17::i;:::-;1296:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1387:7;1396:19;:8;:17;:19::i;:::-;1417:9;1370:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1356:72;;1196:238;;;:::o;301:40::-;;;:::o;579:28::-;;;;:::o;14318:164:3:-;14415:4;14439:18;:25;14458:5;14439:25;;;;;;;;;;;;;;;:35;14465:8;14439:35;;;;;;;;;;;;;;;;;;;;;;;;;14432:42;;14318:164;;;;:::o;603:161:1:-;1122:13:7;:11;:13::i;:::-;712:4:1::1;689:10:::0;:20:::1;700:8;689:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;723:35;748:8;723:23;:35::i;:::-;603:161:::0;:::o;1661:110:2:-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1755:10:2::2;1743:9;:22;;;;1661:110:::0;:::o;1537:116::-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1635:12:2::2;1621:11;:26;;;;1537:116:::0;:::o;1401:132:7:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;15463:281:3:-;15528:4;15584:7;15565:15;:13;:15::i;:::-;:26;;:66;;;;;15618:13;;15608:7;:23;15565:66;:152;;;;;15716:1;1932:8;15669:17;:26;15687:7;15669:26;;;;;;;;;;;;:43;:48;15565:152;15545:172;;15463:281;;;:::o;33892:105::-;33952:7;33979:10;33972:17;;33892:105;:::o;4516:92::-;4572:7;4599:1;4592:8;;4516:92;:::o;8363:1129::-;8430:7;8450:12;8465:7;8450:22;;8533:4;8514:15;:13;:15::i;:::-;:23;8510:915;;8567:13;;8560:4;:20;8556:869;;;8605:14;8622:17;:23;8640:4;8622:23;;;;;;;;;;;;8605:40;;8738:1;1932:8;8711:6;:23;:28;8707:699;;9230:113;9247:1;9237:6;:11;9230:113;;9290:17;:25;9308:6;;;;;;;9290:25;;;;;;;;;;;;9281:34;;9230:113;;;9376:6;9369:13;;;;;;8707:699;8582:843;8556:869;8510:915;9453:31;;;;;;;;;;;;;;8363:1129;;;;:::o;21304:472::-;21399:27;21428:23;21469:38;21510:15;:24;21526:7;21510:24;;;;;;;;;;;21469:65;;21681:18;21658:41;;21738:19;21732:26;21713:45;;21643:126;21304:472;;;:::o;21889:645::-;22031:11;22193:15;22187:4;22183:26;22175:34;;22352:15;22341:9;22337:31;22324:44;;22499:15;22488:9;22485:30;22478:4;22467:9;22464:19;22461:55;22451:65;;21889:645;;;;;:::o;32725:159::-;;;;;:::o;31037:309::-;31172:7;31192:16;2333:3;31218:19;:40;;31192:67;;2333:3;31285:31;31296:4;31302:2;31306:9;31285:10;:31::i;:::-;31277:40;;:61;;31270:68;;;31037:309;;;;;:::o;10961:447::-;11041:14;11209:15;11202:5;11198:27;11189:36;;11383:5;11369:11;11345:22;11341:40;11338:51;11331:5;11328:62;11318:72;;10961:447;;;;:::o;33543:158::-;;;;;:::o;2376:289:8:-;1778:1;2506:7;;:19;2498:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1;2639:7;:18;;;;2376:289::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;6963:184:3:-;7032:7;1162:13;1299:2;7060:18;:25;7079:5;7060:25;;;;;;;;;;;;;;;;:49;;7059:80;7052:87;;6963:184;;;:::o;15828:112::-;15905:27;15915:2;15919:8;15905:27;;;;;;;;;;;;:9;:27::i;:::-;15828:112;;:::o;2673:213:8:-;1734:1;2856:7;:22;;;;2673:213::o;1179:190:6:-;1304:4;1357;1328:25;1341:5;1348:4;1328:12;:25::i;:::-;:33;1321:40;;1179:190;;;;;:::o;2503:191:7:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;29539:716:3:-;29702:4;29748:2;29723:45;;;29769:19;:17;:19::i;:::-;29790:4;29796:7;29805:5;29723:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29719:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30023:1;30006:6;:13;:18;30002:235;;30052:40;;;;;;;;;;;;;;30002:235;30195:6;30189:13;30180:6;30176:2;30172:15;30165:38;29719:529;29892:54;;;29882:64;;;:6;:64;;;;29875:71;;;29539:716;;;;;;:::o;427::9:-;483:13;534:14;571:1;551:17;562:5;551:10;:17::i;:::-;:21;534:38;;587:20;621:6;610:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;587:41;;643:11;772:6;768:2;764:15;756:6;752:28;745:35;;809:288;816:4;809:288;;;841:5;;;;;;;;983:8;978:2;971:5;967:14;962:30;957:3;949:44;1039:2;1030:11;;;;;;:::i;:::-;;;;;1073:1;1064:5;:10;809:288;1060:21;809:288;1118:6;1111:13;;;;;427:716;;;:::o;2142:201:7:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;31922:147:3:-;32059:6;31922:147;;;;;:::o;16356:689::-;16487:19;16493:2;16497:8;16487:5;:19::i;:::-;16566:1;16548:2;:14;;;:19;16544:483;;16588:11;16602:13;;16588:27;;16634:13;16656:8;16650:3;:14;16634:30;;16683:233;16714:62;16753:1;16757:2;16761:7;;;;;;16770:5;16714:30;:62::i;:::-;16709:167;;16812:40;;;;;;;;;;;;;;16709:167;16911:3;16903:5;:11;16683:233;;16998:3;16981:13;;:20;16977:34;;17003:8;;;16977:34;16569:458;;16544:483;16356:689;;;:::o;2046:296:6:-;2129:7;2149:20;2172:4;2149:27;;2192:9;2187:118;2211:5;:12;2207:1;:16;2187:118;;;2260:33;2270:12;2284:5;2290:1;2284:8;;;;;;;;:::i;:::-;;;;;;;;2260:9;:33::i;:::-;2245:48;;2225:3;;;;;:::i;:::-;;;;2187:118;;;;2322:12;2315:19;;;2046:296;;;;:::o;10146:922:5:-;10199:7;10219:14;10236:1;10219:18;;10286:6;10277:5;:15;10273:102;;10322:6;10313:15;;;;;;:::i;:::-;;;;;10357:2;10347:12;;;;10273:102;10402:6;10393:5;:15;10389:102;;10438:6;10429:15;;;;;;:::i;:::-;;;;;10473:2;10463:12;;;;10389:102;10518:6;10509:5;:15;10505:102;;10554:6;10545:15;;;;;;:::i;:::-;;;;;10589:2;10579:12;;;;10505:102;10634:5;10625;:14;10621:99;;10669:5;10660:14;;;;;;:::i;:::-;;;;;10703:1;10693:11;;;;10621:99;10747:5;10738;:14;10734:99;;10782:5;10773:14;;;;;;:::i;:::-;;;;;10816:1;10806:11;;;;10734:99;10860:5;10851;:14;10847:99;;10895:5;10886:14;;;;;;:::i;:::-;;;;;10929:1;10919:11;;;;10847:99;10973:5;10964;:14;10960:66;;11009:1;10999:11;;;;10960:66;11054:6;11047:13;;;10146:922;;;:::o;17318:1537:3:-;17391:20;17414:13;;17391:36;;17456:1;17442:16;;:2;:16;;;17438:48;;17467:19;;;;;;;;;;;;;;17438:48;17513:1;17501:8;:13;17497:44;;17523:18;;;;;;;;;;;;;;17497:44;17554:61;17584:1;17588:2;17592:12;17606:8;17554:21;:61::i;:::-;18097:1;1299:2;18068:1;:25;;18067:31;18055:8;:44;18029:18;:22;18048:2;18029:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;18376:139;18413:2;18467:33;18490:1;18494:2;18498:1;18467:14;:33::i;:::-;18434:30;18455:8;18434:20;:30::i;:::-;:66;18376:18;:139::i;:::-;18342:17;:31;18360:12;18342:31;;;;;;;;;;;:173;;;;18532:15;18550:12;18532:30;;18577:11;18606:8;18591:12;:23;18577:37;;18629:101;18681:9;;;;;;18677:2;18656:35;;18673:1;18656:35;;;;;;;;;;;;18725:3;18715:7;:13;18629:101;;18762:3;18746:13;:19;;;;17803:974;;18787:60;18816:1;18820:2;18824:12;18838:8;18787:20;:60::i;:::-;17380:1475;17318:1537;;:::o;8253:149:6:-;8316:7;8347:1;8343;:5;:51;;8374:20;8389:1;8392;8374:14;:20::i;:::-;8343:51;;;8351:20;8366:1;8369;8351:14;:20::i;:::-;8343:51;8336:58;;8253:149;;;;:::o;12799:322:3:-;12869:14;13100:1;13090:8;13087:15;13062:23;13058:45;13048:55;;12799:322;;;:::o;8410:268:6:-;8478:13;8585:1;8579:4;8572:15;8614:1;8608:4;8601:15;8655:4;8649;8639:21;8630:30;;8410:268;;;;:::o;7:75:10:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:329::-;3426:6;3475:2;3463:9;3454:7;3450:23;3446:32;3443:119;;;3481:79;;:::i;:::-;3443:119;3601:1;3626:53;3671:7;3662:6;3651:9;3647:22;3626:53;:::i;:::-;3616:63;;3572:117;3367:329;;;;:::o;3702:77::-;3739:7;3768:5;3757:16;;3702:77;;;:::o;3785:122::-;3858:24;3876:5;3858:24;:::i;:::-;3851:5;3848:35;3838:63;;3897:1;3894;3887:12;3838:63;3785:122;:::o;3913:139::-;3959:5;3997:6;3984:20;3975:29;;4013:33;4040:5;4013:33;:::i;:::-;3913:139;;;;:::o;4058:329::-;4117:6;4166:2;4154:9;4145:7;4141:23;4137:32;4134:119;;;4172:79;;:::i;:::-;4134:119;4292:1;4317:53;4362:7;4353:6;4342:9;4338:22;4317:53;:::i;:::-;4307:63;;4263:117;4058:329;;;;:::o;4393:118::-;4480:24;4498:5;4480:24;:::i;:::-;4475:3;4468:37;4393:118;;:::o;4517:222::-;4610:4;4648:2;4637:9;4633:18;4625:26;;4661:71;4729:1;4718:9;4714:17;4705:6;4661:71;:::i;:::-;4517:222;;;;:::o;4745:474::-;4813:6;4821;4870:2;4858:9;4849:7;4845:23;4841:32;4838:119;;;4876:79;;:::i;:::-;4838:119;4996:1;5021:53;5066:7;5057:6;5046:9;5042:22;5021:53;:::i;:::-;5011:63;;4967:117;5123:2;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5094:118;4745:474;;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:77::-;6239:7;6268:5;6257:16;;6202:77;;;:::o;6285:118::-;6372:24;6390:5;6372:24;:::i;:::-;6367:3;6360:37;6285:118;;:::o;6409:222::-;6502:4;6540:2;6529:9;6525:18;6517:26;;6553:71;6621:1;6610:9;6606:17;6597:6;6553:71;:::i;:::-;6409:222;;;;:::o;6637:116::-;6707:21;6722:5;6707:21;:::i;:::-;6700:5;6697:32;6687:60;;6743:1;6740;6733:12;6687:60;6637:116;:::o;6759:133::-;6802:5;6840:6;6827:20;6818:29;;6856:30;6880:5;6856:30;:::i;:::-;6759:133;;;;:::o;6898:468::-;6963:6;6971;7020:2;7008:9;6999:7;6995:23;6991:32;6988:119;;;7026:79;;:::i;:::-;6988:119;7146:1;7171:53;7216:7;7207:6;7196:9;7192:22;7171:53;:::i;:::-;7161:63;;7117:117;7273:2;7299:50;7341:7;7332:6;7321:9;7317:22;7299:50;:::i;:::-;7289:60;;7244:115;6898:468;;;;;:::o;7372:117::-;7481:1;7478;7471:12;7495:117;7604:1;7601;7594:12;7618:117;7727:1;7724;7717:12;7755:553;7813:8;7823:6;7873:3;7866:4;7858:6;7854:17;7850:27;7840:122;;7881:79;;:::i;:::-;7840:122;7994:6;7981:20;7971:30;;8024:18;8016:6;8013:30;8010:117;;;8046:79;;:::i;:::-;8010:117;8160:4;8152:6;8148:17;8136:29;;8214:3;8206:4;8198:6;8194:17;8184:8;8180:32;8177:41;8174:128;;;8221:79;;:::i;:::-;8174:128;7755:553;;;;;:::o;8314:529::-;8385:6;8393;8442:2;8430:9;8421:7;8417:23;8413:32;8410:119;;;8448:79;;:::i;:::-;8410:119;8596:1;8585:9;8581:17;8568:31;8626:18;8618:6;8615:30;8612:117;;;8648:79;;:::i;:::-;8612:117;8761:65;8818:7;8809:6;8798:9;8794:22;8761:65;:::i;:::-;8743:83;;;;8539:297;8314:529;;;;;:::o;8849:180::-;8897:77;8894:1;8887:88;8994:4;8991:1;8984:15;9018:4;9015:1;9008:15;9035:281;9118:27;9140:4;9118:27;:::i;:::-;9110:6;9106:40;9248:6;9236:10;9233:22;9212:18;9200:10;9197:34;9194:62;9191:88;;;9259:18;;:::i;:::-;9191:88;9299:10;9295:2;9288:22;9078:238;9035:281;;:::o;9322:129::-;9356:6;9383:20;;:::i;:::-;9373:30;;9412:33;9440:4;9432:6;9412:33;:::i;:::-;9322:129;;;:::o;9457:311::-;9534:4;9624:18;9616:6;9613:30;9610:56;;;9646:18;;:::i;:::-;9610:56;9696:4;9688:6;9684:17;9676:25;;9756:4;9750;9746:15;9738:23;;9457:311;;;:::o;9774:122::-;9847:24;9865:5;9847:24;:::i;:::-;9840:5;9837:35;9827:63;;9886:1;9883;9876:12;9827:63;9774:122;:::o;9902:139::-;9948:5;9986:6;9973:20;9964:29;;10002:33;10029:5;10002:33;:::i;:::-;9902:139;;;;:::o;10064:710::-;10160:5;10185:81;10201:64;10258:6;10201:64;:::i;:::-;10185:81;:::i;:::-;10176:90;;10286:5;10315:6;10308:5;10301:21;10349:4;10342:5;10338:16;10331:23;;10402:4;10394:6;10390:17;10382:6;10378:30;10431:3;10423:6;10420:15;10417:122;;;10450:79;;:::i;:::-;10417:122;10565:6;10548:220;10582:6;10577:3;10574:15;10548:220;;;10657:3;10686:37;10719:3;10707:10;10686:37;:::i;:::-;10681:3;10674:50;10753:4;10748:3;10744:14;10737:21;;10624:144;10608:4;10603:3;10599:14;10592:21;;10548:220;;;10552:21;10166:608;;10064:710;;;;;:::o;10797:370::-;10868:5;10917:3;10910:4;10902:6;10898:17;10894:27;10884:122;;10925:79;;:::i;:::-;10884:122;11042:6;11029:20;11067:94;11157:3;11149:6;11142:4;11134:6;11130:17;11067:94;:::i;:::-;11058:103;;10874:293;10797:370;;;;:::o;11173:684::-;11266:6;11274;11323:2;11311:9;11302:7;11298:23;11294:32;11291:119;;;11329:79;;:::i;:::-;11291:119;11449:1;11474:53;11519:7;11510:6;11499:9;11495:22;11474:53;:::i;:::-;11464:63;;11420:117;11604:2;11593:9;11589:18;11576:32;11635:18;11627:6;11624:30;11621:117;;;11657:79;;:::i;:::-;11621:117;11762:78;11832:7;11823:6;11812:9;11808:22;11762:78;:::i;:::-;11752:88;;11547:303;11173:684;;;;;:::o;11880:568::-;11953:8;11963:6;12013:3;12006:4;11998:6;11994:17;11990:27;11980:122;;12021:79;;:::i;:::-;11980:122;12134:6;12121:20;12111:30;;12164:18;12156:6;12153:30;12150:117;;;12186:79;;:::i;:::-;12150:117;12300:4;12292:6;12288:17;12276:29;;12354:3;12346:4;12338:6;12334:17;12324:8;12320:32;12317:41;12314:128;;;12361:79;;:::i;:::-;12314:128;11880:568;;;;;:::o;12471:::-;12544:8;12554:6;12604:3;12597:4;12589:6;12585:17;12581:27;12571:122;;12612:79;;:::i;:::-;12571:122;12725:6;12712:20;12702:30;;12755:18;12747:6;12744:30;12741:117;;;12777:79;;:::i;:::-;12741:117;12891:4;12883:6;12879:17;12867:29;;12945:3;12937:4;12929:6;12925:17;12915:8;12911:32;12908:41;12905:128;;;12952:79;;:::i;:::-;12905:128;12471:568;;;;;:::o;13045:934::-;13167:6;13175;13183;13191;13240:2;13228:9;13219:7;13215:23;13211:32;13208:119;;;13246:79;;:::i;:::-;13208:119;13394:1;13383:9;13379:17;13366:31;13424:18;13416:6;13413:30;13410:117;;;13446:79;;:::i;:::-;13410:117;13559:80;13631:7;13622:6;13611:9;13607:22;13559:80;:::i;:::-;13541:98;;;;13337:312;13716:2;13705:9;13701:18;13688:32;13747:18;13739:6;13736:30;13733:117;;;13769:79;;:::i;:::-;13733:117;13882:80;13954:7;13945:6;13934:9;13930:22;13882:80;:::i;:::-;13864:98;;;;13659:313;13045:934;;;;;;;:::o;13985:329::-;14044:6;14093:2;14081:9;14072:7;14068:23;14064:32;14061:119;;;14099:79;;:::i;:::-;14061:119;14219:1;14244:53;14289:7;14280:6;14269:9;14265:22;14244:53;:::i;:::-;14234:63;;14190:117;13985:329;;;;:::o;14320:474::-;14388:6;14396;14445:2;14433:9;14424:7;14420:23;14416:32;14413:119;;;14451:79;;:::i;:::-;14413:119;14571:1;14596:53;14641:7;14632:6;14621:9;14617:22;14596:53;:::i;:::-;14586:63;;14542:117;14698:2;14724:53;14769:7;14760:6;14749:9;14745:22;14724:53;:::i;:::-;14714:63;;14669:118;14320:474;;;;;:::o;14800:117::-;14909:1;14906;14899:12;14923:307;14984:4;15074:18;15066:6;15063:30;15060:56;;;15096:18;;:::i;:::-;15060:56;15134:29;15156:6;15134:29;:::i;:::-;15126:37;;15218:4;15212;15208:15;15200:23;;14923:307;;;:::o;15236:146::-;15333:6;15328:3;15323;15310:30;15374:1;15365:6;15360:3;15356:16;15349:27;15236:146;;;:::o;15388:423::-;15465:5;15490:65;15506:48;15547:6;15506:48;:::i;:::-;15490:65;:::i;:::-;15481:74;;15578:6;15571:5;15564:21;15616:4;15609:5;15605:16;15654:3;15645:6;15640:3;15636:16;15633:25;15630:112;;;15661:79;;:::i;:::-;15630:112;15751:54;15798:6;15793:3;15788;15751:54;:::i;:::-;15471:340;15388:423;;;;;:::o;15830:338::-;15885:5;15934:3;15927:4;15919:6;15915:17;15911:27;15901:122;;15942:79;;:::i;:::-;15901:122;16059:6;16046:20;16084:78;16158:3;16150:6;16143:4;16135:6;16131:17;16084:78;:::i;:::-;16075:87;;15891:277;15830:338;;;;:::o;16174:943::-;16269:6;16277;16285;16293;16342:3;16330:9;16321:7;16317:23;16313:33;16310:120;;;16349:79;;:::i;:::-;16310:120;16469:1;16494:53;16539:7;16530:6;16519:9;16515:22;16494:53;:::i;:::-;16484:63;;16440:117;16596:2;16622:53;16667:7;16658:6;16647:9;16643:22;16622:53;:::i;:::-;16612:63;;16567:118;16724:2;16750:53;16795:7;16786:6;16775:9;16771:22;16750:53;:::i;:::-;16740:63;;16695:118;16880:2;16869:9;16865:18;16852:32;16911:18;16903:6;16900:30;16897:117;;;16933:79;;:::i;:::-;16897:117;17038:62;17092:7;17083:6;17072:9;17068:22;17038:62;:::i;:::-;17028:72;;16823:287;16174:943;;;;;;;:::o;17123:462::-;17185:6;17193;17242:2;17230:9;17221:7;17217:23;17213:32;17210:119;;;17248:79;;:::i;:::-;17210:119;17368:1;17393:50;17435:7;17426:6;17415:9;17411:22;17393:50;:::i;:::-;17383:60;;17339:114;17492:2;17518:50;17560:7;17551:6;17540:9;17536:22;17518:50;:::i;:::-;17508:60;;17463:115;17123:462;;;;;:::o;17591:684::-;17684:6;17692;17741:2;17729:9;17720:7;17716:23;17712:32;17709:119;;;17747:79;;:::i;:::-;17709:119;17895:1;17884:9;17880:17;17867:31;17925:18;17917:6;17914:30;17911:117;;;17947:79;;:::i;:::-;17911:117;18052:78;18122:7;18113:6;18102:9;18098:22;18052:78;:::i;:::-;18042:88;;17838:302;18179:2;18205:53;18250:7;18241:6;18230:9;18226:22;18205:53;:::i;:::-;18195:63;;18150:118;17591:684;;;;;:::o;18281:474::-;18349:6;18357;18406:2;18394:9;18385:7;18381:23;18377:32;18374:119;;;18412:79;;:::i;:::-;18374:119;18532:1;18557:53;18602:7;18593:6;18582:9;18578:22;18557:53;:::i;:::-;18547:63;;18503:117;18659:2;18685:53;18730:7;18721:6;18710:9;18706:22;18685:53;:::i;:::-;18675:63;;18630:118;18281:474;;;;;:::o;18761:180::-;18809:77;18806:1;18799:88;18906:4;18903:1;18896:15;18930:4;18927:1;18920:15;18947:320;18991:6;19028:1;19022:4;19018:12;19008:22;;19075:1;19069:4;19065:12;19096:18;19086:81;;19152:4;19144:6;19140:17;19130:27;;19086:81;19214:2;19206:6;19203:14;19183:18;19180:38;19177:84;;19233:18;;:::i;:::-;19177:84;18998:269;18947:320;;;:::o;19273:166::-;19413:18;19409:1;19401:6;19397:14;19390:42;19273:166;:::o;19445:366::-;19587:3;19608:67;19672:2;19667:3;19608:67;:::i;:::-;19601:74;;19684:93;19773:3;19684:93;:::i;:::-;19802:2;19797:3;19793:12;19786:19;;19445:366;;;:::o;19817:419::-;19983:4;20021:2;20010:9;20006:18;19998:26;;20070:9;20064:4;20060:20;20056:1;20045:9;20041:17;20034:47;20098:131;20224:4;20098:131;:::i;:::-;20090:139;;19817:419;;;:::o;20242:180::-;20290:77;20287:1;20280:88;20387:4;20384:1;20377:15;20411:4;20408:1;20401:15;20428:348;20468:7;20491:20;20509:1;20491:20;:::i;:::-;20486:25;;20525:20;20543:1;20525:20;:::i;:::-;20520:25;;20713:1;20645:66;20641:74;20638:1;20635:81;20630:1;20623:9;20616:17;20612:105;20609:131;;;20720:18;;:::i;:::-;20609:131;20768:1;20765;20761:9;20750:20;;20428:348;;;;:::o;20782:180::-;20830:77;20827:1;20820:88;20927:4;20924:1;20917:15;20951:4;20948:1;20941:15;20968:185;21008:1;21025:20;21043:1;21025:20;:::i;:::-;21020:25;;21059:20;21077:1;21059:20;:::i;:::-;21054:25;;21098:1;21088:35;;21103:18;;:::i;:::-;21088:35;21145:1;21142;21138:9;21133:14;;20968:185;;;;:::o;21159:147::-;21260:11;21297:3;21282:18;;21159:147;;;;:::o;21312:114::-;;:::o;21432:398::-;21591:3;21612:83;21693:1;21688:3;21612:83;:::i;:::-;21605:90;;21704:93;21793:3;21704:93;:::i;:::-;21822:1;21817:3;21813:11;21806:18;;21432:398;;;:::o;21836:379::-;22020:3;22042:147;22185:3;22042:147;:::i;:::-;22035:154;;22206:3;22199:10;;21836:379;;;:::o;22221:165::-;22361:17;22357:1;22349:6;22345:14;22338:41;22221:165;:::o;22392:366::-;22534:3;22555:67;22619:2;22614:3;22555:67;:::i;:::-;22548:74;;22631:93;22720:3;22631:93;:::i;:::-;22749:2;22744:3;22740:12;22733:19;;22392:366;;;:::o;22764:419::-;22930:4;22968:2;22957:9;22953:18;22945:26;;23017:9;23011:4;23007:20;23003:1;22992:9;22988:17;22981:47;23045:131;23171:4;23045:131;:::i;:::-;23037:139;;22764:419;;;:::o;23189:165::-;23329:17;23325:1;23317:6;23313:14;23306:41;23189:165;:::o;23360:366::-;23502:3;23523:67;23587:2;23582:3;23523:67;:::i;:::-;23516:74;;23599:93;23688:3;23599:93;:::i;:::-;23717:2;23712:3;23708:12;23701:19;;23360:366;;;:::o;23732:419::-;23898:4;23936:2;23925:9;23921:18;23913:26;;23985:9;23979:4;23975:20;23971:1;23960:9;23956:17;23949:47;24013:131;24139:4;24013:131;:::i;:::-;24005:139;;23732:419;;;:::o;24157:97::-;24216:6;24244:3;24234:13;;24157:97;;;;:::o;24260:141::-;24309:4;24332:3;24324:11;;24355:3;24352:1;24345:14;24389:4;24386:1;24376:18;24368:26;;24260:141;;;:::o;24407:93::-;24444:6;24491:2;24486;24479:5;24475:14;24471:23;24461:33;;24407:93;;;:::o;24506:107::-;24550:8;24600:5;24594:4;24590:16;24569:37;;24506:107;;;;:::o;24619:393::-;24688:6;24738:1;24726:10;24722:18;24761:97;24791:66;24780:9;24761:97;:::i;:::-;24879:39;24909:8;24898:9;24879:39;:::i;:::-;24867:51;;24951:4;24947:9;24940:5;24936:21;24927:30;;25000:4;24990:8;24986:19;24979:5;24976:30;24966:40;;24695:317;;24619:393;;;;;:::o;25018:60::-;25046:3;25067:5;25060:12;;25018:60;;;:::o;25084:142::-;25134:9;25167:53;25185:34;25194:24;25212:5;25194:24;:::i;:::-;25185:34;:::i;:::-;25167:53;:::i;:::-;25154:66;;25084:142;;;:::o;25232:75::-;25275:3;25296:5;25289:12;;25232:75;;;:::o;25313:269::-;25423:39;25454:7;25423:39;:::i;:::-;25484:91;25533:41;25557:16;25533:41;:::i;:::-;25525:6;25518:4;25512:11;25484:91;:::i;:::-;25478:4;25471:105;25389:193;25313:269;;;:::o;25588:73::-;25633:3;25588:73;:::o;25667:189::-;25744:32;;:::i;:::-;25785:65;25843:6;25835;25829:4;25785:65;:::i;:::-;25720:136;25667:189;;:::o;25862:186::-;25922:120;25939:3;25932:5;25929:14;25922:120;;;25993:39;26030:1;26023:5;25993:39;:::i;:::-;25966:1;25959:5;25955:13;25946:22;;25922:120;;;25862:186;;:::o;26054:543::-;26155:2;26150:3;26147:11;26144:446;;;26189:38;26221:5;26189:38;:::i;:::-;26273:29;26291:10;26273:29;:::i;:::-;26263:8;26259:44;26456:2;26444:10;26441:18;26438:49;;;26477:8;26462:23;;26438:49;26500:80;26556:22;26574:3;26556:22;:::i;:::-;26546:8;26542:37;26529:11;26500:80;:::i;:::-;26159:431;;26144:446;26054:543;;;:::o;26603:117::-;26657:8;26707:5;26701:4;26697:16;26676:37;;26603:117;;;;:::o;26726:169::-;26770:6;26803:51;26851:1;26847:6;26839:5;26836:1;26832:13;26803:51;:::i;:::-;26799:56;26884:4;26878;26874:15;26864:25;;26777:118;26726:169;;;;:::o;26900:295::-;26976:4;27122:29;27147:3;27141:4;27122:29;:::i;:::-;27114:37;;27184:3;27181:1;27177:11;27171:4;27168:21;27160:29;;26900:295;;;;:::o;27200:1403::-;27324:44;27364:3;27359;27324:44;:::i;:::-;27433:18;27425:6;27422:30;27419:56;;;27455:18;;:::i;:::-;27419:56;27499:38;27531:4;27525:11;27499:38;:::i;:::-;27584:67;27644:6;27636;27630:4;27584:67;:::i;:::-;27678:1;27707:2;27699:6;27696:14;27724:1;27719:632;;;;28395:1;28412:6;28409:84;;;28468:9;28463:3;28459:19;28446:33;28437:42;;28409:84;28519:67;28579:6;28572:5;28519:67;:::i;:::-;28513:4;28506:81;28368:229;27689:908;;27719:632;27771:4;27767:9;27759:6;27755:22;27805:37;27837:4;27805:37;:::i;:::-;27864:1;27878:215;27892:7;27889:1;27886:14;27878:215;;;27978:9;27973:3;27969:19;27956:33;27948:6;27941:49;28029:1;28021:6;28017:14;28007:24;;28076:2;28065:9;28061:18;28048:31;;27915:4;27912:1;27908:12;27903:17;;27878:215;;;28121:6;28112:7;28109:19;28106:186;;;28186:9;28181:3;28177:19;28164:33;28229:48;28271:4;28263:6;28259:17;28248:9;28229:48;:::i;:::-;28221:6;28214:64;28129:163;28106:186;28338:1;28334;28326:6;28322:14;28318:22;28312:4;28305:36;27726:625;;;27689:908;;27299:1304;;;27200:1403;;;:::o;28633:317::-;28731:3;28752:71;28816:6;28811:3;28752:71;:::i;:::-;28745:78;;28833:56;28882:6;28877:3;28870:5;28833:56;:::i;:::-;28914:29;28936:6;28914:29;:::i;:::-;28909:3;28905:39;28898:46;;28633:317;;;;;:::o;28956:333::-;29079:4;29117:2;29106:9;29102:18;29094:26;;29166:9;29160:4;29156:20;29152:1;29141:9;29137:17;29130:47;29194:88;29277:4;29268:6;29260;29194:88;:::i;:::-;29186:96;;28956:333;;;;;:::o;29295:180::-;29435:32;29431:1;29423:6;29419:14;29412:56;29295:180;:::o;29481:366::-;29623:3;29644:67;29708:2;29703:3;29644:67;:::i;:::-;29637:74;;29720:93;29809:3;29720:93;:::i;:::-;29838:2;29833:3;29829:12;29822:19;;29481:366;;;:::o;29853:419::-;30019:4;30057:2;30046:9;30042:18;30034:26;;30106:9;30100:4;30096:20;30092:1;30081:9;30077:17;30070:47;30134:131;30260:4;30134:131;:::i;:::-;30126:139;;29853:419;;;:::o;30278:162::-;30418:14;30414:1;30406:6;30402:14;30395:38;30278:162;:::o;30446:366::-;30588:3;30609:67;30673:2;30668:3;30609:67;:::i;:::-;30602:74;;30685:93;30774:3;30685:93;:::i;:::-;30803:2;30798:3;30794:12;30787:19;;30446:366;;;:::o;30818:419::-;30984:4;31022:2;31011:9;31007:18;30999:26;;31071:9;31065:4;31061:20;31057:1;31046:9;31042:17;31035:47;31099:131;31225:4;31099:131;:::i;:::-;31091:139;;30818:419;;;:::o;31243:191::-;31283:3;31302:20;31320:1;31302:20;:::i;:::-;31297:25;;31336:20;31354:1;31336:20;:::i;:::-;31331:25;;31379:1;31376;31372:9;31365:16;;31400:3;31397:1;31394:10;31391:36;;;31407:18;;:::i;:::-;31391:36;31243:191;;;;:::o;31440:164::-;31580:16;31576:1;31568:6;31564:14;31557:40;31440:164;:::o;31610:366::-;31752:3;31773:67;31837:2;31832:3;31773:67;:::i;:::-;31766:74;;31849:93;31938:3;31849:93;:::i;:::-;31967:2;31962:3;31958:12;31951:19;;31610:366;;;:::o;31982:419::-;32148:4;32186:2;32175:9;32171:18;32163:26;;32235:9;32229:4;32225:20;32221:1;32210:9;32206:17;32199:47;32263:131;32389:4;32263:131;:::i;:::-;32255:139;;31982:419;;;:::o;32407:160::-;32547:12;32543:1;32535:6;32531:14;32524:36;32407:160;:::o;32573:366::-;32715:3;32736:67;32800:2;32795:3;32736:67;:::i;:::-;32729:74;;32812:93;32901:3;32812:93;:::i;:::-;32930:2;32925:3;32921:12;32914:19;;32573:366;;;:::o;32945:419::-;33111:4;33149:2;33138:9;33134:18;33126:26;;33198:9;33192:4;33188:20;33184:1;33173:9;33169:17;33162:47;33226:131;33352:4;33226:131;:::i;:::-;33218:139;;32945:419;;;:::o;33370:223::-;33510:34;33506:1;33498:6;33494:14;33487:58;33579:6;33574:2;33566:6;33562:15;33555:31;33370:223;:::o;33599:366::-;33741:3;33762:67;33826:2;33821:3;33762:67;:::i;:::-;33755:74;;33838:93;33927:3;33838:93;:::i;:::-;33956:2;33951:3;33947:12;33940:19;;33599:366;;;:::o;33971:419::-;34137:4;34175:2;34164:9;34160:18;34152:26;;34224:9;34218:4;34214:20;34210:1;34199:9;34195:17;34188:47;34252:131;34378:4;34252:131;:::i;:::-;34244:139;;33971:419;;;:::o;34396:94::-;34429:8;34477:5;34473:2;34469:14;34448:35;;34396:94;;;:::o;34496:::-;34535:7;34564:20;34578:5;34564:20;:::i;:::-;34553:31;;34496:94;;;:::o;34596:100::-;34635:7;34664:26;34684:5;34664:26;:::i;:::-;34653:37;;34596:100;;;:::o;34702:157::-;34807:45;34827:24;34845:5;34827:24;:::i;:::-;34807:45;:::i;:::-;34802:3;34795:58;34702:157;;:::o;34865:256::-;34977:3;34992:75;35063:3;35054:6;34992:75;:::i;:::-;35092:2;35087:3;35083:12;35076:19;;35112:3;35105:10;;34865:256;;;;:::o;35127:79::-;35166:7;35195:5;35184:16;;35127:79;;;:::o;35212:157::-;35317:45;35337:24;35355:5;35337:24;:::i;:::-;35317:45;:::i;:::-;35312:3;35305:58;35212:157;;:::o;35375:256::-;35487:3;35502:75;35573:3;35564:6;35502:75;:::i;:::-;35602:2;35597:3;35593:12;35586:19;;35622:3;35615:10;;35375:256;;;;:::o;35637:182::-;35777:34;35773:1;35765:6;35761:14;35754:58;35637:182;:::o;35825:366::-;35967:3;35988:67;36052:2;36047:3;35988:67;:::i;:::-;35981:74;;36064:93;36153:3;36064:93;:::i;:::-;36182:2;36177:3;36173:12;36166:19;;35825:366;;;:::o;36197:419::-;36363:4;36401:2;36390:9;36386:18;36378:26;;36450:9;36444:4;36440:20;36436:1;36425:9;36421:17;36414:47;36478:131;36604:4;36478:131;:::i;:::-;36470:139;;36197:419;;;:::o;36622:180::-;36670:77;36667:1;36660:88;36767:4;36764:1;36757:15;36791:4;36788:1;36781:15;36808:233;36847:3;36870:24;36888:5;36870:24;:::i;:::-;36861:33;;36916:66;36909:5;36906:77;36903:103;;36986:18;;:::i;:::-;36903:103;37033:1;37026:5;37022:13;37015:20;;36808:233;;;:::o;37047:165::-;37187:17;37183:1;37175:6;37171:14;37164:41;37047:165;:::o;37218:366::-;37360:3;37381:67;37445:2;37440:3;37381:67;:::i;:::-;37374:74;;37457:93;37546:3;37457:93;:::i;:::-;37575:2;37570:3;37566:12;37559:19;;37218:366;;;:::o;37590:419::-;37756:4;37794:2;37783:9;37779:18;37771:26;;37843:9;37837:4;37833:20;37829:1;37818:9;37814:17;37807:47;37871:131;37997:4;37871:131;:::i;:::-;37863:139;;37590:419;;;:::o;38015:180::-;38155:32;38151:1;38143:6;38139:14;38132:56;38015:180;:::o;38201:366::-;38343:3;38364:67;38428:2;38423:3;38364:67;:::i;:::-;38357:74;;38440:93;38529:3;38440:93;:::i;:::-;38558:2;38553:3;38549:12;38542:19;;38201:366;;;:::o;38573:419::-;38739:4;38777:2;38766:9;38762:18;38754:26;;38826:9;38820:4;38816:20;38812:1;38801:9;38797:17;38790:47;38854:131;38980:4;38854:131;:::i;:::-;38846:139;;38573:419;;;:::o;38998:169::-;39138:21;39134:1;39126:6;39122:14;39115:45;38998:169;:::o;39173:366::-;39315:3;39336:67;39400:2;39395:3;39336:67;:::i;:::-;39329:74;;39412:93;39501:3;39412:93;:::i;:::-;39530:2;39525:3;39521:12;39514:19;;39173:366;;;:::o;39545:419::-;39711:4;39749:2;39738:9;39734:18;39726:26;;39798:9;39792:4;39788:20;39784:1;39773:9;39769:17;39762:47;39826:131;39952:4;39826:131;:::i;:::-;39818:139;;39545:419;;;:::o;39970:148::-;40072:11;40109:3;40094:18;;39970:148;;;;:::o;40148:874::-;40251:3;40288:5;40282:12;40317:36;40343:9;40317:36;:::i;:::-;40369:89;40451:6;40446:3;40369:89;:::i;:::-;40362:96;;40489:1;40478:9;40474:17;40505:1;40500:166;;;;40680:1;40675:341;;;;40467:549;;40500:166;40584:4;40580:9;40569;40565:25;40560:3;40553:38;40646:6;40639:14;40632:22;40624:6;40620:35;40615:3;40611:45;40604:52;;40500:166;;40675:341;40742:38;40774:5;40742:38;:::i;:::-;40802:1;40816:154;40830:6;40827:1;40824:13;40816:154;;;40904:7;40898:14;40894:1;40889:3;40885:11;40878:35;40954:1;40945:7;40941:15;40930:26;;40852:4;40849:1;40845:12;40840:17;;40816:154;;;40999:6;40994:3;40990:16;40983:23;;40682:334;;40467:549;;40255:767;;40148:874;;;;:::o;41028:390::-;41134:3;41162:39;41195:5;41162:39;:::i;:::-;41217:89;41299:6;41294:3;41217:89;:::i;:::-;41210:96;;41315:65;41373:6;41368:3;41361:4;41354:5;41350:16;41315:65;:::i;:::-;41405:6;41400:3;41396:16;41389:23;;41138:280;41028:390;;;;:::o;41424:583::-;41646:3;41668:92;41756:3;41747:6;41668:92;:::i;:::-;41661:99;;41777:95;41868:3;41859:6;41777:95;:::i;:::-;41770:102;;41889:92;41977:3;41968:6;41889:92;:::i;:::-;41882:99;;41998:3;41991:10;;41424:583;;;;;;:::o;42013:182::-;42153:34;42149:1;42141:6;42137:14;42130:58;42013:182;:::o;42201:366::-;42343:3;42364:67;42428:2;42423:3;42364:67;:::i;:::-;42357:74;;42440:93;42529:3;42440:93;:::i;:::-;42558:2;42553:3;42549:12;42542:19;;42201:366;;;:::o;42573:419::-;42739:4;42777:2;42766:9;42762:18;42754:26;;42826:9;42820:4;42816:20;42812:1;42801:9;42797:17;42790:47;42854:131;42980:4;42854:131;:::i;:::-;42846:139;;42573:419;;;:::o;42998:181::-;43138:33;43134:1;43126:6;43122:14;43115:57;42998:181;:::o;43185:366::-;43327:3;43348:67;43412:2;43407:3;43348:67;:::i;:::-;43341:74;;43424:93;43513:3;43424:93;:::i;:::-;43542:2;43537:3;43533:12;43526:19;;43185:366;;;:::o;43557:419::-;43723:4;43761:2;43750:9;43746:18;43738:26;;43810:9;43804:4;43800:20;43796:1;43785:9;43781:17;43774:47;43838:131;43964:4;43838:131;:::i;:::-;43830:139;;43557:419;;;:::o;43982:98::-;44033:6;44067:5;44061:12;44051:22;;43982:98;;;:::o;44086:168::-;44169:11;44203:6;44198:3;44191:19;44243:4;44238:3;44234:14;44219:29;;44086:168;;;;:::o;44260:373::-;44346:3;44374:38;44406:5;44374:38;:::i;:::-;44428:70;44491:6;44486:3;44428:70;:::i;:::-;44421:77;;44507:65;44565:6;44560:3;44553:4;44546:5;44542:16;44507:65;:::i;:::-;44597:29;44619:6;44597:29;:::i;:::-;44592:3;44588:39;44581:46;;44350:283;44260:373;;;;:::o;44639:640::-;44834:4;44872:3;44861:9;44857:19;44849:27;;44886:71;44954:1;44943:9;44939:17;44930:6;44886:71;:::i;:::-;44967:72;45035:2;45024:9;45020:18;45011:6;44967:72;:::i;:::-;45049;45117:2;45106:9;45102:18;45093:6;45049:72;:::i;:::-;45168:9;45162:4;45158:20;45153:2;45142:9;45138:18;45131:48;45196:76;45267:4;45258:6;45196:76;:::i;:::-;45188:84;;44639:640;;;;;;;:::o;45285:141::-;45341:5;45372:6;45366:13;45357:22;;45388:32;45414:5;45388:32;:::i;:::-;45285:141;;;;:::o;45432:349::-;45501:6;45550:2;45538:9;45529:7;45525:23;45521:32;45518:119;;;45556:79;;:::i;:::-;45518:119;45676:1;45701:63;45756:7;45747:6;45736:9;45732:22;45701:63;:::i;:::-;45691:73;;45647:127;45432:349;;;;:::o;45787:225::-;45927:34;45923:1;45915:6;45911:14;45904:58;45996:8;45991:2;45983:6;45979:15;45972:33;45787:225;:::o;46018:366::-;46160:3;46181:67;46245:2;46240:3;46181:67;:::i;:::-;46174:74;;46257:93;46346:3;46257:93;:::i;:::-;46375:2;46370:3;46366:12;46359:19;;46018:366;;;:::o;46390:419::-;46556:4;46594:2;46583:9;46579:18;46571:26;;46643:9;46637:4;46633:20;46629:1;46618:9;46614:17;46607:47;46671:131;46797:4;46671:131;:::i;:::-;46663:139;;46390:419;;;:::o
Swarm Source
ipfs://60ff2734b3bbf6e9d9416d2a6458609955f8333132c46746db4944dc6a9528cd
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.