More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 433 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20589787 | 169 days ago | IN | 0 ETH | 0.00606635 | ||||
Withdraw | 20174150 | 227 days ago | IN | 0 ETH | 0.00041188 | ||||
Withdraw | 19031244 | 387 days ago | IN | 0 ETH | 0.0047097 | ||||
Stake | 18017984 | 529 days ago | IN | 0 ETH | 0.00309173 | ||||
Stake | 17293055 | 631 days ago | IN | 0 ETH | 0.0086431 | ||||
Get Reward | 16534009 | 738 days ago | IN | 0 ETH | 0.00154712 | ||||
Stake | 16348746 | 763 days ago | IN | 0 ETH | 0.00306385 | ||||
Withdraw | 16094923 | 799 days ago | IN | 0 ETH | 0.0019 | ||||
Withdraw | 16015813 | 810 days ago | IN | 0 ETH | 0.0018 | ||||
Stake | 15956397 | 818 days ago | IN | 0 ETH | 0.0013448 | ||||
Stake | 15956324 | 818 days ago | IN | 0 ETH | 0.00618299 | ||||
Stake | 15955936 | 818 days ago | IN | 0 ETH | 0.00404661 | ||||
Get Reward | 15951354 | 819 days ago | IN | 0 ETH | 0.00072136 | ||||
Get Reward | 15951317 | 819 days ago | IN | 0 ETH | 0.00066129 | ||||
Get Reward | 15951291 | 819 days ago | IN | 0 ETH | 0.00094319 | ||||
Get Reward | 15949819 | 819 days ago | IN | 0 ETH | 0.00155277 | ||||
Get Reward | 15948995 | 819 days ago | IN | 0 ETH | 0.001127 | ||||
Stake | 15948814 | 819 days ago | IN | 0 ETH | 0.00226042 | ||||
Stake | 15945696 | 820 days ago | IN | 0 ETH | 0.00334575 | ||||
Stake | 15945263 | 820 days ago | IN | 0 ETH | 0.00434005 | ||||
Stake | 15923565 | 823 days ago | IN | 0 ETH | 0.00643583 | ||||
Burn NFT | 15923562 | 823 days ago | IN | 0 ETH | 0.00298397 | ||||
Burn NFT | 15892980 | 827 days ago | IN | 0 ETH | 0.00150121 | ||||
Stake | 15892979 | 827 days ago | IN | 0 ETH | 0.00387261 | ||||
Stake | 15841120 | 834 days ago | IN | 0 ETH | 0.00204976 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Staker
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.14; /******************************************************************************\ * Staking contract for https://twitter.com/OccultTower /******************************************************************************/ import "./IERC721.sol"; import "./IERC20.sol"; import "./SafeERC20.sol"; import "./ERC721Holder.sol"; import "./ReentrancyGuard.sol"; import "./Ownable.sol"; contract Staker is ERC721Holder, ReentrancyGuard, Ownable { using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ event PaymentReceived(address from, uint256 amount); bool public paused = true; uint16 public totalStake; uint16 public totalBurnt; uint16 public stakeCount; uint16 public burntCount; uint64 stakingDuration = 365 * 3 days; uint256 startPeriod; uint256 endPeriod; uint256 constant internal _precision = 1E18; mapping(address => uint256) userStartTime; mapping(address => uint256) rewards; mapping(address => uint16) burntBalance; mapping(address => uint16) stakedBalance; mapping(uint16 => address) stakedAssets; mapping(uint16 => address) burnt; mapping(address => uint16[]) userBurnt; mapping(address => uint16[]) userStaked; IERC721 public stakingToken721 = IERC721(0x594D888dEB4c0c66f495f48F55c61fAaDF0f63D8); IERC20 public stakingToken20 = IERC20(0xC807f4B1bf8e79a9279ACFCea5fA7A78E2C7d179); constructor() payable { } receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } // pause staking function pause(bool _paused) external onlyOwner { if (_paused == false) { require(stakingToken20.balanceOf(address(this)) > 0,"Staking: missing reward token"); if (startPeriod == 0) { startPeriod = block.timestamp; endPeriod = block.timestamp + stakingDuration; } } paused = _paused; } //block number when user started staking function userStart(address user) public view returns (uint256) { return (userStartTime[user]); } //number of NFT staked by a user function userStakeBalance(address user) public view returns (uint256) { return (stakedBalance[user]); } //number of NFT burnt by a user function userBurntBalance(address user) public view returns (uint256) { return (burntBalance[user]); } //pending rewards that can be claimed by a user function userPending(address user) public view returns (uint256) { return (_calculateRewards(user)); } //show balance of token in contract function coinBalance() public view returns (uint256) { return stakingToken20.balanceOf(address(this)); } //shows a list of burnt NFT of a user function burntList(address user) public view returns (uint16[] memory ids) { return (userBurnt[user]); } //shows a list of NFT staked by a user function stakeList(address user) public view returns (uint16[] memory) { return (userStaked[user]); } //show a list of NFT owned by 1 address function nftList(address user) public view returns (uint256 count, uint16[200] memory ownedList) { uint16 i; uint16 j; address nftOwner; uint256 ownerBalance; uint16[200] memory list; unchecked { ownerBalance = stakingToken721.balanceOf(user); for (i = 0; i <= 7777; i += 1) { nftOwner = stakingToken721.ownerOf(i); if (nftOwner == user) { list[j] = i; j += 1; if (j == ownerBalance || j == 200) { break; } } } } return (ownerBalance, list); } //allows user to burn a list of NFTs function burnNFT(uint16[] memory tokenIds) external nonReentrant { uint16 amount; bool newBurner; require(Address.isContract(msg.sender) == false, "Staking: no contracts"); require(paused == false, "Staking: is paused"); require(tokenIds.length != 0, "Staking: No tokenIds provided"); require(stakingToken721.isApprovedForAll(msg.sender, address(this)) == true, "Staking: First must setApprovalForAll in the NFT to this contract"); unchecked { if (userBurnt[msg.sender].length == 0) { newBurner = true; } for (uint16 i = 0; i < tokenIds.length; i += 1) { require(stakingToken721.ownerOf(tokenIds[i]) == msg.sender, "Staking: not owner of NFT"); // Increment the amount which will be staked amount += 1; // Save who is the staker/depositor of the token burnt[tokenIds[i]] = msg.sender; userBurnt[msg.sender].push(tokenIds[i]); // Transfer user's NFTs to the dead address stakingToken721.transferFrom(msg.sender, 0x000000000000000000000000000000000000dEaD, tokenIds[i]); } burntBalance[msg.sender] += amount; totalBurnt += amount; if (amount > 0 && newBurner == true) { burntCount += 1; } } } //allows admin to record a list of burnt NFT where the NFT was burnt without using this contract function addBurnt(address[] memory users, uint16[] memory ids) external onlyOwner { uint16 i; uint16 j; address old; bool newBurner; uint16 amount; require(users.length == ids.length, "Staking: The number of addresses is not matching the number of ids"); unchecked { for (i = 0; i < users.length; i++) { amount = 0; if (userBurnt[users[i]].length == 0) { newBurner = true; } require(stakingToken721.ownerOf(ids[i]) == 0x000000000000000000000000000000000000dEaD || stakingToken721.ownerOf(ids[i]) == address(stakingToken721) ,"Staking: NFT must be burnt"); if (burnt[ids[i]] == users[i]) { //skip as already recorded } else if (burnt[ids[i]] == address(0)) { //record burnt nft burnt[ids[i]] = users[i]; userBurnt[users[i]].push(ids[i]); burntBalance[users[i]] += 1; totalBurnt += 1; if (newBurner == true) { burntCount += 1; newBurner = false; } } else if (burnt[ids[i]] != users[i]) { //change address that burnt nft old = burnt[ids[i]]; for (j = 0; j < userBurnt[old].length; j++) { if (userBurnt[old][j] == ids[i]) { userBurnt[old][j] = userBurnt[old][userBurnt[old].length-1]; userBurnt[old].pop(); burntBalance[old] -= 1; break; } } burnt[ids[i]] = users[i]; userBurnt[users[i]].push(ids[i]); if (newBurner == true) { burntCount += 1; newBurner = false; } if (userBurnt[old].length == 0) { burntCount -= 1; } } } } } /// @notice Stakes user's NFTs /// @param tokenIds The tokenIds of the NFTs which will be staked function stake(uint16[] memory tokenIds) external nonReentrant { uint16 amount; bool newStaker; require(Address.isContract(msg.sender) == false, "Staking: no contracts"); require(paused == false, "Staking: is paused"); require(tokenIds.length != 0, "Staking: No tokenIds provided"); require(stakingToken721.isApprovedForAll(msg.sender, address(this)) == true, "Staking: First must setApprovalForAll in the NFT to this contract"); unchecked { if (userStaked[msg.sender].length == 0) { newStaker = true; } for (uint16 i = 0; i < tokenIds.length; i += 1) { require(tokenIds[i] > 0, "Staking: does not support id 0"); require(stakingToken721.ownerOf(tokenIds[i]) == msg.sender, "Staking: not owner of NFT"); // Increment the amount which will be staked amount += 1; // Save who is the staker/depositor of the token stakedAssets[tokenIds[i]] = msg.sender; userStaked[msg.sender].push(tokenIds[i]); // Transfer user's NFTs to the staking contract stakingToken721.transferFrom(msg.sender, address(this), tokenIds[i]); } if (amount > 0 && newStaker == true) { stakeCount += 1; } stakedBalance[msg.sender] += amount; totalStake += amount; if (userStartTime[msg.sender] == 0) { userStartTime[msg.sender] = block.timestamp; } } } /// @notice Withdraws a list of staked user's NFTs. If no list is provided it will unstake all. function withdraw(uint16[] memory tokenIds) external nonReentrant { uint16 i; uint16 j; uint16 clean; bool hasStake; bool cleaned; require(Address.isContract(msg.sender) == false, "Staking: no contracts"); //claim reward _getReward(); unchecked { if (userStaked[msg.sender].length > 0) { hasStake = true; } if (tokenIds.length == 0) { //unstake all for (i = 0; i < userStaked[msg.sender].length; i += 1) { j = userStaked[msg.sender][i]; if (j > 0) { if (stakedAssets[j] == msg.sender) { stakedAssets[j] = address(0); totalStake -= 1; userStaked[msg.sender][i] = 0; if (stakingToken721.ownerOf(j) == address(this)) { // Transfer user's NFTs back to user stakingToken721.safeTransferFrom(address(this), msg.sender, j); } } } } stakedBalance[msg.sender] = 0; } else { //unstake chosen id for (i = 0; i < tokenIds.length; i += 1) { for (j = 0; j < userStaked[msg.sender].length; j += 1) { if (userStaked[msg.sender][j] == tokenIds[i]) { if (stakedAssets[tokenIds[i]] == msg.sender) { stakedAssets[tokenIds[i]] = address(0); totalStake -= 1; stakedBalance[msg.sender] -= 1; userStaked[msg.sender][j] = 0; if (stakingToken721.ownerOf(tokenIds[i]) == address(this)) { // Transfer user's NFTs back to user stakingToken721.safeTransferFrom(address(this), msg.sender, tokenIds[i]); } } } } } } //remove 0 ids cleaned = false; while (cleaned == false) { for (i = 0; i < userStaked[msg.sender].length; i += 1) { clean = 0; if (userStaked[msg.sender].length > 1) { if (userStaked[msg.sender][i] == 0) { userStaked[msg.sender][i] = userStaked[msg.sender][userStaked[msg.sender].length-1]; userStaked[msg.sender].pop(); clean += 1; break; } } else { userStaked[msg.sender].pop(); } } if (clean == 0) { cleaned = true; } } if (hasStake == true && userStaked[msg.sender].length == 0) { stakeCount -= 1; } } } //user can claim reward function getReward() external nonReentrant { require(Address.isContract(msg.sender) == false, "Staking: No contracts"); _getReward(); } //code to claim reward function _getReward() internal { uint256 reward; // update the current reward balance _updateRewards(); unchecked { reward = rewards[msg.sender]; //if token is running out then pay out the balance remaining if (reward > stakingToken20.balanceOf(address(this))) { reward = stakingToken20.balanceOf(address(this)); } if (reward > 0) { SafeERC20.safeTransfer(stakingToken20, msg.sender, reward); } rewards[msg.sender] -= reward; } } /** * @notice function that update pending rewards * and shift them to rewardsToClaim * @dev update rewards claimable * and check the time spent since deposit for the `msg.sender` */ function _updateRewards() internal { unchecked { rewards[msg.sender] = _calculateRewards(msg.sender); if (block.timestamp >= endPeriod) { userStartTime[msg.sender] = endPeriod; } else { userStartTime[msg.sender] = block.timestamp; } } } /** * @notice calculate rewards based on the number of staked and burnt NFTs * @dev the higher is the precision and the more the time remaining will be precise * @param stakeHolder, address of the user to be checked * @return uint256 amount of claimable tokens of the specified address */ function _calculateRewards(address stakeHolder) internal view returns (uint256) { uint256 cal; uint256 totalStakeBonus; uint256 totalBurntCount; uint256 bonusPoolTokens; uint256 bonusPoolDailyDist; uint256 burntTokenCount; uint256 dailyTokenDist; uint256 stakingBonusCount; uint256 burntTokenMult; uint256 dailyBonusPoolDist; uint256 yearlyTokenDist; unchecked { if (stakedBalance[stakeHolder] == 0 || burntBalance[stakeHolder] == 0 || startPeriod == 0) { cal = 0; } else { totalStakeBonus = _precision * (totalStake - stakeCount); totalBurntCount = _precision * (totalBurnt - burntCount); bonusPoolTokens = totalStakeBonus + totalBurntCount * 5 / 4; if (bonusPoolTokens == 0) { bonusPoolTokens = 1; } bonusPoolDailyDist = _precision * _precision * 2223 / bonusPoolTokens; burntTokenCount = burntBalance[stakeHolder] - 1; dailyTokenDist = _precision * (stakedBalance[stakeHolder] + burntTokenCount); stakingBonusCount = stakedBalance[stakeHolder] - 1; burntTokenMult = burntTokenCount * 5 / 4; dailyBonusPoolDist = (stakingBonusCount + burntTokenMult) * bonusPoolDailyDist; yearlyTokenDist = (dailyTokenDist + dailyBonusPoolDist) * 365; cal = yearlyTokenDist * _percentageTimeRemaining(stakeHolder) * (stakingDuration / 365 days) / _precision; } } return (cal + rewards[stakeHolder]); } /** * @notice function that returns the remaining time in seconds of the staking period * @dev the higher is the precision and the more the time remaining will be precise * @param stakeHolder, address of the user to be checked * @return uint256 percentage of time remaining * precision */ function _percentageTimeRemaining(address stakeHolder) internal view returns (uint256) { uint256 startTime; uint256 timeRemaining; unchecked { if (endPeriod > block.timestamp) { if (startPeriod > userStartTime[stakeHolder]) { startTime = startPeriod; } else { startTime = userStartTime[stakeHolder]; } timeRemaining = stakingDuration - (block.timestamp - startTime); return (_precision * (stakingDuration - timeRemaining)) / stakingDuration; } else { if (startPeriod > userStartTime[stakeHolder]) { startTime = 0; } else { startTime = stakingDuration - (endPeriod - userStartTime[stakeHolder]); } return ((_precision * (stakingDuration - startTime)) / stakingDuration); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity 0.8.14; /** * @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.1 (utils/Context.sol) pragma solidity 0.8.14; /** * @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 (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity 0.8.14; import "./ERC1155Receiver.sol"; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity 0.8.14; import "./IERC1155Receiver.sol"; import "./ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity 0.8.14; 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.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity 0.8.14; import "./IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity 0.8.14; import "./IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol) pragma solidity 0.8.14; import "./IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity 0.8.14; /** * @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.1 (token/ERC20/IERC20.sol) pragma solidity 0.8.14; /** * @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.1 (token/ERC721/IERC721.sol) pragma solidity 0.8.14; 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.1 (token/ERC721/IERC721Receiver.sol) pragma solidity 0.8.14; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity 0.8.14; 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.1 (security/ReentrancyGuard.sol) pragma solidity 0.8.14; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity 0.8.14; import "./IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint16[]","name":"ids","type":"uint16[]"}],"name":"addBurnt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"burnNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burntCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"burntList","outputs":[{"internalType":"uint16[]","name":"ids","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coinBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"nftList","outputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint16[200]","name":"ownedList","type":"uint16[200]"}],"stateMutability":"view","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":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"stakeList","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken721","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnt","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStake","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userBurntBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userStakeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526001805460ff60a01b1916600160a01b178155600280546001600160401b0319166305a39a80179055600d80546001600160a01b031990811673594d888deb4c0c66f495f48f55c61faadf0f63d817909155600e805490911673c807f4b1bf8e79a9279acfcea5fa7a78e2c7d1791790556000556200008a620000843390565b62000090565b620000e2565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6139cc80620000f26000396000f3fe60806040526004361061019a5760003560e01c8063715018a6116100e157806397be7d4d1161008a578063d99b50b111610064578063d99b50b114610544578063e1fcd8a914610564578063f2fde38b1461059e578063fa6f4506146105be57600080fd5b806397be7d4d146104ed578063c4a9e1161461050d578063d26c8a8a1461052f57600080fd5b80638b0e9f3f116100bb5780638b0e9f3f146104775780638da5cb5b14610499578063966ff650146104cb57600080fd5b8063715018a6146104225780637a8da5301461043757806384bdcb091461045757600080fd5b80632bdcfe7211610143578063414c46951161011d578063414c46951461039c57806346b260ac146103bc5780635c975abb146103f157600080fd5b80632bdcfe72146103475780632f174144146103675780633d18b9121461038757600080fd5b8063150b7a0211610174578063150b7a021461027757806321130faf146102ec5780632a5fde401461031957600080fd5b8063018ea6d4146101e857806302329a2914610235578063081bc3f11461025757600080fd5b366101e3577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156101f457600080fd5b506102226102033660046134e5565b6001600160a01b031660009081526007602052604090205461ffff1690565b6040519081526020015b60405180910390f35b34801561024157600080fd5b50610255610250366004613510565b6105f4565b005b34801561026357600080fd5b50610255610272366004613614565b61077d565b34801561028357600080fd5b506102bb610292366004613651565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161022c565b3480156102f857600080fd5b5061030c6103073660046134e5565b611127565b60405161022c9190613715565b34801561032557600080fd5b506103396103343660046134e5565b6111bb565b60405161022c92919061375d565b34801561035357600080fd5b50610255610362366004613614565b61135c565b34801561037357600080fd5b5061030c6103823660046134e5565b6119fb565b34801561039357600080fd5b50610255611a69565b3480156103a857600080fd5b506102226103b73660046134e5565b611b1e565b3480156103c857600080fd5b506001546103de90600160d81b900461ffff1681565b60405161ffff909116815260200161022c565b3480156103fd57600080fd5b5060015461041290600160a01b900460ff1681565b604051901515815260200161022c565b34801561042e57600080fd5b50610255611b2f565b34801561044357600080fd5b5061025561045236600461379a565b611b95565b34801561046357600080fd5b50610255610472366004613614565b6125b9565b34801561048357600080fd5b506001546103de90600160a81b900461ffff1681565b3480156104a557600080fd5b506001546001600160a01b03165b6040516001600160a01b03909116815260200161022c565b3480156104d757600080fd5b506001546103de90600160b81b900461ffff1681565b3480156104f957600080fd5b50600e546104b3906001600160a01b031681565b34801561051957600080fd5b506001546103de90600160c81b900461ffff1681565b34801561053b57600080fd5b50610222612ba4565b34801561055057600080fd5b50600d546104b3906001600160a01b031681565b34801561057057600080fd5b5061022261057f3660046134e5565b6001600160a01b031660009081526008602052604090205461ffff1690565b3480156105aa57600080fd5b506102556105b93660046134e5565b612c16565b3480156105ca57600080fd5b506102226105d93660046134e5565b6001600160a01b031660009081526005602052604090205490565b6001546001600160a01b031633146106535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b80151560000361074457600e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ca919061385c565b116107175760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206d697373696e672072657761726420746f6b656e000000604482015260640161064a565b600354600003610744574260038190556002546107409167ffffffffffffffff90911690613875565b6004555b60018054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6002600054036107cf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161064a565b6002600090815580808080333b156108295760405162461bcd60e51b815260206004820152601560248201527f5374616b696e673a206e6f20636f6e7472616374730000000000000000000000604482015260640161064a565b610831612cf8565b336000908152600c60205260409020541561084b57600191505b8551600003610af257600094505b336000908152600c602052604090205461ffff86161015610ad557336000908152600c60205260409020805461ffff87169081106108995761089961389b565b60009182526020909120601082040154600f9091166002026101000a900461ffff1693508315610aca5761ffff8416600090815260096020526040902054336001600160a01b0390911603610aca5761ffff8481166000908152600960209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19169055600180547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff8116600160a81b918290048716600019018716909102179055338352600c909152812080549192909190881690811061097a5761097a61389b565b6000918252602090912060108204018054600f9092166002026101000a61ffff818102199093169383160292909217909155600d546040517f6352211e000000000000000000000000000000000000000000000000000000008152918616600483015230916001600160a01b0390911690636352211e90602401602060405180830381865afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3591906138b1565b6001600160a01b031603610aca57600d546040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015233602482015261ffff861660448201526001600160a01b03909116906342842e0e90606401600060405180830381600087803b158015610ab157600080fd5b505af1158015610ac5573d6000803e3d6000fd5b505050505b600185019450610859565b336000908152600860205260409020805461ffff19169055610ea7565b600094505b85518561ffff161015610ea757600093505b336000908152600c602052604090205461ffff85161015610e9c57858561ffff1681518110610b3a57610b3a61389b565b602002602001015161ffff16600c6000336001600160a01b03166001600160a01b031681526020019081526020016000208561ffff1681548110610b8057610b8061389b565b60009182526020909120601082040154600f9091166002026101000a900461ffff1603610e9157336001600160a01b031660096000888861ffff1681518110610bcb57610bcb61389b565b60209081029190910181015161ffff168252810191909152604001600020546001600160a01b031603610e9157600060096000888861ffff1681518110610c1457610c1461389b565b60209081029190910181015161ffff90811683528282019390935260409182016000908120805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039690961695909517909455600180547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff8116600160a81b91829004861660001990810187169092021790915533855260088252828520805461ffff1981169086169092018516919091179055600c90528220805490918716908110610ce157610ce161389b565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550306001600160a01b0316600d60009054906101000a90046001600160a01b03166001600160a01b0316636352211e888861ffff1681518110610d5457610d5461389b565b60200260200101516040518263ffffffff1660e01b8152600401610d82919061ffff91909116815260200190565b602060405180830381865afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc391906138b1565b6001600160a01b031603610e9157600d5486516001600160a01b03909116906342842e0e90309033908a9061ffff8b16908110610e0257610e0261389b565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505050505b600184019350610b09565b600185019450610af7565b5060005b8015156000036110b457600094505b336000908152600c602052604090205461ffff8616101561109f57336000908152600c60205260408120549093506001101561104957336000908152600c60205260409020805461ffff8716908110610f1557610f1561389b565b600091825260208220601082040154600f9091166002026101000a900461ffff16900361104457336000908152600c6020526040902080546000198101908110610f6157610f6161389b565b60009182526020808320601083040154338452600c90915260409092208054600f9092166002026101000a90920461ffff9081169291908816908110610fa957610fa961389b565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600c6000336001600160a01b03166001600160a01b0316815260200190815260200160002080548061100c5761100c6138ce565b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a021916905590556001929092019161109f565b611094565b336000908152600c60205260409020805480611067576110676138ce565b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a021916905590555b600185019450610eba565b8261ffff166000036110af575060015b610eab565b60018215151480156110d35750336000908152600c6020526040902054155b1561111a576001805460001961ffff600160c81b80840482169290920116027fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b5050600160005550505050565b6001600160a01b0381166000908152600c60209081526040918290208054835181840281018401909452808452606093928301828280156111af57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116111765790505b50505050509050919050565b60006111c56134b1565b6000806000806111d36134b1565b600d546040516370a0823160e01b81526001600160a01b038a81166004830152909116906370a0823190602401602060405180830381865afa15801561121d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611241919061385c565b9150600094505b611e618561ffff161161134f57600d546040517f6352211e00000000000000000000000000000000000000000000000000000000815261ffff871660048201526001600160a01b0390911690636352211e90602401602060405180830381865afa1580156112ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112de91906138b1565b9250876001600160a01b0316836001600160a01b0316036113445784818561ffff1660c881106113105761131061389b565b602002019061ffff16908161ffff1681525050600184019350818461ffff16148061133f57508361ffff1660c8145b61134f575b600185019450611248565b9097909650945050505050565b6002600054036113ae5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161064a565b6002600090815580333b156114055760405162461bcd60e51b815260206004820152601560248201527f5374616b696e673a206e6f20636f6e7472616374730000000000000000000000604482015260640161064a565b600154600160a01b900460ff161561145f5760405162461bcd60e51b815260206004820152601260248201527f5374616b696e673a206973207061757365640000000000000000000000000000604482015260640161064a565b82516000036114b05760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a204e6f20746f6b656e4964732070726f7669646564000000604482015260640161064a565b600d546040517fe985e9c50000000000000000000000000000000000000000000000000000000081523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b91906138e4565b15156001146115d85760405162461bcd60e51b815260206004820152604160248201527f5374616b696e673a204669727374206d75737420736574417070726f76616c4660448201527f6f72416c6c20696e20746865204e465420746f207468697320636f6e7472616360648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a40161064a565b336000908152600c602052604081205490036115f2575060015b60005b83518161ffff16101561190f576000848261ffff168151811061161a5761161a61389b565b602002602001015161ffff16116116735760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20646f6573206e6f7420737570706f727420696420300000604482015260640161064a565b600d54845133916001600160a01b031690636352211e90879061ffff86169081106116a0576116a061389b565b60200260200101516040518263ffffffff1660e01b81526004016116ce919061ffff91909116815260200190565b602060405180830381865afa1580156116eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170f91906138b1565b6001600160a01b0316146117655760405162461bcd60e51b815260206004820152601960248201527f5374616b696e673a206e6f74206f776e6572206f66204e465400000000000000604482015260640161064a565b6001830192503360096000868461ffff16815181106117865761178661389b565b602002602001015161ffff1661ffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c6000336001600160a01b03166001600160a01b03168152602001908152602001600020848261ffff16815181106118035761180361389b565b602090810291909101810151825460018101845560009384529190922060108204018054600f9092166002026101000a61ffff818102199093169383160292909217909155600d5485516001600160a01b03909116916323b872dd9133913091899187169081106118765761187661389b565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b1580156118ec57600080fd5b505af1158015611900573d6000803e3d6000fd5b505050506001810190506115f5565b5060008261ffff1611801561192657506001811515145b1561196a576001805461ffff600160c81b80830482168401909116027fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b336000908152600860209081526040808320805461ffff19811661ffff9182168801821617909155600180547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff8116600160a81b918290048416890190931602919091179055600590915281205490036119f1573360009081526005602052604090204290555b5050600160005550565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156111af576000918252602091829020805461ffff168452908202830192909160029101808411611176575094979650505050505050565b600260005403611abb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161064a565b6002600055333b15611b0f5760405162461bcd60e51b815260206004820152601560248201527f5374616b696e673a204e6f20636f6e7472616374730000000000000000000000604482015260640161064a565b611b17612cf8565b6001600055565b6000611b2982612e2c565b92915050565b6001546001600160a01b03163314611b895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064a565b611b936000612ff6565b565b6001546001600160a01b03163314611bef5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064a565b60008060008060008551875114611c945760405162461bcd60e51b815260206004820152604260248201527f5374616b696e673a20546865206e756d626572206f662061646472657373657360448201527f206973206e6f74206d61746368696e6720746865206e756d626572206f66206960648201527f6473000000000000000000000000000000000000000000000000000000000000608482015260a40161064a565b600094505b86518561ffff1610156125b05760009050600b6000888761ffff1681518110611cc457611cc461389b565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002080549050600003611cfc57600191505b600d5486516001600160a01b0390911690636352211e90889061ffff8916908110611d2957611d2961389b565b60200260200101516040518263ffffffff1660e01b8152600401611d57919061ffff91909116815260200190565b602060405180830381865afa158015611d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9891906138b1565b6001600160a01b031661dead6001600160a01b03161480611e5d5750600d5486516001600160a01b03909116908190636352211e90899061ffff8a16908110611de357611de361389b565b60200260200101516040518263ffffffff1660e01b8152600401611e11919061ffff91909116815260200190565b602060405180830381865afa158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5291906138b1565b6001600160a01b0316145b611ea95760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e673a204e4654206d757374206265206275726e74000000000000604482015260640161064a565b868561ffff1681518110611ebf57611ebf61389b565b60200260200101516001600160a01b0316600a6000888861ffff1681518110611eea57611eea61389b565b60209081029190910181015161ffff168252810191909152604001600020546001600160a01b0316146125a55760006001600160a01b0316600a6000888861ffff1681518110611f3c57611f3c61389b565b60209081029190910181015161ffff168252810191909152604001600020546001600160a01b03160361215757868561ffff1681518110611f7f57611f7f61389b565b6020026020010151600a6000888861ffff1681518110611fa157611fa161389b565b602002602001015161ffff1661ffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b6000888761ffff1681518110611ffd57611ffd61389b565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020868661ffff168151811061203b5761203b61389b565b602002602001015190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff160217905550600160076000898861ffff16815181106120a6576120a661389b565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff808216909301831661ffff1990911617905560018054600160b81b808204841683019093169092027fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff9092169190911781558215159003612152576001805461ffff600160d81b808304821684019091160261ffff60d81b19909116179055600091505b6125a5565b868561ffff168151811061216d5761216d61389b565b60200260200101516001600160a01b0316600a6000888861ffff16815181106121985761219861389b565b60209081029190910181015161ffff168252810191909152604001600020546001600160a01b0316146125a557600a6000878761ffff16815181106121df576121df61389b565b60209081029190910181015161ffff1682528101919091526040016000908120549094506001600160a01b031692505b6001600160a01b0383166000908152600b602052604090205461ffff8516101561241157858561ffff16815181106122495761224961389b565b602002602001015161ffff16600b6000856001600160a01b03166001600160a01b031681526020019081526020016000208561ffff168154811061228f5761228f61389b565b60009182526020909120601082040154600f9091166002026101000a900461ffff1603612406576001600160a01b0383166000908152600b60205260409020805460001981019081106122e4576122e461389b565b90600052602060002090601091828204019190066002029054906101000a900461ffff16600b6000856001600160a01b03166001600160a01b031681526020019081526020016000208561ffff16815481106123425761234261389b565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600b6000846001600160a01b03166001600160a01b031681526020019081526020016000208054806123a5576123a56138ce565b600082815260208082206010600019948501908104909101805461ffff6002600f8516026101000a81021990911690915594556001600160a01b03871682526007905260409020805480841690920190921661ffff19909116179055612411565b60019093019261220f565b868561ffff16815181106124275761242761389b565b6020026020010151600a6000888861ffff16815181106124495761244961389b565b602002602001015161ffff1661ffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b6000888761ffff16815181106124a5576124a561389b565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020868661ffff16815181106124e3576124e361389b565b6020908102919091018101518254600181810185556000948552929093206010840401805461ffff9283166002600f909616959095026101000a948502929094021990931617909155821515900361255e576001805461ffff600160d81b808304821684019091160261ffff60d81b19909116179055600091505b6001600160a01b0383166000908152600b602052604081205490036125a5576001805460001961ffff600160d81b808404821692909201160261ffff60d81b199091161790555b600190940193611c99565b50505050505050565b60026000540361260b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161064a565b6002600090815580333b156126625760405162461bcd60e51b815260206004820152601560248201527f5374616b696e673a206e6f20636f6e7472616374730000000000000000000000604482015260640161064a565b600154600160a01b900460ff16156126bc5760405162461bcd60e51b815260206004820152601260248201527f5374616b696e673a206973207061757365640000000000000000000000000000604482015260640161064a565b825160000361270d5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a204e6f20746f6b656e4964732070726f7669646564000000604482015260640161064a565b600d546040517fe985e9c50000000000000000000000000000000000000000000000000000000081523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279891906138e4565b15156001146128355760405162461bcd60e51b815260206004820152604160248201527f5374616b696e673a204669727374206d75737420736574417070726f76616c4660448201527f6f72416c6c20696e20746865204e465420746f207468697320636f6e7472616360648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a40161064a565b336000908152600b6020526040812054900361284f575060015b60005b83518161ffff161015612afd57600d54845133916001600160a01b031690636352211e90879061ffff861690811061288c5761288c61389b565b60200260200101516040518263ffffffff1660e01b81526004016128ba919061ffff91909116815260200190565b602060405180830381865afa1580156128d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fb91906138b1565b6001600160a01b0316146129515760405162461bcd60e51b815260206004820152601960248201527f5374616b696e673a206e6f74206f776e6572206f66204e465400000000000000604482015260640161064a565b60018301925033600a6000868461ffff16815181106129725761297261389b565b602002602001015161ffff1661ffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b6000336001600160a01b03166001600160a01b03168152602001908152602001600020848261ffff16815181106129ef576129ef61389b565b602090810291909101810151825460018101845560009384529190922060108204018054600f9092166002026101000a61ffff818102199093169383160292909217909155600d5485516001600160a01b03909116916323b872dd91339161dead9189918716908110612a6457612a6461389b565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b158015612ada57600080fd5b505af1158015612aee573d6000803e3d6000fd5b50505050600181019050612852565b50336000908152600760205260409020805461ffff19811661ffff9182168501821617909155600180547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff8116600160b81b91829004841686018416909102179055821615801590612b7157506001811515145b156119f1576001805461ffff600160d81b808304821684019091160261ffff60d81b199091161790555050600160005550565b600e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c11919061385c565b905090565b6001546001600160a01b03163314612c705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064a565b6001600160a01b038116612cec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161064a565b612cf581612ff6565b50565b6000612d02613055565b50336000908152600660205260409081902054600e5491516370a0823160e01b815230600482015290916001600160a01b0316906370a0823190602401602060405180830381865afa158015612d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d80919061385c565b811115612df657600e546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df3919061385c565b90505b8015612e1357600e54612e13906001600160a01b031633836130a0565b3360009081526006602052604090208054919091039055565b6001600160a01b0381166000908152600860205260408120548190819081908190819081908190819081908190819061ffff161580612e8557506001600160a01b038d1660009081526007602052604090205461ffff16155b80612e905750600354155b15612e9e5760009a50612fc2565b600154670de0b6b3a764000061ffff600160c81b83048116600160a81b8404821603811682029c50600160d81b83048116600160b81b9093048116929092039091169081029950600490674563918244f4000002048a01975087600003612f0457600197505b87700688663a04e6a4856fedaa3bf00000000081612f2457612f24613901565b6001600160a01b038f1660009081526007602090815260408083205460089092529091205460025493909204995060001961ffff918216810182169950670de0b6b3a7640000928216808b0184029950011695506004600589020494508486018902935083870161016d029250906301e1338067ffffffffffffffff9182160416612fae8f613125565b83020281612fbe57612fbe613901565b049a505b6001600160a01b038d16600090815260066020526040902054612fe5908c613875565b9d9c50505050505050505050505050565b600180546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61305e33612e2c565b33600090815260066020526040902055600454421061308c5760045433600090815260056020526040902055565b336000908152600560205260409020429055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261312090849061323b565b505050565b60008060004260045411156131b7576001600160a01b038416600090815260056020526040902054600354111561316057600354915061317c565b6001600160a01b03841660009081526005602052604090205491505b506002544282900367ffffffffffffffff90911690810390670de0b6b3a764000082820302816131ae576131ae613901565b04949350505050565b6001600160a01b03841660009081526005602052604090205460035411156131e25760009150613214565b6001600160a01b03841660009081526005602052604090205460045460025491900367ffffffffffffffff9091160391505b60025467ffffffffffffffff16670de0b6b3a764000083820302816131ae576131ae613901565b6000613290826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133209092919063ffffffff16565b80519091501561312057808060200190518101906132ae91906138e4565b6131205760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161064a565b606061332f8484600085613339565b90505b9392505050565b6060824710156133b15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161064a565b843b6133ff5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161064a565b600080866001600160a01b0316858760405161341b9190613947565b60006040518083038185875af1925050503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915061346d828286613478565b979650505050505050565b60608315613487575081613332565b8251156134975782518084602001fd5b8160405162461bcd60e51b815260040161064a9190613963565b60405180611900016040528060c8906020820280368337509192915050565b6001600160a01b0381168114612cf557600080fd5b6000602082840312156134f757600080fd5b8135613332816134d0565b8015158114612cf557600080fd5b60006020828403121561352257600080fd5b813561333281613502565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561356c5761356c61352d565b604052919050565b600067ffffffffffffffff82111561358e5761358e61352d565b5060051b60200190565b600082601f8301126135a957600080fd5b813560206135be6135b983613574565b613543565b82815260059290921b840181019181810190868411156135dd57600080fd5b8286015b8481101561360957803561ffff811681146135fc5760008081fd5b83529183019183016135e1565b509695505050505050565b60006020828403121561362657600080fd5b813567ffffffffffffffff81111561363d57600080fd5b61364984828501613598565b949350505050565b6000806000806080858703121561366757600080fd5b8435613672816134d0565b9350602085810135613683816134d0565b935060408601359250606086013567ffffffffffffffff808211156136a757600080fd5b818801915088601f8301126136bb57600080fd5b8135818111156136cd576136cd61352d565b6136df84601f19601f84011601613543565b915080825289848285010111156136f557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6020808252825182820181905260009190848201906040850190845b8181101561375157835161ffff1683529284019291840191600101613731565b50909695505050505050565b828152611920810160208083018460005b60c881101561378f57815161ffff168352918301919083019060010161376e565b505050509392505050565b600080604083850312156137ad57600080fd5b823567ffffffffffffffff808211156137c557600080fd5b818501915085601f8301126137d957600080fd5b813560206137e96135b983613574565b82815260059290921b8401810191818101908984111561380857600080fd5b948201945b8386101561382f578535613820816134d0565b8252948201949082019061380d565b9650508601359250508082111561384557600080fd5b5061385285828601613598565b9150509250929050565b60006020828403121561386e57600080fd5b5051919050565b6000821982111561389657634e487b7160e01b600052601160045260246000fd5b500190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156138c357600080fd5b8151613332816134d0565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156138f657600080fd5b815161333281613502565b634e487b7160e01b600052601260045260246000fd5b60005b8381101561393257818101518382015260200161391a565b83811115613941576000848401525b50505050565b60008251613959818460208701613917565b9190910192915050565b6020815260008251806020840152613982816040850160208701613917565b601f01601f1916919091016040019291505056fea26469706673582212200ccfe33d7e13b15ceaa260fcbc58e0244e4a739d9a0a38560a3b101a67d5e5da64736f6c634300080e0033
Deployed Bytecode
0x60806040526004361061019a5760003560e01c8063715018a6116100e157806397be7d4d1161008a578063d99b50b111610064578063d99b50b114610544578063e1fcd8a914610564578063f2fde38b1461059e578063fa6f4506146105be57600080fd5b806397be7d4d146104ed578063c4a9e1161461050d578063d26c8a8a1461052f57600080fd5b80638b0e9f3f116100bb5780638b0e9f3f146104775780638da5cb5b14610499578063966ff650146104cb57600080fd5b8063715018a6146104225780637a8da5301461043757806384bdcb091461045757600080fd5b80632bdcfe7211610143578063414c46951161011d578063414c46951461039c57806346b260ac146103bc5780635c975abb146103f157600080fd5b80632bdcfe72146103475780632f174144146103675780633d18b9121461038757600080fd5b8063150b7a0211610174578063150b7a021461027757806321130faf146102ec5780632a5fde401461031957600080fd5b8063018ea6d4146101e857806302329a2914610235578063081bc3f11461025757600080fd5b366101e3577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156101f457600080fd5b506102226102033660046134e5565b6001600160a01b031660009081526007602052604090205461ffff1690565b6040519081526020015b60405180910390f35b34801561024157600080fd5b50610255610250366004613510565b6105f4565b005b34801561026357600080fd5b50610255610272366004613614565b61077d565b34801561028357600080fd5b506102bb610292366004613651565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161022c565b3480156102f857600080fd5b5061030c6103073660046134e5565b611127565b60405161022c9190613715565b34801561032557600080fd5b506103396103343660046134e5565b6111bb565b60405161022c92919061375d565b34801561035357600080fd5b50610255610362366004613614565b61135c565b34801561037357600080fd5b5061030c6103823660046134e5565b6119fb565b34801561039357600080fd5b50610255611a69565b3480156103a857600080fd5b506102226103b73660046134e5565b611b1e565b3480156103c857600080fd5b506001546103de90600160d81b900461ffff1681565b60405161ffff909116815260200161022c565b3480156103fd57600080fd5b5060015461041290600160a01b900460ff1681565b604051901515815260200161022c565b34801561042e57600080fd5b50610255611b2f565b34801561044357600080fd5b5061025561045236600461379a565b611b95565b34801561046357600080fd5b50610255610472366004613614565b6125b9565b34801561048357600080fd5b506001546103de90600160a81b900461ffff1681565b3480156104a557600080fd5b506001546001600160a01b03165b6040516001600160a01b03909116815260200161022c565b3480156104d757600080fd5b506001546103de90600160b81b900461ffff1681565b3480156104f957600080fd5b50600e546104b3906001600160a01b031681565b34801561051957600080fd5b506001546103de90600160c81b900461ffff1681565b34801561053b57600080fd5b50610222612ba4565b34801561055057600080fd5b50600d546104b3906001600160a01b031681565b34801561057057600080fd5b5061022261057f3660046134e5565b6001600160a01b031660009081526008602052604090205461ffff1690565b3480156105aa57600080fd5b506102556105b93660046134e5565b612c16565b3480156105ca57600080fd5b506102226105d93660046134e5565b6001600160a01b031660009081526005602052604090205490565b6001546001600160a01b031633146106535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b80151560000361074457600e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ca919061385c565b116107175760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206d697373696e672072657761726420746f6b656e000000604482015260640161064a565b600354600003610744574260038190556002546107409167ffffffffffffffff90911690613875565b6004555b60018054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6002600054036107cf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161064a565b6002600090815580808080333b156108295760405162461bcd60e51b815260206004820152601560248201527f5374616b696e673a206e6f20636f6e7472616374730000000000000000000000604482015260640161064a565b610831612cf8565b336000908152600c60205260409020541561084b57600191505b8551600003610af257600094505b336000908152600c602052604090205461ffff86161015610ad557336000908152600c60205260409020805461ffff87169081106108995761089961389b565b60009182526020909120601082040154600f9091166002026101000a900461ffff1693508315610aca5761ffff8416600090815260096020526040902054336001600160a01b0390911603610aca5761ffff8481166000908152600960209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19169055600180547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff8116600160a81b918290048716600019018716909102179055338352600c909152812080549192909190881690811061097a5761097a61389b565b6000918252602090912060108204018054600f9092166002026101000a61ffff818102199093169383160292909217909155600d546040517f6352211e000000000000000000000000000000000000000000000000000000008152918616600483015230916001600160a01b0390911690636352211e90602401602060405180830381865afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3591906138b1565b6001600160a01b031603610aca57600d546040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015233602482015261ffff861660448201526001600160a01b03909116906342842e0e90606401600060405180830381600087803b158015610ab157600080fd5b505af1158015610ac5573d6000803e3d6000fd5b505050505b600185019450610859565b336000908152600860205260409020805461ffff19169055610ea7565b600094505b85518561ffff161015610ea757600093505b336000908152600c602052604090205461ffff85161015610e9c57858561ffff1681518110610b3a57610b3a61389b565b602002602001015161ffff16600c6000336001600160a01b03166001600160a01b031681526020019081526020016000208561ffff1681548110610b8057610b8061389b565b60009182526020909120601082040154600f9091166002026101000a900461ffff1603610e9157336001600160a01b031660096000888861ffff1681518110610bcb57610bcb61389b565b60209081029190910181015161ffff168252810191909152604001600020546001600160a01b031603610e9157600060096000888861ffff1681518110610c1457610c1461389b565b60209081029190910181015161ffff90811683528282019390935260409182016000908120805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039690961695909517909455600180547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff8116600160a81b91829004861660001990810187169092021790915533855260088252828520805461ffff1981169086169092018516919091179055600c90528220805490918716908110610ce157610ce161389b565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550306001600160a01b0316600d60009054906101000a90046001600160a01b03166001600160a01b0316636352211e888861ffff1681518110610d5457610d5461389b565b60200260200101516040518263ffffffff1660e01b8152600401610d82919061ffff91909116815260200190565b602060405180830381865afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc391906138b1565b6001600160a01b031603610e9157600d5486516001600160a01b03909116906342842e0e90309033908a9061ffff8b16908110610e0257610e0261389b565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505050505b600184019350610b09565b600185019450610af7565b5060005b8015156000036110b457600094505b336000908152600c602052604090205461ffff8616101561109f57336000908152600c60205260408120549093506001101561104957336000908152600c60205260409020805461ffff8716908110610f1557610f1561389b565b600091825260208220601082040154600f9091166002026101000a900461ffff16900361104457336000908152600c6020526040902080546000198101908110610f6157610f6161389b565b60009182526020808320601083040154338452600c90915260409092208054600f9092166002026101000a90920461ffff9081169291908816908110610fa957610fa961389b565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600c6000336001600160a01b03166001600160a01b0316815260200190815260200160002080548061100c5761100c6138ce565b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a021916905590556001929092019161109f565b611094565b336000908152600c60205260409020805480611067576110676138ce565b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a021916905590555b600185019450610eba565b8261ffff166000036110af575060015b610eab565b60018215151480156110d35750336000908152600c6020526040902054155b1561111a576001805460001961ffff600160c81b80840482169290920116027fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b5050600160005550505050565b6001600160a01b0381166000908152600c60209081526040918290208054835181840281018401909452808452606093928301828280156111af57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116111765790505b50505050509050919050565b60006111c56134b1565b6000806000806111d36134b1565b600d546040516370a0823160e01b81526001600160a01b038a81166004830152909116906370a0823190602401602060405180830381865afa15801561121d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611241919061385c565b9150600094505b611e618561ffff161161134f57600d546040517f6352211e00000000000000000000000000000000000000000000000000000000815261ffff871660048201526001600160a01b0390911690636352211e90602401602060405180830381865afa1580156112ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112de91906138b1565b9250876001600160a01b0316836001600160a01b0316036113445784818561ffff1660c881106113105761131061389b565b602002019061ffff16908161ffff1681525050600184019350818461ffff16148061133f57508361ffff1660c8145b61134f575b600185019450611248565b9097909650945050505050565b6002600054036113ae5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161064a565b6002600090815580333b156114055760405162461bcd60e51b815260206004820152601560248201527f5374616b696e673a206e6f20636f6e7472616374730000000000000000000000604482015260640161064a565b600154600160a01b900460ff161561145f5760405162461bcd60e51b815260206004820152601260248201527f5374616b696e673a206973207061757365640000000000000000000000000000604482015260640161064a565b82516000036114b05760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a204e6f20746f6b656e4964732070726f7669646564000000604482015260640161064a565b600d546040517fe985e9c50000000000000000000000000000000000000000000000000000000081523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b91906138e4565b15156001146115d85760405162461bcd60e51b815260206004820152604160248201527f5374616b696e673a204669727374206d75737420736574417070726f76616c4660448201527f6f72416c6c20696e20746865204e465420746f207468697320636f6e7472616360648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a40161064a565b336000908152600c602052604081205490036115f2575060015b60005b83518161ffff16101561190f576000848261ffff168151811061161a5761161a61389b565b602002602001015161ffff16116116735760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20646f6573206e6f7420737570706f727420696420300000604482015260640161064a565b600d54845133916001600160a01b031690636352211e90879061ffff86169081106116a0576116a061389b565b60200260200101516040518263ffffffff1660e01b81526004016116ce919061ffff91909116815260200190565b602060405180830381865afa1580156116eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170f91906138b1565b6001600160a01b0316146117655760405162461bcd60e51b815260206004820152601960248201527f5374616b696e673a206e6f74206f776e6572206f66204e465400000000000000604482015260640161064a565b6001830192503360096000868461ffff16815181106117865761178661389b565b602002602001015161ffff1661ffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c6000336001600160a01b03166001600160a01b03168152602001908152602001600020848261ffff16815181106118035761180361389b565b602090810291909101810151825460018101845560009384529190922060108204018054600f9092166002026101000a61ffff818102199093169383160292909217909155600d5485516001600160a01b03909116916323b872dd9133913091899187169081106118765761187661389b565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b1580156118ec57600080fd5b505af1158015611900573d6000803e3d6000fd5b505050506001810190506115f5565b5060008261ffff1611801561192657506001811515145b1561196a576001805461ffff600160c81b80830482168401909116027fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b336000908152600860209081526040808320805461ffff19811661ffff9182168801821617909155600180547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff8116600160a81b918290048416890190931602919091179055600590915281205490036119f1573360009081526005602052604090204290555b5050600160005550565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156111af576000918252602091829020805461ffff168452908202830192909160029101808411611176575094979650505050505050565b600260005403611abb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161064a565b6002600055333b15611b0f5760405162461bcd60e51b815260206004820152601560248201527f5374616b696e673a204e6f20636f6e7472616374730000000000000000000000604482015260640161064a565b611b17612cf8565b6001600055565b6000611b2982612e2c565b92915050565b6001546001600160a01b03163314611b895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064a565b611b936000612ff6565b565b6001546001600160a01b03163314611bef5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064a565b60008060008060008551875114611c945760405162461bcd60e51b815260206004820152604260248201527f5374616b696e673a20546865206e756d626572206f662061646472657373657360448201527f206973206e6f74206d61746368696e6720746865206e756d626572206f66206960648201527f6473000000000000000000000000000000000000000000000000000000000000608482015260a40161064a565b600094505b86518561ffff1610156125b05760009050600b6000888761ffff1681518110611cc457611cc461389b565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002080549050600003611cfc57600191505b600d5486516001600160a01b0390911690636352211e90889061ffff8916908110611d2957611d2961389b565b60200260200101516040518263ffffffff1660e01b8152600401611d57919061ffff91909116815260200190565b602060405180830381865afa158015611d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9891906138b1565b6001600160a01b031661dead6001600160a01b03161480611e5d5750600d5486516001600160a01b03909116908190636352211e90899061ffff8a16908110611de357611de361389b565b60200260200101516040518263ffffffff1660e01b8152600401611e11919061ffff91909116815260200190565b602060405180830381865afa158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5291906138b1565b6001600160a01b0316145b611ea95760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e673a204e4654206d757374206265206275726e74000000000000604482015260640161064a565b868561ffff1681518110611ebf57611ebf61389b565b60200260200101516001600160a01b0316600a6000888861ffff1681518110611eea57611eea61389b565b60209081029190910181015161ffff168252810191909152604001600020546001600160a01b0316146125a55760006001600160a01b0316600a6000888861ffff1681518110611f3c57611f3c61389b565b60209081029190910181015161ffff168252810191909152604001600020546001600160a01b03160361215757868561ffff1681518110611f7f57611f7f61389b565b6020026020010151600a6000888861ffff1681518110611fa157611fa161389b565b602002602001015161ffff1661ffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b6000888761ffff1681518110611ffd57611ffd61389b565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020868661ffff168151811061203b5761203b61389b565b602002602001015190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff160217905550600160076000898861ffff16815181106120a6576120a661389b565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff808216909301831661ffff1990911617905560018054600160b81b808204841683019093169092027fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff9092169190911781558215159003612152576001805461ffff600160d81b808304821684019091160261ffff60d81b19909116179055600091505b6125a5565b868561ffff168151811061216d5761216d61389b565b60200260200101516001600160a01b0316600a6000888861ffff16815181106121985761219861389b565b60209081029190910181015161ffff168252810191909152604001600020546001600160a01b0316146125a557600a6000878761ffff16815181106121df576121df61389b565b60209081029190910181015161ffff1682528101919091526040016000908120549094506001600160a01b031692505b6001600160a01b0383166000908152600b602052604090205461ffff8516101561241157858561ffff16815181106122495761224961389b565b602002602001015161ffff16600b6000856001600160a01b03166001600160a01b031681526020019081526020016000208561ffff168154811061228f5761228f61389b565b60009182526020909120601082040154600f9091166002026101000a900461ffff1603612406576001600160a01b0383166000908152600b60205260409020805460001981019081106122e4576122e461389b565b90600052602060002090601091828204019190066002029054906101000a900461ffff16600b6000856001600160a01b03166001600160a01b031681526020019081526020016000208561ffff16815481106123425761234261389b565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600b6000846001600160a01b03166001600160a01b031681526020019081526020016000208054806123a5576123a56138ce565b600082815260208082206010600019948501908104909101805461ffff6002600f8516026101000a81021990911690915594556001600160a01b03871682526007905260409020805480841690920190921661ffff19909116179055612411565b60019093019261220f565b868561ffff16815181106124275761242761389b565b6020026020010151600a6000888861ffff16815181106124495761244961389b565b602002602001015161ffff1661ffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b6000888761ffff16815181106124a5576124a561389b565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020868661ffff16815181106124e3576124e361389b565b6020908102919091018101518254600181810185556000948552929093206010840401805461ffff9283166002600f909616959095026101000a948502929094021990931617909155821515900361255e576001805461ffff600160d81b808304821684019091160261ffff60d81b19909116179055600091505b6001600160a01b0383166000908152600b602052604081205490036125a5576001805460001961ffff600160d81b808404821692909201160261ffff60d81b199091161790555b600190940193611c99565b50505050505050565b60026000540361260b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161064a565b6002600090815580333b156126625760405162461bcd60e51b815260206004820152601560248201527f5374616b696e673a206e6f20636f6e7472616374730000000000000000000000604482015260640161064a565b600154600160a01b900460ff16156126bc5760405162461bcd60e51b815260206004820152601260248201527f5374616b696e673a206973207061757365640000000000000000000000000000604482015260640161064a565b825160000361270d5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a204e6f20746f6b656e4964732070726f7669646564000000604482015260640161064a565b600d546040517fe985e9c50000000000000000000000000000000000000000000000000000000081523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279891906138e4565b15156001146128355760405162461bcd60e51b815260206004820152604160248201527f5374616b696e673a204669727374206d75737420736574417070726f76616c4660448201527f6f72416c6c20696e20746865204e465420746f207468697320636f6e7472616360648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a40161064a565b336000908152600b6020526040812054900361284f575060015b60005b83518161ffff161015612afd57600d54845133916001600160a01b031690636352211e90879061ffff861690811061288c5761288c61389b565b60200260200101516040518263ffffffff1660e01b81526004016128ba919061ffff91909116815260200190565b602060405180830381865afa1580156128d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fb91906138b1565b6001600160a01b0316146129515760405162461bcd60e51b815260206004820152601960248201527f5374616b696e673a206e6f74206f776e6572206f66204e465400000000000000604482015260640161064a565b60018301925033600a6000868461ffff16815181106129725761297261389b565b602002602001015161ffff1661ffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b6000336001600160a01b03166001600160a01b03168152602001908152602001600020848261ffff16815181106129ef576129ef61389b565b602090810291909101810151825460018101845560009384529190922060108204018054600f9092166002026101000a61ffff818102199093169383160292909217909155600d5485516001600160a01b03909116916323b872dd91339161dead9189918716908110612a6457612a6461389b565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b158015612ada57600080fd5b505af1158015612aee573d6000803e3d6000fd5b50505050600181019050612852565b50336000908152600760205260409020805461ffff19811661ffff9182168501821617909155600180547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff8116600160b81b91829004841686018416909102179055821615801590612b7157506001811515145b156119f1576001805461ffff600160d81b808304821684019091160261ffff60d81b199091161790555050600160005550565b600e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c11919061385c565b905090565b6001546001600160a01b03163314612c705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064a565b6001600160a01b038116612cec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161064a565b612cf581612ff6565b50565b6000612d02613055565b50336000908152600660205260409081902054600e5491516370a0823160e01b815230600482015290916001600160a01b0316906370a0823190602401602060405180830381865afa158015612d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d80919061385c565b811115612df657600e546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df3919061385c565b90505b8015612e1357600e54612e13906001600160a01b031633836130a0565b3360009081526006602052604090208054919091039055565b6001600160a01b0381166000908152600860205260408120548190819081908190819081908190819081908190819061ffff161580612e8557506001600160a01b038d1660009081526007602052604090205461ffff16155b80612e905750600354155b15612e9e5760009a50612fc2565b600154670de0b6b3a764000061ffff600160c81b83048116600160a81b8404821603811682029c50600160d81b83048116600160b81b9093048116929092039091169081029950600490674563918244f4000002048a01975087600003612f0457600197505b87700688663a04e6a4856fedaa3bf00000000081612f2457612f24613901565b6001600160a01b038f1660009081526007602090815260408083205460089092529091205460025493909204995060001961ffff918216810182169950670de0b6b3a7640000928216808b0184029950011695506004600589020494508486018902935083870161016d029250906301e1338067ffffffffffffffff9182160416612fae8f613125565b83020281612fbe57612fbe613901565b049a505b6001600160a01b038d16600090815260066020526040902054612fe5908c613875565b9d9c50505050505050505050505050565b600180546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61305e33612e2c565b33600090815260066020526040902055600454421061308c5760045433600090815260056020526040902055565b336000908152600560205260409020429055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261312090849061323b565b505050565b60008060004260045411156131b7576001600160a01b038416600090815260056020526040902054600354111561316057600354915061317c565b6001600160a01b03841660009081526005602052604090205491505b506002544282900367ffffffffffffffff90911690810390670de0b6b3a764000082820302816131ae576131ae613901565b04949350505050565b6001600160a01b03841660009081526005602052604090205460035411156131e25760009150613214565b6001600160a01b03841660009081526005602052604090205460045460025491900367ffffffffffffffff9091160391505b60025467ffffffffffffffff16670de0b6b3a764000083820302816131ae576131ae613901565b6000613290826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133209092919063ffffffff16565b80519091501561312057808060200190518101906132ae91906138e4565b6131205760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161064a565b606061332f8484600085613339565b90505b9392505050565b6060824710156133b15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161064a565b843b6133ff5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161064a565b600080866001600160a01b0316858760405161341b9190613947565b60006040518083038185875af1925050503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915061346d828286613478565b979650505050505050565b60608315613487575081613332565b8251156134975782518084602001fd5b8160405162461bcd60e51b815260040161064a9190613963565b60405180611900016040528060c8906020820280368337509192915050565b6001600160a01b0381168114612cf557600080fd5b6000602082840312156134f757600080fd5b8135613332816134d0565b8015158114612cf557600080fd5b60006020828403121561352257600080fd5b813561333281613502565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561356c5761356c61352d565b604052919050565b600067ffffffffffffffff82111561358e5761358e61352d565b5060051b60200190565b600082601f8301126135a957600080fd5b813560206135be6135b983613574565b613543565b82815260059290921b840181019181810190868411156135dd57600080fd5b8286015b8481101561360957803561ffff811681146135fc5760008081fd5b83529183019183016135e1565b509695505050505050565b60006020828403121561362657600080fd5b813567ffffffffffffffff81111561363d57600080fd5b61364984828501613598565b949350505050565b6000806000806080858703121561366757600080fd5b8435613672816134d0565b9350602085810135613683816134d0565b935060408601359250606086013567ffffffffffffffff808211156136a757600080fd5b818801915088601f8301126136bb57600080fd5b8135818111156136cd576136cd61352d565b6136df84601f19601f84011601613543565b915080825289848285010111156136f557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6020808252825182820181905260009190848201906040850190845b8181101561375157835161ffff1683529284019291840191600101613731565b50909695505050505050565b828152611920810160208083018460005b60c881101561378f57815161ffff168352918301919083019060010161376e565b505050509392505050565b600080604083850312156137ad57600080fd5b823567ffffffffffffffff808211156137c557600080fd5b818501915085601f8301126137d957600080fd5b813560206137e96135b983613574565b82815260059290921b8401810191818101908984111561380857600080fd5b948201945b8386101561382f578535613820816134d0565b8252948201949082019061380d565b9650508601359250508082111561384557600080fd5b5061385285828601613598565b9150509250929050565b60006020828403121561386e57600080fd5b5051919050565b6000821982111561389657634e487b7160e01b600052601160045260246000fd5b500190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156138c357600080fd5b8151613332816134d0565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156138f657600080fd5b815161333281613502565b634e487b7160e01b600052601260045260246000fd5b60005b8381101561393257818101518382015260200161391a565b83811115613941576000848401525b50505050565b60008251613959818460208701613917565b9190910192915050565b6020815260008251806020840152613982816040850160208701613917565b601f01601f1916919091016040019291505056fea26469706673582212200ccfe33d7e13b15ceaa260fcbc58e0244e4a739d9a0a38560a3b101a67d5e5da64736f6c634300080e0033
Deployed Bytecode Sourcemap
448:17537:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1590:40;736:10:1;1590:40:15;;;-1:-1:-1;;;;;206:55:16;;;188:74;;1620:9:15;293:2:16;278:18;;271:34;161:18;1590:40:15;;;;;;;448:17537;;;;;2436:116;;;;;;;;;;-1:-1:-1;2436:116:15;;;;;:::i;:::-;-1:-1:-1;;;;;2525:18:15;2497:7;2525:18;;;:12;:18;;;;;;;;;2436:116;;;;873:25:16;;;861:2;846:18;2436:116:15;;;;;;;;1672:392;;;;;;;;;;-1:-1:-1;1672:392:15;;;;;:::i;:::-;;:::i;:::-;;9838:3312;;;;;;;;;;-1:-1:-1;9838:3312:15;;;;;:::i;:::-;;:::i;606:207:5:-;;;;;;;;;;-1:-1:-1;606:207:5;;;;;:::i;:::-;775:30;606:207;;;;;;;;;;4526:66:16;4514:79;;;4496:98;;4484:2;4469:18;606:207:5;4352:248:16;3118:115:15;;;;;;;;;;-1:-1:-1;3118:115:15;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3286:725::-;;;;;;;;;;-1:-1:-1;3286:725:15;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8067:1662::-;;;;;;;;;;-1:-1:-1;8067:1662:15;;;;;:::i;:::-;;:::i;2948:118::-;;;;;;;;;;-1:-1:-1;2948:118:15;;;;;:::i;:::-;;:::i;13187:158::-;;;;;;;;;;;;;:::i;2613:116::-;;;;;;;;;;-1:-1:-1;2613:116:15;;;;;:::i;:::-;;:::i;784:24::-;;;;;;;;;;-1:-1:-1;784:24:15;;;;-1:-1:-1;;;784:24:15;;;;;;;;;6002:6:16;5990:19;;;5972:38;;5960:2;5945:18;784:24:15;5828:188:16;659:25:15;;;;;;;;;;-1:-1:-1;659:25:15;;;;-1:-1:-1;;;659:25:15;;;;;;;;;6186:14:16;;6179:22;6161:41;;6149:2;6134:18;659:25:15;6021:187:16;1714:103:12;;;;;;;;;;;;;:::i;5636:2316:15:-;;;;;;;;;;-1:-1:-1;5636:2316:15;;;;;:::i;:::-;;:::i;4061:1468::-;;;;;;;;;;-1:-1:-1;4061:1468:15;;;;;:::i;:::-;;:::i;691:24::-;;;;;;;;;;-1:-1:-1;691:24:15;;;;-1:-1:-1;;;691:24:15;;;;;;1063:87:12;;;;;;;;;;-1:-1:-1;1136:6:12;;-1:-1:-1;;;;;1136:6:12;1063:87;;;-1:-1:-1;;;;;7594:55:16;;;7576:74;;7564:2;7549:18;1063:87:12;7430:226:16;722:24:15;;;;;;;;;;-1:-1:-1;722:24:15;;;;-1:-1:-1;;;722:24:15;;;;;;1411:81;;;;;;;;;;-1:-1:-1;1411:81:15;;;;-1:-1:-1;;;;;1411:81:15;;;753:24;;;;;;;;;;-1:-1:-1;753:24:15;;;;-1:-1:-1;;;753:24:15;;;;;;2778:118;;;;;;;;;;;;;:::i;1320:84::-;;;;;;;;;;-1:-1:-1;1320:84:15;;;;-1:-1:-1;;;;;1320:84:15;;;2274:117;;;;;;;;;;-1:-1:-1;2274:117:15;;;;;:::i;:::-;-1:-1:-1;;;;;2363:19:15;2335:7;2363:19;;;:13;:19;;;;;;;;;2274:117;1972:201:12;;;;;;;;;;-1:-1:-1;1972:201:12;;;;;:::i;:::-;;:::i;2118:110:15:-;;;;;;;;;;-1:-1:-1;2118:110:15;;;;;:::i;:::-;-1:-1:-1;;;;;2200:19:15;2172:7;2200:19;;;:13;:19;;;;;;;2118:110;1672:392;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;8354:2:16;1275:68:12;;;8336:21:16;;;8373:18;;;8366:30;8432:34;8412:18;;;8405:62;8484:18;;1275:68:12;;;;;;;;;1735:16:15;::::1;;1746:5;1735:16:::0;1731:299:::1;;1776:14;::::0;:39:::1;::::0;-1:-1:-1;;;1776:39:15;;1809:4:::1;1776:39;::::0;::::1;7576:74:16::0;1818:1:15::1;::::0;-1:-1:-1;;;;;1776:14:15::1;::::0;:24:::1;::::0;7549:18:16;;1776:39:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;1768:84;;;::::0;-1:-1:-1;;;1768:84:15;;8904:2:16;1768:84:15::1;::::0;::::1;8886:21:16::0;8943:2;8923:18;;;8916:30;8982:31;8962:18;;;8955:59;9031:18;;1768:84:15::1;8702:353:16::0;1768:84:15::1;1873:11;;1888:1;1873:16:::0;1869:150:::1;;1924:15;1910:11;:29:::0;;;1988:15:::1;::::0;1970:33:::1;::::0;1988:15:::1;::::0;;::::1;::::0;1970:33:::1;:::i;:::-;1958:9;:45:::0;1869:150:::1;2040:6;:16:::0;;;::::1;;-1:-1:-1::0;;;2040:16:15::1;::::0;;;::::1;::::0;;;::::1;::::0;;1672:392::o;9838:3312::-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;9549:2:16;2368:63:13;;;9531:21:16;9588:2;9568:18;;;9561:30;9627:33;9607:18;;;9600:61;9678:18;;2368:63:13;9347:355:16;2368:63:13;1778:1;2509:7;:18;;;:7;;;;10052:10:15::1;1120:20:0::0;1168:8;10025:73:15::1;;;::::0;-1:-1:-1;;;10025:73:15;;9909:2:16;10025:73:15::1;::::0;::::1;9891:21:16::0;9948:2;9928:18;;;9921:30;9987:23;9967:18;;;9960:51;10028:18;;10025:73:15::1;9707:345:16::0;10025:73:15::1;10135:12;:10;:12::i;:::-;10202:10;10223:1;10191:22:::0;;;:10:::1;:22;::::0;;;;:29;:33;10187:89:::1;;10256:4;10245:15;;10187:89;10296:8;:15;10315:1;10296:20:::0;10292:1873:::1;;10377:1;10373:5;;10368:718;10395:10;10384:22;::::0;;;:10:::1;:22;::::0;;;;:29;10380:33:::1;::::0;::::1;;10368:718;;;10461:10;10450:22;::::0;;;:10:::1;:22;::::0;;;;:25;;::::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;::::0;-1:-1:-1;10502:5:15;;10498:569:::1;;10540:15;::::0;::::1;;::::0;;;:12:::1;:15;::::0;;;;;10559:10:::1;-1:-1:-1::0;;;;;10540:15:15;;::::1;:29:::0;10536:508:::1;;10602:15;::::0;;::::1;10628:1;10602:15:::0;;;:12:::1;:15;::::0;;;;;;;:28;;-1:-1:-1;;10602:28:15::1;::::0;;-1:-1:-1;10661:15:15;;;;::::1;-1:-1:-1::0;;;10661:15:15;;;::::1;::::0;::::1;-1:-1:-1::0;;10661:15:15;;::::1;::::0;;::::1;;::::0;;10718:10:::1;10707:22:::0;;:10:::1;:22:::0;;;;;:25;;10628:1;;10707:22;;:25;;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;:29:::0;;:25;;;;::::1;;:29;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;10773:15:::1;::::0;:26:::1;::::0;;;;5990:19:16;;;10773:26:15::1;::::0;::::1;5972:38:16::0;10811:4:15::1;::::0;-1:-1:-1;;;;;10773:15:15;;::::1;::::0;:23:::1;::::0;5945:18:16;;10773:26:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10773:43:15::1;::::0;10769:248:::1;;10923:15;::::0;:62:::1;::::0;;;;10964:4:::1;10923:62;::::0;::::1;10958:34:16::0;10971:10:15::1;11008:18:16::0;;;11001:43;11092:6;11080:19;;11060:18;;;11053:47;-1:-1:-1;;;;;10923:15:15;;::::1;::::0;:32:::1;::::0;10870:18:16;;10923:62:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10769:248;10420:1;10415:6;;;;10368:718;;;11118:10;11132:1;11104:25:::0;;;:13:::1;:25;::::0;;;;:29;;-1:-1:-1;;11104:29:15::1;::::0;;10292:1873:::1;;;11222:1;11218:5;;11213:937;11229:8;:15;11225:1;:19;;;11213:937;;;11286:1;11282:5;;11277:854;11304:10;11293:22;::::0;;;:10:::1;:22;::::0;;;;:29;11289:33:::1;::::0;::::1;;11277:854;;;11392:8;11401:1;11392:11;;;;;;;;;;:::i;:::-;;;;;;;11363:40;;:10;:22;11374:10;-1:-1:-1::0;;;;;11363:22:15::1;-1:-1:-1::0;;;;;11363:22:15::1;;;;;;;;;;;;11386:1;11363:25;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;:40:::0;11359:749:::1;;11469:10;-1:-1:-1::0;;;;;11440:39:15::1;:12;:25;11453:8;11462:1;11453:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;11440:25:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;11440:25:15;;-1:-1:-1;;;;;11440:25:15::1;:39:::0;11436:645:::1;;11552:1;11516:12;:25;11529:8;11538:1;11529:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;11516:25:::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;11516:25:15;;;:38;;-1:-1:-1;;11516:38:15::1;-1:-1:-1::0;;;;;11516:38:15;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;11589:15:15;;;;::::1;-1:-1:-1::0;;;11589:15:15;;;::::1;::::0;::::1;-1:-1:-1::0;;11589:15:15;;;;::::1;::::0;;::::1;;::::0;;;11653:10:::1;11639:25:::0;;:13:::1;:25:::0;;;;;:30;;-1:-1:-1;;11639:30:15;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;11704:10:::1;:22:::0;;;;:25;;:22;;:25;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11822:4;-1:-1:-1::0;;;;;11774:53:15::1;:15;;;;;;;;;-1:-1:-1::0;;;;;11774:15:15::1;-1:-1:-1::0;;;;;11774:23:15::1;;11798:8;11807:1;11798:11;;;;;;;;;;:::i;:::-;;;;;;;11774:36;;;;;;;;;;;;;;6002:6:16::0;5990:19;;;;5972:38;;5960:2;5945:18;;5828:188;11774:36:15::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11774:53:15::1;::::0;11770:280:::1;;11942:15;::::0;12002:11;;-1:-1:-1;;;;;11942:15:15;;::::1;::::0;:32:::1;::::0;11983:4:::1;::::0;11990:10:::1;::::0;12002:8;;:11:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;11942:72:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;10976:15:16;;;11942:72:15::1;::::0;::::1;10958:34:16::0;11028:15;;;;11008:18;;;11001:43;11092:6;11080:19;11060:18;;;11053:47;10870:18;;11942:72:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;11770:280;11329:1;11324:6;;;;11277:854;;;11251:1;11246:6;;;;11213:937;;;-1:-1:-1::0;12219:5:15::1;12239:767;12246:16:::0;::::1;;12257:5;12246:16:::0;12239:767:::1;;12292:1;12288:5;;12283:617;12310:10;12299:22;::::0;;;:10:::1;:22;::::0;;;;:29;12295:33:::1;::::0;::::1;;12283:617;;;12408:10;12369:1;12397:22:::0;;;:10:::1;:22;::::0;;;;:29;12369:1;;-1:-1:-1;12429:1:15::1;-1:-1:-1::0;12393:488:15::1;;;12474:10;12463:22;::::0;;;:10:::1;:22;::::0;;;;:25;;::::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;:30:::0;;12459:314:::1;;12565:10;12554:22;::::0;;;:10:::1;:22;::::0;;;;12577:29;;-1:-1:-1;;12577:31:15;;;12554:55;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;12537:10:::1;12526:22:::0;;:10:::1;:22:::0;;;;;;;:25;;12554:55;;;;::::1;;;;::::0;;::::1;;::::0;;::::1;::::0;12526:22;:25;;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:83;;;;;;;;;;;;;;;;;;12640:10;:22;12651:10;-1:-1:-1::0;;;;;12640:22:15::1;-1:-1:-1::0;;;;;12640:22:15::1;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;12640:28:15;;;;;::::1;;::::0;;::::1;;::::0;;;::::1;;;;;;::::0;;;;::::1;12699:10:::0;;;::::1;::::0;12740:5:::1;;12459:314;12393:488;;;12840:10;12829:22;::::0;;;:10:::1;:22;::::0;;;;:28;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;12829:28:15;;;;;::::1;;::::0;;::::1;;::::0;;;::::1;;;;;;::::0;;;;12393:488:::1;12335:1;12330:6;;;;12283:617;;;12922:5;:10;;12931:1;12922:10:::0;12918:73:::1;;-1:-1:-1::0;12967:4:15::1;12918:73;12239:767;;;13038:4;13026:16:::0;::::1;;;:54:::0;::::1;;;-1:-1:-1::0;13057:10:15::1;13046:22;::::0;;;:10:::1;:22;::::0;;;;:29;:34;13026:54:::1;13022:110;;;13115:1;13101:15:::0;;-1:-1:-1;;13101:15:15::1;-1:-1:-1::0;;;13101:15:15;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;;::::0;;13022:110:::1;-1:-1:-1::0;;1734:1:13;2688:7;:22;-1:-1:-1;;;;9838:3312:15:o;3118:115::-;-1:-1:-1;;;;;3208:16:15;;;;;;:10;:16;;;;;;;;;3200:25;;;;;;;;;;;;;;;;;3172:15;;3200:25;;;3208:16;3200:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3118:115;;;:::o;3286:725::-;3338:13;3353:28;;:::i;:::-;3394:8;3413;3432:16;3459:20;3490:23;;:::i;:::-;3566:15;;:31;;-1:-1:-1;;;3566:31:15;;-1:-1:-1;;;;;7594:55:16;;;3566:31:15;;;7576:74:16;3566:15:15;;;;:25;;7549:18:16;;3566:31:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3551:46;;3623:1;3619:5;;3614:339;3631:4;3626:1;:9;;;3614:339;;3675:15;;:26;;;;;6002:6:16;5990:19;;3675:26:15;;;5972:38:16;-1:-1:-1;;;;;3675:15:15;;;;:23;;5945:18:16;;3675:26:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3664:37;;3736:4;-1:-1:-1;;;;;3724:16:15;:8;-1:-1:-1;;;;;3724:16:15;;3720:218;;3775:1;3765:4;3770:1;3765:7;;;;;;;;;:::i;:::-;;;;:11;;;;;;;;;;;3804:1;3799:6;;;;3837:12;3832:1;:17;;;:29;;;;3853:1;:8;;3858:3;3853:8;3832:29;3890:5;3828:91;;3642:1;3637:6;;;;3614:339;;;3984:12;;3998:4;;-1:-1:-1;3286:725:15;-1:-1:-1;;;;;3286:725:15:o;8067:1662::-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;9549:2:16;2368:63:13;;;9531:21:16;9588:2;9568:18;;;9561:30;9627:33;9607:18;;;9600:61;9678:18;;2368:63:13;9347:355:16;2368:63:13;1778:1;2509:7;:18;;;:7;8219:10:15::1;1120:20:0::0;1168:8;8192:73:15::1;;;::::0;-1:-1:-1;;;8192:73:15;;9909:2:16;8192:73:15::1;::::0;::::1;9891:21:16::0;9948:2;9928:18;;;9921:30;9987:23;9967:18;;;9960:51;10028:18;;8192:73:15::1;9707:345:16::0;8192:73:15::1;8284:6;::::0;-1:-1:-1;;;8284:6:15;::::1;;;:15;8276:46;;;::::0;-1:-1:-1;;;8276:46:15;;11502:2:16;8276:46:15::1;::::0;::::1;11484:21:16::0;11541:2;11521:18;;;11514:30;11580:20;11560:18;;;11553:48;11618:18;;8276:46:15::1;11300:342:16::0;8276:46:15::1;8341:8;:15;8360:1;8341:20:::0;8333:62:::1;;;::::0;-1:-1:-1;;;8333:62:15;;11849:2:16;8333:62:15::1;::::0;::::1;11831:21:16::0;11888:2;11868:18;;;11861:30;11927:31;11907:18;;;11900:59;11976:18;;8333:62:15::1;11647:353:16::0;8333:62:15::1;8416:15;::::0;:59:::1;::::0;;;;8449:10:::1;8416:59;::::0;::::1;12240:34:16::0;8469:4:15::1;12290:18:16::0;;;12283:43;-1:-1:-1;;;;;8416:15:15;;::::1;::::0;:32:::1;::::0;12152:18:16;;8416:59:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;8479:4;8416:67;8408:158;;;::::0;-1:-1:-1;;;8408:158:15;;12789:2:16;8408:158:15::1;::::0;::::1;12771:21:16::0;12828:2;12808:18;;;12801:30;12867:34;12847:18;;;12840:62;12938:34;12918:18;;;12911:62;13010:3;12989:19;;;12982:32;13031:19;;8408:158:15::1;12587:469:16::0;8408:158:15::1;8621:10;8610:22;::::0;;;:10:::1;:22;::::0;;;;:29;:34;;8606:91:::1;;-1:-1:-1::0;8677:4:15::1;8606:91;8718:8;8713:678;8736:8;:15;8732:1;:19;;;8713:678;;;8802:1;8788:8;8797:1;8788:11;;;;;;;;;;:::i;:::-;;;;;;;:15;;;8780:58;;;::::0;-1:-1:-1;;;8780:58:15;;13263:2:16;8780:58:15::1;::::0;::::1;13245:21:16::0;13302:2;13282:18;;;13275:30;13341:32;13321:18;;;13314:60;13391:18;;8780:58:15::1;13061:354:16::0;8780:58:15::1;8865:15;::::0;8889:11;;8905:10:::1;::::0;-1:-1:-1;;;;;8865:15:15::1;::::0;:23:::1;::::0;8889:8;;:11:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;8865:36;;;;;;;;;;;;;;6002:6:16::0;5990:19;;;;5972:38;;5960:2;5945:18;;5828:188;8865:36:15::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8865:50:15::1;;8857:88;;;::::0;-1:-1:-1;;;8857:88:15;;13622:2:16;8857:88:15::1;::::0;::::1;13604:21:16::0;13661:2;13641:18;;;13634:30;13700:27;13680:18;;;13673:55;13745:18;;8857:88:15::1;13420:349:16::0;8857:88:15::1;9038:1;9028:11;;;;9152:10;9124:12;:25;9137:8;9146:1;9137:11;;;;;;;;;;:::i;:::-;;;;;;;9124:25;;;;;;;;;;;;;;;;:38;;;;;-1:-1:-1::0;;;;;9124:38:15::1;;;;;-1:-1:-1::0;;;;;9124:38:15::1;;;;;;9181:10;:22;9192:10;-1:-1:-1::0;;;;;9181:22:15::1;-1:-1:-1::0;;;;;9181:22:15::1;;;;;;;;;;;;9209:8;9218:1;9209:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;9181:40;;::::1;::::0;::::1;::::0;;-1:-1:-1;9181:40:15;;;;;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;9307:15:::1;::::0;9363:11;;-1:-1:-1;;;;;9307:15:15;;::::1;::::0;:28:::1;::::0;9336:10:::1;::::0;9356:4:::1;::::0;9363:11;;;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;9307:68:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;10976:15:16;;;9307:68:15::1;::::0;::::1;10958:34:16::0;11028:15;;;;11008:18;;;11001:43;11092:6;11080:19;11060:18;;;11053:47;10870:18;;9307:68:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8758:1;8753:6;;;;8713:678;;;;9420:1;9411:6;:10;;;:31;;;;-1:-1:-1::0;9438:4:15::1;9425:17:::0;::::1;;;9411:31;9407:87;;;9477:1;9463:15:::0;;::::1;-1:-1:-1::0;;;9463:15:15;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;::::0;;;::::1;;::::0;;9407:87:::1;9524:10;9510:25;::::0;;;:13:::1;:25;::::0;;;;;;;:35;;-1:-1:-1;;9510:35:15;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;;;-1:-1:-1;9560:20:15;;;;::::1;-1:-1:-1::0;;;9560:20:15;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;9601:13:::1;:25:::0;;;;;;:30;;9597:114:::1;;9666:10;9652:25;::::0;;;:13:::1;:25;::::0;;;;9680:15:::1;9652:43:::0;;9597:114:::1;-1:-1:-1::0;;1734:1:13;2688:7;:22;-1:-1:-1;8067:1662:15:o;2948:118::-;-1:-1:-1;;;;;3042:15:15;;;;;;:9;:15;;;;;;;;;3034:24;;;;;;;;;;;;;;;;;3002:19;;3034:24;;;3042:15;3034:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3034:24:15;;2948:118;-1:-1:-1;;;;;;;2948:118:15:o;13187:158::-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;9549:2:16;2368:63:13;;;9531:21:16;9588:2;9568:18;;;9561:30;9627:33;9607:18;;;9600:61;9678:18;;2368:63:13;9347:355:16;2368:63:13;1778:1;2509:7;:18;13268:10:15::1;1120:20:0::0;1168:8;13241:73:15::1;;;::::0;-1:-1:-1;;;13241:73:15;;13976:2:16;13241:73:15::1;::::0;::::1;13958:21:16::0;14015:2;13995:18;;;13988:30;14054:23;14034:18;;;14027:51;14095:18;;13241:73:15::1;13774:345:16::0;13241:73:15::1;13325:12;:10;:12::i;:::-;1734:1:13::0;2688:7;:22;13187:158:15:o;2613:116::-;2669:7;2697:23;2715:4;2697:17;:23::i;:::-;2689:32;2613:116;-1:-1:-1;;2613:116:15:o;1714:103:12:-;1136:6;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;8354:2:16;1275:68:12;;;8336:21:16;;;8373:18;;;8366:30;8432:34;8412:18;;;8405:62;8484:18;;1275:68:12;8152:356:16;1275:68:12;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;5636:2316:15:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;8354:2:16;1275:68:12;;;8336:21:16;;;8373:18;;;8366:30;8432:34;8412:18;;;8405:62;8484:18;;1275:68:12;8152:356:16;1275:68:12;5729:8:15::1;5748::::0;5767:11:::1;5789:14:::0;5814:13:::1;5864:3;:10;5848:5;:12;:26;5840:105;;;::::0;-1:-1:-1;;;5840:105:15;;14326:2:16;5840:105:15::1;::::0;::::1;14308:21:16::0;14365:2;14345:18;;;14338:30;14404:34;14384:18;;;14377:62;14475:34;14455:18;;;14448:62;14547:4;14526:19;;;14519:33;14569:19;;5840:105:15::1;14124:470:16::0;5840:105:15::1;5994:1;5990:5;;5985:1949;6001:5;:12;5997:1;:16;;;5985:1949;;;6050:1;6041:10;;6074:9;:19;6084:5;6090:1;6084:8;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;6074:19:15::1;-1:-1:-1::0;;;;;6074:19:15::1;;;;;;;;;;;;:26;;;;6104:1;6074:31:::0;6070:96:::1;;6142:4;6130:16;;6070:96;6194:15;::::0;6218:6;;-1:-1:-1;;;;;6194:15:15;;::::1;::::0;:23:::1;::::0;6218:3;;:6:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;6194:31;;;;;;;;;;;;;;6002:6:16::0;5990:19;;;;5972:38;;5960:2;5945:18;;5828:188;6194:31:15::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6194:77:15::1;6229:42;-1:-1:-1::0;;;;;6194:77:15::1;;:161;;;-1:-1:-1::0;6339:15:15::1;::::0;6320:6;;-1:-1:-1;;;;;6339:15:15;;::::1;::::0;;;6296:23:::1;::::0;6320:3;;:6:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;6296:31;;;;;;;;;;;;;;6002:6:16::0;5990:19;;;;5972:38;;5960:2;5945:18;;5828:188;6296:31:15::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6296:59:15::1;;6194:161;6186:221;;;::::0;-1:-1:-1;;;6186:221:15;;14801:2:16;6186:221:15::1;::::0;::::1;14783:21:16::0;14840:2;14820:18;;;14813:30;14879:28;14859:18;;;14852:56;14925:18;;6186:221:15::1;14599:350:16::0;6186:221:15::1;6449:5;6455:1;6449:8;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;6432:25:15::1;:5;:13;6438:3;6442:1;6438:6;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;6432:13:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;6432:13:15;;-1:-1:-1;;;;;6432:13:15::1;6428:1491:::0;::::1;;6562:1;-1:-1:-1::0;;;;;6537:27:15::1;:5;:13;6543:3;6547:1;6543:6;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;6537:13:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;6537:13:15;;-1:-1:-1;;;;;6537:13:15::1;:27:::0;6533:1386:::1;;6645:5;6651:1;6645:8;;;;;;;;;;:::i;:::-;;;;;;;6629:5;:13;6635:3;6639:1;6635:6;;;;;;;;;;:::i;:::-;;;;;;;6629:13;;;;;;;;;;;;;;;;:24;;;;;-1:-1:-1::0;;;;;6629:24:15::1;;;;;-1:-1:-1::0;;;;;6629:24:15::1;;;;;;6676:9;:19;6686:5;6692:1;6686:8;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;6676:19:15::1;-1:-1:-1::0;;;;;6676:19:15::1;;;;;;;;;;;;6701:3;6705:1;6701:6;;;;;;;;;;:::i;:::-;;;;;;;6676:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6757:1;6731:12;:22;6744:5;6750:1;6744:8;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;6731:22:15::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;6731:22:15;:27;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;6731:27:15;;::::1;;::::0;;;6781:15;;-1:-1:-1;;;6781:15:15;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;6825:17;::::1;;::::0;;6821:133:::1;;6885:1;6871:15:::0;;::::1;-1:-1:-1::0;;;6871:15:15;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;-1:-1:-1::0;;;;6871:15:15;;::::1;;::::0;;-1:-1:-1;;;6821:133:15::1;6533:1386;;;7002:5;7008:1;7002:8;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;6985:25:15::1;:5;:13;6991:3;6995:1;6991:6;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;6985:13:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;6985:13:15;;-1:-1:-1;;;;;6985:13:15::1;:25;6981:938;;7094:5;:13;7100:3;7104:1;7100:6;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;7094:13:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;7094:13:15;;;;-1:-1:-1;;;;;;;;7094:13:15::1;::::0;-1:-1:-1;7132:385:15::1;-1:-1:-1::0;;;;;7148:14:15;::::1;;::::0;;;:9:::1;:14;::::0;;;;:21;7144:25:::1;::::0;::::1;;7132:385;;;7228:3;7232:1;7228:6;;;;;;;;;;:::i;:::-;;;;;;;7207:27;;:9;:14;7217:3;-1:-1:-1::0;;;;;7207:14:15::1;-1:-1:-1::0;;;;;7207:14:15::1;;;;;;;;;;;;7222:1;7207:17;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;:27:::0;7203:291:::1;;-1:-1:-1::0;;;;;7287:14:15;::::1;;::::0;;;:9:::1;:14;::::0;;;;7302:21;;-1:-1:-1;;7302:23:15;;;7287:39;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;7267:9;:14;7277:3;-1:-1:-1::0;;;;;7267:14:15::1;-1:-1:-1::0;;;;;7267:14:15::1;;;;;;;;;;;;7282:1;7267:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;7357:9;:14;7367:3;-1:-1:-1::0;;;;;7357:14:15::1;-1:-1:-1::0;;;;;7357:14:15::1;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;7357:20:15;;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;;;::::0;::::1;;::::0;;::::1;::::0;;;;;-1:-1:-1;;;;;7408:17:15;::::1;::::0;;:12:::1;:17:::0;;;;;:22;;;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;7408:22:15;;::::1;;::::0;;7461:5:::1;;7203:291;7171:3;::::0;;::::1;::::0;7132:385:::1;;;7557:5;7563:1;7557:8;;;;;;;;;;:::i;:::-;;;;;;;7541:5;:13;7547:3;7551:1;7547:6;;;;;;;;;;:::i;:::-;;;;;;;7541:13;;;;;;;;;;;;;;;;:24;;;;;-1:-1:-1::0;;;;;7541:24:15::1;;;;;-1:-1:-1::0;;;;;7541:24:15::1;;;;;;7588:9;:19;7598:5;7604:1;7598:8;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;7588:19:15::1;-1:-1:-1::0;;;;;7588:19:15::1;;;;;;;;;;;;7613:3;7617:1;7613:6;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;7588:32;;::::1;::::0;;::::1;::::0;;-1:-1:-1;7588:32:15;;;;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;;;;;::::1;;;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;;7649:17;::::1;;::::0;;7645:133:::1;;7709:1;7695:15:::0;;::::1;-1:-1:-1::0;;;7695:15:15;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;-1:-1:-1::0;;;;7695:15:15;;::::1;;::::0;;-1:-1:-1;;;7645:133:15::1;-1:-1:-1::0;;;;;7806:14:15;::::1;;::::0;;;:9:::1;:14;::::0;;;;:21;:26;;7802:98:::1;;7875:1;7861:15:::0;;-1:-1:-1;;7861:15:15::1;-1:-1:-1::0;;;7861:15:15;;::::1;::::0;::::1;::::0;;;;::::1;;-1:-1:-1::0;;;;7861:15:15;;::::1;;::::0;;7802:98:::1;6015:3;::::0;;::::1;::::0;5985:1949:::1;;;5718:2234;;;;;5636:2316:::0;;:::o;4061:1468::-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;9549:2:16;2368:63:13;;;9531:21:16;9588:2;9568:18;;;9561:30;9627:33;9607:18;;;9600:61;9678:18;;2368:63:13;9347:355:16;2368:63:13;1778:1;2509:7;:18;;;:7;4215:10:15::1;1120:20:0::0;1168:8;4188:73:15::1;;;::::0;-1:-1:-1;;;4188:73:15;;9909:2:16;4188:73:15::1;::::0;::::1;9891:21:16::0;9948:2;9928:18;;;9921:30;9987:23;9967:18;;;9960:51;10028:18;;4188:73:15::1;9707:345:16::0;4188:73:15::1;4280:6;::::0;-1:-1:-1;;;4280:6:15;::::1;;;:15;4272:46;;;::::0;-1:-1:-1;;;4272:46:15;;11502:2:16;4272:46:15::1;::::0;::::1;11484:21:16::0;11541:2;11521:18;;;11514:30;11580:20;11560:18;;;11553:48;11618:18;;4272:46:15::1;11300:342:16::0;4272:46:15::1;4337:8;:15;4356:1;4337:20:::0;4329:62:::1;;;::::0;-1:-1:-1;;;4329:62:15;;11849:2:16;4329:62:15::1;::::0;::::1;11831:21:16::0;11888:2;11868:18;;;11861:30;11927:31;11907:18;;;11900:59;11976:18;;4329:62:15::1;11647:353:16::0;4329:62:15::1;4412:15;::::0;:59:::1;::::0;;;;4445:10:::1;4412:59;::::0;::::1;12240:34:16::0;4465:4:15::1;12290:18:16::0;;;12283:43;-1:-1:-1;;;;;4412:15:15;;::::1;::::0;:32:::1;::::0;12152:18:16;;4412:59:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4475:4;4412:67;4404:158;;;::::0;-1:-1:-1;;;4404:158:15;;12789:2:16;4404:158:15::1;::::0;::::1;12771:21:16::0;12828:2;12808:18;;;12801:30;12867:34;12847:18;;;12840:62;12938:34;12918:18;;;12911:62;13010:3;12989:19;;;12982:32;13031:19;;4404:158:15::1;12587:469:16::0;4404:158:15::1;4614:10;4604:21;::::0;;;:9:::1;:21;::::0;;;;:28;:33;;4600:90:::1;;-1:-1:-1::0;4670:4:15::1;4600:90;4711:8;4706:618;4729:8;:15;4725:1;:19;;;4706:618;;;4781:15;::::0;4805:11;;4821:10:::1;::::0;-1:-1:-1;;;;;4781:15:15::1;::::0;:23:::1;::::0;4805:8;;:11:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;4781:36;;;;;;;;;;;;;;6002:6:16::0;5990:19;;;;5972:38;;5960:2;5945:18;;5828:188;4781:36:15::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4781:50:15::1;;4773:88;;;::::0;-1:-1:-1;;;4773:88:15;;13622:2:16;4773:88:15::1;::::0;::::1;13604:21:16::0;13661:2;13641:18;;;13634:30;13700:27;13680:18;;;13673:55;13745:18;;4773:88:15::1;13420:349:16::0;4773:88:15::1;4954:1;4944:11;;;;5061:10;5040:5;:18;5046:8;5055:1;5046:11;;;;;;;;;;:::i;:::-;;;;;;;5040:18;;;;;;;;;;;;;;;;:31;;;;;-1:-1:-1::0;;;;;5040:31:15::1;;;;;-1:-1:-1::0;;;;;5040:31:15::1;;;;;;5090:9;:21;5100:10;-1:-1:-1::0;;;;;5090:21:15::1;-1:-1:-1::0;;;;;5090:21:15::1;;;;;;;;;;;;5117:8;5126:1;5117:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;5090:39;;::::1;::::0;::::1;::::0;;-1:-1:-1;5090:39:15;;;;;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;5211:15:::1;::::0;5296:11;;-1:-1:-1;;;;;5211:15:15;;::::1;::::0;:28:::1;::::0;5240:10:::1;::::0;5252:42:::1;::::0;5296:11;;;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;5211:97:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;10976:15:16;;;5211:97:15::1;::::0;::::1;10958:34:16::0;11028:15;;;;11008:18;;;11001:43;11092:6;11080:19;11060:18;;;11053:47;10870:18;;5211:97:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4751:1;4746:6;;;;4706:618;;;-1:-1:-1::0;5351:10:15::1;5338:24;::::0;;;:12:::1;:24;::::0;;;;:34;;-1:-1:-1;;5338:34:15;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;;;-1:-1:-1;5387:20:15;;;;::::1;-1:-1:-1::0;;;5387:20:15;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;::::0;;5428:10;::::1;::::0;;;;:31:::1;;-1:-1:-1::0;5455:4:15::1;5442:17:::0;::::1;;;5428:31;5424:87;;;5494:1;5480:15:::0;;::::1;-1:-1:-1::0;;;5480:15:15;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;-1:-1:-1::0;;;;5480:15:15;;::::1;;::::0;;-1:-1:-1;;1734:1:13;2688:7;:22;-1:-1:-1;4061:1468:15:o;2778:118::-;2849:14;;:39;;-1:-1:-1;;;2849:39:15;;2882:4;2849:39;;;7576:74:16;2822:7:15;;-1:-1:-1;;;;;2849:14:15;;:24;;7549:18:16;;2849:39:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2842:46;;2778:118;:::o;1972:201:12:-;1136:6;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;8354:2:16;1275:68:12;;;8336:21:16;;;8373:18;;;8366:30;8432:34;8412:18;;;8405:62;8484:18;;1275:68:12;8152:356:16;1275:68:12;-1:-1:-1;;;;;2061:22:12;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:12;;15156:2:16;2053:73:12::1;::::0;::::1;15138:21:16::0;15195:2;15175:18;;;15168:30;15234:34;15214:18;;;15207:62;15305:8;15285:18;;;15278:36;15331:19;;2053:73:12::1;14954:402:16::0;2053:73:12::1;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;13381:616:15:-;13423:14;13496:16;:14;:16::i;:::-;-1:-1:-1;13569:10:15;13561:19;;;;:7;:19;;;;;;;;13684:14;;:39;;-1:-1:-1;;;13684:39:15;;13717:4;13684:39;;;7576:74:16;13561:19:15;;-1:-1:-1;;;;;13684:14:15;;:24;;7549:18:16;;13684:39:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13675:6;:48;13671:137;;;13753:14;;:39;;-1:-1:-1;;;13753:39:15;;13786:4;13753:39;;;7576:74:16;-1:-1:-1;;;;;13753:14:15;;;;:24;;7549:18:16;;13753:39:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13744:48;;13671:137;13828:10;;13824:109;;13882:14;;13859:58;;-1:-1:-1;;;;;13882:14:15;13898:10;13910:6;13859:22;:58::i;:::-;13957:10;13949:19;;;;:7;:19;;;;;:29;;;;;;;;13381:616::o;14925:1725::-;-1:-1:-1;;;;;15417:26:15;;14996:7;15417:26;;;:13;:26;;;;;;14996:7;;;;;;;;;;;;;;;;;;;;;;15417:26;;:31;;:65;;-1:-1:-1;;;;;;15452:25:15;;;;;;:12;:25;;;;;;;;:30;15417:65;:85;;;-1:-1:-1;15486:11:15;;:16;15417:85;15413:1171;;;15529:1;15523:7;;15413:1171;;;15618:10;;948:4;15618:10;-1:-1:-1;;;15618:10:15;;;;-1:-1:-1;;;15605:10:15;;;;:23;15591:38;;;;;-1:-1:-1;;;;15693:10:15;;;;-1:-1:-1;;;15680:10:15;;;;;:23;;;;15666:38;;;;;;;-1:-1:-1;15781:1:15;;15759:19;;:23;15741:15;:41;15723:59;;15805:15;15824:1;15805:20;15801:88;;15868:1;15850:19;;15801:88;15961:15;15928:30;15961:15;15928:48;;;;:::i;:::-;-1:-1:-1;;;;;16013:25:15;;;;;;:12;:25;;;;;;;;;16092:13;:26;;;;;;;16528:15;;15928:48;;;;;-1:-1:-1;;;16013:25:15;;;;:29;;15995:47;;;-1:-1:-1;948:4:15;16092:26;;;:44;;;16078:59;;;-1:-1:-1;16176:30:15;16156:50;;-1:-1:-1;16264:1:15;16260;16242:19;;:23;;-1:-1:-1;16306:34:15;;;16305:57;;;-1:-1:-1;16400:35:15;;;16439:3;16399:43;;-1:-1:-1;948:4:15;16546:8;16528:15;;;;:26;16469:86;16487:37;16013:25;16487:24;:37::i;:::-;16469:15;:55;:86;:99;;;;;:::i;:::-;;16463:105;;15413:1171;-1:-1:-1;;;;;16621:20:15;;;;;;:7;:20;;;;;;16615:26;;:3;:26;:::i;:::-;16607:35;14925:1725;-1:-1:-1;;;;;;;;;;;;;14925:1725:15:o;2333:191:12:-;2426:6;;;-1:-1:-1;;;;;2443:17:12;;;-1:-1:-1;;2443:17:12;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;14223:363:15:-;14320:29;14338:10;14320:17;:29::i;:::-;14306:10;14298:19;;;;:7;:19;;;;;:51;14401:9;;14382:15;:28;14378:190;;14459:9;;14445:10;14431:25;;;;:13;:25;;;;;:37;1714:103:12:o;14378:190:15:-;14523:10;14509:25;;;;:13;:25;;;;;14537:15;14509:43;;14223:363::o;707:211:14:-;851:58;;;-1:-1:-1;;;;;206:55:16;;851:58:14;;;188:74:16;278:18;;;;271:34;;;851:58:14;;;;;;;;;;161:18:16;;;;851:58:14;;;;;;;;;;874:23;851:58;;;824:86;;844:5;;824:19;:86::i;:::-;707:211;;;:::o;16982:1000:15:-;17060:7;17080:17;17108:21;17185:15;17173:9;;:27;17169:795;;;-1:-1:-1;;;;;17239:26:15;;;;;;:13;:26;;;;;;17225:11;;:40;17221:199;;;17302:11;;17290:23;;17221:199;;;-1:-1:-1;;;;;17374:26:15;;;;;;:13;:26;;;;;;;-1:-1:-1;17221:199:15;-1:-1:-1;17456:15:15;;17475;:27;;;17456:15;;;;:47;;;;948:4;17544:31;;;17530:46;17456:15;17529:66;;;;:::i;:::-;;;16982:1000;-1:-1:-1;;;;16982:1000:15:o;17169:795::-;-1:-1:-1;;;;;17656:26:15;;;;;;:13;:26;;;;;;17642:11;;:40;17638:221;;;17719:1;17707:13;;17638:221;;;-1:-1:-1;;;;;17812:26:15;;;;;;:13;:26;;;;;;17800:9;;17781:15;;17800:38;;;17781:15;;;;:58;;-1:-1:-1;17638:221:15;17932:15;;;;948:4;17900:27;;;17886:42;17932:15;17885:62;;;;:::i;3280:716:14:-;3704:23;3730:69;3758:4;3730:69;;;;;;;;;;;;;;;;;3738:5;-1:-1:-1;;;;;3730:27:14;;;:69;;;;;:::i;:::-;3814:17;;3704:95;;-1:-1:-1;3814:21:14;3810:179;;3911:10;3900:30;;;;;;;;;;;;:::i;:::-;3892:85;;;;-1:-1:-1;;;3892:85:14;;15752:2:16;3892:85:14;;;15734:21:16;15791:2;15771:18;;;15764:30;15830:34;15810:18;;;15803:62;15901:12;15881:18;;;15874:40;15931:19;;3892:85:14;15550:406:16;3603:229:0;3740:12;3772:52;3794:6;3802:4;3808:1;3811:12;3772:21;:52::i;:::-;3765:59;;3603:229;;;;;;:::o;4723:510::-;4893:12;4951:5;4926:21;:30;;4918:81;;;;-1:-1:-1;;;4918:81:0;;16163:2:16;4918:81:0;;;16145:21:16;16202:2;16182:18;;;16175:30;16241:34;16221:18;;;16214:62;16312:8;16292:18;;;16285:36;16338:19;;4918:81:0;15961:402:16;4918:81:0;1120:20;;5010:60;;;;-1:-1:-1;;;5010:60:0;;16570:2:16;5010:60:0;;;16552:21:16;16609:2;16589:18;;;16582:30;16648:31;16628:18;;;16621:59;16697:18;;5010:60:0;16368:353:16;5010:60:0;5084:12;5098:23;5125:6;-1:-1:-1;;;;;5125:11:0;5144:5;5151:4;5125:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5083:73;;;;5174:51;5191:7;5200:10;5212:12;5174:16;:51::i;:::-;5167:58;4723:510;-1:-1:-1;;;;;;;4723:510:0:o;7409:712::-;7559:12;7588:7;7584:530;;;-1:-1:-1;7619:10:0;7612:17;;7584:530;7733:17;;:21;7729:374;;7931:10;7925:17;7992:15;7979:10;7975:2;7971:19;7964:44;7729:374;8074:12;8067:20;;-1:-1:-1;;;8067:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;316:154:16:-;-1:-1:-1;;;;;395:5:16;391:54;384:5;381:65;371:93;;460:1;457;450:12;475:247;534:6;587:2;575:9;566:7;562:23;558:32;555:52;;;603:1;600;593:12;555:52;642:9;629:23;661:31;686:5;661:31;:::i;909:118::-;995:5;988:13;981:21;974:5;971:32;961:60;;1017:1;1014;1007:12;1032:241;1088:6;1141:2;1129:9;1120:7;1116:23;1112:32;1109:52;;;1157:1;1154;1147:12;1109:52;1196:9;1183:23;1215:28;1237:5;1215:28;:::i;1278:184::-;-1:-1:-1;;;1327:1:16;1320:88;1427:4;1424:1;1417:15;1451:4;1448:1;1441:15;1467:334;1538:2;1532:9;1594:2;1584:13;;-1:-1:-1;;1580:86:16;1568:99;;1697:18;1682:34;;1718:22;;;1679:62;1676:88;;;1744:18;;:::i;:::-;1780:2;1773:22;1467:334;;-1:-1:-1;1467:334:16:o;1806:182::-;1865:4;1898:18;1890:6;1887:30;1884:56;;;1920:18;;:::i;:::-;-1:-1:-1;1965:1:16;1961:14;1977:4;1957:25;;1806:182::o;1993:831::-;2046:5;2099:3;2092:4;2084:6;2080:17;2076:27;2066:55;;2117:1;2114;2107:12;2066:55;2153:6;2140:20;2179:4;2203:59;2219:42;2258:2;2219:42;:::i;:::-;2203:59;:::i;:::-;2296:15;;;2382:1;2378:10;;;;2366:23;;2362:32;;;2327:12;;;;2406:15;;;2403:35;;;2434:1;2431;2424:12;2403:35;2470:2;2462:6;2458:15;2482:313;2498:6;2493:3;2490:15;2482:313;;;2578:3;2565:17;2626:6;2619:5;2615:18;2608:5;2605:29;2595:127;;2676:1;2705:2;2701;2694:14;2595:127;2735:18;;2773:12;;;;2515;;2482:313;;;-1:-1:-1;2813:5:16;1993:831;-1:-1:-1;;;;;;1993:831:16:o;2829:346::-;2912:6;2965:2;2953:9;2944:7;2940:23;2936:32;2933:52;;;2981:1;2978;2971:12;2933:52;3021:9;3008:23;3054:18;3046:6;3043:30;3040:50;;;3086:1;3083;3076:12;3040:50;3109:60;3161:7;3152:6;3141:9;3137:22;3109:60;:::i;:::-;3099:70;2829:346;-1:-1:-1;;;;2829:346:16:o;3180:1167::-;3275:6;3283;3291;3299;3352:3;3340:9;3331:7;3327:23;3323:33;3320:53;;;3369:1;3366;3359:12;3320:53;3408:9;3395:23;3427:31;3452:5;3427:31;:::i;:::-;3477:5;-1:-1:-1;3501:2:16;3540:18;;;3527:32;3568:33;3527:32;3568:33;:::i;:::-;3620:7;-1:-1:-1;3674:2:16;3659:18;;3646:32;;-1:-1:-1;3729:2:16;3714:18;;3701:32;3752:18;3782:14;;;3779:34;;;3809:1;3806;3799:12;3779:34;3847:6;3836:9;3832:22;3822:32;;3892:7;3885:4;3881:2;3877:13;3873:27;3863:55;;3914:1;3911;3904:12;3863:55;3950:2;3937:16;3972:2;3968;3965:10;3962:36;;;3978:18;;:::i;:::-;4020:112;4128:2;-1:-1:-1;;4052:4:16;4048:2;4044:13;4040:86;4036:95;4020:112;:::i;:::-;4007:125;;4155:2;4148:5;4141:17;4195:7;4190:2;4185;4181;4177:11;4173:20;4170:33;4167:53;;;4216:1;4213;4206:12;4167:53;4271:2;4266;4262;4258:11;4253:2;4246:5;4242:14;4229:45;4315:1;4310:2;4305;4298:5;4294:14;4290:23;4283:34;;4336:5;4326:15;;;;;3180:1167;;;;;;;:::o;4605:643::-;4774:2;4826:21;;;4896:13;;4799:18;;;4918:22;;;4745:4;;4774:2;4997:15;;;;4971:2;4956:18;;;4745:4;5040:182;5054:6;5051:1;5048:13;5040:182;;;5119:13;;5134:6;5115:26;5103:39;;5197:15;;;;5162:12;;;;5076:1;5069:9;5040:182;;;-1:-1:-1;5239:3:16;;4605:643;-1:-1:-1;;;;;;4605:643:16:o;5253:570::-;5477:25;;;5463:4;5448:20;;5521:2;5543:18;;;5603:6;5421:4;5637:180;5651:4;5648:1;5645:11;5637:180;;;5714:13;;5729:6;5710:26;5698:39;;5757:12;;;;5792:15;;;;5671:1;5664:9;5637:180;;;5641:3;;;;5253:570;;;;;:::o;6213:1212::-;6330:6;6338;6391:2;6379:9;6370:7;6366:23;6362:32;6359:52;;;6407:1;6404;6397:12;6359:52;6447:9;6434:23;6476:18;6517:2;6509:6;6506:14;6503:34;;;6533:1;6530;6523:12;6503:34;6571:6;6560:9;6556:22;6546:32;;6616:7;6609:4;6605:2;6601:13;6597:27;6587:55;;6638:1;6635;6628:12;6587:55;6674:2;6661:16;6696:4;6720:59;6736:42;6775:2;6736:42;:::i;6720:59::-;6813:15;;;6895:1;6891:10;;;;6883:19;;6879:28;;;6844:12;;;;6919:19;;;6916:39;;;6951:1;6948;6941:12;6916:39;6975:11;;;;6995:217;7011:6;7006:3;7003:15;6995:217;;;7091:3;7078:17;7108:31;7133:5;7108:31;:::i;:::-;7152:18;;7028:12;;;;7190;;;;6995:217;;;7231:5;-1:-1:-1;;7274:18:16;;7261:32;;-1:-1:-1;;7305:16:16;;;7302:36;;;7334:1;7331;7324:12;7302:36;;7357:62;7411:7;7400:8;7389:9;7385:24;7357:62;:::i;:::-;7347:72;;;6213:1212;;;;;:::o;8513:184::-;8583:6;8636:2;8624:9;8615:7;8611:23;8607:32;8604:52;;;8652:1;8649;8642:12;8604:52;-1:-1:-1;8675:16:16;;8513:184;-1:-1:-1;8513:184:16:o;9060:282::-;9100:3;9131:1;9127:6;9124:1;9121:13;9118:193;;;-1:-1:-1;;;9164:1:16;9157:88;9268:4;9265:1;9258:15;9296:4;9293:1;9286:15;9118:193;-1:-1:-1;9327:9:16;;9060:282::o;10057:184::-;-1:-1:-1;;;10106:1:16;10099:88;10206:4;10203:1;10196:15;10230:4;10227:1;10220:15;10440:251;10510:6;10563:2;10551:9;10542:7;10538:23;10534:32;10531:52;;;10579:1;10576;10569:12;10531:52;10611:9;10605:16;10630:31;10655:5;10630:31;:::i;11111:184::-;-1:-1:-1;;;11160:1:16;11153:88;11260:4;11257:1;11250:15;11284:4;11281:1;11274:15;12337:245;12404:6;12457:2;12445:9;12436:7;12432:23;12428:32;12425:52;;;12473:1;12470;12463:12;12425:52;12505:9;12499:16;12524:28;12546:5;12524:28;:::i;15361:184::-;-1:-1:-1;;;15410:1:16;15403:88;15510:4;15507:1;15500:15;15534:4;15531:1;15524:15;16726:258;16798:1;16808:113;16822:6;16819:1;16816:13;16808:113;;;16898:11;;;16892:18;16879:11;;;16872:39;16844:2;16837:10;16808:113;;;16939:6;16936:1;16933:13;16930:48;;;16974:1;16965:6;16960:3;16956:16;16949:27;16930:48;;16726:258;;;:::o;16989:274::-;17118:3;17156:6;17150:13;17172:53;17218:6;17213:3;17206:4;17198:6;17194:17;17172:53;:::i;:::-;17241:16;;;;;16989:274;-1:-1:-1;;16989:274:16:o;17268:442::-;17417:2;17406:9;17399:21;17380:4;17449:6;17443:13;17492:6;17487:2;17476:9;17472:18;17465:34;17508:66;17567:6;17562:2;17551:9;17547:18;17542:2;17534:6;17530:15;17508:66;:::i;:::-;17626:2;17614:15;-1:-1:-1;;17610:88:16;17595:104;;;;17701:2;17591:113;;17268:442;-1:-1:-1;;17268:442:16:o
Swarm Source
ipfs://0ccfe33d7e13b15ceaa260fcbc58e0244e4a739d9a0a38560a3b101a67d5e5da
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.