Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 354 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Revealed | 16493236 | 666 days ago | IN | 0 ETH | 0.00085398 | ||||
Withdraw | 16492801 | 666 days ago | IN | 0 ETH | 0.00102485 | ||||
Set Auction Sett... | 16486138 | 667 days ago | IN | 0 ETH | 0.00124474 | ||||
Settle Bidder | 16486133 | 667 days ago | IN | 0 ETH | 0.0142463 | ||||
Settle Bidder | 16486129 | 667 days ago | IN | 0 ETH | 0.02837706 | ||||
Settle Bidder | 16486126 | 667 days ago | IN | 0 ETH | 0.01970165 | ||||
Settle Bidder | 16486122 | 667 days ago | IN | 0 ETH | 0.02736596 | ||||
Settle Bidder | 16486118 | 667 days ago | IN | 0 ETH | 0.02517212 | ||||
Settle Bidder | 16486114 | 667 days ago | IN | 0 ETH | 0.02281369 | ||||
Settle Bidder | 16486110 | 667 days ago | IN | 0 ETH | 0.02308994 | ||||
Settle Bidder | 16486107 | 667 days ago | IN | 0 ETH | 0.0250877 | ||||
Settle Bidder | 16486103 | 667 days ago | IN | 0 ETH | 0.02133019 | ||||
Settle Bidder | 16486099 | 667 days ago | IN | 0 ETH | 0.02526405 | ||||
Settle Bidder | 16486095 | 667 days ago | IN | 0 ETH | 0.00279798 | ||||
Settle Bidder | 16486091 | 667 days ago | IN | 0 ETH | 0.02124233 | ||||
Set Raffle Winne... | 16486085 | 667 days ago | IN | 0 ETH | 0.01237087 | ||||
Create Bid | 16486081 | 667 days ago | IN | 0.165 ETH | 0.00081686 | ||||
Create Bid | 16486080 | 667 days ago | IN | 0.165 ETH | 0.00077647 | ||||
Set Auction Winn... | 16486080 | 667 days ago | IN | 0 ETH | 0.03656048 | ||||
Create Bid | 16486079 | 667 days ago | IN | 0.161 ETH | 0.00127344 | ||||
Create Bid | 16486079 | 667 days ago | IN | 0.17 ETH | 0.00278576 | ||||
Create Bid | 16486078 | 667 days ago | IN | 0.17 ETH | 0.00142944 | ||||
Create Bid | 16486078 | 667 days ago | IN | 0.16 ETH | 0.00285562 | ||||
Create Bid | 16486077 | 667 days ago | IN | 0.21 ETH | 0.00271227 | ||||
Create Bid | 16486077 | 667 days ago | IN | 0.161 ETH | 0.00276655 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16492801 | 666 days ago | 24.044 ETH | ||||
16486133 | 667 days ago | 0.03 ETH | ||||
16486133 | 667 days ago | 0.123 ETH | ||||
16486133 | 667 days ago | 0.16 ETH | ||||
16486133 | 667 days ago | 0.01 ETH | ||||
16486129 | 667 days ago | 0.1 ETH | ||||
16486129 | 667 days ago | 0.005 ETH | ||||
16486129 | 667 days ago | 0.123 ETH | ||||
16486129 | 667 days ago | 0.1 ETH | ||||
16486129 | 667 days ago | 0.155 ETH | ||||
16486129 | 667 days ago | 0.121 ETH | ||||
16486129 | 667 days ago | 0.121 ETH | ||||
16486126 | 667 days ago | 0.153 ETH | ||||
16486126 | 667 days ago | 0.161 ETH | ||||
16486126 | 667 days ago | 0.155 ETH | ||||
16486126 | 667 days ago | 0.1 ETH | ||||
16486126 | 667 days ago | 0.11 ETH | ||||
16486126 | 667 days ago | 0.127 ETH | ||||
16486126 | 667 days ago | 0.121 ETH | ||||
16486126 | 667 days ago | 0.149 ETH | ||||
16486122 | 667 days ago | 0.1 ETH | ||||
16486122 | 667 days ago | 0.16 ETH | ||||
16486122 | 667 days ago | 0.021 ETH | ||||
16486122 | 667 days ago | 0.127 ETH | ||||
16486122 | 667 days ago | 0.15 ETH |
Loading...
Loading
Contract Name:
QuasarFighterAuctionHouse
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: GPL-3.0 // The Wildxyz auctionhouse.sol // AuctionHouse.sol is a modified version of the original code from the // NounsAuctionHouse.sol which is a modified version of Zora's AuctionHouse.sol: // https://github.com/ourzora/auction-house/ // licensed under the GPL-3.0 license. pragma solidity ^0.8.17; import './Pausable.sol'; import './ReentrancyGuard.sol'; import './Ownable.sol'; import './IQF.sol'; import './IAuctionHouse.sol'; contract QuasarFighterAuctionHouse is IAuctionHouse, Pausable, ReentrancyGuard, Ownable { // auction variables uint256 public timeBuffer = 120; // min amount of time left in an auction after last bid uint256 public minimumBid = .1 ether; // The minimum price accepted in an auction uint256 public minBidIncrement = .01 ether; // The minimum amount by which a bid must exceed the current highest bid uint256 public allowListPrice = .1 ether; // The allowlist price uint256 public duration = 86400; // 86400 == 1 day The duration of a single auction in seconds address payable public payee; // The address that receives funds from the auction uint256 public raffleSupply = 7; // max number of raffle winners uint256 public auctionSupply = 29; // number of auction supply max of raffle ticket uint256 public allowlistSupply = 176; // number allowlist supply uint256 public maxSupply = 256; // total supply of qf uint256 public promoSupply = 44; // promo supply of qf uint256 public allowListStartDateTime = 1674500400; //block.timestamp; // block.timestamp; uint256 public allowListEndDateTime = 1674590400; //allowListStartDateTime + duration; uint256 public auctionStartDateTime = 1674590400; //allowListEndDateTime; uint256 public auctionEndDateTime = 1674676800; //auctionStartDateTime + duration; uint256 public auctionExtentedTime = 0; bool public auctionWinnersSet = false; bool public raffleWinnersSet = false; bool public auctionSettled = false; bool public settled = false; bool public publicSale = false; // allowlist mapping mapping(address => bool) public allowList; QuasarFighter public quasarfighter; // The qf contract // Only allow the auction functions to be active when not paused modifier onlyUnpaused() { require(!paused(), 'AuctionHouse: paused'); _; } // Bids Struct struct Bid { address payable bidder; // The address of the bidder uint256 amount; // The amount of the bid bool minted; // has the bid been minted uint256 timestamp; // timestamp of the bid bool refunded; // refund difference between winning_bid and max_bid for winner; and all for losers bool winner; // is the bid the winner uint256 finalprice; // if won, what price won at } // mapping of Bid structs mapping(address => Bid) public Bids; constructor(QuasarFighter _quasarfighter) { quasarfighter = _quasarfighter; // set the payee to the contract owner payee = payable(0xFEfbBe2dEf5a3867577C6c47FAafDF3fB1Dff83c); } /* ADMIN VARIABLE SETTERS FUNCTIONS */ // set the 721 contract address function set721ContractAddress(QuasarFighter _newQuasarFighter) public onlyOwner { quasarfighter = _newQuasarFighter; } function setAuctionSupply(uint256 _newAuctionSupply) public onlyOwner { auctionSupply = _newAuctionSupply; } function setPromoSupply(uint256 _newPromoSupply) public onlyOwner { promoSupply = _newPromoSupply; } function addToAllowList(address[] memory _addresses) public onlyOwner { for (uint256 i = 0; i < _addresses.length; i++) { allowList[_addresses[i]] = true; } } function removeFromAllowList(address[] memory _addresses) public onlyOwner { for (uint256 i = 0; i < _addresses.length; i++) { allowList[_addresses[i]] = false; } } function setRevealed(bool _newRevealed) public onlyOwner { quasarfighter.setReveal(_newRevealed); } function setAuctionStartDateTime(uint256 _newAuctionStartDateTime) public onlyOwner { auctionStartDateTime = _newAuctionStartDateTime; } function setAuctionEndDateTime(uint256 _newAuctionEndDateTime) public onlyOwner { auctionEndDateTime = _newAuctionEndDateTime; } function setAllowListStartDateTime(uint256 _newAllowListStartDateTime) public onlyOwner { allowListStartDateTime = _newAllowListStartDateTime; } function setAllowListEndDateTime(uint256 _newAllowListEndDateTime) public onlyOwner { allowListEndDateTime = _newAllowListEndDateTime; } function setPublicSale() public onlyOwner { publicSale = !publicSale; } function setRaffleSupply(uint256 _newRaffleSupply) public onlyOwner { raffleSupply = _newRaffleSupply; } function setMaxSupply(uint256 _newMaxSupply) public onlyOwner { maxSupply = _newMaxSupply; } // set the time buffer function setTimeBuffer(uint256 _timeBuffer) external onlyOwner override { timeBuffer = _timeBuffer; emit AuctionTimeBufferUpdated(_timeBuffer); } // set the minimum bid function setMinimumBid(uint256 _minimumBid) external onlyOwner { minimumBid = _minimumBid; } // set min bid incr function setMinBidIncrement(uint256 _minBidIncrement) external onlyOwner { minBidIncrement = _minBidIncrement; } // set the duration function setDuration(uint256 _duration) external onlyOwner override { duration = _duration; emit AuctionDurationUpdated(_duration); } // promo mint function promoMint(address _to, uint256 _qty) external onlyOwner { require(promoSupply >= _qty, 'Not enough promo supply'); require(block.timestamp <= allowListEndDateTime, 'Outside promo mint window'); for (uint256 i = 0; i < _qty; i++) { quasarfighter.mint(_to); } promoSupply -= _qty; auctionSupply = maxSupply - quasarfighter.totalSupply() - raffleSupply; } // allowlist mint function allowlistMint() payable external { require( block.timestamp >= allowListStartDateTime && block.timestamp <= allowListEndDateTime, 'Outside allowlist window' ); require(msg.value >= allowListPrice, 'Not enough ETH sent'); require(allowList[msg.sender] == true, 'Not on allowlist'); require(allowlistSupply > 0, 'No more allowlist supply'); quasarfighter.mint(msg.sender); allowlistSupply--; allowList[msg.sender] = false; auctionSupply = maxSupply - quasarfighter.totalSupply() - raffleSupply; emit AllowlistMint(msg.sender); } // pause function pause() external onlyOwner override { _pause(); } // unpause function unpause() external onlyOwner override { _unpause(); } // withdraw function withdraw() public onlyOwner { (bool success, ) = payee.call{value: address(this).balance}(""); require(success, "Failed to send to payee."); } // update payee for withdraw function setPayee(address payable _payee) public onlyOwner { payee = _payee; } /* END ADMIN VARIABLE SETTERS FUNCTIONS */ // UNIVERSAL GETTER FOR AUCTION-RELATED VARIABLES function getAuctionInfo() public view returns ( uint256 _auctionSupply, uint256 _auctionStartDateTime, uint256 _auctionEndDateTime, uint256 _auctionExtentedTime, bool _auctionWinnersSet, bool _auctionSettled, bool _settled, uint256 _timeBuffer, uint256 _duration, uint256 _minimumBid, uint256 _minBidIncrement ) { return ( auctionSupply, auctionStartDateTime, auctionEndDateTime, auctionExtentedTime, auctionWinnersSet, auctionSettled, settled, timeBuffer, duration, minimumBid, minBidIncrement ); } // UNIVERSAL GETTER FOR ALLOWLIST AND RAFFLE-RELATED VARIABLES function getAllowlistAndRaffleInfo() public view returns ( uint256 _raffleSupply, uint256 _allowListPrice, uint256 _allowListStartDateTime, uint256 _allowListEndDateTime, bool _raffleWinnersSet, bool _publicSale, uint256 _allowlistSupply, uint256 _totalMinted ) { return ( raffleSupply, allowListPrice, allowListStartDateTime, allowListEndDateTime, raffleWinnersSet, publicSale, allowlistSupply, quasarfighter.totalSupply() ); } /* PUBLIC FUNCTIONS */ // Creates bids for the current auction function createBid() external payable nonReentrant onlyUnpaused { // Check that the auction is live && Bid Amount is greater than minimum bid require(block.timestamp < auctionEndDateTime && block.timestamp >= auctionStartDateTime, "Outside auction window."); require(msg.value >= minimumBid, "Bid amount too low."); // check if bidder already has bid // if so, refund old and replace with new if (Bids[msg.sender].amount > 0) { require(msg.value > Bids[msg.sender].amount, "You can only increase your bid, not decrease."); _safeTransferETH(Bids[msg.sender].bidder, Bids[msg.sender].amount); Bids[msg.sender].amount = msg.value; } // otherwise, enter new bid. else { Bid memory new_bid; new_bid.bidder = payable(msg.sender); new_bid.amount = msg.value; new_bid.timestamp = block.timestamp; new_bid.winner = false; new_bid.refunded = false; new_bid.minted = false; new_bid.finalprice = 0; Bids[msg.sender] = new_bid; } // Extend the auction if the bid was received within the time buffer // bool extended = auctionEndDateTime - block.timestamp < timeBuffer; //if (extended) { // auctionEndDateTime = auctionEndDateTime + timeBuffer; // auctionExtentedTime = auctionExtentedTime + timeBuffer; //} emit AuctionBid(msg.sender, Bids[msg.sender].amount, false); } function publicSaleMint() public payable nonReentrant onlyUnpaused { // if we didnt sell out, we can mint the remaining // for price of min bid // will error when supply is 0 // Note: 1) is the auction closed and 2) is the raffle set and // 3) if the total supply is less than the max supply, then you can allow ppl to mint // require(auctionEndDateTime < block.timestamp, "Auction not over yet."); // require(raffleWinnersSet == true, "Raffle not settled yet."); require(quasarfighter.totalSupply() < quasarfighter.max_supply()); require(publicSale == true, "Not authorized."); require(msg.value >= minimumBid, "Amount too low."); quasarfighter.mint(msg.sender); auctionSupply--; } /* END PUBLIC FUNCTIONS */ /* END OF AUCTION FUNCTIONS */ function setRaffleWinners(address[] memory _raffleWinners) external onlyOwner { require(block.timestamp > auctionEndDateTime, "Auction not over yet."); require(raffleWinnersSet == false, "Raffle already settled"); require(_raffleWinners.length <= raffleSupply, "Incorrect number of winners"); for (uint256 i = 0; i < _raffleWinners.length; i++) { Bids[_raffleWinners[i]].winner = true; Bids[_raffleWinners[i]].finalprice = minimumBid; } raffleWinnersSet = true; } function setAuctionWinners(address[] memory _auctionWinners, uint256[] memory _prices) external onlyOwner { require(block.timestamp > auctionEndDateTime, "Auction not over yet."); require(auctionWinnersSet == false, "Auction already settled"); //require(_auctionWinners.length <= quasarfighter.max_supply() - quasarfighter.totalSupply() - raffleSupply, "Incorrect number of winners"); for (uint256 i = 0; i < _auctionWinners.length; i++) { Bids[_auctionWinners[i]].winner = true; Bids[_auctionWinners[i]].finalprice = _prices[i]; } auctionWinnersSet = true; } /** * Settle an auction, finalizing the bid and paying out to the owner. * If there are no bids, the Oasis is burned. */ function settleBidder(address[] memory _bidders) external onlyOwner nonReentrant { require(block.timestamp > auctionEndDateTime, "Auction hasn't ended."); require(auctionWinnersSet == true && raffleWinnersSet == true, "Auction winners not set"); //require(auctionSettled == false, "Auction already settled"); for (uint256 i = 0; i < _bidders.length; i++) { if (Bids[_bidders[i]].winner == true && Bids[_bidders[i]].minted == false && Bids[_bidders[i]].refunded == false) { // if winner, mint and refunde diff if any, update Bids uint256 difference = Bids[_bidders[i]].amount - Bids[_bidders[i]].finalprice; if (difference > 0) { (bool success, ) = _bidders[i].call{value: difference}(""); require(success, "Failed to refund difference to winner."); } quasarfighter.mint(_bidders[i]); //auctionSupply--; Bids[_bidders[i]].minted = true; Bids[_bidders[i]].refunded = true; } else if (Bids[_bidders[i]].winner == false && Bids[_bidders[i]].refunded == false) { // if not winner, refund (bool success, ) = _bidders[i].call{value: Bids[_bidders[i]].amount}(""); require(success, "Failed to send refund to loser."); Bids[_bidders[i]].refunded = true; } } } function setAuctionSettled() external onlyOwner { require(auctionSettled == false, "Auction already settled"); auctionSettled = !auctionSettled; } function setTimes(uint256 allowListStart, uint256 _duration) public onlyOwner{ allowListStartDateTime = allowListStart + 90; allowListEndDateTime = allowListStartDateTime + _duration; auctionStartDateTime = allowListEndDateTime; auctionEndDateTime = auctionStartDateTime + _duration; } function setAllowListPrice (uint256 _allowListPrice) public onlyOwner { allowListPrice = _allowListPrice; } /** * Transfer ETH and return the success status. * This function only forwards 30,000 gas to the callee. */ function _safeTransferETH(address to, uint256 value) internal returns (bool) { (bool success, ) = to.call{value: value, gas: 30_000}(new bytes(0)); return success; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; contract Counter { uint256 public number; function setNumber(uint256 newNumber) public { number = newNumber; } function increment() public { number++; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @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, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for Auction Houses pragma solidity ^0.8.6; import { QuasarFighter } from "./QuasarFighter.sol"; interface IAuctionHouse { struct Auction { // ID for the (ERC721 token ID) uint256 tokenId; // The current highest bid amount uint256 amount; // The time that the auction started uint256 startTime; // The time that the auction is scheduled to end uint256 endTime; // The address of the current highest bid address payable bidder; // Whether or not the auction has been settled bool settled; // amount of time auction was extended uint256 extendedTime; } event AuctionBid(address sender, uint256 value, bool extended); event AuctionExtended(uint256 indexed tokenId, uint256 endTime); event AuctionSettled(uint256 indexed tokenId, address winner, uint256 amount); event AuctionTimeBufferUpdated(uint256 timeBuffer); event AuctionReservePriceUpdated(uint256 reservePrice); event AuctionMinBidIncrementPercentageUpdated(uint256 minBidIncrementPercentage); event AuctionDurationUpdated(uint256 duration); event AllowlistMint(address indexed to); function setAuctionWinners(address[] memory _auctionWinners, uint256[] memory _price) external; // function settleCurrentAndCreateNewAuction() external; //function settleAuction(uint256 tokenId) external; function setTimes(uint256 _startTime, uint256 _duration) external; function createBid() external payable; function pause() external; function unpause() external; function setTimeBuffer(uint256 timeBuffer) external; // function setMinBidIncrementPercentage(uint8 minBidIncrementPercentage) external; function setDuration(uint256 _duration) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for the Token pragma solidity ^0.8.6; import './IERC721.sol'; interface IQF is IERC721 { event OperatorFlagged(address flaggedOperator, bool status); event TokenCreated(uint256 indexed tokenId, address mintedTo); event TokenHashCreated(uint256 indexed tokenId, bytes32 hash); event TokenBurned(uint256 indexed tokenId); event MinterUpdated(address minter); event MinterLocked(); event Revealed(bool revealed); function mint(address _to) external returns (uint256); //function allowlistMint(address _to) external returns (uint256); //function promoMint(address to, uint256 quantity) external returns (uint256); function setReveal(bool _revealed) external; function burn(uint256 tokenId) external; function setMinter(address minter) external; //function lockMinter() external; function setBaseURI(string memory _newBaseURI) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: GPL-3.0 // Hideo's quasar fighters // presented by Wildxyz // LICENSE // This is a modified version of the original code from the // NounsToken.sol— an implementation of OpenZeppelin's ERC-721: // https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/NounsToken.sol // The original code is licensed under the GPL-3.0 license // Thank you to the Nouns team for the inspiration and code! pragma solidity ^0.8.17; import {UpdatableOperatorFilterer} from './UpdatableOperatorFilterer.sol'; import {RevokableDefaultOperatorFilterer} from './RevokableDefaultOperatorFilterer.sol'; import { Ownable } from './Ownable.sol'; import { ERC721 } from './ERC721.sol'; import { IERC721 } from './IERC721.sol'; import { Strings } from './Strings.sol'; import { IQF } from './IQF.sol'; contract QuasarFighter is IQF, Ownable, RevokableDefaultOperatorFilterer, ERC721 { uint256 public max_supply = 256; //256; bool public revealed = false; // An address who has permissions to mint qf tokens address public minter; // The internal ID tracker uint256 public _currentTokenId; // URI string public baseURI = "https://static.wild.xyz/tokens/1112/metadata/"; // Mapping of operators to whether they are approved or not mapping(address => bool) public authorized; // Mapping of addresses flagged for denying token interactions mapping(address => bool) public blockList; // Mapping of tokenId to hash mapping(uint256 => bytes32) public tokenHashes; /** * @notice Require that the sender is the minter. */ modifier onlyMinter() { require(msg.sender == minter, "Sender is not the minter"); _; } constructor(address _minter) ERC721("quasar fighter", "QF") { minter = _minter; } /** * @notice updates the deny list * @param flaggedOperator the address to be added to the deny list * @param status whether the address is to be added or removed from the deny list */ function updateDenyList(address flaggedOperator, bool status) public onlyOwner { _updateDenyList(flaggedOperator, status); } function setReveal(bool _revealed) public onlyMinter { revealed = _revealed; emit Revealed(_revealed); } /* * @notice Override isApprovedForAll * @param owner The owner of the Nouns * @param operator The operator to check if approved */ function isApprovedForAll(address _owner, address operator) public view override(IERC721, ERC721) returns (bool) { require(blockList[operator] == false, "Operator has been denied by contract owner."); if (authorized[operator] == true) { return true; } return super.isApprovedForAll(_owner, operator); } /* OS */ function setApprovalForAll(address operator, bool approved) public override(IERC721, ERC721) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(IERC721, ERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function owner() public view virtual override (Ownable, UpdatableOperatorFilterer) returns (address) { return Ownable.owner(); } /** * @notice sets the authorized operators for interacting with the contract * @param operator the address to be added to the authorized operators * @param approved whether the address is approved or not within authorized operators */ function setAuthorized(address operator, bool approved) public onlyOwner { authorized[operator] = approved; } /** * @notice Mint an qf token to the given address. * @dev Only callable by the minter. * @param _to The address to mint the qf token to. * @return The ID of the newly minted qf token. */ function mint(address _to) public onlyMinter override returns (uint256) { require(_currentTokenId < max_supply, "Max supply reached"); return _mintTo(_to, _currentTokenId++); } /** * @notice Burn a pass. * @dev Only callable by the minter. * @param tokenId The ID of the qf token to burn. */ function burn(uint256 tokenId) public onlyMinter override { _burn(tokenId); emit TokenBurned(tokenId); } /** @notice Provides the tokenURI of a specific token * @param _tokenId: the token ID * @return the URI of the token */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist."); if (revealed==false) { return string( abi.encodePacked( baseURI, Strings.toString(_tokenId), ".json" ) ); } else { return string( abi.encodePacked( baseURI, Strings.toString(_tokenId), ".json" ) ); } } /** * @notice Set the token minter. * @dev Only callable by the owner when not locked. * @param _minter The address of the new minter. */ function setMinter(address _minter) external onlyOwner override { minter = _minter; //emit MinterUpdated(_minter); } /** * @notice Set the base URI. * @dev Only callable by the owner. * @param _newBaseURI The new base URI. */ function setBaseURI(string memory _newBaseURI) public onlyOwner override { baseURI = _newBaseURI; } ////////////////////////// // Internal Functions //// ////////////////////////// /** * @notice updates the deny list * @param flaggedOperator The address to be approved. * @param status True if the operator is approved, false to revoke approval. */ function _updateDenyList(address flaggedOperator, bool status) internal virtual { blockList[flaggedOperator] = status; //emit OperatorFlagged(flaggedOperator, status); } function assignTokenHash(uint256 _tokenId) internal virtual { uint256 time = block.timestamp; bytes32 hash = keccak256( abi.encodePacked( _tokenId, block.number, time, (time % 200) + 1 ) ); tokenHashes[_tokenId] = hash; emit TokenHashCreated(_tokenId, hash); } /** @notice Mints a new token * @param to: the address of the new owner looking to mint * @param tokenId: the token ID * @return the ID of the newly minted token */ function _mintTo(address to, uint256 tokenId) internal returns (uint256) { _mint(to, tokenId); assignTokenHash(tokenId); emit TokenCreated(tokenId, to); return tokenId; } function totalSupply() public view returns (uint256) { return _currentTokenId; } function getMaxSupply() public view returns (uint256) { return max_supply; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {RevokableOperatorFilterer} from "./RevokableOperatorFilterer.sol"; /** * @title RevokableDefaultOperatorFilterer * @notice Inherits from RevokableOperatorFilterer and automatically subscribes to the default OpenSea subscription. * Note that OpenSea will disable creator fee enforcement if filtered operators begin fulfilling orders * on-chain, eg, if the registry is revoked or bypassed. */ abstract contract RevokableDefaultOperatorFilterer is RevokableOperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() RevokableOperatorFilterer(0x000000000000AAeB6D7670E522A718067333cd4E, DEFAULT_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {UpdatableOperatorFilterer} from "./UpdatableOperatorFilterer.sol"; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title RevokableOperatorFilterer * @notice This contract is meant to allow contracts to permanently skip OperatorFilterRegistry checks if desired. The * Registry itself has an "unregister" function, but if the contract is ownable, the owner can re-register at * any point. As implemented, this abstract contract allows the contract owner to permanently skip the * OperatorFilterRegistry checks by calling revokeOperatorFilterRegistry. Once done, the registry * address cannot be further updated. * Note that OpenSea will still disable creator fee enforcement if filtered operators begin fulfilling orders * on-chain, eg, if the registry is revoked or bypassed. */ abstract contract RevokableOperatorFilterer is UpdatableOperatorFilterer { error RegistryHasBeenRevoked(); error InitialRegistryAddressCannotBeZeroAddress(); bool public isOperatorFilterRegistryRevoked; constructor(address _registry, address subscriptionOrRegistrantToCopy, bool subscribe) UpdatableOperatorFilterer(_registry, subscriptionOrRegistrantToCopy, subscribe) { // don't allow creating a contract with a permanently revoked registry if (_registry == address(0)) { revert InitialRegistryAddressCannotBeZeroAddress(); } } function _checkFilterOperator(address operator) internal view virtual override { if (address(operatorFilterRegistry) != address(0)) { super._checkFilterOperator(operator); } } /** * @notice Update the address that the contract will make OperatorFilter checks against. When set to the zero * address, checks will be permanently bypassed, and the address cannot be updated again. OnlyOwner. */ function updateOperatorFilterRegistryAddress(address newRegistry) public override { if (msg.sender != owner()) { revert OnlyOwner(); } // if registry has been revoked, do not allow further updates if (isOperatorFilterRegistryRevoked) { revert RegistryHasBeenRevoked(); } operatorFilterRegistry = IOperatorFilterRegistry(newRegistry); } /** * @notice Revoke the OperatorFilterRegistry address, permanently bypassing checks. OnlyOwner. */ function revokeOperatorFilterRegistry() public { if (msg.sender != owner()) { revert OnlyOwner(); } // if registry has been revoked, do not allow further updates if (isOperatorFilterRegistryRevoked) { revert RegistryHasBeenRevoked(); } // set to zero address to bypass checks operatorFilterRegistry = IOperatorFilterRegistry(address(0)); isOperatorFilterRegistryRevoked = true; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title UpdatableOperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. This contract allows the Owner to update the * OperatorFilterRegistry address via updateOperatorFilterRegistryAddress, including to the zero address, * which will bypass registry checks. * Note that OpenSea will still disable creator fee enforcement if filtered operators begin fulfilling orders * on-chain, eg, if the registry is revoked or bypassed. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract UpdatableOperatorFilterer { error OperatorNotAllowed(address operator); error OnlyOwner(); IOperatorFilterRegistry public operatorFilterRegistry; constructor(address _registry, address subscriptionOrRegistrantToCopy, bool subscribe) { IOperatorFilterRegistry registry = IOperatorFilterRegistry(_registry); operatorFilterRegistry = registry; // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(registry).code.length > 0) { if (subscribe) { registry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { registry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { registry.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @notice Update the address that the contract will make OperatorFilter checks against. When set to the zero * address, checks will be bypassed. OnlyOwner. */ function updateOperatorFilterRegistryAddress(address newRegistry) public virtual { if (msg.sender != owner()) { revert OnlyOwner(); } operatorFilterRegistry = IOperatorFilterRegistry(newRegistry); } /** * @dev assume the contract has an owner, but leave specific Ownable implementation up to inheriting contract */ function owner() public view virtual returns (address); function _checkFilterOperator(address operator) internal view virtual { IOperatorFilterRegistry registry = operatorFilterRegistry; // Check registry code length to facilitate testing in environments without a deployed registry. if (address(registry) != address(0) && address(registry).code.length > 0) { if (!registry.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract QuasarFighter","name":"_quasarfighter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"AllowlistMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"extended","type":"bool"}],"name":"AuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"AuctionDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"AuctionExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minBidIncrementPercentage","type":"uint256"}],"name":"AuctionMinBidIncrementPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"}],"name":"AuctionReservePriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AuctionSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timeBuffer","type":"uint256"}],"name":"AuctionTimeBufferUpdated","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Bids","outputs":[{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"minted","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"refunded","type":"bool"},{"internalType":"bool","name":"winner","type":"bool"},{"internalType":"uint256","name":"finalprice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListEndDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListStartDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowlistSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionEndDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionExtentedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionSettled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionStartDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionWinnersSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllowlistAndRaffleInfo","outputs":[{"internalType":"uint256","name":"_raffleSupply","type":"uint256"},{"internalType":"uint256","name":"_allowListPrice","type":"uint256"},{"internalType":"uint256","name":"_allowListStartDateTime","type":"uint256"},{"internalType":"uint256","name":"_allowListEndDateTime","type":"uint256"},{"internalType":"bool","name":"_raffleWinnersSet","type":"bool"},{"internalType":"bool","name":"_publicSale","type":"bool"},{"internalType":"uint256","name":"_allowlistSupply","type":"uint256"},{"internalType":"uint256","name":"_totalMinted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuctionInfo","outputs":[{"internalType":"uint256","name":"_auctionSupply","type":"uint256"},{"internalType":"uint256","name":"_auctionStartDateTime","type":"uint256"},{"internalType":"uint256","name":"_auctionEndDateTime","type":"uint256"},{"internalType":"uint256","name":"_auctionExtentedTime","type":"uint256"},{"internalType":"bool","name":"_auctionWinnersSet","type":"bool"},{"internalType":"bool","name":"_auctionSettled","type":"bool"},{"internalType":"bool","name":"_settled","type":"bool"},{"internalType":"uint256","name":"_timeBuffer","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_minimumBid","type":"uint256"},{"internalType":"uint256","name":"_minBidIncrement","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBidIncrement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payee","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"promoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"promoSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"quasarfighter","outputs":[{"internalType":"contract QuasarFighter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleWinnersSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract QuasarFighter","name":"_newQuasarFighter","type":"address"}],"name":"set721ContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAllowListEndDateTime","type":"uint256"}],"name":"setAllowListEndDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allowListPrice","type":"uint256"}],"name":"setAllowListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAllowListStartDateTime","type":"uint256"}],"name":"setAllowListStartDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAuctionEndDateTime","type":"uint256"}],"name":"setAuctionEndDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAuctionSettled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAuctionStartDateTime","type":"uint256"}],"name":"setAuctionStartDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAuctionSupply","type":"uint256"}],"name":"setAuctionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_auctionWinners","type":"address[]"},{"internalType":"uint256[]","name":"_prices","type":"uint256[]"}],"name":"setAuctionWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBidIncrement","type":"uint256"}],"name":"setMinBidIncrement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumBid","type":"uint256"}],"name":"setMinimumBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_payee","type":"address"}],"name":"setPayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPromoSupply","type":"uint256"}],"name":"setPromoSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRaffleSupply","type":"uint256"}],"name":"setRaffleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_raffleWinners","type":"address[]"}],"name":"setRaffleWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newRevealed","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeBuffer","type":"uint256"}],"name":"setTimeBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"allowListStart","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bidders","type":"address[]"}],"name":"settleBidder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052607860035567016345785d8a0000600455662386f26fc1000060055567016345785d8a0000600655620151806007556007600955601d600a5560b0600b55610100600c55602c600d556363ced930600e556363d038c0600f556363d038c06010556363d18a4060115560006012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506000601360026101000a81548160ff0219169083151502179055506000601360036101000a81548160ff0219169083151502179055506000601360046101000a81548160ff0219169083151502179055503480156200010657600080fd5b5060405162005bbd38038062005bbd83398181016040528101906200012c919062000356565b60008060006101000a81548160ff021916908315150217905550600180819055506200016d620001616200020a60201b60201c565b6200021260201b60201c565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fefbbe2def5a3867577c6c47faafdf3fb1dff83c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000388565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200030a82620002dd565b9050919050565b60006200031e82620002fd565b9050919050565b620003308162000311565b81146200033c57600080fd5b50565b600081519050620003508162000325565b92915050565b6000602082840312156200036f576200036e620002d8565b5b60006200037f848285016200033f565b91505092915050565b61582580620003986000396000f3fe6080604052600436106103a25760003560e01c80637263cfe2116101e7578063c1b819b91161010d578063d9ad7f91116100a0578063f2fde38b1161006f578063f2fde38b14610c70578063f6be71d114610c99578063fc3a635314610cc2578063fd49af1314610ceb576103a2565b8063d9ad7f9114610bdc578063e0a8085314610c05578063e30ac00314610c2e578063ec91f2a414610c45576103a2565b8063d3a86386116100dc578063d3a8638614610b26578063d3e761a414610b51578063d5abeb0114610b7c578063d94a350514610ba7576103a2565b8063c1b819b914610a9d578063c403b5b214610ac6578063d1b7bda314610af1578063d2eb86ee14610b1c576103a2565b80638da5cb5b11610185578063a51312c811610154578063a51312c8146109f3578063ae90b21314610a1c578063b59f6bf514610a47578063ba060b7d14610a72576103a2565b80638da5cb5b146109495780638f77583914610974578063a24e51531461099f578063a2a3eb4d146109ca576103a2565b8063852fedc9116101c1578063852fedc9146108a557806386495b04146108ce5780638a64bbf0146108f75780638d57c9a914610920576103a2565b80637263cfe21461085b57806383624074146108845780638456cb591461088e576103a2565b8063410459ad116102cc578063599d127a1161026a5780636df9fa88116102395780636df9fa88146107c95780636f8b44b0146107f25780637120334b1461081b578063715018a614610844576103a2565b8063599d127a146107215780635c975abb1461074c57806365d634c5146107775780636d8aded1146107a0576103a2565b806355ee09d7116102a657806355ee09d71461068d57806355f15f0c146106b657806356f8f78c146106e157806358d5d666146106f8576103a2565b8063410459ad1461063157806341fbddbd1461065a578063510f615a14610664576103a2565b80632848aeaf1161034457806333bc1c5c1161031357806333bc1c5c146105ad5780633ccfd60b146105d85780633f17d40a146105ef5780633f4ba83a1461061a576103a2565b80632848aeaf146104e85780632982302814610525578063300da88314610557578063335b115e14610582576103a2565b806313cabd691161038057806313cabd69146104405780631eb8b3431461046b578063224348361461049657806323ab54b5146104bf576103a2565b80630251e03e146103a75780630fb5a6b4146103ea57806312300ba414610415575b600080fd5b3480156103b357600080fd5b506103ce60048036038101906103c9919061421f565b610d16565b6040516103e197969594939291906142a1565b60405180910390f35b3480156103f657600080fd5b506103ff610d9f565b60405161040c9190614310565b60405180910390f35b34801561042157600080fd5b5061042a610da5565b6040516104379190614310565b60405180910390f35b34801561044c57600080fd5b50610455610dab565b6040516104629190614310565b60405180910390f35b34801561047757600080fd5b50610480610db1565b60405161048d9190614310565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190614357565b610db7565b005b3480156104cb57600080fd5b506104e660048036038101906104e191906145b3565b610e7b565b005b3480156104f457600080fd5b5061050f600480360381019061050a919061421f565b6110c0565b60405161051c919061462b565b60405180910390f35b34801561053157600080fd5b5061053a6110e0565b60405161054e989796959493929190614646565b60405180910390f35b34801561056357600080fd5b5061056c6111c6565b6040516105799190614723565b60405180910390f35b34801561058e57600080fd5b506105976111ec565b6040516105a49190614310565b60405180910390f35b3480156105b957600080fd5b506105c26111f2565b6040516105cf919061462b565b60405180910390f35b3480156105e457600080fd5b506105ed611205565b005b3480156105fb57600080fd5b50610604611352565b6040516106119190614310565b60405180910390f35b34801561062657600080fd5b5061062f611358565b005b34801561063d57600080fd5b506106586004803603810190610653919061476a565b6113de565b005b61066261149e565b005b34801561067057600080fd5b5061068b60048036038101906106869190614797565b611813565b005b34801561069957600080fd5b506106b460048036038101906106af9190614797565b611899565b005b3480156106c257600080fd5b506106cb61191f565b6040516106d8919061462b565b60405180910390f35b3480156106ed57600080fd5b506106f6611932565b005b34801561070457600080fd5b5061071f600480360381019061071a9190614802565b6119da565b005b34801561072d57600080fd5b50610736611a9a565b6040516107439190614310565b60405180910390f35b34801561075857600080fd5b50610761611aa0565b60405161076e919061462b565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190614797565b611ab6565b005b3480156107ac57600080fd5b506107c760048036038101906107c2919061482f565b611b3c565b005b3480156107d557600080fd5b506107f060048036038101906107eb9190614797565b611dae565b005b3480156107fe57600080fd5b5061081960048036038101906108149190614797565b611e34565b005b34801561082757600080fd5b50610842600480360381019061083d9190614797565b611eba565b005b34801561085057600080fd5b50610859611f77565b005b34801561086757600080fd5b50610882600480360381019061087d919061482f565b611fff565b005b61088c612110565b005b34801561089a57600080fd5b506108a3612629565b005b3480156108b157600080fd5b506108cc60048036038101906108c7919061482f565b6126af565b005b3480156108da57600080fd5b506108f560048036038101906108f09190614797565b612f8e565b005b34801561090357600080fd5b5061091e60048036038101906109199190614797565b613014565b005b34801561092c57600080fd5b5061094760048036038101906109429190614797565b61309a565b005b34801561095557600080fd5b5061095e613120565b60405161096b9190614887565b60405180910390f35b34801561098057600080fd5b5061098961314a565b604051610996919061462b565b60405180910390f35b3480156109ab57600080fd5b506109b461315d565b6040516109c19190614310565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec91906148a2565b613163565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a15919061482f565b6133f5565b005b348015610a2857600080fd5b50610a31613506565b604051610a3e91906148e2565b60405180910390f35b348015610a5357600080fd5b50610a5c61352c565b604051610a69919061462b565b60405180910390f35b348015610a7e57600080fd5b50610a8761353f565b604051610a949190614310565b60405180910390f35b348015610aa957600080fd5b50610ac46004803603810190610abf9190614797565b613545565b005b348015610ad257600080fd5b50610adb6135cb565b604051610ae89190614310565b60405180910390f35b348015610afd57600080fd5b50610b066135d1565b604051610b139190614310565b60405180910390f35b610b246135d7565b005b348015610b3257600080fd5b50610b3b6138f3565b604051610b489190614310565b60405180910390f35b348015610b5d57600080fd5b50610b666138f9565b604051610b73919061462b565b60405180910390f35b348015610b8857600080fd5b50610b9161390c565b604051610b9e9190614310565b60405180910390f35b348015610bb357600080fd5b50610bbc613912565b604051610bd39b9a999897969594939291906148fd565b60405180910390f35b348015610be857600080fd5b50610c036004803603810190610bfe9190614797565b61398e565b005b348015610c1157600080fd5b50610c2c6004803603810190610c2791906149d4565b613a14565b005b348015610c3a57600080fd5b50610c43613b20565b005b348015610c5157600080fd5b50610c5a613c1e565b604051610c679190614310565b60405180910390f35b348015610c7c57600080fd5b50610c976004803603810190610c92919061421f565b613c24565b005b348015610ca557600080fd5b50610cc06004803603810190610cbb9190614797565b613d1b565b005b348015610cce57600080fd5b50610ce96004803603810190610ce49190614797565b613dd8565b005b348015610cf757600080fd5b50610d00613e5e565b604051610d0d9190614310565b60405180910390f35b60166020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16908060040160019054906101000a900460ff16908060050154905087565b60075481565b60125481565b60105481565b600e5481565b610dbf613e64565b73ffffffffffffffffffffffffffffffffffffffff16610ddd613120565b73ffffffffffffffffffffffffffffffffffffffff1614610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a90614a5e565b60405180910390fd5b605a82610e409190614aad565b600e8190555080600e54610e549190614aad565b600f81905550600f5460108190555080601054610e719190614aad565b6011819055505050565b610e83613e64565b73ffffffffffffffffffffffffffffffffffffffff16610ea1613120565b73ffffffffffffffffffffffffffffffffffffffff1614610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90614a5e565b60405180910390fd5b6011544211610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290614b2d565b60405180910390fd5b60001515601360009054906101000a900460ff16151514610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890614b99565b60405180910390fd5b60005b82518110156110a057600160166000858481518110610fb657610fb5614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160016101000a81548160ff02191690831515021790555081818151811061102557611024614bb9565b5b60200260200101516016600085848151811061104457611043614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550808061109890614be8565b915050610f94565b506001601360006101000a81548160ff0219169083151502179055505050565b60146020528060005260406000206000915054906101000a900460ff1681565b600080600080600080600080600954600654600e54600f54601360019054906101000a900460ff16601360049054906101000a900460ff16600b54601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190614c45565b975097509750975097509750975097509091929394959697565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b601360049054906101000a900460ff1681565b61120d613e64565b73ffffffffffffffffffffffffffffffffffffffff1661122b613120565b73ffffffffffffffffffffffffffffffffffffffff1614611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127890614a5e565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516112c990614ca3565b60006040518083038185875af1925050503d8060008114611306576040519150601f19603f3d011682016040523d82523d6000602084013e61130b565b606091505b505090508061134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690614d04565b60405180910390fd5b50565b600f5481565b611360613e64565b73ffffffffffffffffffffffffffffffffffffffff1661137e613120565b73ffffffffffffffffffffffffffffffffffffffff16146113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb90614a5e565b60405180910390fd5b6113dc613e6c565b565b6113e6613e64565b73ffffffffffffffffffffffffffffffffffffffff16611404613120565b73ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145190614a5e565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5442101580156114b25750600f544211155b6114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890614d70565b60405180910390fd5b600654341015611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d90614ddc565b60405180910390fd5b60011515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c090614e48565b60405180910390fd5b6000600b541161160e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160590614eb4565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016116699190614887565b6020604051808303816000875af1158015611688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ac9190614c45565b50600b60008154809291906116c090614ed4565b91905055506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600954601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b19190614c45565b600c546117be9190614efd565b6117c89190614efd565b600a819055503373ffffffffffffffffffffffffffffffffffffffff167f016393cb290ab38948527bb115688745c29b0a40d90372d61c7f232ecf65286260405160405180910390a2565b61181b613e64565b73ffffffffffffffffffffffffffffffffffffffff16611839613120565b73ffffffffffffffffffffffffffffffffffffffff161461188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188690614a5e565b60405180910390fd5b80600f8190555050565b6118a1613e64565b73ffffffffffffffffffffffffffffffffffffffff166118bf613120565b73ffffffffffffffffffffffffffffffffffffffff1614611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614a5e565b60405180910390fd5b8060058190555050565b601360009054906101000a900460ff1681565b61193a613e64565b73ffffffffffffffffffffffffffffffffffffffff16611958613120565b73ffffffffffffffffffffffffffffffffffffffff16146119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590614a5e565b60405180910390fd5b601360049054906101000a900460ff1615601360046101000a81548160ff021916908315150217905550565b6119e2613e64565b73ffffffffffffffffffffffffffffffffffffffff16611a00613120565b73ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614a5e565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b60008060009054906101000a900460ff16905090565b611abe613e64565b73ffffffffffffffffffffffffffffffffffffffff16611adc613120565b73ffffffffffffffffffffffffffffffffffffffff1614611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990614a5e565b60405180910390fd5b8060098190555050565b611b44613e64565b73ffffffffffffffffffffffffffffffffffffffff16611b62613120565b73ffffffffffffffffffffffffffffffffffffffff1614611bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baf90614a5e565b60405180910390fd5b6011544211611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390614b2d565b60405180910390fd5b60001515601360019054906101000a900460ff16151514611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990614f7d565b60405180910390fd5b60095481511115611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90614fe9565b60405180910390fd5b60005b8151811015611d8f57600160166000848481518110611cbd57611cbc614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160016101000a81548160ff02191690831515021790555060045460166000848481518110611d3357611d32614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501819055508080611d8790614be8565b915050611c9b565b506001601360016101000a81548160ff02191690831515021790555050565b611db6613e64565b73ffffffffffffffffffffffffffffffffffffffff16611dd4613120565b73ffffffffffffffffffffffffffffffffffffffff1614611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190614a5e565b60405180910390fd5b8060068190555050565b611e3c613e64565b73ffffffffffffffffffffffffffffffffffffffff16611e5a613120565b73ffffffffffffffffffffffffffffffffffffffff1614611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790614a5e565b60405180910390fd5b80600c8190555050565b611ec2613e64565b73ffffffffffffffffffffffffffffffffffffffff16611ee0613120565b73ffffffffffffffffffffffffffffffffffffffff1614611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90614a5e565b60405180910390fd5b806003819055507f1b55d9f7002bda4490f467e326f22a4a847629c0f2d1ed421607d318d25b410d81604051611f6c9190614310565b60405180910390a150565b611f7f613e64565b73ffffffffffffffffffffffffffffffffffffffff16611f9d613120565b73ffffffffffffffffffffffffffffffffffffffff1614611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90614a5e565b60405180910390fd5b611ffd6000613ece565b565b612007613e64565b73ffffffffffffffffffffffffffffffffffffffff16612025613120565b73ffffffffffffffffffffffffffffffffffffffff161461207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207290614a5e565b60405180910390fd5b60005b815181101561210c576001601460008484815181106120a05761209f614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061210490614be8565b91505061207e565b5050565b600260015403612155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214c90615055565b60405180910390fd5b6002600181905550612165611aa0565b156121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c906150c1565b60405180910390fd5b601154421080156121b857506010544210155b6121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee9061512d565b60405180910390fd5b60045434101561223c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223390615199565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154111561240657601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154341161230b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123029061522b565b60405180910390fd5b6123b9601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613f94565b5034601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506125a2565b61240e614154565b33816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050348160200181815250504281606001818152505060008160a00190151590811515815250506000816080019015159081151581525050600081604001901515908115158152505060008160c001818152505080601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055506060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160040160016101000a81548160ff02191690831515021790555060c08201518160050155905050505b7f4c59a472ced976904d21e373e2f2d8326defffabfe087e3d7886f0c516495ba733601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015460006040516126189392919061524b565b60405180910390a160018081905550565b612631613e64565b73ffffffffffffffffffffffffffffffffffffffff1661264f613120565b73ffffffffffffffffffffffffffffffffffffffff16146126a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269c90614a5e565b60405180910390fd5b6126ad61405f565b565b6126b7613e64565b73ffffffffffffffffffffffffffffffffffffffff166126d5613120565b73ffffffffffffffffffffffffffffffffffffffff161461272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272290614a5e565b60405180910390fd5b600260015403612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276790615055565b60405180910390fd5b600260018190555060115442116127bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b3906152ce565b60405180910390fd5b60011515601360009054906101000a900460ff1615151480156127f2575060011515601360019054906101000a900460ff161515145b612831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128289061533a565b60405180910390fd5b60005b8151811015612f8357600115156016600084848151811061285857612857614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160019054906101000a900460ff161515148015612927575060001515601660008484815181106128d0576128cf614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff161515145b80156129a05750600015156016600084848151811061294957612948614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160009054906101000a900460ff161515145b15612ce7576000601660008484815181106129be576129bd614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015460166000858581518110612a1b57612a1a614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612a6b9190614efd565b90506000811115612b3e576000838381518110612a8b57612a8a614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1682604051612ab690614ca3565b60006040518083038185875af1925050503d8060008114612af3576040519150601f19603f3d011682016040523d82523d6000602084013e612af8565b606091505b5050905080612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b33906153cc565b60405180910390fd5b505b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842848481518110612b8f57612b8e614bb9565b5b60200260200101516040518263ffffffff1660e01b8152600401612bb39190614887565b6020604051808303816000875af1158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614c45565b50600160166000858581518110612c1057612c0f614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550600160166000858581518110612c8557612c84614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006101000a81548160ff02191690831515021790555050612f70565b6000151560166000848481518110612d0257612d01614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160019054906101000a900460ff161515148015612dd157506000151560166000848481518110612d7a57612d79614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160009054906101000a900460ff161515145b15612f6f576000828281518110612deb57612dea614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1660166000858581518110612e2057612e1f614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154604051612e7290614ca3565b60006040518083038185875af1925050503d8060008114612eaf576040519150601f19603f3d011682016040523d82523d6000602084013e612eb4565b606091505b5050905080612ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eef90615438565b60405180910390fd5b600160166000858581518110612f1157612f10614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006101000a81548160ff021916908315150217905550505b5b8080612f7b90614be8565b915050612834565b506001808190555050565b612f96613e64565b73ffffffffffffffffffffffffffffffffffffffff16612fb4613120565b73ffffffffffffffffffffffffffffffffffffffff161461300a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300190614a5e565b60405180910390fd5b8060048190555050565b61301c613e64565b73ffffffffffffffffffffffffffffffffffffffff1661303a613120565b73ffffffffffffffffffffffffffffffffffffffff1614613090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308790614a5e565b60405180910390fd5b80600d8190555050565b6130a2613e64565b73ffffffffffffffffffffffffffffffffffffffff166130c0613120565b73ffffffffffffffffffffffffffffffffffffffff1614613116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310d90614a5e565b60405180910390fd5b8060118190555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601360039054906101000a900460ff1681565b60065481565b61316b613e64565b73ffffffffffffffffffffffffffffffffffffffff16613189613120565b73ffffffffffffffffffffffffffffffffffffffff16146131df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d690614a5e565b60405180910390fd5b80600d541015613224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321b906154a4565b60405180910390fd5b600f54421115613269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326090615510565b60405180910390fd5b60005b8181101561332657601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842846040518263ffffffff1660e01b81526004016132cf9190614887565b6020604051808303816000875af11580156132ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133129190614c45565b50808061331e90614be8565b91505061326c565b5080600d60008282546133399190614efd565b92505081905550600954601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d49190614c45565b600c546133e19190614efd565b6133eb9190614efd565b600a819055505050565b6133fd613e64565b73ffffffffffffffffffffffffffffffffffffffff1661341b613120565b73ffffffffffffffffffffffffffffffffffffffff1614613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346890614a5e565b60405180910390fd5b60005b81518110156135025760006014600084848151811061349657613495614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806134fa90614be8565b915050613474565b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360019054906101000a900460ff1681565b600a5481565b61354d613e64565b73ffffffffffffffffffffffffffffffffffffffff1661356b613120565b73ffffffffffffffffffffffffffffffffffffffff16146135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b890614a5e565b60405180910390fd5b80600e8190555050565b60115481565b600d5481565b60026001540361361c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361390615055565b60405180910390fd5b600260018190555061362c611aa0565b1561366c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613663906150c1565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638a333b506040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fd9190614c45565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561376a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378e9190614c45565b1061379857600080fd5b60011515601360049054906101000a900460ff161515146137ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e59061557c565b60405180910390fd5b600454341015613833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382a906155e8565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b815260040161388e9190614887565b6020604051808303816000875af11580156138ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d19190614c45565b50600a60008154809291906138e590614ed4565b919050555060018081905550565b60045481565b601360029054906101000a900460ff1681565b600c5481565b6000806000806000806000806000806000600a54601054601154601254601360009054906101000a900460ff16601360029054906101000a900460ff16601360039054906101000a900460ff166003546007546004546005549a509a509a509a509a509a509a509a509a509a509a50909192939495969798999a565b613996613e64565b73ffffffffffffffffffffffffffffffffffffffff166139b4613120565b73ffffffffffffffffffffffffffffffffffffffff1614613a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0190614a5e565b60405180910390fd5b8060108190555050565b613a1c613e64565b73ffffffffffffffffffffffffffffffffffffffff16613a3a613120565b73ffffffffffffffffffffffffffffffffffffffff1614613a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8790614a5e565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a3f300c826040518263ffffffff1660e01b8152600401613aeb919061462b565b600060405180830381600087803b158015613b0557600080fd5b505af1158015613b19573d6000803e3d6000fd5b5050505050565b613b28613e64565b73ffffffffffffffffffffffffffffffffffffffff16613b46613120565b73ffffffffffffffffffffffffffffffffffffffff1614613b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9390614a5e565b60405180910390fd5b60001515601360029054906101000a900460ff16151514613bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613be990614b99565b60405180910390fd5b601360029054906101000a900460ff1615601360026101000a81548160ff021916908315150217905550565b60035481565b613c2c613e64565b73ffffffffffffffffffffffffffffffffffffffff16613c4a613120565b73ffffffffffffffffffffffffffffffffffffffff1614613ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9790614a5e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d069061567a565b60405180910390fd5b613d1881613ece565b50565b613d23613e64565b73ffffffffffffffffffffffffffffffffffffffff16613d41613120565b73ffffffffffffffffffffffffffffffffffffffff1614613d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d8e90614a5e565b60405180910390fd5b806007819055507faab6389d8f1c16ba1deb6e9831f5c5442cf4fcf99bf5bfa867460be408a9111881604051613dcd9190614310565b60405180910390a150565b613de0613e64565b73ffffffffffffffffffffffffffffffffffffffff16613dfe613120565b73ffffffffffffffffffffffffffffffffffffffff1614613e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e4b90614a5e565b60405180910390fd5b80600a8190555050565b600b5481565b600033905090565b613e746140c1565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613eb7613e64565b604051613ec49190614887565b60405180910390a1565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808373ffffffffffffffffffffffffffffffffffffffff168361753090600067ffffffffffffffff811115613fce57613fcd6143ad565b5b6040519080825280601f01601f1916602001820160405280156140005781602001600182028036833780820191505090505b5060405161400e9190615700565b600060405180830381858888f193505050503d806000811461404c576040519150601f19603f3d011682016040523d82523d6000602084013e614051565b606091505b505090508091505092915050565b61406761410a565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586140aa613e64565b6040516140b79190614887565b60405180910390a1565b6140c9611aa0565b614108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ff90615763565b60405180910390fd5b565b614112611aa0565b15614152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614149906157cf565b60405180910390fd5b565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160001515815260200160008152602001600015158152602001600015158152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141ec826141c1565b9050919050565b6141fc816141e1565b811461420757600080fd5b50565b600081359050614219816141f3565b92915050565b600060208284031215614235576142346141b7565b5b60006142438482850161420a565b91505092915050565b6000614257826141c1565b9050919050565b6142678161424c565b82525050565b6000819050919050565b6142808161426d565b82525050565b60008115159050919050565b61429b81614286565b82525050565b600060e0820190506142b6600083018a61425e565b6142c36020830189614277565b6142d06040830188614292565b6142dd6060830187614277565b6142ea6080830186614292565b6142f760a0830185614292565b61430460c0830184614277565b98975050505050505050565b60006020820190506143256000830184614277565b92915050565b6143348161426d565b811461433f57600080fd5b50565b6000813590506143518161432b565b92915050565b6000806040838503121561436e5761436d6141b7565b5b600061437c85828601614342565b925050602061438d85828601614342565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143e58261439c565b810181811067ffffffffffffffff82111715614404576144036143ad565b5b80604052505050565b60006144176141ad565b905061442382826143dc565b919050565b600067ffffffffffffffff821115614443576144426143ad565b5b602082029050602081019050919050565b600080fd5b600061446c61446784614428565b61440d565b9050808382526020820190506020840283018581111561448f5761448e614454565b5b835b818110156144b857806144a4888261420a565b845260208401935050602081019050614491565b5050509392505050565b600082601f8301126144d7576144d6614397565b5b81356144e7848260208601614459565b91505092915050565b600067ffffffffffffffff82111561450b5761450a6143ad565b5b602082029050602081019050919050565b600061452f61452a846144f0565b61440d565b9050808382526020820190506020840283018581111561455257614551614454565b5b835b8181101561457b57806145678882614342565b845260208401935050602081019050614554565b5050509392505050565b600082601f83011261459a57614599614397565b5b81356145aa84826020860161451c565b91505092915050565b600080604083850312156145ca576145c96141b7565b5b600083013567ffffffffffffffff8111156145e8576145e76141bc565b5b6145f4858286016144c2565b925050602083013567ffffffffffffffff811115614615576146146141bc565b5b61462185828601614585565b9150509250929050565b60006020820190506146406000830184614292565b92915050565b60006101008201905061465c600083018b614277565b614669602083018a614277565b6146766040830189614277565b6146836060830188614277565b6146906080830187614292565b61469d60a0830186614292565b6146aa60c0830185614277565b6146b760e0830184614277565b9998505050505050505050565b6000819050919050565b60006146e96146e46146df846141c1565b6146c4565b6141c1565b9050919050565b60006146fb826146ce565b9050919050565b600061470d826146f0565b9050919050565b61471d81614702565b82525050565b60006020820190506147386000830184614714565b92915050565b6147478161424c565b811461475257600080fd5b50565b6000813590506147648161473e565b92915050565b6000602082840312156147805761477f6141b7565b5b600061478e84828501614755565b91505092915050565b6000602082840312156147ad576147ac6141b7565b5b60006147bb84828501614342565b91505092915050565b60006147cf826141e1565b9050919050565b6147df816147c4565b81146147ea57600080fd5b50565b6000813590506147fc816147d6565b92915050565b600060208284031215614818576148176141b7565b5b6000614826848285016147ed565b91505092915050565b600060208284031215614845576148446141b7565b5b600082013567ffffffffffffffff811115614863576148626141bc565b5b61486f848285016144c2565b91505092915050565b614881816141e1565b82525050565b600060208201905061489c6000830184614878565b92915050565b600080604083850312156148b9576148b86141b7565b5b60006148c78582860161420a565b92505060206148d885828601614342565b9150509250929050565b60006020820190506148f7600083018461425e565b92915050565b600061016082019050614913600083018e614277565b614920602083018d614277565b61492d604083018c614277565b61493a606083018b614277565b614947608083018a614292565b61495460a0830189614292565b61496160c0830188614292565b61496e60e0830187614277565b61497c610100830186614277565b61498a610120830185614277565b614998610140830184614277565b9c9b505050505050505050505050565b6149b181614286565b81146149bc57600080fd5b50565b6000813590506149ce816149a8565b92915050565b6000602082840312156149ea576149e96141b7565b5b60006149f8848285016149bf565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a48602083614a01565b9150614a5382614a12565b602082019050919050565b60006020820190508181036000830152614a7781614a3b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ab88261426d565b9150614ac38361426d565b9250828201905080821115614adb57614ada614a7e565b5b92915050565b7f41756374696f6e206e6f74206f766572207965742e0000000000000000000000600082015250565b6000614b17601583614a01565b9150614b2282614ae1565b602082019050919050565b60006020820190508181036000830152614b4681614b0a565b9050919050565b7f41756374696f6e20616c726561647920736574746c6564000000000000000000600082015250565b6000614b83601783614a01565b9150614b8e82614b4d565b602082019050919050565b60006020820190508181036000830152614bb281614b76565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614bf38261426d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c2557614c24614a7e565b5b600182019050919050565b600081519050614c3f8161432b565b92915050565b600060208284031215614c5b57614c5a6141b7565b5b6000614c6984828501614c30565b91505092915050565b600081905092915050565b50565b6000614c8d600083614c72565b9150614c9882614c7d565b600082019050919050565b6000614cae82614c80565b9150819050919050565b7f4661696c656420746f2073656e6420746f2070617965652e0000000000000000600082015250565b6000614cee601883614a01565b9150614cf982614cb8565b602082019050919050565b60006020820190508181036000830152614d1d81614ce1565b9050919050565b7f4f75747369646520616c6c6f776c6973742077696e646f770000000000000000600082015250565b6000614d5a601883614a01565b9150614d6582614d24565b602082019050919050565b60006020820190508181036000830152614d8981614d4d565b9050919050565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b6000614dc6601383614a01565b9150614dd182614d90565b602082019050919050565b60006020820190508181036000830152614df581614db9565b9050919050565b7f4e6f74206f6e20616c6c6f776c69737400000000000000000000000000000000600082015250565b6000614e32601083614a01565b9150614e3d82614dfc565b602082019050919050565b60006020820190508181036000830152614e6181614e25565b9050919050565b7f4e6f206d6f726520616c6c6f776c69737420737570706c790000000000000000600082015250565b6000614e9e601883614a01565b9150614ea982614e68565b602082019050919050565b60006020820190508181036000830152614ecd81614e91565b9050919050565b6000614edf8261426d565b915060008203614ef257614ef1614a7e565b5b600182039050919050565b6000614f088261426d565b9150614f138361426d565b9250828203905081811115614f2b57614f2a614a7e565b5b92915050565b7f526166666c6520616c726561647920736574746c656400000000000000000000600082015250565b6000614f67601683614a01565b9150614f7282614f31565b602082019050919050565b60006020820190508181036000830152614f9681614f5a565b9050919050565b7f496e636f7272656374206e756d626572206f662077696e6e6572730000000000600082015250565b6000614fd3601b83614a01565b9150614fde82614f9d565b602082019050919050565b6000602082019050818103600083015261500281614fc6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061503f601f83614a01565b915061504a82615009565b602082019050919050565b6000602082019050818103600083015261506e81615032565b9050919050565b7f41756374696f6e486f7573653a20706175736564000000000000000000000000600082015250565b60006150ab601483614a01565b91506150b682615075565b602082019050919050565b600060208201905081810360008301526150da8161509e565b9050919050565b7f4f7574736964652061756374696f6e2077696e646f772e000000000000000000600082015250565b6000615117601783614a01565b9150615122826150e1565b602082019050919050565b600060208201905081810360008301526151468161510a565b9050919050565b7f42696420616d6f756e7420746f6f206c6f772e00000000000000000000000000600082015250565b6000615183601383614a01565b915061518e8261514d565b602082019050919050565b600060208201905081810360008301526151b281615176565b9050919050565b7f596f752063616e206f6e6c7920696e63726561736520796f7572206269642c2060008201527f6e6f742064656372656173652e00000000000000000000000000000000000000602082015250565b6000615215602d83614a01565b9150615220826151b9565b604082019050919050565b6000602082019050818103600083015261524481615208565b9050919050565b60006060820190506152606000830186614878565b61526d6020830185614277565b61527a6040830184614292565b949350505050565b7f41756374696f6e206861736e277420656e6465642e0000000000000000000000600082015250565b60006152b8601583614a01565b91506152c382615282565b602082019050919050565b600060208201905081810360008301526152e7816152ab565b9050919050565b7f41756374696f6e2077696e6e657273206e6f7420736574000000000000000000600082015250565b6000615324601783614a01565b915061532f826152ee565b602082019050919050565b6000602082019050818103600083015261535381615317565b9050919050565b7f4661696c656420746f20726566756e6420646966666572656e636520746f207760008201527f696e6e65722e0000000000000000000000000000000000000000000000000000602082015250565b60006153b6602683614a01565b91506153c18261535a565b604082019050919050565b600060208201905081810360008301526153e5816153a9565b9050919050565b7f4661696c656420746f2073656e6420726566756e6420746f206c6f7365722e00600082015250565b6000615422601f83614a01565b915061542d826153ec565b602082019050919050565b6000602082019050818103600083015261545181615415565b9050919050565b7f4e6f7420656e6f7567682070726f6d6f20737570706c79000000000000000000600082015250565b600061548e601783614a01565b915061549982615458565b602082019050919050565b600060208201905081810360008301526154bd81615481565b9050919050565b7f4f7574736964652070726f6d6f206d696e742077696e646f7700000000000000600082015250565b60006154fa601983614a01565b9150615505826154c4565b602082019050919050565b60006020820190508181036000830152615529816154ed565b9050919050565b7f4e6f7420617574686f72697a65642e0000000000000000000000000000000000600082015250565b6000615566600f83614a01565b915061557182615530565b602082019050919050565b6000602082019050818103600083015261559581615559565b9050919050565b7f416d6f756e7420746f6f206c6f772e0000000000000000000000000000000000600082015250565b60006155d2600f83614a01565b91506155dd8261559c565b602082019050919050565b60006020820190508181036000830152615601816155c5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615664602683614a01565b915061566f82615608565b604082019050919050565b6000602082019050818103600083015261569381615657565b9050919050565b600081519050919050565b60005b838110156156c35780820151818401526020810190506156a8565b60008484015250505050565b60006156da8261569a565b6156e48185614c72565b93506156f48185602086016156a5565b80840191505092915050565b600061570c82846156cf565b915081905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061574d601483614a01565b915061575882615717565b602082019050919050565b6000602082019050818103600083015261577c81615740565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006157b9601083614a01565b91506157c482615783565b602082019050919050565b600060208201905081810360008301526157e8816157ac565b905091905056fea2646970667358221220246db58d8b1a9f14b80c905cea42c959c701ca84cf619711ec34c67bc67f824d64736f6c634300081100330000000000000000000000009c9560a06de70df3d8e97c7364f7508ef92b0f83
Deployed Bytecode
0x6080604052600436106103a25760003560e01c80637263cfe2116101e7578063c1b819b91161010d578063d9ad7f91116100a0578063f2fde38b1161006f578063f2fde38b14610c70578063f6be71d114610c99578063fc3a635314610cc2578063fd49af1314610ceb576103a2565b8063d9ad7f9114610bdc578063e0a8085314610c05578063e30ac00314610c2e578063ec91f2a414610c45576103a2565b8063d3a86386116100dc578063d3a8638614610b26578063d3e761a414610b51578063d5abeb0114610b7c578063d94a350514610ba7576103a2565b8063c1b819b914610a9d578063c403b5b214610ac6578063d1b7bda314610af1578063d2eb86ee14610b1c576103a2565b80638da5cb5b11610185578063a51312c811610154578063a51312c8146109f3578063ae90b21314610a1c578063b59f6bf514610a47578063ba060b7d14610a72576103a2565b80638da5cb5b146109495780638f77583914610974578063a24e51531461099f578063a2a3eb4d146109ca576103a2565b8063852fedc9116101c1578063852fedc9146108a557806386495b04146108ce5780638a64bbf0146108f75780638d57c9a914610920576103a2565b80637263cfe21461085b57806383624074146108845780638456cb591461088e576103a2565b8063410459ad116102cc578063599d127a1161026a5780636df9fa88116102395780636df9fa88146107c95780636f8b44b0146107f25780637120334b1461081b578063715018a614610844576103a2565b8063599d127a146107215780635c975abb1461074c57806365d634c5146107775780636d8aded1146107a0576103a2565b806355ee09d7116102a657806355ee09d71461068d57806355f15f0c146106b657806356f8f78c146106e157806358d5d666146106f8576103a2565b8063410459ad1461063157806341fbddbd1461065a578063510f615a14610664576103a2565b80632848aeaf1161034457806333bc1c5c1161031357806333bc1c5c146105ad5780633ccfd60b146105d85780633f17d40a146105ef5780633f4ba83a1461061a576103a2565b80632848aeaf146104e85780632982302814610525578063300da88314610557578063335b115e14610582576103a2565b806313cabd691161038057806313cabd69146104405780631eb8b3431461046b578063224348361461049657806323ab54b5146104bf576103a2565b80630251e03e146103a75780630fb5a6b4146103ea57806312300ba414610415575b600080fd5b3480156103b357600080fd5b506103ce60048036038101906103c9919061421f565b610d16565b6040516103e197969594939291906142a1565b60405180910390f35b3480156103f657600080fd5b506103ff610d9f565b60405161040c9190614310565b60405180910390f35b34801561042157600080fd5b5061042a610da5565b6040516104379190614310565b60405180910390f35b34801561044c57600080fd5b50610455610dab565b6040516104629190614310565b60405180910390f35b34801561047757600080fd5b50610480610db1565b60405161048d9190614310565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190614357565b610db7565b005b3480156104cb57600080fd5b506104e660048036038101906104e191906145b3565b610e7b565b005b3480156104f457600080fd5b5061050f600480360381019061050a919061421f565b6110c0565b60405161051c919061462b565b60405180910390f35b34801561053157600080fd5b5061053a6110e0565b60405161054e989796959493929190614646565b60405180910390f35b34801561056357600080fd5b5061056c6111c6565b6040516105799190614723565b60405180910390f35b34801561058e57600080fd5b506105976111ec565b6040516105a49190614310565b60405180910390f35b3480156105b957600080fd5b506105c26111f2565b6040516105cf919061462b565b60405180910390f35b3480156105e457600080fd5b506105ed611205565b005b3480156105fb57600080fd5b50610604611352565b6040516106119190614310565b60405180910390f35b34801561062657600080fd5b5061062f611358565b005b34801561063d57600080fd5b506106586004803603810190610653919061476a565b6113de565b005b61066261149e565b005b34801561067057600080fd5b5061068b60048036038101906106869190614797565b611813565b005b34801561069957600080fd5b506106b460048036038101906106af9190614797565b611899565b005b3480156106c257600080fd5b506106cb61191f565b6040516106d8919061462b565b60405180910390f35b3480156106ed57600080fd5b506106f6611932565b005b34801561070457600080fd5b5061071f600480360381019061071a9190614802565b6119da565b005b34801561072d57600080fd5b50610736611a9a565b6040516107439190614310565b60405180910390f35b34801561075857600080fd5b50610761611aa0565b60405161076e919061462b565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190614797565b611ab6565b005b3480156107ac57600080fd5b506107c760048036038101906107c2919061482f565b611b3c565b005b3480156107d557600080fd5b506107f060048036038101906107eb9190614797565b611dae565b005b3480156107fe57600080fd5b5061081960048036038101906108149190614797565b611e34565b005b34801561082757600080fd5b50610842600480360381019061083d9190614797565b611eba565b005b34801561085057600080fd5b50610859611f77565b005b34801561086757600080fd5b50610882600480360381019061087d919061482f565b611fff565b005b61088c612110565b005b34801561089a57600080fd5b506108a3612629565b005b3480156108b157600080fd5b506108cc60048036038101906108c7919061482f565b6126af565b005b3480156108da57600080fd5b506108f560048036038101906108f09190614797565b612f8e565b005b34801561090357600080fd5b5061091e60048036038101906109199190614797565b613014565b005b34801561092c57600080fd5b5061094760048036038101906109429190614797565b61309a565b005b34801561095557600080fd5b5061095e613120565b60405161096b9190614887565b60405180910390f35b34801561098057600080fd5b5061098961314a565b604051610996919061462b565b60405180910390f35b3480156109ab57600080fd5b506109b461315d565b6040516109c19190614310565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec91906148a2565b613163565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a15919061482f565b6133f5565b005b348015610a2857600080fd5b50610a31613506565b604051610a3e91906148e2565b60405180910390f35b348015610a5357600080fd5b50610a5c61352c565b604051610a69919061462b565b60405180910390f35b348015610a7e57600080fd5b50610a8761353f565b604051610a949190614310565b60405180910390f35b348015610aa957600080fd5b50610ac46004803603810190610abf9190614797565b613545565b005b348015610ad257600080fd5b50610adb6135cb565b604051610ae89190614310565b60405180910390f35b348015610afd57600080fd5b50610b066135d1565b604051610b139190614310565b60405180910390f35b610b246135d7565b005b348015610b3257600080fd5b50610b3b6138f3565b604051610b489190614310565b60405180910390f35b348015610b5d57600080fd5b50610b666138f9565b604051610b73919061462b565b60405180910390f35b348015610b8857600080fd5b50610b9161390c565b604051610b9e9190614310565b60405180910390f35b348015610bb357600080fd5b50610bbc613912565b604051610bd39b9a999897969594939291906148fd565b60405180910390f35b348015610be857600080fd5b50610c036004803603810190610bfe9190614797565b61398e565b005b348015610c1157600080fd5b50610c2c6004803603810190610c2791906149d4565b613a14565b005b348015610c3a57600080fd5b50610c43613b20565b005b348015610c5157600080fd5b50610c5a613c1e565b604051610c679190614310565b60405180910390f35b348015610c7c57600080fd5b50610c976004803603810190610c92919061421f565b613c24565b005b348015610ca557600080fd5b50610cc06004803603810190610cbb9190614797565b613d1b565b005b348015610cce57600080fd5b50610ce96004803603810190610ce49190614797565b613dd8565b005b348015610cf757600080fd5b50610d00613e5e565b604051610d0d9190614310565b60405180910390f35b60166020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16908060040160019054906101000a900460ff16908060050154905087565b60075481565b60125481565b60105481565b600e5481565b610dbf613e64565b73ffffffffffffffffffffffffffffffffffffffff16610ddd613120565b73ffffffffffffffffffffffffffffffffffffffff1614610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a90614a5e565b60405180910390fd5b605a82610e409190614aad565b600e8190555080600e54610e549190614aad565b600f81905550600f5460108190555080601054610e719190614aad565b6011819055505050565b610e83613e64565b73ffffffffffffffffffffffffffffffffffffffff16610ea1613120565b73ffffffffffffffffffffffffffffffffffffffff1614610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90614a5e565b60405180910390fd5b6011544211610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290614b2d565b60405180910390fd5b60001515601360009054906101000a900460ff16151514610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890614b99565b60405180910390fd5b60005b82518110156110a057600160166000858481518110610fb657610fb5614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160016101000a81548160ff02191690831515021790555081818151811061102557611024614bb9565b5b60200260200101516016600085848151811061104457611043614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550808061109890614be8565b915050610f94565b506001601360006101000a81548160ff0219169083151502179055505050565b60146020528060005260406000206000915054906101000a900460ff1681565b600080600080600080600080600954600654600e54600f54601360019054906101000a900460ff16601360049054906101000a900460ff16600b54601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190614c45565b975097509750975097509750975097509091929394959697565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b601360049054906101000a900460ff1681565b61120d613e64565b73ffffffffffffffffffffffffffffffffffffffff1661122b613120565b73ffffffffffffffffffffffffffffffffffffffff1614611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127890614a5e565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516112c990614ca3565b60006040518083038185875af1925050503d8060008114611306576040519150601f19603f3d011682016040523d82523d6000602084013e61130b565b606091505b505090508061134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690614d04565b60405180910390fd5b50565b600f5481565b611360613e64565b73ffffffffffffffffffffffffffffffffffffffff1661137e613120565b73ffffffffffffffffffffffffffffffffffffffff16146113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb90614a5e565b60405180910390fd5b6113dc613e6c565b565b6113e6613e64565b73ffffffffffffffffffffffffffffffffffffffff16611404613120565b73ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145190614a5e565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5442101580156114b25750600f544211155b6114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890614d70565b60405180910390fd5b600654341015611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d90614ddc565b60405180910390fd5b60011515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c090614e48565b60405180910390fd5b6000600b541161160e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160590614eb4565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016116699190614887565b6020604051808303816000875af1158015611688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ac9190614c45565b50600b60008154809291906116c090614ed4565b91905055506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600954601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b19190614c45565b600c546117be9190614efd565b6117c89190614efd565b600a819055503373ffffffffffffffffffffffffffffffffffffffff167f016393cb290ab38948527bb115688745c29b0a40d90372d61c7f232ecf65286260405160405180910390a2565b61181b613e64565b73ffffffffffffffffffffffffffffffffffffffff16611839613120565b73ffffffffffffffffffffffffffffffffffffffff161461188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188690614a5e565b60405180910390fd5b80600f8190555050565b6118a1613e64565b73ffffffffffffffffffffffffffffffffffffffff166118bf613120565b73ffffffffffffffffffffffffffffffffffffffff1614611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614a5e565b60405180910390fd5b8060058190555050565b601360009054906101000a900460ff1681565b61193a613e64565b73ffffffffffffffffffffffffffffffffffffffff16611958613120565b73ffffffffffffffffffffffffffffffffffffffff16146119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590614a5e565b60405180910390fd5b601360049054906101000a900460ff1615601360046101000a81548160ff021916908315150217905550565b6119e2613e64565b73ffffffffffffffffffffffffffffffffffffffff16611a00613120565b73ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614a5e565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b60008060009054906101000a900460ff16905090565b611abe613e64565b73ffffffffffffffffffffffffffffffffffffffff16611adc613120565b73ffffffffffffffffffffffffffffffffffffffff1614611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990614a5e565b60405180910390fd5b8060098190555050565b611b44613e64565b73ffffffffffffffffffffffffffffffffffffffff16611b62613120565b73ffffffffffffffffffffffffffffffffffffffff1614611bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baf90614a5e565b60405180910390fd5b6011544211611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390614b2d565b60405180910390fd5b60001515601360019054906101000a900460ff16151514611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990614f7d565b60405180910390fd5b60095481511115611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90614fe9565b60405180910390fd5b60005b8151811015611d8f57600160166000848481518110611cbd57611cbc614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160016101000a81548160ff02191690831515021790555060045460166000848481518110611d3357611d32614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501819055508080611d8790614be8565b915050611c9b565b506001601360016101000a81548160ff02191690831515021790555050565b611db6613e64565b73ffffffffffffffffffffffffffffffffffffffff16611dd4613120565b73ffffffffffffffffffffffffffffffffffffffff1614611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190614a5e565b60405180910390fd5b8060068190555050565b611e3c613e64565b73ffffffffffffffffffffffffffffffffffffffff16611e5a613120565b73ffffffffffffffffffffffffffffffffffffffff1614611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790614a5e565b60405180910390fd5b80600c8190555050565b611ec2613e64565b73ffffffffffffffffffffffffffffffffffffffff16611ee0613120565b73ffffffffffffffffffffffffffffffffffffffff1614611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90614a5e565b60405180910390fd5b806003819055507f1b55d9f7002bda4490f467e326f22a4a847629c0f2d1ed421607d318d25b410d81604051611f6c9190614310565b60405180910390a150565b611f7f613e64565b73ffffffffffffffffffffffffffffffffffffffff16611f9d613120565b73ffffffffffffffffffffffffffffffffffffffff1614611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90614a5e565b60405180910390fd5b611ffd6000613ece565b565b612007613e64565b73ffffffffffffffffffffffffffffffffffffffff16612025613120565b73ffffffffffffffffffffffffffffffffffffffff161461207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207290614a5e565b60405180910390fd5b60005b815181101561210c576001601460008484815181106120a05761209f614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061210490614be8565b91505061207e565b5050565b600260015403612155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214c90615055565b60405180910390fd5b6002600181905550612165611aa0565b156121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c906150c1565b60405180910390fd5b601154421080156121b857506010544210155b6121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee9061512d565b60405180910390fd5b60045434101561223c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223390615199565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154111561240657601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154341161230b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123029061522b565b60405180910390fd5b6123b9601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613f94565b5034601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506125a2565b61240e614154565b33816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050348160200181815250504281606001818152505060008160a00190151590811515815250506000816080019015159081151581525050600081604001901515908115158152505060008160c001818152505080601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055506060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160040160016101000a81548160ff02191690831515021790555060c08201518160050155905050505b7f4c59a472ced976904d21e373e2f2d8326defffabfe087e3d7886f0c516495ba733601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015460006040516126189392919061524b565b60405180910390a160018081905550565b612631613e64565b73ffffffffffffffffffffffffffffffffffffffff1661264f613120565b73ffffffffffffffffffffffffffffffffffffffff16146126a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269c90614a5e565b60405180910390fd5b6126ad61405f565b565b6126b7613e64565b73ffffffffffffffffffffffffffffffffffffffff166126d5613120565b73ffffffffffffffffffffffffffffffffffffffff161461272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272290614a5e565b60405180910390fd5b600260015403612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276790615055565b60405180910390fd5b600260018190555060115442116127bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b3906152ce565b60405180910390fd5b60011515601360009054906101000a900460ff1615151480156127f2575060011515601360019054906101000a900460ff161515145b612831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128289061533a565b60405180910390fd5b60005b8151811015612f8357600115156016600084848151811061285857612857614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160019054906101000a900460ff161515148015612927575060001515601660008484815181106128d0576128cf614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff161515145b80156129a05750600015156016600084848151811061294957612948614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160009054906101000a900460ff161515145b15612ce7576000601660008484815181106129be576129bd614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015460166000858581518110612a1b57612a1a614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612a6b9190614efd565b90506000811115612b3e576000838381518110612a8b57612a8a614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1682604051612ab690614ca3565b60006040518083038185875af1925050503d8060008114612af3576040519150601f19603f3d011682016040523d82523d6000602084013e612af8565b606091505b5050905080612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b33906153cc565b60405180910390fd5b505b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842848481518110612b8f57612b8e614bb9565b5b60200260200101516040518263ffffffff1660e01b8152600401612bb39190614887565b6020604051808303816000875af1158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614c45565b50600160166000858581518110612c1057612c0f614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550600160166000858581518110612c8557612c84614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006101000a81548160ff02191690831515021790555050612f70565b6000151560166000848481518110612d0257612d01614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160019054906101000a900460ff161515148015612dd157506000151560166000848481518110612d7a57612d79614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160009054906101000a900460ff161515145b15612f6f576000828281518110612deb57612dea614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1660166000858581518110612e2057612e1f614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154604051612e7290614ca3565b60006040518083038185875af1925050503d8060008114612eaf576040519150601f19603f3d011682016040523d82523d6000602084013e612eb4565b606091505b5050905080612ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eef90615438565b60405180910390fd5b600160166000858581518110612f1157612f10614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006101000a81548160ff021916908315150217905550505b5b8080612f7b90614be8565b915050612834565b506001808190555050565b612f96613e64565b73ffffffffffffffffffffffffffffffffffffffff16612fb4613120565b73ffffffffffffffffffffffffffffffffffffffff161461300a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300190614a5e565b60405180910390fd5b8060048190555050565b61301c613e64565b73ffffffffffffffffffffffffffffffffffffffff1661303a613120565b73ffffffffffffffffffffffffffffffffffffffff1614613090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308790614a5e565b60405180910390fd5b80600d8190555050565b6130a2613e64565b73ffffffffffffffffffffffffffffffffffffffff166130c0613120565b73ffffffffffffffffffffffffffffffffffffffff1614613116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310d90614a5e565b60405180910390fd5b8060118190555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601360039054906101000a900460ff1681565b60065481565b61316b613e64565b73ffffffffffffffffffffffffffffffffffffffff16613189613120565b73ffffffffffffffffffffffffffffffffffffffff16146131df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d690614a5e565b60405180910390fd5b80600d541015613224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321b906154a4565b60405180910390fd5b600f54421115613269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326090615510565b60405180910390fd5b60005b8181101561332657601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842846040518263ffffffff1660e01b81526004016132cf9190614887565b6020604051808303816000875af11580156132ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133129190614c45565b50808061331e90614be8565b91505061326c565b5080600d60008282546133399190614efd565b92505081905550600954601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d49190614c45565b600c546133e19190614efd565b6133eb9190614efd565b600a819055505050565b6133fd613e64565b73ffffffffffffffffffffffffffffffffffffffff1661341b613120565b73ffffffffffffffffffffffffffffffffffffffff1614613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346890614a5e565b60405180910390fd5b60005b81518110156135025760006014600084848151811061349657613495614bb9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806134fa90614be8565b915050613474565b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360019054906101000a900460ff1681565b600a5481565b61354d613e64565b73ffffffffffffffffffffffffffffffffffffffff1661356b613120565b73ffffffffffffffffffffffffffffffffffffffff16146135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b890614a5e565b60405180910390fd5b80600e8190555050565b60115481565b600d5481565b60026001540361361c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361390615055565b60405180910390fd5b600260018190555061362c611aa0565b1561366c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613663906150c1565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638a333b506040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fd9190614c45565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561376a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378e9190614c45565b1061379857600080fd5b60011515601360049054906101000a900460ff161515146137ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e59061557c565b60405180910390fd5b600454341015613833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382a906155e8565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b815260040161388e9190614887565b6020604051808303816000875af11580156138ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d19190614c45565b50600a60008154809291906138e590614ed4565b919050555060018081905550565b60045481565b601360029054906101000a900460ff1681565b600c5481565b6000806000806000806000806000806000600a54601054601154601254601360009054906101000a900460ff16601360029054906101000a900460ff16601360039054906101000a900460ff166003546007546004546005549a509a509a509a509a509a509a509a509a509a509a50909192939495969798999a565b613996613e64565b73ffffffffffffffffffffffffffffffffffffffff166139b4613120565b73ffffffffffffffffffffffffffffffffffffffff1614613a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0190614a5e565b60405180910390fd5b8060108190555050565b613a1c613e64565b73ffffffffffffffffffffffffffffffffffffffff16613a3a613120565b73ffffffffffffffffffffffffffffffffffffffff1614613a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8790614a5e565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a3f300c826040518263ffffffff1660e01b8152600401613aeb919061462b565b600060405180830381600087803b158015613b0557600080fd5b505af1158015613b19573d6000803e3d6000fd5b5050505050565b613b28613e64565b73ffffffffffffffffffffffffffffffffffffffff16613b46613120565b73ffffffffffffffffffffffffffffffffffffffff1614613b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9390614a5e565b60405180910390fd5b60001515601360029054906101000a900460ff16151514613bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613be990614b99565b60405180910390fd5b601360029054906101000a900460ff1615601360026101000a81548160ff021916908315150217905550565b60035481565b613c2c613e64565b73ffffffffffffffffffffffffffffffffffffffff16613c4a613120565b73ffffffffffffffffffffffffffffffffffffffff1614613ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9790614a5e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d069061567a565b60405180910390fd5b613d1881613ece565b50565b613d23613e64565b73ffffffffffffffffffffffffffffffffffffffff16613d41613120565b73ffffffffffffffffffffffffffffffffffffffff1614613d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d8e90614a5e565b60405180910390fd5b806007819055507faab6389d8f1c16ba1deb6e9831f5c5442cf4fcf99bf5bfa867460be408a9111881604051613dcd9190614310565b60405180910390a150565b613de0613e64565b73ffffffffffffffffffffffffffffffffffffffff16613dfe613120565b73ffffffffffffffffffffffffffffffffffffffff1614613e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e4b90614a5e565b60405180910390fd5b80600a8190555050565b600b5481565b600033905090565b613e746140c1565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613eb7613e64565b604051613ec49190614887565b60405180910390a1565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808373ffffffffffffffffffffffffffffffffffffffff168361753090600067ffffffffffffffff811115613fce57613fcd6143ad565b5b6040519080825280601f01601f1916602001820160405280156140005781602001600182028036833780820191505090505b5060405161400e9190615700565b600060405180830381858888f193505050503d806000811461404c576040519150601f19603f3d011682016040523d82523d6000602084013e614051565b606091505b505090508091505092915050565b61406761410a565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586140aa613e64565b6040516140b79190614887565b60405180910390a1565b6140c9611aa0565b614108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ff90615763565b60405180910390fd5b565b614112611aa0565b15614152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614149906157cf565b60405180910390fd5b565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160001515815260200160008152602001600015158152602001600015158152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141ec826141c1565b9050919050565b6141fc816141e1565b811461420757600080fd5b50565b600081359050614219816141f3565b92915050565b600060208284031215614235576142346141b7565b5b60006142438482850161420a565b91505092915050565b6000614257826141c1565b9050919050565b6142678161424c565b82525050565b6000819050919050565b6142808161426d565b82525050565b60008115159050919050565b61429b81614286565b82525050565b600060e0820190506142b6600083018a61425e565b6142c36020830189614277565b6142d06040830188614292565b6142dd6060830187614277565b6142ea6080830186614292565b6142f760a0830185614292565b61430460c0830184614277565b98975050505050505050565b60006020820190506143256000830184614277565b92915050565b6143348161426d565b811461433f57600080fd5b50565b6000813590506143518161432b565b92915050565b6000806040838503121561436e5761436d6141b7565b5b600061437c85828601614342565b925050602061438d85828601614342565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143e58261439c565b810181811067ffffffffffffffff82111715614404576144036143ad565b5b80604052505050565b60006144176141ad565b905061442382826143dc565b919050565b600067ffffffffffffffff821115614443576144426143ad565b5b602082029050602081019050919050565b600080fd5b600061446c61446784614428565b61440d565b9050808382526020820190506020840283018581111561448f5761448e614454565b5b835b818110156144b857806144a4888261420a565b845260208401935050602081019050614491565b5050509392505050565b600082601f8301126144d7576144d6614397565b5b81356144e7848260208601614459565b91505092915050565b600067ffffffffffffffff82111561450b5761450a6143ad565b5b602082029050602081019050919050565b600061452f61452a846144f0565b61440d565b9050808382526020820190506020840283018581111561455257614551614454565b5b835b8181101561457b57806145678882614342565b845260208401935050602081019050614554565b5050509392505050565b600082601f83011261459a57614599614397565b5b81356145aa84826020860161451c565b91505092915050565b600080604083850312156145ca576145c96141b7565b5b600083013567ffffffffffffffff8111156145e8576145e76141bc565b5b6145f4858286016144c2565b925050602083013567ffffffffffffffff811115614615576146146141bc565b5b61462185828601614585565b9150509250929050565b60006020820190506146406000830184614292565b92915050565b60006101008201905061465c600083018b614277565b614669602083018a614277565b6146766040830189614277565b6146836060830188614277565b6146906080830187614292565b61469d60a0830186614292565b6146aa60c0830185614277565b6146b760e0830184614277565b9998505050505050505050565b6000819050919050565b60006146e96146e46146df846141c1565b6146c4565b6141c1565b9050919050565b60006146fb826146ce565b9050919050565b600061470d826146f0565b9050919050565b61471d81614702565b82525050565b60006020820190506147386000830184614714565b92915050565b6147478161424c565b811461475257600080fd5b50565b6000813590506147648161473e565b92915050565b6000602082840312156147805761477f6141b7565b5b600061478e84828501614755565b91505092915050565b6000602082840312156147ad576147ac6141b7565b5b60006147bb84828501614342565b91505092915050565b60006147cf826141e1565b9050919050565b6147df816147c4565b81146147ea57600080fd5b50565b6000813590506147fc816147d6565b92915050565b600060208284031215614818576148176141b7565b5b6000614826848285016147ed565b91505092915050565b600060208284031215614845576148446141b7565b5b600082013567ffffffffffffffff811115614863576148626141bc565b5b61486f848285016144c2565b91505092915050565b614881816141e1565b82525050565b600060208201905061489c6000830184614878565b92915050565b600080604083850312156148b9576148b86141b7565b5b60006148c78582860161420a565b92505060206148d885828601614342565b9150509250929050565b60006020820190506148f7600083018461425e565b92915050565b600061016082019050614913600083018e614277565b614920602083018d614277565b61492d604083018c614277565b61493a606083018b614277565b614947608083018a614292565b61495460a0830189614292565b61496160c0830188614292565b61496e60e0830187614277565b61497c610100830186614277565b61498a610120830185614277565b614998610140830184614277565b9c9b505050505050505050505050565b6149b181614286565b81146149bc57600080fd5b50565b6000813590506149ce816149a8565b92915050565b6000602082840312156149ea576149e96141b7565b5b60006149f8848285016149bf565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a48602083614a01565b9150614a5382614a12565b602082019050919050565b60006020820190508181036000830152614a7781614a3b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ab88261426d565b9150614ac38361426d565b9250828201905080821115614adb57614ada614a7e565b5b92915050565b7f41756374696f6e206e6f74206f766572207965742e0000000000000000000000600082015250565b6000614b17601583614a01565b9150614b2282614ae1565b602082019050919050565b60006020820190508181036000830152614b4681614b0a565b9050919050565b7f41756374696f6e20616c726561647920736574746c6564000000000000000000600082015250565b6000614b83601783614a01565b9150614b8e82614b4d565b602082019050919050565b60006020820190508181036000830152614bb281614b76565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614bf38261426d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c2557614c24614a7e565b5b600182019050919050565b600081519050614c3f8161432b565b92915050565b600060208284031215614c5b57614c5a6141b7565b5b6000614c6984828501614c30565b91505092915050565b600081905092915050565b50565b6000614c8d600083614c72565b9150614c9882614c7d565b600082019050919050565b6000614cae82614c80565b9150819050919050565b7f4661696c656420746f2073656e6420746f2070617965652e0000000000000000600082015250565b6000614cee601883614a01565b9150614cf982614cb8565b602082019050919050565b60006020820190508181036000830152614d1d81614ce1565b9050919050565b7f4f75747369646520616c6c6f776c6973742077696e646f770000000000000000600082015250565b6000614d5a601883614a01565b9150614d6582614d24565b602082019050919050565b60006020820190508181036000830152614d8981614d4d565b9050919050565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b6000614dc6601383614a01565b9150614dd182614d90565b602082019050919050565b60006020820190508181036000830152614df581614db9565b9050919050565b7f4e6f74206f6e20616c6c6f776c69737400000000000000000000000000000000600082015250565b6000614e32601083614a01565b9150614e3d82614dfc565b602082019050919050565b60006020820190508181036000830152614e6181614e25565b9050919050565b7f4e6f206d6f726520616c6c6f776c69737420737570706c790000000000000000600082015250565b6000614e9e601883614a01565b9150614ea982614e68565b602082019050919050565b60006020820190508181036000830152614ecd81614e91565b9050919050565b6000614edf8261426d565b915060008203614ef257614ef1614a7e565b5b600182039050919050565b6000614f088261426d565b9150614f138361426d565b9250828203905081811115614f2b57614f2a614a7e565b5b92915050565b7f526166666c6520616c726561647920736574746c656400000000000000000000600082015250565b6000614f67601683614a01565b9150614f7282614f31565b602082019050919050565b60006020820190508181036000830152614f9681614f5a565b9050919050565b7f496e636f7272656374206e756d626572206f662077696e6e6572730000000000600082015250565b6000614fd3601b83614a01565b9150614fde82614f9d565b602082019050919050565b6000602082019050818103600083015261500281614fc6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061503f601f83614a01565b915061504a82615009565b602082019050919050565b6000602082019050818103600083015261506e81615032565b9050919050565b7f41756374696f6e486f7573653a20706175736564000000000000000000000000600082015250565b60006150ab601483614a01565b91506150b682615075565b602082019050919050565b600060208201905081810360008301526150da8161509e565b9050919050565b7f4f7574736964652061756374696f6e2077696e646f772e000000000000000000600082015250565b6000615117601783614a01565b9150615122826150e1565b602082019050919050565b600060208201905081810360008301526151468161510a565b9050919050565b7f42696420616d6f756e7420746f6f206c6f772e00000000000000000000000000600082015250565b6000615183601383614a01565b915061518e8261514d565b602082019050919050565b600060208201905081810360008301526151b281615176565b9050919050565b7f596f752063616e206f6e6c7920696e63726561736520796f7572206269642c2060008201527f6e6f742064656372656173652e00000000000000000000000000000000000000602082015250565b6000615215602d83614a01565b9150615220826151b9565b604082019050919050565b6000602082019050818103600083015261524481615208565b9050919050565b60006060820190506152606000830186614878565b61526d6020830185614277565b61527a6040830184614292565b949350505050565b7f41756374696f6e206861736e277420656e6465642e0000000000000000000000600082015250565b60006152b8601583614a01565b91506152c382615282565b602082019050919050565b600060208201905081810360008301526152e7816152ab565b9050919050565b7f41756374696f6e2077696e6e657273206e6f7420736574000000000000000000600082015250565b6000615324601783614a01565b915061532f826152ee565b602082019050919050565b6000602082019050818103600083015261535381615317565b9050919050565b7f4661696c656420746f20726566756e6420646966666572656e636520746f207760008201527f696e6e65722e0000000000000000000000000000000000000000000000000000602082015250565b60006153b6602683614a01565b91506153c18261535a565b604082019050919050565b600060208201905081810360008301526153e5816153a9565b9050919050565b7f4661696c656420746f2073656e6420726566756e6420746f206c6f7365722e00600082015250565b6000615422601f83614a01565b915061542d826153ec565b602082019050919050565b6000602082019050818103600083015261545181615415565b9050919050565b7f4e6f7420656e6f7567682070726f6d6f20737570706c79000000000000000000600082015250565b600061548e601783614a01565b915061549982615458565b602082019050919050565b600060208201905081810360008301526154bd81615481565b9050919050565b7f4f7574736964652070726f6d6f206d696e742077696e646f7700000000000000600082015250565b60006154fa601983614a01565b9150615505826154c4565b602082019050919050565b60006020820190508181036000830152615529816154ed565b9050919050565b7f4e6f7420617574686f72697a65642e0000000000000000000000000000000000600082015250565b6000615566600f83614a01565b915061557182615530565b602082019050919050565b6000602082019050818103600083015261559581615559565b9050919050565b7f416d6f756e7420746f6f206c6f772e0000000000000000000000000000000000600082015250565b60006155d2600f83614a01565b91506155dd8261559c565b602082019050919050565b60006020820190508181036000830152615601816155c5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615664602683614a01565b915061566f82615608565b604082019050919050565b6000602082019050818103600083015261569381615657565b9050919050565b600081519050919050565b60005b838110156156c35780820151818401526020810190506156a8565b60008484015250505050565b60006156da8261569a565b6156e48185614c72565b93506156f48185602086016156a5565b80840191505092915050565b600061570c82846156cf565b915081905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061574d601483614a01565b915061575882615717565b602082019050919050565b6000602082019050818103600083015261577c81615740565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006157b9601083614a01565b91506157c482615783565b602082019050919050565b600060208201905081810360008301526157e8816157ac565b905091905056fea2646970667358221220246db58d8b1a9f14b80c905cea42c959c701ca84cf619711ec34c67bc67f824d64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009c9560a06de70df3d8e97c7364f7508ef92b0f83
-----Decoded View---------------
Arg [0] : _quasarfighter (address): 0x9C9560A06de70Df3D8E97C7364f7508ef92B0f83
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009c9560a06de70df3d8e97c7364f7508ef92b0f83
Deployed Bytecode Sourcemap
466:14857:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2909:35;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;970:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1868:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1690:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1500;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14535:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12096:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2136:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8395:660;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;2184:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;780:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2074:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7085:171;;;;;;;;;;;;;:::i;:::-;;1596:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6988:75;;;;;;;;;;;;;:::i;:::-;;7295:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6218:660;;;:::i;:::-;;4600:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5434:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1916:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4754:83;;;;;;;;;;;;;:::i;:::-;;3242:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1156:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1608:84:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4843:116:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11551:539;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14862:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4965:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5102:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1661:101:13;;;;;;;;;;;;;:::i;:::-;;3623:190:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9133:1554;;;:::i;:::-;;6897:70;;;;;;;;;;;;;:::i;:::-;;12877:1477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5300:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3505:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4292:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1029:85:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2041:27:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;901:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5765:425;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3819:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1070:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1959:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1225:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4438:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1771:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1440:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10694:783;;;:::i;:::-;;694:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2001:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1382:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7498:815;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;4138:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4021:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14362:167;;;;;;;;;;;;;:::i;:::-;;601:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5588:153:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3379:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1313:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2909:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;970:31::-;;;;:::o;1868:41::-;;;;:::o;1690:50::-;;;;:::o;1500:::-;;;;:::o;14535:321::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14664:2:16::1;14647:14;:19;;;;:::i;:::-;14622:22;:44;;;;14724:9;14699:22;;:34;;;;:::i;:::-;14676:20;:57;;;;14766:20;;14743;:43;;;;14840:9;14817:20;;:32;;;;:::i;:::-;14796:18;:53;;;;14535:321:::0;;:::o;12096:635::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12238:18:16::1;;12220:15;:36;12212:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12321:5;12300:26;;:17;;;;;;;;;;;:26;;;12292:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;12518:9;12513:178;12537:15;:22;12533:1;:26;12513:178;;;12614:4;12580;:24;12585:15;12601:1;12585:18;;;;;;;;:::i;:::-;;;;;;;;12580:24;;;;;;;;;;;;;;;:31;;;:38;;;;;;;;;;;;;;;;;;12670:7;12678:1;12670:10;;;;;;;;:::i;:::-;;;;;;;;12632:4;:24;12637:15;12653:1;12637:18;;;;;;;;:::i;:::-;;;;;;;;12632:24;;;;;;;;;;;;;;;:35;;:48;;;;12561:3;;;;;:::i;:::-;;;;12513:178;;;;12720:4;12700:17;;:24;;;;;;;;;;;;;;;;;;12096:635:::0;;:::o;2136:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;8395:660::-;8466:21;8501:23;8538:31;8583:29;8626:22;8662:16;8692:24;8730:20;8796:12;;8822:14;;8850:22;;8886:20;;8920:16;;;;;;;;;;;8950:10;;;;;;;;;;;8974:15;;9003:13;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8775:269;;;;;;;;;;;;;;;;8395:660;;;;;;;;:::o;2184:34::-;;;;;;;;;;;;;:::o;780:42::-;;;;:::o;2074:30::-;;;;;;;;;;;;;:::o;7085:171::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7133:12:16::1;7151:5;;;;;;;;;;;:10;;7169:21;7151:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7132:63;;;7213:7;7205:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;7122:134;7085:171::o:0;1596:50::-;;;;:::o;6988:75::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7045:10:16::1;:8;:10::i;:::-;6988:75::o:0;7295:90::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7372:6:16::1;7364:5;;:14;;;;;;;;;;;;;;;;;;7295:90:::0;:::o;6218:660::-;6310:22;;6291:15;:41;;:100;;;;;6371:20;;6352:15;:39;;6291:100;6270:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;6472:14;;6459:9;:27;;6451:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;6553:4;6528:29;;:9;:21;6538:10;6528:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;6520:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;6614:1;6596:15;;:19;6588:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6654:13;;;;;;;;;;;:18;;;6673:10;6654:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6694:15;;:17;;;;;;;;;:::i;:::-;;;;;;6745:5;6721:9;:21;6731:10;6721:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;6818:12;;6788:13;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6776:9;;:39;;;;:::i;:::-;:54;;;;:::i;:::-;6760:13;:70;;;;6860:10;6846:25;;;;;;;;;;;;6218:660::o;4600:148::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4717:24:16::1;4694:20;:47;;;;4600:148:::0;:::o;5434:124::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5535:16:16::1;5517:15;:34;;;;5434:124:::0;:::o;1916:37::-;;;;;;;;;;;;;:::o;4754:83::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4820:10:16::1;;;;;;;;;;;4819:11;4806:10;;:24;;;;;;;;;;;;;;;;;;4754:83::o:0;3242:131::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3349:17:16::1;3333:13;;:33;;;;;;;;;;;;;;;;;;3242:131:::0;:::o;1156:31::-;;;;:::o;1608:84:14:-;1655:4;1678:7;;;;;;;;;;;1671:14;;1608:84;:::o;4843:116:16:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4936:16:16::1;4921:12;:31;;;;4843:116:::0;:::o;11551:539::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11665:18:16::1;;11647:15;:36;11639:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11747:5;11727:25;;:16;;;;;;;;;;;:25;;;11719:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;11822:12;;11797:14;:21;:37;;11789:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;11881:9;11876:175;11900:14;:21;11896:1;:25;11876:175;;;11975:4;11942;:23;11947:14;11962:1;11947:17;;;;;;;;:::i;:::-;;;;;;;;11942:23;;;;;;;;;;;;;;;:30;;;:37;;;;;;;;;;;;;;;;;;12030:10;;11993:4;:23;11998:14;12013:1;11998:17;;;;;;;;:::i;:::-;;;;;;;;11993:23;;;;;;;;;;;;;;;:34;;:47;;;;11923:3;;;;;:::i;:::-;;;;11876:175;;;;12079:4;12060:16;;:23;;;;;;;;;;;;;;;;;;11551:539:::0;:::o;14862:119::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14959:15:16::1;14942:14;:32;;;;14862:119:::0;:::o;4965:104::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5049:13:16::1;5037:9;:25;;;;4965:104:::0;:::o;5102:165::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5197:11:16::1;5184:10;:24;;;;5223:37;5248:11;5223:37;;;;;;:::i;:::-;;;;;;;;5102:165:::0;:::o;1661:101:13:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;3623:190:16:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3708:9:16::1;3703:104;3727:10;:17;3723:1;:21;3703:104;;;3792:4;3765:9;:24;3775:10;3786:1;3775:13;;;;;;;;:::i;:::-;;;;;;;;3765:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;3746:3;;;;;:::i;:::-;;;;3703:104;;;;3623:190:::0;:::o;9133:1554::-;1744:1:17;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2357:8:16::1;:6;:8::i;:::-;2356:9;2348:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;9319:18:::2;;9301:15;:36;:79;;;;;9360:20;;9341:15;:39;;9301:79;9293:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;9439:10;;9426:9;:23;;9418:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;9607:1;9581:4;:16;9586:10;9581:16;;;;;;;;;;;;;;;:23;;;:27;9577:699;;;9644:4;:16;9649:10;9644:16;;;;;;;;;;;;;;;:23;;;9632:9;:35;9624:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;9731:66;9748:4;:16;9753:10;9748:16;;;;;;;;;;;;;;;:23;;;;;;;;;;;;9773:4;:16;9778:10;9773:16;;;;;;;;;;;;;;;:23;;;9731:16;:66::i;:::-;;9837:9;9811:4;:16;9816:10;9811:16;;;;;;;;;;;;;;;:23;;:35;;;;9577:699;;;9922:18;;:::i;:::-;9979:10;9954:7;:14;;:36;;;;;;;;;::::0;::::2;10021:9;10004:7;:14;;:26;;;::::0;::::2;10064:15;10044:7;:17;;:35;;;::::0;::::2;10110:5;10093:7;:14;;:22;;;;;;;;;::::0;::::2;10148:5;10129:7;:16;;:24;;;;;;;;;::::0;::::2;10184:5;10167:7;:14;;:22;;;;;;;;;::::0;::::2;10224:1;10203:7;:18;;:22;;;::::0;::::2;10258:7;10239:4;:16;10244:10;10239:16;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9908:368;9577:699;10624:54;10635:10;10647:4;:16;10652:10;10647:16;;;;;;;;;;;;;;;:23;;;10672:5;10624:54;;;;;;;;:::i;:::-;;;;;;;;1701:1:17::0;2628:7;:22;;;;9133:1554:16:o;6897:70::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6952:8:16::1;:6;:8::i;:::-;6897:70::o:0;12877:1477::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:17::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;12994::16::2;;12976:15;:36;12968:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;13077:4;13056:25;;:17;;;;;;;;;;;:25;;;:53;;;;;13105:4;13085:24;;:16;;;;;;;;;;;:24;;;13056:53;13048:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;13224:9;13219:1128;13243:8;:15;13239:1;:19;13219:1128;;;13311:4;13283:32;;:4;:17;13288:8;13297:1;13288:11;;;;;;;;:::i;:::-;;;;;;;;13283:17;;;;;;;;;;;;;;;:24;;;;;;;;;;;;:32;;;:69;;;;;13347:5;13319:33;;:4;:17;13324:8;13333:1;13324:11;;;;;;;;:::i;:::-;;;;;;;;13319:17;;;;;;;;;;;;;;;:24;;;;;;;;;;;;:33;;;13283:69;:108;;;;;13386:5;13356:35;;:4;:17;13361:8;13370:1;13361:11;;;;;;;;:::i;:::-;;;;;;;;13356:17;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:35;;;13283:108;13279:1058;;;13483:18;13531:4;:17;13536:8;13545:1;13536:11;;;;;;;;:::i;:::-;;;;;;;;13531:17;;;;;;;;;;;;;;;:28;;;13504:4;:17;13509:8;13518:1;13509:11;;;;;;;;:::i;:::-;;;;;;;;13504:17;;;;;;;;;;;;;;;:24;;;:55;;;;:::i;:::-;13483:76;;13594:1;13581:10;:14;13577:199;;;13620:12;13638:8;13647:1;13638:11;;;;;;;;:::i;:::-;;;;;;;;:16;;13662:10;13638:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13619:58;;;13707:7;13699:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;13597:179;13577:199;13793:13;;;;;;;;;;;:18;;;13812:8;13821:1;13812:11;;;;;;;;:::i;:::-;;;;;;;;13793:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13904:4;13877;:17;13882:8;13891:1;13882:11;;;;;;;;:::i;:::-;;;;;;;;13877:17;;;;;;;;;;;;;;;:24;;;:31;;;;;;;;;;;;;;;;;;13955:4;13926;:17;13931:8;13940:1;13931:11;;;;;;;;:::i;:::-;;;;;;;;13926:17;;;;;;;;;;;;;;;:26;;;:33;;;;;;;;;;;;;;;;;;13393:581;13279:1058;;;14025:5;13997:33;;:4;:17;14002:8;14011:1;14002:11;;;;;;;;:::i;:::-;;;;;;;;13997:17;;;;;;;;;;;;;;;:24;;;;;;;;;;;;:33;;;:72;;;;;14064:5;14034:35;;:4;:17;14039:8;14048:1;14039:11;;;;;;;;:::i;:::-;;;;;;;;14034:17;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:35;;;13997:72;13993:344;;;14131:12;14149:8;14158:1;14149:11;;;;;;;;:::i;:::-;;;;;;;;:16;;14173:4;:17;14178:8;14187:1;14178:11;;;;;;;;:::i;:::-;;;;;;;;14173:17;;;;;;;;;;;;;;;:24;;;14149:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14130:72;;;14228:7;14220:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;14318:4;14289;:17;14294:8;14303:1;14294:11;;;;;;;;:::i;:::-;;;;;;;;14289:17;;;;;;;;;;;;;;;:26;;;:33;;;;;;;;;;;;;;;;;;14071:266;13993:344;13279:1058;13260:3;;;;;:::i;:::-;;;;13219:1128;;;;1701:1:17::1;2628:7:::0;:22:::1;;;;12877:1477:16::0;:::o;5300:104::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5386:11:16::1;5373:10;:24;;;;5300:104:::0;:::o;3505:112::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3595:15:16::1;3581:11;:29;;;;3505:112:::0;:::o;4292:140::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4403:22:16::1;4382:18;:43;;;;4292:140:::0;:::o;1029:85:13:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;2041:27:16:-;;;;;;;;;;;;;:::o;901:40::-;;;;:::o;5765:425::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5863:4:16::1;5848:11;;:19;;5840:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;5932:20;;5913:15;:39;;5905:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;5997:9;5992:83;6016:4;6012:1;:8;5992:83;;;6041:13;;;;;;;;;;;:18;;;6060:3;6041:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6022:3;;;;;:::i;:::-;;;;5992:83;;;;6099:4;6084:11;;:19;;;;;;;:::i;:::-;;;;;;;;6171:12;;6141:13;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6129:9;;:39;;;;:::i;:::-;:54;;;;:::i;:::-;6113:13;:70;;;;5765:425:::0;;:::o;3819:196::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3909:9:16::1;3904:105;3928:10;:17;3924:1;:21;3904:105;;;3993:5;3966:9;:24;3976:10;3987:1;3976:13;;;;;;;;:::i;:::-;;;;;;;;3966:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;3947:3;;;;;:::i;:::-;;;;3904:105;;;;3819:196:::0;:::o;1070:28::-;;;;;;;;;;;;;:::o;1959:36::-;;;;;;;;;;;;;:::o;1225:33::-;;;;:::o;4438:156::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4561:26:16::1;4536:22;:51;;;;4438:156:::0;:::o;1771:50::-;;;;:::o;1440:31::-;;;;:::o;10694:783::-;1744:1:17;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2357:8:16::1;:6;:8::i;:::-;2356:9;2348:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;11261:13:::2;;;;;;;;;;;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11231:13;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;11223:65;;;::::0;::::2;;11320:4;11306:18;;:10;;;;;;;;;;;:18;;;11298:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;11375:10;;11362:9;:23;;11354:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;11415:13;;;;;;;;;;;:18;;;11434:10;11415:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11455:13;;:15;;;;;;;;;:::i;:::-;;;;;;1701:1:17::0;2628:7;:22;;;;10694:783:16:o;694:36::-;;;;:::o;2001:34::-;;;;;;;;;;;;;:::o;1382:30::-;;;;:::o;7498:815::-;7558:22;7594:29;7637:27;7678:28;7720:23;7757:20;7791:13;7818:19;7851:17;7882:19;7915:24;7997:13;;8024:20;;8058:18;;8090:19;;8123:17;;;;;;;;;;;8154:14;;;;;;;;;;;8182:7;;;;;;;;;;;8203:10;;8227:8;;8249:10;;8273:15;;7976:326;;;;;;;;;;;;;;;;;;;;;;7498:815;;;;;;;;;;;:::o;4138:148::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4255:24:16::1;4232:20;:47;;;;4138:148:::0;:::o;4021:111::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4088:13:16::1;;;;;;;;;;;:23;;;4112:12;4088:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4021:111:::0;:::o;14362:167::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14446:5:16::1;14428:23;;:14;;;;;;;;;;;:23;;;14420:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;14508:14;;;;;;;;;;;14507:15;14490:14;;:32;;;;;;;;;;;;;;;;;;14362:167::o:0;601:31::-;;;;:::o;1911:198:13:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;::::0;1991:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;5588:153:16:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5677:9:16::1;5666:8;:20;;;;5701:33;5724:9;5701:33;;;;;;:::i;:::-;;;;;;;;5588:153:::0;:::o;3379:120::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3475:17:16::1;3459:13;:33;;;;3379:120:::0;:::o;1313:36::-;;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;2426:117:14:-;1479:16;:14;:16::i;:::-;2494:5:::1;2484:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;2514:22;2523:12;:10;:12::i;:::-;2514:22;;;;;;:::i;:::-;;;;;;;;2426:117::o:0;2263:187:13:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;15115:205:16:-;15202:4;15223:12;15241:2;:7;;15256:5;15268:6;15241:48;15286:1;15276:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15241:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15222:67;;;15306:7;15299:14;;;15115:205;;;;:::o;2179:115:14:-;1232:19;:17;:19::i;:::-;2248:4:::1;2238:7;::::0;:14:::1;;;;;;;;;;;;;;;;;;2267:20;2274:12;:10;:12::i;:::-;2267:20;;;;;;:::i;:::-;;;;;;;;2179:115::o:0;1938:106::-;2004:8;:6;:8::i;:::-;1996:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1938:106::o;1760:::-;1830:8;:6;:8::i;:::-;1829:9;1821:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1760:106::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:22:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:104::-;1221:7;1250:24;1268:5;1250:24;:::i;:::-;1239:35;;1176:104;;;:::o;1286:142::-;1389:32;1415:5;1389:32;:::i;:::-;1384:3;1377:45;1286:142;;:::o;1434:77::-;1471:7;1500:5;1489:16;;1434:77;;;:::o;1517:118::-;1604:24;1622:5;1604:24;:::i;:::-;1599:3;1592:37;1517:118;;:::o;1641:90::-;1675:7;1718:5;1711:13;1704:21;1693:32;;1641:90;;;:::o;1737:109::-;1818:21;1833:5;1818:21;:::i;:::-;1813:3;1806:34;1737:109;;:::o;1852:882::-;2111:4;2149:3;2138:9;2134:19;2126:27;;2163:87;2247:1;2236:9;2232:17;2223:6;2163:87;:::i;:::-;2260:72;2328:2;2317:9;2313:18;2304:6;2260:72;:::i;:::-;2342:66;2404:2;2393:9;2389:18;2380:6;2342:66;:::i;:::-;2418:72;2486:2;2475:9;2471:18;2462:6;2418:72;:::i;:::-;2500:67;2562:3;2551:9;2547:19;2538:6;2500:67;:::i;:::-;2577;2639:3;2628:9;2624:19;2615:6;2577:67;:::i;:::-;2654:73;2722:3;2711:9;2707:19;2698:6;2654:73;:::i;:::-;1852:882;;;;;;;;;;:::o;2740:222::-;2833:4;2871:2;2860:9;2856:18;2848:26;;2884:71;2952:1;2941:9;2937:17;2928:6;2884:71;:::i;:::-;2740:222;;;;:::o;2968:122::-;3041:24;3059:5;3041:24;:::i;:::-;3034:5;3031:35;3021:63;;3080:1;3077;3070:12;3021:63;2968:122;:::o;3096:139::-;3142:5;3180:6;3167:20;3158:29;;3196:33;3223:5;3196:33;:::i;:::-;3096:139;;;;:::o;3241:474::-;3309:6;3317;3366:2;3354:9;3345:7;3341:23;3337:32;3334:119;;;3372:79;;:::i;:::-;3334:119;3492:1;3517:53;3562:7;3553:6;3542:9;3538:22;3517:53;:::i;:::-;3507:63;;3463:117;3619:2;3645:53;3690:7;3681:6;3670:9;3666:22;3645:53;:::i;:::-;3635:63;;3590:118;3241:474;;;;;:::o;3721:117::-;3830:1;3827;3820:12;3844:102;3885:6;3936:2;3932:7;3927:2;3920:5;3916:14;3912:28;3902:38;;3844:102;;;:::o;3952:180::-;4000:77;3997:1;3990:88;4097:4;4094:1;4087:15;4121:4;4118:1;4111:15;4138:281;4221:27;4243:4;4221:27;:::i;:::-;4213:6;4209:40;4351:6;4339:10;4336:22;4315:18;4303:10;4300:34;4297:62;4294:88;;;4362:18;;:::i;:::-;4294:88;4402:10;4398:2;4391:22;4181:238;4138:281;;:::o;4425:129::-;4459:6;4486:20;;:::i;:::-;4476:30;;4515:33;4543:4;4535:6;4515:33;:::i;:::-;4425:129;;;:::o;4560:311::-;4637:4;4727:18;4719:6;4716:30;4713:56;;;4749:18;;:::i;:::-;4713:56;4799:4;4791:6;4787:17;4779:25;;4859:4;4853;4849:15;4841:23;;4560:311;;;:::o;4877:117::-;4986:1;4983;4976:12;5017:710;5113:5;5138:81;5154:64;5211:6;5154:64;:::i;:::-;5138:81;:::i;:::-;5129:90;;5239:5;5268:6;5261:5;5254:21;5302:4;5295:5;5291:16;5284:23;;5355:4;5347:6;5343:17;5335:6;5331:30;5384:3;5376:6;5373:15;5370:122;;;5403:79;;:::i;:::-;5370:122;5518:6;5501:220;5535:6;5530:3;5527:15;5501:220;;;5610:3;5639:37;5672:3;5660:10;5639:37;:::i;:::-;5634:3;5627:50;5706:4;5701:3;5697:14;5690:21;;5577:144;5561:4;5556:3;5552:14;5545:21;;5501:220;;;5505:21;5119:608;;5017:710;;;;;:::o;5750:370::-;5821:5;5870:3;5863:4;5855:6;5851:17;5847:27;5837:122;;5878:79;;:::i;:::-;5837:122;5995:6;5982:20;6020:94;6110:3;6102:6;6095:4;6087:6;6083:17;6020:94;:::i;:::-;6011:103;;5827:293;5750:370;;;;:::o;6126:311::-;6203:4;6293:18;6285:6;6282:30;6279:56;;;6315:18;;:::i;:::-;6279:56;6365:4;6357:6;6353:17;6345:25;;6425:4;6419;6415:15;6407:23;;6126:311;;;:::o;6460:710::-;6556:5;6581:81;6597:64;6654:6;6597:64;:::i;:::-;6581:81;:::i;:::-;6572:90;;6682:5;6711:6;6704:5;6697:21;6745:4;6738:5;6734:16;6727:23;;6798:4;6790:6;6786:17;6778:6;6774:30;6827:3;6819:6;6816:15;6813:122;;;6846:79;;:::i;:::-;6813:122;6961:6;6944:220;6978:6;6973:3;6970:15;6944:220;;;7053:3;7082:37;7115:3;7103:10;7082:37;:::i;:::-;7077:3;7070:50;7149:4;7144:3;7140:14;7133:21;;7020:144;7004:4;6999:3;6995:14;6988:21;;6944:220;;;6948:21;6562:608;;6460:710;;;;;:::o;7193:370::-;7264:5;7313:3;7306:4;7298:6;7294:17;7290:27;7280:122;;7321:79;;:::i;:::-;7280:122;7438:6;7425:20;7463:94;7553:3;7545:6;7538:4;7530:6;7526:17;7463:94;:::i;:::-;7454:103;;7270:293;7193:370;;;;:::o;7569:894::-;7687:6;7695;7744:2;7732:9;7723:7;7719:23;7715:32;7712:119;;;7750:79;;:::i;:::-;7712:119;7898:1;7887:9;7883:17;7870:31;7928:18;7920:6;7917:30;7914:117;;;7950:79;;:::i;:::-;7914:117;8055:78;8125:7;8116:6;8105:9;8101:22;8055:78;:::i;:::-;8045:88;;7841:302;8210:2;8199:9;8195:18;8182:32;8241:18;8233:6;8230:30;8227:117;;;8263:79;;:::i;:::-;8227:117;8368:78;8438:7;8429:6;8418:9;8414:22;8368:78;:::i;:::-;8358:88;;8153:303;7569:894;;;;;:::o;8469:210::-;8556:4;8594:2;8583:9;8579:18;8571:26;;8607:65;8669:1;8658:9;8654:17;8645:6;8607:65;:::i;:::-;8469:210;;;;:::o;8685:973::-;8962:4;9000:3;8989:9;8985:19;8977:27;;9014:71;9082:1;9071:9;9067:17;9058:6;9014:71;:::i;:::-;9095:72;9163:2;9152:9;9148:18;9139:6;9095:72;:::i;:::-;9177;9245:2;9234:9;9230:18;9221:6;9177:72;:::i;:::-;9259;9327:2;9316:9;9312:18;9303:6;9259:72;:::i;:::-;9341:67;9403:3;9392:9;9388:19;9379:6;9341:67;:::i;:::-;9418;9480:3;9469:9;9465:19;9456:6;9418:67;:::i;:::-;9495:73;9563:3;9552:9;9548:19;9539:6;9495:73;:::i;:::-;9578;9646:3;9635:9;9631:19;9622:6;9578:73;:::i;:::-;8685:973;;;;;;;;;;;:::o;9664:60::-;9692:3;9713:5;9706:12;;9664:60;;;:::o;9730:142::-;9780:9;9813:53;9831:34;9840:24;9858:5;9840:24;:::i;:::-;9831:34;:::i;:::-;9813:53;:::i;:::-;9800:66;;9730:142;;;:::o;9878:126::-;9928:9;9961:37;9992:5;9961:37;:::i;:::-;9948:50;;9878:126;;;:::o;10010:148::-;10082:9;10115:37;10146:5;10115:37;:::i;:::-;10102:50;;10010:148;;;:::o;10164:175::-;10273:59;10326:5;10273:59;:::i;:::-;10268:3;10261:72;10164:175;;:::o;10345:266::-;10460:4;10498:2;10487:9;10483:18;10475:26;;10511:93;10601:1;10590:9;10586:17;10577:6;10511:93;:::i;:::-;10345:266;;;;:::o;10617:138::-;10698:32;10724:5;10698:32;:::i;:::-;10691:5;10688:43;10678:71;;10745:1;10742;10735:12;10678:71;10617:138;:::o;10761:155::-;10815:5;10853:6;10840:20;10831:29;;10869:41;10904:5;10869:41;:::i;:::-;10761:155;;;;:::o;10922:345::-;10989:6;11038:2;11026:9;11017:7;11013:23;11009:32;11006:119;;;11044:79;;:::i;:::-;11006:119;11164:1;11189:61;11242:7;11233:6;11222:9;11218:22;11189:61;:::i;:::-;11179:71;;11135:125;10922:345;;;;:::o;11273:329::-;11332:6;11381:2;11369:9;11360:7;11356:23;11352:32;11349:119;;;11387:79;;:::i;:::-;11349:119;11507:1;11532:53;11577:7;11568:6;11557:9;11553:22;11532:53;:::i;:::-;11522:63;;11478:117;11273:329;;;;:::o;11608:118::-;11667:7;11696:24;11714:5;11696:24;:::i;:::-;11685:35;;11608:118;;;:::o;11732:166::-;11827:46;11867:5;11827:46;:::i;:::-;11820:5;11817:57;11807:85;;11888:1;11885;11878:12;11807:85;11732:166;:::o;11904:183::-;11972:5;12010:6;11997:20;11988:29;;12026:55;12075:5;12026:55;:::i;:::-;11904:183;;;;:::o;12093:373::-;12174:6;12223:2;12211:9;12202:7;12198:23;12194:32;12191:119;;;12229:79;;:::i;:::-;12191:119;12349:1;12374:75;12441:7;12432:6;12421:9;12417:22;12374:75;:::i;:::-;12364:85;;12320:139;12093:373;;;;:::o;12472:539::-;12556:6;12605:2;12593:9;12584:7;12580:23;12576:32;12573:119;;;12611:79;;:::i;:::-;12573:119;12759:1;12748:9;12744:17;12731:31;12789:18;12781:6;12778:30;12775:117;;;12811:79;;:::i;:::-;12775:117;12916:78;12986:7;12977:6;12966:9;12962:22;12916:78;:::i;:::-;12906:88;;12702:302;12472:539;;;;:::o;13017:118::-;13104:24;13122:5;13104:24;:::i;:::-;13099:3;13092:37;13017:118;;:::o;13141:222::-;13234:4;13272:2;13261:9;13257:18;13249:26;;13285:71;13353:1;13342:9;13338:17;13329:6;13285:71;:::i;:::-;13141:222;;;;:::o;13369:474::-;13437:6;13445;13494:2;13482:9;13473:7;13469:23;13465:32;13462:119;;;13500:79;;:::i;:::-;13462:119;13620:1;13645:53;13690:7;13681:6;13670:9;13666:22;13645:53;:::i;:::-;13635:63;;13591:117;13747:2;13773:53;13818:7;13809:6;13798:9;13794:22;13773:53;:::i;:::-;13763:63;;13718:118;13369:474;;;;;:::o;13849:254::-;13958:4;13996:2;13985:9;13981:18;13973:26;;14009:87;14093:1;14082:9;14078:17;14069:6;14009:87;:::i;:::-;13849:254;;;;:::o;14109:1296::-;14465:4;14503:3;14492:9;14488:19;14480:27;;14517:71;14585:1;14574:9;14570:17;14561:6;14517:71;:::i;:::-;14598:72;14666:2;14655:9;14651:18;14642:6;14598:72;:::i;:::-;14680;14748:2;14737:9;14733:18;14724:6;14680:72;:::i;:::-;14762;14830:2;14819:9;14815:18;14806:6;14762:72;:::i;:::-;14844:67;14906:3;14895:9;14891:19;14882:6;14844:67;:::i;:::-;14921;14983:3;14972:9;14968:19;14959:6;14921:67;:::i;:::-;14998;15060:3;15049:9;15045:19;15036:6;14998:67;:::i;:::-;15075:73;15143:3;15132:9;15128:19;15119:6;15075:73;:::i;:::-;15158;15226:3;15215:9;15211:19;15202:6;15158:73;:::i;:::-;15241;15309:3;15298:9;15294:19;15285:6;15241:73;:::i;:::-;15324:74;15393:3;15382:9;15378:19;15368:7;15324:74;:::i;:::-;14109:1296;;;;;;;;;;;;;;:::o;15411:116::-;15481:21;15496:5;15481:21;:::i;:::-;15474:5;15471:32;15461:60;;15517:1;15514;15507:12;15461:60;15411:116;:::o;15533:133::-;15576:5;15614:6;15601:20;15592:29;;15630:30;15654:5;15630:30;:::i;:::-;15533:133;;;;:::o;15672:323::-;15728:6;15777:2;15765:9;15756:7;15752:23;15748:32;15745:119;;;15783:79;;:::i;:::-;15745:119;15903:1;15928:50;15970:7;15961:6;15950:9;15946:22;15928:50;:::i;:::-;15918:60;;15874:114;15672:323;;;;:::o;16001:169::-;16085:11;16119:6;16114:3;16107:19;16159:4;16154:3;16150:14;16135:29;;16001:169;;;;:::o;16176:182::-;16316:34;16312:1;16304:6;16300:14;16293:58;16176:182;:::o;16364:366::-;16506:3;16527:67;16591:2;16586:3;16527:67;:::i;:::-;16520:74;;16603:93;16692:3;16603:93;:::i;:::-;16721:2;16716:3;16712:12;16705:19;;16364:366;;;:::o;16736:419::-;16902:4;16940:2;16929:9;16925:18;16917:26;;16989:9;16983:4;16979:20;16975:1;16964:9;16960:17;16953:47;17017:131;17143:4;17017:131;:::i;:::-;17009:139;;16736:419;;;:::o;17161:180::-;17209:77;17206:1;17199:88;17306:4;17303:1;17296:15;17330:4;17327:1;17320:15;17347:191;17387:3;17406:20;17424:1;17406:20;:::i;:::-;17401:25;;17440:20;17458:1;17440:20;:::i;:::-;17435:25;;17483:1;17480;17476:9;17469:16;;17504:3;17501:1;17498:10;17495:36;;;17511:18;;:::i;:::-;17495:36;17347:191;;;;:::o;17544:171::-;17684:23;17680:1;17672:6;17668:14;17661:47;17544:171;:::o;17721:366::-;17863:3;17884:67;17948:2;17943:3;17884:67;:::i;:::-;17877:74;;17960:93;18049:3;17960:93;:::i;:::-;18078:2;18073:3;18069:12;18062:19;;17721:366;;;:::o;18093:419::-;18259:4;18297:2;18286:9;18282:18;18274:26;;18346:9;18340:4;18336:20;18332:1;18321:9;18317:17;18310:47;18374:131;18500:4;18374:131;:::i;:::-;18366:139;;18093:419;;;:::o;18518:173::-;18658:25;18654:1;18646:6;18642:14;18635:49;18518:173;:::o;18697:366::-;18839:3;18860:67;18924:2;18919:3;18860:67;:::i;:::-;18853:74;;18936:93;19025:3;18936:93;:::i;:::-;19054:2;19049:3;19045:12;19038:19;;18697:366;;;:::o;19069:419::-;19235:4;19273:2;19262:9;19258:18;19250:26;;19322:9;19316:4;19312:20;19308:1;19297:9;19293:17;19286:47;19350:131;19476:4;19350:131;:::i;:::-;19342:139;;19069:419;;;:::o;19494:180::-;19542:77;19539:1;19532:88;19639:4;19636:1;19629:15;19663:4;19660:1;19653:15;19680:233;19719:3;19742:24;19760:5;19742:24;:::i;:::-;19733:33;;19788:66;19781:5;19778:77;19775:103;;19858:18;;:::i;:::-;19775:103;19905:1;19898:5;19894:13;19887:20;;19680:233;;;:::o;19919:143::-;19976:5;20007:6;20001:13;19992:22;;20023:33;20050:5;20023:33;:::i;:::-;19919:143;;;;:::o;20068:351::-;20138:6;20187:2;20175:9;20166:7;20162:23;20158:32;20155:119;;;20193:79;;:::i;:::-;20155:119;20313:1;20338:64;20394:7;20385:6;20374:9;20370:22;20338:64;:::i;:::-;20328:74;;20284:128;20068:351;;;;:::o;20425:147::-;20526:11;20563:3;20548:18;;20425:147;;;;:::o;20578:114::-;;:::o;20698:398::-;20857:3;20878:83;20959:1;20954:3;20878:83;:::i;:::-;20871:90;;20970:93;21059:3;20970:93;:::i;:::-;21088:1;21083:3;21079:11;21072:18;;20698:398;;;:::o;21102:379::-;21286:3;21308:147;21451:3;21308:147;:::i;:::-;21301:154;;21472:3;21465:10;;21102:379;;;:::o;21487:174::-;21627:26;21623:1;21615:6;21611:14;21604:50;21487:174;:::o;21667:366::-;21809:3;21830:67;21894:2;21889:3;21830:67;:::i;:::-;21823:74;;21906:93;21995:3;21906:93;:::i;:::-;22024:2;22019:3;22015:12;22008:19;;21667:366;;;:::o;22039:419::-;22205:4;22243:2;22232:9;22228:18;22220:26;;22292:9;22286:4;22282:20;22278:1;22267:9;22263:17;22256:47;22320:131;22446:4;22320:131;:::i;:::-;22312:139;;22039:419;;;:::o;22464:174::-;22604:26;22600:1;22592:6;22588:14;22581:50;22464:174;:::o;22644:366::-;22786:3;22807:67;22871:2;22866:3;22807:67;:::i;:::-;22800:74;;22883:93;22972:3;22883:93;:::i;:::-;23001:2;22996:3;22992:12;22985:19;;22644:366;;;:::o;23016:419::-;23182:4;23220:2;23209:9;23205:18;23197:26;;23269:9;23263:4;23259:20;23255:1;23244:9;23240:17;23233:47;23297:131;23423:4;23297:131;:::i;:::-;23289:139;;23016:419;;;:::o;23441:169::-;23581:21;23577:1;23569:6;23565:14;23558:45;23441:169;:::o;23616:366::-;23758:3;23779:67;23843:2;23838:3;23779:67;:::i;:::-;23772:74;;23855:93;23944:3;23855:93;:::i;:::-;23973:2;23968:3;23964:12;23957:19;;23616:366;;;:::o;23988:419::-;24154:4;24192:2;24181:9;24177:18;24169:26;;24241:9;24235:4;24231:20;24227:1;24216:9;24212:17;24205:47;24269:131;24395:4;24269:131;:::i;:::-;24261:139;;23988:419;;;:::o;24413:166::-;24553:18;24549:1;24541:6;24537:14;24530:42;24413:166;:::o;24585:366::-;24727:3;24748:67;24812:2;24807:3;24748:67;:::i;:::-;24741:74;;24824:93;24913:3;24824:93;:::i;:::-;24942:2;24937:3;24933:12;24926:19;;24585:366;;;:::o;24957:419::-;25123:4;25161:2;25150:9;25146:18;25138:26;;25210:9;25204:4;25200:20;25196:1;25185:9;25181:17;25174:47;25238:131;25364:4;25238:131;:::i;:::-;25230:139;;24957:419;;;:::o;25382:174::-;25522:26;25518:1;25510:6;25506:14;25499:50;25382:174;:::o;25562:366::-;25704:3;25725:67;25789:2;25784:3;25725:67;:::i;:::-;25718:74;;25801:93;25890:3;25801:93;:::i;:::-;25919:2;25914:3;25910:12;25903:19;;25562:366;;;:::o;25934:419::-;26100:4;26138:2;26127:9;26123:18;26115:26;;26187:9;26181:4;26177:20;26173:1;26162:9;26158:17;26151:47;26215:131;26341:4;26215:131;:::i;:::-;26207:139;;25934:419;;;:::o;26359:171::-;26398:3;26421:24;26439:5;26421:24;:::i;:::-;26412:33;;26467:4;26460:5;26457:15;26454:41;;26475:18;;:::i;:::-;26454:41;26522:1;26515:5;26511:13;26504:20;;26359:171;;;:::o;26536:194::-;26576:4;26596:20;26614:1;26596:20;:::i;:::-;26591:25;;26630:20;26648:1;26630:20;:::i;:::-;26625:25;;26674:1;26671;26667:9;26659:17;;26698:1;26692:4;26689:11;26686:37;;;26703:18;;:::i;:::-;26686:37;26536:194;;;;:::o;26736:172::-;26876:24;26872:1;26864:6;26860:14;26853:48;26736:172;:::o;26914:366::-;27056:3;27077:67;27141:2;27136:3;27077:67;:::i;:::-;27070:74;;27153:93;27242:3;27153:93;:::i;:::-;27271:2;27266:3;27262:12;27255:19;;26914:366;;;:::o;27286:419::-;27452:4;27490:2;27479:9;27475:18;27467:26;;27539:9;27533:4;27529:20;27525:1;27514:9;27510:17;27503:47;27567:131;27693:4;27567:131;:::i;:::-;27559:139;;27286:419;;;:::o;27711:177::-;27851:29;27847:1;27839:6;27835:14;27828:53;27711:177;:::o;27894:366::-;28036:3;28057:67;28121:2;28116:3;28057:67;:::i;:::-;28050:74;;28133:93;28222:3;28133:93;:::i;:::-;28251:2;28246:3;28242:12;28235:19;;27894:366;;;:::o;28266:419::-;28432:4;28470:2;28459:9;28455:18;28447:26;;28519:9;28513:4;28509:20;28505:1;28494:9;28490:17;28483:47;28547:131;28673:4;28547:131;:::i;:::-;28539:139;;28266:419;;;:::o;28691:181::-;28831:33;28827:1;28819:6;28815:14;28808:57;28691:181;:::o;28878:366::-;29020:3;29041:67;29105:2;29100:3;29041:67;:::i;:::-;29034:74;;29117:93;29206:3;29117:93;:::i;:::-;29235:2;29230:3;29226:12;29219:19;;28878:366;;;:::o;29250:419::-;29416:4;29454:2;29443:9;29439:18;29431:26;;29503:9;29497:4;29493:20;29489:1;29478:9;29474:17;29467:47;29531:131;29657:4;29531:131;:::i;:::-;29523:139;;29250:419;;;:::o;29675:170::-;29815:22;29811:1;29803:6;29799:14;29792:46;29675:170;:::o;29851:366::-;29993:3;30014:67;30078:2;30073:3;30014:67;:::i;:::-;30007:74;;30090:93;30179:3;30090:93;:::i;:::-;30208:2;30203:3;30199:12;30192:19;;29851:366;;;:::o;30223:419::-;30389:4;30427:2;30416:9;30412:18;30404:26;;30476:9;30470:4;30466:20;30462:1;30451:9;30447:17;30440:47;30504:131;30630:4;30504:131;:::i;:::-;30496:139;;30223:419;;;:::o;30648:173::-;30788:25;30784:1;30776:6;30772:14;30765:49;30648:173;:::o;30827:366::-;30969:3;30990:67;31054:2;31049:3;30990:67;:::i;:::-;30983:74;;31066:93;31155:3;31066:93;:::i;:::-;31184:2;31179:3;31175:12;31168:19;;30827:366;;;:::o;31199:419::-;31365:4;31403:2;31392:9;31388:18;31380:26;;31452:9;31446:4;31442:20;31438:1;31427:9;31423:17;31416:47;31480:131;31606:4;31480:131;:::i;:::-;31472:139;;31199:419;;;:::o;31624:169::-;31764:21;31760:1;31752:6;31748:14;31741:45;31624:169;:::o;31799:366::-;31941:3;31962:67;32026:2;32021:3;31962:67;:::i;:::-;31955:74;;32038:93;32127:3;32038:93;:::i;:::-;32156:2;32151:3;32147:12;32140:19;;31799:366;;;:::o;32171:419::-;32337:4;32375:2;32364:9;32360:18;32352:26;;32424:9;32418:4;32414:20;32410:1;32399:9;32395:17;32388:47;32452:131;32578:4;32452:131;:::i;:::-;32444:139;;32171:419;;;:::o;32596:232::-;32736:34;32732:1;32724:6;32720:14;32713:58;32805:15;32800:2;32792:6;32788:15;32781:40;32596:232;:::o;32834:366::-;32976:3;32997:67;33061:2;33056:3;32997:67;:::i;:::-;32990:74;;33073:93;33162:3;33073:93;:::i;:::-;33191:2;33186:3;33182:12;33175:19;;32834:366;;;:::o;33206:419::-;33372:4;33410:2;33399:9;33395:18;33387:26;;33459:9;33453:4;33449:20;33445:1;33434:9;33430:17;33423:47;33487:131;33613:4;33487:131;:::i;:::-;33479:139;;33206:419;;;:::o;33631:430::-;33774:4;33812:2;33801:9;33797:18;33789:26;;33825:71;33893:1;33882:9;33878:17;33869:6;33825:71;:::i;:::-;33906:72;33974:2;33963:9;33959:18;33950:6;33906:72;:::i;:::-;33988:66;34050:2;34039:9;34035:18;34026:6;33988:66;:::i;:::-;33631:430;;;;;;:::o;34067:171::-;34207:23;34203:1;34195:6;34191:14;34184:47;34067:171;:::o;34244:366::-;34386:3;34407:67;34471:2;34466:3;34407:67;:::i;:::-;34400:74;;34483:93;34572:3;34483:93;:::i;:::-;34601:2;34596:3;34592:12;34585:19;;34244:366;;;:::o;34616:419::-;34782:4;34820:2;34809:9;34805:18;34797:26;;34869:9;34863:4;34859:20;34855:1;34844:9;34840:17;34833:47;34897:131;35023:4;34897:131;:::i;:::-;34889:139;;34616:419;;;:::o;35041:173::-;35181:25;35177:1;35169:6;35165:14;35158:49;35041:173;:::o;35220:366::-;35362:3;35383:67;35447:2;35442:3;35383:67;:::i;:::-;35376:74;;35459:93;35548:3;35459:93;:::i;:::-;35577:2;35572:3;35568:12;35561:19;;35220:366;;;:::o;35592:419::-;35758:4;35796:2;35785:9;35781:18;35773:26;;35845:9;35839:4;35835:20;35831:1;35820:9;35816:17;35809:47;35873:131;35999:4;35873:131;:::i;:::-;35865:139;;35592:419;;;:::o;36017:225::-;36157:34;36153:1;36145:6;36141:14;36134:58;36226:8;36221:2;36213:6;36209:15;36202:33;36017:225;:::o;36248:366::-;36390:3;36411:67;36475:2;36470:3;36411:67;:::i;:::-;36404:74;;36487:93;36576:3;36487:93;:::i;:::-;36605:2;36600:3;36596:12;36589:19;;36248:366;;;:::o;36620:419::-;36786:4;36824:2;36813:9;36809:18;36801:26;;36873:9;36867:4;36863:20;36859:1;36848:9;36844:17;36837:47;36901:131;37027:4;36901:131;:::i;:::-;36893:139;;36620:419;;;:::o;37045:181::-;37185:33;37181:1;37173:6;37169:14;37162:57;37045:181;:::o;37232:366::-;37374:3;37395:67;37459:2;37454:3;37395:67;:::i;:::-;37388:74;;37471:93;37560:3;37471:93;:::i;:::-;37589:2;37584:3;37580:12;37573:19;;37232:366;;;:::o;37604:419::-;37770:4;37808:2;37797:9;37793:18;37785:26;;37857:9;37851:4;37847:20;37843:1;37832:9;37828:17;37821:47;37885:131;38011:4;37885:131;:::i;:::-;37877:139;;37604:419;;;:::o;38029:173::-;38169:25;38165:1;38157:6;38153:14;38146:49;38029:173;:::o;38208:366::-;38350:3;38371:67;38435:2;38430:3;38371:67;:::i;:::-;38364:74;;38447:93;38536:3;38447:93;:::i;:::-;38565:2;38560:3;38556:12;38549:19;;38208:366;;;:::o;38580:419::-;38746:4;38784:2;38773:9;38769:18;38761:26;;38833:9;38827:4;38823:20;38819:1;38808:9;38804:17;38797:47;38861:131;38987:4;38861:131;:::i;:::-;38853:139;;38580:419;;;:::o;39005:175::-;39145:27;39141:1;39133:6;39129:14;39122:51;39005:175;:::o;39186:366::-;39328:3;39349:67;39413:2;39408:3;39349:67;:::i;:::-;39342:74;;39425:93;39514:3;39425:93;:::i;:::-;39543:2;39538:3;39534:12;39527:19;;39186:366;;;:::o;39558:419::-;39724:4;39762:2;39751:9;39747:18;39739:26;;39811:9;39805:4;39801:20;39797:1;39786:9;39782:17;39775:47;39839:131;39965:4;39839:131;:::i;:::-;39831:139;;39558:419;;;:::o;39983:165::-;40123:17;40119:1;40111:6;40107:14;40100:41;39983:165;:::o;40154:366::-;40296:3;40317:67;40381:2;40376:3;40317:67;:::i;:::-;40310:74;;40393:93;40482:3;40393:93;:::i;:::-;40511:2;40506:3;40502:12;40495:19;;40154:366;;;:::o;40526:419::-;40692:4;40730:2;40719:9;40715:18;40707:26;;40779:9;40773:4;40769:20;40765:1;40754:9;40750:17;40743:47;40807:131;40933:4;40807:131;:::i;:::-;40799:139;;40526:419;;;:::o;40951:165::-;41091:17;41087:1;41079:6;41075:14;41068:41;40951:165;:::o;41122:366::-;41264:3;41285:67;41349:2;41344:3;41285:67;:::i;:::-;41278:74;;41361:93;41450:3;41361:93;:::i;:::-;41479:2;41474:3;41470:12;41463:19;;41122:366;;;:::o;41494:419::-;41660:4;41698:2;41687:9;41683:18;41675:26;;41747:9;41741:4;41737:20;41733:1;41722:9;41718:17;41711:47;41775:131;41901:4;41775:131;:::i;:::-;41767:139;;41494:419;;;:::o;41919:225::-;42059:34;42055:1;42047:6;42043:14;42036:58;42128:8;42123:2;42115:6;42111:15;42104:33;41919:225;:::o;42150:366::-;42292:3;42313:67;42377:2;42372:3;42313:67;:::i;:::-;42306:74;;42389:93;42478:3;42389:93;:::i;:::-;42507:2;42502:3;42498:12;42491:19;;42150:366;;;:::o;42522:419::-;42688:4;42726:2;42715:9;42711:18;42703:26;;42775:9;42769:4;42765:20;42761:1;42750:9;42746:17;42739:47;42803:131;42929:4;42803:131;:::i;:::-;42795:139;;42522:419;;;:::o;42947:98::-;42998:6;43032:5;43026:12;43016:22;;42947:98;;;:::o;43051:246::-;43132:1;43142:113;43156:6;43153:1;43150:13;43142:113;;;43241:1;43236:3;43232:11;43226:18;43222:1;43217:3;43213:11;43206:39;43178:2;43175:1;43171:10;43166:15;;43142:113;;;43289:1;43280:6;43275:3;43271:16;43264:27;43113:184;43051:246;;;:::o;43303:386::-;43407:3;43435:38;43467:5;43435:38;:::i;:::-;43489:88;43570:6;43565:3;43489:88;:::i;:::-;43482:95;;43586:65;43644:6;43639:3;43632:4;43625:5;43621:16;43586:65;:::i;:::-;43676:6;43671:3;43667:16;43660:23;;43411:278;43303:386;;;;:::o;43695:271::-;43825:3;43847:93;43936:3;43927:6;43847:93;:::i;:::-;43840:100;;43957:3;43950:10;;43695:271;;;;:::o;43972:170::-;44112:22;44108:1;44100:6;44096:14;44089:46;43972:170;:::o;44148:366::-;44290:3;44311:67;44375:2;44370:3;44311:67;:::i;:::-;44304:74;;44387:93;44476:3;44387:93;:::i;:::-;44505:2;44500:3;44496:12;44489:19;;44148:366;;;:::o;44520:419::-;44686:4;44724:2;44713:9;44709:18;44701:26;;44773:9;44767:4;44763:20;44759:1;44748:9;44744:17;44737:47;44801:131;44927:4;44801:131;:::i;:::-;44793:139;;44520:419;;;:::o;44945:166::-;45085:18;45081:1;45073:6;45069:14;45062:42;44945:166;:::o;45117:366::-;45259:3;45280:67;45344:2;45339:3;45280:67;:::i;:::-;45273:74;;45356:93;45445:3;45356:93;:::i;:::-;45474:2;45469:3;45465:12;45458:19;;45117:366;;;:::o;45489:419::-;45655:4;45693:2;45682:9;45678:18;45670:26;;45742:9;45736:4;45732:20;45728:1;45717:9;45713:17;45706:47;45770:131;45896:4;45770:131;:::i;:::-;45762:139;;45489:419;;;:::o
Swarm Source
ipfs://246db58d8b1a9f14b80c905cea42c959c701ca84cf619711ec34c67bc67f824d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.