More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,136 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Harvest | 20294989 | 192 days ago | IN | 0 ETH | 0.00041088 | ||||
Harvest | 19952449 | 240 days ago | IN | 0 ETH | 0.0024579 | ||||
Withdraw | 19817001 | 259 days ago | IN | 0 ETH | 0.00249877 | ||||
Withdraw | 19815374 | 259 days ago | IN | 0 ETH | 0.00156622 | ||||
Harvest | 19714432 | 274 days ago | IN | 0 ETH | 0.00083582 | ||||
Harvest | 19714427 | 274 days ago | IN | 0 ETH | 0.00079484 | ||||
Harvest | 19103201 | 359 days ago | IN | 0 ETH | 0.00801002 | ||||
Withdraw | 19009709 | 372 days ago | IN | 0 ETH | 0.00524605 | ||||
Withdraw | 18973558 | 377 days ago | IN | 0 ETH | 0.00628199 | ||||
Withdraw | 18973541 | 377 days ago | IN | 0 ETH | 0.00422946 | ||||
Harvest | 18973529 | 377 days ago | IN | 0 ETH | 0.00207314 | ||||
Harvest | 18973526 | 377 days ago | IN | 0 ETH | 0.00301292 | ||||
Harvest | 18973518 | 377 days ago | IN | 0 ETH | 0.00296316 | ||||
Harvest | 18910316 | 386 days ago | IN | 0 ETH | 0.00139201 | ||||
Withdraw | 18897201 | 388 days ago | IN | 0 ETH | 0.00308027 | ||||
Deposit | 18888684 | 389 days ago | IN | 0 ETH | 0.00498585 | ||||
Withdraw | 18756044 | 408 days ago | IN | 0 ETH | 0.00419906 | ||||
Harvest | 18756037 | 408 days ago | IN | 0 ETH | 0.00222493 | ||||
Withdraw | 18655368 | 422 days ago | IN | 0 ETH | 0.00748141 | ||||
Mass Update Pool... | 18652125 | 423 days ago | IN | 0 ETH | 0.03192825 | ||||
Harvest | 18361798 | 463 days ago | IN | 0 ETH | 0.00106493 | ||||
Harvest | 18361794 | 463 days ago | IN | 0 ETH | 0.00107054 | ||||
Withdraw | 18350735 | 465 days ago | IN | 0 ETH | 0.0016485 | ||||
Withdraw | 18350730 | 465 days ago | IN | 0 ETH | 0.00134087 | ||||
Withdraw | 18350725 | 465 days ago | IN | 0 ETH | 0.00107475 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
NFTMasterChef
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // StarBlock DAO Contracts pragma solidity ^0.8.0; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./SafeMath.sol"; import "./IERC721Metadata.sol"; import "./IERC20.sol"; import "./SafeERC20.sol"; import "./IERC2981.sol"; import "./wnft_interfaces.sol"; import "./ArrayUtils.sol"; // harvest strategy contract, for havesting permission interface IHarvestStrategy { function canHarvest(uint256 _pid, address _forUser, uint256[] memory _wnfTokenIds) external view returns (bool); } interface INFTMasterChef { event AddPoolInfo(IERC721Metadata nft, IWrappedNFT wnft, uint256 startBlock, RewardInfo[] rewards, uint256 depositFee, IERC20 dividendToken, bool withUpdate); event SetStartBlock(uint256 pid, uint256 startBlock); event UpdatePoolReward(uint256 pid, uint256 rewardIndex, uint256 rewardBlock, uint256 rewardForEachBlock, uint256 rewardPerNFTForEachBlock); event SetPoolDepositFee(uint256 pid, uint256 depositFee); event SetHarvestStrategy(IHarvestStrategy harvestStrategy); event SetPoolDividendToken(uint256 pid, IERC20 dividendToken); event AddTokenRewardForPool(uint256 pid, uint256 addTokenPerPool, uint256 addTokenPerBlock, bool withTokenTransfer); event AddDividendForPool(uint256 pid, uint256 addDividend); event UpdateDevAddress(address payable devAddress); event EmergencyStop(address user, address to); event ClosePool(uint256 pid, address payable to); event Deposit(address indexed user, uint256 indexed pid, uint256[] tokenIds); event Withdraw(address indexed user, uint256 indexed pid, uint256[] wnfTokenIds); event WithdrawWithoutHarvest(address indexed user, uint256 indexed pid, uint256[] wnfTokenIds); event Harvest(address indexed user, uint256 indexed pid, uint256[] wnftTokenIds, uint256 mining, uint256 dividend); // Info of each NFT. struct NFTInfo { bool deposited; // If the NFT is deposited. uint256 rewardDebt; // Reward debt. uint256 dividendDebt; // Dividend debt. } //Info of each Reward struct RewardInfo { uint256 rewardBlock; uint256 rewardForEachBlock; //Reward for each block, can only be set one with rewardPerNFTForEachBlock uint256 rewardPerNFTForEachBlock; //Reward for each block for every NFT, can only be set one with rewardForEachBlock } // Info of each pool. struct PoolInfo { IWrappedNFT wnft;// Address of wnft contract. uint256 startBlock; // Reward start block. uint256 currentRewardIndex;// the current reward phase index for poolsRewardInfos uint256 currentRewardEndBlock; // the current reward end block. uint256 amount; // How many NFTs the pool has. uint256 lastRewardBlock; // Last block number that token distribution occurs. uint256 accTokenPerShare; // Accumulated tokens per share, times 1e12. IERC20 dividendToken; uint256 accDividendPerShare; // Accumulated dividend per share, times 1e12. uint256 depositFee;// ETH charged when user deposit. } function poolLength() external view returns (uint256); function poolRewardLength(uint256 _pid) external view returns (uint256); function poolInfos(uint256 _pid) external view returns (IWrappedNFT _wnft, uint256 _startBlock, uint256 _currentRewardIndex, uint256 _currentRewardEndBlock, uint256 _amount, uint256 _lastRewardBlock, uint256 _accTokenPerShare, IERC20 _dividendToken, uint256 _accDividendPerShare, uint256 _depositFee); function poolsRewardInfos(uint256 _pid, uint256 _rewardInfoId) external view returns (uint256 _rewardBlock, uint256 _rewardForEachBlock, uint256 _rewardPerNFTForEachBlock); function poolNFTInfos(uint256 _pid, uint256 _nftTokenId) external view returns (bool _deposited, uint256 _rewardDebt, uint256 _dividendDebt); function getPoolCurrentReward(uint256 _pid) external view returns (RewardInfo memory _rewardInfo, uint256 _currentRewardIndex); function getPoolEndBlock(uint256 _pid) external view returns (uint256 _poolEndBlock); function isPoolEnd(uint256 _pid) external view returns (bool); function pending(uint256 _pid, uint256[] memory _wnftTokenIds) external view returns (uint256 _mining, uint256 _dividend); function deposit(uint256 _pid, uint256[] memory _tokenIds) external payable; function withdraw(uint256 _pid, uint256[] memory _wnftTokenIds) external; function withdrawWithoutHarvest(uint256 _pid, uint256[] memory _wnftTokenIds) external; function harvest(uint256 _pid, address _forUser, uint256[] memory _wnftTokenIds) external returns (uint256 _mining, uint256 _dividend); } contract NFTMasterChef is INFTMasterChef, Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; using ArrayUtils for uint256[]; uint256 private constant ACC_TOKEN_PRECISION = 1e12; IWrappedNFTFactory public immutable wnftFactory; IERC20 public immutable token;// The reward TOKEN! IHarvestStrategy public harvestStrategy; address payable public devAddress; PoolInfo[] public poolInfos;// Info of each pool. RewardInfo[][] public poolsRewardInfos; mapping (uint256 => NFTInfo)[] public poolNFTInfos;// the nftInfo for pool modifier validatePoolByPid(uint256 _pid) { require(_pid < poolInfos.length, "NFTMasterChef: Pool does not exist"); _; } constructor( IWrappedNFTFactory _wnftFactory, IERC20 _token, address payable _devAddress ) { require(address(_wnftFactory) != address(0) && address(_token) != address(0) && address(_devAddress) != address(0), "NFTMasterChef: invalid parameters!"); wnftFactory = _wnftFactory; token = _token; devAddress = _devAddress; } function poolLength() external view returns (uint256) { return poolInfos.length; } function poolRewardLength(uint256 _pid) external view validatePoolByPid(_pid) returns (uint256) { return poolsRewardInfos[_pid].length; } // Add a new NFT to the pool. Can only be called by the owner. function addPoolInfo(IERC721Metadata _nft, uint256 _startBlock, RewardInfo[] memory _rewards, uint256 _depositFee, IERC20 _dividendToken, bool _withUpdate) external onlyOwner nonReentrant { require(address(_nft) != address(0), "NFTMasterChef: wrong _nft or _dividendToken!"); require(_rewards.length > 0, "NFTMasterChef: _rewards must be set!"); uint256 rewardForEachBlock = _rewards[0].rewardForEachBlock; uint256 rewardPerNFTForEachBlock = _rewards[0].rewardPerNFTForEachBlock; //allow pool with dividend and without mining, or must have mining. Mining can only have either rewardForEachBlock or _rewardPerNFTForEachBlock set. require((address(_dividendToken) != address(0) && (rewardForEachBlock == 0 && rewardPerNFTForEachBlock == 0)) || ((rewardForEachBlock == 0 && rewardPerNFTForEachBlock > 0) || (rewardForEachBlock > 0 && rewardPerNFTForEachBlock == 0)), "NFTMasterChef: rewardForEachBlock or rewardPerNFTForEachBlock must be greater than zero!"); IWrappedNFT wnft = wnftFactory.wnfts(_nft); require(address(wnft) != address(0) && wnft.nft() == _nft && wnft.factory() == wnftFactory && wnft.delegator() == address(this), "NFTMasterChef: wrong wnft!"); if (_withUpdate) { massUpdatePools(); } PoolInfo storage pool = poolInfos.push(); pool.wnft = wnft; pool.amount = 0; pool.startBlock = block.number > _startBlock ? block.number : _startBlock; pool.lastRewardBlock = pool.startBlock; pool.accTokenPerShare = 0; pool.depositFee = _depositFee; pool.dividendToken = _dividendToken; pool.accDividendPerShare = 0; RewardInfo[] storage rewards = poolsRewardInfos.push(); _setPoolRewards(poolInfos.length - 1, _rewards); pool.currentRewardEndBlock = pool.startBlock + rewards[0].rewardBlock; poolNFTInfos.push(); emit AddPoolInfo(_nft, wnft, _startBlock, _rewards, _depositFee, _dividendToken, _withUpdate); } function _setPoolRewards(uint256 _pid, RewardInfo[] memory _rewards) internal { RewardInfo[] storage rewards = poolsRewardInfos[_pid]; bool rewardForEachBlockSet; if(_rewards.length > 0){ rewardForEachBlockSet = _rewards[0].rewardForEachBlock > 0; } for (uint256 i = 0; i < _rewards.length; i++) { RewardInfo memory reward = _rewards[i]; require(reward.rewardBlock > 0, "NFTMasterChef: rewardBlock error!"); require(!(reward.rewardForEachBlock > 0 && reward.rewardPerNFTForEachBlock > 0), "NFTMasterChef: reward can only set one!"); require((rewardForEachBlockSet && reward.rewardForEachBlock > 0) || (!rewardForEachBlockSet && reward.rewardPerNFTForEachBlock > 0) || (reward.rewardForEachBlock == 0 && reward.rewardPerNFTForEachBlock == 0), "NFTMasterChef: setting error!"); rewards.push(RewardInfo({ rewardBlock: reward.rewardBlock, rewardForEachBlock: reward.rewardForEachBlock, rewardPerNFTForEachBlock: reward.rewardPerNFTForEachBlock })); } } // update the pool reward of specified index function updatePoolReward(uint256 _pid, uint256 _rewardIndex, uint256 _rewardBlock, uint256 _rewardForEachBlock, uint256 _rewardPerNFTForEachBlock) external validatePoolByPid(_pid) onlyOwner nonReentrant { PoolInfo storage pool = poolInfos[_pid]; require(!isPoolEnd(_pid), "NFTMasterChef: pool is end!"); require(_rewardBlock > 0, "NFTMasterChef: rewardBlock error!"); require(_rewardIndex < poolsRewardInfos[_pid].length, "NFTMasterChef: _rewardIndex not exists!"); (, uint256 _currentRewardIndex) = getPoolCurrentReward(_pid); require(_rewardIndex >= _currentRewardIndex, "NFTMasterChef: _rewardIndex error!"); RewardInfo storage reward = poolsRewardInfos[_pid][_rewardIndex]; require(_rewardBlock >= reward.rewardBlock, "NFTMasterChef: _rewardBlock error!"); require(!(_rewardForEachBlock > 0 && _rewardPerNFTForEachBlock > 0), "NFTMasterChef: reward can only set one!"); require((reward.rewardForEachBlock > 0 && _rewardForEachBlock > 0) || (reward.rewardPerNFTForEachBlock > 0 && _rewardPerNFTForEachBlock > 0) || (_rewardForEachBlock == 0 && _rewardPerNFTForEachBlock == 0), "NFTMasterChef: invalid parameters!"); updatePool(_pid); if(_rewardIndex == _currentRewardIndex){ pool.currentRewardEndBlock = pool.currentRewardEndBlock + _rewardBlock - reward.rewardBlock; } reward.rewardBlock = _rewardBlock; reward.rewardForEachBlock = _rewardForEachBlock; reward.rewardPerNFTForEachBlock = _rewardPerNFTForEachBlock; emit UpdatePoolReward(_pid, _rewardIndex, _rewardBlock, _rewardForEachBlock, _rewardPerNFTForEachBlock); } // Update the given pool's pool info. Can only be called by the owner. function setStartBlock(uint256 _pid, uint256 _startBlock) external validatePoolByPid(_pid) onlyOwner nonReentrant { PoolInfo storage pool = poolInfos[_pid]; require(block.number < pool.startBlock, "NFTMasterChef: can not change start block of started pool!"); require(block.number < _startBlock, "NFTMasterChef: _startBlock must be less than block.number!"); pool.startBlock = _startBlock; emit SetStartBlock(_pid, _startBlock); } function isPoolEnd(uint256 _pid) public view returns (bool) { uint256 poolEndBlock = getPoolEndBlock(_pid); return block.number > poolEndBlock; } function getPoolEndBlock(uint256 _pid) public view returns (uint256 _poolEndBlock) { PoolInfo storage pool = poolInfos[_pid]; _poolEndBlock = pool.currentRewardEndBlock; RewardInfo[] storage rewards = poolsRewardInfos[_pid]; for(uint256 index = pool.currentRewardIndex + 1; index < rewards.length; index ++){ _poolEndBlock = _poolEndBlock.add(rewards[index].rewardBlock); } } function getPoolCurrentReward(uint256 _pid) public view returns (RewardInfo memory _rewardInfo, uint256 _currentRewardIndex){ PoolInfo storage pool = poolInfos[_pid]; _currentRewardIndex = pool.currentRewardIndex; uint256 poolCurrentRewardEndBlock = pool.currentRewardEndBlock; uint256 poolRewardNumber = poolsRewardInfos[_pid].length; _rewardInfo = poolsRewardInfos[_pid][_currentRewardIndex]; // Check whether to adjust multipliers and reward per block while ((block.number > poolCurrentRewardEndBlock) && (_currentRewardIndex < (poolRewardNumber - 1))) { // Update rewards per block _currentRewardIndex ++; _rewardInfo = poolsRewardInfos[_pid][_currentRewardIndex]; // Adjust the end block poolCurrentRewardEndBlock = poolCurrentRewardEndBlock.add(_rewardInfo.rewardBlock); } } // Update the given pool's pool info. Can only be called by the owner. function setPoolDividendToken(uint256 _pid, IERC20 _dividendToken) external validatePoolByPid(_pid) onlyOwner nonReentrant { PoolInfo storage pool = poolInfos[_pid]; require(!isPoolEnd(_pid), "NFTMasterChef: pool is end!"); require(address(pool.dividendToken) == address(0) || pool.accDividendPerShare == 0, "NFTMasterChef: dividendToken can not be modified!"); pool.dividendToken = _dividendToken; emit SetPoolDividendToken(_pid, _dividendToken); } // Update the given pool's operation fee function setPoolDepositFee(uint256 _pid, uint256 _depositFee) public validatePoolByPid(_pid) onlyOwner nonReentrant { PoolInfo storage pool = poolInfos[_pid]; require(!isPoolEnd(_pid), "NFTMasterChef: pool is end!"); pool.depositFee = _depositFee; emit SetPoolDepositFee(_pid, _depositFee); } //harvestStrategy change be changed and can be zero. function setHarvestStrategy(IHarvestStrategy _harvestStrategy) external onlyOwner nonReentrant { harvestStrategy = _harvestStrategy; emit SetHarvestStrategy(_harvestStrategy); } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { if(_to > _from){ return _to.sub(_from); } return 0; } function _getMultiplier(uint256 _lastRewardBlock, uint256 _currentRewardEndBlock) internal view returns (uint256 _multiplier) { if(block.number < _lastRewardBlock){ return 0; }else if (block.number > _currentRewardEndBlock){ _multiplier = getMultiplier(_lastRewardBlock, _currentRewardEndBlock); }else{ _multiplier = getMultiplier(_lastRewardBlock, block.number); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public validatePoolByPid(_pid) { PoolInfo storage pool = poolInfos[_pid]; if (block.number <= pool.lastRewardBlock){ return; } if (block.number < pool.startBlock){ return; } if (pool.lastRewardBlock >= getPoolEndBlock(_pid)){ return; } RewardInfo[] storage rewards = poolsRewardInfos[_pid]; if(rewards.length == 0 || pool.currentRewardIndex > (rewards.length - 1)){ return; } RewardInfo storage reward = rewards[pool.currentRewardIndex]; if(reward.rewardForEachBlock == 0 && reward.rewardPerNFTForEachBlock == 0){// only dividend pool do not need update pool return; } if (pool.lastRewardBlock < pool.startBlock) { pool.lastRewardBlock = pool.startBlock; } if (pool.amount == 0) { pool.lastRewardBlock = block.number; // update current reward index while ((pool.lastRewardBlock > pool.currentRewardEndBlock) && (pool.currentRewardIndex < (poolsRewardInfos[_pid].length - 1))) { // Update rewards per block pool.currentRewardIndex ++; // Adjust the end block pool.currentRewardEndBlock = pool.currentRewardEndBlock.add(reward.rewardBlock); } return; } uint256 multiplier = _getMultiplier(pool.lastRewardBlock, pool.currentRewardEndBlock); uint256 rewardForEachBlock = reward.rewardForEachBlock; if(rewardForEachBlock == 0){ rewardForEachBlock = pool.amount.mul(reward.rewardPerNFTForEachBlock); } uint256 poolReward = multiplier.mul(rewardForEachBlock); uint256 poolRewardNumber = poolsRewardInfos[_pid].length; // Check whether to adjust multipliers and reward per block while ((block.number > pool.currentRewardEndBlock) && (pool.currentRewardIndex < (poolRewardNumber - 1))) { // Update rewards per block pool.currentRewardIndex ++; uint256 previousEndBlock = pool.currentRewardEndBlock; reward = poolsRewardInfos[_pid][pool.currentRewardIndex]; // Adjust the end block pool.currentRewardEndBlock = pool.currentRewardEndBlock.add(reward.rewardBlock); // Adjust multiplier to cover the missing periods with other lower inflation schedule uint256 newMultiplier = _getMultiplier(previousEndBlock, pool.currentRewardEndBlock); rewardForEachBlock = reward.rewardForEachBlock; if(rewardForEachBlock == 0){ rewardForEachBlock = pool.amount.mul(reward.rewardPerNFTForEachBlock); } // Adjust token rewards poolReward = poolReward.add(newMultiplier.mul(rewardForEachBlock)); } if (block.number > pool.currentRewardEndBlock){ pool.lastRewardBlock = pool.currentRewardEndBlock; }else{ pool.lastRewardBlock = block.number; } pool.accTokenPerShare = pool.accTokenPerShare.add(poolReward.mul(ACC_TOKEN_PRECISION).div(pool.amount)); } // View function to see mining tokens and dividend on frontend. function pending(uint256 _pid, uint256[] memory _wnftTokenIds) public view validatePoolByPid(_pid) returns (uint256 _mining, uint256 _dividend) { _requireTokenIds(_wnftTokenIds); PoolInfo storage pool = poolInfos[_pid]; mapping(uint256 => NFTInfo) storage nfts = poolNFTInfos[_pid]; RewardInfo[] storage rewards = poolsRewardInfos[_pid]; RewardInfo storage reward = rewards[pool.currentRewardIndex]; uint256 accTokenPerShare = pool.accTokenPerShare; uint256 rewardForEachBlock = reward.rewardForEachBlock; if(rewardForEachBlock == 0){ rewardForEachBlock = pool.amount.mul(reward.rewardPerNFTForEachBlock); } if(rewardForEachBlock > 0){ uint256 lastRewardBlock = pool.lastRewardBlock; if (lastRewardBlock < pool.startBlock) { lastRewardBlock = pool.startBlock; } if (block.number > lastRewardBlock && block.number >= pool.startBlock && pool.amount > 0){ uint256 multiplier = _getMultiplier(lastRewardBlock, pool.currentRewardEndBlock); uint256 poolReward = multiplier.mul(rewardForEachBlock); uint256 poolRewardNumber = poolsRewardInfos[_pid].length; uint256 poolCurrentRewardIndex = pool.currentRewardIndex; uint256 poolEndBlock = pool.currentRewardEndBlock; // Check whether to adjust multipliers and reward per block while ((block.number > poolEndBlock) && (poolCurrentRewardIndex < (poolRewardNumber - 1))) { // Update rewards per block poolCurrentRewardIndex ++; uint256 previousEndBlock = poolEndBlock; reward = rewards[poolCurrentRewardIndex]; // Adjust the end block poolEndBlock = poolEndBlock.add(reward.rewardBlock); // Adjust multiplier to cover the missing periods with other lower inflation schedule uint256 newMultiplier = getMultiplier(previousEndBlock, poolEndBlock); rewardForEachBlock = reward.rewardForEachBlock; if(rewardForEachBlock == 0){ rewardForEachBlock = pool.amount.mul(reward.rewardPerNFTForEachBlock); } // Adjust token rewards poolReward = poolReward.add(newMultiplier.mul(rewardForEachBlock)); } accTokenPerShare = accTokenPerShare.add(poolReward.mul(ACC_TOKEN_PRECISION).div(pool.amount)); } } uint256 temp; NFTInfo storage nft; for(uint256 i = 0; i < _wnftTokenIds.length; i ++){ uint256 wnftTokenId = _wnftTokenIds[i]; nft = nfts[wnftTokenId]; if(nft.deposited == true){ temp = accTokenPerShare.div(ACC_TOKEN_PRECISION); _mining = _mining.add(temp.sub(nft.rewardDebt)); if(pool.accDividendPerShare > 0 && address(pool.dividendToken) != address(0)){ _dividend = _dividend.add(pool.accDividendPerShare.div(ACC_TOKEN_PRECISION).sub(nft.dividendDebt)); } } } } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfos.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Deposit NFTs to MasterChef for token allocation, do not give user reward. function deposit(uint256 _pid, uint256[] memory _tokenIds) external validatePoolByPid(_pid) payable nonReentrant { _requireTokenIds(_tokenIds); updatePool(_pid); PoolInfo storage pool = poolInfos[_pid]; require(block.number >= pool.startBlock, "NFTMasterChef: pool is not start!"); require(!isPoolEnd(_pid), "NFTMasterChef: pool is end!"); if(pool.depositFee > 0){// charge for fee require(msg.value == pool.depositFee, "NFTMasterChef: Fee is not enough or too much!"); devAddress.transfer(pool.depositFee); } mapping(uint256 => NFTInfo) storage nfts = poolNFTInfos[_pid]; uint256 tokenId; NFTInfo storage nft; uint256 depositNumber; for(uint256 i = 0; i < _tokenIds.length; i ++){ tokenId = _tokenIds[i]; //ownerOf will return error if tokenId does not exist. require(pool.wnft.nft().ownerOf(tokenId) == msg.sender, "NFTMasterChef: can not deposit nft not owned!"); nft = nfts[tokenId]; //If tokenId have reward not harvest, drop it. if(nft.deposited == false){ depositNumber ++; nft.deposited = true; } nft.rewardDebt = pool.accTokenPerShare.div(ACC_TOKEN_PRECISION); nft.dividendDebt = pool.accDividendPerShare.div(ACC_TOKEN_PRECISION); } pool.wnft.deposit(msg.sender, _tokenIds); pool.amount = pool.amount.add(depositNumber); emit Deposit(msg.sender, _pid, _tokenIds); } // Withdraw NFTs from MasterChef. function withdraw(uint256 _pid, uint256[] memory _wnftTokenIds) external validatePoolByPid(_pid) nonReentrant { _harvest(_pid, msg.sender, _wnftTokenIds); _withdrawWithoutHarvest(_pid, _wnftTokenIds); emit Withdraw(msg.sender, _pid, _wnftTokenIds); } // Withdraw NFTs from MasterChef without reward function _withdrawWithoutHarvest(uint256 _pid, uint256[] memory _wnftTokenIds) internal validatePoolByPid(_pid) { _requireTokenIds(_wnftTokenIds); PoolInfo storage pool = poolInfos[_pid]; mapping(uint256 => NFTInfo) storage nfts = poolNFTInfos[_pid]; uint256 wnftTokenId; NFTInfo storage nft; uint256 withdrawNumber; for(uint256 i = 0; i < _wnftTokenIds.length; i ++){ wnftTokenId = _wnftTokenIds[i]; require(pool.wnft.ownerOf(wnftTokenId) == msg.sender, "NFTMasterChef: can not withdraw nft now owned!"); nft = nfts[wnftTokenId]; if(nft.deposited == true){ withdrawNumber ++; nft.deposited = false; } nft.rewardDebt = 0; nft.dividendDebt = 0; } pool.wnft.withdraw(msg.sender, _wnftTokenIds); pool.amount = pool.amount.sub(withdrawNumber); } // Withdraw without caring about rewards. EMERGENCY ONLY. function withdrawWithoutHarvest(uint256 _pid, uint256[] memory _wnftTokenIds) external validatePoolByPid(_pid) nonReentrant { updatePool(_pid); _withdrawWithoutHarvest(_pid, _wnftTokenIds); emit WithdrawWithoutHarvest(msg.sender, _pid, _wnftTokenIds); } // Harvest the mining reward and dividend function harvest(uint256 _pid, address _forUser, uint256[] memory _wnftTokenIds) external validatePoolByPid(_pid) nonReentrant returns (uint256 _mining, uint256 _dividend) { return _harvest(_pid, _forUser, _wnftTokenIds); } function canHarvest(uint256 _pid, address _forUser, uint256[] memory _wnftTokenIds) public view validatePoolByPid(_pid) returns (bool) { if(address(harvestStrategy) != address(0)){ return harvestStrategy.canHarvest(_pid, _forUser, _wnftTokenIds); } return true; } function _harvest(uint256 _pid, address _forUser, uint256[] memory _wnftTokenIds) internal validatePoolByPid(_pid) returns (uint256 _mining, uint256 _dividend) { _requireTokenIds(_wnftTokenIds); if(_forUser == address(0)){ _forUser = msg.sender; } require(canHarvest(_pid, _forUser, _wnftTokenIds), "NFTMasterChef: can not harvest!"); updatePool(_pid); PoolInfo storage pool = poolInfos[_pid]; mapping(uint256 => NFTInfo) storage nfts = poolNFTInfos[_pid]; uint256 wnftTokenId; NFTInfo storage nft; uint256 temp = 0; for(uint256 i = 0; i < _wnftTokenIds.length; i ++){ wnftTokenId = _wnftTokenIds[i]; nft = nfts[wnftTokenId]; require(pool.wnft.ownerOf(wnftTokenId) == _forUser, "NFTMasterChef: can not harvest nft now owned!"); if(nft.deposited == true){ temp = pool.accTokenPerShare.div(ACC_TOKEN_PRECISION); _mining = _mining.add(temp.sub(nft.rewardDebt)); nft.rewardDebt = temp; if(pool.accDividendPerShare > 0 && address(pool.dividendToken) != address(0)){ temp = pool.accDividendPerShare.div(ACC_TOKEN_PRECISION); _dividend = _dividend.add(temp.sub(nft.dividendDebt)); nft.dividendDebt = temp; } } } if (_mining > 0) { _safeTransferTokenFromThis(token, _forUser, _mining); } if(_dividend > 0){ _safeTransferTokenFromThis(pool.dividendToken, _forUser, _dividend); } emit Harvest(_forUser, _pid, _wnftTokenIds, _mining, _dividend); } function emergencyStop(address payable _to) external onlyOwner nonReentrant { if(_to == address(0)){ _to = payable(msg.sender); } uint256 addrBalance = token.balanceOf(address(this)); if(addrBalance > 0){ token.safeTransfer(_to, addrBalance); } uint256 length = poolInfos.length; for (uint256 pid = 0; pid < length; ++ pid) { closePool(pid, _to); PoolInfo storage pool = poolInfos[pid]; if(pool.accDividendPerShare > 0 && address(pool.dividendToken) != address(0)){ uint256 bal = pool.dividendToken.balanceOf(address(this)); if(bal > 0){ pool.dividendToken.safeTransfer(_to, bal); } } } emit EmergencyStop(msg.sender, _to); } function closePool(uint256 _pid, address payable _to) public validatePoolByPid(_pid) onlyOwner { PoolInfo storage pool = poolInfos[_pid]; if(isPoolEnd(_pid)){ return; } if(poolsRewardInfos[_pid].length > 0){ pool.currentRewardIndex = poolsRewardInfos[_pid].length - 1; } pool.currentRewardEndBlock = block.number; if(_to == address(0)){ _to = payable(msg.sender); } emit ClosePool(_pid, _to); } function _safeTransferTokenFromThis(IERC20 _token, address _to, uint256 _amount) internal { uint256 bal = _token.balanceOf(address(this)); if (_amount > bal) { _token.safeTransfer(_to, bal); } else { _token.safeTransfer(_to, _amount); } } // Update dev1 address by the previous dev. function updateDevAddress(address payable _devAddress) external nonReentrant { require(msg.sender == devAddress, "NFTMasterChef: dev: wut?"); require(_devAddress != address(0), "NFTMasterChef: address can not be zero!"); devAddress = _devAddress; emit UpdateDevAddress(_devAddress); } function addDividendForPool(uint256 _pid, uint256 _addDividend) external validatePoolByPid(_pid) onlyOwner nonReentrant { PoolInfo storage pool = poolInfos[_pid]; require(_addDividend > 0, "NFTMasterChef: add token error!"); require(address(pool.dividendToken) != address(0), "NFTMasterChef: no dividend token set!"); require(!isPoolEnd(_pid), "NFTMasterChef: pool is end!"); pool.accDividendPerShare = pool.accDividendPerShare.add(_addDividend.mul(ACC_TOKEN_PRECISION).div(pool.amount)); pool.dividendToken.safeTransferFrom(msg.sender, address(this), _addDividend); emit AddDividendForPool(_pid, _addDividend); } function _requireTokenIds(uint256[] memory _tokenIds) internal pure { require(_tokenIds.length > 0, "NFTMasterChef: tokenIds can not be empty!"); require(!_tokenIds.hasDuplicate(), "NFTMasterChef: tokenIds can not contain duplicate ones!"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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 // StarBlock DAO Contracts pragma solidity ^0.8.0; library ArrayUtils { function hasDuplicate(uint256[] memory self) external pure returns(bool) { uint256 ivalue; uint256 jvalue; for(uint256 i = 0; i < self.length - 1; i ++){ ivalue = self[i]; for(uint256 j = i + 1; j < self.length; j ++){ jvalue = self[j]; if(ivalue == jvalue){ return true; } } } return false; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; 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"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // StarBlock DAO Contracts pragma solidity ^0.8.0; import "./IERC2981.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; interface IERC2981Mutable is IERC165, IERC2981 { function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external; function deleteDefaultRoyalty() external; } interface IBaseWrappedNFT is IERC165, IERC2981Mutable, IERC721Receiver, IERC721, IERC721Metadata { event DelegatorChanged(address _delegator); event Deposit(address _forUser, uint256[] _tokenIds); event Withdraw(address _forUser, uint256[] _wnftTokenIds); function nft() external view returns (IERC721Metadata); function factory() external view returns (IWrappedNFTFactory); function deposit(address _forUser, uint256[] memory _tokenIds) external; function withdraw(address _forUser, uint256[] memory _wnftTokenIds) external; function exists(uint256 _tokenId) external view returns (bool); function delegator() external view returns (address); function setDelegator(address _delegator) external; function isEnumerable() external view returns (bool); } interface IWrappedNFT is IBaseWrappedNFT { function totalSupply() external view returns (uint256); } interface IWrappedNFTEnumerable is IWrappedNFT, IERC721Enumerable { function totalSupply() external view override(IWrappedNFT, IERC721Enumerable) returns (uint256); } interface IWrappedNFTFactory { event WrappedNFTDeployed(IERC721Metadata _nft, IWrappedNFT _wnft, bool _isEnumerable); event WNFTDelegatorChanged(address _wnftDelegator); function wnftDelegator() external view returns (address); function deployWrappedNFT(IERC721Metadata _nft, bool _isEnumerable) external returns (IWrappedNFT); function wnfts(IERC721Metadata _nft) external view returns (IWrappedNFT); function wnftsNumber() external view returns (uint); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IWrappedNFTFactory","name":"_wnftFactory","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address payable","name":"_devAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"addDividend","type":"uint256"}],"name":"AddDividendForPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC721Metadata","name":"nft","type":"address"},{"indexed":false,"internalType":"contract IWrappedNFT","name":"wnft","type":"address"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardForEachBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerNFTForEachBlock","type":"uint256"}],"indexed":false,"internalType":"struct INFTMasterChef.RewardInfo[]","name":"rewards","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"depositFee","type":"uint256"},{"indexed":false,"internalType":"contract IERC20","name":"dividendToken","type":"address"},{"indexed":false,"internalType":"bool","name":"withUpdate","type":"bool"}],"name":"AddPoolInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"addTokenPerPool","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"addTokenPerBlock","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withTokenTransfer","type":"bool"}],"name":"AddTokenRewardForPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address payable","name":"to","type":"address"}],"name":"ClosePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"wnftTokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"mining","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dividend","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IHarvestStrategy","name":"harvestStrategy","type":"address"}],"name":"SetHarvestStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFee","type":"uint256"}],"name":"SetPoolDepositFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"contract IERC20","name":"dividendToken","type":"address"}],"name":"SetPoolDividendToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"}],"name":"SetStartBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"devAddress","type":"address"}],"name":"UpdateDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardForEachBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerNFTForEachBlock","type":"uint256"}],"name":"UpdatePoolReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"wnfTokenIds","type":"uint256[]"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"wnfTokenIds","type":"uint256[]"}],"name":"WithdrawWithoutHarvest","type":"event"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_addDividend","type":"uint256"}],"name":"addDividendForPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"_nft","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardForEachBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerNFTForEachBlock","type":"uint256"}],"internalType":"struct INFTMasterChef.RewardInfo[]","name":"_rewards","type":"tuple[]"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"contract IERC20","name":"_dividendToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"addPoolInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_forUser","type":"address"},{"internalType":"uint256[]","name":"_wnftTokenIds","type":"uint256[]"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"closePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"emergencyStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolCurrentReward","outputs":[{"components":[{"internalType":"uint256","name":"rewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardForEachBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerNFTForEachBlock","type":"uint256"}],"internalType":"struct INFTMasterChef.RewardInfo","name":"_rewardInfo","type":"tuple"},{"internalType":"uint256","name":"_currentRewardIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolEndBlock","outputs":[{"internalType":"uint256","name":"_poolEndBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_forUser","type":"address"},{"internalType":"uint256[]","name":"_wnftTokenIds","type":"uint256[]"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"_mining","type":"uint256"},{"internalType":"uint256","name":"_dividend","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestStrategy","outputs":[{"internalType":"contract IHarvestStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"isPoolEnd","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_wnftTokenIds","type":"uint256[]"}],"name":"pending","outputs":[{"internalType":"uint256","name":"_mining","type":"uint256"},{"internalType":"uint256","name":"_dividend","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfos","outputs":[{"internalType":"contract IWrappedNFT","name":"wnft","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"currentRewardIndex","type":"uint256"},{"internalType":"uint256","name":"currentRewardEndBlock","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"contract IERC20","name":"dividendToken","type":"address"},{"internalType":"uint256","name":"accDividendPerShare","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolNFTInfos","outputs":[{"internalType":"bool","name":"deposited","type":"bool"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"dividendDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolsRewardInfos","outputs":[{"internalType":"uint256","name":"rewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardForEachBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerNFTForEachBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IHarvestStrategy","name":"_harvestStrategy","type":"address"}],"name":"setHarvestStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"setPoolDepositFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"contract IERC20","name":"_dividendToken","type":"address"}],"name":"setPoolDividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"name":"setStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_devAddress","type":"address"}],"name":"updateDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_rewardIndex","type":"uint256"},{"internalType":"uint256","name":"_rewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardForEachBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerNFTForEachBlock","type":"uint256"}],"name":"updatePoolReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_wnftTokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_wnftTokenIds","type":"uint256[]"}],"name":"withdrawWithoutHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wnftFactory","outputs":[{"internalType":"contract IWrappedNFTFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620048063803806200480683398101604081905262000034916200016d565b6200003f3362000104565b600180556001600160a01b038316158015906200006457506001600160a01b03821615155b80156200007957506001600160a01b03811615155b620000d55760405162461bcd60e51b815260206004820152602260248201527f4e46544d6173746572436865663a20696e76616c696420706172616d65746572604482015261732160f01b606482015260840160405180910390fd5b6001600160a01b0392831660805290821660a052600380546001600160a01b03191691909216179055620001c1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200016a57600080fd5b50565b6000806000606084860312156200018357600080fd5b8351620001908162000154565b6020850151909350620001a38162000154565b6040850151909250620001b68162000154565b809150509250925092565b60805160a0516145fc6200020a6000396000818161070001528181611b1501528181611b9d015261354e01526000818161025401528181610a6d0152610b6f01526145fc6000f3fe6080604052600436106101f95760003560e01c80638a796bf61161010d578063d65d5a9b116100a0578063ec6563e01161006f578063ec6563e014610671578063f2fde38b146106ae578063f9b89542146106ce578063fc0c546a146106ee578063ffb6bf381461072257600080fd5b8063d65d5a9b146105fe578063da2488cd1461061e578063de3ab7811461063e578063e3f0020b1461065157600080fd5b8063b9685cd2116100dc578063b9685cd21461052c578063c0f2762b1461054c578063cd7a65f914610593578063d5e93c90146105ce57600080fd5b80638a796bf6146104ae5780638da5cb5b146104ce5780638dbb1e3a146104ec578063a76fef931461050c57600080fd5b80635915d806116101905780636632a96d1161015f5780636632a96d146103a5578063689d84e4146103c5578063715018a6146104445780637e25542b14610459578063850337621461048e57600080fd5b80635915d806146103305780636091954a14610350578063630b5ba11461037057806364c9e7af1461038557600080fd5b80633ad10ef6116101cc5780633ad10ef6146102b05780633cc29d7d146102d05780635106d62a146102f057806351eb05a61461031057600080fd5b8063081e3eda146101fe578063100936d01461022257806319a842471461024257806337ebb71c1461028e575b600080fd5b34801561020a57600080fd5b506004545b6040519081526020015b60405180910390f35b34801561022e57600080fd5b5061020f61023d366004613d7c565b610742565b34801561024e57600080fd5b506102767f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610219565b34801561029a57600080fd5b506102ae6102a9366004613e67565b6107f8565b005b3480156102bc57600080fd5b50600354610276906001600160a01b031681565b3480156102dc57600080fd5b5061020f6102eb366004613d7c565b610e87565b3480156102fc57600080fd5b506102ae61030b366004613f71565b610ed3565b34801561031c57600080fd5b506102ae61032b366004613d7c565b61107d565b34801561033c57600080fd5b506102ae61034b366004614007565b611401565b34801561035c57600080fd5b506102ae61036b36600461404e565b6114ae565b34801561037c57600080fd5b506102ae61187c565b34801561039157600080fd5b506102ae6103a0366004614089565b6118a3565b3480156103b157600080fd5b506102ae6103c03660046140ab565b611a9a565b3480156103d157600080fd5b506103e56103e0366004613d7c565b611d14565b604080516001600160a01b039b8c168152602081019a909a528901979097526060880195909552608087019390935260a086019190915260c085015290931660e083015261010082019290925261012081019190915261014001610219565b34801561045057600080fd5b506102ae611d84565b34801561046557600080fd5b50610479610474366004614007565b611dba565b60408051928352602083019190915201610219565b34801561049a57600080fd5b506102ae6104a93660046140ab565b61212b565b3480156104ba57600080fd5b506102ae6104c9366004614089565b61226c565b3480156104da57600080fd5b506000546001600160a01b0316610276565b3480156104f857600080fd5b5061020f610507366004614089565b612434565b34801561051857600080fd5b506104796105273660046140c8565b612459565b34801561053857600080fd5b506102ae610547366004614089565b6124c5565b34801561055857600080fd5b5061056c610567366004613d7c565b6125c5565b60408051835181526020808501519082015292810151908301526060820152608001610219565b34801561059f57600080fd5b506105b36105ae366004614089565b612756565b60408051938452602084019290925290820152606001610219565b3480156105da57600080fd5b506105ee6105e93660046140c8565b6127a4565b6040519015158152602001610219565b34801561060a57600080fd5b506102ae6106193660046140ab565b612864565b34801561062a57600080fd5b506102ae610639366004613f71565b612904565b6102ae61064c366004614007565b612a42565b34801561065d57600080fd5b506102ae61066c366004614007565b612edb565b34801561067d57600080fd5b5061069161068c366004614089565b612f73565b604080519315158452602084019290925290820152606001610219565b3480156106ba57600080fd5b506102ae6106c93660046140ab565b612fb0565b3480156106da57600080fd5b50600254610276906001600160a01b031681565b3480156106fa57600080fd5b506102767f000000000000000000000000000000000000000000000000000000000000000081565b34801561072e57600080fd5b506105ee61073d366004613d7c565b61304b565b6000806004838154811061075857610758614121565b90600052602060002090600a020190508060030154915060006005848154811061078457610784614121565b9060005260206000200190506000826002015460016107a3919061414d565b90505b81548110156107f0576107dc8282815481106107c4576107c4614121565b60009182526020909120600390910201548590613060565b9350806107e881614165565b9150506107a6565b505050919050565b6000546001600160a01b0316331461082b5760405162461bcd60e51b815260040161082290614180565b60405180910390fd5b6002600154141561084e5760405162461bcd60e51b8152600401610822906141b5565b60026001556001600160a01b0386166108be5760405162461bcd60e51b815260206004820152602c60248201527f4e46544d6173746572436865663a2077726f6e67205f6e6674206f72205f646960448201526b766964656e64546f6b656e2160a01b6064820152608401610822565b600084511161091b5760405162461bcd60e51b8152602060048201526024808201527f4e46544d6173746572436865663a205f72657761726473206d757374206265206044820152637365742160e01b6064820152608401610822565b60008460008151811061093057610930614121565b602002602001015160200151905060008560008151811061095357610953614121565b602002602001015160400151905060006001600160a01b0316846001600160a01b03161415801561098b57508115801561098b575080155b806109b357508115801561099f5750600081115b806109b357506000821180156109b3575080155b610a4b5760405162461bcd60e51b815260206004820152605860248201527f4e46544d6173746572436865663a20726577617264466f7245616368426c6f6360448201527f6b206f72207265776172645065724e4654466f7245616368426c6f636b206d7560648201527f73742062652067726561746572207468616e207a65726f210000000000000000608482015260a401610822565b60405163b442103d60e01b81526001600160a01b0389811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063b442103d90602401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada91906141ec565b90506001600160a01b03811615801590610b665750886001600160a01b0316816001600160a01b03166347ccca026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5b91906141ec565b6001600160a01b0316145b8015610c0457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf991906141ec565b6001600160a01b0316145b8015610c825750306001600160a01b0316816001600160a01b031663ce9b79306040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7791906141ec565b6001600160a01b0316145b610cce5760405162461bcd60e51b815260206004820152601a60248201527f4e46544d6173746572436865663a2077726f6e6720776e6674210000000000006044820152606401610822565b8315610cdc57610cdc61187c565b600480546001810182556000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180546001600160a01b0385166001600160a01b03199091161781557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f90910191909155438910610d615788610d63565b435b6001828101829055600580840192909255600060068401819055600984018a90556007840180546001600160a01b0319166001600160a01b038b1617905560088401819055825480830184559290526004547f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920191610ded91610de791614209565b8a613073565b80600081548110610e0057610e00614121565b9060005260206000209060030201600001548260010154610e21919061414d565b60038301556006805460010181556000526040517f928a7bc8c4c6a28c554f7914638d2152e9d9e29a6af34dcce1ae860cf7484b8390610e6e908d9086908e908e908e908e908e90614220565b60405180910390a1505060018055505050505050505050565b60045460009082908110610ead5760405162461bcd60e51b8152600401610822906142c5565b60058381548110610ec057610ec0614121565b6000918252602090912001549392505050565b60045482908110610ef65760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b03163314610f205760405162461bcd60e51b815260040161082290614180565b60026001541415610f435760405162461bcd60e51b8152600401610822906141b5565b6002600181905550600060048481548110610f6057610f60614121565b90600052602060002090600a02019050610f798461304b565b15610f965760405162461bcd60e51b815260040161082290614307565b60078101546001600160a01b03161580610fb257506008810154155b6110185760405162461bcd60e51b815260206004820152603160248201527f4e46544d6173746572436865663a206469766964656e64546f6b656e2063616e604482015270206e6f74206265206d6f6469666965642160781b6064820152608401610822565b6007810180546001600160a01b0319166001600160a01b0385169081179091556040805186815260208101929092527fdff6a9c482b5d369a088fead7a79f940ac508779ce7c004c2f94442b836971af91015b60405180910390a15050600180555050565b600454819081106110a05760405162461bcd60e51b8152600401610822906142c5565b6000600483815481106110b5576110b5614121565b90600052602060002090600a02019050806005015443116110d557505050565b80600101544310156110e657505050565b6110ef83610742565b8160050154106110fe57505050565b60006005848154811061111357611113614121565b60009182526020909120018054909150158061113f5750805461113890600190614209565b8260020154115b1561114a5750505050565b60008183600201548154811061116257611162614121565b906000526020600020906003020190508060010154600014801561118857506002810154155b15611194575050505050565b8260010154836005015410156111af57600183015460058401555b6004830154611240574360058401555b8260030154836005015411801561120357506001600586815481106111e6576111e6614121565b6000918252602090912001546111fc9190614209565b8360020154105b156112395760028301805490600061121a83614165565b90915550508054600384015461122f91613060565b60038401556111bf565b5050505050565b600061125484600501548560030154613238565b600183015490915080611277576002830154600486015461127491613266565b90505b60006112838383613266565b905060006005898154811061129a5761129a614121565b60009182526020909120015490505b8660030154431180156112c957506112c2600182614209565b8760020154105b1561139e576002870180549060006112e083614165565b90915550506003870154600580548b9081106112fe576112fe614121565b9060005260206000200188600201548154811061131d5761131d614121565b906000526020600020906003020195506113488660000154896003015461306090919063ffffffff16565b6003890181905560009061135d908390613238565b6001880154955090508461138157600287015460048a015461137e91613266565b94505b61139561138e8287613266565b8590613060565b935050506112a9565b86600301544311156113b957600387015460058801556113c0565b4360058801555b60048701546113ed906113e2906113dc8564e8d4a51000613266565b90613272565b600689015490613060565b8760060181905550505050505050505b5050565b600454829081106114245760405162461bcd60e51b8152600401610822906142c5565b600260015414156114475760405162461bcd60e51b8152600401610822906141b5565b600260015561145783338461327e565b505061146383836135e7565b82336001600160a01b03167faef68853d1f7f9e4e5fe02896078a87a319c7b257208dac49346c8f03b36c6858460405161149d9190614379565b60405180910390a350506001805550565b600454859081106114d15760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146114fb5760405162461bcd60e51b815260040161082290614180565b6002600154141561151e5760405162461bcd60e51b8152600401610822906141b5565b600260018190555060006004878154811061153b5761153b614121565b90600052602060002090600a020190506115548761304b565b156115715760405162461bcd60e51b815260040161082290614307565b600085116115915760405162461bcd60e51b81526004016108229061438c565b600587815481106115a4576115a4614121565b600091825260209091200154861061160e5760405162461bcd60e51b815260206004820152602760248201527f4e46544d6173746572436865663a205f726577617264496e646578206e6f74206044820152666578697374732160c81b6064820152608401610822565b6000611619886125c5565b915050808710156116775760405162461bcd60e51b815260206004820152602260248201527f4e46544d6173746572436865663a205f726577617264496e646578206572726f604482015261722160f01b6064820152608401610822565b60006005898154811061168c5761168c614121565b9060005260206000200188815481106116a7576116a7614121565b9060005260206000209060030201905080600001548710156117165760405162461bcd60e51b815260206004820152602260248201527f4e46544d6173746572436865663a205f726577617264426c6f636b206572726f604482015261722160f01b6064820152608401610822565b6000861180156117265750600085115b156117435760405162461bcd60e51b8152600401610822906143cd565b600081600101541180156117575750600086115b806117715750600081600201541180156117715750600085115b80611783575085158015611783575084155b6117da5760405162461bcd60e51b815260206004820152602260248201527f4e46544d6173746572436865663a20696e76616c696420706172616d65746572604482015261732160f01b6064820152608401610822565b6117e38961107d565b8188141561180d57805460038401546117fd90899061414d565b6118079190614209565b60038401555b8681556001810186905560028101859055604080518a8152602081018a905290810188905260608101879052608081018690527f7710f98ccfca59b55fab2aed0df1b90bd286b3c5b5d60c749c103fd1fffec5a29060a00160405180910390a150506001805550505050505050565b60045460005b818110156113fd576118938161107d565b61189c81614165565b9050611882565b600454829081106118c65760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146118f05760405162461bcd60e51b815260040161082290614180565b600260015414156119135760405162461bcd60e51b8152600401610822906141b5565b600260018190555060006004848154811061193057611930614121565b90600052602060002090600a02019050600083116119905760405162461bcd60e51b815260206004820152601f60248201527f4e46544d6173746572436865663a2061646420746f6b656e206572726f7221006044820152606401610822565b60078101546001600160a01b03166119f85760405162461bcd60e51b815260206004820152602560248201527f4e46544d6173746572436865663a206e6f206469766964656e6420746f6b656e604482015264207365742160d81b6064820152608401610822565b611a018461304b565b15611a1e5760405162461bcd60e51b815260040161082290614307565b6004810154611a4590611a3a906113dc8664e8d4a51000613266565b600883015490613060565b60088201556007810154611a64906001600160a01b031633308661383c565b60408051858152602081018590527f063cd9b54164aec1e73e6cab926412eae2e362cd6c2f64e5304fed3765c55995910161106b565b6000546001600160a01b03163314611ac45760405162461bcd60e51b815260040161082290614180565b60026001541415611ae75760405162461bcd60e51b8152600401610822906141b5565b60026001556001600160a01b038116611afd5750335b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b889190614414565b90508015611bc457611bc46001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001683836138ad565b60045460005b81811015611cc957611bdc8185612904565b600060048281548110611bf157611bf1614121565b90600052602060002090600a0201905060008160080154118015611c21575060078101546001600160a01b031615155b15611cb85760078101546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190614414565b90508015611cb6576007820154611cb6906001600160a01b031687836138ad565b505b50611cc281614165565b9050611bca565b50604080513381526001600160a01b03851660208201527feef22962077f64783d26705dcff9ed10eaa6a36f97ff22cb3b3bc6f6d1d7da71910160405180910390a150506001805550565b60048181548110611d2457600080fd5b60009182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50969895979496939592949193911691908a565b6000546001600160a01b03163314611dae5760405162461bcd60e51b815260040161082290614180565b611db860006138dd565b565b600080836004805490508110611de25760405162461bcd60e51b8152600401610822906142c5565b611deb8461392d565b600060048681548110611e0057611e00614121565b90600052602060002090600a02019050600060068781548110611e2557611e25614121565b906000526020600020019050600060058881548110611e4657611e46614121565b906000526020600020019050600081846002015481548110611e6a57611e6a614121565b906000526020600020906003020190506000846006015490506000826001015490508060001415611eab5760028301546004870154611ea891613266565b90505b80156120255760058601546001870154811015611ec9575060018601545b8043118015611edc575086600101544310155b8015611eec575060008760040154115b15612023576000611f01828960030154613238565b90506000611f0f8285613266565b9050600060058f81548110611f2657611f26614121565b60009182526020909120015460028b015460038c0154919250905b8043118015611f595750611f56600184614209565b82105b15611ff85781611f6881614165565b92505060008190508a8381548110611f8257611f82614121565b90600052602060002090600302019950611fa98a600001548361306090919063ffffffff16565b91506000611fb78284612434565b60018c01549950905088611fdb5760028b015460048f0154611fd891613266565b98505b611fef611fe8828b613266565b8790613060565b95505050611f41565b60048c015461201b90612014906113dc8764e8d4a51000613266565b8990613060565b975050505050505b505b60008060005b8c5181101561211a5760008d828151811061204857612048614121565b6020908102919091018101516000818152918b90526040909120805490945090915060ff16151560011415612107576120868664e8d4a51000613272565b93506120a96120a2846001015486613a7b90919063ffffffff16565b8e90613060565b9c5060008a600801541180156120cb575060078a01546001600160a01b031615155b15612107576121046120fd84600201546120f764e8d4a510008e6008015461327290919063ffffffff16565b90613a7b565b8d90613060565b9b505b508061211281614165565b91505061202b565b505050505050505050509250929050565b6002600154141561214e5760405162461bcd60e51b8152600401610822906141b5565b60026001556003546001600160a01b031633146121ad5760405162461bcd60e51b815260206004820152601860248201527f4e46544d6173746572436865663a206465763a207775743f00000000000000006044820152606401610822565b6001600160a01b0381166122135760405162461bcd60e51b815260206004820152602760248201527f4e46544d6173746572436865663a20616464726573732063616e206e6f74206260448201526665207a65726f2160c81b6064820152608401610822565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fd0f413456e11b4287ccbe3c1b860af0249d87a41ac5ebb92afbc72cc4abb68da906020015b60405180910390a15060018055565b6004548290811061228f5760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146122b95760405162461bcd60e51b815260040161082290614180565b600260015414156122dc5760405162461bcd60e51b8152600401610822906141b5565b60026001819055506000600484815481106122f9576122f9614121565b90600052602060002090600a02019050806001015443106123825760405162461bcd60e51b815260206004820152603a60248201527f4e46544d6173746572436865663a2063616e206e6f74206368616e676520737460448201527f61727420626c6f636b206f66207374617274656420706f6f6c210000000000006064820152608401610822565b8243106123f75760405162461bcd60e51b815260206004820152603a60248201527f4e46544d6173746572436865663a205f7374617274426c6f636b206d7573742060448201527f6265206c657373207468616e20626c6f636b2e6e756d626572210000000000006064820152608401610822565b6001810183905560408051858152602081018590527f5bd025030aef837abe4fff12d2844a332e22f1c2680830e53bbd5e21d8d1baee910161106b565b60008282111561244f576124488284613a7b565b9050612453565b5060005b92915050565b6000808460048054905081106124815760405162461bcd60e51b8152600401610822906142c5565b600260015414156124a45760405162461bcd60e51b8152600401610822906141b5565b60026001556124b486868661327e565b600180559097909650945050505050565b600454829081106124e85760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146125125760405162461bcd60e51b815260040161082290614180565b600260015414156125355760405162461bcd60e51b8152600401610822906141b5565b600260018190555060006004848154811061255257612552614121565b90600052602060002090600a0201905061256b8461304b565b156125885760405162461bcd60e51b815260040161082290614307565b6009810183905560408051858152602081018590527fc3e9d9742228d378ddfa92fa8930d95e3f7d10416ea13d6c41a52ec7b37ccddd910161106b565b6125e960405180606001604052806000815260200160008152602001600081525090565b600080600484815481106125ff576125ff614121565b90600052602060002090600a020190508060020154915060008160030154905060006005868154811061263457612634614121565b906000526020600020018054905090506005868154811061265757612657614121565b90600052602060002001848154811061267257612672614121565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505094505b81431180156126c457506126c1600182614209565b84105b1561274e57836126d381614165565b945050600586815481106126e9576126e9614121565b90600052602060002001848154811061270457612704614121565b6000918252602091829020604080516060810182526003909302909101805480845260018201549484019490945260020154908201529550612747908390613060565b91506126ac565b505050915091565b6005828154811061276657600080fd5b90600052602060002001818154811061277e57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600454600090849081106127ca5760405162461bcd60e51b8152600401610822906142c5565b6002546001600160a01b03161561285757600254604051630d5e93c960e41b81526001600160a01b039091169063d5e93c909061280f9088908890889060040161442d565b602060405180830381865afa15801561282c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128509190614460565b915061285c565b600191505b509392505050565b6000546001600160a01b0316331461288e5760405162461bcd60e51b815260040161082290614180565b600260015414156128b15760405162461bcd60e51b8152600401610822906141b5565b6002600181905580546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6e7f8a7b7f523abe02e2e178b2ac725f15978be04b10890a64037eb3444e70d9060200161225d565b600454829081106129275760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146129515760405162461bcd60e51b815260040161082290614180565b60006004848154811061296657612966614121565b90600052602060002090600a0201905061297f8461304b565b1561298a5750505050565b60006005858154811061299f5761299f614121565b60009182526020909120015411156129e2576001600585815481106129c6576129c6614121565b6000918252602090912001546129dc9190614209565b60028201555b4360038201556001600160a01b0383166129fa573392505b604080518581526001600160a01b03851660208201527f52fc759704fb6759ac9cfea941ada49130a34dfdef2d5c607a500a4c89f3b0b8910160405180910390a1505b505050565b60045482908110612a655760405162461bcd60e51b8152600401610822906142c5565b60026001541415612a885760405162461bcd60e51b8152600401610822906141b5565b6002600155612a968261392d565b612a9f8361107d565b600060048481548110612ab457612ab4614121565b90600052602060002090600a020190508060010154431015612b225760405162461bcd60e51b815260206004820152602160248201527f4e46544d6173746572436865663a20706f6f6c206973206e6f742073746172746044820152602160f81b6064820152608401610822565b612b2b8461304b565b15612b485760405162461bcd60e51b815260040161082290614307565b600981015415612bfb5780600901543414612bbb5760405162461bcd60e51b815260206004820152602d60248201527f4e46544d6173746572436865663a20466565206973206e6f7420656e6f75676860448201526c206f7220746f6f206d7563682160981b6064820152608401610822565b60035460098201546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015612bf9573d6000803e3d6000fd5b505b600060068581548110612c1057612c10614121565b6000918252602082200191508080805b8751811015612e1957878181518110612c3b57612c3b614121565b60200260200101519350336001600160a01b03168660000160009054906101000a90046001600160a01b03166001600160a01b03166347ccca026040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc891906141ec565b6001600160a01b0316636352211e866040518263ffffffff1660e01b8152600401612cf591815260200190565b602060405180830381865afa158015612d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3691906141ec565b6001600160a01b031614612da25760405162461bcd60e51b815260206004820152602d60248201527f4e46544d6173746572436865663a2063616e206e6f74206465706f736974206e60448201526c6674206e6f74206f776e65642160981b6064820152608401610822565b6000848152602086905260409020805490935060ff16612dd55781612dc681614165565b845460ff191660011785559250505b6006860154612de99064e8d4a51000613272565b60018401556008860154612e029064e8d4a51000613272565b600284015580612e1181614165565b915050612c20565b5084546040516314e2c09d60e31b81526001600160a01b039091169063a71604e890612e4b9033908b9060040161447d565b600060405180830381600087803b158015612e6557600080fd5b505af1158015612e79573d6000803e3d6000fd5b5050506004860154612e8c915082613060565b6004860155604051889033907fe7425730072f5a6ec278ae24c998f6a79299c875cbd84ad35585563a0cb3c66690612ec5908b90614379565b60405180910390a3505060018055505050505050565b60045482908110612efe5760405162461bcd60e51b8152600401610822906142c5565b60026001541415612f215760405162461bcd60e51b8152600401610822906141b5565b6002600155612f2f8361107d565b612f3983836135e7565b82336001600160a01b03167f1feb6061010800c0794166480be81f449e39d70ad71df9140a50ead5a1c6c5a38460405161149d9190614379565b60068281548110612f8357600080fd5b600091825260208083209091019052908152604090208054600182015460029092015460ff909116925083565b6000546001600160a01b03163314612fda5760405162461bcd60e51b815260040161082290614180565b6001600160a01b03811661303f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610822565b613048816138dd565b50565b60008061305783610742565b43119392505050565b600061306c828461414d565b9392505050565b60006005838154811061308857613088614121565b600091825260208220845191019250156130c1576000836000815181106130b1576130b1614121565b6020026020010151602001511190505b60005b83518110156112395760008482815181106130e1576130e1614121565b60200260200101519050600081600001511161310f5760405162461bcd60e51b81526004016108229061438c565b60008160200151118015613127575060008160400151115b156131445760405162461bcd60e51b8152600401610822906143cd565b828015613155575060008160200151115b8061316d57508215801561316d575060008160400151115b806131875750602081015115801561318757506040810151155b6131d35760405162461bcd60e51b815260206004820152601d60248201527f4e46544d6173746572436865663a2073657474696e67206572726f72210000006044820152606401610822565b60408051606081018252825181526020808401518183019081529383015192820192835286546001818101895560008981529290922092516003909102909201918255925192810192909255516002909101558061323081614165565b9150506130c4565b60008243101561324a57506000612453565b8143111561325c576124488383612434565b61306c8343612434565b600061306c82846144a1565b600061306c82846144c0565b6000808460048054905081106132a65760405162461bcd60e51b8152600401610822906142c5565b6132af8461392d565b6001600160a01b0385166132c1573394505b6132cc8686866127a4565b6133185760405162461bcd60e51b815260206004820152601f60248201527f4e46544d6173746572436865663a2063616e206e6f74206861727665737421006044820152606401610822565b6133218661107d565b60006004878154811061333657613336614121565b90600052602060002090600a0201905060006006888154811061335b5761335b614121565b9060005260206000200190506000806000805b89518110156135425789818151811061338957613389614121565b602090810291909101810151600081815291879052604091829020885492516331a9108f60e11b81526004810183905291965094506001600160a01b038d8116921690636352211e90602401602060405180830381865afa1580156133f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341691906141ec565b6001600160a01b0316146134825760405162461bcd60e51b815260206004820152602d60248201527f4e46544d6173746572436865663a2063616e206e6f742068617276657374206e60448201526c6674206e6f77206f776e65642160981b6064820152608401610822565b825460ff161515600114156135305760068601546134a59064e8d4a51000613272565b91506134c86134c1846001015484613a7b90919063ffffffff16565b8a90613060565b600184018390556008870154909950158015906134f1575060078601546001600160a01b031615155b1561353057600886015461350a9064e8d4a51000613272565b9150613526612014846002015484613a7b90919063ffffffff16565b6002840183905597505b8061353a81614165565b91505061336e565b508715613574576135747f00000000000000000000000000000000000000000000000000000000000000008b8a613a87565b8615613593576007850154613593906001600160a01b03168b89613a87565b8a8a6001600160a01b03167fb4d23f8f8b5e74e0f494ce058e74cfedb6e2f84f8a92abf9f6dd84961a1df5dd8b8b8b6040516135d1939291906144e2565b60405180910390a3505050505050935093915050565b6004548290811061360a5760405162461bcd60e51b8152600401610822906142c5565b6136138261392d565b60006004848154811061362857613628614121565b90600052602060002090600a0201905060006006858154811061364d5761364d614121565b6000918252602082200191508080805b87518110156137b75787818151811061367857613678614121565b602090810291909101015186546040516331a9108f60e11b81526004810183905291955033916001600160a01b0390911690636352211e90602401602060405180830381865afa1580156136d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136f491906141ec565b6001600160a01b0316146137615760405162461bcd60e51b815260206004820152602e60248201527f4e46544d6173746572436865663a2063616e206e6f742077697468647261772060448201526d6e6674206e6f77206f776e65642160901b6064820152608401610822565b6000848152602086905260409020805490935060ff16151560011415613797578161378b81614165565b845460ff191685559250505b6000600184018190556002840155806137af81614165565b91505061365d565b508454604051638293744b60e01b81526001600160a01b0390911690638293744b906137e99033908b9060040161447d565b600060405180830381600087803b15801561380357600080fd5b505af1158015613817573d6000803e3d6000fd5b505050600486015461382a915082613a7b565b85600401819055505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526138a79085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613b29565b50505050565b6040516001600160a01b038316602482015260448101829052612a3d90849063a9059cbb60e01b90606401613870565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008151116139905760405162461bcd60e51b815260206004820152602960248201527f4e46544d6173746572436865663a20746f6b656e4964732063616e206e6f7420604482015268626520656d7074792160b81b6064820152608401610822565b604051637cf7d2f560e01b815273c466ddd7f4445cba9bf33b9639e2df7f9d5e24d690637cf7d2f5906139c7908490600401614507565b602060405180830381865af41580156139e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a089190614460565b156130485760405162461bcd60e51b815260206004820152603760248201527f4e46544d6173746572436865663a20746f6b656e4964732063616e206e6f742060448201527f636f6e7461696e206475706c6963617465206f6e6573210000000000000000006064820152608401610822565b600061306c8284614209565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015613ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613af29190614414565b905080821115613b1557613b106001600160a01b03851684836138ad565b6138a7565b6138a76001600160a01b03851684846138ad565b6000613b7e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613bfb9092919063ffffffff16565b805190915015612a3d5780806020019051810190613b9c9190614460565b612a3d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610822565b6060613c0a8484600085613c12565b949350505050565b606082471015613c735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610822565b6001600160a01b0385163b613cca5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610822565b600080866001600160a01b03168587604051613ce69190614577565b60006040518083038185875af1925050503d8060008114613d23576040519150601f19603f3d011682016040523d82523d6000602084013e613d28565b606091505b5091509150613d38828286613d43565b979650505050505050565b60608315613d5257508161306c565b825115613d625782518084602001fd5b8160405162461bcd60e51b81526004016108229190614593565b600060208284031215613d8e57600080fd5b5035919050565b6001600160a01b038116811461304857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613de357613de3613daa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613e1257613e12613daa565b604052919050565b600067ffffffffffffffff821115613e3457613e34613daa565b5060051b60200190565b8035613e4981613d95565b919050565b801515811461304857600080fd5b8035613e4981613e4e565b60008060008060008060c08789031215613e8057600080fd5b8635613e8b81613d95565b95506020878101359550604088013567ffffffffffffffff811115613eaf57600080fd5b8801601f81018a13613ec057600080fd5b8035613ed3613ece82613e1a565b613de9565b8181526060918202830184019184820191908d841115613ef257600080fd5b938501935b83851015613f3c5780858f031215613f0f5760008081fd5b613f17613dc0565b8535815286860135878201526040808701359082015283529384019391850191613ef7565b819950808d01359850505050505050613f5760808801613e3e565b9150613f6560a08801613e5c565b90509295509295509295565b60008060408385031215613f8457600080fd5b823591506020830135613f9681613d95565b809150509250929050565b600082601f830112613fb257600080fd5b81356020613fc2613ece83613e1a565b82815260059290921b84018101918181019086841115613fe157600080fd5b8286015b84811015613ffc5780358352918301918301613fe5565b509695505050505050565b6000806040838503121561401a57600080fd5b82359150602083013567ffffffffffffffff81111561403857600080fd5b61404485828601613fa1565b9150509250929050565b600080600080600060a0868803121561406657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561409c57600080fd5b50508035926020909101359150565b6000602082840312156140bd57600080fd5b813561306c81613d95565b6000806000606084860312156140dd57600080fd5b8335925060208401356140ef81613d95565b9150604084013567ffffffffffffffff81111561410b57600080fd5b61411786828701613fa1565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561416057614160614137565b500190565b600060001982141561417957614179614137565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000602082840312156141fe57600080fd5b815161306c81613d95565b60008282101561421b5761421b614137565b500390565b600060e0820160018060a01b03808b1684526020818b1681860152896040860152606060e081870152838a5180865261010088019150838c01955060005b81811015614295576142858388518051825260208082015190830152604090810151910152565b958401959183019160010161425e565b5050608087018a905292881660a0870152505084151560c085015291506142b99050565b98975050505050505050565b60208082526022908201527f4e46544d6173746572436865663a20506f6f6c20646f6573206e6f74206578696040820152611cdd60f21b606082015260800190565b6020808252601b908201527f4e46544d6173746572436865663a20706f6f6c20697320656e64210000000000604082015260600190565b600081518084526020808501945080840160005b8381101561436e57815187529582019590820190600101614352565b509495945050505050565b60208152600061306c602083018461433e565b60208082526021908201527f4e46544d6173746572436865663a20726577617264426c6f636b206572726f726040820152602160f81b606082015260800190565b60208082526027908201527f4e46544d6173746572436865663a207265776172642063616e206f6e6c7920736040820152666574206f6e652160c81b606082015260800190565b60006020828403121561442657600080fd5b5051919050565b8381526001600160a01b03831660208201526060604082018190526000906144579083018461433e565b95945050505050565b60006020828403121561447257600080fd5b815161306c81613e4e565b6001600160a01b0383168152604060208201819052600090613c0a9083018461433e565b60008160001904831182151516156144bb576144bb614137565b500290565b6000826144dd57634e487b7160e01b600052601260045260246000fd5b500490565b6060815260006144f5606083018661433e565b60208301949094525060400152919050565b6020808252825182820181905260009190848201906040850190845b8181101561453f57835183529284019291840191600101614523565b50909695505050505050565b60005b8381101561456657818101518382015260200161454e565b838111156138a75750506000910152565b6000825161458981846020870161454b565b9190910192915050565b60208152600082518060208401526145b281604085016020870161454b565b601f01601f1916919091016040019291505056fea2646970667358221220d4ade615e13a532f2502566eb7f750f37f6a785611ba47578aa5d38bad88b57064736f6c634300080a00330000000000000000000000006df4a699ac7086ee4a8d0602f2d00a0054a0930a000000000000000000000000c481a850aead5002598b7ed355cbb3349c14807200000000000000000000000004444f67e872f0651796a7fc88ca8e1848a532d4
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80638a796bf61161010d578063d65d5a9b116100a0578063ec6563e01161006f578063ec6563e014610671578063f2fde38b146106ae578063f9b89542146106ce578063fc0c546a146106ee578063ffb6bf381461072257600080fd5b8063d65d5a9b146105fe578063da2488cd1461061e578063de3ab7811461063e578063e3f0020b1461065157600080fd5b8063b9685cd2116100dc578063b9685cd21461052c578063c0f2762b1461054c578063cd7a65f914610593578063d5e93c90146105ce57600080fd5b80638a796bf6146104ae5780638da5cb5b146104ce5780638dbb1e3a146104ec578063a76fef931461050c57600080fd5b80635915d806116101905780636632a96d1161015f5780636632a96d146103a5578063689d84e4146103c5578063715018a6146104445780637e25542b14610459578063850337621461048e57600080fd5b80635915d806146103305780636091954a14610350578063630b5ba11461037057806364c9e7af1461038557600080fd5b80633ad10ef6116101cc5780633ad10ef6146102b05780633cc29d7d146102d05780635106d62a146102f057806351eb05a61461031057600080fd5b8063081e3eda146101fe578063100936d01461022257806319a842471461024257806337ebb71c1461028e575b600080fd5b34801561020a57600080fd5b506004545b6040519081526020015b60405180910390f35b34801561022e57600080fd5b5061020f61023d366004613d7c565b610742565b34801561024e57600080fd5b506102767f0000000000000000000000006df4a699ac7086ee4a8d0602f2d00a0054a0930a81565b6040516001600160a01b039091168152602001610219565b34801561029a57600080fd5b506102ae6102a9366004613e67565b6107f8565b005b3480156102bc57600080fd5b50600354610276906001600160a01b031681565b3480156102dc57600080fd5b5061020f6102eb366004613d7c565b610e87565b3480156102fc57600080fd5b506102ae61030b366004613f71565b610ed3565b34801561031c57600080fd5b506102ae61032b366004613d7c565b61107d565b34801561033c57600080fd5b506102ae61034b366004614007565b611401565b34801561035c57600080fd5b506102ae61036b36600461404e565b6114ae565b34801561037c57600080fd5b506102ae61187c565b34801561039157600080fd5b506102ae6103a0366004614089565b6118a3565b3480156103b157600080fd5b506102ae6103c03660046140ab565b611a9a565b3480156103d157600080fd5b506103e56103e0366004613d7c565b611d14565b604080516001600160a01b039b8c168152602081019a909a528901979097526060880195909552608087019390935260a086019190915260c085015290931660e083015261010082019290925261012081019190915261014001610219565b34801561045057600080fd5b506102ae611d84565b34801561046557600080fd5b50610479610474366004614007565b611dba565b60408051928352602083019190915201610219565b34801561049a57600080fd5b506102ae6104a93660046140ab565b61212b565b3480156104ba57600080fd5b506102ae6104c9366004614089565b61226c565b3480156104da57600080fd5b506000546001600160a01b0316610276565b3480156104f857600080fd5b5061020f610507366004614089565b612434565b34801561051857600080fd5b506104796105273660046140c8565b612459565b34801561053857600080fd5b506102ae610547366004614089565b6124c5565b34801561055857600080fd5b5061056c610567366004613d7c565b6125c5565b60408051835181526020808501519082015292810151908301526060820152608001610219565b34801561059f57600080fd5b506105b36105ae366004614089565b612756565b60408051938452602084019290925290820152606001610219565b3480156105da57600080fd5b506105ee6105e93660046140c8565b6127a4565b6040519015158152602001610219565b34801561060a57600080fd5b506102ae6106193660046140ab565b612864565b34801561062a57600080fd5b506102ae610639366004613f71565b612904565b6102ae61064c366004614007565b612a42565b34801561065d57600080fd5b506102ae61066c366004614007565b612edb565b34801561067d57600080fd5b5061069161068c366004614089565b612f73565b604080519315158452602084019290925290820152606001610219565b3480156106ba57600080fd5b506102ae6106c93660046140ab565b612fb0565b3480156106da57600080fd5b50600254610276906001600160a01b031681565b3480156106fa57600080fd5b506102767f000000000000000000000000c481a850aead5002598b7ed355cbb3349c14807281565b34801561072e57600080fd5b506105ee61073d366004613d7c565b61304b565b6000806004838154811061075857610758614121565b90600052602060002090600a020190508060030154915060006005848154811061078457610784614121565b9060005260206000200190506000826002015460016107a3919061414d565b90505b81548110156107f0576107dc8282815481106107c4576107c4614121565b60009182526020909120600390910201548590613060565b9350806107e881614165565b9150506107a6565b505050919050565b6000546001600160a01b0316331461082b5760405162461bcd60e51b815260040161082290614180565b60405180910390fd5b6002600154141561084e5760405162461bcd60e51b8152600401610822906141b5565b60026001556001600160a01b0386166108be5760405162461bcd60e51b815260206004820152602c60248201527f4e46544d6173746572436865663a2077726f6e67205f6e6674206f72205f646960448201526b766964656e64546f6b656e2160a01b6064820152608401610822565b600084511161091b5760405162461bcd60e51b8152602060048201526024808201527f4e46544d6173746572436865663a205f72657761726473206d757374206265206044820152637365742160e01b6064820152608401610822565b60008460008151811061093057610930614121565b602002602001015160200151905060008560008151811061095357610953614121565b602002602001015160400151905060006001600160a01b0316846001600160a01b03161415801561098b57508115801561098b575080155b806109b357508115801561099f5750600081115b806109b357506000821180156109b3575080155b610a4b5760405162461bcd60e51b815260206004820152605860248201527f4e46544d6173746572436865663a20726577617264466f7245616368426c6f6360448201527f6b206f72207265776172645065724e4654466f7245616368426c6f636b206d7560648201527f73742062652067726561746572207468616e207a65726f210000000000000000608482015260a401610822565b60405163b442103d60e01b81526001600160a01b0389811660048301526000917f0000000000000000000000006df4a699ac7086ee4a8d0602f2d00a0054a0930a9091169063b442103d90602401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada91906141ec565b90506001600160a01b03811615801590610b665750886001600160a01b0316816001600160a01b03166347ccca026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5b91906141ec565b6001600160a01b0316145b8015610c0457507f0000000000000000000000006df4a699ac7086ee4a8d0602f2d00a0054a0930a6001600160a01b0316816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf991906141ec565b6001600160a01b0316145b8015610c825750306001600160a01b0316816001600160a01b031663ce9b79306040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7791906141ec565b6001600160a01b0316145b610cce5760405162461bcd60e51b815260206004820152601a60248201527f4e46544d6173746572436865663a2077726f6e6720776e6674210000000000006044820152606401610822565b8315610cdc57610cdc61187c565b600480546001810182556000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180546001600160a01b0385166001600160a01b03199091161781557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f90910191909155438910610d615788610d63565b435b6001828101829055600580840192909255600060068401819055600984018a90556007840180546001600160a01b0319166001600160a01b038b1617905560088401819055825480830184559290526004547f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920191610ded91610de791614209565b8a613073565b80600081548110610e0057610e00614121565b9060005260206000209060030201600001548260010154610e21919061414d565b60038301556006805460010181556000526040517f928a7bc8c4c6a28c554f7914638d2152e9d9e29a6af34dcce1ae860cf7484b8390610e6e908d9086908e908e908e908e908e90614220565b60405180910390a1505060018055505050505050505050565b60045460009082908110610ead5760405162461bcd60e51b8152600401610822906142c5565b60058381548110610ec057610ec0614121565b6000918252602090912001549392505050565b60045482908110610ef65760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b03163314610f205760405162461bcd60e51b815260040161082290614180565b60026001541415610f435760405162461bcd60e51b8152600401610822906141b5565b6002600181905550600060048481548110610f6057610f60614121565b90600052602060002090600a02019050610f798461304b565b15610f965760405162461bcd60e51b815260040161082290614307565b60078101546001600160a01b03161580610fb257506008810154155b6110185760405162461bcd60e51b815260206004820152603160248201527f4e46544d6173746572436865663a206469766964656e64546f6b656e2063616e604482015270206e6f74206265206d6f6469666965642160781b6064820152608401610822565b6007810180546001600160a01b0319166001600160a01b0385169081179091556040805186815260208101929092527fdff6a9c482b5d369a088fead7a79f940ac508779ce7c004c2f94442b836971af91015b60405180910390a15050600180555050565b600454819081106110a05760405162461bcd60e51b8152600401610822906142c5565b6000600483815481106110b5576110b5614121565b90600052602060002090600a02019050806005015443116110d557505050565b80600101544310156110e657505050565b6110ef83610742565b8160050154106110fe57505050565b60006005848154811061111357611113614121565b60009182526020909120018054909150158061113f5750805461113890600190614209565b8260020154115b1561114a5750505050565b60008183600201548154811061116257611162614121565b906000526020600020906003020190508060010154600014801561118857506002810154155b15611194575050505050565b8260010154836005015410156111af57600183015460058401555b6004830154611240574360058401555b8260030154836005015411801561120357506001600586815481106111e6576111e6614121565b6000918252602090912001546111fc9190614209565b8360020154105b156112395760028301805490600061121a83614165565b90915550508054600384015461122f91613060565b60038401556111bf565b5050505050565b600061125484600501548560030154613238565b600183015490915080611277576002830154600486015461127491613266565b90505b60006112838383613266565b905060006005898154811061129a5761129a614121565b60009182526020909120015490505b8660030154431180156112c957506112c2600182614209565b8760020154105b1561139e576002870180549060006112e083614165565b90915550506003870154600580548b9081106112fe576112fe614121565b9060005260206000200188600201548154811061131d5761131d614121565b906000526020600020906003020195506113488660000154896003015461306090919063ffffffff16565b6003890181905560009061135d908390613238565b6001880154955090508461138157600287015460048a015461137e91613266565b94505b61139561138e8287613266565b8590613060565b935050506112a9565b86600301544311156113b957600387015460058801556113c0565b4360058801555b60048701546113ed906113e2906113dc8564e8d4a51000613266565b90613272565b600689015490613060565b8760060181905550505050505050505b5050565b600454829081106114245760405162461bcd60e51b8152600401610822906142c5565b600260015414156114475760405162461bcd60e51b8152600401610822906141b5565b600260015561145783338461327e565b505061146383836135e7565b82336001600160a01b03167faef68853d1f7f9e4e5fe02896078a87a319c7b257208dac49346c8f03b36c6858460405161149d9190614379565b60405180910390a350506001805550565b600454859081106114d15760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146114fb5760405162461bcd60e51b815260040161082290614180565b6002600154141561151e5760405162461bcd60e51b8152600401610822906141b5565b600260018190555060006004878154811061153b5761153b614121565b90600052602060002090600a020190506115548761304b565b156115715760405162461bcd60e51b815260040161082290614307565b600085116115915760405162461bcd60e51b81526004016108229061438c565b600587815481106115a4576115a4614121565b600091825260209091200154861061160e5760405162461bcd60e51b815260206004820152602760248201527f4e46544d6173746572436865663a205f726577617264496e646578206e6f74206044820152666578697374732160c81b6064820152608401610822565b6000611619886125c5565b915050808710156116775760405162461bcd60e51b815260206004820152602260248201527f4e46544d6173746572436865663a205f726577617264496e646578206572726f604482015261722160f01b6064820152608401610822565b60006005898154811061168c5761168c614121565b9060005260206000200188815481106116a7576116a7614121565b9060005260206000209060030201905080600001548710156117165760405162461bcd60e51b815260206004820152602260248201527f4e46544d6173746572436865663a205f726577617264426c6f636b206572726f604482015261722160f01b6064820152608401610822565b6000861180156117265750600085115b156117435760405162461bcd60e51b8152600401610822906143cd565b600081600101541180156117575750600086115b806117715750600081600201541180156117715750600085115b80611783575085158015611783575084155b6117da5760405162461bcd60e51b815260206004820152602260248201527f4e46544d6173746572436865663a20696e76616c696420706172616d65746572604482015261732160f01b6064820152608401610822565b6117e38961107d565b8188141561180d57805460038401546117fd90899061414d565b6118079190614209565b60038401555b8681556001810186905560028101859055604080518a8152602081018a905290810188905260608101879052608081018690527f7710f98ccfca59b55fab2aed0df1b90bd286b3c5b5d60c749c103fd1fffec5a29060a00160405180910390a150506001805550505050505050565b60045460005b818110156113fd576118938161107d565b61189c81614165565b9050611882565b600454829081106118c65760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146118f05760405162461bcd60e51b815260040161082290614180565b600260015414156119135760405162461bcd60e51b8152600401610822906141b5565b600260018190555060006004848154811061193057611930614121565b90600052602060002090600a02019050600083116119905760405162461bcd60e51b815260206004820152601f60248201527f4e46544d6173746572436865663a2061646420746f6b656e206572726f7221006044820152606401610822565b60078101546001600160a01b03166119f85760405162461bcd60e51b815260206004820152602560248201527f4e46544d6173746572436865663a206e6f206469766964656e6420746f6b656e604482015264207365742160d81b6064820152608401610822565b611a018461304b565b15611a1e5760405162461bcd60e51b815260040161082290614307565b6004810154611a4590611a3a906113dc8664e8d4a51000613266565b600883015490613060565b60088201556007810154611a64906001600160a01b031633308661383c565b60408051858152602081018590527f063cd9b54164aec1e73e6cab926412eae2e362cd6c2f64e5304fed3765c55995910161106b565b6000546001600160a01b03163314611ac45760405162461bcd60e51b815260040161082290614180565b60026001541415611ae75760405162461bcd60e51b8152600401610822906141b5565b60026001556001600160a01b038116611afd5750335b6040516370a0823160e01b81523060048201526000907f000000000000000000000000c481a850aead5002598b7ed355cbb3349c1480726001600160a01b0316906370a0823190602401602060405180830381865afa158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b889190614414565b90508015611bc457611bc46001600160a01b037f000000000000000000000000c481a850aead5002598b7ed355cbb3349c1480721683836138ad565b60045460005b81811015611cc957611bdc8185612904565b600060048281548110611bf157611bf1614121565b90600052602060002090600a0201905060008160080154118015611c21575060078101546001600160a01b031615155b15611cb85760078101546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190614414565b90508015611cb6576007820154611cb6906001600160a01b031687836138ad565b505b50611cc281614165565b9050611bca565b50604080513381526001600160a01b03851660208201527feef22962077f64783d26705dcff9ed10eaa6a36f97ff22cb3b3bc6f6d1d7da71910160405180910390a150506001805550565b60048181548110611d2457600080fd5b60009182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50969895979496939592949193911691908a565b6000546001600160a01b03163314611dae5760405162461bcd60e51b815260040161082290614180565b611db860006138dd565b565b600080836004805490508110611de25760405162461bcd60e51b8152600401610822906142c5565b611deb8461392d565b600060048681548110611e0057611e00614121565b90600052602060002090600a02019050600060068781548110611e2557611e25614121565b906000526020600020019050600060058881548110611e4657611e46614121565b906000526020600020019050600081846002015481548110611e6a57611e6a614121565b906000526020600020906003020190506000846006015490506000826001015490508060001415611eab5760028301546004870154611ea891613266565b90505b80156120255760058601546001870154811015611ec9575060018601545b8043118015611edc575086600101544310155b8015611eec575060008760040154115b15612023576000611f01828960030154613238565b90506000611f0f8285613266565b9050600060058f81548110611f2657611f26614121565b60009182526020909120015460028b015460038c0154919250905b8043118015611f595750611f56600184614209565b82105b15611ff85781611f6881614165565b92505060008190508a8381548110611f8257611f82614121565b90600052602060002090600302019950611fa98a600001548361306090919063ffffffff16565b91506000611fb78284612434565b60018c01549950905088611fdb5760028b015460048f0154611fd891613266565b98505b611fef611fe8828b613266565b8790613060565b95505050611f41565b60048c015461201b90612014906113dc8764e8d4a51000613266565b8990613060565b975050505050505b505b60008060005b8c5181101561211a5760008d828151811061204857612048614121565b6020908102919091018101516000818152918b90526040909120805490945090915060ff16151560011415612107576120868664e8d4a51000613272565b93506120a96120a2846001015486613a7b90919063ffffffff16565b8e90613060565b9c5060008a600801541180156120cb575060078a01546001600160a01b031615155b15612107576121046120fd84600201546120f764e8d4a510008e6008015461327290919063ffffffff16565b90613a7b565b8d90613060565b9b505b508061211281614165565b91505061202b565b505050505050505050509250929050565b6002600154141561214e5760405162461bcd60e51b8152600401610822906141b5565b60026001556003546001600160a01b031633146121ad5760405162461bcd60e51b815260206004820152601860248201527f4e46544d6173746572436865663a206465763a207775743f00000000000000006044820152606401610822565b6001600160a01b0381166122135760405162461bcd60e51b815260206004820152602760248201527f4e46544d6173746572436865663a20616464726573732063616e206e6f74206260448201526665207a65726f2160c81b6064820152608401610822565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fd0f413456e11b4287ccbe3c1b860af0249d87a41ac5ebb92afbc72cc4abb68da906020015b60405180910390a15060018055565b6004548290811061228f5760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146122b95760405162461bcd60e51b815260040161082290614180565b600260015414156122dc5760405162461bcd60e51b8152600401610822906141b5565b60026001819055506000600484815481106122f9576122f9614121565b90600052602060002090600a02019050806001015443106123825760405162461bcd60e51b815260206004820152603a60248201527f4e46544d6173746572436865663a2063616e206e6f74206368616e676520737460448201527f61727420626c6f636b206f66207374617274656420706f6f6c210000000000006064820152608401610822565b8243106123f75760405162461bcd60e51b815260206004820152603a60248201527f4e46544d6173746572436865663a205f7374617274426c6f636b206d7573742060448201527f6265206c657373207468616e20626c6f636b2e6e756d626572210000000000006064820152608401610822565b6001810183905560408051858152602081018590527f5bd025030aef837abe4fff12d2844a332e22f1c2680830e53bbd5e21d8d1baee910161106b565b60008282111561244f576124488284613a7b565b9050612453565b5060005b92915050565b6000808460048054905081106124815760405162461bcd60e51b8152600401610822906142c5565b600260015414156124a45760405162461bcd60e51b8152600401610822906141b5565b60026001556124b486868661327e565b600180559097909650945050505050565b600454829081106124e85760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146125125760405162461bcd60e51b815260040161082290614180565b600260015414156125355760405162461bcd60e51b8152600401610822906141b5565b600260018190555060006004848154811061255257612552614121565b90600052602060002090600a0201905061256b8461304b565b156125885760405162461bcd60e51b815260040161082290614307565b6009810183905560408051858152602081018590527fc3e9d9742228d378ddfa92fa8930d95e3f7d10416ea13d6c41a52ec7b37ccddd910161106b565b6125e960405180606001604052806000815260200160008152602001600081525090565b600080600484815481106125ff576125ff614121565b90600052602060002090600a020190508060020154915060008160030154905060006005868154811061263457612634614121565b906000526020600020018054905090506005868154811061265757612657614121565b90600052602060002001848154811061267257612672614121565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505094505b81431180156126c457506126c1600182614209565b84105b1561274e57836126d381614165565b945050600586815481106126e9576126e9614121565b90600052602060002001848154811061270457612704614121565b6000918252602091829020604080516060810182526003909302909101805480845260018201549484019490945260020154908201529550612747908390613060565b91506126ac565b505050915091565b6005828154811061276657600080fd5b90600052602060002001818154811061277e57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600454600090849081106127ca5760405162461bcd60e51b8152600401610822906142c5565b6002546001600160a01b03161561285757600254604051630d5e93c960e41b81526001600160a01b039091169063d5e93c909061280f9088908890889060040161442d565b602060405180830381865afa15801561282c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128509190614460565b915061285c565b600191505b509392505050565b6000546001600160a01b0316331461288e5760405162461bcd60e51b815260040161082290614180565b600260015414156128b15760405162461bcd60e51b8152600401610822906141b5565b6002600181905580546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6e7f8a7b7f523abe02e2e178b2ac725f15978be04b10890a64037eb3444e70d9060200161225d565b600454829081106129275760405162461bcd60e51b8152600401610822906142c5565b6000546001600160a01b031633146129515760405162461bcd60e51b815260040161082290614180565b60006004848154811061296657612966614121565b90600052602060002090600a0201905061297f8461304b565b1561298a5750505050565b60006005858154811061299f5761299f614121565b60009182526020909120015411156129e2576001600585815481106129c6576129c6614121565b6000918252602090912001546129dc9190614209565b60028201555b4360038201556001600160a01b0383166129fa573392505b604080518581526001600160a01b03851660208201527f52fc759704fb6759ac9cfea941ada49130a34dfdef2d5c607a500a4c89f3b0b8910160405180910390a1505b505050565b60045482908110612a655760405162461bcd60e51b8152600401610822906142c5565b60026001541415612a885760405162461bcd60e51b8152600401610822906141b5565b6002600155612a968261392d565b612a9f8361107d565b600060048481548110612ab457612ab4614121565b90600052602060002090600a020190508060010154431015612b225760405162461bcd60e51b815260206004820152602160248201527f4e46544d6173746572436865663a20706f6f6c206973206e6f742073746172746044820152602160f81b6064820152608401610822565b612b2b8461304b565b15612b485760405162461bcd60e51b815260040161082290614307565b600981015415612bfb5780600901543414612bbb5760405162461bcd60e51b815260206004820152602d60248201527f4e46544d6173746572436865663a20466565206973206e6f7420656e6f75676860448201526c206f7220746f6f206d7563682160981b6064820152608401610822565b60035460098201546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015612bf9573d6000803e3d6000fd5b505b600060068581548110612c1057612c10614121565b6000918252602082200191508080805b8751811015612e1957878181518110612c3b57612c3b614121565b60200260200101519350336001600160a01b03168660000160009054906101000a90046001600160a01b03166001600160a01b03166347ccca026040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc891906141ec565b6001600160a01b0316636352211e866040518263ffffffff1660e01b8152600401612cf591815260200190565b602060405180830381865afa158015612d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3691906141ec565b6001600160a01b031614612da25760405162461bcd60e51b815260206004820152602d60248201527f4e46544d6173746572436865663a2063616e206e6f74206465706f736974206e60448201526c6674206e6f74206f776e65642160981b6064820152608401610822565b6000848152602086905260409020805490935060ff16612dd55781612dc681614165565b845460ff191660011785559250505b6006860154612de99064e8d4a51000613272565b60018401556008860154612e029064e8d4a51000613272565b600284015580612e1181614165565b915050612c20565b5084546040516314e2c09d60e31b81526001600160a01b039091169063a71604e890612e4b9033908b9060040161447d565b600060405180830381600087803b158015612e6557600080fd5b505af1158015612e79573d6000803e3d6000fd5b5050506004860154612e8c915082613060565b6004860155604051889033907fe7425730072f5a6ec278ae24c998f6a79299c875cbd84ad35585563a0cb3c66690612ec5908b90614379565b60405180910390a3505060018055505050505050565b60045482908110612efe5760405162461bcd60e51b8152600401610822906142c5565b60026001541415612f215760405162461bcd60e51b8152600401610822906141b5565b6002600155612f2f8361107d565b612f3983836135e7565b82336001600160a01b03167f1feb6061010800c0794166480be81f449e39d70ad71df9140a50ead5a1c6c5a38460405161149d9190614379565b60068281548110612f8357600080fd5b600091825260208083209091019052908152604090208054600182015460029092015460ff909116925083565b6000546001600160a01b03163314612fda5760405162461bcd60e51b815260040161082290614180565b6001600160a01b03811661303f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610822565b613048816138dd565b50565b60008061305783610742565b43119392505050565b600061306c828461414d565b9392505050565b60006005838154811061308857613088614121565b600091825260208220845191019250156130c1576000836000815181106130b1576130b1614121565b6020026020010151602001511190505b60005b83518110156112395760008482815181106130e1576130e1614121565b60200260200101519050600081600001511161310f5760405162461bcd60e51b81526004016108229061438c565b60008160200151118015613127575060008160400151115b156131445760405162461bcd60e51b8152600401610822906143cd565b828015613155575060008160200151115b8061316d57508215801561316d575060008160400151115b806131875750602081015115801561318757506040810151155b6131d35760405162461bcd60e51b815260206004820152601d60248201527f4e46544d6173746572436865663a2073657474696e67206572726f72210000006044820152606401610822565b60408051606081018252825181526020808401518183019081529383015192820192835286546001818101895560008981529290922092516003909102909201918255925192810192909255516002909101558061323081614165565b9150506130c4565b60008243101561324a57506000612453565b8143111561325c576124488383612434565b61306c8343612434565b600061306c82846144a1565b600061306c82846144c0565b6000808460048054905081106132a65760405162461bcd60e51b8152600401610822906142c5565b6132af8461392d565b6001600160a01b0385166132c1573394505b6132cc8686866127a4565b6133185760405162461bcd60e51b815260206004820152601f60248201527f4e46544d6173746572436865663a2063616e206e6f74206861727665737421006044820152606401610822565b6133218661107d565b60006004878154811061333657613336614121565b90600052602060002090600a0201905060006006888154811061335b5761335b614121565b9060005260206000200190506000806000805b89518110156135425789818151811061338957613389614121565b602090810291909101810151600081815291879052604091829020885492516331a9108f60e11b81526004810183905291965094506001600160a01b038d8116921690636352211e90602401602060405180830381865afa1580156133f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341691906141ec565b6001600160a01b0316146134825760405162461bcd60e51b815260206004820152602d60248201527f4e46544d6173746572436865663a2063616e206e6f742068617276657374206e60448201526c6674206e6f77206f776e65642160981b6064820152608401610822565b825460ff161515600114156135305760068601546134a59064e8d4a51000613272565b91506134c86134c1846001015484613a7b90919063ffffffff16565b8a90613060565b600184018390556008870154909950158015906134f1575060078601546001600160a01b031615155b1561353057600886015461350a9064e8d4a51000613272565b9150613526612014846002015484613a7b90919063ffffffff16565b6002840183905597505b8061353a81614165565b91505061336e565b508715613574576135747f000000000000000000000000c481a850aead5002598b7ed355cbb3349c1480728b8a613a87565b8615613593576007850154613593906001600160a01b03168b89613a87565b8a8a6001600160a01b03167fb4d23f8f8b5e74e0f494ce058e74cfedb6e2f84f8a92abf9f6dd84961a1df5dd8b8b8b6040516135d1939291906144e2565b60405180910390a3505050505050935093915050565b6004548290811061360a5760405162461bcd60e51b8152600401610822906142c5565b6136138261392d565b60006004848154811061362857613628614121565b90600052602060002090600a0201905060006006858154811061364d5761364d614121565b6000918252602082200191508080805b87518110156137b75787818151811061367857613678614121565b602090810291909101015186546040516331a9108f60e11b81526004810183905291955033916001600160a01b0390911690636352211e90602401602060405180830381865afa1580156136d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136f491906141ec565b6001600160a01b0316146137615760405162461bcd60e51b815260206004820152602e60248201527f4e46544d6173746572436865663a2063616e206e6f742077697468647261772060448201526d6e6674206e6f77206f776e65642160901b6064820152608401610822565b6000848152602086905260409020805490935060ff16151560011415613797578161378b81614165565b845460ff191685559250505b6000600184018190556002840155806137af81614165565b91505061365d565b508454604051638293744b60e01b81526001600160a01b0390911690638293744b906137e99033908b9060040161447d565b600060405180830381600087803b15801561380357600080fd5b505af1158015613817573d6000803e3d6000fd5b505050600486015461382a915082613a7b565b85600401819055505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526138a79085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613b29565b50505050565b6040516001600160a01b038316602482015260448101829052612a3d90849063a9059cbb60e01b90606401613870565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008151116139905760405162461bcd60e51b815260206004820152602960248201527f4e46544d6173746572436865663a20746f6b656e4964732063616e206e6f7420604482015268626520656d7074792160b81b6064820152608401610822565b604051637cf7d2f560e01b815273c466ddd7f4445cba9bf33b9639e2df7f9d5e24d690637cf7d2f5906139c7908490600401614507565b602060405180830381865af41580156139e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a089190614460565b156130485760405162461bcd60e51b815260206004820152603760248201527f4e46544d6173746572436865663a20746f6b656e4964732063616e206e6f742060448201527f636f6e7461696e206475706c6963617465206f6e6573210000000000000000006064820152608401610822565b600061306c8284614209565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015613ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613af29190614414565b905080821115613b1557613b106001600160a01b03851684836138ad565b6138a7565b6138a76001600160a01b03851684846138ad565b6000613b7e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613bfb9092919063ffffffff16565b805190915015612a3d5780806020019051810190613b9c9190614460565b612a3d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610822565b6060613c0a8484600085613c12565b949350505050565b606082471015613c735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610822565b6001600160a01b0385163b613cca5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610822565b600080866001600160a01b03168587604051613ce69190614577565b60006040518083038185875af1925050503d8060008114613d23576040519150601f19603f3d011682016040523d82523d6000602084013e613d28565b606091505b5091509150613d38828286613d43565b979650505050505050565b60608315613d5257508161306c565b825115613d625782518084602001fd5b8160405162461bcd60e51b81526004016108229190614593565b600060208284031215613d8e57600080fd5b5035919050565b6001600160a01b038116811461304857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613de357613de3613daa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613e1257613e12613daa565b604052919050565b600067ffffffffffffffff821115613e3457613e34613daa565b5060051b60200190565b8035613e4981613d95565b919050565b801515811461304857600080fd5b8035613e4981613e4e565b60008060008060008060c08789031215613e8057600080fd5b8635613e8b81613d95565b95506020878101359550604088013567ffffffffffffffff811115613eaf57600080fd5b8801601f81018a13613ec057600080fd5b8035613ed3613ece82613e1a565b613de9565b8181526060918202830184019184820191908d841115613ef257600080fd5b938501935b83851015613f3c5780858f031215613f0f5760008081fd5b613f17613dc0565b8535815286860135878201526040808701359082015283529384019391850191613ef7565b819950808d01359850505050505050613f5760808801613e3e565b9150613f6560a08801613e5c565b90509295509295509295565b60008060408385031215613f8457600080fd5b823591506020830135613f9681613d95565b809150509250929050565b600082601f830112613fb257600080fd5b81356020613fc2613ece83613e1a565b82815260059290921b84018101918181019086841115613fe157600080fd5b8286015b84811015613ffc5780358352918301918301613fe5565b509695505050505050565b6000806040838503121561401a57600080fd5b82359150602083013567ffffffffffffffff81111561403857600080fd5b61404485828601613fa1565b9150509250929050565b600080600080600060a0868803121561406657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561409c57600080fd5b50508035926020909101359150565b6000602082840312156140bd57600080fd5b813561306c81613d95565b6000806000606084860312156140dd57600080fd5b8335925060208401356140ef81613d95565b9150604084013567ffffffffffffffff81111561410b57600080fd5b61411786828701613fa1565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561416057614160614137565b500190565b600060001982141561417957614179614137565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000602082840312156141fe57600080fd5b815161306c81613d95565b60008282101561421b5761421b614137565b500390565b600060e0820160018060a01b03808b1684526020818b1681860152896040860152606060e081870152838a5180865261010088019150838c01955060005b81811015614295576142858388518051825260208082015190830152604090810151910152565b958401959183019160010161425e565b5050608087018a905292881660a0870152505084151560c085015291506142b99050565b98975050505050505050565b60208082526022908201527f4e46544d6173746572436865663a20506f6f6c20646f6573206e6f74206578696040820152611cdd60f21b606082015260800190565b6020808252601b908201527f4e46544d6173746572436865663a20706f6f6c20697320656e64210000000000604082015260600190565b600081518084526020808501945080840160005b8381101561436e57815187529582019590820190600101614352565b509495945050505050565b60208152600061306c602083018461433e565b60208082526021908201527f4e46544d6173746572436865663a20726577617264426c6f636b206572726f726040820152602160f81b606082015260800190565b60208082526027908201527f4e46544d6173746572436865663a207265776172642063616e206f6e6c7920736040820152666574206f6e652160c81b606082015260800190565b60006020828403121561442657600080fd5b5051919050565b8381526001600160a01b03831660208201526060604082018190526000906144579083018461433e565b95945050505050565b60006020828403121561447257600080fd5b815161306c81613e4e565b6001600160a01b0383168152604060208201819052600090613c0a9083018461433e565b60008160001904831182151516156144bb576144bb614137565b500290565b6000826144dd57634e487b7160e01b600052601260045260246000fd5b500490565b6060815260006144f5606083018661433e565b60208301949094525060400152919050565b6020808252825182820181905260009190848201906040850190845b8181101561453f57835183529284019291840191600101614523565b50909695505050505050565b60005b8381101561456657818101518382015260200161454e565b838111156138a75750506000910152565b6000825161458981846020870161454b565b9190910192915050565b60208152600082518060208401526145b281604085016020870161454b565b601f01601f1916919091016040019291505056fea2646970667358221220d4ade615e13a532f2502566eb7f750f37f6a785611ba47578aa5d38bad88b57064736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006df4a699ac7086ee4a8d0602f2d00a0054a0930a000000000000000000000000c481a850aead5002598b7ed355cbb3349c14807200000000000000000000000004444f67e872f0651796a7fc88ca8e1848a532d4
-----Decoded View---------------
Arg [0] : _wnftFactory (address): 0x6df4A699Ac7086Ee4a8d0602F2D00A0054a0930A
Arg [1] : _token (address): 0xC481A850aEad5002598b7eD355cBB3349c148072
Arg [2] : _devAddress (address): 0x04444f67E872F0651796a7Fc88Ca8E1848a532d4
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006df4a699ac7086ee4a8d0602f2d00a0054a0930a
Arg [1] : 000000000000000000000000c481a850aead5002598b7ed355cbb3349c148072
Arg [2] : 00000000000000000000000004444f67e872f0651796a7fc88ca8e1848a532d4
Deployed Bytecode Sourcemap
4803:26092:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5964:94;;;;;;;;;;-1:-1:-1;6035:9:11;:16;5964:94;;;160:25:18;;;148:2;133:18;5964:94:11;;;;;;;;12050:431;;;;;;;;;;-1:-1:-1;12050:431:11;;;;;:::i;:::-;;:::i;5035:47::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;572:32:18;;;554:51;;542:2;527:18;5035:47:11;381:230:18;6286:2087:11;;;;;;;;;;-1:-1:-1;6286:2087:11;;;;;:::i;:::-;;:::i;:::-;;5194:33;;;;;;;;;;-1:-1:-1;5194:33:11;;;;-1:-1:-1;;;;;5194:33:11;;;6064:149;;;;;;;;;;-1:-1:-1;6064:149:11;;;;;:::i;:::-;;:::i;13476:493::-;;;;;;;;;;-1:-1:-1;13476:493:11;;;;;:::i;:::-;;:::i;15375:3243::-;;;;;;;;;;-1:-1:-1;15375:3243:11;;;;;:::i;:::-;;:::i;23966:278::-;;;;;;;;;;-1:-1:-1;23966:278:11;;;;;:::i;:::-;;:::i;9586:1732::-;;;;;;;;;;-1:-1:-1;9586:1732:11;;;;;:::i;:::-;;:::i;22089:176::-;;;;;;;;;;;;;:::i;29951:674::-;;;;;;;;;;-1:-1:-1;29951:674:11;;;;;:::i;:::-;;:::i;27913:842::-;;;;;;;;;;-1:-1:-1;27913:842:11;;;;;:::i;:::-;;:::i;5234:27::-;;;;;;;;;;-1:-1:-1;5234:27:11;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6989:15:18;;;6971:34;;7036:2;7021:18;;7014:34;;;;7064:18;;7057:34;;;;7122:2;7107:18;;7100:34;;;;7165:3;7150:19;;7143:35;;;;6951:3;7194:19;;7187:35;;;;7253:3;7238:19;;7231:35;7303:15;;;7297:3;7282:19;;7275:44;7350:3;7335:19;;7328:35;;;;7394:3;7379:19;;7372:35;;;;6920:3;6905:19;5234:27:11;6500:913:18;1661:101:12;;;;;;;;;;;;;:::i;18692:3314:11:-;;;;;;;;;;-1:-1:-1;18692:3314:11;;;;;:::i;:::-;;:::i;:::-;;;;7592:25:18;;;7648:2;7633:18;;7626:34;;;;7565:18;18692:3314:11;7418:248:18;29625:320:11;;;;;;;;;;-1:-1:-1;29625:320:11;;;;;:::i;:::-;;:::i;11399:474::-;;;;;;;;;;-1:-1:-1;11399:474:11;;;;;:::i;:::-;;:::i;1029:85:12:-;;;;;;;;;;-1:-1:-1;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;1029:85;;14681:176:11;;;;;;;;;;-1:-1:-1;14681:176:11;;;;;:::i;:::-;;:::i;25644:234::-;;;;;;;;;;-1:-1:-1;25644:234:11;;;;;:::i;:::-;;:::i;14020:328::-;;;;;;;;;;-1:-1:-1;14020:328:11;;;;;:::i;:::-;;:::i;12487:908::-;;;;;;;;;;-1:-1:-1;12487:908:11;;;;;:::i;:::-;;:::i;:::-;;;;8528:12:18;;8516:25;;8590:4;8579:16;;;8573:23;8557:14;;;8550:47;8635:16;;;8629:23;8613:14;;;8606:47;8971:2;8956:18;;8949:34;8880:3;8865:19;12487:908:11;8664:325:18;5288:38:11;;;;;;;;;;-1:-1:-1;5288:38:11;;;;;:::i;:::-;;:::i;:::-;;;;9196:25:18;;;9252:2;9237:18;;9230:34;;;;9280:18;;;9273:34;9184:2;9169:18;5288:38:11;8994:319:18;25884:303:11;;;;;;;;;;-1:-1:-1;25884:303:11;;;;;:::i;:::-;;:::i;:::-;;;9579:14:18;;9572:22;9554:41;;9542:2;9527:18;25884:303:11;9414:187:18;14411:197:11;;;;;;;;;;-1:-1:-1;14411:197:11;;;;;:::i;:::-;;:::i;28761:506::-;;;;;;;;;;-1:-1:-1;28761:506:11;;;;;:::i;:::-;;:::i;22352:1570::-;;;;;;:::i;:::-;;:::i;25311:281::-;;;;;;;;;;-1:-1:-1;25311:281:11;;;;;:::i;:::-;;:::i;5332:50::-;;;;;;;;;;-1:-1:-1;5332:50:11;;;;;:::i;:::-;;:::i;:::-;;;;10465:14:18;;10458:22;10440:41;;10512:2;10497:18;;10490:34;;;;10540:18;;;10533:34;10428:2;10413:18;5332:50:11;10244:329:18;1911:198:12;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;5148:39:11:-;;;;;;;;;;-1:-1:-1;5148:39:11;;;;-1:-1:-1;;;;;5148:39:11;;;5088:29;;;;;;;;;;;;;;;11879:165;;;;;;;;;;-1:-1:-1;11879:165:11;;;;;:::i;:::-;;:::i;12050:431::-;12110:21;12143;12167:9;12177:4;12167:15;;;;;;;;:::i;:::-;;;;;;;;;;;12143:39;;12208:4;:26;;;12192:42;;12244:28;12275:16;12292:4;12275:22;;;;;;;;:::i;:::-;;;;;;;;12244:53;;12311:13;12327:4;:23;;;12353:1;12327:27;;;;:::i;:::-;12311:43;;12307:168;12364:14;;12356:22;;12307:168;;;12419:45;12437:7;12445:5;12437:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;12419:13;;:17;:45::i;:::-;12403:61;-1:-1:-1;12380:8:11;;;;:::i;:::-;;;;12307:168;;;;12133:348;;12050:431;;;:::o;6286:2087::-;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;;;;;;;;;1744:1:13::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;-1:-1:-1;;;;;6505:27:11;::::2;6497:84;;;::::0;-1:-1:-1;;;6497:84:11;;12761:2:18;6497:84:11::2;::::0;::::2;12743:21:18::0;12800:2;12780:18;;;12773:30;12839:34;12819:18;;;12812:62;-1:-1:-1;;;12890:18:18;;;12883:42;12942:19;;6497:84:11::2;12559:408:18::0;6497:84:11::2;6617:1;6599:8;:15;:19;6591:68;;;::::0;-1:-1:-1;;;6591:68:11;;13174:2:18;6591:68:11::2;::::0;::::2;13156:21:18::0;13213:2;13193:18;;;13186:30;13252:34;13232:18;;;13225:62;-1:-1:-1;;;13303:18:18;;;13296:34;13347:19;;6591:68:11::2;12972:400:18::0;6591:68:11::2;6669:26;6698:8;6707:1;6698:11;;;;;;;;:::i;:::-;;;;;;;:30;;;6669:59;;6738:32;6773:8;6782:1;6773:11;;;;;;;;:::i;:::-;;;;;;;:36;;;6738:71;;7020:1;-1:-1:-1::0;;;;;6985:37:11::2;6993:14;-1:-1:-1::0;;;;;6985:37:11::2;;;:99;;;;-1:-1:-1::0;7027:23:11;;:56;::::2;;;-1:-1:-1::0;7054:29:11;;7027:56:::2;6984:242;;;-1:-1:-1::0;7108:23:11;;:55;::::2;;;;7162:1;7135:24;:28;7108:55;7107:118;;;;7190:1;7169:18;:22;:55;;;;-1:-1:-1::0;7195:29:11;;7169:55:::2;6976:360;;;::::0;-1:-1:-1;;;6976:360:11;;13579:2:18;6976:360:11::2;::::0;::::2;13561:21:18::0;13618:2;13598:18;;;13591:30;13657:34;13637:18;;;13630:62;13728:34;13708:18;;;13701:62;13800:26;13779:19;;;13772:55;13844:19;;6976:360:11::2;13377:492:18::0;6976:360:11::2;7365:23;::::0;-1:-1:-1;;;7365:23:11;;-1:-1:-1;;;;;572:32:18;;;7365:23:11::2;::::0;::::2;554:51:18::0;7346:16:11::2;::::0;7365:11:::2;:17:::0;;::::2;::::0;::::2;::::0;527:18:18;;7365:23:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7346:42:::0;-1:-1:-1;;;;;;7406:27:11;::::2;::::0;;::::2;::::0;:49:::2;;;7451:4;-1:-1:-1::0;;;;;7437:18:11::2;:4;-1:-1:-1::0;;;;;7437:8:11::2;;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7437:18:11::2;;7406:49;:82;;;;;7477:11;-1:-1:-1::0;;;;;7459:29:11::2;:4;-1:-1:-1::0;;;;;7459:12:11::2;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7459:29:11::2;;7406:82;:119;;;;;7520:4;-1:-1:-1::0;;;;;7492:33:11::2;:4;-1:-1:-1::0;;;;;7492:14:11::2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7492:33:11::2;;7406:119;7398:158;;;::::0;-1:-1:-1;;;7398:158:11;;15469:2:18;7398:158:11::2;::::0;::::2;15451:21:18::0;15508:2;15488:18;;;15481:30;15547:28;15527:18;;;15520:56;15593:18;;7398:158:11::2;15267:350:18::0;7398:158:11::2;7570:11;7566:59;;;7597:17;:15;:17::i;:::-;7658:9;:16:::0;;::::2;::::0;::::2;::::0;;7634:21:::2;7658:16:::0;;;::::2;;::::0;;::::2;7684::::0;;-1:-1:-1;;;;;7684:16:11;::::2;-1:-1:-1::0;;;;;;7684:16:11;;::::2;;::::0;;7710:11;;;;:15;;;;7753:12:::2;:26:::0;-1:-1:-1;7753:55:11::2;;7797:11;7753:55;;;7782:12;7753:55;7735:15;::::0;;::::2;:73:::0;;;7818:20:::2;::::0;;::::2;:38:::0;;;;-1:-1:-1;7866:21:11::2;::::0;::::2;:25:::0;;;7901:15:::2;::::0;::::2;:29:::0;;;7941:18:::2;::::0;::::2;:35:::0;;-1:-1:-1;;;;;;7941:35:11::2;-1:-1:-1::0;;;;;7941:35:11;::::2;;::::0;;7986:24:::2;::::0;::::2;:28:::0;;;8064:23;;;;::::2;::::0;;;;;-1:-1:-1;8113:16:11;8064:23;;;::::2;::::0;8097:47:::2;::::0;8113:20:::2;::::0;::::2;:::i;:::-;8135:8;8097:15;:47::i;:::-;8201:7;8209:1;8201:10;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;8183:4;:15;;;:40;;;;:::i;:::-;8154:26;::::0;::::2;:69:::0;8235:12:::2;:19:::0;;::::2;;::::0;;-1:-1:-1;8235:19:11;8278:88:::2;::::0;::::2;::::0;::::2;::::0;8290:4;;8296;;8302:11;;8315:8;;8325:11;;8338:14;;8354:11;;8278:88:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;;1701:1:13::1;2628:22:::0;;-1:-1:-1;;;;;;;;;6286:2087:11:o;6064:149::-;5478:9;:16;6151:7;;6136:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;6177:16:::1;6194:4;6177:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:29:::0;;6064:149;-1:-1:-1;;;6064:149:11:o;13476:493::-;5478:9;:16;13570:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12::1;1233:68;;;;-1:-1:-1::0;;;1233:68:12::1;;;;;;;:::i;:::-;1744:1:13::2;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::2;;;;;;;:::i;:::-;1744:1;2455:7;:18;;;;13609:21:11::3;13633:9;13643:4;13633:15;;;;;;;;:::i;:::-;;;;;;;;;;;13609:39;;13667:15;13677:4;13667:9;:15::i;:::-;13666:16;13658:56;;;;-1:-1:-1::0;;;13658:56:11::3;;;;;;;:::i;:::-;13740:18;::::0;::::3;::::0;-1:-1:-1;;;;;13740:18:11::3;13732:41:::0;;:74:::3;;-1:-1:-1::0;13777:24:11::3;::::0;::::3;::::0;:29;13732:74:::3;13724:136;;;::::0;-1:-1:-1;;;13724:136:11;;18004:2:18;13724:136:11::3;::::0;::::3;17986:21:18::0;18043:2;18023:18;;;18016:30;18082:34;18062:18;;;18055:62;-1:-1:-1;;;18133:18:18;;;18126:47;18190:19;;13724:136:11::3;17802:413:18::0;13724:136:11::3;13870:18;::::0;::::3;:35:::0;;-1:-1:-1;;;;;;13870:35:11::3;-1:-1:-1::0;;;;;13870:35:11;::::3;::::0;;::::3;::::0;;;13920:42:::3;::::0;;18408:25:18;;;18464:2;18449:18;;18442:60;;;;13920:42:11::3;::::0;18381:18:18;13920:42:11::3;;;;;;;;-1:-1:-1::0;;1701:1:13::2;2628:22:::0;;-1:-1:-1;;13476:493:11:o;15375:3243::-;5478:9;:16;15434:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;15450:21:::1;15474:9;15484:4;15474:15;;;;;;;;:::i;:::-;;;;;;;;;;;15450:39;;15519:4;:20;;;15503:12;:36;15499:72;;15554:7;15375:3243:::0;;:::o;15499:72::-:1;15599:4;:15;;;15584:12;:30;15580:66;;;15629:7;15375:3243:::0;;:::o;15580:66::-:1;15683:21;15699:4;15683:15;:21::i;:::-;15659:4;:20;;;:45;15655:82;;15720:7;15375:3243:::0;;:::o;15655:82::-:1;15746:28;15777:16;15794:4;15777:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;15812:14:::0;;15777:22;;-1:-1:-1;15812:19:11;;:69:::1;;-1:-1:-1::0;15862:14:11;;:18:::1;::::0;15879:1:::1;::::0;15862:18:::1;:::i;:::-;15835:4;:23;;;:46;15812:69;15809:104;;;15896:7;;15375:3243:::0;;:::o;15809:104::-:1;15922:25;15950:7;15958:4;:23;;;15950:32;;;;;;;;:::i;:::-;;;;;;;;;;;15922:60;;15995:6;:25;;;16024:1;15995:30;:70;;;;-1:-1:-1::0;16029:31:11::1;::::0;::::1;::::0;:36;15995:70:::1;15992:150;;;16125:7;;;15375:3243:::0;;:::o;15992:150::-:1;16178:4;:15;;;16155:4;:20;;;:38;16151:107;;;16232:15;::::0;::::1;::::0;16209:20:::1;::::0;::::1;:38:::0;16151:107:::1;16271:11;::::0;::::1;::::0;16267:525:::1;;16326:12;16303:20;::::0;::::1;:35:::0;16395:367:::1;16426:4;:26;;;16403:4;:20;;;:49;16402:118;;;;;16517:1;16485:16;16502:4;16485:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:29:::0;:33:::1;::::0;;::::1;:::i;:::-;16458:4;:23;;;:61;16402:118;16395:367;;;16584:23;::::0;::::1;:26:::0;;;:23:::1;:26;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;16728:18:11;;16697:26:::1;::::0;::::1;::::0;:50:::1;::::0;:30:::1;:50::i;:::-;16668:26;::::0;::::1;:79:::0;16395:367:::1;;;16775:7;;;15375:3243:::0;;:::o;16267:525::-:1;16801:18;16822:64;16837:4;:20;;;16859:4;:26;;;16822:14;:64::i;:::-;16925:25;::::0;::::1;::::0;16801:85;;-1:-1:-1;16963:23:11;16960:121:::1;;17038:31;::::0;::::1;::::0;17022:11:::1;::::0;::::1;::::0;:48:::1;::::0;:15:::1;:48::i;:::-;17001:69;;16960:121;17090:18;17111:34;:10:::0;17126:18;17111:14:::1;:34::i;:::-;17090:55;;17155:24;17182:16;17199:4;17182:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:29:::0;;-1:-1:-1;17289:1016:11::1;17312:4;:26;;;17297:12;:41;17296:97;;;;-1:-1:-1::0;17371:20:11::1;17390:1;17371:16:::0;:20:::1;:::i;:::-;17344:4;:23;;;:48;17296:97;17289:1016;;;17449:23;::::0;::::1;:26:::0;;;:23:::1;:26;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;17529:26:11::1;::::0;::::1;::::0;17591:16:::1;:22:::0;;17608:4;;17591:22;::::1;;;;;:::i;:::-;;;;;;;;17614:4;:23;;;17591:47;;;;;;;;:::i;:::-;;;;;;;;;;;17582:56;;17717:50;17748:6;:18;;;17717:4;:26;;;:30;;:50;;;;:::i;:::-;17688:26;::::0;::::1;:79:::0;;;17892:21:::1;::::0;17916:60:::1;::::0;17931:16;;17916:14:::1;:60::i;:::-;18011:25;::::0;::::1;::::0;;-1:-1:-1;17892:84:11;-1:-1:-1;18053:23:11;18050:129:::1;;18132:31;::::0;::::1;::::0;18116:11:::1;::::0;::::1;::::0;:48:::1;::::0;:15:::1;:48::i;:::-;18095:69;;18050:129;18241:53;18256:37;:13:::0;18274:18;18256:17:::1;:37::i;:::-;18241:10:::0;;:14:::1;:53::i;:::-;18228:66;;17395:910;;17289:1016;;;18334:4;:26;;;18319:12;:41;18315:184;;;18398:26;::::0;::::1;::::0;18375:20:::1;::::0;::::1;:49:::0;18315:184:::1;;;18476:12;18453:20;::::0;::::1;:35:::0;18315:184:::1;18598:11;::::0;::::1;::::0;18532:79:::1;::::0;18558:52:::1;::::0;:35:::1;:10:::0;5024:4:::1;18558:14;:35::i;:::-;:39:::0;::::1;:52::i;:::-;18532:21;::::0;::::1;::::0;;:25:::1;:79::i;:::-;18508:4;:21;;:103;;;;15440:3178;;;;;;;5543:1;15375:3243:::0;;:::o;23966:278::-;5478:9;:16;24057:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1744:1:13::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;24086:41:11::2;24095:4:::0;24101:10:::2;24113:13:::0;24086:8:::2;:41::i;:::-;;;24137:44;24161:4;24167:13;24137:23;:44::i;:::-;24217:4;24205:10;-1:-1:-1::0;;;;;24196:41:11::2;;24223:13;24196:41;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1701:1:13::1;2628:22:::0;;-1:-1:-1;23966:278:11:o;9586:1732::-;5478:9;:16;9790:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12::1;1233:68;;;;-1:-1:-1::0;;;1233:68:12::1;;;;;;;:::i;:::-;1744:1:13::2;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::2;;;;;;;:::i;:::-;1744:1;2455:7;:18;;;;9829:21:11::3;9853:9;9863:4;9853:15;;;;;;;;:::i;:::-;;;;;;;;;;;9829:39;;9887:15;9897:4;9887:9;:15::i;:::-;9886:16;9878:56;;;;-1:-1:-1::0;;;9878:56:11::3;;;;;;;:::i;:::-;9967:1;9952:12;:16;9944:62;;;;-1:-1:-1::0;;;9944:62:11::3;;;;;;;:::i;:::-;10039:16;10056:4;10039:22;;;;;;;;:::i;:::-;;::::0;;;::::3;::::0;;;::::3;:29:::0;10024:44;::::3;10016:96;;;::::0;-1:-1:-1;;;10016:96:11;;19823:2:18;10016:96:11::3;::::0;::::3;19805:21:18::0;19862:2;19842:18;;;19835:30;19901:34;19881:18;;;19874:62;-1:-1:-1;;;19952:18:18;;;19945:37;19999:19;;10016:96:11::3;19621:403:18::0;10016:96:11::3;10125:27;10156:26;10177:4;10156:20;:26::i;:::-;10122:60;;;10216:19;10200:12;:35;;10192:82;;;::::0;-1:-1:-1;;;10192:82:11;;20231:2:18;10192:82:11::3;::::0;::::3;20213:21:18::0;20270:2;20250:18;;;20243:30;20309:34;20289:18;;;20282:62;-1:-1:-1;;;20360:18:18;;;20353:32;20402:19;;10192:82:11::3;20029:398:18::0;10192:82:11::3;10284:25;10312:16;10329:4;10312:22;;;;;;;;:::i;:::-;;;;;;;;10335:12;10312:36;;;;;;;;:::i;:::-;;;;;;;;;;;10284:64;;10382:6;:18;;;10366:12;:34;;10358:81;;;::::0;-1:-1:-1;;;10358:81:11;;20634:2:18;10358:81:11::3;::::0;::::3;20616:21:18::0;20673:2;20653:18;;;20646:30;20712:34;20692:18;;;20685:62;-1:-1:-1;;;20763:18:18;;;20756:32;20805:19;;10358:81:11::3;20432:398:18::0;10358:81:11::3;10481:1;10459:19;:23;:56;;;;;10514:1;10486:25;:29;10459:56;10457:59;10449:111;;;;-1:-1:-1::0;;;10449:111:11::3;;;;;;;:::i;:::-;10607:1;10579:6;:25;;;:29;:56;;;;;10634:1;10612:19;:23;10579:56;10578:132;;;;10675:1;10641:6;:31;;;:35;:68;;;;;10708:1;10680:25;:29;10641:68;10578:213;;;-1:-1:-1::0;10732:24:11;;:58;::::3;;;-1:-1:-1::0;10760:30:11;;10732:58:::3;10570:260;;;::::0;-1:-1:-1;;;10570:260:11;;21445:2:18;10570:260:11::3;::::0;::::3;21427:21:18::0;21484:2;21464:18;;;21457:30;21523:34;21503:18;;;21496:62;-1:-1:-1;;;21574:18:18;;;21567:32;21616:19;;10570:260:11::3;21243:398:18::0;10570:260:11::3;10840:16;10851:4;10840:10;:16::i;:::-;10885:19;10869:12;:35;10866:155;;;10992:18:::0;;10948:26:::3;::::0;::::3;::::0;:41:::3;::::0;10977:12;;10948:41:::3;:::i;:::-;:62;;;;:::i;:::-;10919:26;::::0;::::3;:91:::0;10866:155:::3;11030:33:::0;;;11073:25:::3;::::0;::::3;:47:::0;;;11130:31:::3;::::0;::::3;:59:::0;;;11213:98:::3;::::0;;21905:25:18;;;21961:2;21946:18;;21939:34;;;21989:18;;;21982:34;;;22047:2;22032:18;;22025:34;;;22090:3;22075:19;;22068:35;;;11213:98:11::3;::::0;21892:3:18;21877:19;11213:98:11::3;;;;;;;-1:-1:-1::0;;1701:1:13::2;2628:22:::0;;-1:-1:-1;;;;;;;9586:1732:11:o;22089:176::-;22150:9;:16;22133:14;22176:83;22204:6;22198:3;:12;22176:83;;;22233:15;22244:3;22233:10;:15::i;:::-;22212:5;;;:::i;:::-;;;22176:83;;29951:674;5478:9;:16;30042:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12::1;1233:68;;;;-1:-1:-1::0;;;1233:68:12::1;;;;;;;:::i;:::-;1744:1:13::2;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::2;;;;;;;:::i;:::-;1744:1;2455:7;:18;;;;30081:21:11::3;30105:9;30115:4;30105:15;;;;;;;;:::i;:::-;;;;;;;;;;;30081:39;;30153:1;30138:12;:16;30130:60;;;::::0;-1:-1:-1;;;30130:60:11;;22316:2:18;30130:60:11::3;::::0;::::3;22298:21:18::0;22355:2;22335:18;;;22328:30;22394:33;22374:18;;;22367:61;22445:18;;30130:60:11::3;22114:355:18::0;30130:60:11::3;30216:18;::::0;::::3;::::0;-1:-1:-1;;;;;30216:18:11::3;30200:91;;;::::0;-1:-1:-1;;;30200:91:11;;22676:2:18;30200:91:11::3;::::0;::::3;22658:21:18::0;22715:2;22695:18;;;22688:30;22754:34;22734:18;;;22727:62;-1:-1:-1;;;22805:18:18;;;22798:35;22850:19;;30200:91:11::3;22474:401:18::0;30200:91:11::3;30310:15;30320:4;30310:9;:15::i;:::-;30309:16;30301:56;;;;-1:-1:-1::0;;;30301:56:11::3;;;;;;;:::i;:::-;30466:11;::::0;::::3;::::0;30395:84:::3;::::0;30424:54:::3;::::0;:37:::3;:12:::0;5024:4:::3;30424:16;:37::i;:54::-;30395:24;::::0;::::3;::::0;;:28:::3;:84::i;:::-;30368:24;::::0;::::3;:111:::0;30489:18:::3;::::0;::::3;::::0;:76:::3;::::0;-1:-1:-1;;;;;30489:18:11::3;30525:10;30545:4;30552:12:::0;30489:35:::3;:76::i;:::-;30580:38;::::0;;7592:25:18;;;7648:2;7633:18;;7626:34;;;30580:38:11::3;::::0;7565:18:18;30580:38:11::3;7418:248:18::0;27913:842:11;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;1744:1:13::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;-1:-1:-1;;;;;28002:17:11;::::2;27999:71;;-1:-1:-1::0;28048:10:11::2;27999:71;28101:30;::::0;-1:-1:-1;;;28101:30:11;;28125:4:::2;28101:30;::::0;::::2;554:51:18::0;28079:19:11::2;::::0;28101:5:::2;-1:-1:-1::0;;;;;28101:15:11::2;::::0;::::2;::::0;527:18:18;;28101:30:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28079:52:::0;-1:-1:-1;28144:15:11;;28141:80:::2;;28174:36;-1:-1:-1::0;;;;;28174:5:11::2;:18;28193:3:::0;28198:11;28174:18:::2;:36::i;:::-;28247:9;:16:::0;28230:14:::2;28273:431;28301:6;28295:3;:12;28273:431;;;28331:19;28341:3;28346;28331:9;:19::i;:::-;28365:21;28389:9;28399:3;28389:14;;;;;;;;:::i;:::-;;;;;;;;;;;28365:38;;28447:1;28420:4;:24;;;:28;:73;;;;-1:-1:-1::0;28460:18:11::2;::::0;::::2;::::0;-1:-1:-1;;;;;28460:18:11::2;28452:41:::0;::::2;28420:73;28417:277;;;28526:18;::::0;::::2;::::0;:43:::2;::::0;-1:-1:-1;;;28526:43:11;;28563:4:::2;28526:43;::::0;::::2;554:51:18::0;28512:11:11::2;::::0;-1:-1:-1;;;;;28526:18:11::2;::::0;:28:::2;::::0;527:18:18;;28526:43:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28512:57:::0;-1:-1:-1;28590:7:11;;28587:93:::2;;28620:18;::::0;::::2;::::0;:41:::2;::::0;-1:-1:-1;;;;;28620:18:11::2;28652:3:::0;28657;28620:31:::2;:41::i;:::-;28494:200;28417:277;-1:-1:-1::0;28309:6:11::2;::::0;::::2;:::i;:::-;;;28273:431;;;-1:-1:-1::0;28718:30:11::2;::::0;;28732:10:::2;23289:34:18::0;;-1:-1:-1;;;;;23359:15:18;;23354:2;23339:18;;23332:43;28718:30:11::2;::::0;23224:18:18;28718:30:11::2;;;;;;;-1:-1:-1::0;;1701:1:13::1;2628:22:::0;;-1:-1:-1;27913:842:11:o;5234:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5234:27:11;;;;-1:-1:-1;5234:27:11;;;;;;;;;;;;;;;;;:::o;1661:101:12:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;18692:3314:11:-;18800:15;18817:17;18785:4;5478:9;:16;;;;5471:4;:23;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;18846:31:::1;18863:13;18846:16;:31::i;:::-;18888:21;18913:9;18923:4;18913:15;;;;;;;;:::i;:::-;;;;;;;;;;;18888:40;;18939;18982:12;18995:4;18982:18;;;;;;;;:::i;:::-;;;;;;;;18939:61;;19010:28;19041:16;19058:4;19041:22;;;;;;;;:::i;:::-;;;;;;;;19010:53;;19073:25;19101:7;19109:4;:23;;;19101:32;;;;;;;;:::i;:::-;;;;;;;;;;;19073:60;;19143:24;19170:4;:21;;;19143:48;;19201:26;19230:6;:25;;;19201:54;;19268:18;19290:1;19268:23;19265:121;;;19343:31;::::0;::::1;::::0;19327:11:::1;::::0;::::1;::::0;:48:::1;::::0;:15:::1;:48::i;:::-;19306:69;;19265:121;19398:22:::0;;19395:1976:::1;;19461:20;::::0;::::1;::::0;19517:15:::1;::::0;::::1;::::0;19499:33;::::1;19495:105;;;-1:-1:-1::0;19570:15:11::1;::::0;::::1;::::0;19495:105:::1;19632:15;19617:12;:30;:65;;;;;19667:4;:15;;;19651:12;:31;;19617:65;:84;;;;;19700:1;19686:4;:11;;;:15;19617:84;19613:1748;;;19720:18;19741:59;19756:15;19773:4;:26;;;19741:14;:59::i;:::-;19720:80:::0;-1:-1:-1;19819:18:11::1;19840:34;19720:80:::0;19855:18;19840:14:::1;:34::i;:::-;19819:55;;19892:24;19919:16;19936:4;19919:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:29:::0;19999:23:::1;::::0;::::1;::::0;20063:26:::1;::::0;::::1;::::0;19919:29;;-1:-1:-1;19999:23:11;20183:1052:::1;20206:12;20191;:27;20190:82;;;;-1:-1:-1::0;20250:20:11::1;20269:1;20250:16:::0;:20:::1;:::i;:::-;20224:22;:47;20190:82;20183:1052;;;20344:25:::0;::::1;::::0;::::1;:::i;:::-;;;;20392:24;20419:12;20392:39;;20483:7;20491:22;20483:31;;;;;;;;:::i;:::-;;;;;;;;;;;20474:40;;20595:36;20612:6;:18;;;20595:12;:16;;:36;;;;:::i;:::-;20580:51;;20760:21;20784:45;20798:16;20816:12;20784:13;:45::i;:::-;20893:25;::::0;::::1;::::0;;-1:-1:-1;20760:69:11;-1:-1:-1;20943:23:11;20940:145:::1;;21030:31;::::0;::::1;::::0;21014:11:::1;::::0;::::1;::::0;:48:::1;::::0;:15:::1;:48::i;:::-;20993:69;;20940:145;21163:53;21178:37;:13:::0;21196:18;21178:17:::1;:37::i;:::-;21163:10:::0;;:14:::1;:53::i;:::-;21150:66;;20274:961;;20183:1052;;;21333:11;::::0;::::1;::::0;21272:74:::1;::::0;21293:52:::1;::::0;:35:::1;:10:::0;5024:4:::1;21293:14;:35::i;:52::-;21272:16:::0;;:20:::1;:74::i;:::-;21253:93;;19702:1659;;;;;19613:1748;19421:1950;19395:1976;21381:12;21403:19:::0;21436:9:::1;21432:568;21455:13;:20;21451:1;:24;21432:568;;;21496:19;21518:13;21532:1;21518:16;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;21554:17:::1;::::0;;;;;;;;;;;21588:13;;21554:17;;-1:-1:-1;21518:16:11;;-1:-1:-1;21588:13:11::1;;:21;;:13:::0;:21:::1;21585:405;;;21635:41;:16:::0;5024:4:::1;21635:20;:41::i;:::-;21628:48;;21704:37;21716:24;21725:3;:14;;;21716:4;:8;;:24;;;;:::i;:::-;21704:7:::0;;:11:::1;:37::i;:::-;21694:47;;21790:1;21763:4;:24;;;:28;:73;;;;-1:-1:-1::0;21803:18:11::1;::::0;::::1;::::0;-1:-1:-1;;;;;21803:18:11::1;21795:41:::0;::::1;21763:73;21760:216;;;21871:86;21885:71;21939:3;:16;;;21885:49;5024:4;21885;:24;;;:28;;:49;;;;:::i;:::-;:53:::0;::::1;:71::i;:::-;21871:9:::0;;:13:::1;:86::i;:::-;21859:98;;21760:216;-1:-1:-1::0;21477:4:11;::::1;::::0;::::1;:::i;:::-;;;;21432:568;;;;18836:3170;;;;;;;;18692:3314:::0;;;;;;:::o;29625:320::-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;;;;;;:::i;:::-;1744:1;2455:7;:18;29734:10:11::1;::::0;-1:-1:-1;;;;;29734:10:11::1;29720;:24;29712:61;;;::::0;-1:-1:-1;;;29712:61:11;;23588:2:18;29712:61:11::1;::::0;::::1;23570:21:18::0;23627:2;23607:18;;;23600:30;23666:26;23646:18;;;23639:54;23710:18;;29712:61:11::1;23386:348:18::0;29712:61:11::1;-1:-1:-1::0;;;;;29791:25:11;::::1;29783:77;;;::::0;-1:-1:-1;;;29783:77:11;;23941:2:18;29783:77:11::1;::::0;::::1;23923:21:18::0;23980:2;23960:18;;;23953:30;24019:34;23999:18;;;23992:62;-1:-1:-1;;;24070:18:18;;;24063:37;24117:19;;29783:77:11::1;23739:403:18::0;29783:77:11::1;29870:10;:24:::0;;-1:-1:-1;;;;;;29870:24:11::1;-1:-1:-1::0;;;;;29870:24:11;::::1;::::0;;::::1;::::0;;;29909:29:::1;::::0;554:51:18;;;29909:29:11::1;::::0;542:2:18;527:18;29909:29:11::1;;;;;;;;-1:-1:-1::0;1701:1:13;2628:22;;29625:320:11:o;11399:474::-;5478:9;:16;11484:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12::1;1233:68;;;;-1:-1:-1::0;;;1233:68:12::1;;;;;;;:::i;:::-;1744:1:13::2;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::2;;;;;;;:::i;:::-;1744:1;2455:7;:18;;;;11523:21:11::3;11547:9;11557:4;11547:15;;;;;;;;:::i;:::-;;;;;;;;;;;11523:39;;11595:4;:15;;;11580:12;:30;11572:101;;;::::0;-1:-1:-1;;;11572:101:11;;24349:2:18;11572:101:11::3;::::0;::::3;24331:21:18::0;24388:2;24368:18;;;24361:30;24427:34;24407:18;;;24400:62;24498:28;24478:18;;;24471:56;24544:19;;11572:101:11::3;24147:422:18::0;11572:101:11::3;11706:11;11691:12;:26;11683:97;;;::::0;-1:-1:-1;;;11683:97:11;;24776:2:18;11683:97:11::3;::::0;::::3;24758:21:18::0;24815:2;24795:18;;;24788:30;24854:34;24834:18;;;24827:62;24925:28;24905:18;;;24898:56;24971:19;;11683:97:11::3;24574:422:18::0;11683:97:11::3;11790:15;::::0;::::3;:29:::0;;;11834:32:::3;::::0;;7592:25:18;;;7648:2;7633:18;;7626:34;;;11834:32:11::3;::::0;7565:18:18;11834:32:11::3;7418:248:18::0;14681:176:11;14753:7;14781:5;14775:3;:11;14772:61;;;14808:14;:3;14816:5;14808:7;:14::i;:::-;14801:21;;;;14772:61;-1:-1:-1;14849:1:11;14681:176;;;;;:::o;25644:234::-;25780:15;25797:17;25752:4;5478:9;:16;;;;5471:4;:23;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1744:1:13::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;25832:39:11::2;25841:4:::0;25847:8;25857:13;25832:8:::2;:39::i;:::-;1701:1:13::1;2628:22:::0;;25825:46:11;;;;-1:-1:-1;25644:234:11;-1:-1:-1;;;;;25644:234:11:o;14020:328::-;5478:9;:16;14107:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12::1;1233:68;;;;-1:-1:-1::0;;;1233:68:12::1;;;;;;;:::i;:::-;1744:1:13::2;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::2;;;;;;;:::i;:::-;1744:1;2455:7;:18;;;;14146:21:11::3;14170:9;14180:4;14170:15;;;;;;;;:::i;:::-;;;;;;;;;;;14146:39;;14204:15;14214:4;14204:9;:15::i;:::-;14203:16;14195:56;;;;-1:-1:-1::0;;;14195:56:11::3;;;;;;;:::i;:::-;14261:15;::::0;::::3;:29:::0;;;14305:36:::3;::::0;;7592:25:18;;;7648:2;7633:18;;7626:34;;;14305:36:11::3;::::0;7565:18:18;14305:36:11::3;7418:248:18::0;12487:908:11;12552:29;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;12552:29:11;12583:27;12621:21;12645:9;12655:4;12645:15;;;;;;;;:::i;:::-;;;;;;;;;;;12621:39;;12692:4;:23;;;12670:45;;12725:33;12761:4;:26;;;12725:62;;12797:24;12824:16;12841:4;12824:22;;;;;;;;:::i;:::-;;;;;;;;:29;;;;12797:56;;12877:16;12894:4;12877:22;;;;;;;;:::i;:::-;;;;;;;;12900:19;12877:43;;;;;;;;:::i;:::-;;;;;;;;;;;12863:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12998:391;13021:25;13006:12;:40;13005:92;;;;-1:-1:-1;13075:20:11;13094:1;13075:16;:20;:::i;:::-;13052:19;:44;13005:92;12998:391;;;13153:22;;;;:::i;:::-;;;;13203:16;13220:4;13203:22;;;;;;;;:::i;:::-;;;;;;;;13226:19;13203:43;;;;;;;;:::i;:::-;;;;;;;;;;13189:57;;;;;;;;13203:43;;;;;;;13189:57;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13324:54:11;;:25;;:29;:54::i;:::-;13296:82;;12998:391;;;12611:784;;;12487:908;;;:::o;5288:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5288:38:11;;-1:-1:-1;5288:38:11;:::o;25884:303::-;5478:9;:16;26013:4;;25998;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;26040:15:::1;::::0;-1:-1:-1;;;;;26040:15:11::1;26032:38:::0;26029:131:::1;;26092:15;::::0;:57:::1;::::0;-1:-1:-1;;;26092:57:11;;-1:-1:-1;;;;;26092:15:11;;::::1;::::0;:26:::1;::::0;:57:::1;::::0;26119:4;;26125:8;;26135:13;;26092:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26085:64;;;;26029:131;26176:4;26169:11;;5543:1;25884:303:::0;;;;;;:::o;14411:197::-;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;1744:1:13::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;;;14516:34:11;;-1:-1:-1;;;;;;14516:34:11::2;-1:-1:-1::0;;;;;14516:34:11;::::2;::::0;;::::2;::::0;;;14565:36:::2;::::0;554:51:18;;;14565:36:11::2;::::0;542:2:18;527:18;14565:36:11::2;381:230:18::0;28761:506:11;5478:9;:16;28840:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1075:7:12;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12::1;1233:68;;;;-1:-1:-1::0;;;1233:68:12::1;;;;;;;:::i;:::-;28866:21:11::2;28890:9;28900:4;28890:15;;;;;;;;:::i;:::-;;;;;;;;;;;28866:39;;28918:15;28928:4;28918:9;:15::i;:::-;28915:50;;;28948:7;28761:506:::0;;;:::o;28915:50::-:2;29009:1;28977:16;28994:4;28977:22;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;:29:::0;:33:::2;28974:121;;;29083:1;29051:16;29068:4;29051:22;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;:29:::0;:33:::2;::::0;;::::2;:::i;:::-;29025:23;::::0;::::2;:59:::0;28974:121:::2;29133:12;29104:26;::::0;::::2;:41:::0;-1:-1:-1;;;;;29158:17:11;::::2;29155:71;;29204:10;29190:25;;29155:71;29240:20;::::0;;18408:25:18;;;-1:-1:-1;;;;;18469:32:18;;18464:2;18449:18;;18442:60;29240:20:11::2;::::0;18381:18:18;29240:20:11::2;;;;;;;28856:411;1311:1:12;28761:506:11::0;;;:::o;22352:1570::-;5478:9;:16;22438:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1744:1:13::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;22475:27:11::2;22492:9:::0;22475:16:::2;:27::i;:::-;22512:16;22523:4;22512:10;:16::i;:::-;22538:21;22562:9;22572:4;22562:15;;;;;;;;:::i;:::-;;;;;;;;;;;22538:39;;22611:4;:15;;;22595:12;:31;;22587:77;;;::::0;-1:-1:-1;;;22587:77:11;;26182:2:18;22587:77:11::2;::::0;::::2;26164:21:18::0;26221:2;26201:18;;;26194:30;26260:34;26240:18;;;26233:62;-1:-1:-1;;;26311:18:18;;;26304:31;26352:19;;22587:77:11::2;25980:397:18::0;22587:77:11::2;22683:15;22693:4;22683:9;:15::i;:::-;22682:16;22674:56;;;;-1:-1:-1::0;;;22674:56:11::2;;;;;;;:::i;:::-;22743:15;::::0;::::2;::::0;:19;22740:201:::2;;22815:4;:15;;;22802:9;:28;22794:86;;;::::0;-1:-1:-1;;;22794:86:11;;26584:2:18;22794:86:11::2;::::0;::::2;26566:21:18::0;26623:2;26603:18;;;26596:30;26662:34;26642:18;;;26635:62;-1:-1:-1;;;26713:18:18;;;26706:43;26766:19;;22794:86:11::2;26382:409:18::0;22794:86:11::2;22894:10;::::0;22914:15:::2;::::0;::::2;::::0;22894:36:::2;::::0;-1:-1:-1;;;;;22894:10:11;;::::2;::::0;:36;::::2;;;::::0;22914:15;22894:10:::2;:36:::0;:10;:36;22914:15;22894:10;:36;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;22740:201;22950:40;22993:12;23006:4;22993:18;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;-1:-1:-1;22993:18:11;;;23106:655:::2;23129:9;:16;23125:1;:20;23106:655;;;23176:9;23186:1;23176:12;;;;;;;;:::i;:::-;;;;;;;23166:22;;23313:10;-1:-1:-1::0;;;;;23277:46:11::2;:4;:9;;;;;;;;;;-1:-1:-1::0;;;;;23277:9:11::2;-1:-1:-1::0;;;;;23277:13:11::2;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23277:23:11::2;;23301:7;23277:32;;;;;;;;;;;;;160:25:18::0;;148:2;133:18;;14:177;23277:32:11::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23277:46:11::2;;23269:104;;;::::0;-1:-1:-1;;;23269:104:11;;26998:2:18;23269:104:11::2;::::0;::::2;26980:21:18::0;27037:2;27017:18;;;27010:30;27076:34;27056:18;;;27049:62;-1:-1:-1;;;27127:18:18;;;27120:43;27180:19;;23269:104:11::2;26796:409:18::0;23269:104:11::2;23393:13;::::0;;;::::2;::::0;;;;;;23482;;23393;;-1:-1:-1;23482:13:11::2;;23479:113;;23523:16:::0;::::2;::::0;::::2;:::i;:::-;23557:20:::0;;-1:-1:-1;;23557:20:11::2;23573:4;23557:20;::::0;;23523:16;-1:-1:-1;;23479:113:11::2;23622:21;::::0;::::2;::::0;:46:::2;::::0;5024:4:::2;23622:25;:46::i;:::-;23605:14;::::0;::::2;:63:::0;23701:24:::2;::::0;::::2;::::0;:49:::2;::::0;5024:4:::2;23701:28;:49::i;:::-;23682:16;::::0;::::2;:68:::0;23147:4;::::2;::::0;::::2;:::i;:::-;;;;23106:655;;;-1:-1:-1::0;23770:9:11;;:40:::2;::::0;-1:-1:-1;;;23770:40:11;;-1:-1:-1;;;;;23770:9:11;;::::2;::::0;:17:::2;::::0;:40:::2;::::0;23788:10:::2;::::0;23800:9;;23770:40:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;23834:11:11::2;::::0;::::2;::::0;:30:::2;::::0;-1:-1:-1;23850:13:11;23834:15:::2;:30::i;:::-;23820:11;::::0;::::2;:44:::0;23879:36:::2;::::0;23899:4;;23887:10:::2;::::0;23879:36:::2;::::0;::::2;::::0;23905:9;;23879:36:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;;1701:1:13::1;2628:22:::0;;-1:-1:-1;;;;;;22352:1570:11:o;25311:281::-;5478:9;:16;25416:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;1744:1:13::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:13::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;25445:16:11::2;25456:4:::0;25445:10:::2;:16::i;:::-;25471:44;25495:4;25501:13;25471:23;:44::i;:::-;25565:4;25553:10;-1:-1:-1::0;;;;;25530:55:11::2;;25571:13;25530:55;;;;;;:::i;5332:50::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5332:50:11;:::o;1911:198:12:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:12;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:12;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;27775:2:18;1991:73:12::1;::::0;::::1;27757:21:18::0;27814:2;27794:18;;;27787:30;27853:34;27833:18;;;27826:62;-1:-1:-1;;;27904:18:18;;;27897:36;27950:19;;1991:73:12::1;27573:402:18::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;11879:165:11:-;11933:4;11949:20;11972:21;11988:4;11972:15;:21::i;:::-;12010:12;:27;;11879:165;-1:-1:-1;;;11879:165:11:o;2755:96:15:-;2813:7;2839:5;2843:1;2839;:5;:::i;:::-;2832:12;2755:96;-1:-1:-1;;;2755:96:15:o;8379:1152:11:-;8467:28;8498:16;8515:4;8498:22;;;;;;;;:::i;:::-;;;;;;;;8569:15;;8498:22;;;-1:-1:-1;8569:19:11;8566:106;;8660:1;8627:8;8636:1;8627:11;;;;;;;;:::i;:::-;;;;;;;:30;;;:34;8603:58;;8566:106;8686:9;8681:844;8705:8;:15;8701:1;:19;8681:844;;;8741:24;8768:8;8777:1;8768:11;;;;;;;;:::i;:::-;;;;;;;8741:38;;8822:1;8801:6;:18;;;:22;8793:68;;;;-1:-1:-1;;;8793:68:11;;;;;;;:::i;:::-;8913:1;8885:6;:25;;;:29;:68;;;;;8952:1;8918:6;:31;;;:35;8885:68;8883:71;8875:123;;;;-1:-1:-1;;;8875:123:11;;;;;;;:::i;:::-;9021:21;:54;;;;;9074:1;9046:6;:25;;;:29;9021:54;9020:123;;;;9082:21;9081:22;:61;;;;;9141:1;9107:6;:31;;;:35;9081:61;9020:219;;;-1:-1:-1;9168:25:11;;;;:30;:70;;;;-1:-1:-1;9202:31:11;;;;:36;9168:70;9012:261;;;;-1:-1:-1;;;9012:261:11;;28182:2:18;9012:261:11;;;28164:21:18;28221:2;28201:18;;;28194:30;28260:31;28240:18;;;28233:59;28309:18;;9012:261:11;27980:353:18;9012:261:11;9300:213;;;;;;;;9342:18;;9300:213;;;9398:25;;;;9300:213;;;;;;9467:31;;;;9300:213;;;;;;9287:227;;;;;;;;-1:-1:-1;9287:227:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8722:3;;;;:::i;:::-;;;;8681:844;;14863:439;14968:19;15017:16;15002:12;:31;14999:297;;;-1:-1:-1;15055:1:11;15048:8;;14999:297;15091:22;15076:12;:37;15072:224;;;15142:55;15156:16;15174:22;15142:13;:55::i;15072:224::-;15240:45;15254:16;15272:12;15240:13;:45::i;3465:96:15:-;3523:7;3549:5;3553:1;3549;:5;:::i;3850:96::-;3908:7;3934:5;3938:1;3934;:5;:::i;26193:1714:11:-;26317:15;26334:17;26302:4;5478:9;:16;;;;5471:4;:23;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;26363:31:::1;26380:13;26363:16;:31::i;:::-;-1:-1:-1::0;;;;;26407:22:11;::::1;26404:72;;26455:10;26444:21;;26404:72;26493:41;26504:4;26510:8;26520:13;26493:10;:41::i;:::-;26485:85;;;::::0;-1:-1:-1;;;26485:85:11;;28935:2:18;26485:85:11::1;::::0;::::1;28917:21:18::0;28974:2;28954:18;;;28947:30;29013:33;28993:18;;;28986:61;29064:18;;26485:85:11::1;28733:355:18::0;26485:85:11::1;26580:16;26591:4;26580:10;:16::i;:::-;26606:21;26631:9;26641:4;26631:15;;;;;;;;:::i;:::-;;;;;;;;;;;26606:40;;26656;26699:12;26712:4;26699:18;;;;;;;;:::i;:::-;;;;;;;;26656:61;;26727:19;26756::::0;26785:12:::1;26815:9:::0;26811:796:::1;26834:13;:20;26830:1;:24;26811:796;;;26889:13;26903:1;26889:16;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;26925:17:::1;::::0;;;;;;;;;;;;26964:9;;:30;;-1:-1:-1;;;26964:30:11;;::::1;::::0;::::1;160:25:18::0;;;26889:16:11;;-1:-1:-1;26925:17:11;-1:-1:-1;;;;;;26964:42:11;;::::1;::::0;:9:::1;::::0;:17:::1;::::0;133:18:18;;26964:30:11::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26964:42:11::1;;26956:100;;;::::0;-1:-1:-1;;;26956:100:11;;29295:2:18;26956:100:11::1;::::0;::::1;29277:21:18::0;29334:2;29314:18;;;29307:30;29373:34;29353:18;;;29346:62;-1:-1:-1;;;29424:18:18;;;29417:43;29477:19;;26956:100:11::1;29093:409:18::0;26956:100:11::1;27073:13:::0;;::::1;;:21;;:13:::0;:21:::1;27070:527;;;27120:21;::::0;::::1;::::0;:46:::1;::::0;5024:4:::1;27120:25;:46::i;:::-;27113:53;;27194:37;27206:24;27215:3;:14;;;27206:4;:8;;:24;;;;:::i;:::-;27194:7:::0;;:11:::1;:37::i;:::-;27249:14;::::0;::::1;:21:::0;;;27292:24:::1;::::0;::::1;::::0;27184:47;;-1:-1:-1;27292:28:11;;;;:73:::1;;-1:-1:-1::0;27332:18:11::1;::::0;::::1;::::0;-1:-1:-1;;;;;27332:18:11::1;27324:41:::0;::::1;27292:73;27289:294;;;27395:24;::::0;::::1;::::0;:49:::1;::::0;5024:4:::1;27395:28;:49::i;:::-;27388:56;;27478:41;27492:26;27501:3;:16;;;27492:4;:8;;:26;;;;:::i;27478:41::-;27541:16;::::0;::::1;:23:::0;;;27466:53;-1:-1:-1;27289:294:11::1;26856:4:::0;::::1;::::0;::::1;:::i;:::-;;;;26811:796;;;-1:-1:-1::0;27620:11:11;;27616:94:::1;;27647:52;27674:5;27681:8;27691:7;27647:26;:52::i;:::-;27722:13:::0;;27719:109:::1;;27777:18;::::0;::::1;::::0;27750:67:::1;::::0;-1:-1:-1;;;;;27777:18:11::1;27797:8:::0;27807:9;27750:26:::1;:67::i;:::-;27860:4;27850:8;-1:-1:-1::0;;;;;27842:58:11::1;;27866:13;27881:7;27890:9;27842:58;;;;;;;;:::i;:::-;;;;;;;;26353:1554;;;;;26193:1714:::0;;;;;;;:::o;24302:941::-;5478:9;:16;24408:4;;5471:23;;5463:70;;;;-1:-1:-1;;;5463:70:11;;;;;;;:::i;:::-;24424:31:::1;24441:13;24424:16;:31::i;:::-;24465:21;24489:9;24499:4;24489:15;;;;;;;;:::i;:::-;;;;;;;;;;;24465:39;;24514:40;24557:12;24570:4;24557:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;24557:18:11;;;24675:452:::1;24698:13;:20;24694:1;:24;24675:452;;;24753:13;24767:1;24753:16;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;24791:9;;:30:::1;::::0;-1:-1:-1;;;24791:30:11;;::::1;::::0;::::1;160:25:18::0;;;24753:16:11;;-1:-1:-1;24825:10:11::1;::::0;-1:-1:-1;;;;;24791:9:11;;::::1;::::0;:17:::1;::::0;133:18:18;;24791:30:11::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24791:44:11::1;;24783:103;;;::::0;-1:-1:-1;;;24783:103:11;;30117:2:18;24783:103:11::1;::::0;::::1;30099:21:18::0;30156:2;30136:18;;;30129:30;30195:34;30175:18;;;30168:62;-1:-1:-1;;;30246:18:18;;;30239:44;30300:19;;24783:103:11::1;29915:410:18::0;24783:103:11::1;24906:17;::::0;;;::::1;::::0;;;;;;24940:13;;24906:17;;-1:-1:-1;24940:13:11::1;;:21;;:13:::0;:21:::1;24937:114;;;24980:17:::0;::::1;::::0;::::1;:::i;:::-;25015:21:::0;;-1:-1:-1;;25015:21:11::1;::::0;;24980:17;-1:-1:-1;;24937:114:11::1;25081:1;25064:14;::::0;::::1;:18:::0;;;25096:16:::1;::::0;::::1;:20:::0;24720:4;::::1;::::0;::::1;:::i;:::-;;;;24675:452;;;-1:-1:-1::0;25136:9:11;;:45:::1;::::0;-1:-1:-1;;;25136:45:11;;-1:-1:-1;;;;;25136:9:11;;::::1;::::0;:18:::1;::::0;:45:::1;::::0;25155:10:::1;::::0;25167:13;;25136:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;25205:11:11::1;::::0;::::1;::::0;:31:::1;::::0;-1:-1:-1;25221:14:11;25205:15:::1;:31::i;:::-;25191:4;:11;;:45;;;;24414:829;;;;;24302:941:::0;;;:::o;898:241:14:-;1063:68;;-1:-1:-1;;;;;30588:15:18;;;1063:68:14;;;30570:34:18;30640:15;;30620:18;;;30613:43;30672:18;;;30665:34;;;1036:96:14;;1056:5;;-1:-1:-1;;;1086:27:14;30505:18:18;;1063:68:14;;;;-1:-1:-1;;1063:68:14;;;;;;;;;;;;;;-1:-1:-1;;;;;1063:68:14;-1:-1:-1;;;;;;1063:68:14;;;;;;;;;;1036:19;:96::i;:::-;898:241;;;;:::o;687:205::-;826:58;;-1:-1:-1;;;;;30902:32:18;;826:58:14;;;30884:51:18;30951:18;;;30944:34;;;799:86:14;;819:5;;-1:-1:-1;;;849:23:14;30857:18:18;;826:58:14;30710:274:18;2263:187:12;2336:16;2355:6;;-1:-1:-1;;;;;2371:17:12;;;-1:-1:-1;;;;;;2371:17:12;;;;;;2403:40;;2355:6;;;;;;;2403:40;;2336:16;2403:40;2326:124;2263:187;:::o;30631:262:11:-;30736:1;30717:9;:16;:20;30709:74;;;;-1:-1:-1;;;30709:74:11;;31191:2:18;30709:74:11;;;31173:21:18;31230:2;31210:18;;;31203:30;31269:34;31249:18;;;31242:62;-1:-1:-1;;;31320:18:18;;;31313:39;31369:19;;30709:74:11;30989:405:18;30709:74:11;30802:24;;-1:-1:-1;;;30802:24:11;;:22;;;;:24;;:9;;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30801:25;30793:93;;;;-1:-1:-1;;;30793:93:11;;32246:2:18;30793:93:11;;;32228:21:18;32285:2;32265:18;;;32258:30;32324:34;32304:18;;;32297:62;32395:25;32375:18;;;32368:53;32438:19;;30793:93:11;32044:419:18;3122:96:15;3180:7;3206:5;3210:1;3206;:5;:::i;29273:298:11:-;29387:31;;-1:-1:-1;;;29387:31:11;;29412:4;29387:31;;;554:51:18;29373:11:11;;-1:-1:-1;;;;;29387:16:11;;;;;527:18:18;;29387:31:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29373:45;;29442:3;29432:7;:13;29428:137;;;29461:29;-1:-1:-1;;;;;29461:19:11;;29481:3;29486;29461:19;:29::i;:::-;29428:137;;;29521:33;-1:-1:-1;;;;;29521:19:11;;29541:3;29546:7;29521:19;:33::i;3193:706:14:-;3612:23;3638:69;3666:4;3638:69;;;;;;;;;;;;;;;;;3646:5;-1:-1:-1;;;;;3638:27:14;;;:69;;;;;:::i;:::-;3721:17;;3612:95;;-1:-1:-1;3721:21:14;3717:176;;3816:10;3805:30;;;;;;;;;;;;:::i;:::-;3797:85;;;;-1:-1:-1;;;3797:85:14;;32670:2:18;3797:85:14;;;32652:21:18;32709:2;32689:18;;;32682:30;32748:34;32728:18;;;32721:62;-1:-1:-1;;;32799:18:18;;;32792:40;32849:19;;3797:85:14;32468:406:18;3861:223:0;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;3861:223;-1:-1:-1;;;;3861:223:0:o;4948:499::-;5113:12;5170:5;5145:21;:30;;5137:81;;;;-1:-1:-1;;;5137:81:0;;33081:2:18;5137:81:0;;;33063:21:18;33120:2;33100:18;;;33093:30;33159:34;33139:18;;;33132:62;-1:-1:-1;;;33210:18:18;;;33203:36;33256:19;;5137:81:0;32879:402:18;5137:81:0;-1:-1:-1;;;;;1465:19:0;;;5228:60;;;;-1:-1:-1;;;5228:60:0;;33488:2:18;5228:60:0;;;33470:21:18;33527:2;33507:18;;;33500:30;33566:31;33546:18;;;33539:59;33615:18;;5228:60:0;33286:353:18;5228:60:0;5300:12;5314:23;5341:6;-1:-1:-1;;;;;5341:11:0;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:0:o;7561:692::-;7707:12;7735:7;7731:516;;;-1:-1:-1;7765:10:0;7758:17;;7731:516;7876:17;;:21;7872:365;;8070:10;8064:17;8130:15;8117:10;8113:2;8109:19;8102:44;7872:365;8209:12;8202:20;;-1:-1:-1;;;8202:20:0;;;;;;;;:::i;196:180:18:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:18;;196:180;-1:-1:-1;196:180:18:o;616:148::-;-1:-1:-1;;;;;708:31:18;;698:42;;688:70;;754:1;751;744:12;769:127;830:10;825:3;821:20;818:1;811:31;861:4;858:1;851:15;885:4;882:1;875:15;901:253;973:2;967:9;1015:4;1003:17;;1050:18;1035:34;;1071:22;;;1032:62;1029:88;;;1097:18;;:::i;:::-;1133:2;1126:22;901:253;:::o;1159:275::-;1230:2;1224:9;1295:2;1276:13;;-1:-1:-1;;1272:27:18;1260:40;;1330:18;1315:34;;1351:22;;;1312:62;1309:88;;;1377:18;;:::i;:::-;1413:2;1406:22;1159:275;;-1:-1:-1;1159:275:18:o;1439:193::-;1509:4;1542:18;1534:6;1531:30;1528:56;;;1564:18;;:::i;:::-;-1:-1:-1;1609:1:18;1605:14;1621:4;1601:25;;1439:193::o;1637:159::-;1713:20;;1742:48;1713:20;1742:48;:::i;:::-;1637:159;;;:::o;1801:118::-;1887:5;1880:13;1873:21;1866:5;1863:32;1853:60;;1909:1;1906;1899:12;1924:128;1989:20;;2018:28;1989:20;2018:28;:::i;2057:1776::-;2247:6;2255;2263;2271;2279;2287;2340:3;2328:9;2319:7;2315:23;2311:33;2308:53;;;2357:1;2354;2347:12;2308:53;2396:9;2383:23;2415:48;2457:5;2415:48;:::i;:::-;2482:5;-1:-1:-1;2506:2:18;2540:18;;;2527:32;;-1:-1:-1;2610:2:18;2595:18;;2582:32;2637:18;2626:30;;2623:50;;;2669:1;2666;2659:12;2623:50;2692:22;;2745:4;2737:13;;2733:27;-1:-1:-1;2723:55:18;;2774:1;2771;2764:12;2723:55;2810:2;2797:16;2833:70;2849:53;2899:2;2849:53;:::i;:::-;2833:70;:::i;:::-;2937:15;;;2999:4;3038:11;;;3030:20;;3026:29;;;2968:12;;;;2925:3;3067:19;;;3064:39;;;3099:1;3096;3089:12;3064:39;3123:11;;;;3143:488;3159:6;3154:3;3151:15;3143:488;;;3239:2;3233:3;3224:7;3220:17;3216:26;3213:116;;;3283:1;3312:2;3308;3301:14;3213:116;3357:22;;:::i;:::-;3408:17;;3392:34;;3477:12;;;3464:26;3446:16;;;3439:52;3551:2;3542:12;;;3529:26;3511:16;;;3504:52;3569:20;;3176:12;;;;3609;;;;3143:488;;;3650:5;3640:15;;3702:2;3691:9;3687:18;3674:32;3664:42;;;;;;;;3725:47;3767:3;3756:9;3752:19;3725:47;:::i;:::-;3715:57;;3791:36;3822:3;3811:9;3807:19;3791:36;:::i;:::-;3781:46;;2057:1776;;;;;;;;:::o;4062:346::-;4144:6;4152;4205:2;4193:9;4184:7;4180:23;4176:32;4173:52;;;4221:1;4218;4211:12;4173:52;4257:9;4244:23;4234:33;;4317:2;4306:9;4302:18;4289:32;4330:48;4372:5;4330:48;:::i;:::-;4397:5;4387:15;;;4062:346;;;;;:::o;4413:672::-;4467:5;4520:3;4513:4;4505:6;4501:17;4497:27;4487:55;;4538:1;4535;4528:12;4487:55;4574:6;4561:20;4600:4;4624:70;4640:53;4690:2;4640:53;:::i;4624:70::-;4728:15;;;4814:1;4810:10;;;;4798:23;;4794:32;;;4759:12;;;;4838:15;;;4835:35;;;4866:1;4863;4856:12;4835:35;4902:2;4894:6;4890:15;4914:142;4930:6;4925:3;4922:15;4914:142;;;4996:17;;4984:30;;5034:12;;;;4947;;4914:142;;;-1:-1:-1;5074:5:18;4413:672;-1:-1:-1;;;;;;4413:672:18:o;5090:416::-;5183:6;5191;5244:2;5232:9;5223:7;5219:23;5215:32;5212:52;;;5260:1;5257;5250:12;5212:52;5296:9;5283:23;5273:33;;5357:2;5346:9;5342:18;5329:32;5384:18;5376:6;5373:30;5370:50;;;5416:1;5413;5406:12;5370:50;5439:61;5492:7;5483:6;5472:9;5468:22;5439:61;:::i;:::-;5429:71;;;5090:416;;;;;:::o;5511:454::-;5606:6;5614;5622;5630;5638;5691:3;5679:9;5670:7;5666:23;5662:33;5659:53;;;5708:1;5705;5698:12;5659:53;-1:-1:-1;;5731:23:18;;;5801:2;5786:18;;5773:32;;-1:-1:-1;5852:2:18;5837:18;;5824:32;;5903:2;5888:18;;5875:32;;-1:-1:-1;5954:3:18;5939:19;5926:33;;-1:-1:-1;5511:454:18;-1:-1:-1;5511:454:18:o;5970:248::-;6038:6;6046;6099:2;6087:9;6078:7;6074:23;6070:32;6067:52;;;6115:1;6112;6105:12;6067:52;-1:-1:-1;;6138:23:18;;;6208:2;6193:18;;;6180:32;;-1:-1:-1;5970:248:18:o;6223:272::-;6290:6;6343:2;6331:9;6322:7;6318:23;6314:32;6311:52;;;6359:1;6356;6349:12;6311:52;6398:9;6385:23;6417:48;6459:5;6417:48;:::i;7879:568::-;7981:6;7989;7997;8050:2;8038:9;8029:7;8025:23;8021:32;8018:52;;;8066:1;8063;8056:12;8018:52;8102:9;8089:23;8079:33;;8162:2;8151:9;8147:18;8134:32;8175:48;8217:5;8175:48;:::i;:::-;8242:5;-1:-1:-1;8298:2:18;8283:18;;8270:32;8325:18;8314:30;;8311:50;;;8357:1;8354;8347:12;8311:50;8380:61;8433:7;8424:6;8413:9;8409:22;8380:61;:::i;:::-;8370:71;;;7879:568;;;;;:::o;11301:127::-;11362:10;11357:3;11353:20;11350:1;11343:31;11393:4;11390:1;11383:15;11417:4;11414:1;11407:15;11433:127;11494:10;11489:3;11485:20;11482:1;11475:31;11525:4;11522:1;11515:15;11549:4;11546:1;11539:15;11565:128;11605:3;11636:1;11632:6;11629:1;11626:13;11623:39;;;11642:18;;:::i;:::-;-1:-1:-1;11678:9:18;;11565:128::o;11698:135::-;11737:3;-1:-1:-1;;11758:17:18;;11755:43;;;11778:18;;:::i;:::-;-1:-1:-1;11825:1:18;11814:13;;11698:135::o;11838:356::-;12040:2;12022:21;;;12059:18;;;12052:30;12118:34;12113:2;12098:18;;12091:62;12185:2;12170:18;;11838:356::o;12199:355::-;12401:2;12383:21;;;12440:2;12420:18;;;12413:30;12479:33;12474:2;12459:18;;12452:61;12545:2;12530:18;;12199:355::o;14105:288::-;14195:6;14248:2;14236:9;14227:7;14223:23;14219:32;14216:52;;;14264:1;14261;14254:12;14216:52;14296:9;14290:16;14315:48;14357:5;14315:48;:::i;15622:125::-;15662:4;15690:1;15687;15684:8;15681:34;;;15695:18;;:::i;:::-;-1:-1:-1;15732:9:18;;15622:125::o;15752:1286::-;16167:4;16215:3;16204:9;16200:19;16255:1;16251;16246:3;16242:11;16238:19;16296:2;16288:6;16284:15;16273:9;16266:34;16319:2;16369;16361:6;16357:15;16352:2;16341:9;16337:18;16330:43;16409:6;16404:2;16393:9;16389:18;16382:34;16435:2;16473:3;16468:2;16457:9;16453:18;16446:31;16497:6;16532;16526:13;16563:6;16555;16548:22;16601:3;16590:9;16586:19;16579:26;;16640:2;16632:6;16628:15;16614:29;;16661:1;16671:191;16685:6;16682:1;16679:13;16671:191;;;16734:48;16778:3;16769:6;16763:13;8528:12;;8516:25;;8590:4;8579:16;;;8573:23;8557:14;;;8550:47;8646:4;8635:16;;;8629:23;8613:14;;8606:47;8452:207;16734:48;16837:15;;;;16802:12;;;;16707:1;16700:9;16671:191;;;-1:-1:-1;;16913:3:18;16898:19;;16891:35;;;16963:15;;;16957:3;16942:19;;16935:44;-1:-1:-1;;9388:13:18;;9381:21;17027:3;17012:19;;9369:34;16879:3;-1:-1:-1;16988:44:18;;-1:-1:-1;9318:91:18;16988:44;15752:1286;;;;;;;;;;:::o;17043:398::-;17245:2;17227:21;;;17284:2;17264:18;;;17257:30;17323:34;17318:2;17303:18;;17296:62;-1:-1:-1;;;17389:2:18;17374:18;;17367:32;17431:3;17416:19;;17043:398::o;17446:351::-;17648:2;17630:21;;;17687:2;17667:18;;;17660:30;17726:29;17721:2;17706:18;;17699:57;17788:2;17773:18;;17446:351::o;18513:435::-;18566:3;18604:5;18598:12;18631:6;18626:3;18619:19;18657:4;18686:2;18681:3;18677:12;18670:19;;18723:2;18716:5;18712:14;18744:1;18754:169;18768:6;18765:1;18762:13;18754:169;;;18829:13;;18817:26;;18863:12;;;;18898:15;;;;18790:1;18783:9;18754:169;;;-1:-1:-1;18939:3:18;;18513:435;-1:-1:-1;;;;;18513:435:18:o;18953:261::-;19132:2;19121:9;19114:21;19095:4;19152:56;19204:2;19193:9;19189:18;19181:6;19152:56;:::i;19219:397::-;19421:2;19403:21;;;19460:2;19440:18;;;19433:30;19499:34;19494:2;19479:18;;19472:62;-1:-1:-1;;;19565:2:18;19550:18;;19543:31;19606:3;19591:19;;19219:397::o;20835:403::-;21037:2;21019:21;;;21076:2;21056:18;;;21049:30;21115:34;21110:2;21095:18;;21088:62;-1:-1:-1;;;21181:2:18;21166:18;;21159:37;21228:3;21213:19;;20835:403::o;22880:184::-;22950:6;23003:2;22991:9;22982:7;22978:23;22974:32;22971:52;;;23019:1;23016;23009:12;22971:52;-1:-1:-1;23042:16:18;;22880:184;-1:-1:-1;22880:184:18:o;25001:429::-;25218:25;;;-1:-1:-1;;;;;25279:32:18;;25274:2;25259:18;;25252:60;25348:2;25343;25328:18;;25321:30;;;-1:-1:-1;;25368:56:18;;25405:18;;25397:6;25368:56;:::i;:::-;25360:64;25001:429;-1:-1:-1;;;;;25001:429:18:o;25435:245::-;25502:6;25555:2;25543:9;25534:7;25530:23;25526:32;25523:52;;;25571:1;25568;25561:12;25523:52;25603:9;25597:16;25622:28;25644:5;25622:28;:::i;27210:358::-;-1:-1:-1;;;;;27417:32:18;;27399:51;;27486:2;27481;27466:18;;27459:30;;;-1:-1:-1;;27506:56:18;;27543:18;;27535:6;27506:56;:::i;28338:168::-;28378:7;28444:1;28440;28436:6;28432:14;28429:1;28426:21;28421:1;28414:9;28407:17;28403:45;28400:71;;;28451:18;;:::i;:::-;-1:-1:-1;28491:9:18;;28338:168::o;28511:217::-;28551:1;28577;28567:132;;28621:10;28616:3;28612:20;28609:1;28602:31;28656:4;28653:1;28646:15;28684:4;28681:1;28674:15;28567:132;-1:-1:-1;28713:9:18;;28511:217::o;29507:403::-;29742:2;29731:9;29724:21;29705:4;29762:56;29814:2;29803:9;29799:18;29791:6;29762:56;:::i;:::-;29849:2;29834:18;;29827:34;;;;-1:-1:-1;29892:2:18;29877:18;29870:34;29754:64;29507:403;-1:-1:-1;29507:403:18:o;31399:640::-;31578:2;31630:21;;;31700:13;;31603:18;;;31722:22;;;31549:4;;31578:2;31801:15;;;;31775:2;31760:18;;;31549:4;31844:169;31858:6;31855:1;31852:13;31844:169;;;31919:13;;31907:26;;31988:15;;;;31953:12;;;;31880:1;31873:9;31844:169;;;-1:-1:-1;32030:3:18;;31399:640;-1:-1:-1;;;;;;31399:640:18:o;33644:258::-;33716:1;33726:113;33740:6;33737:1;33734:13;33726:113;;;33816:11;;;33810:18;33797:11;;;33790:39;33762:2;33755:10;33726:113;;;33857:6;33854:1;33851:13;33848:48;;;-1:-1:-1;;33892:1:18;33874:16;;33867:27;33644:258::o;33907:274::-;34036:3;34074:6;34068:13;34090:53;34136:6;34131:3;34124:4;34116:6;34112:17;34090:53;:::i;:::-;34159:16;;;;;33907:274;-1:-1:-1;;33907:274:18:o;34186:383::-;34335:2;34324:9;34317:21;34298:4;34367:6;34361:13;34410:6;34405:2;34394:9;34390:18;34383:34;34426:66;34485:6;34480:2;34469:9;34465:18;34460:2;34452:6;34448:15;34426:66;:::i;:::-;34553:2;34532:15;-1:-1:-1;;34528:29:18;34513:45;;;;34560:2;34509:54;;34186:383;-1:-1:-1;;34186:383:18:o
Swarm Source
ipfs://d4ade615e13a532f2502566eb7f750f37f6a785611ba47578aa5d38bad88b570
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.