More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,071 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Many Hammi... | 13855314 | 1124 days ago | IN | 0 ETH | 0.0079531 | ||||
Send Many To Gal... | 13855311 | 1124 days ago | IN | 0 ETH | 0.00860308 | ||||
Unstake Many Ham... | 13840978 | 1127 days ago | IN | 0 ETH | 0.00651167 | ||||
Send Many To Gal... | 13835039 | 1127 days ago | IN | 0 ETH | 0.02235969 | ||||
Unstake Many Ham... | 13834443 | 1128 days ago | IN | 0 ETH | 0.00767196 | ||||
Unstake Many Ham... | 13834441 | 1128 days ago | IN | 0 ETH | 0.0069254 | ||||
Unstake Many Ham... | 13834435 | 1128 days ago | IN | 0 ETH | 0.00636396 | ||||
Unstake Many Ham... | 13834423 | 1128 days ago | IN | 0 ETH | 0.00567796 | ||||
Claim Many Hammi... | 13834412 | 1128 days ago | IN | 0 ETH | 0.00392373 | ||||
Claim Many Hammi... | 13834408 | 1128 days ago | IN | 0 ETH | 0.00358655 | ||||
Send Many To Gal... | 13824926 | 1129 days ago | IN | 0 ETH | 0.01374399 | ||||
Send Many To Gal... | 13822729 | 1129 days ago | IN | 0 ETH | 0.01128629 | ||||
Send Many To Gal... | 13821721 | 1130 days ago | IN | 0 ETH | 0.01510553 | ||||
Claim Many Hammi... | 13819430 | 1130 days ago | IN | 0 ETH | 0.00707129 | ||||
Claim Many Hammi... | 13816640 | 1130 days ago | IN | 0 ETH | 0.00686395 | ||||
Claim Lost Hammi... | 13816615 | 1130 days ago | IN | 0 ETH | 0.0206595 | ||||
Send Many To Gal... | 13816016 | 1130 days ago | IN | 0 ETH | 0.01147928 | ||||
Mint Hammie For ... | 13815949 | 1130 days ago | IN | 0 ETH | 0.01269492 | ||||
Claim Many Hammi... | 13815927 | 1130 days ago | IN | 0 ETH | 0.00734115 | ||||
Claim Many Hammi... | 13811376 | 1131 days ago | IN | 0 ETH | 0.0084085 | ||||
Claim Many Hammi... | 13802059 | 1133 days ago | IN | 0 ETH | 0.00643841 | ||||
Mint Hammie For ... | 13800518 | 1133 days ago | IN | 0 ETH | 0.01978328 | ||||
Claim Many Hammi... | 13800498 | 1133 days ago | IN | 0 ETH | 0.00722185 | ||||
Mint Hammie For ... | 13797393 | 1133 days ago | IN | 0 ETH | 0.01715688 | ||||
Claim Many Hammi... | 13797382 | 1133 days ago | IN | 0 ETH | 0.0054502 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Galaxy
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// ________ ________ ___ ________ ___ ___ ___ ___ //|\ ____\|\ __ \|\ \ |\ __ \ |\ \ / /|\ \ / /| //\ \ \___|\ \ \|\ \ \ \ \ \ \|\ \ \ \ \/ / | \ \/ / / // \ \ \ __\ \ __ \ \ \ \ \ __ \ \ \ / / \ \ / / // \ \ \|\ \ \ \ \ \ \ \____\ \ \ \ \ / \/ \/ / / // \ \_______\ \__\ \__\ \_______\ \__\ \__\/ /\ \ __/ / / // \|_______|\|__|\|__|\|_______|\|__|\|__/__/ /\ __\\___/ / // |__|/ \|__\|___|/ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Ownable.sol"; import "./SafeMath.sol"; import "./IERC721Receiver.sol"; import "./Hammies.sol"; import "./Fluff.sol"; contract Galaxy is Ownable, IERC721Receiver { using SafeMath for uint256; //Establish interface for Hammies Hammies hammies; //Establish interface for $Fluff Fluff fluff; event HammieStolen(address previousOwner, address newOwner, uint256 tokenId); event HammieStaked(address owner, uint256 tokenId, uint256 status); event HammieClaimed(address owner, uint256 tokenId); /* Struct to track token info Status is as follows: 0 - Unstaked 1 - Adventurer 2 - Pirate 3 - Salvager */ struct tokenInfo { uint256 tokenId; address owner; uint256 status; uint256 timeStaked; } // maps id to token info structure mapping(uint256 => tokenInfo) public galaxy; //Amount token id to amount stolen mapping(uint256 => uint256) public fluffStolen; //Daily $Fluff earned by adventurers uint256 public adventuringFluffRate = 100 ether; //Total number of adventurers staked uint256 public totalAdventurersStaked = 0; //Percent of $Fluff earned by adventurers that is kept uint256 public adventurerShare = 50; //Percent of $Fluff earned by adventurers that is stolen by pirates uint256 public pirateShare = 50; //5% chance a pirate gets lost each time it is unstaked uint256 public chancePirateGetsLost = 5; //Store tokenIds of all pirates staked uint256[] public piratesStaked; //Store Index of pirates staked mapping(uint256 => uint256) public pirateIndices; //Store tokenIds of all salvagers staked uint256[] public salvagersStaked; //Store Index of salvagers staked mapping(uint256 => uint256) public salvagerIndices; //1 day lock on staking uint256 public minStakeTime = 1 days; bool public staking = false; //Used to map address to claimable Hammies from original Galaxy Contract mapping (address => uint256) public claimableHammies; //Used to keep track of total Hammies supply uint256 public totalSupply = 4889; constructor(){} //Claim lost Hammies from Original Contract function claimLostHammiesAndStake(uint256 _count, bool stake, uint256 status) public { uint256 numReserved = claimableHammies[msg.sender]; require(numReserved > 0, "You do not have any claimable Hammies"); require(_count <= numReserved, "You do not have that many Claimable Hammies"); claimableHammies[msg.sender] = numReserved - _count; for (uint256 i = 0; i < _count; i++) { uint256 tokenId = totalSupply + i; hammies.mintHammieForFluff(); if(stake){ galaxy[tokenId] = tokenInfo({ tokenId: tokenId, owner: msg.sender, status: status, timeStaked: block.timestamp }); if (status == 1) totalAdventurersStaked++; else if (status == 2){ piratesStaked.push(tokenId); pirateIndices[tokenId] = piratesStaked.length - 1; } else if (status == 3){ salvagersStaked.push(tokenId); salvagerIndices[tokenId] = salvagersStaked.length - 1; } } else { hammies.safeTransferFrom(address(this), msg.sender, tokenId); } } uint256 fluffOwed = _count * 100 ether; fluff.mint(msg.sender, fluffOwed); totalSupply += _count; } //Edit Claimable Hammies per person function editHammiesClaimable(address[] calldata addresses, uint256[] calldata count) external onlyOwner { for(uint256 i; i < addresses.length; i++){ claimableHammies[addresses[i]] = count[i]; } } //Mint Hammies for Fluff function mintHammieForFluff(bool stake, uint256 status) public { require(staking, "Staking is paused"); fluff.burn(msg.sender, getFluffCost(totalSupply)); hammies.mintHammieForFluff(); uint256 tokenId = totalSupply; totalSupply++; if(stake){ galaxy[tokenId] = tokenInfo({ tokenId: tokenId, owner: msg.sender, status: status, timeStaked: block.timestamp }); if (status == 1) totalAdventurersStaked++; else if (status == 2){ piratesStaked.push(tokenId); pirateIndices[tokenId] = piratesStaked.length - 1; } else if (status == 3){ salvagersStaked.push(tokenId); salvagerIndices[tokenId] = salvagersStaked.length - 1; } } else { hammies.safeTransferFrom(address(this), msg.sender, tokenId); } } function getFluffCost(uint256 supply) internal pure returns (uint256 cost){ if (supply < 5888) return 100 ether; else if (supply < 6887) return 200 ether; else if (supply < 7887) return 400 ether; else if (supply < 8887) return 800 ether; } //-----------------------------------------------------------------------------// //------------------------------Staking----------------------------------------// //-----------------------------------------------------------------------------// /*sends any number of Hammies to the galaxy ids -> list of hammie ids to stake Status == 1 -> Adventurer Status == 2 -> Pirate Status == 3 -> Salvager */ function sendManyToGalaxy(uint256[] calldata ids, uint256 status) external { for(uint256 i = 0; i < ids.length; i++){ require(hammies.ownerOf(ids[i]) == msg.sender, "Not your Hammie"); require(staking, "Staking is paused"); galaxy[ids[i]] = tokenInfo({ tokenId: ids[i], owner: msg.sender, status: status, timeStaked: block.timestamp }); emit HammieStaked(msg.sender, ids[i], status); hammies.transferFrom(msg.sender, address(this), ids[i]); if (status == 1) totalAdventurersStaked++; else if (status == 2){ piratesStaked.push(ids[i]); pirateIndices[ids[i]] = piratesStaked.length - 1; } else if (status == 3){ salvagersStaked.push(ids[i]); salvagerIndices[ids[i]] = salvagersStaked.length - 1; } } } function unstakeManyHammies(uint256[] calldata ids) external { for(uint256 i = 0; i < ids.length; i++){ tokenInfo memory token = galaxy[ids[i]]; require(token.owner == msg.sender, "Not your Hammie"); require(hammies.ownerOf(ids[i]) == address(this), "Hammie must be staked in order to claim"); require(staking, "Staking is paused"); require(block.timestamp - token.timeStaked >= minStakeTime, "1 day stake lock"); _claim(msg.sender, ids[i]); if (token.status == 1){ totalAdventurersStaked--; } else if (token.status == 2){ uint256 lastPirate = piratesStaked[piratesStaked.length - 1]; piratesStaked[pirateIndices[ids[i]]] = lastPirate; pirateIndices[lastPirate] = pirateIndices[ids[i]]; piratesStaked.pop(); } else if (token.status == 3){ uint256 lastSalvager = salvagersStaked[salvagersStaked.length - 1]; salvagersStaked[salvagerIndices[ids[i]]] = lastSalvager; salvagerIndices[lastSalvager] = salvagerIndices[ids[i]]; salvagersStaked.pop(); } emit HammieClaimed(address(this), ids[i]); //retrieve token info again to account for stolen Hammies tokenInfo memory newToken = galaxy[ids[i]]; hammies.safeTransferFrom(address(this), newToken.owner, ids[i]); galaxy[ids[i]] = tokenInfo({ tokenId: ids[i], owner: newToken.owner, status: 0, timeStaked: block.timestamp }); } } function claimManyHammies(uint256[] calldata ids) external { for(uint256 i = 0; i < ids.length; i++){ tokenInfo memory token = galaxy[ids[i]]; require(token.owner == msg.sender, "Not your hammie"); require(hammies.ownerOf(ids[i]) == address(this), "Hammie must be staked in order to claim"); require(staking, "Staking is paused"); _claim(msg.sender, ids[i]); emit HammieClaimed(address(this), ids[i]); //retrieve token info again to account for stolen Hammies tokenInfo memory newToken = galaxy[ids[i]]; galaxy[ids[i]] = tokenInfo({ tokenId: ids[i], owner: newToken.owner, status: newToken.status, timeStaked: block.timestamp }); } } function _claim(address owner, uint256 tokenId) internal { tokenInfo memory token = galaxy[tokenId]; if (token.status == 1){ if(piratesStaked.length > 0){ uint256 fluffGathered = getPendingFluff(tokenId); fluff.mint(owner, fluffGathered.mul(adventurerShare).div(100)); stealFluff(fluffGathered.mul(pirateShare).div(100)); } else { fluff.mint(owner, getPendingFluff(tokenId)); } } else if (token.status == 2){ uint256 roll = randomIntInRange(tokenId, 100); if(roll > chancePirateGetsLost || salvagersStaked.length == 0){ fluff.mint(owner, fluffStolen[tokenId]); fluffStolen[tokenId ]= 0; } else{ getNewOwnerForPirate(roll, tokenId); } } } //Public function to view pending $fluff earnings for Adventurers. function getFluffEarnings(uint256 id) public view returns(uint256) { return getPendingFluff(id); } //Passive earning of $Fluff, 100 $Fluff per day function getPendingFluff(uint256 id) internal view returns(uint256) { tokenInfo memory token = galaxy[id]; return (block.timestamp - token.timeStaked) * 100 ether / 1 days; } //Returns a pseudo-random integer between 0 - max function randomIntInRange(uint256 seed, uint256 max) internal view returns (uint256) { return uint256(keccak256(abi.encodePacked( tx.origin, blockhash(block.number - 1), block.timestamp, seed ))) % max; } //Return new owner of lost pirate from current salvagers function stealFluff(uint256 amount) internal{ uint256 roll = randomIntInRange(amount, piratesStaked.length); fluffStolen[piratesStaked[roll]] += amount; } //Return new owner of lost pirate from current salvagers function getNewOwnerForPirate(uint256 seed, uint256 tokenId) internal{ tokenInfo memory pirate = galaxy[tokenId]; uint256 roll = randomIntInRange(seed, salvagersStaked.length); tokenInfo memory salvager = galaxy[salvagersStaked[roll]]; emit HammieStolen(pirate.owner, salvager.owner, tokenId); galaxy[tokenId] = tokenInfo({ tokenId: tokenId, owner: salvager.owner, status: 2, timeStaked: block.timestamp }); fluff.mint(salvager.owner, fluffStolen[tokenId]); fluffStolen[tokenId] = 0; } function getTotalSalvagersStaked() public view returns (uint256) { return salvagersStaked.length; } function getTotalPiratesStaked() public view returns (uint256) { return piratesStaked.length; } //Set address for Hammies function setHammieAddress(address hammieAddr) external onlyOwner { hammies = Hammies(hammieAddr); } //Set address for $Fluff function setFluffAddress(address fluffAddr) external onlyOwner { fluff = Fluff(fluffAddr); } //Start/Stop staking function toggleStaking() public onlyOwner { staking = !staking; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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://diligence.consensys.net/posts/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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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 v4.4.0 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); 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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); 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 overriden 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 owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); 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: transfer caller is not owner nor 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: transfer caller is not owner nor 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 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 _owners[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) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @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 of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {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 a {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 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 { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// ________ ___ ___ ___ ________ ________ //|\ _____\\ \ |\ \|\ \|\ _____\\ _____\ //\ \ \__/\ \ \ \ \ \\\ \ \ \__/\ \ \__/ // \ \ __\\ \ \ \ \ \\\ \ \ __\\ \ __\ // \ \ \_| \ \ \____\ \ \\\ \ \ \_| \ \ \_| // \ \__\ \ \_______\ \_______\ \__\ \ \__\ // \|__| \|_______|\|_______|\|__| \|__| // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC20.sol"; import "./Ownable.sol"; contract Fluff is ERC20, Ownable { address public hammieAddress; address public galaxyAddress; mapping(address => bool) public allowedAddresses; constructor() ERC20("Fluff", "FLF") {} function setHammieAddress(address hammieAddr) external onlyOwner { hammieAddress = hammieAddr; } function setGalaxyAddress(address galaxyAddr) external onlyOwner { galaxyAddress = galaxyAddr; } function burn(address user, uint256 amount) external { require(msg.sender == galaxyAddress || msg.sender == hammieAddress, "Address not authorized"); _burn(user, amount); } function mint(address to, uint256 value) external { require(msg.sender == galaxyAddress || msg.sender == hammieAddress, "Address not authorized"); _mint(to, value); } }
// ___ ___ ________ _____ ______ _____ ______ ___ _______ ________ ________ _____ ______ _______ //|\ \|\ \|\ __ \|\ _ \ _ \|\ _ \ _ \|\ \|\ ___ \ |\ ____\|\ __ \|\ _ \ _ \|\ ___ \ //\ \ \\\ \ \ \|\ \ \ \\\__\ \ \ \ \\\__\ \ \ \ \ \ __/| \ \ \___|\ \ \|\ \ \ \\\__\ \ \ \ __/| // \ \ __ \ \ __ \ \ \\|__| \ \ \ \\|__| \ \ \ \ \ \_|/__ \ \ \ __\ \ __ \ \ \\|__| \ \ \ \_|/__ // \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \_|\ \ \ \ \|\ \ \ \ \ \ \ \ \ \ \ \ \_|\ \ // \ \__\ \__\ \__\ \__\ \__\ \ \__\ \__\ \ \__\ \__\ \_______\ \ \_______\ \__\ \__\ \__\ \ \__\ \_______\ // \|__|\|__|\|__|\|__|\|__| \|__|\|__| \|__|\|__|\|_______| \|_______|\|__|\|__|\|__| \|__|\|_______| // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./ERC721Enumerable.sol"; import "./Ownable.sol"; import "./SafeMath.sol"; import "./Counters.sol"; import "./Strings.sol"; import "./Fluff.sol"; import "./Galaxy.sol"; contract Hammies is ERC721Enumerable, Ownable { using SafeMath for uint256; using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private _tokenIdTracker; Fluff fluff; uint256 public maxFreeSupply = 888; uint256 public constant maxPublicSupply = 4888; uint256 public constant maxTotalSupply = 8888; uint256 public constant mintPrice = 0.06 ether; uint256 public constant maxPerTx = 10; uint256 public constant maxFreePerWallet = 10; address public constant dev1Address = 0xcd2367Fcfbd8bf8eF87C98fC53Cc2EA27437f6EE; address public constant dev2Address = 0x2E824997ACE675F5BdB0d56121Aa04B2599BDa8B; bool mintActive = false; bool public fluffMinting = false; mapping(address => uint256) public freeMintsClaimed; //Track free mints claimed per wallet string public baseTokenURI; constructor() ERC721("Hammies", "HG") {} //-----------------------------------------------------------------------------// //------------------------------Mint Logic-------------------------------------// //-----------------------------------------------------------------------------// //Resume/pause Public Sale function toggleMint() public onlyOwner { mintActive = !mintActive; } //Public Mint function mint(uint256 _count) public payable { uint256 total = _totalSupply(); require(mintActive, "Sale has not begun"); require(total + _count <= maxPublicSupply, "No hammies left"); require(_count <= maxPerTx, "10 max per tx"); require(msg.value >= price(_count), "Not enough eth sent"); for (uint256 i = 0; i < _count; i++) { _mintHammie(msg.sender); } } //Free Mint for first 888 function freeMint(uint256 _count) public { uint256 total = _totalSupply(); require(mintActive, "Public Sale is not active"); require(total + _count <= maxFreeSupply, "No more free hammies"); require(_count + freeMintsClaimed[msg.sender] <= maxFreePerWallet, "Only 10 free mints per wallet"); require(_count <= maxPerTx, "10 max per tx"); for (uint256 i = 0; i < _count; i++) { freeMintsClaimed[msg.sender]++; _mintHammie(msg.sender); } } //Public Mint until 4888 function mintHammieForFluff() public { uint256 total = _totalSupply(); require(total < maxTotalSupply, "No Hammies left"); require(fluffMinting, "Minting with $fluff has not begun"); fluff.burn(msg.sender, getFluffCost(total)); _mintHammie(msg.sender); } function getFluffCost(uint256 totalSupply) internal pure returns (uint256 cost){ if (totalSupply < 5888) return 100; else if (totalSupply < 6887) return 200; else if (totalSupply < 7887) return 400; else if (totalSupply < 8887) return 800; } //Mint Hammie function _mintHammie(address _to) private { uint id = _tokenIdTracker.current(); _tokenIdTracker.increment(); _safeMint(_to, id); } //Function to get price of minting a hammie function price(uint256 _count) public pure returns (uint256) { return mintPrice.mul(_count); } //-----------------------------------------------------------------------------// //---------------------------Admin & Internal Logic----------------------------// //-----------------------------------------------------------------------------// //Set address for $Fluff function setFluffAddress(address fluffAddr) external onlyOwner { fluff = Fluff(fluffAddr); } //Internal URI function function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } //Start/Stop minting hammies for $fluff function toggleFluffMinting() public onlyOwner { fluffMinting = !fluffMinting; } //Set URI for metadata function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } //Withdraw from contract function withdrawAll() public onlyOwner { uint256 balance = address(this).balance; uint256 dev1Share = balance.mul(50).div(100); uint256 dev2Share = balance.mul(50).div(100); require(balance > 0); _withdraw(dev1Address, dev1Share); _withdraw(dev2Address, dev2Share); } //Internal withdraw function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } //Return total supply of hammies function _totalSupply() public view returns (uint) { return _tokenIdTracker.current(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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 v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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 v4.4.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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// 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 v4.4.0 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"HammieClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"status","type":"uint256"}],"name":"HammieStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"HammieStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"adventurerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adventuringFluffRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chancePirateGetsLost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"},{"internalType":"uint256","name":"status","type":"uint256"}],"name":"claimLostHammiesAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claimManyHammies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimableHammies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"editHammiesClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fluffStolen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"galaxy","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"status","type":"uint256"},{"internalType":"uint256","name":"timeStaked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFluffEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPiratesStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSalvagersStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"stake","type":"bool"},{"internalType":"uint256","name":"status","type":"uint256"}],"name":"mintHammieForFluff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pirateIndices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pirateShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"piratesStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"salvagerIndices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"salvagersStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"status","type":"uint256"}],"name":"sendManyToGalaxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fluffAddr","type":"address"}],"name":"setFluffAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"hammieAddr","type":"address"}],"name":"setHammieAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAdventurersStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"unstakeManyHammies","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405268056bc75e2d63100000600555600060065560326007556032600855600560095562015180600e556000600f60006101000a81548160ff0219169083151502179055506113196011553480156200005a57600080fd5b506200007b6200006f6200008160201b60201c565b6200008960201b60201c565b6200014d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613e76806200015d6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806372827bf71161010f578063b177a0e0116100a2578063eafad78611610071578063eafad7861461056c578063ed0919991461058a578063f2fde38b146105a8578063f71cb607146105c4576101e5565b8063b177a0e0146104e6578063b72a476c14610516578063b7d32a7e14610534578063d01634e614610550576101e5565b80638cd31eba116100de5780638cd31eba1461045e5780638da5cb5b1461047c57806397ca74251461049a578063acd9a97a146104ca576101e5565b806372827bf7146103b0578063734cc73e146103e05780637c0bc781146103fe5780637d6c17b41461042e576101e5565b80633cb7860a1161018757806357a393611161015657806357a393611461033e5780635e30f4701461036e5780636d04107f1461038a578063715018a6146103a6576101e5565b80633cb7860a146102b65780633fce24be146102d45780634b8028d5146102f05780634cf088d914610320576101e5565b806318160ddd116101c357806318160ddd146102545780631f7678ce146102725780633682764a146102905780633b8105b3146102ac576101e5565b806301bf9948146101ea57806303fff1a514610206578063150b7a0214610224575b600080fd5b61020460048036038101906101ff91906133cb565b6105f7565b005b61020e610abf565b60405161021b9190613830565b60405180910390f35b61023e600480360381019061023991906131a8565b610acc565b60405161024b91906136f5565b60405180910390f35b61025c610ae1565b6040516102699190613830565b60405180910390f35b61027a610ae7565b6040516102879190613830565b60405180910390f35b6102aa60048036038101906102a5919061335e565b610aed565b005b6102b4610eae565b005b6102be610f56565b6040516102cb9190613830565b60405180910390f35b6102ee60048036038101906102e9919061314e565b610f5c565b005b61030a6004803603810190610305919061339e565b61101c565b6040516103179190613830565b60405180910390f35b61032861102e565b60405161033591906136da565b60405180910390f35b6103586004803603810190610353919061339e565b611041565b6040516103659190613830565b60405180910390f35b61038860048036038101906103839190613230565b611065565b005b6103a4600480360381019061039f91906132fe565b61118d565b005b6103ae61165e565b005b6103ca60048036038101906103c5919061339e565b6116e6565b6040516103d79190613830565b60405180910390f35b6103e86116fe565b6040516103f59190613830565b60405180910390f35b6104186004803603810190610413919061339e565b611704565b6040516104259190613830565b60405180910390f35b6104486004803603810190610443919061339e565b611728565b6040516104559190613830565b60405180910390f35b610466611740565b6040516104739190613830565b60405180910390f35b610484611746565b6040516104919190613628565b60405180910390f35b6104b460048036038101906104af919061339e565b61176f565b6040516104c19190613830565b60405180910390f35b6104e460048036038101906104df91906132b1565b611787565b005b61050060048036038101906104fb919061314e565b611f8b565b60405161050d9190613830565b60405180910390f35b61051e611fa3565b60405161052b9190613830565b60405180910390f35b61054e6004803603810190610549919061314e565b611fa9565b005b61056a600480360381019061056591906132b1565b612069565b005b610574612542565b6040516105819190613830565b60405180910390f35b61059261254f565b60405161059f9190613830565b60405180910390f35b6105c260048036038101906105bd919061314e565b612555565b005b6105de60048036038101906105d9919061339e565b61264d565b6040516105ee949392919061384b565b60405180910390f35b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161067e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067590613730565b60405180910390fd5b808411156106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890613770565b60405180910390fd5b83816106cd9190613982565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b848110156109f65760008160115461072b91906138a1565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3bb9796040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561079757600080fd5b505af11580156107ab573d6000803e3d6000fd5b5050505084156109505760405180608001604052808281526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200142815250600360008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030155905050600184141561088d576006600081548092919061088390613a5e565b919050555061094b565b60028414156108ed57600a8190806001815401808255809150506001900390600052602060002001600090919091909150556001600a805490506108d19190613982565b600b60008381526020019081526020016000208190555061094a565b600384141561094957600c8190806001815401808255809150506001900390600052602060002001600090919091909150556001600c805490506109319190613982565b600d6000838152602001908152602001600020819055505b5b5b6109e2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b81526004016109af93929190613643565b600060405180830381600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050505b5080806109ee90613a5e565b915050610713565b50600068056bc75e2d6310000085610a0e9190613928565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401610a6d92919061367a565b600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b505050508460116000828254610ab191906138a1565b925050819055505050505050565b6000600c80549050905090565b600063150b7a0260e01b905095945050505050565b60115481565b600e5481565b600f60009054906101000a900460ff16610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613810565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33610b8660115461269d565b6040518363ffffffff1660e01b8152600401610ba392919061367a565b600060405180830381600087803b158015610bbd57600080fd5b505af1158015610bd1573d6000803e3d6000fd5b50505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3bb9796040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c3f57600080fd5b505af1158015610c53573d6000803e3d6000fd5b505050506000601154905060116000815480929190610c7190613a5e565b91905055508215610e175760405180608001604052808281526020013373ffffffffffffffffffffffffffffffffffffffff16815260200183815260200142815250600360008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301559050506001821415610d545760066000815480929190610d4a90613a5e565b9190505550610e12565b6002821415610db457600a8190806001815401808255809150506001900390600052602060002001600090919091909150556001600a80549050610d989190613982565b600b600083815260200190815260200160002081905550610e11565b6003821415610e1057600c8190806001815401808255809150506001900390600052602060002001600090919091909150556001600c80549050610df89190613982565b600d6000838152602001908152602001600020819055505b5b5b610ea9565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401610e7693929190613643565b600060405180830381600087803b158015610e9057600080fd5b505af1158015610ea4573d6000803e3d6000fd5b505050505b505050565b610eb6612711565b73ffffffffffffffffffffffffffffffffffffffff16610ed4611746565b73ffffffffffffffffffffffffffffffffffffffff1614610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f21906137b0565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60095481565b610f64612711565b73ffffffffffffffffffffffffffffffffffffffff16610f82611746565b73ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf906137b0565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061102782612719565b9050919050565b600f60009054906101000a900460ff1681565b600a818154811061105157600080fd5b906000526020600020016000915090505481565b61106d612711565b73ffffffffffffffffffffffffffffffffffffffff1661108b611746565b73ffffffffffffffffffffffffffffffffffffffff16146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d8906137b0565b60405180910390fd5b60005b848490508110156111865782828281811061110257611101613b9d565b5b90506020020135601060008787858181106111205761111f613b9d565b5b9050602002016020810190611135919061314e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061117e90613a5e565b9150506110e4565b5050505050565b60005b83839050811015611658573373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061120357611202613b9d565b5b905060200201356040518263ffffffff1660e01b81526004016112269190613830565b60206040518083038186803b15801561123e57600080fd5b505afa158015611252573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611276919061317b565b73ffffffffffffffffffffffffffffffffffffffff16146112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c3906137d0565b60405180910390fd5b600f60009054906101000a900460ff1661131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290613810565b60405180910390fd5b604051806080016040528085858481811061133957611338613b9d565b5b9050602002013581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001838152602001428152506003600086868581811061138257611381613b9d565b5b9050602002013581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301559050507fd1870f0937c3ab4a35b1bf5546a26de2e59f3a57312387c505bacf5e0b84c7d73385858481811061143457611433613b9d565b5b905060200201358460405161144b939291906136a3565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308787868181106114a6576114a5613b9d565b5b905060200201356040518463ffffffff1660e01b81526004016114cb93929190613643565b600060405180830381600087803b1580156114e557600080fd5b505af11580156114f9573d6000803e3d6000fd5b505050506001821415611523576006600081548092919061151990613a5e565b9190505550611645565b60028214156115b557600a84848381811061154157611540613b9d565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556001600a805490506115809190613982565b600b600086868581811061159757611596613b9d565b5b90506020020135815260200190815260200160002081905550611644565b600382141561164357600c8484838181106115d3576115d2613b9d565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556001600c805490506116129190613982565b600d600086868581811061162957611628613b9d565b5b905060200201358152602001908152602001600020819055505b5b5b808061165090613a5e565b915050611190565b50505050565b611666612711565b73ffffffffffffffffffffffffffffffffffffffff16611684611746565b73ffffffffffffffffffffffffffffffffffffffff16146116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d1906137b0565b60405180910390fd5b6116e460006127ea565b565b600b6020528060005260406000206000915090505481565b60065481565b600c818154811061171457600080fd5b906000526020600020016000915090505481565b600d6020528060005260406000206000915090505481565b60085481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915090505481565b60005b82829050811015611f86576000600360008585858181106117ae576117ad613b9d565b5b905060200201358152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff16146118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad906137d0565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868681811061191e5761191d613b9d565b5b905060200201356040518263ffffffff1660e01b81526004016119419190613830565b60206040518083038186803b15801561195957600080fd5b505afa15801561196d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611991919061317b565b73ffffffffffffffffffffffffffffffffffffffff16146119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de906137f0565b60405180910390fd5b600f60009054906101000a900460ff16611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613810565b60405180910390fd5b600e54816060015142611a499190613982565b1015611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190613790565b60405180910390fd5b611aad33858585818110611aa157611aa0613b9d565b5b905060200201356128ae565b600181604001511415611ad75760066000815480929190611acd90613a34565b9190505550611cd9565b600281604001511415611bd9576000600a6001600a80549050611afa9190613982565b81548110611b0b57611b0a613b9d565b5b9060005260206000200154905080600a600b6000888888818110611b3257611b31613b9d565b5b9050602002013581526020019081526020016000205481548110611b5957611b58613b9d565b5b9060005260206000200181905550600b6000868686818110611b7e57611b7d613b9d565b5b90506020020135815260200190815260200160002054600b600083815260200190815260200160002081905550600a805480611bbd57611bbc613b6e565b5b6001900381819060005260206000200160009055905550611cd8565b600381604001511415611cd7576000600c6001600c80549050611bfc9190613982565b81548110611c0d57611c0c613b9d565b5b9060005260206000200154905080600c600d6000888888818110611c3457611c33613b9d565b5b9050602002013581526020019081526020016000205481548110611c5b57611c5a613b9d565b5b9060005260206000200181905550600d6000868686818110611c8057611c7f613b9d565b5b90506020020135815260200190815260200160002054600d600083815260200190815260200160002081905550600c805480611cbf57611cbe613b6e565b5b60019003818190600052602060002001600090559055505b5b5b7f0e652fb4f68db397855aa6666e889095f74013ca459e996fc5752cb5687a0c4630858585818110611d0e57611d0d613b9d565b5b90506020020135604051611d2392919061367a565b60405180910390a1600060036000868686818110611d4457611d43613b9d565b5b905060200201358152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815250509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e308360200151888888818110611e3157611e30613b9d565b5b905060200201356040518463ffffffff1660e01b8152600401611e5693929190613643565b600060405180830381600087803b158015611e7057600080fd5b505af1158015611e84573d6000803e3d6000fd5b505050506040518060800160405280868686818110611ea657611ea5613b9d565b5b905060200201358152602001826020015173ffffffffffffffffffffffffffffffffffffffff168152602001600081526020014281525060036000878787818110611ef457611ef3613b9d565b5b9050602002013581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015590505050508080611f7e90613a5e565b91505061178a565b505050565b60106020528060005260406000206000915090505481565b60055481565b611fb1612711565b73ffffffffffffffffffffffffffffffffffffffff16611fcf611746565b73ffffffffffffffffffffffffffffffffffffffff1614612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c906137b0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60005b8282905081101561253d576000600360008585858181106120905761208f613b9d565b5b905060200201358152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1614612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f90613710565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868686818110612200576121ff613b9d565b5b905060200201356040518263ffffffff1660e01b81526004016122239190613830565b60206040518083038186803b15801561223b57600080fd5b505afa15801561224f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612273919061317b565b73ffffffffffffffffffffffffffffffffffffffff16146122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c0906137f0565b60405180910390fd5b600f60009054906101000a900460ff16612318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230f90613810565b60405180910390fd5b61233b3385858581811061232f5761232e613b9d565b5b905060200201356128ae565b7f0e652fb4f68db397855aa6666e889095f74013ca459e996fc5752cb5687a0c46308585858181106123705761236f613b9d565b5b9050602002013560405161238592919061367a565b60405180910390a16000600360008686868181106123a6576123a5613b9d565b5b905060200201358152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815250509050604051806080016040528086868681811061245a57612459613b9d565b5b905060200201358152602001826020015173ffffffffffffffffffffffffffffffffffffffff1681526020018260400151815260200142815250600360008787878181106124ab576124aa613b9d565b5b9050602002013581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301559050505050808061253590613a5e565b91505061206c565b505050565b6000600a80549050905090565b60075481565b61255d612711565b73ffffffffffffffffffffffffffffffffffffffff1661257b611746565b73ffffffffffffffffffffffffffffffffffffffff16146125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c8906137b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890613750565b60405180910390fd5b61264a816127ea565b50565b60036020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154905084565b60006117008210156126ba5768056bc75e2d63100000905061270c565b611ae78210156126d557680ad78ebc5ac6200000905061270c565b611ecf8210156126f0576815af1d78b58c400000905061270c565b6122b782101561270b57682b5e3af16b18800000905061270c565b5b919050565b600033905090565b60008060036000848152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090506201518068056bc75e2d631000008260600151426127ce9190613982565b6127d89190613928565b6127e291906138f7565b915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060036000838152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815250509050600181604001511415612af5576000600a805490501115612a5857600061296a83612719565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19856129d360646129c560075487612bfe90919063ffffffff16565b612c1490919063ffffffff16565b6040518363ffffffff1660e01b81526004016129f092919061367a565b600060405180830381600087803b158015612a0a57600080fd5b505af1158015612a1e573d6000803e3d6000fd5b50505050612a52612a4d6064612a3f60085485612bfe90919063ffffffff16565b612c1490919063ffffffff16565b612c2a565b50612af0565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1984612aa085612719565b6040518363ffffffff1660e01b8152600401612abd92919061367a565b600060405180830381600087803b158015612ad757600080fd5b505af1158015612aeb573d6000803e3d6000fd5b505050505b612bf9565b600281604001511415612bf8576000612b0f836064612c89565b9050600954811180612b2657506000600c80549050145b15612beb57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f198560046000878152602001908152602001600020546040518363ffffffff1660e01b8152600401612b9b92919061367a565b600060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b5050505060006004600085815260200190815260200160002081905550612bf6565b612bf58184612cdb565b5b505b5b505050565b60008183612c0c9190613928565b905092915050565b60008183612c2291906138f7565b905092915050565b6000612c3b82600a80549050612c89565b90508160046000600a8481548110612c5657612c55613b9d565b5b906000526020600020015481526020019081526020016000206000828254612c7e91906138a1565b925050819055505050565b60008132600143612c9a9190613982565b404286604051602001612cb094939291906135da565b6040516020818303038152906040528051906020012060001c612cd39190613adf565b905092915050565b600060036000838152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090506000612d8284600c80549050612c89565b9050600060036000600c8481548110612d9e57612d9d613b9d565b5b90600052602060002001548152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090507ffea7d4730e615c31dd37a7ee6b52691abdb37b6fb4da2a28648e579933cf67488360200151826020015186604051612e7393929190613643565b60405180910390a16040518060800160405280858152602001826020015173ffffffffffffffffffffffffffffffffffffffff1681526020016002815260200142815250600360008681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030155905050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19826020015160046000888152602001908152602001600020546040518363ffffffff1660e01b8152600401612fa692919061367a565b600060405180830381600087803b158015612fc057600080fd5b505af1158015612fd4573d6000803e3d6000fd5b50505050600060046000868152602001908152602001600020819055505050505050565b60008135905061300781613dfb565b92915050565b60008151905061301c81613dfb565b92915050565b60008083601f84011261303857613037613bd1565b5b8235905067ffffffffffffffff81111561305557613054613bcc565b5b60208301915083602082028301111561307157613070613bd6565b5b9250929050565b60008083601f84011261308e5761308d613bd1565b5b8235905067ffffffffffffffff8111156130ab576130aa613bcc565b5b6020830191508360208202830111156130c7576130c6613bd6565b5b9250929050565b6000813590506130dd81613e12565b92915050565b60008083601f8401126130f9576130f8613bd1565b5b8235905067ffffffffffffffff81111561311657613115613bcc565b5b60208301915083600182028301111561313257613131613bd6565b5b9250929050565b60008135905061314881613e29565b92915050565b60006020828403121561316457613163613be0565b5b600061317284828501612ff8565b91505092915050565b60006020828403121561319157613190613be0565b5b600061319f8482850161300d565b91505092915050565b6000806000806000608086880312156131c4576131c3613be0565b5b60006131d288828901612ff8565b95505060206131e388828901612ff8565b94505060406131f488828901613139565b935050606086013567ffffffffffffffff81111561321557613214613bdb565b5b613221888289016130e3565b92509250509295509295909350565b6000806000806040858703121561324a57613249613be0565b5b600085013567ffffffffffffffff81111561326857613267613bdb565b5b61327487828801613022565b9450945050602085013567ffffffffffffffff81111561329757613296613bdb565b5b6132a387828801613078565b925092505092959194509250565b600080602083850312156132c8576132c7613be0565b5b600083013567ffffffffffffffff8111156132e6576132e5613bdb565b5b6132f285828601613078565b92509250509250929050565b60008060006040848603121561331757613316613be0565b5b600084013567ffffffffffffffff81111561333557613334613bdb565b5b61334186828701613078565b9350935050602061335486828701613139565b9150509250925092565b6000806040838503121561337557613374613be0565b5b6000613383858286016130ce565b925050602061339485828601613139565b9150509250929050565b6000602082840312156133b4576133b3613be0565b5b60006133c284828501613139565b91505092915050565b6000806000606084860312156133e4576133e3613be0565b5b60006133f286828701613139565b9350506020613403868287016130ce565b925050604061341486828701613139565b9150509250925092565b613427816139b6565b82525050565b61343e613439826139b6565b613aa7565b82525050565b61344d816139c8565b82525050565b61346461345f826139d4565b613ab9565b82525050565b613473816139de565b82525050565b6000613486600f83613890565b915061349182613bf2565b602082019050919050565b60006134a9602583613890565b91506134b482613c1b565b604082019050919050565b60006134cc602683613890565b91506134d782613c6a565b604082019050919050565b60006134ef602b83613890565b91506134fa82613cb9565b604082019050919050565b6000613512601083613890565b915061351d82613d08565b602082019050919050565b6000613535602083613890565b915061354082613d31565b602082019050919050565b6000613558600f83613890565b915061356382613d5a565b602082019050919050565b600061357b602783613890565b915061358682613d83565b604082019050919050565b600061359e601183613890565b91506135a982613dd2565b602082019050919050565b6135bd81613a2a565b82525050565b6135d46135cf82613a2a565b613ad5565b82525050565b60006135e6828761342d565b6014820191506135f68286613453565b60208201915061360682856135c3565b60208201915061361682846135c3565b60208201915081905095945050505050565b600060208201905061363d600083018461341e565b92915050565b6000606082019050613658600083018661341e565b613665602083018561341e565b61367260408301846135b4565b949350505050565b600060408201905061368f600083018561341e565b61369c60208301846135b4565b9392505050565b60006060820190506136b8600083018661341e565b6136c560208301856135b4565b6136d260408301846135b4565b949350505050565b60006020820190506136ef6000830184613444565b92915050565b600060208201905061370a600083018461346a565b92915050565b6000602082019050818103600083015261372981613479565b9050919050565b600060208201905081810360008301526137498161349c565b9050919050565b60006020820190508181036000830152613769816134bf565b9050919050565b60006020820190508181036000830152613789816134e2565b9050919050565b600060208201905081810360008301526137a981613505565b9050919050565b600060208201905081810360008301526137c981613528565b9050919050565b600060208201905081810360008301526137e98161354b565b9050919050565b600060208201905081810360008301526138098161356e565b9050919050565b6000602082019050818103600083015261382981613591565b9050919050565b600060208201905061384560008301846135b4565b92915050565b600060808201905061386060008301876135b4565b61386d602083018661341e565b61387a60408301856135b4565b61388760608301846135b4565b95945050505050565b600082825260208201905092915050565b60006138ac82613a2a565b91506138b783613a2a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138ec576138eb613b10565b5b828201905092915050565b600061390282613a2a565b915061390d83613a2a565b92508261391d5761391c613b3f565b5b828204905092915050565b600061393382613a2a565b915061393e83613a2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561397757613976613b10565b5b828202905092915050565b600061398d82613a2a565b915061399883613a2a565b9250828210156139ab576139aa613b10565b5b828203905092915050565b60006139c182613a0a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a3f82613a2a565b91506000821415613a5357613a52613b10565b5b600182039050919050565b6000613a6982613a2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a9c57613a9b613b10565b5b600182019050919050565b6000613ab282613ac3565b9050919050565b6000819050919050565b6000613ace82613be5565b9050919050565b6000819050919050565b6000613aea82613a2a565b9150613af583613a2a565b925082613b0557613b04613b3f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008160601b9050919050565b7f4e6f7420796f75722068616d6d69650000000000000000000000000000000000600082015250565b7f596f7520646f206e6f74206861766520616e7920636c61696d61626c6520486160008201527f6d6d696573000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f7420686176652074686174206d616e7920436c61696d6160008201527f626c652048616d6d696573000000000000000000000000000000000000000000602082015250565b7f3120646179207374616b65206c6f636b00000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420796f75722048616d6d69650000000000000000000000000000000000600082015250565b7f48616d6d6965206d757374206265207374616b656420696e206f72646572207460008201527f6f20636c61696d00000000000000000000000000000000000000000000000000602082015250565b7f5374616b696e6720697320706175736564000000000000000000000000000000600082015250565b613e04816139b6565b8114613e0f57600080fd5b50565b613e1b816139c8565b8114613e2657600080fd5b50565b613e3281613a2a565b8114613e3d57600080fd5b5056fea2646970667358221220de903153c4e0b91a4286fc560e0b05ac48530f40766461b72fb00d975879b46a64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806372827bf71161010f578063b177a0e0116100a2578063eafad78611610071578063eafad7861461056c578063ed0919991461058a578063f2fde38b146105a8578063f71cb607146105c4576101e5565b8063b177a0e0146104e6578063b72a476c14610516578063b7d32a7e14610534578063d01634e614610550576101e5565b80638cd31eba116100de5780638cd31eba1461045e5780638da5cb5b1461047c57806397ca74251461049a578063acd9a97a146104ca576101e5565b806372827bf7146103b0578063734cc73e146103e05780637c0bc781146103fe5780637d6c17b41461042e576101e5565b80633cb7860a1161018757806357a393611161015657806357a393611461033e5780635e30f4701461036e5780636d04107f1461038a578063715018a6146103a6576101e5565b80633cb7860a146102b65780633fce24be146102d45780634b8028d5146102f05780634cf088d914610320576101e5565b806318160ddd116101c357806318160ddd146102545780631f7678ce146102725780633682764a146102905780633b8105b3146102ac576101e5565b806301bf9948146101ea57806303fff1a514610206578063150b7a0214610224575b600080fd5b61020460048036038101906101ff91906133cb565b6105f7565b005b61020e610abf565b60405161021b9190613830565b60405180910390f35b61023e600480360381019061023991906131a8565b610acc565b60405161024b91906136f5565b60405180910390f35b61025c610ae1565b6040516102699190613830565b60405180910390f35b61027a610ae7565b6040516102879190613830565b60405180910390f35b6102aa60048036038101906102a5919061335e565b610aed565b005b6102b4610eae565b005b6102be610f56565b6040516102cb9190613830565b60405180910390f35b6102ee60048036038101906102e9919061314e565b610f5c565b005b61030a6004803603810190610305919061339e565b61101c565b6040516103179190613830565b60405180910390f35b61032861102e565b60405161033591906136da565b60405180910390f35b6103586004803603810190610353919061339e565b611041565b6040516103659190613830565b60405180910390f35b61038860048036038101906103839190613230565b611065565b005b6103a4600480360381019061039f91906132fe565b61118d565b005b6103ae61165e565b005b6103ca60048036038101906103c5919061339e565b6116e6565b6040516103d79190613830565b60405180910390f35b6103e86116fe565b6040516103f59190613830565b60405180910390f35b6104186004803603810190610413919061339e565b611704565b6040516104259190613830565b60405180910390f35b6104486004803603810190610443919061339e565b611728565b6040516104559190613830565b60405180910390f35b610466611740565b6040516104739190613830565b60405180910390f35b610484611746565b6040516104919190613628565b60405180910390f35b6104b460048036038101906104af919061339e565b61176f565b6040516104c19190613830565b60405180910390f35b6104e460048036038101906104df91906132b1565b611787565b005b61050060048036038101906104fb919061314e565b611f8b565b60405161050d9190613830565b60405180910390f35b61051e611fa3565b60405161052b9190613830565b60405180910390f35b61054e6004803603810190610549919061314e565b611fa9565b005b61056a600480360381019061056591906132b1565b612069565b005b610574612542565b6040516105819190613830565b60405180910390f35b61059261254f565b60405161059f9190613830565b60405180910390f35b6105c260048036038101906105bd919061314e565b612555565b005b6105de60048036038101906105d9919061339e565b61264d565b6040516105ee949392919061384b565b60405180910390f35b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161067e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067590613730565b60405180910390fd5b808411156106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890613770565b60405180910390fd5b83816106cd9190613982565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b848110156109f65760008160115461072b91906138a1565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3bb9796040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561079757600080fd5b505af11580156107ab573d6000803e3d6000fd5b5050505084156109505760405180608001604052808281526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200142815250600360008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030155905050600184141561088d576006600081548092919061088390613a5e565b919050555061094b565b60028414156108ed57600a8190806001815401808255809150506001900390600052602060002001600090919091909150556001600a805490506108d19190613982565b600b60008381526020019081526020016000208190555061094a565b600384141561094957600c8190806001815401808255809150506001900390600052602060002001600090919091909150556001600c805490506109319190613982565b600d6000838152602001908152602001600020819055505b5b5b6109e2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b81526004016109af93929190613643565b600060405180830381600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050505b5080806109ee90613a5e565b915050610713565b50600068056bc75e2d6310000085610a0e9190613928565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401610a6d92919061367a565b600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b505050508460116000828254610ab191906138a1565b925050819055505050505050565b6000600c80549050905090565b600063150b7a0260e01b905095945050505050565b60115481565b600e5481565b600f60009054906101000a900460ff16610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613810565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33610b8660115461269d565b6040518363ffffffff1660e01b8152600401610ba392919061367a565b600060405180830381600087803b158015610bbd57600080fd5b505af1158015610bd1573d6000803e3d6000fd5b50505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3bb9796040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c3f57600080fd5b505af1158015610c53573d6000803e3d6000fd5b505050506000601154905060116000815480929190610c7190613a5e565b91905055508215610e175760405180608001604052808281526020013373ffffffffffffffffffffffffffffffffffffffff16815260200183815260200142815250600360008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301559050506001821415610d545760066000815480929190610d4a90613a5e565b9190505550610e12565b6002821415610db457600a8190806001815401808255809150506001900390600052602060002001600090919091909150556001600a80549050610d989190613982565b600b600083815260200190815260200160002081905550610e11565b6003821415610e1057600c8190806001815401808255809150506001900390600052602060002001600090919091909150556001600c80549050610df89190613982565b600d6000838152602001908152602001600020819055505b5b5b610ea9565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401610e7693929190613643565b600060405180830381600087803b158015610e9057600080fd5b505af1158015610ea4573d6000803e3d6000fd5b505050505b505050565b610eb6612711565b73ffffffffffffffffffffffffffffffffffffffff16610ed4611746565b73ffffffffffffffffffffffffffffffffffffffff1614610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f21906137b0565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60095481565b610f64612711565b73ffffffffffffffffffffffffffffffffffffffff16610f82611746565b73ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf906137b0565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061102782612719565b9050919050565b600f60009054906101000a900460ff1681565b600a818154811061105157600080fd5b906000526020600020016000915090505481565b61106d612711565b73ffffffffffffffffffffffffffffffffffffffff1661108b611746565b73ffffffffffffffffffffffffffffffffffffffff16146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d8906137b0565b60405180910390fd5b60005b848490508110156111865782828281811061110257611101613b9d565b5b90506020020135601060008787858181106111205761111f613b9d565b5b9050602002016020810190611135919061314e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061117e90613a5e565b9150506110e4565b5050505050565b60005b83839050811015611658573373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061120357611202613b9d565b5b905060200201356040518263ffffffff1660e01b81526004016112269190613830565b60206040518083038186803b15801561123e57600080fd5b505afa158015611252573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611276919061317b565b73ffffffffffffffffffffffffffffffffffffffff16146112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c3906137d0565b60405180910390fd5b600f60009054906101000a900460ff1661131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290613810565b60405180910390fd5b604051806080016040528085858481811061133957611338613b9d565b5b9050602002013581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001838152602001428152506003600086868581811061138257611381613b9d565b5b9050602002013581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301559050507fd1870f0937c3ab4a35b1bf5546a26de2e59f3a57312387c505bacf5e0b84c7d73385858481811061143457611433613b9d565b5b905060200201358460405161144b939291906136a3565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308787868181106114a6576114a5613b9d565b5b905060200201356040518463ffffffff1660e01b81526004016114cb93929190613643565b600060405180830381600087803b1580156114e557600080fd5b505af11580156114f9573d6000803e3d6000fd5b505050506001821415611523576006600081548092919061151990613a5e565b9190505550611645565b60028214156115b557600a84848381811061154157611540613b9d565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556001600a805490506115809190613982565b600b600086868581811061159757611596613b9d565b5b90506020020135815260200190815260200160002081905550611644565b600382141561164357600c8484838181106115d3576115d2613b9d565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556001600c805490506116129190613982565b600d600086868581811061162957611628613b9d565b5b905060200201358152602001908152602001600020819055505b5b5b808061165090613a5e565b915050611190565b50505050565b611666612711565b73ffffffffffffffffffffffffffffffffffffffff16611684611746565b73ffffffffffffffffffffffffffffffffffffffff16146116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d1906137b0565b60405180910390fd5b6116e460006127ea565b565b600b6020528060005260406000206000915090505481565b60065481565b600c818154811061171457600080fd5b906000526020600020016000915090505481565b600d6020528060005260406000206000915090505481565b60085481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915090505481565b60005b82829050811015611f86576000600360008585858181106117ae576117ad613b9d565b5b905060200201358152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff16146118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad906137d0565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868681811061191e5761191d613b9d565b5b905060200201356040518263ffffffff1660e01b81526004016119419190613830565b60206040518083038186803b15801561195957600080fd5b505afa15801561196d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611991919061317b565b73ffffffffffffffffffffffffffffffffffffffff16146119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de906137f0565b60405180910390fd5b600f60009054906101000a900460ff16611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613810565b60405180910390fd5b600e54816060015142611a499190613982565b1015611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190613790565b60405180910390fd5b611aad33858585818110611aa157611aa0613b9d565b5b905060200201356128ae565b600181604001511415611ad75760066000815480929190611acd90613a34565b9190505550611cd9565b600281604001511415611bd9576000600a6001600a80549050611afa9190613982565b81548110611b0b57611b0a613b9d565b5b9060005260206000200154905080600a600b6000888888818110611b3257611b31613b9d565b5b9050602002013581526020019081526020016000205481548110611b5957611b58613b9d565b5b9060005260206000200181905550600b6000868686818110611b7e57611b7d613b9d565b5b90506020020135815260200190815260200160002054600b600083815260200190815260200160002081905550600a805480611bbd57611bbc613b6e565b5b6001900381819060005260206000200160009055905550611cd8565b600381604001511415611cd7576000600c6001600c80549050611bfc9190613982565b81548110611c0d57611c0c613b9d565b5b9060005260206000200154905080600c600d6000888888818110611c3457611c33613b9d565b5b9050602002013581526020019081526020016000205481548110611c5b57611c5a613b9d565b5b9060005260206000200181905550600d6000868686818110611c8057611c7f613b9d565b5b90506020020135815260200190815260200160002054600d600083815260200190815260200160002081905550600c805480611cbf57611cbe613b6e565b5b60019003818190600052602060002001600090559055505b5b5b7f0e652fb4f68db397855aa6666e889095f74013ca459e996fc5752cb5687a0c4630858585818110611d0e57611d0d613b9d565b5b90506020020135604051611d2392919061367a565b60405180910390a1600060036000868686818110611d4457611d43613b9d565b5b905060200201358152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815250509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e308360200151888888818110611e3157611e30613b9d565b5b905060200201356040518463ffffffff1660e01b8152600401611e5693929190613643565b600060405180830381600087803b158015611e7057600080fd5b505af1158015611e84573d6000803e3d6000fd5b505050506040518060800160405280868686818110611ea657611ea5613b9d565b5b905060200201358152602001826020015173ffffffffffffffffffffffffffffffffffffffff168152602001600081526020014281525060036000878787818110611ef457611ef3613b9d565b5b9050602002013581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015590505050508080611f7e90613a5e565b91505061178a565b505050565b60106020528060005260406000206000915090505481565b60055481565b611fb1612711565b73ffffffffffffffffffffffffffffffffffffffff16611fcf611746565b73ffffffffffffffffffffffffffffffffffffffff1614612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c906137b0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60005b8282905081101561253d576000600360008585858181106120905761208f613b9d565b5b905060200201358152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1614612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f90613710565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868686818110612200576121ff613b9d565b5b905060200201356040518263ffffffff1660e01b81526004016122239190613830565b60206040518083038186803b15801561223b57600080fd5b505afa15801561224f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612273919061317b565b73ffffffffffffffffffffffffffffffffffffffff16146122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c0906137f0565b60405180910390fd5b600f60009054906101000a900460ff16612318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230f90613810565b60405180910390fd5b61233b3385858581811061232f5761232e613b9d565b5b905060200201356128ae565b7f0e652fb4f68db397855aa6666e889095f74013ca459e996fc5752cb5687a0c46308585858181106123705761236f613b9d565b5b9050602002013560405161238592919061367a565b60405180910390a16000600360008686868181106123a6576123a5613b9d565b5b905060200201358152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815250509050604051806080016040528086868681811061245a57612459613b9d565b5b905060200201358152602001826020015173ffffffffffffffffffffffffffffffffffffffff1681526020018260400151815260200142815250600360008787878181106124ab576124aa613b9d565b5b9050602002013581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301559050505050808061253590613a5e565b91505061206c565b505050565b6000600a80549050905090565b60075481565b61255d612711565b73ffffffffffffffffffffffffffffffffffffffff1661257b611746565b73ffffffffffffffffffffffffffffffffffffffff16146125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c8906137b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890613750565b60405180910390fd5b61264a816127ea565b50565b60036020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154905084565b60006117008210156126ba5768056bc75e2d63100000905061270c565b611ae78210156126d557680ad78ebc5ac6200000905061270c565b611ecf8210156126f0576815af1d78b58c400000905061270c565b6122b782101561270b57682b5e3af16b18800000905061270c565b5b919050565b600033905090565b60008060036000848152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090506201518068056bc75e2d631000008260600151426127ce9190613982565b6127d89190613928565b6127e291906138f7565b915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060036000838152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815250509050600181604001511415612af5576000600a805490501115612a5857600061296a83612719565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19856129d360646129c560075487612bfe90919063ffffffff16565b612c1490919063ffffffff16565b6040518363ffffffff1660e01b81526004016129f092919061367a565b600060405180830381600087803b158015612a0a57600080fd5b505af1158015612a1e573d6000803e3d6000fd5b50505050612a52612a4d6064612a3f60085485612bfe90919063ffffffff16565b612c1490919063ffffffff16565b612c2a565b50612af0565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1984612aa085612719565b6040518363ffffffff1660e01b8152600401612abd92919061367a565b600060405180830381600087803b158015612ad757600080fd5b505af1158015612aeb573d6000803e3d6000fd5b505050505b612bf9565b600281604001511415612bf8576000612b0f836064612c89565b9050600954811180612b2657506000600c80549050145b15612beb57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f198560046000878152602001908152602001600020546040518363ffffffff1660e01b8152600401612b9b92919061367a565b600060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b5050505060006004600085815260200190815260200160002081905550612bf6565b612bf58184612cdb565b5b505b5b505050565b60008183612c0c9190613928565b905092915050565b60008183612c2291906138f7565b905092915050565b6000612c3b82600a80549050612c89565b90508160046000600a8481548110612c5657612c55613b9d565b5b906000526020600020015481526020019081526020016000206000828254612c7e91906138a1565b925050819055505050565b60008132600143612c9a9190613982565b404286604051602001612cb094939291906135da565b6040516020818303038152906040528051906020012060001c612cd39190613adf565b905092915050565b600060036000838152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090506000612d8284600c80549050612c89565b9050600060036000600c8481548110612d9e57612d9d613b9d565b5b90600052602060002001548152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152505090507ffea7d4730e615c31dd37a7ee6b52691abdb37b6fb4da2a28648e579933cf67488360200151826020015186604051612e7393929190613643565b60405180910390a16040518060800160405280858152602001826020015173ffffffffffffffffffffffffffffffffffffffff1681526020016002815260200142815250600360008681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030155905050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19826020015160046000888152602001908152602001600020546040518363ffffffff1660e01b8152600401612fa692919061367a565b600060405180830381600087803b158015612fc057600080fd5b505af1158015612fd4573d6000803e3d6000fd5b50505050600060046000868152602001908152602001600020819055505050505050565b60008135905061300781613dfb565b92915050565b60008151905061301c81613dfb565b92915050565b60008083601f84011261303857613037613bd1565b5b8235905067ffffffffffffffff81111561305557613054613bcc565b5b60208301915083602082028301111561307157613070613bd6565b5b9250929050565b60008083601f84011261308e5761308d613bd1565b5b8235905067ffffffffffffffff8111156130ab576130aa613bcc565b5b6020830191508360208202830111156130c7576130c6613bd6565b5b9250929050565b6000813590506130dd81613e12565b92915050565b60008083601f8401126130f9576130f8613bd1565b5b8235905067ffffffffffffffff81111561311657613115613bcc565b5b60208301915083600182028301111561313257613131613bd6565b5b9250929050565b60008135905061314881613e29565b92915050565b60006020828403121561316457613163613be0565b5b600061317284828501612ff8565b91505092915050565b60006020828403121561319157613190613be0565b5b600061319f8482850161300d565b91505092915050565b6000806000806000608086880312156131c4576131c3613be0565b5b60006131d288828901612ff8565b95505060206131e388828901612ff8565b94505060406131f488828901613139565b935050606086013567ffffffffffffffff81111561321557613214613bdb565b5b613221888289016130e3565b92509250509295509295909350565b6000806000806040858703121561324a57613249613be0565b5b600085013567ffffffffffffffff81111561326857613267613bdb565b5b61327487828801613022565b9450945050602085013567ffffffffffffffff81111561329757613296613bdb565b5b6132a387828801613078565b925092505092959194509250565b600080602083850312156132c8576132c7613be0565b5b600083013567ffffffffffffffff8111156132e6576132e5613bdb565b5b6132f285828601613078565b92509250509250929050565b60008060006040848603121561331757613316613be0565b5b600084013567ffffffffffffffff81111561333557613334613bdb565b5b61334186828701613078565b9350935050602061335486828701613139565b9150509250925092565b6000806040838503121561337557613374613be0565b5b6000613383858286016130ce565b925050602061339485828601613139565b9150509250929050565b6000602082840312156133b4576133b3613be0565b5b60006133c284828501613139565b91505092915050565b6000806000606084860312156133e4576133e3613be0565b5b60006133f286828701613139565b9350506020613403868287016130ce565b925050604061341486828701613139565b9150509250925092565b613427816139b6565b82525050565b61343e613439826139b6565b613aa7565b82525050565b61344d816139c8565b82525050565b61346461345f826139d4565b613ab9565b82525050565b613473816139de565b82525050565b6000613486600f83613890565b915061349182613bf2565b602082019050919050565b60006134a9602583613890565b91506134b482613c1b565b604082019050919050565b60006134cc602683613890565b91506134d782613c6a565b604082019050919050565b60006134ef602b83613890565b91506134fa82613cb9565b604082019050919050565b6000613512601083613890565b915061351d82613d08565b602082019050919050565b6000613535602083613890565b915061354082613d31565b602082019050919050565b6000613558600f83613890565b915061356382613d5a565b602082019050919050565b600061357b602783613890565b915061358682613d83565b604082019050919050565b600061359e601183613890565b91506135a982613dd2565b602082019050919050565b6135bd81613a2a565b82525050565b6135d46135cf82613a2a565b613ad5565b82525050565b60006135e6828761342d565b6014820191506135f68286613453565b60208201915061360682856135c3565b60208201915061361682846135c3565b60208201915081905095945050505050565b600060208201905061363d600083018461341e565b92915050565b6000606082019050613658600083018661341e565b613665602083018561341e565b61367260408301846135b4565b949350505050565b600060408201905061368f600083018561341e565b61369c60208301846135b4565b9392505050565b60006060820190506136b8600083018661341e565b6136c560208301856135b4565b6136d260408301846135b4565b949350505050565b60006020820190506136ef6000830184613444565b92915050565b600060208201905061370a600083018461346a565b92915050565b6000602082019050818103600083015261372981613479565b9050919050565b600060208201905081810360008301526137498161349c565b9050919050565b60006020820190508181036000830152613769816134bf565b9050919050565b60006020820190508181036000830152613789816134e2565b9050919050565b600060208201905081810360008301526137a981613505565b9050919050565b600060208201905081810360008301526137c981613528565b9050919050565b600060208201905081810360008301526137e98161354b565b9050919050565b600060208201905081810360008301526138098161356e565b9050919050565b6000602082019050818103600083015261382981613591565b9050919050565b600060208201905061384560008301846135b4565b92915050565b600060808201905061386060008301876135b4565b61386d602083018661341e565b61387a60408301856135b4565b61388760608301846135b4565b95945050505050565b600082825260208201905092915050565b60006138ac82613a2a565b91506138b783613a2a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138ec576138eb613b10565b5b828201905092915050565b600061390282613a2a565b915061390d83613a2a565b92508261391d5761391c613b3f565b5b828204905092915050565b600061393382613a2a565b915061393e83613a2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561397757613976613b10565b5b828202905092915050565b600061398d82613a2a565b915061399883613a2a565b9250828210156139ab576139aa613b10565b5b828203905092915050565b60006139c182613a0a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a3f82613a2a565b91506000821415613a5357613a52613b10565b5b600182039050919050565b6000613a6982613a2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a9c57613a9b613b10565b5b600182019050919050565b6000613ab282613ac3565b9050919050565b6000819050919050565b6000613ace82613be5565b9050919050565b6000819050919050565b6000613aea82613a2a565b9150613af583613a2a565b925082613b0557613b04613b3f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008160601b9050919050565b7f4e6f7420796f75722068616d6d69650000000000000000000000000000000000600082015250565b7f596f7520646f206e6f74206861766520616e7920636c61696d61626c6520486160008201527f6d6d696573000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f7420686176652074686174206d616e7920436c61696d6160008201527f626c652048616d6d696573000000000000000000000000000000000000000000602082015250565b7f3120646179207374616b65206c6f636b00000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420796f75722048616d6d69650000000000000000000000000000000000600082015250565b7f48616d6d6965206d757374206265207374616b656420696e206f72646572207460008201527f6f20636c61696d00000000000000000000000000000000000000000000000000602082015250565b7f5374616b696e6720697320706175736564000000000000000000000000000000600082015250565b613e04816139b6565b8114613e0f57600080fd5b50565b613e1b816139c8565b8114613e2657600080fd5b50565b613e3281613a2a565b8114613e3d57600080fd5b5056fea2646970667358221220de903153c4e0b91a4286fc560e0b05ac48530f40766461b72fb00d975879b46a64736f6c63430008070033
Deployed Bytecode Sourcemap
805:12785:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2965:1447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12746:111;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13378:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2852:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2583:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4725:1000;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13295:77;;;:::i;:::-;;2153:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13006:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11107:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2630:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2246:30;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4462:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6522:999;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1661:101:17;;;:::i;:::-;;2318:48:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1832:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2418:32;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2494:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2056:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1640:46:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7531:1727;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2745:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1738:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13156:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9264:851;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12863:107;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1938:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1551:43:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;2965:1447;3060:19;3082:16;:28;3099:10;3082:28;;;;;;;;;;;;;;;;3060:50;;3142:1;3128:11;:15;3120:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;3213:11;3203:6;:21;;3195:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3327:6;3313:11;:20;;;;:::i;:::-;3282:16;:28;3299:10;3282:28;;;;;;;;;;;;;;;:51;;;;3349:9;3344:940;3368:6;3364:1;:10;3344:940;;;3395:15;3427:1;3413:11;;:15;;;;:::i;:::-;3395:33;;3442:7;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3487:5;3484:790;;;3529:191;;;;;;;;3570:7;3529:191;;;;3606:10;3529:191;;;;;;3646:6;3529:191;;;;3686:15;3529:191;;;3511:6;:15;3518:7;3511:15;;;;;;;;;;;:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3752:1;3742:6;:11;3738:423;;;3775:22;;:24;;;;;;;;;:::i;:::-;;;;;;3738:423;;;3836:1;3826:6;:11;3822:339;;;3860:13;3879:7;3860:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3957:1;3934:13;:20;;;;:24;;;;:::i;:::-;3909:13;:22;3923:7;3909:22;;;;;;;;;;;:49;;;;3822:339;;;4013:1;4003:6;:11;3999:162;;;4037:15;4058:7;4037:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4140:1;4115:15;:22;;;;:26;;;;:::i;:::-;4088:15;:24;4104:7;4088:24;;;;;;;;;;;:53;;;;3999:162;3822:339;3738:423;3484:790;;;4199:7;;;;;;;;;;;:24;;;4232:4;4239:10;4251:7;4199:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3484:790;3381:903;3376:3;;;;;:::i;:::-;;;;3344:940;;;;4293:17;4322:9;4313:6;:18;;;;:::i;:::-;4293:38;;4341:5;;;;;;;;;;;:10;;;4352;4364:9;4341:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4399:6;4384:11;;:21;;;;;;;:::i;:::-;;;;;;;;3050:1362;;2965:1447;;;:::o;12746:111::-;12802:7;12828:15;:22;;;;12821:29;;12746:111;:::o;13378:210::-;13517:6;13540:41;;;13533:48;;13378:210;;;;;;;:::o;2852:33::-;;;;:::o;2583:36::-;;;;:::o;4725:1000::-;4806:7;;;;;;;;;;;4798:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;4845:5;;;;;;;;;;;:10;;;4856;4868:25;4881:11;;4868:12;:25::i;:::-;4845:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4904:7;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4942:15;4960:11;;4942:29;;4981:11;;:13;;;;;;;;;:::i;:::-;;;;;;5007:5;5004:714;;;5045:171;;;;;;;;5082:7;5045:171;;;;5114:10;5045:171;;;;;;5150:6;5045:171;;;;5186:15;5045:171;;;5027:6;:15;5034:7;5027:15;;;;;;;;;;;:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5244:1;5234:6;:11;5230:386;;;5263:22;;:24;;;;;;;;;:::i;:::-;;;;;;5230:386;;;5320:1;5310:6;:11;5306:310;;;5340:13;5359:7;5340:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5433:1;5410:13;:20;;;;:24;;;;:::i;:::-;5385:13;:22;5399:7;5385:22;;;;;;;;;;;:49;;;;5306:310;;;5481:1;5471:6;:11;5467:149;;;5501:15;5522:7;5501:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5600:1;5575:15;:22;;;;:26;;;;:::i;:::-;5548:15;:24;5564:7;5548:24;;;;;;;;;;;:53;;;;5467:149;5306:310;5230:386;5004:714;;;5647:7;;;;;;;;;;;:24;;;5680:4;5687:10;5699:7;5647:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5004:714;4788:937;4725:1000;;:::o;13295:77::-;1252:12:17;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13358:7:8::1;;;;;;;;;;;13357:8;13347:7;;:18;;;;;;;;;;;;;;;;;;13295:77::o:0;2153:39::-;;;;:::o;13006:111::-;1252:12:17;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13099:10:8::1;13081:7;;:29;;;;;;;;;;;;;;;;;;13006:111:::0;:::o;11107:110::-;11165:7;11191:19;11207:2;11191:15;:19::i;:::-;11184:26;;11107:110;;;:::o;2630:27::-;;;;;;;;;;;;;:::o;2246:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4462:228::-;1252:12:17;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4581:9:8::1;4577:107;4596:9;;:16;;4592:1;:20;4577:107;;;4665:5;;4671:1;4665:8;;;;;;;:::i;:::-;;;;;;;;4632:16;:30;4649:9;;4659:1;4649:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4632:30;;;;;;;;;;;;;;;:41;;;;4614:3;;;;;:::i;:::-;;;;4577:107;;;;4462:228:::0;;;;:::o;6522:999::-;6611:9;6607:908;6630:3;;:10;;6626:1;:14;6607:908;;;6695:10;6668:37;;:7;;;;;;;;;;;:15;;;6684:3;;6688:1;6684:6;;;;;;;:::i;:::-;;;;;;;;6668:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;;6660:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;6747:7;;;;;;;;;;;6739:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;6808:170;;;;;;;;6845:3;;6849:1;6845:6;;;;;;;:::i;:::-;;;;;;;;6808:170;;;;6876:10;6808:170;;;;;;6912:6;6808:170;;;;6948:15;6808:170;;;6791:6;:14;6798:3;;6802:1;6798:6;;;;;;;:::i;:::-;;;;;;;;6791:14;;;;;;;;;;;:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6998:40;7011:10;7023:3;;7027:1;7023:6;;;;;;;:::i;:::-;;;;;;;;7031;6998:40;;;;;;;;:::i;:::-;;;;;;;;7052:7;;;;;;;;;;;:20;;;7073:10;7093:4;7100:3;;7104:1;7100:6;;;;;;;:::i;:::-;;;;;;;;7052:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7136:1;7126:6;:11;7122:383;;;7155:22;;:24;;;;;;;;;:::i;:::-;;;;;;7122:383;;;7212:1;7202:6;:11;7198:307;;;7232:13;7251:3;;7255:1;7251:6;;;;;;;:::i;:::-;;;;;;;;7232:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7323:1;7300:13;:20;;;;:24;;;;:::i;:::-;7276:13;:21;7290:3;;7294:1;7290:6;;;;;;;:::i;:::-;;;;;;;;7276:21;;;;;;;;;;;:48;;;;7198:307;;;7371:1;7361:6;:11;7357:148;;;7391:15;7412:3;;7416:1;7412:6;;;;;;;:::i;:::-;;;;;;;;7391:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7488:1;7463:15;:22;;;;:26;;;;:::i;:::-;7437:15;:23;7453:3;;7457:1;7453:6;;;;;;;:::i;:::-;;;;;;;;7437:23;;;;;;;;;;;:52;;;;7357:148;7198:307;7122:383;6642:3;;;;;:::i;:::-;;;;6607:908;;;;6522:999;;;:::o;1661:101:17:-;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;2318:48:8:-;;;;;;;;;;;;;;;;;:::o;1832:41::-;;;;:::o;2418:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2494:50::-;;;;;;;;;;;;;;;;;:::o;2056:31::-;;;;:::o;1029:85:17:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;1640:46:8:-;;;;;;;;;;;;;;;;;:::o;7531:1727::-;7606:9;7602:1650;7625:3;;:10;;7621:1;:14;7602:1650;;;7655:22;7680:6;:14;7687:3;;7691:1;7687:6;;;;;;;:::i;:::-;;;;;;;;7680:14;;;;;;;;;;;7655:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7731:10;7716:25;;:5;:11;;;:25;;;7708:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;7818:4;7783:40;;:7;;;;;;;;;;;:15;;;7799:3;;7803:1;7799:6;;;;;;;:::i;:::-;;;;;;;;7783:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;7775:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;7889:7;;;;;;;;;;;7881:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;7978:12;;7958:5;:16;;;7940:15;:34;;;;:::i;:::-;:50;;7932:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;8026:26;8033:10;8045:3;;8049:1;8045:6;;;;;;;:::i;:::-;;;;;;;;8026;:26::i;:::-;8087:1;8071:5;:12;;;:17;8067:714;;;8114:22;;:24;;;;;;;;;:::i;:::-;;;;;;8067:714;;;8191:1;8175:5;:12;;;:17;8171:610;;;8211:18;8232:13;8269:1;8246:13;:20;;;;:24;;;;:::i;:::-;8232:39;;;;;;;;:::i;:::-;;;;;;;;;;8211:60;;8328:10;8289:13;8303;:21;8317:3;;8321:1;8317:6;;;;;;;:::i;:::-;;;;;;;;8303:21;;;;;;;;;;;;8289:36;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;8384:13;:21;8398:3;;8402:1;8398:6;;;;;;;:::i;:::-;;;;;;;;8384:21;;;;;;;;;;;;8356:13;:25;8370:10;8356:25;;;;;;;;;;;:49;;;;8423:13;:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8193:264;8171:610;;;8495:1;8479:5;:12;;;:17;8475:306;;;8515:20;8538:15;8579:1;8554:15;:22;;;;:26;;;;:::i;:::-;8538:43;;;;;;;;:::i;:::-;;;;;;;;;;8515:66;;8642:12;8599:15;8615;:23;8631:3;;8635:1;8631:6;;;;;;;:::i;:::-;;;;;;;;8615:23;;;;;;;;;;;;8599:40;;;;;;;;:::i;:::-;;;;;;;;;:55;;;;8704:15;:23;8720:3;;8724:1;8720:6;;;;;;;:::i;:::-;;;;;;;;8704:23;;;;;;;;;;;;8672:15;:29;8688:12;8672:29;;;;;;;;;;;:55;;;;8745:15;:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8497:284;8475:306;8171:610;8067:714;8801:36;8823:4;8830:3;;8834:1;8830:6;;;;;;;:::i;:::-;;;;;;;;8801:36;;;;;;;:::i;:::-;;;;;;;;8922:25;8950:6;:14;8957:3;;8961:1;8957:6;;;;;;;:::i;:::-;;;;;;;;8950:14;;;;;;;;;;;8922:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8978:7;;;;;;;;;;;:24;;;9011:4;9018:8;:14;;;9034:3;;9038:1;9034:6;;;;;;;:::i;:::-;;;;;;;;8978:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9072:169;;;;;;;;9109:3;;9113:1;9109:6;;;;;;;:::i;:::-;;;;;;;;9072:169;;;;9140:8;:14;;;9072:169;;;;;;9180:1;9072:169;;;;9211:15;9072:169;;;9055:6;:14;9062:3;;9066:1;9062:6;;;;;;;:::i;:::-;;;;;;;;9055:14;;;;;;;;;;;:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7641:1611;;7637:3;;;;;:::i;:::-;;;;7602:1650;;;;7531:1727;;:::o;2745:52::-;;;;;;;;;;;;;;;;;:::o;1738:47::-;;;;:::o;13156:104::-;1252:12:17;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13243:9:8::1;13229:5;;:24;;;;;;;;;;;;;;;;;;13156:104:::0;:::o;9264:851::-;9337:9;9333:776;9356:3;;:10;;9352:1;:14;9333:776;;;9386:22;9411:6;:14;9418:3;;9422:1;9418:6;;;;;;;:::i;:::-;;;;;;;;9411:14;;;;;;;;;;;9386:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9462:10;9447:25;;:5;:11;;;:25;;;9439:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;9549:4;9514:40;;:7;;;;;;;;;;;:15;;;9530:3;;9534:1;9530:6;;;;;;;:::i;:::-;;;;;;;;9514:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;9506:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;9620:7;;;;;;;;;;;9612:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;9676:26;9683:10;9695:3;;9699:1;9695:6;;;;;;;:::i;:::-;;;;;;;;9676;:26::i;:::-;9721:36;9743:4;9750:3;;9754:1;9750:6;;;;;;;:::i;:::-;;;;;;;;9721:36;;;;;;;:::i;:::-;;;;;;;;9842:25;9870:6;:14;9877:3;;9881:1;9877:6;;;;;;;:::i;:::-;;;;;;;;9870:14;;;;;;;;;;;9842:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9915:183;;;;;;;;9952:3;;9956:1;9952:6;;;;;;;:::i;:::-;;;;;;;;9915:183;;;;9983:8;:14;;;9915:183;;;;;;10023:8;:15;;;9915:183;;;;10068:15;9915:183;;;9898:6;:14;9905:3;;9909:1;9905:6;;;;;;;:::i;:::-;;;;;;;;9898:14;;;;;;;;;;;:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9372:737;;9368:3;;;;;:::i;:::-;;;;9333:776;;;;9264:851;;:::o;12863:107::-;12917:7;12943:13;:20;;;;12936:27;;12863:107;:::o;1938:35::-;;;;:::o;1911:198:17:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;1551:43:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5735:324::-;5796:12;5832:4;5823:6;:13;5819:233;;;5857:9;5850:16;;;;5819:233;5894:4;5885:6;:13;5881:171;;;5919:9;5912:16;;;;5881:171;5956:4;5947:6;:13;5943:109;;;5981:9;5974:16;;;;5943:109;6018:4;6009:6;:13;6005:47;;;6043:9;6036:16;;;;6005:47;5735:324;;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;11275:194:8:-;11334:7;11353:22;11378:6;:10;11385:2;11378:10;;;;;;;;;;;11353:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11456:6;11444:9;11424:5;:16;;;11406:15;:34;;;;:::i;:::-;11405:48;;;;:::i;:::-;:57;;;;:::i;:::-;11398:64;;;11275:194;;;:::o;2263:187:17:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;10125:901:8:-;10192:22;10217:6;:15;10224:7;10217:15;;;;;;;;;;;10192:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10262:1;10246:5;:12;;;:17;10242:778;;;10304:1;10281:13;:20;;;;:24;10278:352;;;10324:21;10348:24;10364:7;10348:15;:24::i;:::-;10324:48;;10390:5;;;;;;;;;;;:10;;;10401:5;10408:43;10447:3;10408:34;10426:15;;10408:13;:17;;:34;;;;:::i;:::-;:38;;:43;;;;:::i;:::-;10390:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10470:51;10481:39;10516:3;10481:30;10499:11;;10481:13;:17;;:30;;;;:::i;:::-;:34;;:39;;;;:::i;:::-;10470:10;:51::i;:::-;10306:230;10278:352;;;10572:5;;;;;;;;;;;:10;;;10583:5;10590:24;10606:7;10590:15;:24::i;:::-;10572:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10278:352;10242:778;;;10686:1;10670:5;:12;;;:17;10666:354;;;10702:12;10717:30;10734:7;10743:3;10717:16;:30::i;:::-;10702:45;;10771:20;;10764:4;:27;:58;;;;10821:1;10795:15;:22;;;;:27;10764:58;10761:249;;;10841:5;;;;;;;;;;;:10;;;10852:5;10859:11;:20;10871:7;10859:20;;;;;;;;;;;;10841:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10921:1;10898:11;:21;10910:7;10898:21;;;;;;;;;;;:24;;;;10761:249;;;10960:35;10981:4;10987:7;10960:20;:35::i;:::-;10761:249;10688:332;10666:354;10242:778;10182:844;10125:901;;:::o;3451:96:18:-;3509:7;3539:1;3535;:5;;;;:::i;:::-;3528:12;;3451:96;;;;:::o;3836:::-;3894:7;3924:1;3920;:5;;;;:::i;:::-;3913:12;;3836:96;;;;:::o;11876:174:8:-;11930:12;11945:46;11962:6;11970:13;:20;;;;11945:16;:46::i;:::-;11930:61;;12037:6;12001:11;:32;12013:13;12027:4;12013:19;;;;;;;;:::i;:::-;;;;;;;;;;12001:32;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;11920:130;11876:174;:::o;11533:272::-;11609:7;11795:3;11683:9;11731:1;11716:12;:16;;;;:::i;:::-;11706:27;11747:15;11776:4;11653:137;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11643:148;;;;;;11635:157;;:163;;;;:::i;:::-;11628:170;;11533:272;;;;:::o;12117:617::-;12196:23;12222:6;:15;12229:7;12222:15;;;;;;;;;;;12196:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12247:12;12262:46;12279:4;12285:15;:22;;;;12262:16;:46::i;:::-;12247:61;;12318:25;12346:6;:29;12353:15;12369:4;12353:21;;;;;;;;:::i;:::-;;;;;;;;;;12346:29;;;;;;;;;;;12318:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12390:51;12403:6;:12;;;12417:8;:14;;;12433:7;12390:51;;;;;;;;:::i;:::-;;;;;;;;12469:166;;;;;;;;12506:7;12469:166;;;;12538:8;:14;;;12469:166;;;;;;12578:1;12469:166;;;;12609:15;12469:166;;;12451:6;:15;12458:7;12451:15;;;;;;;;;;;:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12645:5;;;;;;;;;;;:10;;;12656:8;:14;;;12672:11;:20;12684:7;12672:20;;;;;;;;;;;;12645:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12726:1;12703:11;:20;12715:7;12703:20;;;;;;;;;;;:24;;;;12186:548;;;12117:617;;:::o;7:139:20:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;318:568::-;391:8;401:6;451:3;444:4;436:6;432:17;428:27;418:122;;459:79;;:::i;:::-;418:122;572:6;559:20;549:30;;602:18;594:6;591:30;588:117;;;624:79;;:::i;:::-;588:117;738:4;730:6;726:17;714:29;;792:3;784:4;776:6;772:17;762:8;758:32;755:41;752:128;;;799:79;;:::i;:::-;752:128;318:568;;;;;:::o;909:::-;982:8;992:6;1042:3;1035:4;1027:6;1023:17;1019:27;1009:122;;1050:79;;:::i;:::-;1009:122;1163:6;1150:20;1140:30;;1193:18;1185:6;1182:30;1179:117;;;1215:79;;:::i;:::-;1179:117;1329:4;1321:6;1317:17;1305:29;;1383:3;1375:4;1367:6;1363:17;1353:8;1349:32;1346:41;1343:128;;;1390:79;;:::i;:::-;1343:128;909:568;;;;;:::o;1483:133::-;1526:5;1564:6;1551:20;1542:29;;1580:30;1604:5;1580:30;:::i;:::-;1483:133;;;;:::o;1635:552::-;1692:8;1702:6;1752:3;1745:4;1737:6;1733:17;1729:27;1719:122;;1760:79;;:::i;:::-;1719:122;1873:6;1860:20;1850:30;;1903:18;1895:6;1892:30;1889:117;;;1925:79;;:::i;:::-;1889:117;2039:4;2031:6;2027:17;2015:29;;2093:3;2085:4;2077:6;2073:17;2063:8;2059:32;2056:41;2053:128;;;2100:79;;:::i;:::-;2053:128;1635:552;;;;;:::o;2193:139::-;2239:5;2277:6;2264:20;2255:29;;2293:33;2320:5;2293:33;:::i;:::-;2193:139;;;;:::o;2338:329::-;2397:6;2446:2;2434:9;2425:7;2421:23;2417:32;2414:119;;;2452:79;;:::i;:::-;2414:119;2572:1;2597:53;2642:7;2633:6;2622:9;2618:22;2597:53;:::i;:::-;2587:63;;2543:117;2338:329;;;;:::o;2673:351::-;2743:6;2792:2;2780:9;2771:7;2767:23;2763:32;2760:119;;;2798:79;;:::i;:::-;2760:119;2918:1;2943:64;2999:7;2990:6;2979:9;2975:22;2943:64;:::i;:::-;2933:74;;2889:128;2673:351;;;;:::o;3030:963::-;3127:6;3135;3143;3151;3159;3208:3;3196:9;3187:7;3183:23;3179:33;3176:120;;;3215:79;;:::i;:::-;3176:120;3335:1;3360:53;3405:7;3396:6;3385:9;3381:22;3360:53;:::i;:::-;3350:63;;3306:117;3462:2;3488:53;3533:7;3524:6;3513:9;3509:22;3488:53;:::i;:::-;3478:63;;3433:118;3590:2;3616:53;3661:7;3652:6;3641:9;3637:22;3616:53;:::i;:::-;3606:63;;3561:118;3746:2;3735:9;3731:18;3718:32;3777:18;3769:6;3766:30;3763:117;;;3799:79;;:::i;:::-;3763:117;3912:64;3968:7;3959:6;3948:9;3944:22;3912:64;:::i;:::-;3894:82;;;;3689:297;3030:963;;;;;;;;:::o;3999:934::-;4121:6;4129;4137;4145;4194:2;4182:9;4173:7;4169:23;4165:32;4162:119;;;4200:79;;:::i;:::-;4162:119;4348:1;4337:9;4333:17;4320:31;4378:18;4370:6;4367:30;4364:117;;;4400:79;;:::i;:::-;4364:117;4513:80;4585:7;4576:6;4565:9;4561:22;4513:80;:::i;:::-;4495:98;;;;4291:312;4670:2;4659:9;4655:18;4642:32;4701:18;4693:6;4690:30;4687:117;;;4723:79;;:::i;:::-;4687:117;4836:80;4908:7;4899:6;4888:9;4884:22;4836:80;:::i;:::-;4818:98;;;;4613:313;3999:934;;;;;;;:::o;4939:559::-;5025:6;5033;5082:2;5070:9;5061:7;5057:23;5053:32;5050:119;;;5088:79;;:::i;:::-;5050:119;5236:1;5225:9;5221:17;5208:31;5266:18;5258:6;5255:30;5252:117;;;5288:79;;:::i;:::-;5252:117;5401:80;5473:7;5464:6;5453:9;5449:22;5401:80;:::i;:::-;5383:98;;;;5179:312;4939:559;;;;;:::o;5504:704::-;5599:6;5607;5615;5664:2;5652:9;5643:7;5639:23;5635:32;5632:119;;;5670:79;;:::i;:::-;5632:119;5818:1;5807:9;5803:17;5790:31;5848:18;5840:6;5837:30;5834:117;;;5870:79;;:::i;:::-;5834:117;5983:80;6055:7;6046:6;6035:9;6031:22;5983:80;:::i;:::-;5965:98;;;;5761:312;6112:2;6138:53;6183:7;6174:6;6163:9;6159:22;6138:53;:::i;:::-;6128:63;;6083:118;5504:704;;;;;:::o;6214:468::-;6279:6;6287;6336:2;6324:9;6315:7;6311:23;6307:32;6304:119;;;6342:79;;:::i;:::-;6304:119;6462:1;6487:50;6529:7;6520:6;6509:9;6505:22;6487:50;:::i;:::-;6477:60;;6433:114;6586:2;6612:53;6657:7;6648:6;6637:9;6633:22;6612:53;:::i;:::-;6602:63;;6557:118;6214:468;;;;;:::o;6688:329::-;6747:6;6796:2;6784:9;6775:7;6771:23;6767:32;6764:119;;;6802:79;;:::i;:::-;6764:119;6922:1;6947:53;6992:7;6983:6;6972:9;6968:22;6947:53;:::i;:::-;6937:63;;6893:117;6688:329;;;;:::o;7023:613::-;7097:6;7105;7113;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7288:1;7313:53;7358:7;7349:6;7338:9;7334:22;7313:53;:::i;:::-;7303:63;;7259:117;7415:2;7441:50;7483:7;7474:6;7463:9;7459:22;7441:50;:::i;:::-;7431:60;;7386:115;7540:2;7566:53;7611:7;7602:6;7591:9;7587:22;7566:53;:::i;:::-;7556:63;;7511:118;7023:613;;;;;:::o;7642:118::-;7729:24;7747:5;7729:24;:::i;:::-;7724:3;7717:37;7642:118;;:::o;7766:157::-;7871:45;7891:24;7909:5;7891:24;:::i;:::-;7871:45;:::i;:::-;7866:3;7859:58;7766:157;;:::o;7929:109::-;8010:21;8025:5;8010:21;:::i;:::-;8005:3;7998:34;7929:109;;:::o;8044:157::-;8149:45;8169:24;8187:5;8169:24;:::i;:::-;8149:45;:::i;:::-;8144:3;8137:58;8044:157;;:::o;8207:115::-;8292:23;8309:5;8292:23;:::i;:::-;8287:3;8280:36;8207:115;;:::o;8328:366::-;8470:3;8491:67;8555:2;8550:3;8491:67;:::i;:::-;8484:74;;8567:93;8656:3;8567:93;:::i;:::-;8685:2;8680:3;8676:12;8669:19;;8328:366;;;:::o;8700:::-;8842:3;8863:67;8927:2;8922:3;8863:67;:::i;:::-;8856:74;;8939:93;9028:3;8939:93;:::i;:::-;9057:2;9052:3;9048:12;9041:19;;8700:366;;;:::o;9072:::-;9214:3;9235:67;9299:2;9294:3;9235:67;:::i;:::-;9228:74;;9311:93;9400:3;9311:93;:::i;:::-;9429:2;9424:3;9420:12;9413:19;;9072:366;;;:::o;9444:::-;9586:3;9607:67;9671:2;9666:3;9607:67;:::i;:::-;9600:74;;9683:93;9772:3;9683:93;:::i;:::-;9801:2;9796:3;9792:12;9785:19;;9444:366;;;:::o;9816:::-;9958:3;9979:67;10043:2;10038:3;9979:67;:::i;:::-;9972:74;;10055:93;10144:3;10055:93;:::i;:::-;10173:2;10168:3;10164:12;10157:19;;9816:366;;;:::o;10188:::-;10330:3;10351:67;10415:2;10410:3;10351:67;:::i;:::-;10344:74;;10427:93;10516:3;10427:93;:::i;:::-;10545:2;10540:3;10536:12;10529:19;;10188:366;;;:::o;10560:::-;10702:3;10723:67;10787:2;10782:3;10723:67;:::i;:::-;10716:74;;10799:93;10888:3;10799:93;:::i;:::-;10917:2;10912:3;10908:12;10901:19;;10560:366;;;:::o;10932:::-;11074:3;11095:67;11159:2;11154:3;11095:67;:::i;:::-;11088:74;;11171:93;11260:3;11171:93;:::i;:::-;11289:2;11284:3;11280:12;11273:19;;10932:366;;;:::o;11304:::-;11446:3;11467:67;11531:2;11526:3;11467:67;:::i;:::-;11460:74;;11543:93;11632:3;11543:93;:::i;:::-;11661:2;11656:3;11652:12;11645:19;;11304:366;;;:::o;11676:118::-;11763:24;11781:5;11763:24;:::i;:::-;11758:3;11751:37;11676:118;;:::o;11800:157::-;11905:45;11925:24;11943:5;11925:24;:::i;:::-;11905:45;:::i;:::-;11900:3;11893:58;11800:157;;:::o;11963:679::-;12159:3;12174:75;12245:3;12236:6;12174:75;:::i;:::-;12274:2;12269:3;12265:12;12258:19;;12287:75;12358:3;12349:6;12287:75;:::i;:::-;12387:2;12382:3;12378:12;12371:19;;12400:75;12471:3;12462:6;12400:75;:::i;:::-;12500:2;12495:3;12491:12;12484:19;;12513:75;12584:3;12575:6;12513:75;:::i;:::-;12613:2;12608:3;12604:12;12597:19;;12633:3;12626:10;;11963:679;;;;;;;:::o;12648:222::-;12741:4;12779:2;12768:9;12764:18;12756:26;;12792:71;12860:1;12849:9;12845:17;12836:6;12792:71;:::i;:::-;12648:222;;;;:::o;12876:442::-;13025:4;13063:2;13052:9;13048:18;13040:26;;13076:71;13144:1;13133:9;13129:17;13120:6;13076:71;:::i;:::-;13157:72;13225:2;13214:9;13210:18;13201:6;13157:72;:::i;:::-;13239;13307:2;13296:9;13292:18;13283:6;13239:72;:::i;:::-;12876:442;;;;;;:::o;13324:332::-;13445:4;13483:2;13472:9;13468:18;13460:26;;13496:71;13564:1;13553:9;13549:17;13540:6;13496:71;:::i;:::-;13577:72;13645:2;13634:9;13630:18;13621:6;13577:72;:::i;:::-;13324:332;;;;;:::o;13662:442::-;13811:4;13849:2;13838:9;13834:18;13826:26;;13862:71;13930:1;13919:9;13915:17;13906:6;13862:71;:::i;:::-;13943:72;14011:2;14000:9;13996:18;13987:6;13943:72;:::i;:::-;14025;14093:2;14082:9;14078:18;14069:6;14025:72;:::i;:::-;13662:442;;;;;;:::o;14110:210::-;14197:4;14235:2;14224:9;14220:18;14212:26;;14248:65;14310:1;14299:9;14295:17;14286:6;14248:65;:::i;:::-;14110:210;;;;:::o;14326:218::-;14417:4;14455:2;14444:9;14440:18;14432:26;;14468:69;14534:1;14523:9;14519:17;14510:6;14468:69;:::i;:::-;14326:218;;;;:::o;14550:419::-;14716:4;14754:2;14743:9;14739:18;14731:26;;14803:9;14797:4;14793:20;14789:1;14778:9;14774:17;14767:47;14831:131;14957:4;14831:131;:::i;:::-;14823:139;;14550:419;;;:::o;14975:::-;15141:4;15179:2;15168:9;15164:18;15156:26;;15228:9;15222:4;15218:20;15214:1;15203:9;15199:17;15192:47;15256:131;15382:4;15256:131;:::i;:::-;15248:139;;14975:419;;;:::o;15400:::-;15566:4;15604:2;15593:9;15589:18;15581:26;;15653:9;15647:4;15643:20;15639:1;15628:9;15624:17;15617:47;15681:131;15807:4;15681:131;:::i;:::-;15673:139;;15400:419;;;:::o;15825:::-;15991:4;16029:2;16018:9;16014:18;16006:26;;16078:9;16072:4;16068:20;16064:1;16053:9;16049:17;16042:47;16106:131;16232:4;16106:131;:::i;:::-;16098:139;;15825:419;;;:::o;16250:::-;16416:4;16454:2;16443:9;16439:18;16431:26;;16503:9;16497:4;16493:20;16489:1;16478:9;16474:17;16467:47;16531:131;16657:4;16531:131;:::i;:::-;16523:139;;16250:419;;;:::o;16675:::-;16841:4;16879:2;16868:9;16864:18;16856:26;;16928:9;16922:4;16918:20;16914:1;16903:9;16899:17;16892:47;16956:131;17082:4;16956:131;:::i;:::-;16948:139;;16675:419;;;:::o;17100:::-;17266:4;17304:2;17293:9;17289:18;17281:26;;17353:9;17347:4;17343:20;17339:1;17328:9;17324:17;17317:47;17381:131;17507:4;17381:131;:::i;:::-;17373:139;;17100:419;;;:::o;17525:::-;17691:4;17729:2;17718:9;17714:18;17706:26;;17778:9;17772:4;17768:20;17764:1;17753:9;17749:17;17742:47;17806:131;17932:4;17806:131;:::i;:::-;17798:139;;17525:419;;;:::o;17950:::-;18116:4;18154:2;18143:9;18139:18;18131:26;;18203:9;18197:4;18193:20;18189:1;18178:9;18174:17;18167:47;18231:131;18357:4;18231:131;:::i;:::-;18223:139;;17950:419;;;:::o;18375:222::-;18468:4;18506:2;18495:9;18491:18;18483:26;;18519:71;18587:1;18576:9;18572:17;18563:6;18519:71;:::i;:::-;18375:222;;;;:::o;18603:553::-;18780:4;18818:3;18807:9;18803:19;18795:27;;18832:71;18900:1;18889:9;18885:17;18876:6;18832:71;:::i;:::-;18913:72;18981:2;18970:9;18966:18;18957:6;18913:72;:::i;:::-;18995;19063:2;19052:9;19048:18;19039:6;18995:72;:::i;:::-;19077;19145:2;19134:9;19130:18;19121:6;19077:72;:::i;:::-;18603:553;;;;;;;:::o;19243:169::-;19327:11;19361:6;19356:3;19349:19;19401:4;19396:3;19392:14;19377:29;;19243:169;;;;:::o;19418:305::-;19458:3;19477:20;19495:1;19477:20;:::i;:::-;19472:25;;19511:20;19529:1;19511:20;:::i;:::-;19506:25;;19665:1;19597:66;19593:74;19590:1;19587:81;19584:107;;;19671:18;;:::i;:::-;19584:107;19715:1;19712;19708:9;19701:16;;19418:305;;;;:::o;19729:185::-;19769:1;19786:20;19804:1;19786:20;:::i;:::-;19781:25;;19820:20;19838:1;19820:20;:::i;:::-;19815:25;;19859:1;19849:35;;19864:18;;:::i;:::-;19849:35;19906:1;19903;19899:9;19894:14;;19729:185;;;;:::o;19920:348::-;19960:7;19983:20;20001:1;19983:20;:::i;:::-;19978:25;;20017:20;20035:1;20017:20;:::i;:::-;20012:25;;20205:1;20137:66;20133:74;20130:1;20127:81;20122:1;20115:9;20108:17;20104:105;20101:131;;;20212:18;;:::i;:::-;20101:131;20260:1;20257;20253:9;20242:20;;19920:348;;;;:::o;20274:191::-;20314:4;20334:20;20352:1;20334:20;:::i;:::-;20329:25;;20368:20;20386:1;20368:20;:::i;:::-;20363:25;;20407:1;20404;20401:8;20398:34;;;20412:18;;:::i;:::-;20398:34;20457:1;20454;20450:9;20442:17;;20274:191;;;;:::o;20471:96::-;20508:7;20537:24;20555:5;20537:24;:::i;:::-;20526:35;;20471:96;;;:::o;20573:90::-;20607:7;20650:5;20643:13;20636:21;20625:32;;20573:90;;;:::o;20669:77::-;20706:7;20735:5;20724:16;;20669:77;;;:::o;20752:149::-;20788:7;20828:66;20821:5;20817:78;20806:89;;20752:149;;;:::o;20907:126::-;20944:7;20984:42;20977:5;20973:54;20962:65;;20907:126;;;:::o;21039:77::-;21076:7;21105:5;21094:16;;21039:77;;;:::o;21122:171::-;21161:3;21184:24;21202:5;21184:24;:::i;:::-;21175:33;;21230:4;21223:5;21220:15;21217:41;;;21238:18;;:::i;:::-;21217:41;21285:1;21278:5;21274:13;21267:20;;21122:171;;;:::o;21299:233::-;21338:3;21361:24;21379:5;21361:24;:::i;:::-;21352:33;;21407:66;21400:5;21397:77;21394:103;;;21477:18;;:::i;:::-;21394:103;21524:1;21517:5;21513:13;21506:20;;21299:233;;;:::o;21538:100::-;21577:7;21606:26;21626:5;21606:26;:::i;:::-;21595:37;;21538:100;;;:::o;21644:79::-;21683:7;21712:5;21701:16;;21644:79;;;:::o;21729:94::-;21768:7;21797:20;21811:5;21797:20;:::i;:::-;21786:31;;21729:94;;;:::o;21829:79::-;21868:7;21897:5;21886:16;;21829:79;;;:::o;21914:176::-;21946:1;21963:20;21981:1;21963:20;:::i;:::-;21958:25;;21997:20;22015:1;21997:20;:::i;:::-;21992:25;;22036:1;22026:35;;22041:18;;:::i;:::-;22026:35;22082:1;22079;22075:9;22070:14;;21914:176;;;;:::o;22096:180::-;22144:77;22141:1;22134:88;22241:4;22238:1;22231:15;22265:4;22262:1;22255:15;22282:180;22330:77;22327:1;22320:88;22427:4;22424:1;22417:15;22451:4;22448:1;22441:15;22468:180;22516:77;22513:1;22506:88;22613:4;22610:1;22603:15;22637:4;22634:1;22627:15;22654:180;22702:77;22699:1;22692:88;22799:4;22796:1;22789:15;22823:4;22820:1;22813:15;22840:117;22949:1;22946;22939:12;22963:117;23072:1;23069;23062:12;23086:117;23195:1;23192;23185:12;23209:117;23318:1;23315;23308:12;23332:117;23441:1;23438;23431:12;23455:94;23488:8;23536:5;23532:2;23528:14;23507:35;;23455:94;;;:::o;23555:165::-;23695:17;23691:1;23683:6;23679:14;23672:41;23555:165;:::o;23726:224::-;23866:34;23862:1;23854:6;23850:14;23843:58;23935:7;23930:2;23922:6;23918:15;23911:32;23726:224;:::o;23956:225::-;24096:34;24092:1;24084:6;24080:14;24073:58;24165:8;24160:2;24152:6;24148:15;24141:33;23956:225;:::o;24187:230::-;24327:34;24323:1;24315:6;24311:14;24304:58;24396:13;24391:2;24383:6;24379:15;24372:38;24187:230;:::o;24423:166::-;24563:18;24559:1;24551:6;24547:14;24540:42;24423:166;:::o;24595:182::-;24735:34;24731:1;24723:6;24719:14;24712:58;24595:182;:::o;24783:165::-;24923:17;24919:1;24911:6;24907:14;24900:41;24783:165;:::o;24954:226::-;25094:34;25090:1;25082:6;25078:14;25071:58;25163:9;25158:2;25150:6;25146:15;25139:34;24954:226;:::o;25186:167::-;25326:19;25322:1;25314:6;25310:14;25303:43;25186:167;:::o;25359:122::-;25432:24;25450:5;25432:24;:::i;:::-;25425:5;25422:35;25412:63;;25471:1;25468;25461:12;25412:63;25359:122;:::o;25487:116::-;25557:21;25572:5;25557:21;:::i;:::-;25550:5;25547:32;25537:60;;25593:1;25590;25583:12;25537:60;25487:116;:::o;25609:122::-;25682:24;25700:5;25682:24;:::i;:::-;25675:5;25672:35;25662:63;;25721:1;25718;25711:12;25662:63;25609:122;:::o
Swarm Source
ipfs://de903153c4e0b91a4286fc560e0b05ac48530f40766461b72fb00d975879b46a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.