ERC-721
Overview
Max Total Supply
9,651 WADESIDE
Holders
1,028
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 WADESIDELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
WADESIDE
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/token/common/ERC2981.sol"; import "erc721a/contracts/extensions/ERC721AQueryable.sol"; import "./IERC721C.sol"; contract WADESIDE is IERC721C, ERC721AQueryable, ERC2981, Ownable, ReentrancyGuard { // Whether base URI is permanent. Once set, base URI is immutable. bool private _baseURIPermanent; // The total mintable supply. uint256 internal _maxMintableSupply; // Current base URI. string private _currentBaseURI; // The suffix for the token URL, e.g. ".json". string private _tokenURISuffix; uint256 constant secondsPerWeek = 604800; uint256 internal _minTimeBeforeClaim; uint256 internal immutable _privateAuctionSupply; uint256 internal immutable _publicAuctionSupply; uint256 internal immutable _teamSupply; uint256 internal immutable _fnfSupply; uint256 internal immutable _maxSupplyPerWeek; uint256 internal immutable _numberOfWeeks; address public withdrawAccount; bool public transferLocked; bool public publicAuctionStarted; bool public publicAuctionEnded; bool public privateAuctionStarted; bool public privateAuctionEnded; mapping(address => uint256) private _weekClaimed; mapping(address => uint256) private _totalClaimedBy; mapping(address => uint256) private _privateBid; mapping(address => uint256) private _privateClaimedBy; mapping(address => bool) private _privateAirdropped; mapping(address => mapping(uint256 => uint256)) private _bid; mapping(address => mapping(uint256 => uint256)) private _numClaimedBy; mapping(uint256 => uint256) private _totalClaimedAtWeek; mapping(uint256 => uint256) private _totalBid; mapping(uint256 => uint256) private _price; mapping(uint256 => uint256) private _supply; mapping(uint256 => bool) private _withdrawn; mapping(uint256 => bool) private _priceComputed; mapping(uint256 => address[]) private _allParticipants; uint256 private _totalPrivateBid; uint256 private _privatePrice; uint256 private _privateSupply; bool private _privateWithdrawn; address[] private _allPrivateParticipants; bytes32 private _merkleRoot; uint256 private _publicAuctionStartTime; uint256 private _privateAuctionStartTime; uint256 private _privateAuctionEndTime; constructor( string memory collectionName, string memory collectionSymbol ) ERC721A(collectionName, collectionSymbol) Ownable(0x26C4aB089D174929238c0FE42e5c7A241c8AC208) { _maxMintableSupply = 13333; _minTimeBeforeClaim = 3600; _privateAuctionSupply = 1916; _publicAuctionSupply = 8084; _teamSupply = 1233; _fnfSupply = 2100; _maxSupplyPerWeek = 188; _numberOfWeeks = 43; withdrawAccount = msg.sender; _tokenURISuffix = ".json"; _currentBaseURI = "http://metadata.wade.club/wadeside/"; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function bulkTransfer(address[] calldata _to, uint256[] calldata _id) public { require(_to.length == _id.length, "Receivers and IDs are different length"); for (uint256 i = 0; i < _to.length; i++) { transferFrom(msg.sender, _to[i], _id[i]); } } function getMinTimeBeforeClaim() external view returns (uint256) { return _minTimeBeforeClaim; } function getWeekClaimed(address addr) external view returns (uint256) { return _weekClaimed[addr]; } function getTotalClaimedBy(address addr) external view returns (uint256) { return _totalClaimedBy[addr]; } function getPrivateBidBy(address addr) external view returns (uint256) { return _privateBid[addr]; } function getPrivateClaimedBy(address addr) external view returns (uint256) { return _privateClaimedBy[addr]; } function getPrivateAirdropped(address addr) external view returns (bool) { return _privateAirdropped[addr]; } function getBidBy(address addr, uint256 week) external view returns (uint256) { return _bid[addr][week]; } function getNumClaimedBy(address addr, uint256 week) external view returns (uint256) { return _numClaimedBy[addr][week]; } function getTotalClaimedAtWeek(uint256 week) external view returns (uint256) { return _totalClaimedAtWeek[week]; } function getTotalBid(uint256 week) external view returns (uint256) { return _totalBid[week]; } function getPrice(uint256 week) external view returns (uint256) { return _price[week]; } function getSupply(uint256 week) external view returns (uint256) { return _supply[week]; } function getWithrawn(uint256 week) external view returns (bool) { return _withdrawn[week]; } function getPriceComputed(uint256 week) external view returns (bool) { return _priceComputed[week]; } function getAllParticipants(uint256 week) external view returns (address[] memory) { return _allParticipants[week]; } function getTotalPrivateBid() external view returns (uint256) { return _totalPrivateBid; } function getPrivatePrice() external view returns (uint256) { return _privatePrice; } function getPrivateSupply() external view returns (uint256) { return _privateSupply; } function getPrivateWithdrawn() external view returns (bool) { return _privateWithdrawn; } function getAllPrivateParticipants() external view returns (address[] memory) { return _allPrivateParticipants; } function getPublicAuctionStartTime() external view returns (uint256) { return _publicAuctionStartTime; } function getPrivateAuctionStartTime() external view returns (uint256) { return _privateAuctionStartTime; } function getPrivateAuctionEndTime() external view returns (uint256) { return _privateAuctionEndTime; } function currWeek(uint256 time) public view returns (uint256 week) { require(publicAuctionStarted && time >= _publicAuctionStartTime, "Public auction has not started"); week = (time - _publicAuctionStartTime) / secondsPerWeek; if (week > _numberOfWeeks) { week = _numberOfWeeks; } } function currWeek() public view returns (uint256) { return currWeek(block.timestamp); } function numClaimable(address addr, uint256 week) public view returns (uint256) { if (_price[week] == 0) { return 0; } return _bid[addr][week] / _price[week]; } function weeklyRefund(address addr, uint256 week) public view returns (uint256) { if (_price[week] == 0) { return 0; } return _bid[addr][week] % _price[week]; } function totalClaimableAndRefund(address addr) public view returns (uint256 claimable, uint256 refund) { for (uint256 i = _weekClaimed[addr]; i < currWeek(block.timestamp - _minTimeBeforeClaim); i++) { claimable += numClaimable(addr, i); refund += weeklyRefund(addr, i); } } function _increaseNumClaimed(address addr) internal { for (uint256 i = _weekClaimed[addr]; i < currWeek(block.timestamp - _minTimeBeforeClaim); i++) { _totalClaimedAtWeek[i] += numClaimable(addr, i); require(_totalClaimedAtWeek[i] <= _supply[i], "Total claimed per week cannot exceed limit"); _numClaimedBy[addr][i] += numClaimable(addr, i); } } function computeSum(uint256 week, uint256 price) internal view returns (uint256 sum) { uint256 length = _allParticipants[week].length; for (uint256 i; i < length;) { sum += _bid[_allParticipants[week][i]][week] / price; unchecked { ++i; } } } function computePrice(uint256 week) public view returns (uint256, uint256) { require(currWeek() > week, "Auction has not ended yet"); if (_allParticipants[week].length == 0) { return (0, 1); } uint256 startingExponent = 55; uint256 foundExponent; if (computeSum(week, (1 << startingExponent)) < _maxSupplyPerWeek) { for (uint256 i = startingExponent - 1; i > 0; i--) { if (computeSum(week, (1 << i)) >= _maxSupplyPerWeek) { foundExponent = i; break; } } } else { for (uint256 i = startingExponent + 1; i < 90; i++) { if (computeSum(week, (1 << i)) < _maxSupplyPerWeek) { foundExponent = i - 1; break; } } } uint256 low = (1 << foundExponent); uint256 high = (1 << (foundExponent + 1)); uint256 mid; while (low < high) { mid = (low + high) / 2; if (computeSum(week, mid) < _maxSupplyPerWeek) { high = mid; } else { low = mid + 1; } } if (computeSum(week, low - 1) == _maxSupplyPerWeek) { return (low - 1, _maxSupplyPerWeek); } else { uint256 supply = computeSum(week, low); if (supply == 0) { return (_totalBid[week], 1); } else { startingExponent = foundExponent; if (computeSum(week, (1 << startingExponent)) < supply) { for (uint256 i = startingExponent - 1; i > 0; i--) { if (computeSum(week, (1 << i)) >= supply) { foundExponent = i; break; } } } else { for (uint256 i = startingExponent + 1; i < 90; i++) { if (computeSum(week, (1 << i)) < supply) { foundExponent = i - 1; break; } } } low = (1 << foundExponent); high = (1 << (foundExponent + 1)); while (low < high) { mid = (low + high) / 2; if (computeSum(week, mid) < supply) { high = mid; } else { low = mid + 1; } } return (low - 1, supply); } } } function placePrivateBid(bytes32[] calldata proof) external payable nonReentrant { require(privateAuctionStarted && !privateAuctionEnded, "Private auction not in progress"); require(_privateAuctionStartTime <= block.timestamp && block.timestamp <= _privateAuctionEndTime, "Invalid timestamp"); require(MerkleProof.processProof(proof, keccak256(abi.encodePacked(msg.sender))) == _merkleRoot, "Not in whitelist"); require(msg.value > 0, "Bid amount must be greater than zero"); if (_privateBid[msg.sender] == 0) { _allPrivateParticipants.push(msg.sender); } _privateBid[msg.sender] += msg.value; _totalPrivateBid += msg.value; } function placeBid() external payable nonReentrant { require(publicAuctionStarted && !publicAuctionEnded && _publicAuctionStartTime <= block.timestamp, "Public auction not in progress"); require(currWeek() < _numberOfWeeks, "Auction has ended"); require(msg.value > _maxSupplyPerWeek ** 2, "Bid amount must be greater than minimum"); if (_bid[msg.sender][currWeek()] == 0) { _allParticipants[currWeek()].push(msg.sender); } _bid[msg.sender][currWeek()] += msg.value; _totalBid[currWeek()] += msg.value; } function claimAndRefund() external nonReentrant { require(publicAuctionStarted && !publicAuctionEnded && _publicAuctionStartTime <= block.timestamp, "Public auction not in progress"); require(currWeek(block.timestamp - _minTimeBeforeClaim) > _weekClaimed[msg.sender], "Already claimed"); (uint256 claimable, uint256 refund) = totalClaimableAndRefund(msg.sender); require(claimable > 0 || refund > 0, "Nothing to claim or refund"); (bool success, ) = msg.sender.call{value: refund}(""); if (!success) revert WithdrawFailed(); if (claimable > 0) { require(totalSupply() + claimable <= _teamSupply + _fnfSupply + _privateAuctionSupply + _maxSupplyPerWeek * (currWeek() + 1), "Exceeds current max supply"); _safeMint(msg.sender, claimable); _totalClaimedBy[msg.sender] += claimable; _increaseNumClaimed(msg.sender); } for (uint256 week = currWeek(block.timestamp - _minTimeBeforeClaim); week > _weekClaimed[msg.sender]; week--) { if (_supply[week - 1] != 0) { _weekClaimed[msg.sender] = week; break; } } } function claimAndRelay() external payable nonReentrant { require(publicAuctionStarted && !publicAuctionEnded && _publicAuctionStartTime <= block.timestamp, "Public auction not in progress"); require(currWeek(block.timestamp - _minTimeBeforeClaim) > _weekClaimed[msg.sender], "Already claimed"); require(currWeek() < _numberOfWeeks, "Auction has ended"); (uint256 claimable, uint256 refund) = totalClaimableAndRefund(msg.sender); require(claimable > 0 || refund > 0, "Nothing to claim or relay"); require(msg.value + refund > _maxSupplyPerWeek ** 2, "Bid amount must be greater than minimum"); if (_bid[msg.sender][currWeek()] == 0) { _allParticipants[currWeek()].push(msg.sender); } _bid[msg.sender][currWeek()] += msg.value + refund; _totalBid[currWeek()] += msg.value + refund; if (claimable > 0) { require(totalSupply() + claimable <= _teamSupply + _fnfSupply + _privateAuctionSupply + _maxSupplyPerWeek * (currWeek() + 1), "Exceeds current max supply"); _safeMint(msg.sender, claimable); _totalClaimedBy[msg.sender] += claimable; _increaseNumClaimed(msg.sender); } for (uint256 week = currWeek(block.timestamp - _minTimeBeforeClaim); week > _weekClaimed[msg.sender]; week--) { if (_supply[week - 1] != 0) { _weekClaimed[msg.sender] = week; break; } } } function setComputedPrice(uint256 week) public { require(currWeek() > week, "Auction has not ended yet"); require(!_priceComputed[week], "Price already computed"); if (week != 0) require(_supply[week - 1] != 0, "Must have set price for previous week"); _priceComputed[week] = true; (_price[week], _supply[week]) = computePrice(week); } function setPrice(uint256 week, uint256 price, uint256 supply) external onlyOwner { require(currWeek() > week, "Auction has not ended yet"); require(!_priceComputed[week], "Price already computed"); require(supply <= _maxSupplyPerWeek, "Supply cannot exceed limit"); require(!_withdrawn[week], "Already withdrawn"); require(supply > 0, "Invalid input"); require(price * supply <= _totalBid[week], "Withdraw amount cannot exceed total bid"); if (week != 0) require(_supply[week - 1] != 0, "Must have set price for previous week"); _price[week] = price; _supply[week] = supply; } function withdraw(uint256 week) external nonReentrant onlyOwner { require(currWeek() > week, "Auction has not ended yet"); require(_price[week] > 0 && _supply[week] > 0, "Price and supply not initialized"); require(!_withdrawn[week], "Already withdrawn"); require(_price[week] != _totalBid[week], "Special case: no winner"); uint256 value = _price[week] * _supply[week]; require(value <= _totalBid[week], "Withdraw amount cannot exceed total bid"); (bool success, ) = withdrawAccount.call{value: value}(""); if (!success) revert WithdrawFailed(); _withdrawn[week] = true; emit Withdraw(value); } function withdrawFinal() external nonReentrant onlyOwner { require(publicAuctionEnded, "Public auction has not ended"); uint256 value = address(this).balance; (bool success, ) = withdrawAccount.call{value: value}(""); if (!success) revert WithdrawFailed(); emit Withdraw(value); } function setPublicAuctionStartTime(uint256 time) external onlyOwner { require(!publicAuctionStarted, "Public auction already started"); require(time > block.timestamp && time - block.timestamp < secondsPerWeek, "Time not in appropriate window"); _publicAuctionStartTime = time; } function setPrivateAuctionStartTime(uint256 time) external onlyOwner { require(!privateAuctionStarted, "Private auction already started"); _privateAuctionStartTime = time; } function setPrivateAuctionEndTime(uint256 time) external onlyOwner { require(!privateAuctionEnded, "Private auction already ended"); _privateAuctionEndTime = time; } function startPublicAuction() external onlyOwner { require(_publicAuctionStartTime > block.timestamp, "Start time must come after current time"); require(!publicAuctionEnded, "Public auction has already ended"); require(privateAuctionEnded, "Private auction has not ended yet"); require(totalSupply() == _teamSupply + _fnfSupply + _privateAuctionSupply, "Other sales must have terminated"); publicAuctionStarted = true; } function startPrivateAuction() external onlyOwner { require(_privateAuctionStartTime != 0, "Private auction start time not initialized"); require(_privateAuctionEndTime != 0, "Private auction end time not initialized"); require(!privateAuctionEnded, "Private auction has already ended"); privateAuctionStarted = true; } function endPublicAuction() external onlyOwner { require(publicAuctionStarted, "Public auction has not started"); // require(_withdrawn[_numberOfWeeks - 1], "Public auction has not ended"); publicAuctionEnded = true; } function endPrivateAuction() external onlyOwner { require(_privateAuctionEndTime != 0, "Private auction end time not initialized"); require(privateAuctionStarted, "Private auction has not started"); require(block.timestamp >= _privateAuctionEndTime, "Private auction end time has not passed yet"); privateAuctionEnded = true; } function setPrivatePrice(uint256 price, uint256 supply) external onlyOwner { require(privateAuctionEnded, "Private auction has not ended yet"); require(supply <= _privateAuctionSupply, "Supply cannot exceed limit"); require(!_privateWithdrawn, "Already withdrawn"); require(price * supply <= _totalPrivateBid, "Withdraw amount cannot exceed total bid"); _privatePrice = price; _privateSupply = supply; } function withdrawPrivateFund() external nonReentrant onlyOwner { require(privateAuctionEnded, "Private auction has not ended yet"); require(_privatePrice > 0 && _privateSupply > 0, "Price and supply not initialized"); require(!_privateWithdrawn, "Already withdrawn"); uint256 value = _privatePrice * _privateSupply; require(value <= _totalPrivateBid, "Withdraw amount cannot exceed total bid"); (bool success, ) = withdrawAccount.call{value: value}(""); if (!success) revert WithdrawFailed(); _privateWithdrawn = true; emit Withdraw(value); } function airdropAllPrivate(address[] calldata addrs) external nonReentrant onlyOwner { require(privateAuctionEnded, "Private auction has not ended yet"); require(_privatePrice > 0 && _privateSupply > 0, "Price and supply not initialized"); for (uint256 i = 0; i < addrs.length; i++) { if (!_privateAirdropped[addrs[i]]) { (bool success, ) = addrs[i].call{value: _privateBid[addrs[i]] % _privatePrice}(""); if (!success) revert WithdrawFailed(); if (_privateBid[addrs[i]] / _privatePrice > 0) { _safeMint(addrs[i], _privateBid[addrs[i]] / _privatePrice); _privateClaimedBy[addrs[i]] += _privateBid[addrs[i]] / _privatePrice; } _privateAirdropped[addrs[i]] = true; } } require(totalSupply() <= _teamSupply + _fnfSupply + _privateAuctionSupply, "Exceeds mint limit"); } function airdropAllPublic(address[] calldata addrs) external nonReentrant onlyOwner { require(publicAuctionEnded, "Public auction has not ended"); for (uint256 i = 0; i < addrs.length; i++) { if (_weekClaimed[addrs[i]] < _numberOfWeeks) { (uint256 claimable, uint256 refund) = totalClaimableAndRefund(addrs[i]); (bool success, ) = addrs[i].call{value: refund}(""); if (!success) revert WithdrawFailed(); if (claimable > 0) { _safeMint(addrs[i], claimable); _totalClaimedBy[addrs[i]] += claimable; _increaseNumClaimed(addrs[i]); } _weekClaimed[addrs[i]] = _numberOfWeeks; } } require(totalSupply() <= _maxMintableSupply, "Exceeds mint limit"); } function setMinTimeBeforeClaim(uint256 time) external onlyOwner { _minTimeBeforeClaim = time; } function setMerkleRoot(bytes32 root) external onlyOwner { _merkleRoot = root; } function setWithdrawAccount(address addr) external onlyOwner { withdrawAccount = addr; } function setTransferLocked(bool locked) external onlyOwner { transferLocked = locked; } function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override(ERC721A, IERC721A) { require(!transferLocked, "Cannot transfer - currently locked"); super.transferFrom(from, to, tokenId); } /** * @dev Returns whether it has enough supply for the given qty. */ modifier hasSupply(uint256 qty) { if (totalSupply() + qty > _maxMintableSupply) revert NoSupplyLeft(); _; } /** * @dev Returns maximum mintable supply. */ function getMaxMintableSupply() external view override returns (uint256) { return _maxMintableSupply; } /** * @dev Sets maximum mintable supply. * * New supply cannot be larger than the old. */ function setMaxMintableSupply(uint256 maxMintableSupply) external virtual onlyOwner { if (maxMintableSupply > _maxMintableSupply) { revert CannotIncreaseMaxMintableSupply(); } _maxMintableSupply = maxMintableSupply; emit SetMaxMintableSupply(maxMintableSupply); } /** * @dev Returns number of minted token for a given address. */ function totalMintedByAddress(address a) external view virtual override returns (uint256) { return _numberMinted(a); } /** * @dev Mints token(s) by owner. * * NOTE: This function bypasses validations thus only available for owner. * This is typically used for owner to pre-mint or mint the remaining of the supply. */ function ownerMint(uint32 qty, address to) public onlyOwner hasSupply(qty) { if (publicAuctionStarted) { require(publicAuctionEnded, "Owner cannot mint during public auction"); } else { if (!privateAuctionEnded) { require(totalSupply() + qty <= _teamSupply + _fnfSupply, "Exceeds mint limit"); } else { require(totalSupply() + qty <= _teamSupply + _fnfSupply + _privateAuctionSupply, "Exceeds mint limit"); } } _safeMint(to, qty); } function ownerMintBulk(address[] calldata _to, uint32[] calldata _qty) external onlyOwner { require(_to.length == _qty.length, "Receivers and quantities are different length"); for (uint256 i = 0; i < _to.length; i++) { ownerMint(_qty[i], _to[i]); } } function supportsInterface(bytes4 interfaceId) public view virtual override (IERC721A, ERC721A, ERC2981) returns (bool) { // Supports the following `interfaceId`s: // - IERC165: 0x01ffc9a7 // - IERC721: 0x80ac58cd // - IERC721Metadata: 0x5b5e139f // - IERC2981: 0x2a55205a return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } /** * @dev Sets token base URI. */ function setBaseURI(string calldata baseURI) external onlyOwner { if (_baseURIPermanent) revert CannotUpdatePermanentBaseURI(); _currentBaseURI = baseURI; emit SetBaseURI(baseURI); } /** * @dev Sets token base URI permanent. Cannot revert. */ function setBaseURIPermanent() external onlyOwner { _baseURIPermanent = true; emit PermanentBaseURI(_currentBaseURI); } /** * @dev Returns token URI suffix. */ function getTokenURISuffix() external view override returns (string memory) { return _tokenURISuffix; } /** * @dev Sets token URI suffix. e.g. ".json". */ function setTokenURISuffix(string calldata suffix) external onlyOwner { _tokenURISuffix = suffix; } /** * @dev Returns token URI for a given token id. */ function tokenURI(uint256 tokenId) public view override(ERC721A, IERC721A) returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _currentBaseURI; return bytes(baseURI).length != 0 ? string( abi.encodePacked( baseURI, _toString(tokenId), _tokenURISuffix ) ) : ""; } /** * @dev Returns chain id. */ function _chainID() private view returns (uint256) { uint256 chainID; assembly { chainID := chainid() } return chainID; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "erc721a/contracts/extensions/IERC721AQueryable.sol"; interface IERC721C is IERC721AQueryable { error CannotIncreaseMaxMintableSupply(); error CannotUpdatePermanentBaseURI(); error NoSupplyLeft(); error WithdrawFailed(); event SetMaxMintableSupply(uint256 maxMintableSupply); event SetBaseURI(string baseURI); event PermanentBaseURI(string baseURI); event Withdraw(uint256 value); function getMaxMintableSupply() external view returns (uint256); function totalMintedByAddress(address a) external view returns (uint256); function getTokenURISuffix() external view returns (string memory); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721AQueryable.sol'; import '../ERC721A.sol'; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol) pragma solidity ^0.8.20; import {IERC2981} from "../../interfaces/IERC2981.sol"; import {IERC165, ERC165} from "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator); /** * @dev The default royalty receiver is invalid. */ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver); /** * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator); /** * @dev The royalty receiver for `tokenId` is invalid. */ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidDefaultRoyaltyReceiver(address(0)); } _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0)); } _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the Merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates Merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @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} */ 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. */ 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} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds 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 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // 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 from 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) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds 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 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // 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 from 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) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ 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.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import '../IERC721A.sol'; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "remappings": [], "evmVersion": "shanghai" }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"collectionName","type":"string"},{"internalType":"string","name":"collectionSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CannotIncreaseMaxMintableSupply","type":"error"},{"inputs":[],"name":"CannotUpdatePermanentBaseURI","type":"error"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoSupplyLeft","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"PermanentBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxMintableSupply","type":"uint256"}],"name":"SetMaxMintableSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"airdropAllPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"airdropAllPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"bulkTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndRelay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"computePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"currWeek","outputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endPrivateAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPublicAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getAllParticipants","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPrivateParticipants","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":"addr","type":"address"},{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getBidBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinTimeBeforeClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getNumClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getPriceComputed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getPrivateAirdropped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrivateAuctionEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrivateAuctionStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getPrivateBidBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getPrivateClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrivatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrivateSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrivateWithdrawn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicAuctionStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenURISuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getTotalBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getTotalClaimedAtWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getTotalClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPrivateBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getWeekClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getWithrawn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"week","type":"uint256"}],"name":"numClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"qty","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint32[]","name":"_qty","type":"uint32[]"}],"name":"ownerMintBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"placePrivateBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privateAuctionEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAuctionStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAuctionEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAuctionStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBaseURIPermanent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"setComputedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintableSupply","type":"uint256"}],"name":"setMaxMintableSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setMinTimeBeforeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setPrivateAuctionEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setPrivateAuctionStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setPrivatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setPublicAuctionStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"suffix","type":"string"}],"name":"setTokenURISuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"locked","type":"bool"}],"name":"setTransferLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setWithdrawAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPrivateAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicAuction","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"totalClaimableAndRefund","outputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"refund","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"totalMintedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"transferLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"week","type":"uint256"}],"name":"weeklyRefund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawPrivateFund","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61014060405234801562000011575f80fd5b506040516200634e3803806200634e833981016040819052620000349162000260565b7326c4ab089d174929238c0fe42e5c7a241c8ac2088282600262000059838262000350565b50600362000068828262000350565b5060015f5550506001600160a01b0381166200009d57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000a8816200014e565b506001600b55613415600d55610e1060105561077c608052611f9460a0526104d160c05261083460e05260bc61010052602b61012052601180546001600160a01b03191633179055604080518082019091526005815264173539b7b760d91b6020820152600f906200011b908262000350565b506040518060600160405280602381526020016200632b60239139600e9062000145908262000350565b5050506200041c565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001c3575f80fd5b81516001600160401b0380821115620001e057620001e06200019f565b604051601f8301601f19908116603f011681019082821181831017156200020b576200020b6200019f565b816040528381526020925086602085880101111562000228575f80fd5b5f91505b838210156200024b57858201830151818301840152908201906200022c565b5f602085830101528094505050505092915050565b5f806040838503121562000272575f80fd5b82516001600160401b038082111562000289575f80fd5b6200029786838701620001b3565b93506020850151915080821115620002ad575f80fd5b50620002bc85828601620001b3565b9150509250929050565b600181811c90821680620002db57607f821691505b602082108103620002fa57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200034b57805f5260205f20601f840160051c81016020851015620003275750805b601f840160051c820191505b8181101562000348575f815560010162000333565b50505b505050565b81516001600160401b038111156200036c576200036c6200019f565b62000384816200037d8454620002c6565b8462000300565b602080601f831160018114620003ba575f8415620003a25750858301515b5f19600386901b1c1916600185901b17855562000414565b5f85815260208120601f198616915b82811015620003ea57888601518255948401946001909101908401620003c9565b50858210156200040857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805160a05160c05160e0516101005161012051615df8620005335f395f818161377f015281816137a801528181613b1401528181613d0e01528181613e3e015261453c01525f81816119520152818161199f01528181611a0a01528181611a9501528181611ae001528181611b26015281816120920152818161337601528181613f150152818161405e01526145ab01525f8181611482015281816120dc01528181613270015281816135be0152818161366001526140a801525f81816114a3015281816120fd01528181613291015281816135df0152818161368101526140c901525f50505f818161145e015281816120b8015281816125e70152818161324c0152818161363c01526140840152615df85ff3fe6080604052600436106104dc575f3560e01c806381f6277d11610283578063b57de07511610155578063db778d2f116100c9578063e985e9c511610083578063e985e9c514610f6a578063ebaf5a9314610fb1578063ecfc7ecc14610fdc578063f2fde38b14610fe4578063f77ee79d14611003578063f8d096961461102e575f80fd5b8063db778d2f14610e8d578063dd26d23014610ec1578063dd48b19f14610ee1578063e13f466714610f00578063e73cfbae14610f20578063e757223014610f3f575f80fd5b8063bdab728e1161011a578063bdab728e14610db9578063c21a222a14610dc1578063c23dc68f14610df5578063c865c29814610e21578063c87b56dd14610e4f578063d58f6a9c14610e6e575f80fd5b8063b57de07514610d4c578063b72ed2fd14610d5f578063b7a9fa6014610d73578063b88d4fde14610d87578063ba4bf14314610d9a575f80fd5b806397cf84fc116101f7578063a4fdbe26116101b1578063a4fdbe2614610c92578063a9852bfb14610cb1578063a9c51bcd14610cd0578063aa585d5614610cef578063aac5ab1f14610d0e578063b0de171f14610d2d575f80fd5b806397cf84fc14610bee57806399a2557a14610c0d5780639a19c14014610c2c5780639b5943e914610c4b5780639ebb125014610c5f578063a22cb46514610c73575f80fd5b80638d24cfa9116102485780638d24cfa914610b625780638da5cb5b14610b765780638fc455ee14610b935780638fd2b37714610ba757806393e52cdb14610bbb57806395d89b4114610bda575f80fd5b806381f6277d14610aad5780638462151c14610acc57806387e7f43614610af85780638942b33814610b175780638a5ea44f14610b4e575f80fd5b806342842e0e116103bc57806360702f7c11610330578063715018a6116102ea578063715018a6146109de57806372a896c3146109f2578063767d5be414610a0657806376ed1d2114610a3a5780637a11612f14610a5a5780637cb6475914610a8e575f80fd5b806360702f7c14610918578063607e27371461092c57806360ec12c5146109405780636128541c146109815780636352211e146109a057806370a08231146109bf575f80fd5b806353535de01161038157806353535de01461082b578063539421041461086c57806355f804b31461089a57806359ad1ea1146108b95780635a7e9619146108cd5780635bbb2177146108ec575f80fd5b806342842e0e14610786578063480c979c146107995780634b1c53b4146107cd5780635154380a146107e1578063531d4efe1461080c575f80fd5b806315984c27116104535780632a55205a116104185780632a55205a146106b45780632a82ff5a146106f25780632abe728a146107125780632e1a7d4d1461072957806335a9a5c71461074857806335e60bd414610767575f80fd5b806315984c271461065157806318160ddd1461066557806323b872dd1461067957806325a7e0db1461068c57806326a6f18b146106a0575f80fd5b8063095ea7b3116104a4578063095ea7b3146105ab5780630d341bbe146105be5780631053a815146105ea57806311d738af146105fe57806312686aae14610612578063153a1f3e14610632575f80fd5b806301ffc9a7146104e057806303f334901461051457806304634d8d1461053257806306fdde0314610553578063081812fc14610574575b5f80fd5b3480156104eb575f80fd5b506104ff6104fa36600461510e565b61104d565b60405190151581526020015b60405180910390f35b34801561051f575f80fd5b506028545b60405190815260200161050b565b34801561053d575f80fd5b5061055161054c36600461513f565b61106c565b005b34801561055e575f80fd5b50610567611082565b60405161050b91906151cc565b34801561057f575f80fd5b5061059361058e3660046151de565b611112565b6040516001600160a01b03909116815260200161050b565b6105516105b93660046151f5565b611154565b3480156105c9575f80fd5b506105dd6105d83660046151de565b6111f2565b60405161050b919061521d565b3480156105f5575f80fd5b5061055161125b565b348015610609575f80fd5b50602654610524565b34801561061d575f80fd5b506011546104ff90600160a01b900460ff1681565b34801561063d575f80fd5b5061055161064c36600461529d565b6112ab565b34801561065c575f80fd5b50610551611370565b348015610670575f80fd5b5061052461153b565b610551610687366004615303565b611547565b348015610697575f80fd5b50602254610524565b3480156106ab575f80fd5b50602054610524565b3480156106bf575f80fd5b506106d36106ce36600461533c565b6115bc565b604080516001600160a01b03909316835260208301919091520161050b565b3480156106fd575f80fd5b506011546104ff90600160b81b900460ff1681565b34801561071d575f80fd5b5060235460ff166104ff565b348015610734575f80fd5b506105516107433660046151de565b611668565b348015610753575f80fd5b5061055161076236600461535c565b61189c565b348015610772575f80fd5b50610551610781366004615384565b6118c6565b610551610794366004615303565b6118ec565b3480156107a4575f80fd5b506107b86107b33660046151de565b611906565b6040805192835260208301919091520161050b565b3480156107d8575f80fd5b50600d54610524565b3480156107ec575f80fd5b506105246107fb3660046151de565b5f908152601a602052604090205490565b348015610817575f80fd5b506105246108263660046151f5565b611ca7565b348015610836575f80fd5b506105246108453660046151f5565b6001600160a01b03919091165f908152601760209081526040808320938352929052205490565b348015610877575f80fd5b506104ff6108863660046151de565b5f908152601e602052604090205460ff1690565b3480156108a5575f80fd5b506105516108b436600461539d565b611d01565b3480156108c4575f80fd5b506105dd611d78565b3480156108d8575f80fd5b506105246108e73660046151f5565b611dd7565b3480156108f7575f80fd5b5061090b610906366004615408565b611e2a565b60405161050b9190615482565b348015610923575f80fd5b50602154610524565b348015610937575f80fd5b50610551611ef1565b34801561094b575f80fd5b5061052461095a3660046151f5565b6001600160a01b03919091165f908152601860209081526040808320938352929052205490565b34801561098c575f80fd5b5061055161099b3660046151de565b612252565b3480156109ab575f80fd5b506105936109ba3660046151de565b6122b9565b3480156109ca575f80fd5b506105246109d936600461535c565b6122c3565b3480156109e9575f80fd5b5061055161230f565b3480156109fd575f80fd5b50610551612320565b348015610a11575f80fd5b50610524610a2036600461535c565b6001600160a01b03165f9081526013602052604090205490565b348015610a45575f80fd5b506011546104ff90600160c01b900460ff1681565b348015610a65575f80fd5b50610524610a7436600461535c565b6001600160a01b03165f9081526014602052604090205490565b348015610a99575f80fd5b50610551610aa83660046151de565b6124a3565b348015610ab8575f80fd5b50601154610593906001600160a01b031681565b348015610ad7575f80fd5b50610aeb610ae636600461535c565b6124b0565b60405161050b91906154c3565b348015610b03575f80fd5b50610551610b1236600461533c565b6125b4565b348015610b22575f80fd5b506104ff610b3136600461535c565b6001600160a01b03165f9081526016602052604090205460ff1690565b348015610b59575f80fd5b506105516126ae565b348015610b6d575f80fd5b50602754610524565b348015610b81575f80fd5b50600a546001600160a01b0316610593565b348015610b9e575f80fd5b50610551612724565b348015610bb2575f80fd5b50610524612821565b348015610bc6575f80fd5b50610551610bd53660046151de565b612830565b348015610be5575f80fd5b5061056761292b565b348015610bf9575f80fd5b50610524610c0836600461535c565b61293a565b348015610c18575f80fd5b50610aeb610c273660046154fa565b612963565b348015610c37575f80fd5b506107b8610c4636600461535c565b612ae0565b348015610c56575f80fd5b50610551612b4d565b348015610c6a575f80fd5b50610551612c53565b348015610c7e575f80fd5b50610551610c8d36600461552a565b612d61565b348015610c9d575f80fd5b50610551610cac36600461529d565b612dcc565b348015610cbc575f80fd5b50610551610ccb36600461539d565b612e9c565b348015610cdb575f80fd5b50610551610cea366004615408565b612eb1565b348015610cfa575f80fd5b50610551610d0936600461555b565b6132ef565b348015610d19575f80fd5b50610551610d28366004615597565b6134e4565b348015610d38575f80fd5b50610524610d473660046151de565b6136f6565b610551610d5a366004615408565b6137cd565b348015610d6a575f80fd5b50601054610524565b348015610d7e575f80fd5b50610567613a46565b610551610d953660046155d3565b613a55565b348015610da5575f80fd5b50610551610db4366004615408565b613a9f565b610551613d88565b348015610dcc575f80fd5b50610524610ddb36600461535c565b6001600160a01b03165f9081526012602052604090205490565b348015610e00575f80fd5b50610e14610e0f3660046151de565b61421b565b60405161050b91906156a7565b348015610e2c575f80fd5b506104ff610e3b3660046151de565b5f908152601d602052604090205460ff1690565b348015610e5a575f80fd5b50610567610e693660046151de565b6142a0565b348015610e79575f80fd5b50610551610e883660046151de565b6143a4565b348015610e98575f80fd5b50610524610ea736600461535c565b6001600160a01b03165f9081526015602052604090205490565b348015610ecc575f80fd5b506011546104ff90600160a81b900460ff1681565b348015610eec575f80fd5b50610551610efb3660046151de565b61440b565b348015610f0b575f80fd5b506011546104ff90600160b01b900460ff1681565b348015610f2b575f80fd5b50610551610f3a3660046151de565b614418565b348015610f4a575f80fd5b50610524610f593660046151de565b5f908152601b602052604090205490565b348015610f75575f80fd5b506104ff610f843660046156b5565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b348015610fbc575f80fd5b50610524610fcb3660046151de565b5f9081526019602052604090205490565b6105516144e5565b348015610fef575f80fd5b50610551610ffe36600461535c565b6146c1565b34801561100e575f80fd5b5061052461101d3660046151de565b5f908152601c602052604090205490565b348015611039575f80fd5b506105516110483660046151de565b6146fb565b5f61105782614761565b806110665750611066826147ae565b92915050565b6110746147e2565b61107e828261480f565b5050565b606060028054611091906156cf565b80601f01602080910402602001604051908101604052809291908181526020018280546110bd906156cf565b80156111085780601f106110df57610100808354040283529160200191611108565b820191905f5260205f20905b8154815290600101906020018083116110eb57829003601f168201915b5050505050905090565b5f61111c826148b1565b611139576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f61115e826122b9565b9050336001600160a01b038216146111975761117a8133610f84565b611197576040516367d9dca160e11b815260040160405180910390fd5b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f818152601f602090815260409182902080548351818402810184019094528084526060939283018282801561124f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611231575b50505050509050919050565b6112636147e2565b600c805460ff191660011790556040517fc6a6c2b165e62c9d37fc51a18ed76e5be22304bc1d337877c98f31c23e40b0f5906112a190600e90615707565b60405180910390a1565b82811461130e5760405162461bcd60e51b815260206004820152602660248201527f52656365697665727320616e64204944732061726520646966666572656e74206044820152650d8cadccee8d60d31b60648201526084015b60405180910390fd5b5f5b83811015611369576113613386868481811061132e5761132e615791565b9050602002016020810190611343919061535c565b85858581811061135557611355615791565b90506020020135611547565b600101611310565b5050505050565b6113786147e2565b42602654116113d95760405162461bcd60e51b815260206004820152602760248201527f53746172742074696d65206d75737420636f6d652061667465722063757272656044820152666e742074696d6560c81b6064820152608401611305565b601154600160b01b900460ff16156114335760405162461bcd60e51b815260206004820181905260248201527f5075626c69632061756374696f6e2068617320616c726561647920656e6465646044820152606401611305565b601154600160c01b900460ff1661145c5760405162461bcd60e51b8152600401611305906157a5565b7f00000000000000000000000000000000000000000000000000000000000000006114c77f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006157fa565b6114d191906157fa565b6114d961153b565b146115265760405162461bcd60e51b815260206004820181905260248201527f4f746865722073616c6573206d7573742068617665207465726d696e617465646044820152606401611305565b6011805460ff60a81b1916600160a81b179055565b6001545f54035f190190565b601154600160a01b900460ff16156115ac5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74207472616e73666572202d2063757272656e746c79206c6f636b604482015261195960f21b6064820152608401611305565b6115b78383836148e3565b505050565b5f8281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916116305750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f906127109061164e906001600160601b03168761580d565b6116589190615838565b91519350909150505b9250929050565b611670614a72565b6116786147e2565b80611681612821565b1161169e5760405162461bcd60e51b81526004016113059061584b565b5f818152601b6020526040902054158015906116c657505f818152601c602052604090205415155b6116e25760405162461bcd60e51b815260040161130590615882565b5f818152601d602052604090205460ff16156117105760405162461bcd60e51b8152600401611305906158b7565b5f818152601a6020908152604080832054601b90925290912054036117775760405162461bcd60e51b815260206004820152601760248201527f5370656369616c20636173653a206e6f2077696e6e65720000000000000000006044820152606401611305565b5f818152601c6020908152604080832054601b90925282205461179a919061580d565b5f838152601a60205260409020549091508111156117ca5760405162461bcd60e51b8152600401611305906158e2565b6011546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611814576040519150601f19603f3d011682016040523d82523d5f602084013e611819565b606091505b505090508061183b57604051631d42c86760e21b815260040160405180910390fd5b5f838152601d602052604090819020805460ff19166001179055517f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d906118859084815260200190565b60405180910390a150506118996001600b55565b50565b6118a46147e2565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6118ce6147e2565b60118054911515600160a01b0260ff60a01b19909216919091179055565b6115b783838360405180602001604052805f815250613a55565b5f8082611911612821565b1161192e5760405162461bcd60e51b81526004016113059061584b565b5f838152601f6020526040812054900361194d57505f92600192509050565b60375f7f0000000000000000000000000000000000000000000000000000000000000000611982866680000000000000614acb565b10156119f0575f611994600184615929565b90505b80156119ea577f00000000000000000000000000000000000000000000000000000000000000006119cb876001841b614acb565b106119d8578091506119ea565b806119e28161593c565b915050611997565b50611a58565b5f6119fc8360016157fa565b90505b605a811015611a56577f0000000000000000000000000000000000000000000000000000000000000000611a36876001841b614acb565b1015611a4e57611a47600182615929565b9150611a56565b6001016119ff565b505b600180821b905f90611a6b9084906157fa565b6001901b90505f5b81831015611ade576002611a8783856157fa565b611a919190615838565b90507f0000000000000000000000000000000000000000000000000000000000000000611abe8983614acb565b1015611acc57809150611a73565b611ad78160016157fa565b9250611a73565b7f0000000000000000000000000000000000000000000000000000000000000000611b1389611b0e600187615929565b614acb565b03611b5157611b23600184615929565b987f000000000000000000000000000000000000000000000000000000000000000098509650505050505050565b5f611b5c8985614acb565b9050805f03611b82575050505f9586525050601a60205250506040909120549160019150565b84955080611b948a886001901b614acb565b1015611be2575f611ba6600188615929565b90505b8015611bdc5781611bbd8b6001841b614acb565b10611bca57809550611bdc565b80611bd48161593c565b915050611ba9565b50611c2a565b5f611bee8760016157fa565b90505b605a811015611c285781611c088b6001841b614acb565b1015611c2057611c19600182615929565b9550611c28565b600101611bf1565b505b600180861b9450611c3c9086906157fa565b6001901b92505b82841015611c8e576002611c5784866157fa565b611c619190615838565b915080611c6e8a84614acb565b1015611c7c57819250611c43565b611c878260016157fa565b9350611c43565b611c99600185615929565b999098509650505050505050565b5f818152601b60205260408120548103611cc257505f611066565b5f828152601b60209081526040808320546001600160a01b03871684526017835281842086855290925290912054611cfa9190615838565b9392505050565b611d096147e2565b600c5460ff1615611d2d576040516306ccad4160e41b815260040160405180910390fd5b600e611d3a828483615995565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa8282604051611d6c929190615a4e565b60405180910390a15050565b6060602480548060200260200160405190810160405280929190818152602001828054801561110857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611db0575050505050905090565b5f818152601b60205260408120548103611df257505f611066565b5f828152601b60209081526040808320546001600160a01b03871684526017835281842086855290925290912054611cfa9190615a7c565b6060815f816001600160401b03811115611e4657611e466155bf565b604051908082528060200260200182016040528015611e9657816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181611e645790505b5090505f5b828114611ee857611ec3868683818110611eb757611eb7615791565b9050602002013561421b565b828281518110611ed557611ed5615791565b6020908102919091010152600101611e9b565b50949350505050565b611ef9614a72565b601154600160a81b900460ff168015611f1c5750601154600160b01b900460ff16155b8015611f2a57504260265411155b611f465760405162461bcd60e51b815260040161130590615a8f565b335f90815260126020526040902054601054611f6690610d479042615929565b11611fa55760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401611305565b5f80611fb033612ae0565b915091505f821180611fc157505f81115b61200d5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7468696e6720746f20636c61696d206f7220726566756e640000000000006044820152606401611305565b6040515f90339083908381818185875af1925050503d805f811461204c576040519150601f19603f3d011682016040523d82523d5f602084013e612051565b606091505b505090508061207357604051631d42c86760e21b815260040160405180910390fd5b82156121cd57612081612821565b61208c9060016157fa565b6120b6907f000000000000000000000000000000000000000000000000000000000000000061580d565b7f00000000000000000000000000000000000000000000000000000000000000006121217f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006157fa565b61212b91906157fa565b61213591906157fa565b8361213e61153b565b61214891906157fa565b11156121965760405162461bcd60e51b815260206004820152601a60248201527f457863656564732063757272656e74206d617820737570706c790000000000006044820152606401611305565b6121a03384614b5e565b335f90815260136020526040812080548592906121be9084906157fa565b909155506121cd905033614b77565b5f6121df60105442610d479190615929565b90505b335f9081526012602052604090205481111561224257601c5f612206600184615929565b81526020019081526020015f20545f1461223057335f908152601260205260409020819055612242565b8061223a8161593c565b9150506121e2565b505050506122506001600b55565b565b61225a6147e2565b601154600160c01b900460ff16156122b45760405162461bcd60e51b815260206004820152601d60248201527f507269766174652061756374696f6e20616c726561647920656e6465640000006044820152606401611305565b602855565b5f61106682614c98565b5f6001600160a01b0382166122eb576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03165f908152600560205260409020546001600160401b031690565b6123176147e2565b6122505f614d01565b612328614a72565b6123306147e2565b601154600160c01b900460ff166123595760405162461bcd60e51b8152600401611305906157a5565b5f60215411801561236b57505f602254115b6123875760405162461bcd60e51b815260040161130590615882565b60235460ff16156123aa5760405162461bcd60e51b8152600401611305906158b7565b5f6022546021546123bb919061580d565b90506020548111156123df5760405162461bcd60e51b8152600401611305906158e2565b6011546040515f916001600160a01b03169083908381818185875af1925050503d805f8114612429576040519150601f19603f3d011682016040523d82523d5f602084013e61242e565b606091505b505090508061245057604051631d42c86760e21b815260040160405180910390fd5b6023805460ff191660011790556040517f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9061248f9084815260200190565b60405180910390a150506122506001600b55565b6124ab6147e2565b602555565b60605f805f6124be856122c3565b90505f816001600160401b038111156124d9576124d96155bf565b604051908082528060200260200182016040528015612502578160200160208202803683370190505b50905061252e604080516080810182525f80825260208201819052918101829052606081019190915290565b60015b8386146125a85761254181614d52565b915081604001516125a05781516001600160a01b03161561256157815194505b876001600160a01b0316856001600160a01b0316036125a0578083878060010198508151811061259357612593615791565b6020026020010181815250505b600101612531565b50909695505050505050565b6125bc6147e2565b601154600160c01b900460ff166125e55760405162461bcd60e51b8152600401611305906157a5565b7f00000000000000000000000000000000000000000000000000000000000000008111156126555760405162461bcd60e51b815260206004820152601a60248201527f537570706c792063616e6e6f7420657863656564206c696d69740000000000006044820152606401611305565b60235460ff16156126785760405162461bcd60e51b8152600401611305906158b7565b602054612685828461580d565b11156126a35760405162461bcd60e51b8152600401611305906158e2565b602191909155602255565b6126b66147e2565b601154600160a81b900460ff1661270f5760405162461bcd60e51b815260206004820152601e60248201527f5075626c69632061756374696f6e20686173206e6f74207374617274656400006044820152606401611305565b6011805460ff60b01b1916600160b01b179055565b61272c6147e2565b6028545f0361274d5760405162461bcd60e51b815260040161130590615ac6565b601154600160b81b900460ff166127a65760405162461bcd60e51b815260206004820152601f60248201527f507269766174652061756374696f6e20686173206e6f742073746172746564006044820152606401611305565b60285442101561280c5760405162461bcd60e51b815260206004820152602b60248201527f507269766174652061756374696f6e20656e642074696d6520686173206e6f7460448201526a081c185cdcd959081e595d60aa1b6064820152608401611305565b6011805460ff60c01b1916600160c01b179055565b5f61282b426136f6565b905090565b80612839612821565b116128565760405162461bcd60e51b81526004016113059061584b565b5f818152601e602052604090205460ff16156128ad5760405162461bcd60e51b8152602060048201526016602482015275141c9a58d948185b1c9958591e4818dbdb5c1d5d195960521b6044820152606401611305565b80156128ed57601c5f6128c1600184615929565b81526020019081526020015f20545f036128ed5760405162461bcd60e51b815260040161130590615b0e565b5f818152601e60205260409020805460ff1916600117905561290e81611906565b5f928352601b60209081526040808520601c909252909320559055565b606060038054611091906156cf565b6001600160a01b0381165f90815260056020526040808220546001600160401b03911c16611066565b606081831061298557604051631960ccad60e11b815260040160405180910390fd5b5f8061298f5f5490565b9050600185101561299f57600194505b808411156129ab578093505b5f6129b5876122c3565b9050848610156129d457858503818110156129ce578091505b506129d7565b505f5b5f816001600160401b038111156129f0576129f06155bf565b604051908082528060200260200182016040528015612a19578160200160208202803683370190505b509050815f03612a2e579350611cfa92505050565b5f612a388861421b565b90505f8160400151612a48575080515b885b888114158015612a5a5750848714155b15612acf57612a6881614d52565b92508260400151612ac75782516001600160a01b031615612a8857825191505b8a6001600160a01b0316826001600160a01b031603612ac75780848880600101995081518110612aba57612aba615791565b6020026020010181815250505b600101612a4a565b505050928352509095945050505050565b6001600160a01b0381165f9081526012602052604081205481905b612b0c60105442610d479190615929565b811015612b4757612b1d8482611ca7565b612b2790846157fa565b9250612b338482611dd7565b612b3d90836157fa565b9150600101612afb565b50915091565b612b556147e2565b6027545f03612bb95760405162461bcd60e51b815260206004820152602a60248201527f507269766174652061756374696f6e2073746172742074696d65206e6f7420696044820152691b9a5d1a585b1a5e995960b21b6064820152608401611305565b6028545f03612bda5760405162461bcd60e51b815260040161130590615ac6565b601154600160c01b900460ff1615612c3e5760405162461bcd60e51b815260206004820152602160248201527f507269766174652061756374696f6e2068617320616c726561647920656e64656044820152601960fa1b6064820152608401611305565b6011805460ff60b81b1916600160b81b179055565b612c5b614a72565b612c636147e2565b601154600160b01b900460ff16612cbc5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632061756374696f6e20686173206e6f7420656e646564000000006044820152606401611305565b60115460405147915f916001600160a01b039091169083908381818185875af1925050503d805f8114612d0a576040519150601f19603f3d011682016040523d82523d5f602084013e612d0f565b606091505b5050905080612d3157604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200161248f565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612dd46147e2565b828114612e395760405162461bcd60e51b815260206004820152602d60248201527f52656365697665727320616e64207175616e746974696573206172652064696660448201526c0cccae4cadce840d8cadccee8d609b1b6064820152608401611305565b5f5b8381101561136957612e94838383818110612e5857612e58615791565b9050602002016020810190612e6d9190615b53565b868684818110612e7f57612e7f615791565b9050602002016020810190610d28919061535c565b600101612e3b565b612ea46147e2565b600f6115b7828483615995565b612eb9614a72565b612ec16147e2565b601154600160c01b900460ff16612eea5760405162461bcd60e51b8152600401611305906157a5565b5f602154118015612efc57505f602254115b612f185760405162461bcd60e51b815260040161130590615882565b5f5b818110156132495760165f848484818110612f3757612f37615791565b9050602002016020810190612f4c919061535c565b6001600160a01b0316815260208101919091526040015f205460ff16613241575f838383818110612f7f57612f7f615791565b9050602002016020810190612f94919061535c565b6001600160a01b031660215460145f878787818110612fb557612fb5615791565b9050602002016020810190612fca919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f2054612ff49190615a7c565b6040515f81818185875af1925050503d805f811461302d576040519150601f19603f3d011682016040523d82523d5f602084013e613032565b606091505b505090508061305457604051631d42c86760e21b815260040160405180910390fd5b5f60215460145f87878781811061306d5761306d615791565b9050602002016020810190613082919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f20546130ac9190615838565b11156131ec576131388484848181106130c7576130c7615791565b90506020020160208101906130dc919061535c565b60215460145f8888888181106130f4576130f4615791565b9050602002016020810190613109919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f20546131339190615838565b614b5e565b60215460145f86868681811061315057613150615791565b9050602002016020810190613165919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f205461318f9190615838565b60155f8686868181106131a4576131a4615791565b90506020020160208101906131b9919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f8282546131e691906157fa565b90915550505b600160165f86868681811061320357613203615791565b9050602002016020810190613218919061535c565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055505b600101612f1a565b507f00000000000000000000000000000000000000000000000000000000000000006132b57f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006157fa565b6132bf91906157fa565b6132c761153b565b11156132e55760405162461bcd60e51b815260040161130590615b6c565b61107e6001600b55565b6132f76147e2565b82613300612821565b1161331d5760405162461bcd60e51b81526004016113059061584b565b5f838152601e602052604090205460ff16156133745760405162461bcd60e51b8152602060048201526016602482015275141c9a58d948185b1c9958591e4818dbdb5c1d5d195960521b6044820152606401611305565b7f00000000000000000000000000000000000000000000000000000000000000008111156133e45760405162461bcd60e51b815260206004820152601a60248201527f537570706c792063616e6e6f7420657863656564206c696d69740000000000006044820152606401611305565b5f838152601d602052604090205460ff16156134125760405162461bcd60e51b8152600401611305906158b7565b5f81116134515760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081a5b9c1d5d609a1b6044820152606401611305565b5f838152601a6020526040902054613469828461580d565b11156134875760405162461bcd60e51b8152600401611305906158e2565b82156134c757601c5f61349b600186615929565b81526020019081526020015f20545f036134c75760405162461bcd60e51b815260040161130590615b0e565b5f928352601b6020908152604080852093909355601c9052912055565b6134ec6147e2565b8163ffffffff16600d54816134ff61153b565b61350991906157fa565b11156135285760405163800113cb60e01b815260040160405180910390fd5b601154600160a81b900460ff16156135a857601154600160b01b900460ff166135a35760405162461bcd60e51b815260206004820152602760248201527f4f776e65722063616e6e6f74206d696e7420647572696e67207075626c69632060448201526630bab1ba34b7b760c91b6064820152608401611305565b6136e6565b601154600160c01b900460ff1661363a576136037f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006157fa565b8363ffffffff1661361261153b565b61361c91906157fa565b11156135a35760405162461bcd60e51b815260040161130590615b6c565b7f00000000000000000000000000000000000000000000000000000000000000006136a57f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006157fa565b6136af91906157fa565b8363ffffffff166136be61153b565b6136c891906157fa565b11156136e65760405162461bcd60e51b815260040161130590615b6c565b6115b7828463ffffffff16614b5e565b6011545f90600160a81b900460ff16801561371357506026548210155b61375f5760405162461bcd60e51b815260206004820152601e60248201527f5075626c69632061756374696f6e20686173206e6f74207374617274656400006044820152606401611305565b62093a80602654836137719190615929565b61377b9190615838565b90507f00000000000000000000000000000000000000000000000000000000000000008111156137c857507f00000000000000000000000000000000000000000000000000000000000000005b919050565b6137d5614a72565b601154600160b81b900460ff1680156137f85750601154600160c01b900460ff16155b6138445760405162461bcd60e51b815260206004820152601f60248201527f507269766174652061756374696f6e206e6f7420696e2070726f6772657373006044820152606401611305565b426027541115801561385857506028544211155b6138985760405162461bcd60e51b81526020600482015260116024820152700496e76616c69642074696d657374616d7607c1b6044820152606401611305565b6025546139108383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506040516bffffffffffffffffffffffff193360601b16602082015260340191506138f59050565b60405160208183030381529060405280519060200120614d8c565b146139505760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b6044820152606401611305565b5f34116139ab5760405162461bcd60e51b8152602060048201526024808201527f42696420616d6f756e74206d7573742062652067726561746572207468616e206044820152637a65726f60e01b6064820152608401611305565b335f908152601460205260408120549003613a0257602480546001810182555f919091527f7cd332d19b93bcabe3cce7ca0c18a052f57e5fd03b4758a09f30f5ddc4b22ec40180546001600160a01b031916331790555b335f9081526014602052604081208054349290613a209084906157fa565b925050819055503460205f828254613a3891906157fa565b90915550506001600b555050565b6060600f8054611091906156cf565b613a60848484611547565b6001600160a01b0383163b15613a9957613a7c84848484614dce565b613a99576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b613aa7614a72565b613aaf6147e2565b601154600160b01b900460ff16613b085760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632061756374696f6e20686173206e6f7420656e646564000000006044820152606401611305565b5f5b81811015613d7c577f000000000000000000000000000000000000000000000000000000000000000060125f858585818110613b4857613b48615791565b9050602002016020810190613b5d919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f20541015613d74575f80613baf858585818110613b9a57613b9a615791565b9050602002016020810190610c46919061535c565b915091505f858585818110613bc657613bc6615791565b9050602002016020810190613bdb919061535c565b6001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613c22576040519150601f19603f3d011682016040523d82523d5f602084013e613c27565b606091505b5050905080613c4957604051631d42c86760e21b815260040160405180910390fd5b8215613d0c57613c7f868686818110613c6457613c64615791565b9050602002016020810190613c79919061535c565b84614b5e565b8260135f888888818110613c9557613c95615791565b9050602002016020810190613caa919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254613cd791906157fa565b90915550613d0c9050868686818110613cf257613cf2615791565b9050602002016020810190613d07919061535c565b614b77565b7f000000000000000000000000000000000000000000000000000000000000000060125f888888818110613d4257613d42615791565b9050602002016020810190613d57919061535c565b6001600160a01b0316815260208101919091526040015f20555050505b600101613b0a565b50600d546132c761153b565b613d90614a72565b601154600160a81b900460ff168015613db35750601154600160b01b900460ff16155b8015613dc157504260265411155b613ddd5760405162461bcd60e51b815260040161130590615a8f565b335f90815260126020526040902054601054613dfd90610d479042615929565b11613e3c5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401611305565b7f0000000000000000000000000000000000000000000000000000000000000000613e65612821565b10613ea65760405162461bcd60e51b8152602060048201526011602482015270105d58dd1a5bdb881a185cc8195b991959607a1b6044820152606401611305565b5f80613eb133612ae0565b915091505f821180613ec257505f81115b613f0e5760405162461bcd60e51b815260206004820152601960248201527f4e6f7468696e6720746f20636c61696d206f722072656c6179000000000000006044820152606401611305565b613f3960027f0000000000000000000000000000000000000000000000000000000000000000615c78565b613f4382346157fa565b11613f605760405162461bcd60e51b815260040161130590615c86565b335f90815260176020526040812090613f77612821565b81526020019081526020015f20545f03613fc857601f5f613f96612821565b81526020808201929092526040015f90812080546001810182559082529190200180546001600160a01b031916331790555b613fd281346157fa565b335f90815260176020526040812090613fe9612821565b81526020019081526020015f205f82825461400491906157fa565b90915550614014905081346157fa565b601a5f61401f612821565b81526020019081526020015f205f82825461403a91906157fa565b909155505081156141995761404d612821565b6140589060016157fa565b614082907f000000000000000000000000000000000000000000000000000000000000000061580d565b7f00000000000000000000000000000000000000000000000000000000000000006140ed7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006157fa565b6140f791906157fa565b61410191906157fa565b8261410a61153b565b61411491906157fa565b11156141625760405162461bcd60e51b815260206004820152601a60248201527f457863656564732063757272656e74206d617820737570706c790000000000006044820152606401611305565b61416c3383614b5e565b335f908152601360205260408120805484929061418a9084906157fa565b90915550614199905033614b77565b5f6141ab60105442610d479190615929565b90505b335f9081526012602052604090205481111561420e57601c5f6141d2600184615929565b81526020019081526020015f20545f146141fc57335f90815260126020526040902081905561420e565b806142068161593c565b9150506141ae565b5050506122506001600b55565b604080516080810182525f808252602082018190529181018290526060810191909152604080516080810182525f808252602082018190529181018290526060810191909152600183108061427157505f548310155b1561427c5792915050565b61428583614d52565b90508060400151156142975792915050565b611cfa83614eb5565b60606142ab826148b1565b6142c857604051630a14c4b560e41b815260040160405180910390fd5b5f600e80546142d6906156cf565b80601f0160208091040260200160405190810160405280929190818152602001828054614302906156cf565b801561434d5780601f106143245761010080835404028352916020019161434d565b820191905f5260205f20905b81548152906001019060200180831161433057829003601f168201915b5050505050905080515f036143705760405180602001604052805f815250611cfa565b8061437a84614ee9565b600f60405160200161438e93929190615ccd565b6040516020818303038152906040529392505050565b6143ac6147e2565b601154600160b81b900460ff16156144065760405162461bcd60e51b815260206004820152601f60248201527f507269766174652061756374696f6e20616c72656164792073746172746564006044820152606401611305565b602755565b6144136147e2565b601055565b6144206147e2565b601154600160a81b900460ff161561447a5760405162461bcd60e51b815260206004820152601e60248201527f5075626c69632061756374696f6e20616c7265616479207374617274656400006044820152606401611305565b4281118015614494575062093a806144924283615929565b105b6144e05760405162461bcd60e51b815260206004820152601e60248201527f54696d65206e6f7420696e20617070726f7072696174652077696e646f7700006044820152606401611305565b602655565b6144ed614a72565b601154600160a81b900460ff1680156145105750601154600160b01b900460ff16155b801561451e57504260265411155b61453a5760405162461bcd60e51b815260040161130590615a8f565b7f0000000000000000000000000000000000000000000000000000000000000000614563612821565b106145a45760405162461bcd60e51b8152602060048201526011602482015270105d58dd1a5bdb881a185cc8195b991959607a1b6044820152606401611305565b6145cf60027f0000000000000000000000000000000000000000000000000000000000000000615c78565b34116145ed5760405162461bcd60e51b815260040161130590615c86565b335f90815260176020526040812090614604612821565b81526020019081526020015f20545f0361465557601f5f614623612821565b81526020808201929092526040015f90812080546001810182559082529190200180546001600160a01b031916331790555b335f908152601760205260408120349161466d612821565b81526020019081526020015f205f82825461468891906157fa565b90915550349050601a5f61469a612821565b81526020019081526020015f205f8282546146b591906157fa565b90915550506001600b55565b6146c96147e2565b6001600160a01b0381166146f257604051631e4fbdf760e01b81525f6004820152602401611305565b61189981614d01565b6147036147e2565b600d548111156147265760405163430b83b160e11b815260040160405180910390fd5b600d8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a9060200160405180910390a150565b5f6301ffc9a760e01b6001600160e01b03198316148061479157506380ac58cd60e01b6001600160e01b03198316145b806110665750506001600160e01b031916635b5e139f60e01b1490565b5f6001600160e01b0319821663152a902d60e11b148061106657506301ffc9a760e01b6001600160e01b0319831614611066565b600a546001600160a01b031633146122505760405163118cdaa760e01b8152336004820152602401611305565b6127106001600160601b03821681101561484e57604051636f483d0960e01b81526001600160601b038316600482015260248101829052604401611305565b6001600160a01b03831661487757604051635b6cc80560e11b81525f6004820152602401611305565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b5f816001111580156148c357505f5482105b80156110665750505f90815260046020526040902054600160e01b161590565b5f6148ed82614c98565b9050836001600160a01b0316816001600160a01b0316146149205760405162a1148160e81b815260040160405180910390fd5b5f8281526006602052604090208054338082146001600160a01b0388169091141761496c5761494f8633610f84565b61496c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661499357604051633a954ecd60e21b815260040160405180910390fd5b801561499d575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b84169003614a2957600184015f818152600460205260408120549003614a27575f548114614a27575f8181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6002600b5403614ac45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611305565b6002600b55565b5f828152601f6020526040812054815b81811015614b56578360175f601f5f8981526020019081526020015f208481548110614b0957614b09615791565b5f9182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902054614b429190615838565b614b4c90846157fa565b9250600101614adb565b505092915050565b61107e828260405180602001604052805f815250614f2c565b6001600160a01b0381165f908152601260205260409020545b614ba160105442610d479190615929565b81101561107e57614bb28282611ca7565b5f8281526019602052604081208054909190614bcf9084906157fa565b90915550505f818152601c60209081526040808320546019909252909120541115614c4f5760405162461bcd60e51b815260206004820152602a60248201527f546f74616c20636c61696d656420706572207765656b2063616e6e6f7420657860448201526918d95959081b1a5b5a5d60b21b6064820152608401611305565b614c598282611ca7565b6001600160a01b0383165f90815260186020908152604080832085845290915281208054909190614c8b9084906157fa565b9091555050600101614b90565b5f8180600111614ce8575f54811015614ce8575f8181526004602052604081205490600160e01b82169003614ce6575b805f03611cfa57505f19015f81815260046020526040902054614cc8565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604080516080810182525f8082526020820181905291810182905260608101919091525f8281526004602052604090205461106690614f8e565b5f81815b8451811015614dc657614dbc82868381518110614daf57614daf615791565b6020026020010151614fd5565b9150600101614d90565b509392505050565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290614e02903390899088908890600401615d6b565b6020604051808303815f875af1925050508015614e3c575060408051601f3d908101601f19168201909252614e3991810190615da7565b60015b614e98573d808015614e69576040519150601f19603f3d011682016040523d82523d5f602084013e614e6e565b606091505b5080515f03614e90576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516080810182525f808252602082018190529181018290526060810191909152611066614ee483614c98565b614f8e565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a900480614f025750819003601f19909101908152919050565b614f368383615001565b6001600160a01b0383163b156115b7575f548281035b614f5e5f868380600101945086614dce565b614f7b576040516368d2bf6b60e11b815260040160405180910390fd5b818110614f4c57815f5414611369575f80fd5b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b5f818310614fef575f828152602084905260409020611cfa565b5f838152602083905260409020611cfa565b5f8054908290036150255760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383165f8181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146150d15780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460010161509b565b50815f036150f157604051622e076360e81b815260040160405180910390fd5b5f5550505050565b6001600160e01b031981168114611899575f80fd5b5f6020828403121561511e575f80fd5b8135611cfa816150f9565b80356001600160a01b03811681146137c8575f80fd5b5f8060408385031215615150575f80fd5b61515983615129565b915060208301356001600160601b0381168114615174575f80fd5b809150509250929050565b5f5b83811015615199578181015183820152602001615181565b50505f910152565b5f81518084526151b881602086016020860161517f565b601f01601f19169290920160200192915050565b602081525f611cfa60208301846151a1565b5f602082840312156151ee575f80fd5b5035919050565b5f8060408385031215615206575f80fd5b61520f83615129565b946020939093013593505050565b602080825282518282018190525f9190848201906040850190845b818110156125a85783516001600160a01b031683529284019291840191600101615238565b5f8083601f84011261526d575f80fd5b5081356001600160401b03811115615283575f80fd5b6020830191508360208260051b8501011115611661575f80fd5b5f805f80604085870312156152b0575f80fd5b84356001600160401b03808211156152c6575f80fd5b6152d28883890161525d565b909650945060208701359150808211156152ea575f80fd5b506152f78782880161525d565b95989497509550505050565b5f805f60608486031215615315575f80fd5b61531e84615129565b925061532c60208501615129565b9150604084013590509250925092565b5f806040838503121561534d575f80fd5b50508035926020909101359150565b5f6020828403121561536c575f80fd5b611cfa82615129565b803580151581146137c8575f80fd5b5f60208284031215615394575f80fd5b611cfa82615375565b5f80602083850312156153ae575f80fd5b82356001600160401b03808211156153c4575f80fd5b818501915085601f8301126153d7575f80fd5b8135818111156153e5575f80fd5b8660208285010111156153f6575f80fd5b60209290920196919550909350505050565b5f8060208385031215615419575f80fd5b82356001600160401b0381111561542e575f80fd5b61543a8582860161525d565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b602080825282518282018190525f9190848201906040850190845b818110156125a8576154b0838551615446565b928401926080929092019160010161549d565b602080825282518282018190525f9190848201906040850190845b818110156125a8578351835292840192918401916001016154de565b5f805f6060848603121561550c575f80fd5b61551584615129565b95602085013595506040909401359392505050565b5f806040838503121561553b575f80fd5b61554483615129565b915061555260208401615375565b90509250929050565b5f805f6060848603121561556d575f80fd5b505081359360208301359350604090920135919050565b803563ffffffff811681146137c8575f80fd5b5f80604083850312156155a8575f80fd5b6155b183615584565b915061555260208401615129565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156155e6575f80fd5b6155ef85615129565b93506155fd60208601615129565b92506040850135915060608501356001600160401b038082111561561f575f80fd5b818701915087601f830112615632575f80fd5b813581811115615644576156446155bf565b604051601f8201601f19908116603f0116810190838211818310171561566c5761566c6155bf565b816040528281528a6020848701011115615684575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b608081016110668284615446565b5f80604083850312156156c6575f80fd5b6155b183615129565b600181811c908216806156e357607f821691505b60208210810361570157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454615719816156cf565b806020870152604060018084165f811461573a576001811461575657615783565b60ff19851660408a0152604084151560051b8a01019550615783565b895f5260205f205f5b8581101561577a5781548b820186015290830190880161575f565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b60208082526021908201527f507269766174652061756374696f6e20686173206e6f7420656e6465642079656040820152601d60fa1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611066576110666157e6565b8082028115828204841417611066576110666157e6565b634e487b7160e01b5f52601260045260245ffd5b5f8261584657615846615824565b500490565b60208082526019908201527f41756374696f6e20686173206e6f7420656e6465642079657400000000000000604082015260600190565b6020808252818101527f507269636520616e6420737570706c79206e6f7420696e697469616c697a6564604082015260600190565b60208082526011908201527020b63932b0b23c903bb4ba34323930bbb760791b604082015260600190565b60208082526027908201527f576974686472617720616d6f756e742063616e6e6f742065786365656420746f6040820152661d185b08189a5960ca1b606082015260800190565b81810381811115611066576110666157e6565b5f8161594a5761594a6157e6565b505f190190565b601f8211156115b757805f5260205f20601f840160051c810160208510156159765750805b601f840160051c820191505b81811015611369575f8155600101615982565b6001600160401b038311156159ac576159ac6155bf565b6159c0836159ba83546156cf565b83615951565b5f601f8411600181146159f1575f85156159da5750838201355b5f19600387901b1c1916600186901b178355611369565b5f83815260208120601f198716915b82811015615a205786850135825560209485019460019092019101615a00565b5086821015615a3c575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f82615a8a57615a8a615824565b500690565b6020808252601e908201527f5075626c69632061756374696f6e206e6f7420696e2070726f67726573730000604082015260600190565b60208082526028908201527f507269766174652061756374696f6e20656e642074696d65206e6f7420696e696040820152671d1a585b1a5e995960c21b606082015260800190565b60208082526025908201527f4d75737420686176652073657420707269636520666f722070726576696f7573604082015264207765656b60d81b606082015260800190565b5f60208284031215615b63575f80fd5b611cfa82615584565b602080825260129082015271115e18d959591cc81b5a5b9d081b1a5b5a5d60721b604082015260600190565b600181815b80851115615bd257815f1904821115615bb857615bb86157e6565b80851615615bc557918102915b93841c9390800290615b9d565b509250929050565b5f82615be857506001611066565b81615bf457505f611066565b8160018114615c0a5760028114615c1457615c30565b6001915050611066565b60ff841115615c2557615c256157e6565b50506001821b611066565b5060208310610133831016604e8410600b8410161715615c53575081810a611066565b615c5d8383615b98565b805f1904821115615c7057615c706157e6565b029392505050565b5f611cfa60ff841683615bda565b60208082526027908201527f42696420616d6f756e74206d7573742062652067726561746572207468616e206040820152666d696e696d756d60c81b606082015260800190565b5f84516020615ce0828560208a0161517f565b855191840191615cf4818460208a0161517f565b85549201915f90615d04816156cf565b60018281168015615d1c5760018114615d3157615d5b565b60ff1984168752821515830287019450615d5b565b895f5260205f205f5b84811015615d5357815489820152908301908701615d3a565b505082870194505b50929a9950505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90615d9d908301846151a1565b9695505050505050565b5f60208284031215615db7575f80fd5b8151611cfa816150f956fea26469706673582212204a8b86f982c0d4e477388d5c3ca59520d4933ba4ffd02a7f3bf45df536feb8a364736f6c63430008180033687474703a2f2f6d657461646174612e776164652e636c75622f77616465736964652f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008574144455349444500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085741444553494445000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106104dc575f3560e01c806381f6277d11610283578063b57de07511610155578063db778d2f116100c9578063e985e9c511610083578063e985e9c514610f6a578063ebaf5a9314610fb1578063ecfc7ecc14610fdc578063f2fde38b14610fe4578063f77ee79d14611003578063f8d096961461102e575f80fd5b8063db778d2f14610e8d578063dd26d23014610ec1578063dd48b19f14610ee1578063e13f466714610f00578063e73cfbae14610f20578063e757223014610f3f575f80fd5b8063bdab728e1161011a578063bdab728e14610db9578063c21a222a14610dc1578063c23dc68f14610df5578063c865c29814610e21578063c87b56dd14610e4f578063d58f6a9c14610e6e575f80fd5b8063b57de07514610d4c578063b72ed2fd14610d5f578063b7a9fa6014610d73578063b88d4fde14610d87578063ba4bf14314610d9a575f80fd5b806397cf84fc116101f7578063a4fdbe26116101b1578063a4fdbe2614610c92578063a9852bfb14610cb1578063a9c51bcd14610cd0578063aa585d5614610cef578063aac5ab1f14610d0e578063b0de171f14610d2d575f80fd5b806397cf84fc14610bee57806399a2557a14610c0d5780639a19c14014610c2c5780639b5943e914610c4b5780639ebb125014610c5f578063a22cb46514610c73575f80fd5b80638d24cfa9116102485780638d24cfa914610b625780638da5cb5b14610b765780638fc455ee14610b935780638fd2b37714610ba757806393e52cdb14610bbb57806395d89b4114610bda575f80fd5b806381f6277d14610aad5780638462151c14610acc57806387e7f43614610af85780638942b33814610b175780638a5ea44f14610b4e575f80fd5b806342842e0e116103bc57806360702f7c11610330578063715018a6116102ea578063715018a6146109de57806372a896c3146109f2578063767d5be414610a0657806376ed1d2114610a3a5780637a11612f14610a5a5780637cb6475914610a8e575f80fd5b806360702f7c14610918578063607e27371461092c57806360ec12c5146109405780636128541c146109815780636352211e146109a057806370a08231146109bf575f80fd5b806353535de01161038157806353535de01461082b578063539421041461086c57806355f804b31461089a57806359ad1ea1146108b95780635a7e9619146108cd5780635bbb2177146108ec575f80fd5b806342842e0e14610786578063480c979c146107995780634b1c53b4146107cd5780635154380a146107e1578063531d4efe1461080c575f80fd5b806315984c27116104535780632a55205a116104185780632a55205a146106b45780632a82ff5a146106f25780632abe728a146107125780632e1a7d4d1461072957806335a9a5c71461074857806335e60bd414610767575f80fd5b806315984c271461065157806318160ddd1461066557806323b872dd1461067957806325a7e0db1461068c57806326a6f18b146106a0575f80fd5b8063095ea7b3116104a4578063095ea7b3146105ab5780630d341bbe146105be5780631053a815146105ea57806311d738af146105fe57806312686aae14610612578063153a1f3e14610632575f80fd5b806301ffc9a7146104e057806303f334901461051457806304634d8d1461053257806306fdde0314610553578063081812fc14610574575b5f80fd5b3480156104eb575f80fd5b506104ff6104fa36600461510e565b61104d565b60405190151581526020015b60405180910390f35b34801561051f575f80fd5b506028545b60405190815260200161050b565b34801561053d575f80fd5b5061055161054c36600461513f565b61106c565b005b34801561055e575f80fd5b50610567611082565b60405161050b91906151cc565b34801561057f575f80fd5b5061059361058e3660046151de565b611112565b6040516001600160a01b03909116815260200161050b565b6105516105b93660046151f5565b611154565b3480156105c9575f80fd5b506105dd6105d83660046151de565b6111f2565b60405161050b919061521d565b3480156105f5575f80fd5b5061055161125b565b348015610609575f80fd5b50602654610524565b34801561061d575f80fd5b506011546104ff90600160a01b900460ff1681565b34801561063d575f80fd5b5061055161064c36600461529d565b6112ab565b34801561065c575f80fd5b50610551611370565b348015610670575f80fd5b5061052461153b565b610551610687366004615303565b611547565b348015610697575f80fd5b50602254610524565b3480156106ab575f80fd5b50602054610524565b3480156106bf575f80fd5b506106d36106ce36600461533c565b6115bc565b604080516001600160a01b03909316835260208301919091520161050b565b3480156106fd575f80fd5b506011546104ff90600160b81b900460ff1681565b34801561071d575f80fd5b5060235460ff166104ff565b348015610734575f80fd5b506105516107433660046151de565b611668565b348015610753575f80fd5b5061055161076236600461535c565b61189c565b348015610772575f80fd5b50610551610781366004615384565b6118c6565b610551610794366004615303565b6118ec565b3480156107a4575f80fd5b506107b86107b33660046151de565b611906565b6040805192835260208301919091520161050b565b3480156107d8575f80fd5b50600d54610524565b3480156107ec575f80fd5b506105246107fb3660046151de565b5f908152601a602052604090205490565b348015610817575f80fd5b506105246108263660046151f5565b611ca7565b348015610836575f80fd5b506105246108453660046151f5565b6001600160a01b03919091165f908152601760209081526040808320938352929052205490565b348015610877575f80fd5b506104ff6108863660046151de565b5f908152601e602052604090205460ff1690565b3480156108a5575f80fd5b506105516108b436600461539d565b611d01565b3480156108c4575f80fd5b506105dd611d78565b3480156108d8575f80fd5b506105246108e73660046151f5565b611dd7565b3480156108f7575f80fd5b5061090b610906366004615408565b611e2a565b60405161050b9190615482565b348015610923575f80fd5b50602154610524565b348015610937575f80fd5b50610551611ef1565b34801561094b575f80fd5b5061052461095a3660046151f5565b6001600160a01b03919091165f908152601860209081526040808320938352929052205490565b34801561098c575f80fd5b5061055161099b3660046151de565b612252565b3480156109ab575f80fd5b506105936109ba3660046151de565b6122b9565b3480156109ca575f80fd5b506105246109d936600461535c565b6122c3565b3480156109e9575f80fd5b5061055161230f565b3480156109fd575f80fd5b50610551612320565b348015610a11575f80fd5b50610524610a2036600461535c565b6001600160a01b03165f9081526013602052604090205490565b348015610a45575f80fd5b506011546104ff90600160c01b900460ff1681565b348015610a65575f80fd5b50610524610a7436600461535c565b6001600160a01b03165f9081526014602052604090205490565b348015610a99575f80fd5b50610551610aa83660046151de565b6124a3565b348015610ab8575f80fd5b50601154610593906001600160a01b031681565b348015610ad7575f80fd5b50610aeb610ae636600461535c565b6124b0565b60405161050b91906154c3565b348015610b03575f80fd5b50610551610b1236600461533c565b6125b4565b348015610b22575f80fd5b506104ff610b3136600461535c565b6001600160a01b03165f9081526016602052604090205460ff1690565b348015610b59575f80fd5b506105516126ae565b348015610b6d575f80fd5b50602754610524565b348015610b81575f80fd5b50600a546001600160a01b0316610593565b348015610b9e575f80fd5b50610551612724565b348015610bb2575f80fd5b50610524612821565b348015610bc6575f80fd5b50610551610bd53660046151de565b612830565b348015610be5575f80fd5b5061056761292b565b348015610bf9575f80fd5b50610524610c0836600461535c565b61293a565b348015610c18575f80fd5b50610aeb610c273660046154fa565b612963565b348015610c37575f80fd5b506107b8610c4636600461535c565b612ae0565b348015610c56575f80fd5b50610551612b4d565b348015610c6a575f80fd5b50610551612c53565b348015610c7e575f80fd5b50610551610c8d36600461552a565b612d61565b348015610c9d575f80fd5b50610551610cac36600461529d565b612dcc565b348015610cbc575f80fd5b50610551610ccb36600461539d565b612e9c565b348015610cdb575f80fd5b50610551610cea366004615408565b612eb1565b348015610cfa575f80fd5b50610551610d0936600461555b565b6132ef565b348015610d19575f80fd5b50610551610d28366004615597565b6134e4565b348015610d38575f80fd5b50610524610d473660046151de565b6136f6565b610551610d5a366004615408565b6137cd565b348015610d6a575f80fd5b50601054610524565b348015610d7e575f80fd5b50610567613a46565b610551610d953660046155d3565b613a55565b348015610da5575f80fd5b50610551610db4366004615408565b613a9f565b610551613d88565b348015610dcc575f80fd5b50610524610ddb36600461535c565b6001600160a01b03165f9081526012602052604090205490565b348015610e00575f80fd5b50610e14610e0f3660046151de565b61421b565b60405161050b91906156a7565b348015610e2c575f80fd5b506104ff610e3b3660046151de565b5f908152601d602052604090205460ff1690565b348015610e5a575f80fd5b50610567610e693660046151de565b6142a0565b348015610e79575f80fd5b50610551610e883660046151de565b6143a4565b348015610e98575f80fd5b50610524610ea736600461535c565b6001600160a01b03165f9081526015602052604090205490565b348015610ecc575f80fd5b506011546104ff90600160a81b900460ff1681565b348015610eec575f80fd5b50610551610efb3660046151de565b61440b565b348015610f0b575f80fd5b506011546104ff90600160b01b900460ff1681565b348015610f2b575f80fd5b50610551610f3a3660046151de565b614418565b348015610f4a575f80fd5b50610524610f593660046151de565b5f908152601b602052604090205490565b348015610f75575f80fd5b506104ff610f843660046156b5565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b348015610fbc575f80fd5b50610524610fcb3660046151de565b5f9081526019602052604090205490565b6105516144e5565b348015610fef575f80fd5b50610551610ffe36600461535c565b6146c1565b34801561100e575f80fd5b5061052461101d3660046151de565b5f908152601c602052604090205490565b348015611039575f80fd5b506105516110483660046151de565b6146fb565b5f61105782614761565b806110665750611066826147ae565b92915050565b6110746147e2565b61107e828261480f565b5050565b606060028054611091906156cf565b80601f01602080910402602001604051908101604052809291908181526020018280546110bd906156cf565b80156111085780601f106110df57610100808354040283529160200191611108565b820191905f5260205f20905b8154815290600101906020018083116110eb57829003601f168201915b5050505050905090565b5f61111c826148b1565b611139576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f61115e826122b9565b9050336001600160a01b038216146111975761117a8133610f84565b611197576040516367d9dca160e11b815260040160405180910390fd5b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f818152601f602090815260409182902080548351818402810184019094528084526060939283018282801561124f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611231575b50505050509050919050565b6112636147e2565b600c805460ff191660011790556040517fc6a6c2b165e62c9d37fc51a18ed76e5be22304bc1d337877c98f31c23e40b0f5906112a190600e90615707565b60405180910390a1565b82811461130e5760405162461bcd60e51b815260206004820152602660248201527f52656365697665727320616e64204944732061726520646966666572656e74206044820152650d8cadccee8d60d31b60648201526084015b60405180910390fd5b5f5b83811015611369576113613386868481811061132e5761132e615791565b9050602002016020810190611343919061535c565b85858581811061135557611355615791565b90506020020135611547565b600101611310565b5050505050565b6113786147e2565b42602654116113d95760405162461bcd60e51b815260206004820152602760248201527f53746172742074696d65206d75737420636f6d652061667465722063757272656044820152666e742074696d6560c81b6064820152608401611305565b601154600160b01b900460ff16156114335760405162461bcd60e51b815260206004820181905260248201527f5075626c69632061756374696f6e2068617320616c726561647920656e6465646044820152606401611305565b601154600160c01b900460ff1661145c5760405162461bcd60e51b8152600401611305906157a5565b7f000000000000000000000000000000000000000000000000000000000000077c6114c77f00000000000000000000000000000000000000000000000000000000000008347f00000000000000000000000000000000000000000000000000000000000004d16157fa565b6114d191906157fa565b6114d961153b565b146115265760405162461bcd60e51b815260206004820181905260248201527f4f746865722073616c6573206d7573742068617665207465726d696e617465646044820152606401611305565b6011805460ff60a81b1916600160a81b179055565b6001545f54035f190190565b601154600160a01b900460ff16156115ac5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74207472616e73666572202d2063757272656e746c79206c6f636b604482015261195960f21b6064820152608401611305565b6115b78383836148e3565b505050565b5f8281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916116305750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f906127109061164e906001600160601b03168761580d565b6116589190615838565b91519350909150505b9250929050565b611670614a72565b6116786147e2565b80611681612821565b1161169e5760405162461bcd60e51b81526004016113059061584b565b5f818152601b6020526040902054158015906116c657505f818152601c602052604090205415155b6116e25760405162461bcd60e51b815260040161130590615882565b5f818152601d602052604090205460ff16156117105760405162461bcd60e51b8152600401611305906158b7565b5f818152601a6020908152604080832054601b90925290912054036117775760405162461bcd60e51b815260206004820152601760248201527f5370656369616c20636173653a206e6f2077696e6e65720000000000000000006044820152606401611305565b5f818152601c6020908152604080832054601b90925282205461179a919061580d565b5f838152601a60205260409020549091508111156117ca5760405162461bcd60e51b8152600401611305906158e2565b6011546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611814576040519150601f19603f3d011682016040523d82523d5f602084013e611819565b606091505b505090508061183b57604051631d42c86760e21b815260040160405180910390fd5b5f838152601d602052604090819020805460ff19166001179055517f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d906118859084815260200190565b60405180910390a150506118996001600b55565b50565b6118a46147e2565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6118ce6147e2565b60118054911515600160a01b0260ff60a01b19909216919091179055565b6115b783838360405180602001604052805f815250613a55565b5f8082611911612821565b1161192e5760405162461bcd60e51b81526004016113059061584b565b5f838152601f6020526040812054900361194d57505f92600192509050565b60375f7f00000000000000000000000000000000000000000000000000000000000000bc611982866680000000000000614acb565b10156119f0575f611994600184615929565b90505b80156119ea577f00000000000000000000000000000000000000000000000000000000000000bc6119cb876001841b614acb565b106119d8578091506119ea565b806119e28161593c565b915050611997565b50611a58565b5f6119fc8360016157fa565b90505b605a811015611a56577f00000000000000000000000000000000000000000000000000000000000000bc611a36876001841b614acb565b1015611a4e57611a47600182615929565b9150611a56565b6001016119ff565b505b600180821b905f90611a6b9084906157fa565b6001901b90505f5b81831015611ade576002611a8783856157fa565b611a919190615838565b90507f00000000000000000000000000000000000000000000000000000000000000bc611abe8983614acb565b1015611acc57809150611a73565b611ad78160016157fa565b9250611a73565b7f00000000000000000000000000000000000000000000000000000000000000bc611b1389611b0e600187615929565b614acb565b03611b5157611b23600184615929565b987f00000000000000000000000000000000000000000000000000000000000000bc98509650505050505050565b5f611b5c8985614acb565b9050805f03611b82575050505f9586525050601a60205250506040909120549160019150565b84955080611b948a886001901b614acb565b1015611be2575f611ba6600188615929565b90505b8015611bdc5781611bbd8b6001841b614acb565b10611bca57809550611bdc565b80611bd48161593c565b915050611ba9565b50611c2a565b5f611bee8760016157fa565b90505b605a811015611c285781611c088b6001841b614acb565b1015611c2057611c19600182615929565b9550611c28565b600101611bf1565b505b600180861b9450611c3c9086906157fa565b6001901b92505b82841015611c8e576002611c5784866157fa565b611c619190615838565b915080611c6e8a84614acb565b1015611c7c57819250611c43565b611c878260016157fa565b9350611c43565b611c99600185615929565b999098509650505050505050565b5f818152601b60205260408120548103611cc257505f611066565b5f828152601b60209081526040808320546001600160a01b03871684526017835281842086855290925290912054611cfa9190615838565b9392505050565b611d096147e2565b600c5460ff1615611d2d576040516306ccad4160e41b815260040160405180910390fd5b600e611d3a828483615995565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa8282604051611d6c929190615a4e565b60405180910390a15050565b6060602480548060200260200160405190810160405280929190818152602001828054801561110857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611db0575050505050905090565b5f818152601b60205260408120548103611df257505f611066565b5f828152601b60209081526040808320546001600160a01b03871684526017835281842086855290925290912054611cfa9190615a7c565b6060815f816001600160401b03811115611e4657611e466155bf565b604051908082528060200260200182016040528015611e9657816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181611e645790505b5090505f5b828114611ee857611ec3868683818110611eb757611eb7615791565b9050602002013561421b565b828281518110611ed557611ed5615791565b6020908102919091010152600101611e9b565b50949350505050565b611ef9614a72565b601154600160a81b900460ff168015611f1c5750601154600160b01b900460ff16155b8015611f2a57504260265411155b611f465760405162461bcd60e51b815260040161130590615a8f565b335f90815260126020526040902054601054611f6690610d479042615929565b11611fa55760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401611305565b5f80611fb033612ae0565b915091505f821180611fc157505f81115b61200d5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7468696e6720746f20636c61696d206f7220726566756e640000000000006044820152606401611305565b6040515f90339083908381818185875af1925050503d805f811461204c576040519150601f19603f3d011682016040523d82523d5f602084013e612051565b606091505b505090508061207357604051631d42c86760e21b815260040160405180910390fd5b82156121cd57612081612821565b61208c9060016157fa565b6120b6907f00000000000000000000000000000000000000000000000000000000000000bc61580d565b7f000000000000000000000000000000000000000000000000000000000000077c6121217f00000000000000000000000000000000000000000000000000000000000008347f00000000000000000000000000000000000000000000000000000000000004d16157fa565b61212b91906157fa565b61213591906157fa565b8361213e61153b565b61214891906157fa565b11156121965760405162461bcd60e51b815260206004820152601a60248201527f457863656564732063757272656e74206d617820737570706c790000000000006044820152606401611305565b6121a03384614b5e565b335f90815260136020526040812080548592906121be9084906157fa565b909155506121cd905033614b77565b5f6121df60105442610d479190615929565b90505b335f9081526012602052604090205481111561224257601c5f612206600184615929565b81526020019081526020015f20545f1461223057335f908152601260205260409020819055612242565b8061223a8161593c565b9150506121e2565b505050506122506001600b55565b565b61225a6147e2565b601154600160c01b900460ff16156122b45760405162461bcd60e51b815260206004820152601d60248201527f507269766174652061756374696f6e20616c726561647920656e6465640000006044820152606401611305565b602855565b5f61106682614c98565b5f6001600160a01b0382166122eb576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03165f908152600560205260409020546001600160401b031690565b6123176147e2565b6122505f614d01565b612328614a72565b6123306147e2565b601154600160c01b900460ff166123595760405162461bcd60e51b8152600401611305906157a5565b5f60215411801561236b57505f602254115b6123875760405162461bcd60e51b815260040161130590615882565b60235460ff16156123aa5760405162461bcd60e51b8152600401611305906158b7565b5f6022546021546123bb919061580d565b90506020548111156123df5760405162461bcd60e51b8152600401611305906158e2565b6011546040515f916001600160a01b03169083908381818185875af1925050503d805f8114612429576040519150601f19603f3d011682016040523d82523d5f602084013e61242e565b606091505b505090508061245057604051631d42c86760e21b815260040160405180910390fd5b6023805460ff191660011790556040517f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9061248f9084815260200190565b60405180910390a150506122506001600b55565b6124ab6147e2565b602555565b60605f805f6124be856122c3565b90505f816001600160401b038111156124d9576124d96155bf565b604051908082528060200260200182016040528015612502578160200160208202803683370190505b50905061252e604080516080810182525f80825260208201819052918101829052606081019190915290565b60015b8386146125a85761254181614d52565b915081604001516125a05781516001600160a01b03161561256157815194505b876001600160a01b0316856001600160a01b0316036125a0578083878060010198508151811061259357612593615791565b6020026020010181815250505b600101612531565b50909695505050505050565b6125bc6147e2565b601154600160c01b900460ff166125e55760405162461bcd60e51b8152600401611305906157a5565b7f000000000000000000000000000000000000000000000000000000000000077c8111156126555760405162461bcd60e51b815260206004820152601a60248201527f537570706c792063616e6e6f7420657863656564206c696d69740000000000006044820152606401611305565b60235460ff16156126785760405162461bcd60e51b8152600401611305906158b7565b602054612685828461580d565b11156126a35760405162461bcd60e51b8152600401611305906158e2565b602191909155602255565b6126b66147e2565b601154600160a81b900460ff1661270f5760405162461bcd60e51b815260206004820152601e60248201527f5075626c69632061756374696f6e20686173206e6f74207374617274656400006044820152606401611305565b6011805460ff60b01b1916600160b01b179055565b61272c6147e2565b6028545f0361274d5760405162461bcd60e51b815260040161130590615ac6565b601154600160b81b900460ff166127a65760405162461bcd60e51b815260206004820152601f60248201527f507269766174652061756374696f6e20686173206e6f742073746172746564006044820152606401611305565b60285442101561280c5760405162461bcd60e51b815260206004820152602b60248201527f507269766174652061756374696f6e20656e642074696d6520686173206e6f7460448201526a081c185cdcd959081e595d60aa1b6064820152608401611305565b6011805460ff60c01b1916600160c01b179055565b5f61282b426136f6565b905090565b80612839612821565b116128565760405162461bcd60e51b81526004016113059061584b565b5f818152601e602052604090205460ff16156128ad5760405162461bcd60e51b8152602060048201526016602482015275141c9a58d948185b1c9958591e4818dbdb5c1d5d195960521b6044820152606401611305565b80156128ed57601c5f6128c1600184615929565b81526020019081526020015f20545f036128ed5760405162461bcd60e51b815260040161130590615b0e565b5f818152601e60205260409020805460ff1916600117905561290e81611906565b5f928352601b60209081526040808520601c909252909320559055565b606060038054611091906156cf565b6001600160a01b0381165f90815260056020526040808220546001600160401b03911c16611066565b606081831061298557604051631960ccad60e11b815260040160405180910390fd5b5f8061298f5f5490565b9050600185101561299f57600194505b808411156129ab578093505b5f6129b5876122c3565b9050848610156129d457858503818110156129ce578091505b506129d7565b505f5b5f816001600160401b038111156129f0576129f06155bf565b604051908082528060200260200182016040528015612a19578160200160208202803683370190505b509050815f03612a2e579350611cfa92505050565b5f612a388861421b565b90505f8160400151612a48575080515b885b888114158015612a5a5750848714155b15612acf57612a6881614d52565b92508260400151612ac75782516001600160a01b031615612a8857825191505b8a6001600160a01b0316826001600160a01b031603612ac75780848880600101995081518110612aba57612aba615791565b6020026020010181815250505b600101612a4a565b505050928352509095945050505050565b6001600160a01b0381165f9081526012602052604081205481905b612b0c60105442610d479190615929565b811015612b4757612b1d8482611ca7565b612b2790846157fa565b9250612b338482611dd7565b612b3d90836157fa565b9150600101612afb565b50915091565b612b556147e2565b6027545f03612bb95760405162461bcd60e51b815260206004820152602a60248201527f507269766174652061756374696f6e2073746172742074696d65206e6f7420696044820152691b9a5d1a585b1a5e995960b21b6064820152608401611305565b6028545f03612bda5760405162461bcd60e51b815260040161130590615ac6565b601154600160c01b900460ff1615612c3e5760405162461bcd60e51b815260206004820152602160248201527f507269766174652061756374696f6e2068617320616c726561647920656e64656044820152601960fa1b6064820152608401611305565b6011805460ff60b81b1916600160b81b179055565b612c5b614a72565b612c636147e2565b601154600160b01b900460ff16612cbc5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632061756374696f6e20686173206e6f7420656e646564000000006044820152606401611305565b60115460405147915f916001600160a01b039091169083908381818185875af1925050503d805f8114612d0a576040519150601f19603f3d011682016040523d82523d5f602084013e612d0f565b606091505b5050905080612d3157604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200161248f565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612dd46147e2565b828114612e395760405162461bcd60e51b815260206004820152602d60248201527f52656365697665727320616e64207175616e746974696573206172652064696660448201526c0cccae4cadce840d8cadccee8d609b1b6064820152608401611305565b5f5b8381101561136957612e94838383818110612e5857612e58615791565b9050602002016020810190612e6d9190615b53565b868684818110612e7f57612e7f615791565b9050602002016020810190610d28919061535c565b600101612e3b565b612ea46147e2565b600f6115b7828483615995565b612eb9614a72565b612ec16147e2565b601154600160c01b900460ff16612eea5760405162461bcd60e51b8152600401611305906157a5565b5f602154118015612efc57505f602254115b612f185760405162461bcd60e51b815260040161130590615882565b5f5b818110156132495760165f848484818110612f3757612f37615791565b9050602002016020810190612f4c919061535c565b6001600160a01b0316815260208101919091526040015f205460ff16613241575f838383818110612f7f57612f7f615791565b9050602002016020810190612f94919061535c565b6001600160a01b031660215460145f878787818110612fb557612fb5615791565b9050602002016020810190612fca919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f2054612ff49190615a7c565b6040515f81818185875af1925050503d805f811461302d576040519150601f19603f3d011682016040523d82523d5f602084013e613032565b606091505b505090508061305457604051631d42c86760e21b815260040160405180910390fd5b5f60215460145f87878781811061306d5761306d615791565b9050602002016020810190613082919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f20546130ac9190615838565b11156131ec576131388484848181106130c7576130c7615791565b90506020020160208101906130dc919061535c565b60215460145f8888888181106130f4576130f4615791565b9050602002016020810190613109919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f20546131339190615838565b614b5e565b60215460145f86868681811061315057613150615791565b9050602002016020810190613165919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f205461318f9190615838565b60155f8686868181106131a4576131a4615791565b90506020020160208101906131b9919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f8282546131e691906157fa565b90915550505b600160165f86868681811061320357613203615791565b9050602002016020810190613218919061535c565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055505b600101612f1a565b507f000000000000000000000000000000000000000000000000000000000000077c6132b57f00000000000000000000000000000000000000000000000000000000000008347f00000000000000000000000000000000000000000000000000000000000004d16157fa565b6132bf91906157fa565b6132c761153b565b11156132e55760405162461bcd60e51b815260040161130590615b6c565b61107e6001600b55565b6132f76147e2565b82613300612821565b1161331d5760405162461bcd60e51b81526004016113059061584b565b5f838152601e602052604090205460ff16156133745760405162461bcd60e51b8152602060048201526016602482015275141c9a58d948185b1c9958591e4818dbdb5c1d5d195960521b6044820152606401611305565b7f00000000000000000000000000000000000000000000000000000000000000bc8111156133e45760405162461bcd60e51b815260206004820152601a60248201527f537570706c792063616e6e6f7420657863656564206c696d69740000000000006044820152606401611305565b5f838152601d602052604090205460ff16156134125760405162461bcd60e51b8152600401611305906158b7565b5f81116134515760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081a5b9c1d5d609a1b6044820152606401611305565b5f838152601a6020526040902054613469828461580d565b11156134875760405162461bcd60e51b8152600401611305906158e2565b82156134c757601c5f61349b600186615929565b81526020019081526020015f20545f036134c75760405162461bcd60e51b815260040161130590615b0e565b5f928352601b6020908152604080852093909355601c9052912055565b6134ec6147e2565b8163ffffffff16600d54816134ff61153b565b61350991906157fa565b11156135285760405163800113cb60e01b815260040160405180910390fd5b601154600160a81b900460ff16156135a857601154600160b01b900460ff166135a35760405162461bcd60e51b815260206004820152602760248201527f4f776e65722063616e6e6f74206d696e7420647572696e67207075626c69632060448201526630bab1ba34b7b760c91b6064820152608401611305565b6136e6565b601154600160c01b900460ff1661363a576136037f00000000000000000000000000000000000000000000000000000000000008347f00000000000000000000000000000000000000000000000000000000000004d16157fa565b8363ffffffff1661361261153b565b61361c91906157fa565b11156135a35760405162461bcd60e51b815260040161130590615b6c565b7f000000000000000000000000000000000000000000000000000000000000077c6136a57f00000000000000000000000000000000000000000000000000000000000008347f00000000000000000000000000000000000000000000000000000000000004d16157fa565b6136af91906157fa565b8363ffffffff166136be61153b565b6136c891906157fa565b11156136e65760405162461bcd60e51b815260040161130590615b6c565b6115b7828463ffffffff16614b5e565b6011545f90600160a81b900460ff16801561371357506026548210155b61375f5760405162461bcd60e51b815260206004820152601e60248201527f5075626c69632061756374696f6e20686173206e6f74207374617274656400006044820152606401611305565b62093a80602654836137719190615929565b61377b9190615838565b90507f000000000000000000000000000000000000000000000000000000000000002b8111156137c857507f000000000000000000000000000000000000000000000000000000000000002b5b919050565b6137d5614a72565b601154600160b81b900460ff1680156137f85750601154600160c01b900460ff16155b6138445760405162461bcd60e51b815260206004820152601f60248201527f507269766174652061756374696f6e206e6f7420696e2070726f6772657373006044820152606401611305565b426027541115801561385857506028544211155b6138985760405162461bcd60e51b81526020600482015260116024820152700496e76616c69642074696d657374616d7607c1b6044820152606401611305565b6025546139108383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506040516bffffffffffffffffffffffff193360601b16602082015260340191506138f59050565b60405160208183030381529060405280519060200120614d8c565b146139505760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b6044820152606401611305565b5f34116139ab5760405162461bcd60e51b8152602060048201526024808201527f42696420616d6f756e74206d7573742062652067726561746572207468616e206044820152637a65726f60e01b6064820152608401611305565b335f908152601460205260408120549003613a0257602480546001810182555f919091527f7cd332d19b93bcabe3cce7ca0c18a052f57e5fd03b4758a09f30f5ddc4b22ec40180546001600160a01b031916331790555b335f9081526014602052604081208054349290613a209084906157fa565b925050819055503460205f828254613a3891906157fa565b90915550506001600b555050565b6060600f8054611091906156cf565b613a60848484611547565b6001600160a01b0383163b15613a9957613a7c84848484614dce565b613a99576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b613aa7614a72565b613aaf6147e2565b601154600160b01b900460ff16613b085760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632061756374696f6e20686173206e6f7420656e646564000000006044820152606401611305565b5f5b81811015613d7c577f000000000000000000000000000000000000000000000000000000000000002b60125f858585818110613b4857613b48615791565b9050602002016020810190613b5d919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f20541015613d74575f80613baf858585818110613b9a57613b9a615791565b9050602002016020810190610c46919061535c565b915091505f858585818110613bc657613bc6615791565b9050602002016020810190613bdb919061535c565b6001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613c22576040519150601f19603f3d011682016040523d82523d5f602084013e613c27565b606091505b5050905080613c4957604051631d42c86760e21b815260040160405180910390fd5b8215613d0c57613c7f868686818110613c6457613c64615791565b9050602002016020810190613c79919061535c565b84614b5e565b8260135f888888818110613c9557613c95615791565b9050602002016020810190613caa919061535c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254613cd791906157fa565b90915550613d0c9050868686818110613cf257613cf2615791565b9050602002016020810190613d07919061535c565b614b77565b7f000000000000000000000000000000000000000000000000000000000000002b60125f888888818110613d4257613d42615791565b9050602002016020810190613d57919061535c565b6001600160a01b0316815260208101919091526040015f20555050505b600101613b0a565b50600d546132c761153b565b613d90614a72565b601154600160a81b900460ff168015613db35750601154600160b01b900460ff16155b8015613dc157504260265411155b613ddd5760405162461bcd60e51b815260040161130590615a8f565b335f90815260126020526040902054601054613dfd90610d479042615929565b11613e3c5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401611305565b7f000000000000000000000000000000000000000000000000000000000000002b613e65612821565b10613ea65760405162461bcd60e51b8152602060048201526011602482015270105d58dd1a5bdb881a185cc8195b991959607a1b6044820152606401611305565b5f80613eb133612ae0565b915091505f821180613ec257505f81115b613f0e5760405162461bcd60e51b815260206004820152601960248201527f4e6f7468696e6720746f20636c61696d206f722072656c6179000000000000006044820152606401611305565b613f3960027f00000000000000000000000000000000000000000000000000000000000000bc615c78565b613f4382346157fa565b11613f605760405162461bcd60e51b815260040161130590615c86565b335f90815260176020526040812090613f77612821565b81526020019081526020015f20545f03613fc857601f5f613f96612821565b81526020808201929092526040015f90812080546001810182559082529190200180546001600160a01b031916331790555b613fd281346157fa565b335f90815260176020526040812090613fe9612821565b81526020019081526020015f205f82825461400491906157fa565b90915550614014905081346157fa565b601a5f61401f612821565b81526020019081526020015f205f82825461403a91906157fa565b909155505081156141995761404d612821565b6140589060016157fa565b614082907f00000000000000000000000000000000000000000000000000000000000000bc61580d565b7f000000000000000000000000000000000000000000000000000000000000077c6140ed7f00000000000000000000000000000000000000000000000000000000000008347f00000000000000000000000000000000000000000000000000000000000004d16157fa565b6140f791906157fa565b61410191906157fa565b8261410a61153b565b61411491906157fa565b11156141625760405162461bcd60e51b815260206004820152601a60248201527f457863656564732063757272656e74206d617820737570706c790000000000006044820152606401611305565b61416c3383614b5e565b335f908152601360205260408120805484929061418a9084906157fa565b90915550614199905033614b77565b5f6141ab60105442610d479190615929565b90505b335f9081526012602052604090205481111561420e57601c5f6141d2600184615929565b81526020019081526020015f20545f146141fc57335f90815260126020526040902081905561420e565b806142068161593c565b9150506141ae565b5050506122506001600b55565b604080516080810182525f808252602082018190529181018290526060810191909152604080516080810182525f808252602082018190529181018290526060810191909152600183108061427157505f548310155b1561427c5792915050565b61428583614d52565b90508060400151156142975792915050565b611cfa83614eb5565b60606142ab826148b1565b6142c857604051630a14c4b560e41b815260040160405180910390fd5b5f600e80546142d6906156cf565b80601f0160208091040260200160405190810160405280929190818152602001828054614302906156cf565b801561434d5780601f106143245761010080835404028352916020019161434d565b820191905f5260205f20905b81548152906001019060200180831161433057829003601f168201915b5050505050905080515f036143705760405180602001604052805f815250611cfa565b8061437a84614ee9565b600f60405160200161438e93929190615ccd565b6040516020818303038152906040529392505050565b6143ac6147e2565b601154600160b81b900460ff16156144065760405162461bcd60e51b815260206004820152601f60248201527f507269766174652061756374696f6e20616c72656164792073746172746564006044820152606401611305565b602755565b6144136147e2565b601055565b6144206147e2565b601154600160a81b900460ff161561447a5760405162461bcd60e51b815260206004820152601e60248201527f5075626c69632061756374696f6e20616c7265616479207374617274656400006044820152606401611305565b4281118015614494575062093a806144924283615929565b105b6144e05760405162461bcd60e51b815260206004820152601e60248201527f54696d65206e6f7420696e20617070726f7072696174652077696e646f7700006044820152606401611305565b602655565b6144ed614a72565b601154600160a81b900460ff1680156145105750601154600160b01b900460ff16155b801561451e57504260265411155b61453a5760405162461bcd60e51b815260040161130590615a8f565b7f000000000000000000000000000000000000000000000000000000000000002b614563612821565b106145a45760405162461bcd60e51b8152602060048201526011602482015270105d58dd1a5bdb881a185cc8195b991959607a1b6044820152606401611305565b6145cf60027f00000000000000000000000000000000000000000000000000000000000000bc615c78565b34116145ed5760405162461bcd60e51b815260040161130590615c86565b335f90815260176020526040812090614604612821565b81526020019081526020015f20545f0361465557601f5f614623612821565b81526020808201929092526040015f90812080546001810182559082529190200180546001600160a01b031916331790555b335f908152601760205260408120349161466d612821565b81526020019081526020015f205f82825461468891906157fa565b90915550349050601a5f61469a612821565b81526020019081526020015f205f8282546146b591906157fa565b90915550506001600b55565b6146c96147e2565b6001600160a01b0381166146f257604051631e4fbdf760e01b81525f6004820152602401611305565b61189981614d01565b6147036147e2565b600d548111156147265760405163430b83b160e11b815260040160405180910390fd5b600d8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a9060200160405180910390a150565b5f6301ffc9a760e01b6001600160e01b03198316148061479157506380ac58cd60e01b6001600160e01b03198316145b806110665750506001600160e01b031916635b5e139f60e01b1490565b5f6001600160e01b0319821663152a902d60e11b148061106657506301ffc9a760e01b6001600160e01b0319831614611066565b600a546001600160a01b031633146122505760405163118cdaa760e01b8152336004820152602401611305565b6127106001600160601b03821681101561484e57604051636f483d0960e01b81526001600160601b038316600482015260248101829052604401611305565b6001600160a01b03831661487757604051635b6cc80560e11b81525f6004820152602401611305565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b5f816001111580156148c357505f5482105b80156110665750505f90815260046020526040902054600160e01b161590565b5f6148ed82614c98565b9050836001600160a01b0316816001600160a01b0316146149205760405162a1148160e81b815260040160405180910390fd5b5f8281526006602052604090208054338082146001600160a01b0388169091141761496c5761494f8633610f84565b61496c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661499357604051633a954ecd60e21b815260040160405180910390fd5b801561499d575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b84169003614a2957600184015f818152600460205260408120549003614a27575f548114614a27575f8181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6002600b5403614ac45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611305565b6002600b55565b5f828152601f6020526040812054815b81811015614b56578360175f601f5f8981526020019081526020015f208481548110614b0957614b09615791565b5f9182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902054614b429190615838565b614b4c90846157fa565b9250600101614adb565b505092915050565b61107e828260405180602001604052805f815250614f2c565b6001600160a01b0381165f908152601260205260409020545b614ba160105442610d479190615929565b81101561107e57614bb28282611ca7565b5f8281526019602052604081208054909190614bcf9084906157fa565b90915550505f818152601c60209081526040808320546019909252909120541115614c4f5760405162461bcd60e51b815260206004820152602a60248201527f546f74616c20636c61696d656420706572207765656b2063616e6e6f7420657860448201526918d95959081b1a5b5a5d60b21b6064820152608401611305565b614c598282611ca7565b6001600160a01b0383165f90815260186020908152604080832085845290915281208054909190614c8b9084906157fa565b9091555050600101614b90565b5f8180600111614ce8575f54811015614ce8575f8181526004602052604081205490600160e01b82169003614ce6575b805f03611cfa57505f19015f81815260046020526040902054614cc8565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604080516080810182525f8082526020820181905291810182905260608101919091525f8281526004602052604090205461106690614f8e565b5f81815b8451811015614dc657614dbc82868381518110614daf57614daf615791565b6020026020010151614fd5565b9150600101614d90565b509392505050565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290614e02903390899088908890600401615d6b565b6020604051808303815f875af1925050508015614e3c575060408051601f3d908101601f19168201909252614e3991810190615da7565b60015b614e98573d808015614e69576040519150601f19603f3d011682016040523d82523d5f602084013e614e6e565b606091505b5080515f03614e90576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516080810182525f808252602082018190529181018290526060810191909152611066614ee483614c98565b614f8e565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a900480614f025750819003601f19909101908152919050565b614f368383615001565b6001600160a01b0383163b156115b7575f548281035b614f5e5f868380600101945086614dce565b614f7b576040516368d2bf6b60e11b815260040160405180910390fd5b818110614f4c57815f5414611369575f80fd5b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b5f818310614fef575f828152602084905260409020611cfa565b5f838152602083905260409020611cfa565b5f8054908290036150255760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383165f8181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146150d15780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460010161509b565b50815f036150f157604051622e076360e81b815260040160405180910390fd5b5f5550505050565b6001600160e01b031981168114611899575f80fd5b5f6020828403121561511e575f80fd5b8135611cfa816150f9565b80356001600160a01b03811681146137c8575f80fd5b5f8060408385031215615150575f80fd5b61515983615129565b915060208301356001600160601b0381168114615174575f80fd5b809150509250929050565b5f5b83811015615199578181015183820152602001615181565b50505f910152565b5f81518084526151b881602086016020860161517f565b601f01601f19169290920160200192915050565b602081525f611cfa60208301846151a1565b5f602082840312156151ee575f80fd5b5035919050565b5f8060408385031215615206575f80fd5b61520f83615129565b946020939093013593505050565b602080825282518282018190525f9190848201906040850190845b818110156125a85783516001600160a01b031683529284019291840191600101615238565b5f8083601f84011261526d575f80fd5b5081356001600160401b03811115615283575f80fd5b6020830191508360208260051b8501011115611661575f80fd5b5f805f80604085870312156152b0575f80fd5b84356001600160401b03808211156152c6575f80fd5b6152d28883890161525d565b909650945060208701359150808211156152ea575f80fd5b506152f78782880161525d565b95989497509550505050565b5f805f60608486031215615315575f80fd5b61531e84615129565b925061532c60208501615129565b9150604084013590509250925092565b5f806040838503121561534d575f80fd5b50508035926020909101359150565b5f6020828403121561536c575f80fd5b611cfa82615129565b803580151581146137c8575f80fd5b5f60208284031215615394575f80fd5b611cfa82615375565b5f80602083850312156153ae575f80fd5b82356001600160401b03808211156153c4575f80fd5b818501915085601f8301126153d7575f80fd5b8135818111156153e5575f80fd5b8660208285010111156153f6575f80fd5b60209290920196919550909350505050565b5f8060208385031215615419575f80fd5b82356001600160401b0381111561542e575f80fd5b61543a8582860161525d565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b602080825282518282018190525f9190848201906040850190845b818110156125a8576154b0838551615446565b928401926080929092019160010161549d565b602080825282518282018190525f9190848201906040850190845b818110156125a8578351835292840192918401916001016154de565b5f805f6060848603121561550c575f80fd5b61551584615129565b95602085013595506040909401359392505050565b5f806040838503121561553b575f80fd5b61554483615129565b915061555260208401615375565b90509250929050565b5f805f6060848603121561556d575f80fd5b505081359360208301359350604090920135919050565b803563ffffffff811681146137c8575f80fd5b5f80604083850312156155a8575f80fd5b6155b183615584565b915061555260208401615129565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156155e6575f80fd5b6155ef85615129565b93506155fd60208601615129565b92506040850135915060608501356001600160401b038082111561561f575f80fd5b818701915087601f830112615632575f80fd5b813581811115615644576156446155bf565b604051601f8201601f19908116603f0116810190838211818310171561566c5761566c6155bf565b816040528281528a6020848701011115615684575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b608081016110668284615446565b5f80604083850312156156c6575f80fd5b6155b183615129565b600181811c908216806156e357607f821691505b60208210810361570157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454615719816156cf565b806020870152604060018084165f811461573a576001811461575657615783565b60ff19851660408a0152604084151560051b8a01019550615783565b895f5260205f205f5b8581101561577a5781548b820186015290830190880161575f565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b60208082526021908201527f507269766174652061756374696f6e20686173206e6f7420656e6465642079656040820152601d60fa1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611066576110666157e6565b8082028115828204841417611066576110666157e6565b634e487b7160e01b5f52601260045260245ffd5b5f8261584657615846615824565b500490565b60208082526019908201527f41756374696f6e20686173206e6f7420656e6465642079657400000000000000604082015260600190565b6020808252818101527f507269636520616e6420737570706c79206e6f7420696e697469616c697a6564604082015260600190565b60208082526011908201527020b63932b0b23c903bb4ba34323930bbb760791b604082015260600190565b60208082526027908201527f576974686472617720616d6f756e742063616e6e6f742065786365656420746f6040820152661d185b08189a5960ca1b606082015260800190565b81810381811115611066576110666157e6565b5f8161594a5761594a6157e6565b505f190190565b601f8211156115b757805f5260205f20601f840160051c810160208510156159765750805b601f840160051c820191505b81811015611369575f8155600101615982565b6001600160401b038311156159ac576159ac6155bf565b6159c0836159ba83546156cf565b83615951565b5f601f8411600181146159f1575f85156159da5750838201355b5f19600387901b1c1916600186901b178355611369565b5f83815260208120601f198716915b82811015615a205786850135825560209485019460019092019101615a00565b5086821015615a3c575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f82615a8a57615a8a615824565b500690565b6020808252601e908201527f5075626c69632061756374696f6e206e6f7420696e2070726f67726573730000604082015260600190565b60208082526028908201527f507269766174652061756374696f6e20656e642074696d65206e6f7420696e696040820152671d1a585b1a5e995960c21b606082015260800190565b60208082526025908201527f4d75737420686176652073657420707269636520666f722070726576696f7573604082015264207765656b60d81b606082015260800190565b5f60208284031215615b63575f80fd5b611cfa82615584565b602080825260129082015271115e18d959591cc81b5a5b9d081b1a5b5a5d60721b604082015260600190565b600181815b80851115615bd257815f1904821115615bb857615bb86157e6565b80851615615bc557918102915b93841c9390800290615b9d565b509250929050565b5f82615be857506001611066565b81615bf457505f611066565b8160018114615c0a5760028114615c1457615c30565b6001915050611066565b60ff841115615c2557615c256157e6565b50506001821b611066565b5060208310610133831016604e8410600b8410161715615c53575081810a611066565b615c5d8383615b98565b805f1904821115615c7057615c706157e6565b029392505050565b5f611cfa60ff841683615bda565b60208082526027908201527f42696420616d6f756e74206d7573742062652067726561746572207468616e206040820152666d696e696d756d60c81b606082015260800190565b5f84516020615ce0828560208a0161517f565b855191840191615cf4818460208a0161517f565b85549201915f90615d04816156cf565b60018281168015615d1c5760018114615d3157615d5b565b60ff1984168752821515830287019450615d5b565b895f5260205f205f5b84811015615d5357815489820152908301908701615d3a565b505082870194505b50929a9950505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90615d9d908301846151a1565b9695505050505050565b5f60208284031215615db7575f80fd5b8151611cfa816150f956fea26469706673582212204a8b86f982c0d4e477388d5c3ca59520d4933ba4ffd02a7f3bf45df536feb8a364736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008574144455349444500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085741444553494445000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : collectionName (string): WADESIDE
Arg [1] : collectionSymbol (string): WADESIDE
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [3] : 5741444553494445000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 5741444553494445000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
387:26956:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24984:459;;;;;;;;;;-1:-1:-1;24984:459:13;;;;;:::i;:::-;;:::i;:::-;;;565:14:14;;558:22;540:41;;528:2;513:18;24984:459:13;;;;;;;;6185:114;;;;;;;;;;-1:-1:-1;6270:22:13;;6185:114;;;738:25:14;;;726:2;711:18;6185:114:13;592:177:14;25449:162:13;;;;;;;;;;-1:-1:-1;25449:162:13;;;;;:::i;:::-;;:::i;:::-;;10039:98:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16360:214::-;;;;;;;;;;-1:-1:-1;16360:214:8;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2428:32:14;;;2410:51;;2398:2;2383:18;16360:214:8;2264:203:14;15812:398:8;;;;;;:::i;:::-;;:::i;5252:129:13:-;;;;;;;;;;-1:-1:-1;5252:129:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25956:139::-;;;;;;;;;;;;;:::i;5939:116::-;;;;;;;;;;-1:-1:-1;6025:23:13;;5939:116;;1227:26;;;;;;;;;;-1:-1:-1;1227:26:13;;;;-1:-1:-1;;;1227:26:13;;;;;;3282:284;;;;;;;;;;-1:-1:-1;3282:284:13;;;;;:::i;:::-;;:::i;17658:466::-;;;;;;;;;;;;;:::i;5894:317:8:-;;;;;;;;;;;;;:::i;22474:272:13:-;;;;;;:::i;:::-;;:::i;5597:98::-;;;;;;;;;;-1:-1:-1;5674:14:13;;5597:98;;5387:102;;;;;;;;;;-1:-1:-1;5466:16:13;;5387:102;;2379:419:3;;;;;;;;;;-1:-1:-1;2379:419:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5322:32:14;;;5304:51;;5386:2;5371:18;;5364:34;;;;5277:18;2379:419:3;5130:274:14;1333:33:13;;;;;;;;;;-1:-1:-1;1333:33:13;;;;-1:-1:-1;;;1333:33:13;;;;;;5701:101;;;;;;;;;;-1:-1:-1;5778:17:13;;;;5701:101;;15944:680;;;;;;;;;;-1:-1:-1;15944:680:13;;;;;:::i;:::-;;:::i;22263:100::-;;;;;;;;;;-1:-1:-1;22263:100:13;;;;;:::i;:::-;;:::i;22369:99::-;;;;;;;;;;-1:-1:-1;22369:99:13;;;;;:::i;:::-;;:::i;22758:187:8:-;;;;;;:::i;:::-;;:::i;8228:2667:13:-;;;;;;;;;;-1:-1:-1;8228:2667:13;;;;;:::i;:::-;;:::i;:::-;;;;6124:25:14;;;6180:2;6165:18;;6158:34;;;;6097:18;8228:2667:13;5950:248:14;23034:115:13;;;;;;;;;;-1:-1:-1;23124:18:13;;23034:115;;4697:106;;;;;;;;;;-1:-1:-1;4697:106:13;;;;;:::i;:::-;4755:7;4781:15;;;:9;:15;;;;;;;4697:106;6755:201;;;;;;;;;;-1:-1:-1;6755:201:13;;;;;:::i;:::-;;:::i;4301:118::-;;;;;;;;;;-1:-1:-1;4301:118:13;;;;;:::i;:::-;-1:-1:-1;;;;;4396:10:13;;;;4370:7;4396:10;;;:4;:10;;;;;;;;:16;;;;;;;;;4301:118;5133:113;;;;;;;;;;-1:-1:-1;5133:113:13;;;;;:::i;:::-;5196:4;5219:20;;;:14;:20;;;;;;;;;5133:113;25666:210;;;;;;;;;;-1:-1:-1;25666:210:13;;;;;:::i;:::-;;:::i;5808:125::-;;;;;;;;;;;;;:::i;6962:201::-;;;;;;;;;;-1:-1:-1;6962:201:13;;;;;:::i;:::-;;:::i;1641:513:10:-;;;;;;;;;;-1:-1:-1;1641:513:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5495:96:13:-;;;;;;;;;;-1:-1:-1;5571:13:13;;5495:96;;12198:1194;;;;;;;;;;;;;:::i;4425:134::-;;;;;;;;;;-1:-1:-1;4425:134:13;;;;;:::i;:::-;-1:-1:-1;;;;;4527:19:13;;;;4501:7;4527:19;;;:13;:19;;;;;;;;:25;;;;;;;;;4425:134;17466:186;;;;;;;;;;-1:-1:-1;17466:186:13;;;;;:::i;:::-;;:::i;11391:150:8:-;;;;;;;;;;-1:-1:-1;11391:150:8;;;;;:::i;:::-;;:::i;7045:230::-;;;;;;;;;;-1:-1:-1;7045:230:8;;;;;:::i;:::-;;:::i;2293:101:0:-;;;;;;;;;;;;;:::i;19577:619:13:-;;;;;;;;;;;;;:::i;3804:118::-;;;;;;;;;;-1:-1:-1;3804:118:13;;;;;:::i;:::-;-1:-1:-1;;;;;3894:21:13;3868:7;3894:21;;;:15;:21;;;;;;;3804:118;1372:31;;;;;;;;;;-1:-1:-1;1372:31:13;;;;-1:-1:-1;;;1372:31:13;;;;;;3928:112;;;;;;;;;;-1:-1:-1;3928:112:13;;;;;:::i;:::-;-1:-1:-1;;;;;4016:17:13;3990:7;4016:17;;;:11;:17;;;;;;;3928:112;22166:91;;;;;;;;;;-1:-1:-1;22166:91:13;;;;;:::i;:::-;;:::i;1191:30::-;;;;;;;;;;-1:-1:-1;1191:30:13;;;;-1:-1:-1;;;;;1191:30:13;;;5417:879:10;;;;;;;;;;-1:-1:-1;5417:879:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19115:456:13:-;;;;;;;;;;-1:-1:-1;19115:456:13;;;;;:::i;:::-;;:::i;4174:121::-;;;;;;;;;;-1:-1:-1;4174:121:13;;;;;:::i;:::-;-1:-1:-1;;;;;4264:24:13;4241:4;4264:24;;;:18;:24;;;;;;;;;4174:121;18492:247;;;;;;;;;;;;;:::i;6061:118::-;;;;;;;;;;-1:-1:-1;6148:24:13;;6061:118;;1638:85:0;;;;;;;;;;-1:-1:-1;1710:6:0;;-1:-1:-1;;;;;1710:6:0;1638:85;;18745:364:13;;;;;;;;;;;;;:::i;6650:99::-;;;;;;;;;;;;;:::i;14898:380::-;;;;;;;;;;-1:-1:-1;14898:380:13;;;;;:::i;:::-;;:::i;10208:102:8:-;;;;;;;;;;;;;:::i;23694:174:13:-;;;;;;;;;;-1:-1:-1;23694:174:13;;;;;:::i;:::-;;:::i;2528:2454:10:-;;;;;;;;;;-1:-1:-1;2528:2454:10;;;;;:::i;:::-;;:::i;7169:318:13:-;;;;;;;;;;-1:-1:-1;7169:318:13;;;;;:::i;:::-;;:::i;18130:356::-;;;;;;;;;;;;;:::i;16630:316::-;;;;;;;;;;;;;:::i;16901:231:8:-;;;;;;;;;;-1:-1:-1;16901:231:8;;;;;:::i;:::-;;:::i;24687:291:13:-;;;;;;;;;;-1:-1:-1;24687:291:13;;;;;:::i;:::-;;:::i;26377:111::-;;;;;;;;;;-1:-1:-1;26377:111:13;;;;;:::i;:::-;;:::i;20202:974::-;;;;;;;;;;-1:-1:-1;20202:974:13;;;;;:::i;:::-;;:::i;15284:654::-;;;;;;;;;;-1:-1:-1;15284:654:13;;;;;:::i;:::-;;:::i;24103:578::-;;;;;;;;;;-1:-1:-1;24103:578:13;;;;;:::i;:::-;;:::i;6305:339::-;;;;;;;;;;-1:-1:-1;6305:339:13;;;;;:::i;:::-;;:::i;10901:708::-;;;;;;:::i;:::-;;:::i;3572:108::-;;;;;;;;;;-1:-1:-1;3654:19:13;;3572:108;;26155:151;;;;;;;;;;;;;:::i;23526:396:8:-;;;;;;:::i;:::-;;:::i;21182:865:13:-;;;;;;;;;;-1:-1:-1;21182:865:13;;;;;:::i;:::-;;:::i;13398:1494::-;;;:::i;3686:112::-;;;;;;;;;;-1:-1:-1;3686:112:13;;;;;:::i;:::-;-1:-1:-1;;;;;3773:18:13;3747:7;3773:18;;;:12;:18;;;;;;;3686:112;1070:418:10;;;;;;;;;;-1:-1:-1;1070:418:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5023:104:13:-;;;;;;;;;;-1:-1:-1;5023:104:13;;;;;:::i;:::-;5081:4;5104:16;;;:10;:16;;;;;;;;;5023:104;26562:558;;;;;;;;;;-1:-1:-1;26562:558:13;;;;;:::i;:::-;;:::i;17266:194::-;;;;;;;;;;-1:-1:-1;17266:194:13;;;;;:::i;:::-;;:::i;4046:122::-;;;;;;;;;;-1:-1:-1;4046:122:13;;;;;:::i;:::-;-1:-1:-1;;;;;4138:23:13;4112:7;4138:23;;;:17;:23;;;;;;;4046:122;1259:32;;;;;;;;;;-1:-1:-1;1259:32:13;;;;-1:-1:-1;;;1259:32:13;;;;;;22053:107;;;;;;;;;;-1:-1:-1;22053:107:13;;;;;:::i;:::-;;:::i;1297:30::-;;;;;;;;;;-1:-1:-1;1297:30:13;;;;-1:-1:-1;;;1297:30:13;;;;;;16952:308;;;;;;;;;;-1:-1:-1;16952:308:13;;;;;:::i;:::-;;:::i;4809:100::-;;;;;;;;;;-1:-1:-1;4809:100:13;;;;;:::i;:::-;4864:7;4890:12;;;:6;:12;;;;;;;4809:100;17282:162:8;;;;;;;;;;-1:-1:-1;17282:162:8;;;;;:::i;:::-;-1:-1:-1;;;;;17402:25:8;;;17379:4;17402:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17282:162;4565:126:13;;;;;;;;;;-1:-1:-1;4565:126:13;;;;;:::i;:::-;4633:7;4659:25;;;:19;:25;;;;;;;4565:126;11615:577;;;:::i;2543:215:0:-;;;;;;;;;;-1:-1:-1;2543:215:0;;;;;:::i;:::-;;:::i;4915:102:13:-;;;;;;;;;;-1:-1:-1;4915:102:13;;;;;:::i;:::-;4971:7;4997:13;;;:7;:13;;;;;;;4915:102;23269:339;;;;;;;;;;-1:-1:-1;23269:339:13;;;;;:::i;:::-;;:::i;24984:459::-;25138:4;25356:38;25382:11;25356:25;:38::i;:::-;:80;;;;25398:38;25424:11;25398:25;:38::i;:::-;25349:87;24984:459;-1:-1:-1;;24984:459:13:o;25449:162::-;1531:13:0;:11;:13::i;:::-;25562:42:13::1;25581:8;25591:12;25562:18;:42::i;:::-;25449:162:::0;;:::o;10039:98:8:-;10093:13;10125:5;10118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:98;:::o;16360:214::-;16436:7;16460:16;16468:7;16460;:16::i;:::-;16455:64;;16485:34;;-1:-1:-1;;;16485:34:8;;;;;;;;;;;16455:64;-1:-1:-1;16537:24:8;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;16537:30:8;;16360:214::o;15812:398::-;15900:13;15916:16;15924:7;15916;:16::i;:::-;15900:32;-1:-1:-1;39523:10:8;-1:-1:-1;;;;;15947:28:8;;;15943:172;;15994:44;16011:5;39523:10;17282:162;:::i;15994:44::-;15989:126;;16065:35;;-1:-1:-1;;;16065:35:8;;;;;;;;;;;15989:126;16125:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;16125:35:8;-1:-1:-1;;;;;16125:35:8;;;;;;;;;16175:28;;16125:24;;16175:28;;;;;;;15890:320;15812:398;;:::o;5252:129:13:-;5352:22;;;;:16;:22;;;;;;;;;5345:29;;;;;;;;;;;;;;;;;5317:16;;5345:29;;;5352:22;5345:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5345:29:13;;;;;;;;;;;;;;;;;;;;;;;5252:129;;;:::o;25956:139::-;1531:13:0;:11;:13::i;:::-;26016:17:13::1;:24:::0;;-1:-1:-1;;26016:24:13::1;26036:4;26016:24;::::0;;26055:33:::1;::::0;::::1;::::0;::::1;::::0;26072:15:::1;::::0;26055:33:::1;:::i;:::-;;;;;;;;25956:139::o:0;3282:284::-;3377:24;;;3369:75;;;;-1:-1:-1;;;3369:75:13;;15639:2:14;3369:75:13;;;15621:21:14;15678:2;15658:18;;;15651:30;15717:34;15697:18;;;15690:62;-1:-1:-1;;;15768:18:14;;;15761:36;15814:19;;3369:75:13;;;;;;;;;3459:9;3454:106;3474:14;;;3454:106;;;3509:40;3522:10;3534:3;;3538:1;3534:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3542:3;;3546:1;3542:6;;;;;;;:::i;:::-;;;;;;;3509:12;:40::i;:::-;3490:3;;3454:106;;;;3282:284;;;;:::o;17658:466::-;1531:13:0;:11;:13::i;:::-;17751:15:13::1;17725:23;;:41;17717:93;;;::::0;-1:-1:-1;;;17717:93:13;;16178:2:14;17717:93:13::1;::::0;::::1;16160:21:14::0;16217:2;16197:18;;;16190:30;16256:34;16236:18;;;16229:62;-1:-1:-1;;;16307:18:14;;;16300:37;16354:19;;17717:93:13::1;15976:403:14::0;17717:93:13::1;17829:18;::::0;-1:-1:-1;;;17829:18:13;::::1;;;17828:19;17820:64;;;::::0;-1:-1:-1;;;17820:64:13;;16586:2:14;17820:64:13::1;::::0;::::1;16568:21:14::0;;;16605:18;;;16598:30;16664:34;16644:18;;;16637:62;16716:18;;17820:64:13::1;16384:356:14::0;17820:64:13::1;17902:19;::::0;-1:-1:-1;;;17902:19:13;::::1;;;17894:65;;;;-1:-1:-1::0;;;17894:65:13::1;;;;;;;:::i;:::-;18021:21;17994:24;18008:10;17994:11;:24;:::i;:::-;:48;;;;:::i;:::-;17977:13;:11;:13::i;:::-;:65;17969:110;;;::::0;-1:-1:-1;;;17969:110:13;;17611:2:14;17969:110:13::1;::::0;::::1;17593:21:14::0;;;17630:18;;;17623:30;17689:34;17669:18;;;17662:62;17741:18;;17969:110:13::1;17409:356:14::0;17969:110:13::1;18090:20;:27:::0;;-1:-1:-1;;;;18090:27:13::1;-1:-1:-1::0;;;18090:27:13::1;::::0;;17658:466::o;5894:317:8:-;3268:1:13;6164:12:8;5955:7;6148:13;:28;-1:-1:-1;;6148:46:8;;5894:317::o;22474:272:13:-;22639:14;;-1:-1:-1;;;22639:14:13;;;;22638:15;22630:62;;;;-1:-1:-1;;;22630:62:13;;17972:2:14;22630:62:13;;;17954:21:14;18011:2;17991:18;;;17984:30;18050:34;18030:18;;;18023:62;-1:-1:-1;;;18101:18:14;;;18094:32;18143:19;;22630:62:13;17770:398:14;22630:62:13;22702:37;22721:4;22727:2;22731:7;22702:18;:37::i;:::-;22474:272;;;:::o;2379:419:3:-;2465:7;2522:26;;;:17;:26;;;;;;;;2493:55;;;;;;;;;-1:-1:-1;;;;;2493:55:3;;;;;-1:-1:-1;;;2493:55:3;;;-1:-1:-1;;;;;2493:55:3;;;;;;;;2465:7;;2559:90;;-1:-1:-1;2609:29:3;;;;;;;;;2619:19;2609:29;-1:-1:-1;;;;;2609:29:3;;;;-1:-1:-1;;;2609:29:3;;-1:-1:-1;;;;;2609:29:3;;;;;2559:90;2696:23;;;;2659:21;;3156:5;;2684:35;;-1:-1:-1;;;;;2684:35:3;:9;:35;:::i;:::-;2683:57;;;;:::i;:::-;2759:16;;;-1:-1:-1;2659:81:3;;-1:-1:-1;;2379:419:3;;;;;;:::o;15944:680:13:-;2261:21:2;:19;:21::i;:::-;1531:13:0::1;:11;:13::i;:::-;16039:4:13::2;16026:10;:8;:10::i;:::-;:17;16018:55;;;;-1:-1:-1::0;;;16018:55:13::2;;;;;;;:::i;:::-;16106:1;16091:12:::0;;;:6:::2;:12;::::0;;;;;:16;;;;:37:::2;;-1:-1:-1::0;16127:1:13::2;16111:13:::0;;;:7:::2;:13;::::0;;;;;:17;;16091:37:::2;16083:82;;;;-1:-1:-1::0;;;16083:82:13::2;;;;;;;:::i;:::-;16184:16;::::0;;;:10:::2;:16;::::0;;;;;::::2;;16183:17;16175:47;;;;-1:-1:-1::0;;;16175:47:13::2;;;;;;;:::i;:::-;16256:15;::::0;;;:9:::2;:15;::::0;;;;;;;;16240:6:::2;:12:::0;;;;;;;:31;16232:67:::2;;;::::0;-1:-1:-1;;;16232:67:13;;19866:2:14;16232:67:13::2;::::0;::::2;19848:21:14::0;19905:2;19885:18;;;19878:30;19944:25;19924:18;;;19917:53;19987:18;;16232:67:13::2;19664:347:14::0;16232:67:13::2;16310:13;16341::::0;;;:7:::2;:13;::::0;;;;;;;;16326:6:::2;:12:::0;;;;;;:28:::2;::::0;16341:13;16326:28:::2;:::i;:::-;16381:15;::::0;;;:9:::2;:15;::::0;;;;;16310:44;;-1:-1:-1;16372:24:13;::::2;;16364:76;;;;-1:-1:-1::0;;;16364:76:13::2;;;;;;;:::i;:::-;16469:15;::::0;:38:::2;::::0;16451:12:::2;::::0;-1:-1:-1;;;;;16469:15:13::2;::::0;16497:5;;16451:12;16469:38;16451:12;16469:38;16497:5;16469:15;:38:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16450:57;;;16522:7;16517:37;;16538:16;;-1:-1:-1::0;;;16538:16:13::2;;;;;;;;;;;16517:37;16564:16;::::0;;;:10:::2;:16;::::0;;;;;;:23;;-1:-1:-1;;16564:23:13::2;16583:4;16564:23;::::0;;16602:15;::::2;::::0;::::2;::::0;16611:5;738:25:14;;726:2;711:18;;592:177;16602:15:13::2;;;;;;;;16008:616;;2303:20:2::0;1716:1;2809:7;:22;2629:209;2303:20;15944:680:13;:::o;22263:100::-;1531:13:0;:11;:13::i;:::-;22334:15:13::1;:22:::0;;-1:-1:-1;;;;;;22334:22:13::1;-1:-1:-1::0;;;;;22334:22:13;;;::::1;::::0;;;::::1;::::0;;22263:100::o;22369:99::-;1531:13:0;:11;:13::i;:::-;22438:14:13::1;:23:::0;;;::::1;;-1:-1:-1::0;;;22438:23:13::1;-1:-1:-1::0;;;;22438:23:13;;::::1;::::0;;;::::1;::::0;;22369:99::o;22758:187:8:-;22899:39;22916:4;22922:2;22926:7;22899:39;;;;;;;;;;;;:16;:39::i;8228:2667:13:-;8285:7;8294;8334:4;8321:10;:8;:10::i;:::-;:17;8313:55;;;;-1:-1:-1;;;8313:55:13;;;;;;;:::i;:::-;8383:22;;;;:16;:22;;;;;:29;:34;;8379:78;;-1:-1:-1;8441:1:13;;8444;;-1:-1:-1;8228:2667:13;-1:-1:-1;8228:2667:13:o;8379:78::-;8494:2;8467:24;8586:17;8542:41;8553:4;8560:21;8542:10;:41::i;:::-;:61;8538:567;;;8624:9;8636:20;8655:1;8636:16;:20;:::i;:::-;8624:32;;8619:221;8658:5;;8619:221;;8722:17;8692:26;8703:4;8710:1;:6;;8692:10;:26::i;:::-;:47;8688:138;;8779:1;8763:17;;8802:5;;8688:138;8665:3;;;;:::i;:::-;;;;8619:221;;;;8538:567;;;8875:9;8887:20;:16;8906:1;8887:20;:::i;:::-;8875:32;;8870:225;8913:2;8909:1;:6;8870:225;;;8973:17;8944:26;8955:4;8962:1;:6;;8944:10;:26::i;:::-;:46;8940:141;;;9030:5;9034:1;9030;:5;:::i;:::-;9014:21;;9057:5;;8940:141;8917:3;;8870:225;;;;8538:567;9130:1;:18;;;;9115:11;;9181:17;;9135:13;;9181:17;:::i;:::-;9175:1;:24;;9159:41;;9210:11;9231:221;9244:4;9238:3;:10;9231:221;;;9285:1;9271:10;9277:4;9271:3;:10;:::i;:::-;9270:16;;;;:::i;:::-;9264:22;;9328:17;9304:21;9315:4;9321:3;9304:10;:21::i;:::-;:41;9300:142;;;9372:3;9365:10;;9231:221;;9300:142;9420:7;:3;9426:1;9420:7;:::i;:::-;9414:13;;9231:221;;;9495:17;9466:25;9477:4;9483:7;9489:1;9483:3;:7;:::i;:::-;9466:10;:25::i;:::-;:46;9462:1427;;9536:7;9542:1;9536:3;:7;:::i;:::-;9528:35;9545:17;;-1:-1:-1;8228:2667:13;-1:-1:-1;;;;;;;8228:2667:13:o;9462:1427::-;9594:14;9611:21;9622:4;9628:3;9611:10;:21::i;:::-;9594:38;;9650:6;9660:1;9650:11;9646:1233;;-1:-1:-1;;;9689:15:13;;;;-1:-1:-1;;9689:9:13;:15;;-1:-1:-1;;9689:15:13;;;;;;9706:1;;-1:-1:-1;8228:2667:13:o;9646:1233::-;9766:13;9747:32;;9846:6;9802:41;9813:4;9825:16;9820:1;:21;;9802:10;:41::i;:::-;:50;9798:646;;;9881:9;9893:20;9912:1;9893:16;:20;:::i;:::-;9881:32;;9876:250;9915:5;;9876:250;;9987:6;9957:26;9968:4;9975:1;:6;;9957:10;:26::i;:::-;:36;9953:151;;10041:1;10025:17;;10072:5;;9953:151;9922:3;;;;:::i;:::-;;;;9876:250;;;;9798:646;;;10177:9;10189:20;:16;10208:1;10189:20;:::i;:::-;10177:32;;10172:254;10215:2;10211:1;:6;10172:254;;;10283:6;10254:26;10265:4;10272:1;:6;;10254:10;:26::i;:::-;:35;10250:154;;;10337:5;10341:1;10337;:5;:::i;:::-;10321:21;;10372:5;;10250:154;10219:3;;10172:254;;;;9798:646;10469:1;:18;;;;-1:-1:-1;10520:17:13;;10474:13;;10520:17;:::i;:::-;10514:1;:24;;10506:33;;10557:266;10570:4;10564:3;:10;10557:266;;;10619:1;10605:10;10611:4;10605:3;:10;:::i;:::-;10604:16;;;;:::i;:::-;10598:22;;10670:6;10646:21;10657:4;10663:3;10646:10;:21::i;:::-;:30;10642:163;;;10711:3;10704:10;;10557:266;;10642:163;10775:7;:3;10781:1;10775:7;:::i;:::-;10769:13;;10557:266;;;10848:7;10854:1;10848:3;:7;:::i;:::-;10840:24;10857:6;;-1:-1:-1;8228:2667:13;-1:-1:-1;;;;;;;8228:2667:13:o;6755:201::-;6826:7;6849:12;;;:6;:12;;;;;;:17;;6845:56;;-1:-1:-1;6889:1:13;6882:8;;6845:56;6937:12;;;;:6;:12;;;;;;;;;-1:-1:-1;;;;;6918:10:13;;;;:4;:10;;;;;:16;;;;;;;;;;:31;;6937:12;6918:31;:::i;:::-;6911:38;6755:201;-1:-1:-1;;;6755:201:13:o;25666:210::-;1531:13:0;:11;:13::i;:::-;25744:17:13::1;::::0;::::1;;25740:60;;;25770:30;;-1:-1:-1::0;;;25770:30:13::1;;;;;;;;;;;25740:60;25810:15;:25;25828:7:::0;;25810:15;:25:::1;:::i;:::-;;25850:19;25861:7;;25850:19;;;;;;;:::i;:::-;;;;;;;;25666:210:::0;;:::o;5808:125::-;5868:16;5903:23;5896:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5896:30:13;;;;;;;;;;;;;;;;;;;;;;5808:125;:::o;6962:201::-;7033:7;7056:12;;;:6;:12;;;;;;:17;;7052:56;;-1:-1:-1;7096:1:13;7089:8;;7052:56;7144:12;;;;:6;:12;;;;;;;;;-1:-1:-1;;;;;7125:10:13;;;;:4;:10;;;;;:16;;;;;;;;;;:31;;7144:12;7125:31;:::i;1641:513:10:-;1780:23;1868:8;1843:22;1868:8;-1:-1:-1;;;;;1934:36:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1934:36:10;;-1:-1:-1;;1934:36:10;;;;;;;;;;;;1897:73;;1989:9;1984:123;2005:14;2000:1;:19;1984:123;;2060:32;2080:8;;2089:1;2080:11;;;;;;;:::i;:::-;;;;;;;2060:19;:32::i;:::-;2044:10;2055:1;2044:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;2021:3;;1984:123;;;-1:-1:-1;2127:10:10;1641:513;-1:-1:-1;;;;1641:513:10:o;12198:1194:13:-;2261:21:2;:19;:21::i;:::-;12264:20:13::1;::::0;-1:-1:-1;;;12264:20:13;::::1;;;:43:::0;::::1;;;-1:-1:-1::0;12289:18:13::1;::::0;-1:-1:-1;;;12289:18:13;::::1;;;12288:19;12264:43;:89;;;;;12338:15;12311:23;;:42;;12264:89;12256:132;;;;-1:-1:-1::0;;;12256:132:13::1;;;;;;;:::i;:::-;12469:10;12456:24;::::0;;;:12:::1;:24;::::0;;;;;12433:19:::1;::::0;12406:47:::1;::::0;12415:37:::1;::::0;:15:::1;:37;:::i;12406:47::-;:74;12398:102;;;::::0;-1:-1:-1;;;12398:102:13;;23878:2:14;12398:102:13::1;::::0;::::1;23860:21:14::0;23917:2;23897:18;;;23890:30;-1:-1:-1;;;23936:18:14;;;23929:45;23991:18;;12398:102:13::1;23676:339:14::0;12398:102:13::1;12512:17;12531:14:::0;12549:35:::1;12573:10;12549:23;:35::i;:::-;12511:73;;;;12614:1;12602:9;:13;:27;;;;12628:1;12619:6;:10;12602:27;12594:66;;;::::0;-1:-1:-1;;;12594:66:13;;24222:2:14;12594:66:13::1;::::0;::::1;24204:21:14::0;24261:2;24241:18;;;24234:30;24300:28;24280:18;;;24273:56;24346:18;;12594:66:13::1;24020:350:14::0;12594:66:13::1;12690:34;::::0;12672:12:::1;::::0;12690:10:::1;::::0;12713:6;;12672:12;12690:34;12672:12;12690:34;12713:6;12690:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12671:53;;;12739:7;12734:37;;12755:16;;-1:-1:-1::0;;;12755:16:13::1;;;;;;;;;;;12734:37;12786:13:::0;;12782:345:::1;;12924:10;:8;:10::i;:::-;:14;::::0;12937:1:::1;12924:14;:::i;:::-;12903:36;::::0;:17:::1;:36;:::i;:::-;12879:21;12852:24;12866:10;12852:11;:24;:::i;:::-;:48;;;;:::i;:::-;:87;;;;:::i;:::-;12839:9;12823:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:116;;12815:155;;;::::0;-1:-1:-1;;;12815:155:13;;24577:2:14;12815:155:13::1;::::0;::::1;24559:21:14::0;24616:2;24596:18;;;24589:30;24655:28;24635:18;;;24628:56;24701:18;;12815:155:13::1;24375:350:14::0;12815:155:13::1;12984:32;12994:10;13006:9;12984;:32::i;:::-;13046:10;13030:27;::::0;;;:15:::1;:27;::::0;;;;:40;;13061:9;;13030:27;:40:::1;::::0;13061:9;;13030:40:::1;:::i;:::-;::::0;;;-1:-1:-1;13085:31:13::1;::::0;-1:-1:-1;13105:10:13::1;13085:19;:31::i;:::-;13142:12;13157:47;13184:19;;13166:15;:37;;;;:::i;13157:47::-;13142:62;;13137:249;13226:10;13213:24;::::0;;;:12:::1;:24;::::0;;;;;13206:31;::::1;13137:249;;;13265:7;:17;13273:8;13280:1;13273:4:::0;:8:::1;:::i;:::-;13265:17;;;;;;;;;;;;13286:1;13265:22;13261:115;;13320:10;13307:24;::::0;;;:12:::1;:24;::::0;;;;:31;;;13356:5:::1;;13261:115;13239:6:::0;::::1;::::0;::::1;:::i;:::-;;;;13137:249;;;;12246:1146;;;2303:20:2::0;1716:1;2809:7;:22;2629:209;2303:20;12198:1194:13:o;17466:186::-;1531:13:0;:11;:13::i;:::-;17552:19:13::1;::::0;-1:-1:-1;;;17552:19:13;::::1;;;17551:20;17543:62;;;::::0;-1:-1:-1;;;17543:62:13;;24932:2:14;17543:62:13::1;::::0;::::1;24914:21:14::0;24971:2;24951:18;;;24944:30;25010:31;24990:18;;;24983:59;25059:18;;17543:62:13::1;24730:353:14::0;17543:62:13::1;17616:22;:29:::0;17466:186::o;11391:150:8:-;11463:7;11505:27;11524:7;11505:18;:27::i;7045:230::-;7117:7;-1:-1:-1;;;;;7140:19:8;;7136:60;;7168:28;;-1:-1:-1;;;7168:28:8;;;;;;;;;;;7136:60;-1:-1:-1;;;;;;7213:25:8;;;;;:18;:25;;;;;;-1:-1:-1;;;;;7213:55:8;;7045:230::o;2293:101:0:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;19577:619:13:-:0;2261:21:2;:19;:21::i;:::-;1531:13:0::1;:11;:13::i;:::-;19658:19:13::2;::::0;-1:-1:-1;;;19658:19:13;::::2;;;19650:65;;;;-1:-1:-1::0;;;19650:65:13::2;;;;;;;:::i;:::-;19749:1;19733:13;;:17;:39;;;;;19771:1;19754:14;;:18;19733:39;19725:84;;;;-1:-1:-1::0;;;19725:84:13::2;;;;;;;:::i;:::-;19828:17;::::0;::::2;;19827:18;19819:48;;;;-1:-1:-1::0;;;19819:48:13::2;;;;;;;:::i;:::-;19878:13;19910:14;;19894:13;;:30;;;;:::i;:::-;19878:46;;19951:16;;19942:5;:25;;19934:77;;;;-1:-1:-1::0;;;19934:77:13::2;;;;;;;:::i;:::-;20040:15;::::0;:38:::2;::::0;20022:12:::2;::::0;-1:-1:-1;;;;;20040:15:13::2;::::0;20068:5;;20022:12;20040:38;20022:12;20040:38;20068:5;20040:15;:38:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20021:57;;;20093:7;20088:37;;20109:16;;-1:-1:-1::0;;;20109:16:13::2;;;;;;;;;;;20088:37;20135:17;:24:::0;;-1:-1:-1;;20135:24:13::2;20155:4;20135:24;::::0;;20174:15:::2;::::0;::::2;::::0;::::2;::::0;20183:5;738:25:14;;726:2;711:18;;592:177;20174:15:13::2;;;;;;;;19640:556;;2303:20:2::0;1716:1;2809:7;:22;2629:209;22166:91:13;1531:13:0;:11;:13::i;:::-;22232:11:13::1;:18:::0;22166:91::o;5417:879:10:-;5495:16;5547:19;5580:25;5619:22;5644:16;5654:5;5644:9;:16::i;:::-;5619:41;;5674:25;5716:14;-1:-1:-1;;;;;5702:29:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5702:29:10;;5674:57;;5745:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5745:31:10;3268:1:13;5790:461:10;5839:14;5824:11;:29;5790:461;;5890:15;5903:1;5890:12;:15::i;:::-;5878:27;;5927:9;:16;;;5967:8;5923:71;6015:14;;-1:-1:-1;;;;;6015:28:10;;6011:109;;6087:14;;;-1:-1:-1;6011:109:10;6162:5;-1:-1:-1;;;;;6141:26:10;:17;-1:-1:-1;;;;;6141:26:10;;6137:100;;6217:1;6191:8;6200:13;;;;;;6191:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;6137:100;5855:3;;5790:461;;;-1:-1:-1;6271:8:10;;5417:879;-1:-1:-1;;;;;;5417:879:10:o;19115:456:13:-;1531:13:0;:11;:13::i;:::-;19208:19:13::1;::::0;-1:-1:-1;;;19208:19:13;::::1;;;19200:65;;;;-1:-1:-1::0;;;19200:65:13::1;;;;;;;:::i;:::-;19293:21;19283:6;:31;;19275:70;;;::::0;-1:-1:-1;;;19275:70:13;;25290:2:14;19275:70:13::1;::::0;::::1;25272:21:14::0;25329:2;25309:18;;;25302:30;25368:28;25348:18;;;25341:56;25414:18;;19275:70:13::1;25088:350:14::0;19275:70:13::1;19364:17;::::0;::::1;;19363:18;19355:48;;;;-1:-1:-1::0;;;19355:48:13::1;;;;;;;:::i;:::-;19439:16;::::0;19421:14:::1;19429:6:::0;19421:5;:14:::1;:::i;:::-;:34;;19413:86;;;;-1:-1:-1::0;;;19413:86:13::1;;;;;;;:::i;:::-;19510:13;:21:::0;;;;19541:14:::1;:23:::0;19115:456::o;18492:247::-;1531:13:0;:11;:13::i;:::-;18557:20:13::1;::::0;-1:-1:-1;;;18557:20:13;::::1;;;18549:63;;;::::0;-1:-1:-1;;;18549:63:13;;25645:2:14;18549:63:13::1;::::0;::::1;25627:21:14::0;25684:2;25664:18;;;25657:30;25723:32;25703:18;;;25696:60;25773:18;;18549:63:13::1;25443:354:14::0;18549:63:13::1;18707:18;:25:::0;;-1:-1:-1;;;;18707:25:13::1;-1:-1:-1::0;;;18707:25:13::1;::::0;;18492:247::o;18745:364::-;1531:13:0;:11;:13::i;:::-;18811:22:13::1;;18837:1;18811:27:::0;18803:80:::1;;;;-1:-1:-1::0;;;18803:80:13::1;;;;;;;:::i;:::-;18901:21;::::0;-1:-1:-1;;;18901:21:13;::::1;;;18893:65;;;::::0;-1:-1:-1;;;18893:65:13;;26413:2:14;18893:65:13::1;::::0;::::1;26395:21:14::0;26452:2;26432:18;;;26425:30;26491:33;26471:18;;;26464:61;26542:18;;18893:65:13::1;26211:355:14::0;18893:65:13::1;18995:22;;18976:15;:41;;18968:97;;;::::0;-1:-1:-1;;;18968:97:13;;26773:2:14;18968:97:13::1;::::0;::::1;26755:21:14::0;26812:2;26792:18;;;26785:30;26851:34;26831:18;;;26824:62;-1:-1:-1;;;26902:18:14;;;26895:41;26953:19;;18968:97:13::1;26571:407:14::0;18968:97:13::1;19076:19;:26:::0;;-1:-1:-1;;;;19076:26:13::1;-1:-1:-1::0;;;19076:26:13::1;::::0;;18745:364::o;6650:99::-;6691:7;6717:25;6726:15;6717:8;:25::i;:::-;6710:32;;6650:99;:::o;14898:380::-;14976:4;14963:10;:8;:10::i;:::-;:17;14955:55;;;;-1:-1:-1;;;14955:55:13;;;;;;;:::i;:::-;15029:20;;;;:14;:20;;;;;;;;15028:21;15020:56;;;;-1:-1:-1;;;15020:56:13;;27185:2:14;15020:56:13;;;27167:21:14;27224:2;27204:18;;;27197:30;-1:-1:-1;;;27243:18:14;;;27236:52;27305:18;;15020:56:13;26983:346:14;15020:56:13;15090:9;;15086:87;;15109:7;:17;15117:8;15124:1;15117:4;:8;:::i;:::-;15109:17;;;;;;;;;;;;15130:1;15109:22;15101:72;;;;-1:-1:-1;;;15101:72:13;;;;;;;:::i;:::-;15184:20;;;;:14;:20;;;;;:27;;-1:-1:-1;;15184:27:13;15207:4;15184:27;;;15253:18;15199:4;15253:12;:18::i;:::-;15222:12;;;;:6;:12;;;;;;;;15236:7;:13;;;;;;15221:50;;;14898:380::o;10208:102:8:-;10264:13;10296:7;10289:14;;;;;:::i;23694:174:13:-;-1:-1:-1;;;;;7440:25:8;;23815:7:13;7440:25:8;;;:18;:25;;1495:2;7440:25;;;;-1:-1:-1;;;;;7440:50:8;;7439:82;23845:16:13;7352:176:8;2528:2454:10;2667:16;2732:4;2723:5;:13;2719:45;;2745:19;;-1:-1:-1;;;2745:19:10;;;;;;;;;;;2719:45;2778:19;2811:17;2831:14;5645:7:8;5671:13;;5590:101;2831:14:10;2811:34;-1:-1:-1;3268:1:13;2921:5:10;:23;2917:85;;;3268:1:13;2964:23:10;;2917:85;3076:9;3069:4;:16;3065:71;;;3112:9;3105:16;;3065:71;3149:25;3177:16;3187:5;3177:9;:16::i;:::-;3149:44;;3368:4;3360:5;:12;3356:271;;;3414:12;;;3448:31;;;3444:109;;;3523:11;3503:31;;3444:109;3374:193;3356:271;;;-1:-1:-1;3611:1:10;3356:271;3640:25;3682:17;-1:-1:-1;;;;;3668:32:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3668:32:10;;3640:60;;3718:17;3739:1;3718:22;3714:76;;3767:8;-1:-1:-1;3760:15:10;;-1:-1:-1;;;3760:15:10;3714:76;3931:31;3965:26;3985:5;3965:19;:26::i;:::-;3931:60;;4005:25;4247:9;:16;;;4242:90;;-1:-1:-1;4303:14:10;;4242:90;4362:5;4345:467;4374:4;4369:1;:9;;:45;;;;;4397:17;4382:11;:32;;4369:45;4345:467;;;4451:15;4464:1;4451:12;:15::i;:::-;4439:27;;4488:9;:16;;;4528:8;4484:71;4576:14;;-1:-1:-1;;;;;4576:28:10;;4572:109;;4648:14;;;-1:-1:-1;4572:109:10;4723:5;-1:-1:-1;;;;;4702:26:10;:17;-1:-1:-1;;;;;4702:26:10;;4698:100;;4778:1;4752:8;4761:13;;;;;;4752:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;4698:100;4416:3;;4345:467;;;-1:-1:-1;;;4894:29:10;;;-1:-1:-1;4894:29:10;;2528:2454;-1:-1:-1;;;;;2528:2454:10:o;7169:318:13:-;-1:-1:-1;;;;;7299:18:13;;7237:17;7299:18;;;:12;:18;;;;;;7237:17;;7282:199;7323:47;7350:19;;7332:15;:37;;;;:::i;7323:47::-;7319:1;:51;7282:199;;;7404:21;7417:4;7423:1;7404:12;:21::i;:::-;7391:34;;;;:::i;:::-;;;7449:21;7462:4;7468:1;7449:12;:21::i;:::-;7439:31;;;;:::i;:::-;;-1:-1:-1;7372:3:13;;7282:199;;;;7169:318;;;:::o;18130:356::-;1531:13:0;:11;:13::i;:::-;18198:24:13::1;;18226:1;18198:29:::0;18190:84:::1;;;::::0;-1:-1:-1;;;18190:84:13;;27942:2:14;18190:84:13::1;::::0;::::1;27924:21:14::0;27981:2;27961:18;;;27954:30;28020:34;28000:18;;;27993:62;-1:-1:-1;;;28071:18:14;;;28064:40;28121:19;;18190:84:13::1;27740:406:14::0;18190:84:13::1;18292:22;;18318:1;18292:27:::0;18284:80:::1;;;;-1:-1:-1::0;;;18284:80:13::1;;;;;;;:::i;:::-;18383:19;::::0;-1:-1:-1;;;18383:19:13;::::1;;;18382:20;18374:66;;;::::0;-1:-1:-1;;;18374:66:13;;28353:2:14;18374:66:13::1;::::0;::::1;28335:21:14::0;28392:2;28372:18;;;28365:30;28431:34;28411:18;;;28404:62;-1:-1:-1;;;28482:18:14;;;28475:31;28523:19;;18374:66:13::1;28151:397:14::0;18374:66:13::1;18451:21;:28:::0;;-1:-1:-1;;;;18451:28:13::1;-1:-1:-1::0;;;18451:28:13::1;::::0;;18130:356::o;16630:316::-;2261:21:2;:19;:21::i;:::-;1531:13:0::1;:11;:13::i;:::-;16699:18:13::2;::::0;-1:-1:-1;;;16699:18:13;::::2;;;16691:59;;;::::0;-1:-1:-1;;;16691:59:13;;28755:2:14;16691:59:13::2;::::0;::::2;28737:21:14::0;28794:2;28774:18;;;28767:30;28833;28813:18;;;28806:58;28881:18;;16691:59:13::2;28553:352:14::0;16691:59:13::2;16827:15;::::0;:38:::2;::::0;16777:21:::2;::::0;16761:13:::2;::::0;-1:-1:-1;;;;;16827:15:13;;::::2;::::0;16777:21;;16761:13;16827:38;16761:13;16827:38;16777:21;16827:15;:38:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16808:57;;;16880:7;16875:37;;16896:16;;-1:-1:-1::0;;;16896:16:13::2;;;;;;;;;;;16875:37;16927:15;::::0;738:25:14;;;16927:15:13::2;::::0;726:2:14;711:18;16927:15:13::2;592:177:14::0;16901:231:8;39523:10;16995:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;16995:49:8;;;;;;;;;;;;:60;;-1:-1:-1;;16995:60:8;;;;;;;;;;17070:55;;540:41:14;;;16995:49:8;;39523:10;17070:55;;513:18:14;17070:55:8;;;;;;;16901:231;;:::o;24687:291:13:-;1531:13:0;:11;:13::i;:::-;24795:25:13;;::::1;24787:83;;;::::0;-1:-1:-1;;;24787:83:13;;29112:2:14;24787:83:13::1;::::0;::::1;29094:21:14::0;29151:2;29131:18;;;29124:30;29190:34;29170:18;;;29163:62;-1:-1:-1;;;29241:18:14;;;29234:43;29294:19;;24787:83:13::1;28910:409:14::0;24787:83:13::1;24885:9;24880:92;24900:14:::0;;::::1;24880:92;;;24935:26;24945:4;;24950:1;24945:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24954:3;;24958:1;24954:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;24935:26::-;24916:3;;24880:92;;26377:111:::0;1531:13:0;:11;:13::i;:::-;26457:15:13::1;:24;26475:6:::0;;26457:15;:24:::1;:::i;20202:974::-:0;2261:21:2;:19;:21::i;:::-;1531:13:0::1;:11;:13::i;:::-;20305:19:13::2;::::0;-1:-1:-1;;;20305:19:13;::::2;;;20297:65;;;;-1:-1:-1::0;;;20297:65:13::2;;;;;;;:::i;:::-;20396:1;20380:13;;:17;:39;;;;;20418:1;20401:14;;:18;20380:39;20372:84;;;;-1:-1:-1::0;;;20372:84:13::2;;;;;;;:::i;:::-;20472:9;20467:596;20487:16:::0;;::::2;20467:596;;;20529:18;:28;20548:5;;20554:1;20548:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20529:28:13::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;20529:28:13;;::::2;;20524:529;;20578:12;20596:5;;20602:1;20596:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20596:13:13::2;20641;;20617:11;:21;20629:5;;20635:1;20629:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20617:21:13::2;-1:-1:-1::0;;;;;20617:21:13::2;;;;;;;;;;;;;:37;;;;:::i;:::-;20596:63;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20577:82;;;20682:7;20677:37;;20698:16;;-1:-1:-1::0;;;20698:16:13::2;;;;;;;;;;;20677:37;20793:1;20777:13;;20753:11;:21;20765:5;;20771:1;20765:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20753:21:13::2;-1:-1:-1::0;;;;;20753:21:13::2;;;;;;;;;;;;;:37;;;;:::i;:::-;:41;20749:236;;;20818:58;20828:5;;20834:1;20828:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;20862:13;;20838:11;:21;20850:5;;20856:1;20850:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20838:21:13::2;-1:-1:-1::0;;;;;20838:21:13::2;;;;;;;;;;;;;:37;;;;:::i;:::-;20818:9;:58::i;:::-;20953:13;;20929:11;:21;20941:5;;20947:1;20941:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20929:21:13::2;-1:-1:-1::0;;;;;20929:21:13::2;;;;;;;;;;;;;:37;;;;:::i;:::-;20898:17;:27;20916:5;;20922:1;20916:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20898:27:13::2;-1:-1:-1::0;;;;;20898:27:13::2;;;;;;;;;;;;;:68;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20749:236:13::2;21034:4;21003:18;:28;21022:5;;21028:1;21022:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21003:28:13::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;21003:28:13;:35;;-1:-1:-1;;21003:35:13::2;::::0;::::2;;::::0;;;::::2;::::0;;-1:-1:-1;20524:529:13::2;20505:3;;20467:596;;;-1:-1:-1::0;21125:21:13::2;21098:24;21112:10;21098:11;:24;:::i;:::-;:48;;;;:::i;:::-;21081:13;:11;:13::i;:::-;:65;;21073:96;;;;-1:-1:-1::0;;;21073:96:13::2;;;;;;;:::i;:::-;2303:20:2::0;1716:1;2809:7;:22;2629:209;15284:654:13;1531:13:0;:11;:13::i;:::-;15397:4:13::1;15384:10;:8;:10::i;:::-;:17;15376:55;;;;-1:-1:-1::0;;;15376:55:13::1;;;;;;;:::i;:::-;15450:20;::::0;;;:14:::1;:20;::::0;;;;;::::1;;15449:21;15441:56;;;::::0;-1:-1:-1;;;15441:56:13;;27185:2:14;15441:56:13::1;::::0;::::1;27167:21:14::0;27224:2;27204:18;;;27197:30;-1:-1:-1;;;27243:18:14;;;27236:52;27305:18;;15441:56:13::1;26983:346:14::0;15441:56:13::1;15525:17;15515:6;:27;;15507:66;;;::::0;-1:-1:-1;;;15507:66:13;;25290:2:14;15507:66:13::1;::::0;::::1;25272:21:14::0;25329:2;25309:18;;;25302:30;25368:28;25348:18;;;25341:56;25414:18;;15507:66:13::1;25088:350:14::0;15507:66:13::1;15592:16;::::0;;;:10:::1;:16;::::0;;;;;::::1;;15591:17;15583:47;;;;-1:-1:-1::0;;;15583:47:13::1;;;;;;;:::i;:::-;15657:1;15648:6;:10;15640:36;;;::::0;-1:-1:-1;;;15640:36:13;;30062:2:14;15640:36:13::1;::::0;::::1;30044:21:14::0;30101:2;30081:18;;;30074:30;-1:-1:-1;;;30120:18:14;;;30113:43;30173:18;;15640:36:13::1;29860:337:14::0;15640:36:13::1;15712:15;::::0;;;:9:::1;:15;::::0;;;;;15694:14:::1;15702:6:::0;15694:5;:14:::1;:::i;:::-;:33;;15686:85;;;;-1:-1:-1::0;;;15686:85:13::1;;;;;;;:::i;:::-;15785:9:::0;;15781:87:::1;;15804:7;:17;15812:8;15819:1;15812:4:::0;:8:::1;:::i;:::-;15804:17;;;;;;;;;;;;15825:1;15804:22:::0;15796:72:::1;;;;-1:-1:-1::0;;;15796:72:13::1;;;;;;;:::i;:::-;15879:12;::::0;;;:6:::1;:12;::::0;;;;;;;:20;;;;15909:7:::1;:13:::0;;;;:22;15284:654::o;24103:578::-;1531:13:0;:11;:13::i;:::-;24197:3:13::1;22840:127;;22908:18;;22902:3;22886:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:40;22882:67;;;22935:14;;-1:-1:-1::0;;;22935:14:13::1;;;;;;;;;;;22882:67;24220:20:::2;::::0;-1:-1:-1;;;24220:20:13;::::2;;;24216:430;;;24264:18;::::0;-1:-1:-1;;;24264:18:13;::::2;;;24256:70;;;::::0;-1:-1:-1;;;24256:70:13;;30404:2:14;24256:70:13::2;::::0;::::2;30386:21:14::0;30443:2;30423:18;;;30416:30;30482:34;30462:18;;;30455:62;-1:-1:-1;;;30533:18:14;;;30526:37;30580:19;;24256:70:13::2;30202:403:14::0;24256:70:13::2;24216:430;;;24362:19;::::0;-1:-1:-1;;;24362:19:13;::::2;;;24357:279;;24433:24;24447:10;24433:11;:24;:::i;:::-;24426:3;24410:19;;:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:47;;24402:78;;;;-1:-1:-1::0;;;24402:78:13::2;;;;;;;:::i;24357:279::-;24577:21;24550:24;24564:10;24550:11;:24;:::i;:::-;:48;;;;:::i;:::-;24543:3;24527:19;;:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:71;;24519:102;;;;-1:-1:-1::0;;;24519:102:13::2;;;;;;;:::i;:::-;24656:18;24666:2;24670:3;24656:18;;:9;:18::i;6305:339::-:0;6390:20;;6358:12;;-1:-1:-1;;;6390:20:13;;;;:55;;;;;6422:23;;6414:4;:31;;6390:55;6382:98;;;;-1:-1:-1;;;6382:98:13;;25645:2:14;6382:98:13;;;25627:21:14;25684:2;25664:18;;;25657:30;25723:32;25703:18;;;25696:60;25773:18;;6382:98:13;25443:354:14;6382:98:13;845:6;6514:23;;6507:4;:30;;;;:::i;:::-;6506:49;;;;:::i;:::-;6499:56;;6576:14;6569:4;:21;6565:73;;;-1:-1:-1;6613:14:13;6565:73;6305:339;;;:::o;10901:708::-;2261:21:2;:19;:21::i;:::-;11000::13::1;::::0;-1:-1:-1;;;11000:21:13;::::1;;;:45:::0;::::1;;;-1:-1:-1::0;11026:19:13::1;::::0;-1:-1:-1;;;11026:19:13;::::1;;;11025:20;11000:45;10992:89;;;::::0;-1:-1:-1;;;10992:89:13;;30812:2:14;10992:89:13::1;::::0;::::1;30794:21:14::0;30851:2;30831:18;;;30824:30;30890:33;30870:18;;;30863:61;30941:18;;10992:89:13::1;30610:355:14::0;10992:89:13::1;11127:15;11099:24;;:43;;:88;;;;;11165:22;;11146:15;:41;;11099:88;11091:118;;;::::0;-1:-1:-1;;;11091:118:13;;31172:2:14;11091:118:13::1;::::0;::::1;31154:21:14::0;31211:2;31191:18;;;31184:30;-1:-1:-1;;;31230:18:14;;;31223:47;31287:18;;11091:118:13::1;30970:341:14::0;11091:118:13::1;11303:11;;11227:72;11252:5;;11227:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;11269:28:13::1;::::0;-1:-1:-1;;11286:10:13::1;31465:2:14::0;31461:15;31457:53;11269:28:13::1;::::0;::::1;31445:66:14::0;31527:12;;;-1:-1:-1;11269:28:13::1;::::0;-1:-1:-1;31316:229:14;11269:28:13::1;;;;;;;;;;;;;11259:39;;;;;;11227:24;:72::i;:::-;:87;11219:116;;;::::0;-1:-1:-1;;;11219:116:13;;31752:2:14;11219:116:13::1;::::0;::::1;31734:21:14::0;31791:2;31771:18;;;31764:30;-1:-1:-1;;;31810:18:14;;;31803:46;31866:18;;11219:116:13::1;31550:340:14::0;11219:116:13::1;11365:1;11353:9;:13;11345:62;;;::::0;-1:-1:-1;;;11345:62:13;;32097:2:14;11345:62:13::1;::::0;::::1;32079:21:14::0;32136:2;32116:18;;;32109:30;32175:34;32155:18;;;32148:62;-1:-1:-1;;;32226:18:14;;;32219:34;32270:19;;11345:62:13::1;31895:400:14::0;11345:62:13::1;11434:10;11422:23;::::0;;;:11:::1;:23;::::0;;;;;:28;;11418:99:::1;;11466:23;:40:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;11466:40:13;;;;;::::1;::::0;;-1:-1:-1;;;;;;11466:40:13::1;11495:10;11466:40;::::0;;11418:99:::1;11539:10;11527:23;::::0;;;:11:::1;:23;::::0;;;;:36;;11554:9:::1;::::0;11527:23;:36:::1;::::0;11554:9;;11527:36:::1;:::i;:::-;;;;;;;;11593:9;11573:16;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;1716:1:2;2809:7;:22;25449:162:13;;:::o;26155:151::-;26248:13;26284:15;26277:22;;;;;:::i;23526:396:8:-;23695:31;23708:4;23714:2;23718:7;23695:12;:31::i;:::-;-1:-1:-1;;;;;23740:14:8;;;:19;23736:180;;23778:56;23809:4;23815:2;23819:7;23828:5;23778:30;:56::i;:::-;23773:143;;23861:40;;-1:-1:-1;;;23861:40:8;;;;;;;;;;;23773:143;23526:396;;;;:::o;21182:865:13:-;2261:21:2;:19;:21::i;:::-;1531:13:0::1;:11;:13::i;:::-;21284:18:13::2;::::0;-1:-1:-1;;;21284:18:13;::::2;;;21276:59;;;::::0;-1:-1:-1;;;21276:59:13;;28755:2:14;21276:59:13::2;::::0;::::2;28737:21:14::0;28794:2;28774:18;;;28767:30;28833;28813:18;;;28806:58;28881:18;;21276:59:13::2;28553:352:14::0;21276:59:13::2;21351:9;21346:618;21366:16:::0;;::::2;21346:618;;;21432:14;21407:12;:22;21420:5;;21426:1;21420:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21407:22:13::2;-1:-1:-1::0;;;;;21407:22:13::2;;;;;;;;;;;;;:39;21403:551;;;21467:17;21486:14:::0;21504:33:::2;21528:5;;21534:1;21528:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;21504:33::-;21466:71;;;;21557:12;21575:5;;21581:1;21575:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21575:13:13::2;21596:6;21575:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21556:51;;;21630:7;21625:37;;21646:16;;-1:-1:-1::0;;;21646:16:13::2;;;;;;;;;;;21625:37;21685:13:::0;;21681:201:::2;;21722:30;21732:5;;21738:1;21732:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21742:9;21722;:30::i;:::-;21803:9;21774:15;:25;21790:5;;21796:1;21790:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21774:25:13::2;-1:-1:-1::0;;;;;21774:25:13::2;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;21834:29:13::2;::::0;-1:-1:-1;21854:5:13;;21860:1;21854:8;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21834:19;:29::i;:::-;21925:14;21900:12;:22;21913:5;;21919:1;21913:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21900:22:13::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;21900:22:13;:39;-1:-1:-1;;;21403:551:13::2;21384:3;;21346:618;;;;21999:18;;21982:13;:11;:13::i;13398:1494::-:0;2261:21:2;:19;:21::i;:::-;13471:20:13::1;::::0;-1:-1:-1;;;13471:20:13;::::1;;;:43:::0;::::1;;;-1:-1:-1::0;13496:18:13::1;::::0;-1:-1:-1;;;13496:18:13;::::1;;;13495:19;13471:43;:89;;;;;13545:15;13518:23;;:42;;13471:89;13463:132;;;;-1:-1:-1::0;;;13463:132:13::1;;;;;;;:::i;:::-;13676:10;13663:24;::::0;;;:12:::1;:24;::::0;;;;;13640:19:::1;::::0;13613:47:::1;::::0;13622:37:::1;::::0;:15:::1;:37;:::i;13613:47::-;:74;13605:102;;;::::0;-1:-1:-1;;;13605:102:13;;23878:2:14;13605:102:13::1;::::0;::::1;23860:21:14::0;23917:2;23897:18;;;23890:30;-1:-1:-1;;;23936:18:14;;;23929:45;23991:18;;13605:102:13::1;23676:339:14::0;13605:102:13::1;13738:14;13725:10;:8;:10::i;:::-;:27;13717:57;;;::::0;-1:-1:-1;;;13717:57:13;;32502:2:14;13717:57:13::1;::::0;::::1;32484:21:14::0;32541:2;32521:18;;;32514:30;-1:-1:-1;;;32560:18:14;;;32553:47;32617:18;;13717:57:13::1;32300:341:14::0;13717:57:13::1;13786:17;13805:14:::0;13823:35:::1;13847:10;13823:23;:35::i;:::-;13785:73;;;;13888:1;13876:9;:13;:27;;;;13902:1;13893:6;:10;13876:27;13868:65;;;::::0;-1:-1:-1;;;13868:65:13;;32848:2:14;13868:65:13::1;::::0;::::1;32830:21:14::0;32887:2;32867:18;;;32860:30;32926:27;32906:18;;;32899:55;32971:18;;13868:65:13::1;32646:349:14::0;13868:65:13::1;13972:22;13993:1;13972:17;:22;:::i;:::-;13951:18;13963:6:::0;13951:9:::1;:18;:::i;:::-;:43;13943:95;;;;-1:-1:-1::0;;;13943:95:13::1;;;;;;;:::i;:::-;14058:10;14053:16;::::0;;;:4:::1;:16;::::0;;;;;14070:10:::1;:8;:10::i;:::-;14053:28;;;;;;;;;;;;14085:1;14053:33:::0;14049:109:::1;;14102:16;:28;14119:10;:8;:10::i;:::-;14102:28:::0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;14102:28:13;;;:45;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;14102:45:13::1;14136:10;14102:45;::::0;;14049:109:::1;14200:18;14212:6:::0;14200:9:::1;:18;:::i;:::-;14173:10;14168:16;::::0;;;:4:::1;:16;::::0;;;;;14185:10:::1;:8;:10::i;:::-;14168:28;;;;;;;;;;;;:50;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;14253:18:13::1;::::0;-1:-1:-1;14265:6:13;14253:9:::1;:18;:::i;:::-;14228:9;:21;14238:10;:8;:10::i;:::-;14228:21;;;;;;;;;;;;:43;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;14286:13:13;;14282:345:::1;;14424:10;:8;:10::i;:::-;:14;::::0;14437:1:::1;14424:14;:::i;:::-;14403:36;::::0;:17:::1;:36;:::i;:::-;14379:21;14352:24;14366:10;14352:11;:24;:::i;:::-;:48;;;;:::i;:::-;:87;;;;:::i;:::-;14339:9;14323:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:116;;14315:155;;;::::0;-1:-1:-1;;;14315:155:13;;24577:2:14;14315:155:13::1;::::0;::::1;24559:21:14::0;24616:2;24596:18;;;24589:30;24655:28;24635:18;;;24628:56;24701:18;;14315:155:13::1;24375:350:14::0;14315:155:13::1;14484:32;14494:10;14506:9;14484;:32::i;:::-;14546:10;14530:27;::::0;;;:15:::1;:27;::::0;;;;:40;;14561:9;;14530:27;:40:::1;::::0;14561:9;;14530:40:::1;:::i;:::-;::::0;;;-1:-1:-1;14585:31:13::1;::::0;-1:-1:-1;14605:10:13::1;14585:19;:31::i;:::-;14642:12;14657:47;14684:19;;14666:15;:37;;;;:::i;14657:47::-;14642:62;;14637:249;14726:10;14713:24;::::0;;;:12:::1;:24;::::0;;;;;14706:31;::::1;14637:249;;;14765:7;:17;14773:8;14780:1;14773:4:::0;:8:::1;:::i;:::-;14765:17;;;;;;;;;;;;14786:1;14765:22;14761:115;;14820:10;14807:24;::::0;;;:12:::1;:24;::::0;;;;:31;;;14856:5:::1;;14761:115;14739:6:::0;::::1;::::0;::::1;:::i;:::-;;;;14637:249;;;;13453:1439;;2303:20:2::0;1716:1;2809:7;:22;2629:209;1070:418:10;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3268:1:13;1232:7:10;:25;:54;;;-1:-1:-1;5645:7:8;5671:13;1261:7:10;:25;;1232:54;1228:101;;;1309:9;1070:418;-1:-1:-1;;1070:418:10:o;1228:101::-;1350:21;1363:7;1350:12;:21::i;:::-;1338:33;;1385:9;:16;;;1381:63;;;1424:9;1070:418;-1:-1:-1;;1070:418:10:o;1381:63::-;1460:21;1473:7;1460:12;:21::i;26562:558:13:-;26678:13;26712:16;26720:7;26712;:16::i;:::-;26707:59;;26737:29;;-1:-1:-1;;;26737:29:13;;;;;;;;;;;26707:59;26777:21;26801:15;26777:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26851:7;26845:21;26870:1;26845:26;:268;;;;;;;;;;;;;;;;;26960:7;26993:18;27003:7;26993:9;:18::i;:::-;27037:15;26918:156;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26826:287;26562:558;-1:-1:-1;;;26562:558:13:o;17266:194::-;1531:13:0;:11;:13::i;:::-;17354:21:13::1;::::0;-1:-1:-1;;;17354:21:13;::::1;;;17353:22;17345:66;;;::::0;-1:-1:-1;;;17345:66:13;;36253:2:14;17345:66:13::1;::::0;::::1;36235:21:14::0;36292:2;36272:18;;;36265:30;36331:33;36311:18;;;36304:61;36382:18;;17345:66:13::1;36051:355:14::0;17345:66:13::1;17422:24;:31:::0;17266:194::o;22053:107::-;1531:13:0;:11;:13::i;:::-;22127:19:13::1;:26:::0;22053:107::o;16952:308::-;1531:13:0;:11;:13::i;:::-;17039:20:13::1;::::0;-1:-1:-1;;;17039:20:13;::::1;;;17038:21;17030:64;;;::::0;-1:-1:-1;;;17030:64:13;;36613:2:14;17030:64:13::1;::::0;::::1;36595:21:14::0;36652:2;36632:18;;;36625:30;36691:32;36671:18;;;36664:60;36741:18;;17030:64:13::1;36411:354:14::0;17030:64:13::1;17119:15;17112:4;:22;:65;;;;-1:-1:-1::0;845:6:13::1;17138:22;17145:15;17138:4:::0;:22:::1;:::i;:::-;:39;17112:65;17104:108;;;::::0;-1:-1:-1;;;17104:108:13;;36972:2:14;17104:108:13::1;::::0;::::1;36954:21:14::0;37011:2;36991:18;;;36984:30;37050:32;37030:18;;;37023:60;37100:18;;17104:108:13::1;36770:354:14::0;17104:108:13::1;17223:23;:30:::0;16952:308::o;11615:577::-;2261:21:2;:19;:21::i;:::-;11683:20:13::1;::::0;-1:-1:-1;;;11683:20:13;::::1;;;:43:::0;::::1;;;-1:-1:-1::0;11708:18:13::1;::::0;-1:-1:-1;;;11708:18:13;::::1;;;11707:19;11683:43;:89;;;;;11757:15;11730:23;;:42;;11683:89;11675:132;;;;-1:-1:-1::0;;;11675:132:13::1;;;;;;;:::i;:::-;11838:14;11825:10;:8;:10::i;:::-;:27;11817:57;;;::::0;-1:-1:-1;;;11817:57:13;;32502:2:14;11817:57:13::1;::::0;::::1;32484:21:14::0;32541:2;32521:18;;;32514:30;-1:-1:-1;;;32560:18:14;;;32553:47;32617:18;;11817:57:13::1;32300:341:14::0;11817:57:13::1;11904:22;11925:1;11904:17;:22;:::i;:::-;11892:9;:34;11884:86;;;;-1:-1:-1::0;;;11884:86:13::1;;;;;;;:::i;:::-;11990:10;11985:16;::::0;;;:4:::1;:16;::::0;;;;;12002:10:::1;:8;:10::i;:::-;11985:28;;;;;;;;;;;;12017:1;11985:33:::0;11981:109:::1;;12034:16;:28;12051:10;:8;:10::i;:::-;12034:28:::0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;12034:28:13;;;:45;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;12034:45:13::1;12068:10;12034:45;::::0;;11981:109:::1;12105:10;12100:16;::::0;;;:4:::1;:16;::::0;;;;12132:9:::1;::::0;12117:10:::1;:8;:10::i;:::-;12100:28;;;;;;;;;;;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;12176:9:13::1;::::0;-1:-1:-1;12151:9:13::1;:21;12161:10;:8;:10::i;:::-;12151:21;;;;;;;;;;;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;1716:1:2;2809:7;:22;12198:1194:13:o;2543:215:0:-;1531:13;:11;:13::i;:::-;-1:-1:-1;;;;;2627:22:0;::::1;2623:91;;2672:31;::::0;-1:-1:-1;;;2672:31:0;;2700:1:::1;2672:31;::::0;::::1;2410:51:14::0;2383:18;;2672:31:0::1;2264:203:14::0;2623:91:0::1;2723:28;2742:8;2723:18;:28::i;23269:339:13:-:0;1531:13:0;:11;:13::i;:::-;23415:18:13::1;;23395:17;:38;23391:109;;;23456:33;;-1:-1:-1::0;;;23456:33:13::1;;;;;;;;;;;23391:109;23509:18;:38:::0;;;23562:39:::1;::::0;738:25:14;;;23562:39:13::1;::::0;726:2:14;711:18;23562:39:13::1;;;;;;;23269:339:::0;:::o;9155:630:8:-;9240:4;-1:-1:-1;;;;;;;;;9558:25:8;;;;:101;;-1:-1:-1;;;;;;;;;;9634:25:8;;;9558:101;:177;;;-1:-1:-1;;;;;;;;9710:25:8;-1:-1:-1;;;9710:25:8;;9155:630::o;2116:213:3:-;2218:4;-1:-1:-1;;;;;;2241:41:3;;-1:-1:-1;;;2241:41:3;;:81;;-1:-1:-1;;;;;;;;;;861:40:6;;;2286:36:3;762:146:6;1796:162:0;1710:6;;-1:-1:-1;;;;;1710:6:0;39523:10:8;1855:23:0;1851:101;;1901:40;;-1:-1:-1;;;1901:40:0;;39523:10:8;1901:40:0;;;2410:51:14;2383:18;;1901:40:0;2264:203:14;3429:507:3;3156:5;-1:-1:-1;;;;;3576:26:3;;;-1:-1:-1;3572:173:3;;;3679:55;;-1:-1:-1;;;3679:55:3;;-1:-1:-1;;;;;37320:39:14;;3679:55:3;;;37302:58:14;37376:18;;;37369:34;;;37275:18;;3679:55:3;37129:280:14;3572:173:3;-1:-1:-1;;;;;3758:22:3;;3754:108;;3803:48;;-1:-1:-1;;;3803:48:3;;3848:1;3803:48;;;2410:51:14;2383:18;;3803:48:3;2264:203:14;3754:108:3;-1:-1:-1;3894:35:3;;;;;;;;;-1:-1:-1;;;;;3894:35:3;;;;;;-1:-1:-1;;;;;3894:35:3;;;;;;;;;;-1:-1:-1;;;3872:57:3;;;;:19;:57;3429:507::o;17693:277:8:-;17758:4;17812:7;3268:1:13;17793:26:8;;:65;;;;;17845:13;;17835:7;:23;17793:65;:151;;;;-1:-1:-1;;17895:26:8;;;;:17;:26;;;;;;-1:-1:-1;;;17895:44:8;:49;;17693:277::o;19903:2764::-;20040:27;20070;20089:7;20070:18;:27::i;:::-;20040:57;;20153:4;-1:-1:-1;;;;;20112:45:8;20128:19;-1:-1:-1;;;;;20112:45:8;;20108:86;;20166:28;;-1:-1:-1;;;20166:28:8;;;;;;;;;;;20108:86;20206:27;19036:24;;;:15;:24;;;;;19260:26;;39523:10;18673:30;;;-1:-1:-1;;;;;18370:28:8;;18651:20;;;18648:56;20389:179;;20481:43;20498:4;39523:10;17282:162;:::i;20481:43::-;20476:92;;20533:35;;-1:-1:-1;;;20533:35:8;;;;;;;;;;;20476:92;-1:-1:-1;;;;;20583:16:8;;20579:52;;20608:23;;-1:-1:-1;;;20608:23:8;;;;;;;;;;;20579:52;20774:15;20771:157;;;20912:1;20891:19;20884:30;20771:157;-1:-1:-1;;;;;21300:24:8;;;;;;;:18;:24;;;;;;21298:26;;-1:-1:-1;;21298:26:8;;;21368:22;;;;;;;;;21366:24;;-1:-1:-1;21366:24:8;;;14703:11;14678:23;14674:41;14661:63;-1:-1:-1;;;14661:63:8;21654:26;;;;:17;:26;;;;;:172;;;;-1:-1:-1;;;21943:47:8;;:52;;21939:617;;22047:1;22037:11;;22015:19;22168:30;;;:17;:30;;;;;;:35;;22164:378;;22304:13;;22289:11;:28;22285:239;;22449:30;;;;:17;:30;;;;;:52;;;22285:239;21997:559;21939:617;22600:7;22596:2;-1:-1:-1;;;;;22581:27:8;22590:4;-1:-1:-1;;;;;22581:27:8;;;;;;;;;;;20030:2637;;;19903:2764;;;:::o;2336:287:2:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:2;;37616:2:14;2460:63:2;;;37598:21:14;37655:2;37635:18;;;37628:30;37694:33;37674:18;;;37667:61;37745:18;;2460:63:2;37414:355:14;2460:63:2;1759:1;2598:7;:18;2336:287::o;7900:322:13:-;7972:11;8012:22;;;:16;:22;;;;;:29;7972:11;8051:165;8071:6;8067:1;:10;8051:165;;;8141:5;8101:4;:31;8106:16;:22;8123:4;8106:22;;;;;;;;;;;8129:1;8106:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;8106:25:13;8101:31;;;;;;;;;;;;;;;:37;;;;;;;;;:45;;;;:::i;:::-;8094:52;;;;:::i;:::-;;-1:-1:-1;8188:3:13;;8051:165;;;;7985:237;7900:322;;;;:::o;33423:110:8:-;33499:27;33509:2;33513:8;33499:27;;;;;;;;;;;;:9;:27::i;7493:401:13:-;-1:-1:-1;;;;;7572:18:13;;7560:9;7572:18;;;:12;:18;;;;;;7555:333;7596:47;7623:19;;7605:15;:37;;;;:::i;7596:47::-;7592:1;:51;7555:333;;;7690:21;7703:4;7709:1;7690:12;:21::i;:::-;7664:22;;;;:19;:22;;;;;:47;;:22;;;:47;;;;;:::i;:::-;;;;-1:-1:-1;;7759:10:13;;;;:7;:10;;;;;;;;;7733:19;:22;;;;;;;:36;;7725:91;;;;-1:-1:-1;;;7725:91:13;;37976:2:14;7725:91:13;;;37958:21:14;38015:2;37995:18;;;37988:30;38054:34;38034:18;;;38027:62;-1:-1:-1;;;38105:18:14;;;38098:40;38155:19;;7725:91:13;37774:406:14;7725:91:13;7856:21;7869:4;7875:1;7856:12;:21::i;:::-;-1:-1:-1;;;;;7830:19:13;;;;;;:13;:19;;;;;;;;:22;;;;;;;;:47;;:22;;:19;:47;;;;;:::i;:::-;;;;-1:-1:-1;;7645:3:13;;7555:333;;12515:1249:8;12582:7;12616;;3268:1:13;12662:23:8;12658:1042;;12714:13;;12707:4;:20;12703:997;;;12751:14;12768:23;;;:17;:23;;;;;;;-1:-1:-1;;;12855:24:8;;:29;;12851:831;;13510:111;13517:6;13527:1;13517:11;13510:111;;-1:-1:-1;;;13587:6:8;13569:25;;;;:17;:25;;;;;;13510:111;;12851:831;12729:971;12703:997;13726:31;;-1:-1:-1;;;13726:31:8;;;;;;;;;;;2912:187:0;3004:6;;;-1:-1:-1;;;;;3020:17:0;;;-1:-1:-1;;;;;;3020:17:0;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;11979:159:8:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12106:24:8;;;;:17;:24;;;;;;12087:44;;:18;:44::i;1967:290:5:-;2050:7;2092:4;2050:7;2106:116;2130:5;:12;2126:1;:16;2106:116;;;2178:33;2188:12;2202:5;2208:1;2202:8;;;;;;;;:::i;:::-;;;;;;;2178:9;:33::i;:::-;2163:48;-1:-1:-1;2144:3:5;;2106:116;;;-1:-1:-1;2238:12:5;1967:290;-1:-1:-1;;;1967:290:5:o;25948:697:8:-;26126:88;;-1:-1:-1;;;26126:88:8;;26106:4;;-1:-1:-1;;;;;26126:45:8;;;;;:88;;39523:10;;26193:4;;26199:7;;26208:5;;26126:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26126:88:8;;;;;;;;-1:-1:-1;;26126:88:8;;;;;;;;;;;;:::i;:::-;;;26122:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:6;:13;26421:1;26404:18;26400:229;;26449:40;;-1:-1:-1;;;26449:40:8;;;;;;;;;;;26400:229;26589:6;26583:13;26574:6;26570:2;26566:15;26559:38;26122:517;-1:-1:-1;;;;;;26282:64:8;-1:-1:-1;;;26282:64:8;;-1:-1:-1;25948:697:8;;;;;;:::o;11724:164::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11834:47:8;11853:27;11872:7;11853:18;:27::i;:::-;11834:18;:47::i;39637:1708::-;39702:17;40130:4;40123;40117:11;40113:22;40220:1;40214:4;40207:15;40293:4;40290:1;40286:12;40279:19;;;40373:1;40368:3;40361:14;40474:3;40708:5;40690:419;40755:1;40750:3;40746:11;40739:18;;40923:2;40917:4;40913:13;40909:2;40905:22;40900:3;40892:36;41015:2;41005:13;;41070:25;40690:419;41070:25;-1:-1:-1;41137:13:8;;;-1:-1:-1;;41250:14:8;;;41310:19;;;41250:14;39637:1708;-1:-1:-1;39637:1708:8:o;32675:669::-;32801:19;32807:2;32811:8;32801:5;:19::i;:::-;-1:-1:-1;;;;;32859:14:8;;;:19;32855:473;;32898:11;32912:13;32959:14;;;32991:229;33021:62;33060:1;33064:2;33068:7;;;;;;33077:5;33021:30;:62::i;:::-;33016:165;;33118:40;;-1:-1:-1;;;33118:40:8;;;;;;;;;;;33016:165;33215:3;33207:5;:11;32991:229;;33300:3;33283:13;;:20;33279:34;;33305:8;;;13858:361;-1:-1:-1;;;;;;;;;;;;;13967:41:8;;;;2004:3;14052:33;;;-1:-1:-1;;;;;14018:68:8;-1:-1:-1;;;14018:68:8;-1:-1:-1;;;14115:24:8;;:29;;-1:-1:-1;;;14096:48:8;;;;2513:3;14183:28;;;;-1:-1:-1;;;14154:58:8;-1:-1:-1;13858:361:8:o;9229:147:5:-;9292:7;9322:1;9318;:5;:51;;9564:13;9655:15;;;9690:4;9683:15;;;9736:4;9720:21;;9318:51;;;9564:13;9655:15;;;9690:4;9683:15;;;9736:4;9720:21;;9326:20;9496:261;27091:2902:8;27163:20;27186:13;;;27213;;;27209:44;;27235:18;;-1:-1:-1;;;27235:18:8;;;;;;;;;;;27209:44;-1:-1:-1;;;;;27728:22:8;;;;;;:18;:22;;;;1495:2;27728:22;;;:71;;27766:32;27754:45;;27728:71;;;28035:31;;;:17;:31;;;;;-1:-1:-1;15123:15:8;;15097:24;15093:46;14703:11;14678:23;14674:41;14671:52;14661:63;;28035:170;;28264:23;;;;28035:31;;27728:22;;29016:25;27728:22;;28872:328;29520:1;29506:12;29502:20;29461:339;29560:3;29551:7;29548:16;29461:339;;29774:7;29764:8;29761:1;29734:25;29731:1;29728;29723:59;29612:1;29599:15;29461:339;;;29465:75;29831:8;29843:1;29831:13;29827:45;;29853:19;;-1:-1:-1;;;29853:19:8;;;;;;;;;;;29827:45;29887:13;:19;-1:-1:-1;22474:272:13;;;:::o;14:131:14:-;-1:-1:-1;;;;;;88:32:14;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:173::-;842:20;;-1:-1:-1;;;;;891:31:14;;881:42;;871:70;;937:1;934;927:12;952:366;1019:6;1027;1080:2;1068:9;1059:7;1055:23;1051:32;1048:52;;;1096:1;1093;1086:12;1048:52;1119:29;1138:9;1119:29;:::i;:::-;1109:39;;1198:2;1187:9;1183:18;1170:32;-1:-1:-1;;;;;1235:5:14;1231:38;1224:5;1221:49;1211:77;;1284:1;1281;1274:12;1211:77;1307:5;1297:15;;;952:366;;;;;:::o;1323:250::-;1408:1;1418:113;1432:6;1429:1;1426:13;1418:113;;;1508:11;;;1502:18;1489:11;;;1482:39;1454:2;1447:10;1418:113;;;-1:-1:-1;;1565:1:14;1547:16;;1540:27;1323:250::o;1578:271::-;1620:3;1658:5;1652:12;1685:6;1680:3;1673:19;1701:76;1770:6;1763:4;1758:3;1754:14;1747:4;1740:5;1736:16;1701:76;:::i;:::-;1831:2;1810:15;-1:-1:-1;;1806:29:14;1797:39;;;;1838:4;1793:50;;1578:271;-1:-1:-1;;1578:271:14:o;1854:220::-;2003:2;1992:9;1985:21;1966:4;2023:45;2064:2;2053:9;2049:18;2041:6;2023:45;:::i;2079:180::-;2138:6;2191:2;2179:9;2170:7;2166:23;2162:32;2159:52;;;2207:1;2204;2197:12;2159:52;-1:-1:-1;2230:23:14;;2079:180;-1:-1:-1;2079:180:14:o;2472:254::-;2540:6;2548;2601:2;2589:9;2580:7;2576:23;2572:32;2569:52;;;2617:1;2614;2607:12;2569:52;2640:29;2659:9;2640:29;:::i;:::-;2630:39;2716:2;2701:18;;;;2688:32;;-1:-1:-1;;;2472:254:14:o;2731:658::-;2902:2;2954:21;;;3024:13;;2927:18;;;3046:22;;;2873:4;;2902:2;3125:15;;;;3099:2;3084:18;;;2873:4;3168:195;3182:6;3179:1;3176:13;3168:195;;;3247:13;;-1:-1:-1;;;;;3243:39:14;3231:52;;3338:15;;;;3303:12;;;;3279:1;3197:9;3168:195;;3394:367;3457:8;3467:6;3521:3;3514:4;3506:6;3502:17;3498:27;3488:55;;3539:1;3536;3529:12;3488:55;-1:-1:-1;3562:20:14;;-1:-1:-1;;;;;3594:30:14;;3591:50;;;3637:1;3634;3627:12;3591:50;3674:4;3666:6;3662:17;3650:29;;3734:3;3727:4;3717:6;3714:1;3710:14;3702:6;3698:27;3694:38;3691:47;3688:67;;;3751:1;3748;3741:12;3766:773;3888:6;3896;3904;3912;3965:2;3953:9;3944:7;3940:23;3936:32;3933:52;;;3981:1;3978;3971:12;3933:52;4021:9;4008:23;-1:-1:-1;;;;;4091:2:14;4083:6;4080:14;4077:34;;;4107:1;4104;4097:12;4077:34;4146:70;4208:7;4199:6;4188:9;4184:22;4146:70;:::i;:::-;4235:8;;-1:-1:-1;4120:96:14;-1:-1:-1;4323:2:14;4308:18;;4295:32;;-1:-1:-1;4339:16:14;;;4336:36;;;4368:1;4365;4358:12;4336:36;;4407:72;4471:7;4460:8;4449:9;4445:24;4407:72;:::i;:::-;3766:773;;;;-1:-1:-1;4498:8:14;-1:-1:-1;;;;3766:773:14:o;4544:328::-;4621:6;4629;4637;4690:2;4678:9;4669:7;4665:23;4661:32;4658:52;;;4706:1;4703;4696:12;4658:52;4729:29;4748:9;4729:29;:::i;:::-;4719:39;;4777:38;4811:2;4800:9;4796:18;4777:38;:::i;:::-;4767:48;;4862:2;4851:9;4847:18;4834:32;4824:42;;4544:328;;;;;:::o;4877:248::-;4945:6;4953;5006:2;4994:9;4985:7;4981:23;4977:32;4974:52;;;5022:1;5019;5012:12;4974:52;-1:-1:-1;;5045:23:14;;;5115:2;5100:18;;;5087:32;;-1:-1:-1;4877:248:14:o;5409:186::-;5468:6;5521:2;5509:9;5500:7;5496:23;5492:32;5489:52;;;5537:1;5534;5527:12;5489:52;5560:29;5579:9;5560:29;:::i;5600:160::-;5665:20;;5721:13;;5714:21;5704:32;;5694:60;;5750:1;5747;5740:12;5765:180;5821:6;5874:2;5862:9;5853:7;5849:23;5845:32;5842:52;;;5890:1;5887;5880:12;5842:52;5913:26;5929:9;5913:26;:::i;6203:592::-;6274:6;6282;6335:2;6323:9;6314:7;6310:23;6306:32;6303:52;;;6351:1;6348;6341:12;6303:52;6391:9;6378:23;-1:-1:-1;;;;;6461:2:14;6453:6;6450:14;6447:34;;;6477:1;6474;6467:12;6447:34;6515:6;6504:9;6500:22;6490:32;;6560:7;6553:4;6549:2;6545:13;6541:27;6531:55;;6582:1;6579;6572:12;6531:55;6622:2;6609:16;6648:2;6640:6;6637:14;6634:34;;;6664:1;6661;6654:12;6634:34;6709:7;6704:2;6695:6;6691:2;6687:15;6683:24;6680:37;6677:57;;;6730:1;6727;6720:12;6677:57;6761:2;6753:11;;;;;6783:6;;-1:-1:-1;6203:592:14;;-1:-1:-1;;;;6203:592:14:o;6800:437::-;6886:6;6894;6947:2;6935:9;6926:7;6922:23;6918:32;6915:52;;;6963:1;6960;6953:12;6915:52;7003:9;6990:23;-1:-1:-1;;;;;7028:6:14;7025:30;7022:50;;;7068:1;7065;7058:12;7022:50;7107:70;7169:7;7160:6;7149:9;7145:22;7107:70;:::i;:::-;7196:8;;7081:96;;-1:-1:-1;6800:437:14;-1:-1:-1;;;;6800:437:14:o;7242:349::-;7326:12;;-1:-1:-1;;;;;7322:38:14;7310:51;;7414:4;7403:16;;;7397:23;-1:-1:-1;;;;;7393:48:14;7377:14;;;7370:72;7505:4;7494:16;;;7488:23;7481:31;7474:39;7458:14;;;7451:63;7567:4;7556:16;;;7550:23;7575:8;7546:38;7530:14;;7523:62;7242:349::o;7596:724::-;7831:2;7883:21;;;7953:13;;7856:18;;;7975:22;;;7802:4;;7831:2;8054:15;;;;8028:2;8013:18;;;7802:4;8097:197;8111:6;8108:1;8105:13;8097:197;;;8160:52;8208:3;8199:6;8193:13;8160:52;:::i;:::-;8269:15;;;;8241:4;8232:14;;;;;8133:1;8126:9;8097:197;;8510:632;8681:2;8733:21;;;8803:13;;8706:18;;;8825:22;;;8652:4;;8681:2;8904:15;;;;8878:2;8863:18;;;8652:4;8947:169;8961:6;8958:1;8955:13;8947:169;;;9022:13;;9010:26;;9091:15;;;;9056:12;;;;8983:1;8976:9;8947:169;;9147:322;9224:6;9232;9240;9293:2;9281:9;9272:7;9268:23;9264:32;9261:52;;;9309:1;9306;9299:12;9261:52;9332:29;9351:9;9332:29;:::i;:::-;9322:39;9408:2;9393:18;;9380:32;;-1:-1:-1;9459:2:14;9444:18;;;9431:32;;9147:322;-1:-1:-1;;;9147:322:14:o;9474:254::-;9539:6;9547;9600:2;9588:9;9579:7;9575:23;9571:32;9568:52;;;9616:1;9613;9606:12;9568:52;9639:29;9658:9;9639:29;:::i;:::-;9629:39;;9687:35;9718:2;9707:9;9703:18;9687:35;:::i;:::-;9677:45;;9474:254;;;;;:::o;10952:316::-;11029:6;11037;11045;11098:2;11086:9;11077:7;11073:23;11069:32;11066:52;;;11114:1;11111;11104:12;11066:52;-1:-1:-1;;11137:23:14;;;11207:2;11192:18;;11179:32;;-1:-1:-1;11258:2:14;11243:18;;;11230:32;;10952:316;-1:-1:-1;10952:316:14:o;11273:163::-;11340:20;;11400:10;11389:22;;11379:33;;11369:61;;11426:1;11423;11416:12;11441:258;11508:6;11516;11569:2;11557:9;11548:7;11544:23;11540:32;11537:52;;;11585:1;11582;11575:12;11537:52;11608:28;11626:9;11608:28;:::i;:::-;11598:38;;11655;11689:2;11678:9;11674:18;11655:38;:::i;12146:127::-;12207:10;12202:3;12198:20;12195:1;12188:31;12238:4;12235:1;12228:15;12262:4;12259:1;12252:15;12278:1138;12373:6;12381;12389;12397;12450:3;12438:9;12429:7;12425:23;12421:33;12418:53;;;12467:1;12464;12457:12;12418:53;12490:29;12509:9;12490:29;:::i;:::-;12480:39;;12538:38;12572:2;12561:9;12557:18;12538:38;:::i;:::-;12528:48;;12623:2;12612:9;12608:18;12595:32;12585:42;;12678:2;12667:9;12663:18;12650:32;-1:-1:-1;;;;;12742:2:14;12734:6;12731:14;12728:34;;;12758:1;12755;12748:12;12728:34;12796:6;12785:9;12781:22;12771:32;;12841:7;12834:4;12830:2;12826:13;12822:27;12812:55;;12863:1;12860;12853:12;12812:55;12899:2;12886:16;12921:2;12917;12914:10;12911:36;;;12927:18;;:::i;:::-;13002:2;12996:9;12970:2;13056:13;;-1:-1:-1;;13052:22:14;;;13076:2;13048:31;13044:40;13032:53;;;13100:18;;;13120:22;;;13097:46;13094:72;;;13146:18;;:::i;:::-;13186:10;13182:2;13175:22;13221:2;13213:6;13206:18;13261:7;13256:2;13251;13247;13243:11;13239:20;13236:33;13233:53;;;13282:1;13279;13272:12;13233:53;13338:2;13333;13329;13325:11;13320:2;13312:6;13308:15;13295:46;13383:1;13378:2;13373;13365:6;13361:15;13357:24;13350:35;13404:6;13394:16;;;;;;;12278:1138;;;;;;;:::o;13421:268::-;13619:3;13604:19;;13632:51;13608:9;13665:6;13632:51;:::i;13694:260::-;13762:6;13770;13823:2;13811:9;13802:7;13798:23;13794:32;13791:52;;;13839:1;13836;13829:12;13791:52;13862:29;13881:9;13862:29;:::i;13959:380::-;14038:1;14034:12;;;;14081;;;14102:61;;14156:4;14148:6;14144:17;14134:27;;14102:61;14209:2;14201:6;14198:14;14178:18;14175:38;14172:161;;14255:10;14250:3;14246:20;14243:1;14236:31;14290:4;14287:1;14280:15;14318:4;14315:1;14308:15;14172:161;;13959:380;;;:::o;14470:962::-;14579:4;14608:2;14637;14626:9;14619:21;14660:1;14693:6;14687:13;14723:36;14749:9;14723:36;:::i;:::-;14795:6;14790:2;14779:9;14775:18;14768:34;14821:2;14842:1;14874;14863:9;14859:17;14890:1;14885:158;;;;15057:1;15052:354;;;;14852:554;;14885:158;14952:3;14948:8;14937:9;14933:24;14928:2;14917:9;14913:18;14906:52;15030:2;15018:6;15011:14;15004:22;15001:1;14997:30;14986:9;14982:46;14978:55;14971:62;;14885:158;;15052:354;15083:6;15080:1;15073:17;15131:2;15128:1;15118:16;15156:1;15170:180;15184:6;15181:1;15178:13;15170:180;;;15277:14;;15253:17;;;15249:26;;15242:50;15320:16;;;;15199:10;;15170:180;;;15374:17;;15393:2;15370:26;;-1:-1:-1;;14852:554:14;-1:-1:-1;15423:3:14;;14470:962;-1:-1:-1;;;;;;;;14470:962:14:o;15844:127::-;15905:10;15900:3;15896:20;15893:1;15886:31;15936:4;15933:1;15926:15;15960:4;15957:1;15950:15;16745:397;16947:2;16929:21;;;16986:2;16966:18;;;16959:30;17025:34;17020:2;17005:18;;16998:62;-1:-1:-1;;;17091:2:14;17076:18;;17069:31;17132:3;17117:19;;16745:397::o;17147:127::-;17208:10;17203:3;17199:20;17196:1;17189:31;17239:4;17236:1;17229:15;17263:4;17260:1;17253:15;17279:125;17344:9;;;17365:10;;;17362:36;;;17378:18;;:::i;18173:168::-;18246:9;;;18277;;18294:15;;;18288:22;;18274:37;18264:71;;18315:18;;:::i;18346:127::-;18407:10;18402:3;18398:20;18395:1;18388:31;18438:4;18435:1;18428:15;18462:4;18459:1;18452:15;18478:120;18518:1;18544;18534:35;;18549:18;;:::i;:::-;-1:-1:-1;18583:9:14;;18478:120::o;18603:349::-;18805:2;18787:21;;;18844:2;18824:18;;;18817:30;18883:27;18878:2;18863:18;;18856:55;18943:2;18928:18;;18603:349::o;18957:356::-;19159:2;19141:21;;;19178:18;;;19171:30;19237:34;19232:2;19217:18;;19210:62;19304:2;19289:18;;18957:356::o;19318:341::-;19520:2;19502:21;;;19559:2;19539:18;;;19532:30;-1:-1:-1;;;19593:2:14;19578:18;;19571:47;19650:2;19635:18;;19318:341::o;20016:403::-;20218:2;20200:21;;;20257:2;20237:18;;;20230:30;20296:34;20291:2;20276:18;;20269:62;-1:-1:-1;;;20362:2:14;20347:18;;20340:37;20409:3;20394:19;;20016:403::o;20634:128::-;20701:9;;;20722:11;;;20719:37;;;20736:18;;:::i;20767:136::-;20806:3;20834:5;20824:39;;20843:18;;:::i;:::-;-1:-1:-1;;;20879:18:14;;20767:136::o;20908:518::-;21010:2;21005:3;21002:11;20999:421;;;21046:5;21043:1;21036:16;21090:4;21087:1;21077:18;21160:2;21148:10;21144:19;21141:1;21137:27;21131:4;21127:38;21196:4;21184:10;21181:20;21178:47;;;-1:-1:-1;21219:4:14;21178:47;21274:2;21269:3;21265:12;21262:1;21258:20;21252:4;21248:31;21238:41;;21329:81;21347:2;21340:5;21337:13;21329:81;;;21406:1;21392:16;;21373:1;21362:13;21329:81;;21602:1198;-1:-1:-1;;;;;21721:3:14;21718:27;21715:53;;;21748:18;;:::i;:::-;21777:94;21867:3;21827:38;21859:4;21853:11;21827:38;:::i;:::-;21821:4;21777:94;:::i;:::-;21897:1;21922:2;21917:3;21914:11;21939:1;21934:608;;;;22586:1;22603:3;22600:93;;;-1:-1:-1;22659:19:14;;;22646:33;22600:93;-1:-1:-1;;21559:1:14;21555:11;;;21551:24;21547:29;21537:40;21583:1;21579:11;;;21534:57;22706:78;;21907:887;;21934:608;14417:1;14410:14;;;14454:4;14441:18;;-1:-1:-1;;21970:17:14;;;22085:229;22099:7;22096:1;22093:14;22085:229;;;22188:19;;;22175:33;22160:49;;22295:4;22280:20;;;;22248:1;22236:14;;;;22115:12;22085:229;;;22089:3;22342;22333:7;22330:16;22327:159;;;22466:1;22462:6;22456:3;22450;22447:1;22443:11;22439:21;22435:34;22431:39;22418:9;22413:3;22409:19;22396:33;22392:79;22384:6;22377:95;22327:159;;;22529:1;22523:3;22520:1;22516:11;22512:19;22506:4;22499:33;21907:887;;21602:1198;;;:::o;22805:390::-;22964:2;22953:9;22946:21;23003:6;22998:2;22987:9;22983:18;22976:34;23060:6;23052;23047:2;23036:9;23032:18;23019:48;23116:1;23087:22;;;23111:2;23083:31;;;23076:42;;;;23179:2;23158:15;;;-1:-1:-1;;23154:29:14;23139:45;23135:54;;22805:390;-1:-1:-1;22805:390:14:o;23200:112::-;23232:1;23258;23248:35;;23263:18;;:::i;:::-;-1:-1:-1;23297:9:14;;23200:112::o;23317:354::-;23519:2;23501:21;;;23558:2;23538:18;;;23531:30;23597:32;23592:2;23577:18;;23570:60;23662:2;23647:18;;23317:354::o;25802:404::-;26004:2;25986:21;;;26043:2;26023:18;;;26016:30;26082:34;26077:2;26062:18;;26055:62;-1:-1:-1;;;26148:2:14;26133:18;;26126:38;26196:3;26181:19;;25802:404::o;27334:401::-;27536:2;27518:21;;;27575:2;27555:18;;;27548:30;27614:34;27609:2;27594:18;;27587:62;-1:-1:-1;;;27680:2:14;27665:18;;27658:35;27725:3;27710:19;;27334:401::o;29324:184::-;29382:6;29435:2;29423:9;29414:7;29410:23;29406:32;29403:52;;;29451:1;29448;29441:12;29403:52;29474:28;29492:9;29474:28;:::i;29513:342::-;29715:2;29697:21;;;29754:2;29734:18;;;29727:30;-1:-1:-1;;;29788:2:14;29773:18;;29766:48;29846:2;29831:18;;29513:342::o;33000:416::-;33089:1;33126:5;33089:1;33140:270;33161:7;33151:8;33148:21;33140:270;;;33220:4;33216:1;33212:6;33208:17;33202:4;33199:27;33196:53;;;33229:18;;:::i;:::-;33279:7;33269:8;33265:22;33262:55;;;33299:16;;;;33262:55;33378:22;;;;33338:15;;;;33140:270;;;33144:3;33000:416;;;;;:::o;33421:806::-;33470:5;33500:8;33490:80;;-1:-1:-1;33541:1:14;33555:5;;33490:80;33589:4;33579:76;;-1:-1:-1;33626:1:14;33640:5;;33579:76;33671:4;33689:1;33684:59;;;;33757:1;33752:130;;;;33664:218;;33684:59;33714:1;33705:10;;33728:5;;;33752:130;33789:3;33779:8;33776:17;33773:43;;;33796:18;;:::i;:::-;-1:-1:-1;;33852:1:14;33838:16;;33867:5;;33664:218;;33966:2;33956:8;33953:16;33947:3;33941:4;33938:13;33934:36;33928:2;33918:8;33915:16;33910:2;33904:4;33901:12;33897:35;33894:77;33891:159;;;-1:-1:-1;34003:19:14;;;34035:5;;33891:159;34082:34;34107:8;34101:4;34082:34;:::i;:::-;34152:6;34148:1;34144:6;34140:19;34131:7;34128:32;34125:58;;;34163:18;;:::i;:::-;34201:20;;33421:806;-1:-1:-1;;;33421:806:14:o;34232:140::-;34290:5;34319:47;34360:4;34350:8;34346:19;34340:4;34319:47;:::i;34377:403::-;34579:2;34561:21;;;34618:2;34598:18;;;34591:30;34657:34;34652:2;34637:18;;34630:62;-1:-1:-1;;;34723:2:14;34708:18;;34701:37;34770:3;34755:19;;34377:403::o;34785:1261::-;35009:3;35047:6;35041:13;35073:4;35086:66;35145:6;35140:3;35133:4;35125:6;35121:17;35086:66;:::i;:::-;35215:13;;35174:16;;;;35237:70;35215:13;35174:16;35284:4;35272:17;;35237:70;:::i;:::-;35396:13;;35329:20;;;35369:1;;35434:36;35396:13;35434:36;:::i;:::-;35489:1;35506:17;;;35532:141;;;;35687:1;35682:339;;;;35499:522;;35532:141;-1:-1:-1;;35567:24:14;;35553:39;;35644:16;;35637:24;35623:39;;35612:51;;;-1:-1:-1;35532:141:14;;35682:339;35713:6;35710:1;35703:17;35761:4;35758:1;35748:18;35788:1;35802:169;35816:8;35813:1;35810:15;35802:169;;;35898:14;;35883:13;;;35876:37;35941:16;;;;35833:10;;35802:169;;;35806:3;;36002:8;35995:5;35991:20;35984:27;;35499:522;-1:-1:-1;36037:3:14;;34785:1261;-1:-1:-1;;;;;;;;;;34785:1261:14:o;38185:489::-;-1:-1:-1;;;;;38454:15:14;;;38436:34;;38506:15;;38501:2;38486:18;;38479:43;38553:2;38538:18;;38531:34;;;38601:3;38596:2;38581:18;;38574:31;;;38379:4;;38622:46;;38648:19;;38640:6;38622:46;:::i;:::-;38614:54;38185:489;-1:-1:-1;;;;;;38185:489:14:o;38679:249::-;38748:6;38801:2;38789:9;38780:7;38776:23;38772:32;38769:52;;;38817:1;38814;38807:12;38769:52;38849:9;38843:16;38868:30;38892:5;38868:30;:::i
Swarm Source
ipfs://4a8b86f982c0d4e477388d5c3ca59520d4933ba4ffd02a7f3bf45df536feb8a3
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.