ERC-20
Yield Farming
Overview
Max Total Supply
96,504,599.336094511795478536 DEXE
Holders
2,457 ( 0.041%)
Market
Price
$8.31 @ 0.002438 ETH (+1.70%)
Onchain Market Cap
$801,953,220.48
Circulating Supply Market Cap
$474,923,944.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
3,011,239.354 DEXEValue
$25,023,399.03 ( ~7,340.1763 Eth) [3.1203%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|---|---|---|---|---|
1 | Binance | DEXE-USDT | $8.26 0.0024298 Eth | $726,112.00 85,485.240 DEXE | 16.5664% |
2 | WhiteBIT | DEXE-USDT | $8.33 0.0024486 Eth | $492,943.00 59,204.430 DEXE | 11.4734% |
3 | Ourbit | DEXE-USDT | $8.32 0.0024470 Eth | $377,032.00 44,366.600 DEXE | 8.5979% |
4 | HTX | DEXE-USDT | $8.34 0.0024515 Eth | $375,945.00 44,187.138 DEXE | 8.5631% |
5 | Nami.Exchange | DEXE-USDT | $8.35 0.0024518 Eth | $210,199.00 25,185.390 DEXE | 4.8807% |
6 | Nami.Exchange | DEXE-VNST | $8.27 0.0024307 Eth | $195,712.00 23,676.670 DEXE | 4.5884% |
7 | Hotcoin | DEXE-USDT | $8.33 0.0024476 Eth | $189,383.00 22,741.730 DEXE | 4.4072% |
8 | PancakeSwap V3 (BSC) | 0X6E88056E8376AE7709496BA64D37FA2F8015CE3E-0X55D398326F99059FF775485246999027B3197955 | $8.32 0.0024453 Eth | $139,960.00 16,500.901 0X6E88056E8376AE7709496BA64D37FA2F8015CE3E | 3.1977% |
9 | Bitrue | DEXE-USDT | $8.32 0.0024487 Eth | $120,103.00 14,427.590 DEXE | 2.7960% |
10 | DigiFinex | DEXE-USDT | $8.32 0.0024453 Eth | $91,316.00 10,975.690 DEXE | 2.1270% |
11 | Tapbit | DEXE-USDT | $8.33 0.0024477 Eth | $91,098.00 10,682.010 DEXE | 2.0701% |
12 | BVOX | DEXE-USDT | $8.30 0.0024335 Eth | $64,379.00 7,581.480 DEXE | 1.4692% |
13 | BingX | DEXE-USDT | $8.32 0.0024452 Eth | $36,329.00 4,271.719 DEXE | 0.8278% |
14 | BloFin | DEXE-USDT | $8.33 0.0024457 Eth | $35,043.00 4,118.110 DEXE | 0.7981% |
15 | LATOKEN | DEXE-USDT | $8.34 0.0024403 Eth | $34,738.00 4,167.620 DEXE | 0.8077% |
16 | WEEX | DEXE-USDT | $8.33 0.0024458 Eth | $30,368.00 3,571.000 DEXE | 0.6920% |
17 | Tothemoon | DEXE-USDT | $8.30 0.0024309 Eth | $17,945.73 2,161.040 DEXE | 0.4188% |
18 | KuCoin | DEXE-USDT | $8.32 0.0024472 Eth | $17,799.09 2,138.993 DEXE | 0.4145% |
19 | MEXC | DEXE-USDT | $8.29 0.0024378 Eth | $16,335.00 1,971.040 DEXE | 0.3820% |
20 | Phemex | DEXE-USDT | $8.31 0.0024417 Eth | $14,383.27 1,730.624 DEXE | 0.3354% |
21 | MEXC | DEXE-BTC | $8.30 0.0024410 Eth | $12,314.31 1,483.560 DEXE | 0.2875% |
22 | PancakeSwap V3 (Ethereum) | 0XDE4EE8057785A7E8E800DB58F9784845A5C2CBD6-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $8.42 0.0024717 Eth | $11,429.99 1,343.401 0XDE4EE8057785A7E8E800DB58F9784845A5C2CBD6 | 0.2603% |
23 | Pionex | DEXE-USDT | $8.35 0.0024421 Eth | $10,375.50 1,221.040 DEXE | 0.2366% |
24 | MEXC | DEXE-ETH | $8.28 0.0024286 Eth | $8,669.35 1,047.500 DEXE | 0.2030% |
25 | Gate.io | DEXE-USDT | $8.34 0.0024503 Eth | $7,930.85 925.700 DEXE | 0.1794% |
26 | PancakeSwap V3 (BSC) | 0X9F5D4479B783327B61718FA13B3A0583869A80C1-0X6E88056E8376AE7709496BA64D37FA2F8015CE3E | $8.32 0.0024453 Eth | $5,259.82 121,951.312 0X9F5D4479B783327B61718FA13B3A0583869A80C1 | 23.6332% |
27 | KuCoin | DEXE-BTC | $8.24 0.0024243 Eth | $1,323.22 160.519 DEXE | 0.0311% |
28 | Bancor (V2) | DEXE-BNT | $8.58 0.0025225 Eth | $564.01 65.714 DEXE | 0.0127% |
29 | TokoCrypto | DEXE-USDT | $8.23 0.0024396 Eth | $484.23 58.817 DEXE | 0.0114% |
30 | PancakeSwap (v2) | 0X039CB485212F996A9DBB85A9A75D898F94D38DA6-0XE9E7CEA3DEDCA5984780BAFC599BD69ADD087D56 | $9.02 0.0026514 Eth | $151.28 16.775 0X039CB485212F996A9DBB85A9A75D898F94D38DA6 | 0.0033% |
31 | Mudrex | DEXE-USDT | $8.32 0.0024460 Eth | $123.77 14.868 DEXE | 0.0029% |
32 | Uniswap V2 (Ethereum) | 0XDE4EE8057785A7E8E800DB58F9784845A5C2CBD6-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $9.03 0.0026268 Eth | $17.51 1.938 0XDE4EE8057785A7E8E800DB58F9784845A5C2CBD6 | 0.0004% |
33 | Nominex | DEXE-USDT | $8.34 0.0026982 Eth | $8.57 1.027 DEXE | 0.0002% |
34 | Gate.io | DEXE-ETH | $8.03 0.0024194 Eth | $6.74 0.840 DEXE | 0.0002% |
Contract Name:
Dexe
Compiler Version
v0.7.0+commit.9e61f92b
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion, Audited
Contract Source Code (Solidity Standard Json-Input format)Audit Report
// SPDX-License-Identifier: MIT pragma solidity 0.7.0; pragma experimental ABIEncoderV2; import './Ownable.sol'; import './SafeMath.sol'; import './ERC20Burnable.sol'; import './IPriceFeed.sol'; import './IDexe.sol'; library ExtraMath { using SafeMath for uint; function divCeil(uint _a, uint _b) internal pure returns(uint) { if (_a.mod(_b) > 0) { return (_a / _b).add(1); } return _a / _b; } function toUInt8(uint _a) internal pure returns(uint8) { require(_a <= uint8(-1), 'uint8 overflow'); return uint8(_a); } function toUInt32(uint _a) internal pure returns(uint32) { require(_a <= uint32(-1), 'uint32 overflow'); return uint32(_a); } function toUInt120(uint _a) internal pure returns(uint120) { require(_a <= uint120(-1), 'uint120 overflow'); return uint120(_a); } function toUInt128(uint _a) internal pure returns(uint128) { require(_a <= uint128(-1), 'uint128 overflow'); return uint128(_a); } } contract Dexe is Ownable, ERC20Burnable, IDexe { using ExtraMath for *; using SafeMath for *; uint private constant DEXE = 10**18; uint private constant USDC = 10**6; uint private constant USDT = 10**6; uint private constant MONTH = 30 days; uint public constant ROUND_SIZE_BASE = 190_476; uint public constant ROUND_SIZE = ROUND_SIZE_BASE * DEXE; uint public constant FIRST_ROUND_SIZE_BASE = 1_000_000; IERC20 public usdcToken; IERC20 public usdtToken; IPriceFeed public usdtPriceFeed; // Provides USDC per 1 * USDT IPriceFeed public dexePriceFeed; // Provides USDC per 1 * DEXE IPriceFeed public ethPriceFeed; // Provides USDC per 1 * ETH // Deposits are immediately transferred here. address payable public treasury; enum LockType { Staking, Foundation, Team, Partnership, School, Marketing } enum ForceReleaseType { X7, X10, X15, X20 } struct LockConfig { uint32 releaseStart; uint32 vesting; } struct Lock { uint128 balance; // Total locked. uint128 released; // Released so far. } uint public averagePrice; // 2-10 rounds average. uint public override launchedAfter; // How many seconds passed between sale end and product launch. mapping(uint => mapping(address => HolderRound)) internal _holderRounds; mapping(address => UserInfo) internal _usersInfo; mapping(address => BalanceInfo) internal _balanceInfo; mapping(LockType => LockConfig) public lockConfigs; mapping(LockType => mapping(address => Lock)) public locks; mapping(address => mapping(ForceReleaseType => bool)) public forceReleased; uint constant ROUND_DURATION_SEC = 86400; uint constant TOTAL_ROUNDS = 22; struct Round { uint120 totalDeposited; // USDC uint128 roundPrice; // USDC per 1 * DEXE } mapping(uint => Round) public rounds; // Indexes are 1-22. // Sunday, September 28, 2020 12:00:00 PM GMT uint public constant tokensaleStartDate = 1601294400; uint public override constant tokensaleEndDate = tokensaleStartDate + ROUND_DURATION_SEC * TOTAL_ROUNDS; event NoteDeposit(address sender, uint value, bytes data); event Note(address sender, bytes data); modifier noteDeposit() { emit NoteDeposit(_msgSender(), msg.value, msg.data); _; } modifier note() { emit Note(_msgSender(), msg.data); _; } constructor(address _distributor) ERC20('Dexe', 'DEXE') { _mint(address(this), 99_000_000 * DEXE); // Market Liquidity Fund. _mint(_distributor, 1_000_000 * DEXE); // Staking rewards are locked on the Dexe itself. locks[LockType.Staking][address(this)].balance = 10_000_000.mul(DEXE).toUInt128(); locks[LockType.Foundation][_distributor].balance = 33_000_000.mul(DEXE).toUInt128(); locks[LockType.Team][_distributor].balance = 20_000_000.mul(DEXE).toUInt128(); locks[LockType.Partnership][_distributor].balance = 16_000_000.mul(DEXE).toUInt128(); locks[LockType.School][_distributor].balance = 10_000_000.mul(DEXE).toUInt128(); locks[LockType.Marketing][_distributor].balance = 5_000_000.mul(DEXE).toUInt128(); lockConfigs[LockType.Staking].releaseStart = (tokensaleEndDate).toUInt32(); lockConfigs[LockType.Staking].vesting = (365 days).toUInt32(); lockConfigs[LockType.Foundation].releaseStart = (tokensaleEndDate + 365 days).toUInt32(); lockConfigs[LockType.Foundation].vesting = (1460 days).toUInt32(); lockConfigs[LockType.Team].releaseStart = (tokensaleEndDate + 180 days).toUInt32(); lockConfigs[LockType.Team].vesting = (730 days).toUInt32(); lockConfigs[LockType.Partnership].releaseStart = (tokensaleEndDate + 90 days).toUInt32(); lockConfigs[LockType.Partnership].vesting = (365 days).toUInt32(); lockConfigs[LockType.School].releaseStart = (tokensaleEndDate + 60 days).toUInt32(); lockConfigs[LockType.School].vesting = (365 days).toUInt32(); lockConfigs[LockType.Marketing].releaseStart = (tokensaleEndDate + 30 days).toUInt32(); lockConfigs[LockType.Marketing].vesting = (365 days).toUInt32(); treasury = payable(_distributor); } function setUSDTTokenAddress(IERC20 _address) external onlyOwner() note() { usdtToken = _address; } function setUSDCTokenAddress(IERC20 _address) external onlyOwner() note() { usdcToken = _address; } function setUSDTFeed(IPriceFeed _address) external onlyOwner() note() { usdtPriceFeed = _address; } function setDEXEFeed(IPriceFeed _address) external onlyOwner() note() { dexePriceFeed = _address; } function setETHFeed(IPriceFeed _address) external onlyOwner() note() { ethPriceFeed = _address; } function setTreasury(address payable _address) external onlyOwner() note() { require(_address != address(0), 'Not zero address required'); treasury = _address; } function addToWhitelist(address _address, uint _limit) external onlyOwner() note() { _updateWhitelist(_address, _limit); } function removeFromWhitelist(address _address) external onlyOwner() note() { _updateWhitelist(_address, 0); } function _updateWhitelist(address _address, uint _limit) private { _usersInfo[_address].firstRoundLimit = _limit.toUInt120(); } // For UI purposes. function getAllRounds() external view returns(Round[22] memory) { Round[22] memory _result; for (uint i = 1; i <= 22; i++) { _result[i-1] = rounds[i]; } return _result; } // For UI purposes. function getFullHolderInfo(address _holder) external view returns( UserInfo memory _info, HolderRound[22] memory _rounds, Lock[6] memory _locks, bool _isWhitelisted, bool[4] memory _forceReleases, uint _balance ) { _info = _usersInfo[_holder]; for (uint i = 1; i <= 22; i++) { _rounds[i-1] = _holderRounds[i][_holder]; } for (uint i = 0; i < 6; i++) { _locks[i] = locks[LockType(i)][_holder]; } _isWhitelisted = _usersInfo[_holder].firstRoundLimit > 0; for (uint i = 0; i < 4; i++) { _forceReleases[i] = forceReleased[_holder][ForceReleaseType(i)]; } _balance = balanceOf(_holder); return (_info, _rounds, _locks, _isWhitelisted, _forceReleases, _balance); } // Excludes possibility of unexpected price change. function prepareDistributionPrecise(uint _round, uint _botPriceLimit, uint _topPriceLimit) external onlyOwner() note() { uint _currentPrice = updateAndGetCurrentPrice(); require(_botPriceLimit <= _currentPrice && _currentPrice <= _topPriceLimit, 'Price is out of range'); _prepareDistribution(_round); } // Should be performed in the last hour of every round. function prepareDistribution(uint _round) external onlyOwner() note() { _prepareDistribution(_round); } function _prepareDistribution(uint _round) private { require(isRoundDepositsEnded(_round), 'Deposit round not ended'); Round memory _localRound = rounds[_round]; require(_localRound.roundPrice == 0, 'Round already prepared'); require(_round > 0 && _round < 23, 'Round is not valid'); if (_round == 1) { _localRound.roundPrice = _localRound.totalDeposited.divCeil(FIRST_ROUND_SIZE_BASE).toUInt128(); // If nobody deposited. if (_localRound.roundPrice == 0) { _localRound.roundPrice = 1; } rounds[_round].roundPrice = _localRound.roundPrice; return; } require(isRoundPrepared(_round.sub(1)), 'Previous round not prepared'); uint _localRoundPrice = updateAndGetCurrentPrice(); uint _totalTokensSold = _localRound.totalDeposited.mul(DEXE) / _localRoundPrice; if (_totalTokensSold < ROUND_SIZE) { // Apply 0-10% discount based on how much tokens left. Empty round applies 10% discount. _localRound.roundPrice = (uint(9).mul(ROUND_SIZE_BASE).mul(_localRoundPrice).add(_localRound.totalDeposited)).divCeil( uint(10).mul(ROUND_SIZE_BASE)).toUInt128(); uint _discountedTokensSold = _localRound.totalDeposited.mul(DEXE) / _localRound.roundPrice; rounds[_round].roundPrice = _localRound.roundPrice; _burn(address(this), ROUND_SIZE.sub(_discountedTokensSold)); } else { // Round overflown, calculate price based on even spread of available tokens. rounds[_round].roundPrice = _localRound.totalDeposited.divCeil(ROUND_SIZE_BASE).toUInt128(); } if (_round == 10) { uint _averagePrice; for (uint i = 2; i <= 10; i++) { _averagePrice = _averagePrice.add(rounds[i].roundPrice); } averagePrice = _averagePrice / 9; } } // Receive tokens/rewards for all processed rounds. function receiveAll() public { _receiveAll(_msgSender()); } function _receiveAll(address _holder) private { // Holder received everything. if (_holderRounds[TOTAL_ROUNDS][_holder].status == HolderRoundStatus.Received) { return; } // Holder didn't participate in the sale. if (_usersInfo[_holder].firstRoundDeposited == 0) { return; } if (_notPassed(tokensaleStartDate)) { return; } uint _currentRound = currentRound(); for (uint i = _usersInfo[_holder].firstRoundDeposited; i < _currentRound; i++) { // Skip received rounds. if (_holderRounds[i][_holder].status == HolderRoundStatus.Received) { continue; } Round memory _localRound = rounds[i]; require(_localRound.roundPrice > 0, 'Round is not prepared'); _holderRounds[i][_holder].status = HolderRoundStatus.Received; _receiveDistribution(i, _holder, _localRound); _receiveRewards(i, _holder, _localRound); } } // Receive tokens based on the deposit. function _receiveDistribution(uint _round, address _holder, Round memory _localRound) private { HolderRound memory _holderRound = _holderRounds[_round][_holder]; uint _balance = _holderRound.deposited.mul(DEXE) / _localRound.roundPrice; uint _endBalance = _holderRound.endBalance.add(_balance); _holderRounds[_round][_holder].endBalance = _endBalance.toUInt128(); if (_round < TOTAL_ROUNDS) { _holderRounds[_round.add(1)][_holder].endBalance = _holderRounds[_round.add(1)][_holder].endBalance.add(_endBalance).toUInt128(); } _transfer(address(this), _holder, _balance); } // Receive rewards based on the last round balance, participation in 1st round and this round fill. function _receiveRewards(uint _round, address _holder, Round memory _localRound) private { if (_round > 21) { return; } HolderRound memory _holderRound = _holderRounds[_round][_holder]; uint _reward; if (_round == 1) { // First round is always 5%. _reward = (_holderRound.endBalance).mul(5) / 100; } else { uint _x2 = 1; uint _previousRoundBalance = _holderRounds[_round.sub(1)][_holder].endBalance; // Double reward if increased balance since last round by 1%+. if (_previousRoundBalance > 0 && (_previousRoundBalance.mul(101) / 100) < _holderRound.endBalance) { _x2 = 2; } uint _roundPrice = _localRound.roundPrice; uint _totalDeposited = _localRound.totalDeposited; uint _holderBalance = _holderRound.endBalance; uint _minPercent = 2; uint _maxBonusPercent = 6; if (_holderRounds[1][_holder].endBalance > 0) { _minPercent = 5; _maxBonusPercent = 15; } // Apply reward modifiers in the following way: // 1. If participated in round 1, then the base is 5%, otherwise 2%. // 2. Depending on the round fill 0-100% get extra 15-0% (round 1 participants) or 6-0%. // 3. Double reward if increased balance since last round by 1%+. _reward = _minPercent.add(_maxBonusPercent).mul(_roundPrice).mul(ROUND_SIZE_BASE) .sub(_maxBonusPercent.mul(_totalDeposited)).mul(_holderBalance).mul(_x2) / 100.mul(_roundPrice).mul(ROUND_SIZE_BASE); } uint _rewardsLeft = locks[LockType.Staking][address(this)].balance; // If not enough left, give everything. if (_rewardsLeft < _reward) { _reward = _rewardsLeft; } locks[LockType.Staking][_holder].balance = locks[LockType.Staking][_holder].balance.add(_reward).toUInt128(); locks[LockType.Staking][address(this)].balance = _rewardsLeft.sub(_reward).toUInt128(); } function depositUSDT(uint _amount) external note() { usdtToken.transferFrom(_msgSender(), treasury, _amount); uint _usdcAmount = _amount.mul(usdtPriceFeed.updateAndConsult()) / USDT; _deposit(_usdcAmount); } function depositETH() payable external noteDeposit() { _depositETH(); } receive() payable external noteDeposit() { _depositETH(); } function _depositETH() private { treasury.transfer(msg.value); uint _usdcAmount = msg.value.mul(ethPriceFeed.updateAndConsult()) / 1 ether; _deposit(_usdcAmount); } function depositUSDC(uint _amount) external note() { usdcToken.transferFrom(_msgSender(), treasury, _amount); _deposit(_amount); } function _deposit(uint _amount) private { uint _depositRound = depositRound(); uint _newDeposited = _holderRounds[_depositRound][_msgSender()].deposited.add(_amount); uint _limit = _usersInfo[_msgSender()].firstRoundLimit; if (_depositRound == 1) { require(_limit > 0, 'Not whitelisted'); require(_newDeposited <= _limit, 'Deposit limit is reached'); } require(_amount >= 1 * USDC, 'Less than minimum amount 1 usdc'); _holderRounds[_depositRound][_msgSender()].deposited = _newDeposited.toUInt120(); rounds[_depositRound].totalDeposited = rounds[_depositRound].totalDeposited.add(_amount).toUInt120(); if (_usersInfo[_msgSender()].firstRoundDeposited == 0) { _usersInfo[_msgSender()].firstRoundDeposited = _depositRound.toUInt8(); } } // In case someone will send USDC/USDT/SomeToken directly. function withdrawLocked(IERC20 _token, address _receiver, uint _amount) external onlyOwner() note() { require(address(_token) != address(this), 'Cannot withdraw this'); _token.transfer(_receiver, _amount); } function currentRound() public view returns(uint) { require(_passed(tokensaleStartDate), 'Tokensale not started yet'); if (_passed(tokensaleEndDate)) { return 23; } return _since(tokensaleStartDate).divCeil(ROUND_DURATION_SEC); } // Deposit round ends 1 hour before the end of each round. function depositRound() public view returns(uint) { require(_passed(tokensaleStartDate), 'Tokensale not started yet'); require(_notPassed(tokensaleEndDate.sub(1 hours)), 'Deposits ended'); return _since(tokensaleStartDate).add(1 hours).divCeil(ROUND_DURATION_SEC); } function isRoundDepositsEnded(uint _round) public view returns(bool) { return _passed(ROUND_DURATION_SEC.mul(_round).add(tokensaleStartDate).sub(1 hours)); } function isRoundPrepared(uint _round) public view returns(bool) { return rounds[_round].roundPrice > 0; } function currentPrice() public view returns(uint) { return dexePriceFeed.consult(); } function updateAndGetCurrentPrice() public returns(uint) { return dexePriceFeed.updateAndConsult(); } function _passed(uint _time) private view returns(bool) { return block.timestamp > _time; } function _notPassed(uint _time) private view returns(bool) { return _not(_passed(_time)); } function _not(bool _condition) private pure returns(bool) { return !_condition; } // Get released tokens to the main balance. function releaseLock(LockType _lock) external note() { _release(_lock, _msgSender()); } // Assign locked tokens to another holder. function transferLock(LockType _lockType, address _to, uint _amount) external note() { receiveAll(); Lock memory _lock = locks[_lockType][_msgSender()]; require(_lock.released == 0, 'Cannot transfer after release'); require(_lock.balance >= _amount, 'Insuffisient locked funds'); locks[_lockType][_msgSender()].balance = _lock.balance.sub(_amount).toUInt128(); locks[_lockType][_to].balance = locks[_lockType][_to].balance.add(_amount).toUInt128(); } function _release(LockType _lockType, address _holder) private { LockConfig memory _lockConfig = lockConfigs[_lockType]; require(_passed(_lockConfig.releaseStart), 'Releasing has no started yet'); Lock memory _lock = locks[_lockType][_holder]; uint _balance = _lock.balance; uint _released = _lock.released; uint _balanceToRelease = _balance.mul(_since(_lockConfig.releaseStart)) / _lockConfig.vesting; // If more than enough time already passed, release what is left. if (_balanceToRelease > _balance) { _balanceToRelease = _balance; } require(_balanceToRelease > _released, 'Insufficient unlocked'); // Underflow cannot happen here, SafeMath usage left for code style. uint _amount = _balanceToRelease.sub(_released); locks[_lockType][_holder].released = _balanceToRelease.toUInt128(); _transfer(address(this), _holder, _amount); } // Wrap call to updateAndGetCurrentPrice() function before froceReleaseStaking on UI to get // most up-to-date price. // In case price increased enough since average, allow holders to release Staking rewards with a fee. function forceReleaseStaking(ForceReleaseType _forceReleaseType) external note() { uint _currentRound = currentRound(); require(_currentRound > 10, 'Only after 10 round'); receiveAll(); Lock memory _lock = locks[LockType.Staking][_msgSender()]; require(_lock.balance > 0, 'Nothing to force unlock'); uint _priceMul; uint _unlockedPart; uint _receivedPart; if (_forceReleaseType == ForceReleaseType.X7) { _priceMul = 7; _unlockedPart = 10; _receivedPart = 86; } else if (_forceReleaseType == ForceReleaseType.X10) { _priceMul = 10; _unlockedPart = 15; _receivedPart = 80; } else if (_forceReleaseType == ForceReleaseType.X15) { _priceMul = 15; _unlockedPart = 20; _receivedPart = 70; } else { _priceMul = 20; _unlockedPart = 30; _receivedPart = 60; } require(_not(forceReleased[_msgSender()][_forceReleaseType]), 'Already force released'); forceReleased[_msgSender()][_forceReleaseType] = true; require(updateAndGetCurrentPrice() >= averagePrice.mul(_priceMul), 'Current price is too small'); uint _balance = _lock.balance.sub(_lock.released); uint _released = _balance.mul(_unlockedPart) / 100; uint _receiveAmount = _released.mul(_receivedPart) / 100; uint _burned = _released.sub(_receiveAmount); locks[LockType.Staking][_msgSender()].released = _lock.released.add(_released).toUInt128(); if (_currentRound <= TOTAL_ROUNDS) { _holderRounds[_currentRound][_msgSender()].endBalance = _holderRounds[_currentRound][_msgSender()].endBalance.add(_receiveAmount).toUInt128(); } _burn(address(this), _burned); _transfer(address(this), _msgSender(), _receiveAmount); } function launchProduct() external onlyOwner() note() { require(_passed(tokensaleEndDate), 'Tokensale is not ended yet'); require(launchedAfter == 0, 'Product already launched'); require(isTokensaleProcessed(), 'Tokensale is not processed'); launchedAfter = _since(tokensaleEndDate); } function isTokensaleProcessed() private view returns(bool) { return rounds[TOTAL_ROUNDS].roundPrice > 0; } // Zero address and Dexe itself are not considered as valid holders. function _isHolder(address _addr) private view returns(bool) { if (_addr == address(this) || _addr == address(0)) { return false; } return true; } // Happen before every transfer to update all the metrics. function _beforeTokenTransfer(address _from, address _to, uint _amount) internal override { if (_isHolder(_from)) { // Automatically receive tokens/rewards for previous rounds. _receiveAll(_from); } if (_notPassed(tokensaleEndDate)) { uint _round = 1; if (_passed(tokensaleStartDate)) { _round = currentRound(); } if (_isHolder(_from)) { _holderRounds[_round][_from].endBalance = _holderRounds[_round][_from].endBalance.sub(_amount).toUInt128(); } if (_isHolder(_to)) { UserInfo memory _userToInfo = _usersInfo[_to]; if (_userToInfo.firstRoundDeposited == 0) { _usersInfo[_to].firstRoundDeposited = _round.toUInt8(); } if (_from != address(this)) { _holderRounds[_round][_to].endBalance = _holderRounds[_round][_to].endBalance.add(_amount).toUInt128(); } } } if (launchedAfter == 0) { if (_isHolder(_from)) { _usersInfo[_from].balanceBeforeLaunch = _usersInfo[_from].balanceBeforeLaunch.sub(_amount).toUInt128(); } if (_isHolder(_to)) { _usersInfo[_to].balanceBeforeLaunch = _usersInfo[_to].balanceBeforeLaunch.add(_amount).toUInt128(); if (_balanceInfo[_to].firstBalanceChange == 0) { _balanceInfo[_to].firstBalanceChange = block.timestamp.toUInt32(); _balanceInfo[_to].lastBalanceChange = block.timestamp.toUInt32(); } } } _updateBalanceAverage(_from); _updateBalanceAverage(_to); } function _since(uint _timestamp) private view returns(uint) { return block.timestamp.sub(_timestamp); } function launchDate() public override view returns(uint) { uint _launchedAfter = launchedAfter; if (_launchedAfter == 0) { return 0; } return tokensaleEndDate.add(_launchedAfter); } function _calculateBalanceAverage(address _holder) private view returns(BalanceInfo memory) { BalanceInfo memory _user = _balanceInfo[_holder]; if (!_isHolder(_holder)) { return _user; } uint _lastBalanceChange = _user.lastBalanceChange; uint _balance = balanceOf(_holder); uint _launchDate = launchDate(); bool _notLaunched = _launchDate == 0; uint _accumulatorTillNow = _user.balanceAccumulator .add(_balance.mul(_since(_lastBalanceChange))); if (_notLaunched) { // Last update happened in the current before launch period. _user.balanceAccumulator = _accumulatorTillNow; _user.balanceAverage = (_accumulatorTillNow / _since(_user.firstBalanceChange)).toUInt128(); _user.lastBalanceChange = block.timestamp.toUInt32(); return _user; } // Calculating the end of the last average period. uint _timeEndpoint = _since(_launchDate).div(MONTH).mul(MONTH).add(_launchDate); if (_lastBalanceChange >= _timeEndpoint) { // Last update happened in the current average period. _user.balanceAccumulator = _accumulatorTillNow; } else { // Last update happened before the current average period. uint _sinceLastBalanceChangeToEndpoint = _timeEndpoint.sub(_lastBalanceChange); uint _accumulatorAtTheEndpoint = _user.balanceAccumulator .add(_balance.mul(_sinceLastBalanceChangeToEndpoint)); if (_timeEndpoint == _launchDate) { // Last update happened before the launch period. _user.balanceAverage = (_accumulatorAtTheEndpoint / _timeEndpoint.sub(_user.firstBalanceChange)).toUInt128(); } else if (_sinceLastBalanceChangeToEndpoint <= MONTH) { // Last update happened in the previous average period. _user.balanceAverage = (_accumulatorAtTheEndpoint / MONTH).toUInt128(); } else { // Last update happened before the previous average period. _user.balanceAverage = _balance.toUInt128(); } _user.balanceAccumulator = _balance.mul(_since(_timeEndpoint)); } _user.lastBalanceChange = block.timestamp.toUInt32(); return _user; } function _updateBalanceAverage(address _holder) private { if (_balanceInfo[_holder].lastBalanceChange == block.timestamp) { return; } _balanceInfo[_holder] = _calculateBalanceAverage(_holder); } function getAverageBalance(address _holder) external override view returns(uint) { return _calculateBalanceAverage(_holder).balanceAverage; } function firstBalanceChange(address _holder) external override view returns(uint) { return _balanceInfo[_holder].firstBalanceChange; } function holderRounds(uint _round, address _holder) external override view returns( HolderRound memory ) { return _holderRounds[_round][_holder]; } function usersInfo(address _holder) external override view returns( UserInfo memory ) { return _usersInfo[_holder]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; import "./IERC20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; import "./ERC20.sol"; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { using SafeMath for uint256; /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.0; pragma experimental ABIEncoderV2; import './IERC20.sol'; interface IDexe is IERC20 { enum HolderRoundStatus {None, Received} struct HolderRound { uint120 deposited; // USDC uint128 endBalance; // DEXE HolderRoundStatus status; } struct UserInfo { uint128 balanceBeforeLaunch; // Final balance before product launch. uint120 firstRoundLimit; // limit of USDC that could deposited in first round uint8 firstRoundDeposited; // First round when holder made a deposit or received DEXE. } struct BalanceInfo { uint32 firstBalanceChange; // Timestamp of first tokens receive. uint32 lastBalanceChange; // Timestamp of last balance change. uint128 balanceAverage; // Average balance for the previous period. uint balanceAccumulator; // Accumulates average for current period. } function launchedAfter() external view returns (uint); function launchDate() external view returns(uint); function tokensaleEndDate() external view returns (uint); function holderRounds(uint _round, address _holder) external view returns(HolderRound memory); function usersInfo(address _holder) external view returns(UserInfo memory); function getAverageBalance(address _holder) external view returns(uint); function firstBalanceChange(address _holder) external view returns(uint); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.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. */ 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.6.5 <= 0.7.0; interface IPriceFeed { function update() external returns(uint); function consult() external view returns (uint); function updateAndConsult() external returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs" }, "optimizer": { "enabled": true, "runs": 10000 }, "remappings": [], "outputSelection": { "*": { "*": [ "metadata", "abi", "evm.deployedBytecode", "evm.bytecode" ] } } }
Contract Security Audit
- Hacken - Sep 24th, 2020 - Security Audit Report
[{"inputs":[{"internalType":"address","name":"_distributor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Note","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"NoteDeposit","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FIRST_ROUND_SIZE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_SIZE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"averagePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexePriceFeed","outputs":[{"internalType":"contract IPriceFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPriceFeed","outputs":[{"internalType":"contract IPriceFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"firstBalanceChange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Dexe.ForceReleaseType","name":"_forceReleaseType","type":"uint8"}],"name":"forceReleaseStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"enum Dexe.ForceReleaseType","name":"","type":"uint8"}],"name":"forceReleased","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllRounds","outputs":[{"components":[{"internalType":"uint120","name":"totalDeposited","type":"uint120"},{"internalType":"uint128","name":"roundPrice","type":"uint128"}],"internalType":"struct Dexe.Round[22]","name":"","type":"tuple[22]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getAverageBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getFullHolderInfo","outputs":[{"components":[{"internalType":"uint128","name":"balanceBeforeLaunch","type":"uint128"},{"internalType":"uint120","name":"firstRoundLimit","type":"uint120"},{"internalType":"uint8","name":"firstRoundDeposited","type":"uint8"}],"internalType":"struct IDexe.UserInfo","name":"_info","type":"tuple"},{"components":[{"internalType":"uint120","name":"deposited","type":"uint120"},{"internalType":"uint128","name":"endBalance","type":"uint128"},{"internalType":"enum IDexe.HolderRoundStatus","name":"status","type":"uint8"}],"internalType":"struct IDexe.HolderRound[22]","name":"_rounds","type":"tuple[22]"},{"components":[{"internalType":"uint128","name":"balance","type":"uint128"},{"internalType":"uint128","name":"released","type":"uint128"}],"internalType":"struct Dexe.Lock[6]","name":"_locks","type":"tuple[6]"},{"internalType":"bool","name":"_isWhitelisted","type":"bool"},{"internalType":"bool[4]","name":"_forceReleases","type":"bool[4]"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_holder","type":"address"}],"name":"holderRounds","outputs":[{"components":[{"internalType":"uint120","name":"deposited","type":"uint120"},{"internalType":"uint128","name":"endBalance","type":"uint128"},{"internalType":"enum IDexe.HolderRoundStatus","name":"status","type":"uint8"}],"internalType":"struct IDexe.HolderRound","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"}],"name":"isRoundDepositsEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"}],"name":"isRoundPrepared","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Dexe.LockType","name":"","type":"uint8"}],"name":"lockConfigs","outputs":[{"internalType":"uint32","name":"releaseStart","type":"uint32"},{"internalType":"uint32","name":"vesting","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Dexe.LockType","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"locks","outputs":[{"internalType":"uint128","name":"balance","type":"uint128"},{"internalType":"uint128","name":"released","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"}],"name":"prepareDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"uint256","name":"_botPriceLimit","type":"uint256"},{"internalType":"uint256","name":"_topPriceLimit","type":"uint256"}],"name":"prepareDistributionPrecise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Dexe.LockType","name":"_lock","type":"uint8"}],"name":"releaseLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint120","name":"totalDeposited","type":"uint120"},{"internalType":"uint128","name":"roundPrice","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IPriceFeed","name":"_address","type":"address"}],"name":"setDEXEFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPriceFeed","name":"_address","type":"address"}],"name":"setETHFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_address","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_address","type":"address"}],"name":"setUSDCTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPriceFeed","name":"_address","type":"address"}],"name":"setUSDTFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_address","type":"address"}],"name":"setUSDTTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensaleEndDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensaleStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Dexe.LockType","name":"_lockType","type":"uint8"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateAndGetCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdtPriceFeed","outputs":[{"internalType":"contract IPriceFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdtToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"usersInfo","outputs":[{"components":[{"internalType":"uint128","name":"balanceBeforeLaunch","type":"uint128"},{"internalType":"uint120","name":"firstRoundLimit","type":"uint120"},{"internalType":"uint8","name":"firstRoundDeposited","type":"uint8"}],"internalType":"struct IDexe.UserInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600436106103e25760003560e01c80637abd66d81161020d578063c89e211d11610128578063e642d3da116100bb578063f2fde38b1161008a578063f688bcfb1161006f578063f688bcfb14610b7d578063f8eeed6214610b9d578063ff8fef9d14610bb257610436565b8063f2fde38b14610b55578063f6326fb314610b7557610436565b8063e642d3da14610ac7578063e7c80f1714610af5578063eb19345714610b15578063f0f4426014610b3557610436565b8063dd62ed3e116100f7578063dd62ed3e14610a45578063df65774914610a65578063dfce794214610a85578063e5066bbf14610aa557610436565b8063c89e211d146109db578063d4fd4f2b146109fb578063d55c476c14610a10578063dc110eee14610a2557610436565b80639d1b464a116101a0578063a9059cbb1161016f578063a9059cbb1461097c578063a98ad46c1461099c578063af7665ce146109b1578063b0a9f273146109c657610436565b80639d1b464a146109125780639e1379b614610927578063a0352ea314610947578063a457c2d71461095c57610436565b80638c65c81f116101dc5780638c65c81f1461088c5780638da5cb5b146108ba57806395d89b41146108cf578063987c56be146108e457610436565b80637abd66d814610822578063812a6dbd146108375780638a19c8bc146108575780638ab1d6811461086c57610436565b806342966c68116102fd578063653a908d11610290578063715018a61161025f578063715018a6146107b8578063792459d9146107cd57806379cc6790146107e25780637aa6636a1461080257610436565b8063653a908d146107435780636c4637f514610763578063709ef5e21461078357806370a082311461079857610436565b806354133307116102cc57806354133307146106cc5780635c32a441146106e15780635d0eaaaf1461070157806361d027b31461072e57610436565b806342966c6814610657578063466db44c146106775780634d1567e81461068c57806352173ba8146106ac57610436565b806318160ddd116103755780632601a2c3116103445780632601a2c3146105d3578063313ce567146105e857806334c3f6fa1461060a578063395093511461063757610436565b806318160ddd1461055e578063214405fc1461057357806323b872dd14610593578063245bde3e146105b357610436565b80630c2e4181116103b15780630c2e4181146104e557806310caf5a31461050757806311eac85514610527578063171fa7211461053c57610436565b8063042ee4261461043b57806306fdde031461045b578063095ea7b3146104865780630be913ae146104b357610436565b36610436577f5c2145746a96e247ab56dae7070701d6a6d52685eb027789d7a768552d262f63610410610bc7565b3460003660405161042494939291906151a8565b60405180910390a1610434610bcc565b005b600080fd5b34801561044757600080fd5b50610434610456366004614f1f565b610cb9565b34801561046757600080fd5b50610470610e02565b60405161047d9190615257565b60405180910390f35b34801561049257600080fd5b506104a66104a1366004614ed4565b610eb6565b60405161047d919061524c565b3480156104bf57600080fd5b506104d36104ce366004614e0b565b610ed4565b60405161047d96959493929190615bdf565b3480156104f157600080fd5b506104fa6111ac565b60405161047d9190615144565b34801561051357600080fd5b506104a6610522366004614e9f565b6111bb565b34801561053357600080fd5b506104fa6111db565b34801561054857600080fd5b506105516111ef565b60405161047d9190615cc1565b34801561056a57600080fd5b506105516111f6565b34801561057f57600080fd5b5061043461058e366004614ed4565b6111fc565b34801561059f57600080fd5b506104a66105ae366004614e5f565b611282565b3480156105bf57600080fd5b506104346105ce366004614f87565b611309565b3480156105df57600080fd5b506104fa611596565b3480156105f457600080fd5b506105fd6115a5565b60405161047d9190615ce1565b34801561061657600080fd5b5061062a610625366004614fd6565b6115ae565b60405161047d9190615bc3565b34801561064357600080fd5b506104a6610652366004614ed4565b61164b565b34801561066357600080fd5b50610434610672366004614fa6565b611699565b34801561068357600080fd5b506105516116aa565b34801561069857600080fd5b506104346106a7366004614e0b565b611746565b3480156106b857600080fd5b506104346106c7366004614e0b565b6117f8565b3480156106d857600080fd5b506105516118aa565b3480156106ed57600080fd5b506104346106fc366004614ffa565b6118b8565b34801561070d57600080fd5b5061072161071c366004614e0b565b611971565b60405161047d9190615bd1565b34801561073a57600080fd5b506104fa6119f0565b34801561074f57600080fd5b5061043461075e366004614e0b565b6119ff565b34801561076f57600080fd5b506104a661077e366004614fa6565b611ab6565b34801561078f57600080fd5b50610551611ae7565b3480156107a457600080fd5b506105516107b3366004614e0b565b611aee565b3480156107c457600080fd5b50610434611b09565b3480156107d957600080fd5b50610434611ba0565b3480156107ee57600080fd5b506104346107fd366004614ed4565b611bb2565b34801561080e57600080fd5b5061043461081d366004614e0b565b611c07565b34801561082e57600080fd5b50610551611cb9565b34801561084357600080fd5b50610434610852366004614f4e565b611cc1565b34801561086357600080fd5b50610551611d15565b34801561087857600080fd5b50610434610887366004614e0b565b611d74565b34801561089857600080fd5b506108ac6108a7366004614fa6565b611df7565b60405161047d929190615c7d565b3480156108c657600080fd5b506104fa611e38565b3480156108db57600080fd5b50610470611e47565b3480156108f057600080fd5b506109046108ff366004614f6a565b611ec6565b60405161047d929190615ca7565b34801561091e57600080fd5b50610551611f04565b34801561093357600080fd5b50610434610942366004614fa6565b611f76565b34801561095357600080fd5b50610551611ff7565b34801561096857600080fd5b506104a6610977366004614ed4565b611ffd565b34801561098857600080fd5b506104a6610997366004614ed4565b612065565b3480156109a857600080fd5b506104fa612079565b3480156109bd57600080fd5b506104fa612088565b3480156109d257600080fd5b50610551612097565b3480156109e757600080fd5b506105516109f6366004614e0b565b61209f565b348015610a0757600080fd5b506104346120c0565b348015610a1c57600080fd5b506105516121b7565b348015610a3157600080fd5b50610434610a40366004614f33565b612230565b348015610a5157600080fd5b50610551610a60366004614e27565b6126ff565b348015610a7157600080fd5b506104a6610a80366004614fa6565b61272a565b348015610a9157600080fd5b50610434610aa0366004614e0b565b61275a565b348015610ab157600080fd5b50610aba61280c565b60405161047d91906151f4565b348015610ad357600080fd5b50610ae7610ae2366004614f4e565b6128b7565b60405161047d929190615cca565b348015610b0157600080fd5b50610434610b10366004614fa6565b6128db565b348015610b2157600080fd5b50610551610b30366004614e0b565b612a7d565b348015610b4157600080fd5b50610434610b50366004614e0b565b612a9b565b348015610b6157600080fd5b50610434610b70366004614e0b565b612b73565b610434612c41565b348015610b8957600080fd5b50610434610b98366004614fa6565b612c8e565b348015610ba957600080fd5b50610551612d93565b348015610bbe57600080fd5b50610551612dbc565b335b90565b600b546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610c05573d6000803e3d6000fd5b506000670de0b6b3a7640000610ca3600a60009054906101000a90046001600160a01b03166001600160a01b031663bebf110a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9c9190614fbe565b3490612dc2565b81610caa57fe5b049050610cb681612fd0565b50565b610cc1610bc7565b6000546001600160a01b03908116911614610cf75760405162461bcd60e51b8152600401610cee9061581a565b60405180910390fd5b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda610d20610bc7565b600036604051610d329392919061517c565b60405180910390a16001600160a01b038316301415610d635760405162461bcd60e51b8152600401610cee906156e1565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a9059cbb90610daa90859085906004016151db565b602060405180830381600087803b158015610dc457600080fd5b505af1158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc9190614eff565b50505050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610eac5780601f10610e8157610100808354040283529160200191610eac565b820191906000526020600020905b815481529060010190602001808311610e8f57829003601f168201915b5050505050905090565b6000610eca610ec3610bc7565b848461326b565b5060015b92915050565b610edc614cd9565b610ee4614cf9565b610eec614d27565b6000610ef6614d54565b6001600160a01b0386166000908152600f60209081526040808320815160608101835290546001600160801b038116825270010000000000000000000000000000000081046effffffffffffffffffffffffffffff1693820193909352600160f81b90920460ff1690820152955060015b60168111611038576000818152600e602090815260408083206001600160a01b038c168452825291829020825160608101845281546effffffffffffffffffffffffffffff811682526f0100000000000000000000000000000081046001600160801b03169382019390935292909190830190600160f81b900460ff166001811115610fef57fe5b6001811115610ffa57fe5b905250867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83016016811061102b57fe5b6020020152600101610f67565b5060005b60068110156110dd576012600082600581111561105557fe5b600581111561106057fe5b600581111561106b57fe5b8152602080820192909252604090810160009081206001600160a01b038c16825283528190208151808301909252546001600160801b03808216835270010000000000000000000000000000000090910416918101919091528582600681106110d057fe5b602002015260010161103c565b506001600160a01b0387166000908152600f602052604081205470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16151593505b6004811015611197576001600160a01b03881660009081526013602052604081209082600381111561114f57fe5b600381111561115a57fe5b600381111561116557fe5b815260208101919091526040016000205460ff1683826004811061118557fe5b91151560209092020152600101611121565b506111a187611aee565b905091939550919395565b6009546001600160a01b031681565b601360209081526000928352604080842090915290825290205460ff1681565b60065461010090046001600160a01b031681565b620f424081565b60035490565b611204610bc7565b6000546001600160a01b039081169116146112315760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda61125a610bc7565b60003660405161126c9392919061517c565b60405180910390a161127e828261331f565b5050565b600061128f848484613398565b6112ff8461129b610bc7565b6112fa85604051806060016040528060288152602001615d5a602891396001600160a01b038a166000908152600260205260408120906112d9610bc7565b6001600160a01b031681526020810191909152604001600020549190612fa4565b61326b565b5060019392505050565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611332610bc7565b6000366040516113449392919061517c565b60405180910390a1611354611ba0565b61135c614d72565b6012600085600581111561136c57fe5b600581111561137757fe5b8152602001908152602001600020600061138f610bc7565b6001600160a01b0316815260208082019290925260409081016000208151808301909252546001600160801b038082168352700100000000000000000000000000000000909104169181018290529150156113fc5760405162461bcd60e51b8152600401610cee90615a0b565b80516001600160801b03168211156114265760405162461bcd60e51b8152600401610cee90615718565b80516114449061143f906001600160801b031684612e7b565b612e03565b6012600086600581111561145457fe5b600581111561145f57fe5b81526020019081526020016000206000611477610bc7565b6001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160801b0302191690836001600160801b0316021790555061151661143f83601260008860058111156114d557fe5b60058111156114e057fe5b8152602080820192909252604090810160009081206001600160a01b038a1682529092529020546001600160801b031690612e56565b6012600086600581111561152657fe5b600581111561153157fe5b8152602080820192909252604090810160009081206001600160a01b039790971681529590915290932080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0390941693909317909255505050565b6008546001600160a01b031681565b60065460ff1690565b6115b6614d89565b6000838152600e602090815260408083206001600160a01b0386168452825291829020825160608101845281546effffffffffffffffffffffffffffff811682526f0100000000000000000000000000000081046001600160801b03169382019390935292909190830190600160f81b900460ff16600181111561163657fe5b600181111561164157fe5b9052509392505050565b6000610eca611658610bc7565b846112fa8560026000611669610bc7565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612e56565b610cb66116a4610bc7565b826134ad565b600954604080517fbebf110a00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163bebf110a91600480830192602092919082900301818787803b15801561170957600080fd5b505af115801561171d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117419190614fbe565b905090565b61174e610bc7565b6000546001600160a01b0390811691161461177b5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda6117a4610bc7565b6000366040516117b69392919061517c565b60405180910390a1600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b611800610bc7565b6000546001600160a01b0390811691161461182d5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611856610bc7565b6000366040516118689392919061517c565b60405180910390a1600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b692855b982aee678b0000081565b6118c0610bc7565b6000546001600160a01b039081169116146118ed5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611916610bc7565b6000366040516119289392919061517c565b60405180910390a1600061193a6116aa565b905080831115801561194c5750818111155b6119685760405162461bcd60e51b8152600401610cee90615b8c565b610dfc8461358f565b611979614cd9565b506001600160a01b0381166000908152600f6020908152604091829020825160608101845290546001600160801b038116825270010000000000000000000000000000000081046effffffffffffffffffffffffffffff1692820192909252600160f81b90910460ff16918101919091525b919050565b600b546001600160a01b031681565b611a07610bc7565b6000546001600160a01b03908116911614611a345760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611a5d610bc7565b600036604051611a6f9392919061517c565b60405180910390a1600680546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6000610ece611ae2610e10611adc635f71d040611ad66201518088612dc2565b90612e56565b90612e7b565b613968565b6202e80c81565b6001600160a01b031660009081526001602052604090205490565b611b11610bc7565b6000546001600160a01b03908116911614611b3e5760405162461bcd60e51b8152600401610cee9061581a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b611bb0611bab610bc7565b61396d565b565b6000611be482604051806060016040528060248152602001615d8260249139611bdd86610a60610bc7565b9190612fa4565b9050611bf883611bf2610bc7565b8361326b565b611c0283836134ad565b505050565b611c0f610bc7565b6000546001600160a01b03908116911614611c3c5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611c65610bc7565b600036604051611c779392919061517c565b60405180910390a1600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b635f71d04081565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611cea610bc7565b600036604051611cfc9392919061517c565b60405180910390a1610cb681611d10610bc7565b613b6b565b6000611d24635f71d040613968565b611d405760405162461bcd60e51b8152600401610cee90615605565b611d4d635f8ed140613968565b15611d5a57506017610bc9565b61174162015180611d6e635f71d040613d5c565b90612ee0565b611d7c610bc7565b6000546001600160a01b03908116911614611da95760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611dd2610bc7565b600036604051611de49392919061517c565b60405180910390a1610cb681600061331f565b6014602052600090815260409020546effffffffffffffffffffffffffffff8116906f0100000000000000000000000000000090046001600160801b031682565b6000546001600160a01b031690565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610eac5780601f10610e8157610100808354040283529160200191610eac565b60126020908152600092835260408084209091529082529020546001600160801b038082169170010000000000000000000000000000000090041682565b600954604080517f7eeda70300000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691637eeda703916004808301926020929190829003018186803b158015611f6257600080fd5b505afa15801561171d573d6000803e3d6000fd5b611f7e610bc7565b6000546001600160a01b03908116911614611fab5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611fd4610bc7565b600036604051611fe69392919061517c565b60405180910390a1610cb68161358f565b600c5481565b6000610eca61200a610bc7565b846112fa85604051806060016040528060258152602001615da66025913960026000612034610bc7565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612fa4565b6000610eca612072610bc7565b8484613398565b6007546001600160a01b031681565b600a546001600160a01b031681565b635f8ed14081565b6001600160a01b031660009081526010602052604090205463ffffffff1690565b6120c8610bc7565b6000546001600160a01b039081169116146120f55760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda61211e610bc7565b6000366040516121309392919061517c565b60405180910390a1612145635f8ed140613968565b6121615760405162461bcd60e51b8152600401610cee90615b55565b600d54156121815760405162461bcd60e51b8152600401610cee9061535c565b612189613d68565b6121a55760405162461bcd60e51b8152600401610cee90615325565b6121b2635f8ed140613d5c565b600d55565b60006121c6635f71d040613968565b6121e25760405162461bcd60e51b8152600401610cee90615605565b6121fa6121f5635f8ed140610e10612e7b565b613db5565b6122165760405162461bcd60e51b8152600401610cee90615560565b61174162015180611d6e610e10611ad6635f71d040613d5c565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda612259610bc7565b60003660405161226b9392919061517c565b60405180910390a1600061227d611d15565b9050600a811161229f5760405162461bcd60e51b8152600401610cee906157e3565b6122a7611ba0565b6122af614d72565b600080805260126020527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b906122e3610bc7565b6001600160a01b0316815260208082019290925260409081016000208151808301909252546001600160801b03808216808452700100000000000000000000000000000000909204169282019290925291506123515760405162461bcd60e51b8152600401610cee90615b1e565b600080808086600381111561236257fe5b1415612378575060079150600a905060566123cc565b600186600381111561238657fe5b141561239c5750600a9150600f905060506123cc565b60028660038111156123aa57fe5b14156123c05750600f91506014905060466123cc565b5060149150601e9050603c5b61242d601360006123db610bc7565b6001600160a01b03166001600160a01b03168152602001908152602001600020600088600381111561240957fe5b600381111561241457fe5b815260208101919091526040016000205460ff16613dc3565b6124495760405162461bcd60e51b8152600401610cee90615401565b600160136000612457610bc7565b6001600160a01b03166001600160a01b03168152602001908152602001600020600088600381111561248557fe5b600381111561249057fe5b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600c546124da9084612dc2565b6124e26116aa565b10156125005760405162461bcd60e51b8152600401610cee9061563c565b60208401518451600091612520916001600160801b039081169116612e7b565b9050600060646125308386612dc2565b8161253757fe5b049050600060646125488386612dc2565b8161254f57fe5b049050600061255e8383612e7b565b905061258361143f848a602001516001600160801b0316612e5690919063ffffffff16565b600080805260126020527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b906125b7610bc7565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316700100000000000000000000000000000000029216919091179055601689116126d7576000898152600e6020526040812061265c9161143f918591612620610bc7565b6001600160a01b031681526020810191909152604001600020546f0100000000000000000000000000000090046001600160801b031690612e56565b60008a8152600e6020526040812090612673610bc7565b6001600160a01b03168152602081019190915260400160002080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b6126e130826134ad565b6126f3306126ed610bc7565b84613398565b50505050505050505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000908152601460205260409020546f0100000000000000000000000000000090046001600160801b0316151590565b612762610bc7565b6000546001600160a01b0390811691161461278f5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda6127b8610bc7565b6000366040516127ca9392919061517c565b60405180910390a1600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b612814614da7565b61281c614da7565b60015b601681116128b1576000818152601460209081526040918290208251808401909352546effffffffffffffffffffffffffffff811683526f0100000000000000000000000000000090046001600160801b031690820152827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301601681106128a457fe5b602002015260010161281f565b50905090565b60116020526000908152604090205463ffffffff8082169164010000000090041682565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda612904610bc7565b6000366040516129169392919061517c565b60405180910390a16007546001600160a01b03166323b872dd612937610bc7565b600b546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261297f92916001600160a01b0316908690600401615158565b602060405180830381600087803b15801561299957600080fd5b505af11580156129ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d19190614eff565b506000620f4240612a6a600860009054906101000a90046001600160a01b03166001600160a01b031663bebf110a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612a2b57600080fd5b505af1158015612a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a639190614fbe565b8490612dc2565b81612a7157fe5b04905061127e81612fd0565b6000612a8882613dc7565b604001516001600160801b031692915050565b612aa3610bc7565b6000546001600160a01b03908116911614612ad05760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda612af9610bc7565b600036604051612b0b9392919061517c565b60405180910390a16001600160a01b038116612b395760405162461bcd60e51b8152600401610cee90615a79565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b612b7b610bc7565b6000546001600160a01b03908116911614612ba85760405162461bcd60e51b8152600401610cee9061581a565b6001600160a01b038116612bce5760405162461bcd60e51b8152600401610cee90615438565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7f5c2145746a96e247ab56dae7070701d6a6d52685eb027789d7a768552d262f63612c6a610bc7565b34600036604051612c7e94939291906151a8565b60405180910390a1611bb0610bcc565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda612cb7610bc7565b600036604051612cc99392919061517c565b60405180910390a160065461010090046001600160a01b03166323b872dd612cef610bc7565b600b546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152612d3792916001600160a01b0316908690600401615158565b602060405180830381600087803b158015612d5157600080fd5b505af1158015612d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d899190614eff565b50610cb681612fd0565b600d5460009080612da8576000915050610bc9565b612db6635f8ed14082612e56565b91505090565b600d5481565b600082612dd157506000610ece565b82820282848281612dde57fe5b0414612dfc5760405162461bcd60e51b8152600401610cee9061574f565b9392505050565b60006001600160801b03821115612e2c5760405162461bcd60e51b8152600401610cee90615393565b5090565b600063ffffffff821115612e2c5760405162461bcd60e51b8152600401610cee906157ac565b600082820183811015612dfc5760405162461bcd60e51b8152600401610cee906154f2565b6000612dfc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612fa4565b600060ff821115612e2c5760405162461bcd60e51b8152600401610cee90615529565b600080612eed8484612f20565b1115612f0f57612f086001838581612f0157fe5b0490612e56565b9050610ece565b818381612f1857fe5b049392505050565b6000612dfc83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250614007565b6000612dfc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061403b565b60008184841115612fc85760405162461bcd60e51b8152600401610cee9190615257565b505050900390565b6000612fda6121b7565b6000818152600e602052604081209192509061302c90849083612ffb610bc7565b6001600160a01b031681526020810191909152604001600020546effffffffffffffffffffffffffffff1690612e56565b90506000600f600061303c610bc7565b6001600160a01b0316815260208101919091526040016000205470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060018314156130c657600081116130a65760405162461bcd60e51b8152600401610cee90615597565b808211156130c65760405162461bcd60e51b8152600401610cee90615886565b620f42408410156130e95760405162461bcd60e51b8152600401610cee90615673565b6130f282614072565b6000848152600e6020526040812090613109610bc7565b6001600160a01b031681526020808201929092526040908101600090812080547fffffffffffffffffffffffffffffffffff000000000000000000000000000000166effffffffffffffffffffffffffffff95861617905586815260149092529020546131809161317b911686612e56565b614072565b600084815260146020526040812080547fffffffffffffffffffffffffffffffffff000000000000000000000000000000166effffffffffffffffffffffffffffff9390931692909217909155600f906131d8610bc7565b6001600160a01b03168152602081019190915260400160002054600160f81b900460ff16610dfc5761320983612ebd565b600f6000613215610bc7565b6001600160a01b031681526020810191909152604001600020805460ff92909216600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905550505050565b6001600160a01b0383166132915760405162461bcd60e51b8152600401610cee906159ae565b6001600160a01b0382166132b75760405162461bcd60e51b8152600401610cee90615495565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613312908590615cc1565b60405180910390a3505050565b61332881614072565b6001600160a01b039092166000908152600f6020526040902080546effffffffffffffffffffffffffffff93909316700100000000000000000000000000000000027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093169290921790915550565b6001600160a01b0383166133be5760405162461bcd60e51b8152600401610cee90615951565b6001600160a01b0382166133e45760405162461bcd60e51b8152600401610cee906152c8565b6133ef8383836140a3565b61342c81604051806060016040528060268152602001615d34602691396001600160a01b0386166000908152600160205260409020549190612fa4565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461345b9082612e56565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613312908590615cc1565b6001600160a01b0382166134d35760405162461bcd60e51b8152600401610cee906158f4565b6134df826000836140a3565b61351c81604051806060016040528060228152602001615d12602291396001600160a01b0385166000908152600160205260409020549190612fa4565b6001600160a01b0383166000908152600160205260409020556003546135429082612e7b565b6003556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613583908590615cc1565b60405180910390a35050565b61359881611ab6565b6135b45760405162461bcd60e51b8152600401610cee9061584f565b6135bc614d72565b506000818152601460209081526040918290208251808401909352546effffffffffffffffffffffffffffff811683526f0100000000000000000000000000000090046001600160801b03169082018190521561362b5760405162461bcd60e51b8152600401610cee90615ab0565b60008211801561363b5750601782105b6136575760405162461bcd60e51b8152600401610cee906158bd565b81600114156137035780516136849061143f906effffffffffffffffffffffffffffff16620f4240612ee0565b6001600160801b0316602082018190526136a057600160208201525b60209081015160008381526014909252604090912080546001600160801b039092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff909216919091179055610cb6565b613711610a80836001612e7b565b61372d5760405162461bcd60e51b8152600401610cee906156aa565b60006137376116aa565b82519091506000908290613764906effffffffffffffffffffffffffffff16670de0b6b3a7640000612dc2565b8161376b57fe5b049050692855b982aee678b00000811015613887576137c361143f613794600a6202e80c612dc2565b8551611d6e906effffffffffffffffffffffffffffff16611ad6876137bd60096202e80c612dc2565b90612dc2565b6001600160801b0316602084018190528351600091906137fc906effffffffffffffffffffffffffffff16670de0b6b3a7640000612dc2565b8161380357fe5b60208087015160008981526014909252604090912080546001600160801b039092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790550490506138813061387c692855b982aee678b0000084612e7b565b6134ad565b50613904565b82516138ab9061143f906effffffffffffffffffffffffffffff166202e80c612ee0565b600085815260146020526040902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b83600a1415610dfc57600060025b600a811161395a576000818152601460205260409020546139509083906f0100000000000000000000000000000090046001600160801b0316612e56565b9150600101613912565b5060099004600c5550505050565b421190565b60016001600160a01b03821660009081527f63dac8ac72609a2437a2da33ae5c3341a805b2815f084aeb7a66b5dcf5c8eb596020526040902054600160f81b900460ff1660018111156139bc57fe5b14156139c757610cb6565b6001600160a01b0381166000908152600f6020526040902054600160f81b900460ff166139f357610cb6565b613a00635f71d040613db5565b15613a0a57610cb6565b6000613a14611d15565b6001600160a01b0383166000908152600f6020526040902054909150600160f81b900460ff165b81811015611c025760016000828152600e602090815260408083206001600160a01b0388168452909152902054600160f81b900460ff166001811115613a7d57fe5b1415613a8857613b63565b613a90614d72565b506000818152601460209081526040918290208251808401909352546effffffffffffffffffffffffffffff811683526f0100000000000000000000000000000090046001600160801b0316908201819052613afe5760405162461bcd60e51b8152600401610cee90615ae7565b6000828152600e602090815260408083206001600160a01b0388168452909152902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b179055613b5682858361455d565b613b618285836147d4565b505b600101613a3b565b613b73614d72565b60116000846005811115613b8357fe5b6005811115613b8e57fe5b8152602080820192909252604090810160002081518083019092525463ffffffff80821680845264010000000090920416928201929092529150613bd190613968565b613bed5760405162461bcd60e51b8152600401610cee90615a42565b613bf5614d72565b60126000856005811115613c0557fe5b6005811115613c1057fe5b8152602080820192909252604090810160009081206001600160a01b038716825283528181208251808401909352546001600160801b038082168085527001000000000000000000000000000000009092041683850181905293860151865193955090939263ffffffff91821691613c9391613c8c9116613d5c565b8590612dc2565b81613c9a57fe5b04905082811115613ca85750815b818111613cc75760405162461bcd60e51b8152600401610cee906155ce565b6000613cd38284612e7b565b9050613cde82612e03565b601260008a6005811115613cee57fe5b6005811115613cf957fe5b8152602080820192909252604090810160009081206001600160a01b038c168252909252902080546001600160801b03928316700100000000000000000000000000000000029216919091179055613d52308883613398565b5050505050505050565b6000610ece4283612e7b565b601660005260146020527f61dccb1ed53f90936bb85f76ea5b84a7d698d504a213db86a4df73c05a00c8d9546f0100000000000000000000000000000090046001600160801b0316151590565b6000610ece613dc383613968565b1590565b613dcf614dd5565b613dd7614dd5565b506001600160a01b0382166000908152601060209081526040918290208251608081018452815463ffffffff808216835264010000000082041693820193909352680100000000000000009092046001600160801b0316928201929092526001909101546060820152613e4983614b93565b613e545790506119eb565b602081015163ffffffff166000613e6a85611aee565b90506000613e76612d93565b905080156000613e9d613e92613e8b87613d5c565b8690612dc2565b606088015190612e56565b90508115613eff57606086018190528551613ecf90613ec19063ffffffff16613d5c565b8281613ec957fe5b04612e03565b6001600160801b03166040870152613ee642612e30565b63ffffffff166020870152509394506119eb9350505050565b6000613f2284611ad662278d006137bd62278d00613f1c8a613d5c565b90612f62565b9050808610613f375760608701829052613fe6565b6000613f438288612e7b565b90506000613f5f613f548884612dc2565b60608b015190612e56565b905085831415613f9c57613f89613ec18a6000015163ffffffff1685612e7b90919063ffffffff16565b6001600160801b031660408a0152613fcb565b62278d008211613fb357613f8962278d0082613ec9565b613fbc87612e03565b6001600160801b031660408a01525b613fde613fd784613d5c565b8890612dc2565b60608a015250505b613fef42612e30565b63ffffffff1660208801525094979650505050505050565b600081836140285760405162461bcd60e51b8152600401610cee9190615257565b5082848161403257fe5b06949350505050565b6000818361405c5760405162461bcd60e51b8152600401610cee9190615257565b50600083858161406857fe5b0495945050505050565b60006effffffffffffffffffffffffffffff821115612e2c5760405162461bcd60e51b8152600401610cee906153ca565b6140ac83614b93565b156140ba576140ba8361396d565b6140c7635f8ed140613db5565b156143655760016140db635f71d040613968565b156140eb576140e8611d15565b90505b6140f484614b93565b156141b3576000818152600e602090815260408083206001600160a01b03881684529091529020546141469061143f906f0100000000000000000000000000000090046001600160801b031684612e7b565b6000828152600e602090815260408083206001600160a01b0389168452909152902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b6141bc83614b93565b15614363576141c9614cd9565b506001600160a01b0383166000908152600f6020908152604091829020825160608101845290546001600160801b038116825270010000000000000000000000000000000081046effffffffffffffffffffffffffffff1692820192909252600160f81b90910460ff16918101829052906142975761424782612ebd565b6001600160a01b0385166000908152600f60205260409020805460ff92909216600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555b6001600160a01b0385163014614361576000828152600e602090815260408083206001600160a01b03881684529091529020546142f49061143f906f0100000000000000000000000000000090046001600160801b031685612e56565b6000838152600e602090815260408083206001600160a01b0389168452909152902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b505b505b600d5461454b5761437583614b93565b156143f9576001600160a01b0383166000908152600f60205260409020546143aa9061143f906001600160801b031683612e7b565b6001600160a01b0384166000908152600f6020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b03929092169190911790555b61440282614b93565b1561454b576001600160a01b0382166000908152600f60205260409020546144379061143f906001600160801b031683612e56565b6001600160a01b0383166000908152600f6020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b03959095169490941790935560109052205463ffffffff1661454b576144a242612e30565b6001600160a01b038316600090815260106020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790556144f642612e30565b6001600160a01b0383166000908152601060205260409020805463ffffffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9092169190911790555b61455483614bc8565b611c0282614bc8565b614565614d89565b6000848152600e602090815260408083206001600160a01b0387168452825291829020825160608101845281546effffffffffffffffffffffffffffff811682526f0100000000000000000000000000000081046001600160801b03169382019390935292909190830190600160f81b900460ff1660018111156145e557fe5b60018111156145f057fe5b815250509050600082602001516001600160801b0316614636670de0b6b3a764000084600001516effffffffffffffffffffffffffffff16612dc290919063ffffffff16565b8161463d57fe5b04905060006146628284602001516001600160801b0316612e5690919063ffffffff16565b905061466d81612e03565b6000878152600e602090815260408083206001600160a01b038a168452909152902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff90921691909117905560168610156147c15761474161143f82600e60006146f88b6001612e56565b8152602080820192909252604090810160009081206001600160a01b038c1682529092529020546f0100000000000000000000000000000090046001600160801b031690612e56565b600e6000614750896001612e56565b8152602080820192909252604090810160009081206001600160a01b038a168252909252902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b6147cc308684613398565b505050505050565b60158311156147e257611c02565b6147ea614d89565b6000848152600e602090815260408083206001600160a01b0387168452825291829020825160608101845281546effffffffffffffffffffffffffffff811682526f0100000000000000000000000000000081046001600160801b03169382019390935292909190830190600160f81b900460ff16600181111561486a57fe5b600181111561487557fe5b9052509050600060018514156148b05760208201516064906148a1906001600160801b03166005612dc2565b816148a857fe5b049050614a1a565b60016000600e816148c18985612e7b565b8152602080820192909252604090810160009081206001600160a01b038a1682529092529020546f0100000000000000000000000000000090046001600160801b031690508015801590614935575060208401516001600160801b0316606461492b836065612dc2565b8161493257fe5b04105b1561493f57600291505b6020808601518651868301516001600160a01b038a1660009081527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582079094526040909320546001600160801b03928316936effffffffffffffffffffffffffffff90921692918216916002916006916f0100000000000000000000000000000090910416156149d0575060059050600f5b6149e26202e80c6137bd606488612dc2565b614a08886137bd86816149f5878b612dc2565b611adc6202e80c6137bd8e818d8d612e56565b81614a0f57fe5b049750505050505050505b3060009081527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b60205260409020546001600160801b031681811015614a5e578091505b6001600160a01b03851660009081527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b6020526040902054614aad9061143f906001600160801b031684612e56565b6001600160a01b03861660009081527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b6020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216919091179055614b2761143f8284612e7b565b3060009081527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b6020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216919091179055505050505050565b60006001600160a01b038216301480614bb357506001600160a01b038216155b15614bc0575060006119eb565b506001919050565b6001600160a01b03811660009081526010602052604090205463ffffffff64010000000090910416421415614bfc57610cb6565b614c0581613dc7565b6001600160a01b03919091166000908152601060209081526040918290208351815492850151938501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090931663ffffffff918216177fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff166401000000009190941602929092177fffffffffffffffff00000000000000000000000000000000ffffffffffffffff16680100000000000000006001600160801b0390921691909102178155606090910151600190910155565b604080516060810182526000808252602082018190529181019190915290565b604051806102c001604052806016905b614d11614d89565b815260200190600190039081614d095790505090565b6040518060c001604052806006905b614d3e614d72565b815260200190600190039081614d365790505090565b60405180608001604052806004906020820280368337509192915050565b604080518082019091526000808252602082015290565b60408051606081018252600080825260208201819052909182015290565b604051806102c001604052806016905b614dbf614d72565b815260200190600190039081614db75790505090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b803560048110610ece57600080fd5b600060208284031215614e1c578081fd5b8135612dfc81615cef565b60008060408385031215614e39578081fd5b8235614e4481615cef565b91506020830135614e5481615cef565b809150509250929050565b600080600060608486031215614e73578081fd5b8335614e7e81615cef565b92506020840135614e8e81615cef565b929592945050506040919091013590565b60008060408385031215614eb1578182fd5b8235614ebc81615cef565b9150614ecb8460208501614dfc565b90509250929050565b60008060408385031215614ee6578182fd5b8235614ef181615cef565b946020939093013593505050565b600060208284031215614f10578081fd5b81518015158114612dfc578182fd5b600080600060608486031215614e73578283fd5b600060208284031215614f44578081fd5b612dfc8383614dfc565b600060208284031215614f5f578081fd5b8135612dfc81615d04565b60008060408385031215614f7c578182fd5b8235614e4481615d04565b600080600060608486031215614f9b578283fd5b8335614e7e81615d04565b600060208284031215614fb7578081fd5b5035919050565b600060208284031215614fcf578081fd5b5051919050565b60008060408385031215614fe8578182fd5b823591506020830135614e5481615cef565b60008060006060848603121561500e578081fd5b505081359360208301359350604090920135919050565b600061503183836150cc565b505060600190565b80516001600160801b039081168352602091820151169082015260400190565b8060005b6004811015610dfc578151151584526020938401939091019060010161505d565b15159052565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b6effffffffffffffffffffffffffffff81511682526001600160801b03602082015116602083015260408101516002811061510357fe5b806040840152505050565b80516001600160801b031682526020808201516effffffffffffffffffffffffffffff169083015260409081015160ff16910152565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b03851682526040602083015261519f604083018486615084565b95945050505050565b60006001600160a01b0386168252846020830152606060408301526151d1606083018486615084565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6105808101818360005b601681101561524357815180516effffffffffffffffffffffffffffff1684526020908101516001600160801b031681850152604090930192909101906001016151fe565b50505092915050565b901515815260200190565b6000602080835283518082850152825b8181101561528357858101830151858201604001528201615267565b818111156152945783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f546f6b656e73616c65206973206e6f742070726f636573736564000000000000604082015260600190565b60208082526018908201527f50726f6475637420616c7265616479206c61756e636865640000000000000000604082015260600190565b60208082526010908201527f75696e74313238206f766572666c6f7700000000000000000000000000000000604082015260600190565b60208082526010908201527f75696e74313230206f766572666c6f7700000000000000000000000000000000604082015260600190565b60208082526016908201527f416c726561647920666f7263652072656c656173656400000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600e908201527f75696e7438206f766572666c6f77000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f4465706f7369747320656e646564000000000000000000000000000000000000604082015260600190565b6020808252600f908201527f4e6f742077686974656c69737465640000000000000000000000000000000000604082015260600190565b60208082526015908201527f496e73756666696369656e7420756e6c6f636b65640000000000000000000000604082015260600190565b60208082526019908201527f546f6b656e73616c65206e6f7420737461727465642079657400000000000000604082015260600190565b6020808252601a908201527f43757272656e7420707269636520697320746f6f20736d616c6c000000000000604082015260600190565b6020808252601f908201527f4c657373207468616e206d696e696d756d20616d6f756e742031207573646300604082015260600190565b6020808252601b908201527f50726576696f757320726f756e64206e6f742070726570617265640000000000604082015260600190565b60208082526014908201527f43616e6e6f742077697468647261772074686973000000000000000000000000604082015260600190565b60208082526019908201527f496e73756666697369656e74206c6f636b65642066756e647300000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600f908201527f75696e743332206f766572666c6f770000000000000000000000000000000000604082015260600190565b60208082526013908201527f4f6e6c7920616674657220313020726f756e6400000000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f4465706f73697420726f756e64206e6f7420656e646564000000000000000000604082015260600190565b60208082526018908201527f4465706f736974206c696d697420697320726561636865640000000000000000604082015260600190565b60208082526012908201527f526f756e64206973206e6f742076616c69640000000000000000000000000000604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f43616e6e6f74207472616e736665722061667465722072656c65617365000000604082015260600190565b6020808252601c908201527f52656c656173696e6720686173206e6f20737461727465642079657400000000604082015260600190565b60208082526019908201527f4e6f74207a65726f206164647265737320726571756972656400000000000000604082015260600190565b60208082526016908201527f526f756e6420616c726561647920707265706172656400000000000000000000604082015260600190565b60208082526015908201527f526f756e64206973206e6f742070726570617265640000000000000000000000604082015260600190565b60208082526017908201527f4e6f7468696e6720746f20666f72636520756e6c6f636b000000000000000000604082015260600190565b6020808252601a908201527f546f6b656e73616c65206973206e6f7420656e64656420796574000000000000604082015260600190565b60208082526015908201527f5072696365206973206f7574206f662072616e67650000000000000000000000604082015260600190565b60608101610ece82846150cc565b60608101610ece828461510e565b610ae08101615bee828961510e565b606082018760005b6016811015615c1b57615c0a838351615025565b925060209190910190600101615bf6565b5050506108a082018660005b6006811015615c4c57615c3b838351615039565b925060209190910190600101615c27565b505050615c5d610a2083018661507e565b615c6b610a40830185615059565b82610ac0830152979650505050505050565b6effffffffffffffffffffffffffffff9290921682526001600160801b0316602082015260400190565b6001600160801b0392831681529116602082015260400190565b90815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b6001600160a01b0381168114610cb657600080fd5b60068110610cb657600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122095202c00692f46c7242f867d579a62502759b59647effcb74c4ded33c67ce3f164736f6c63430007000033
Deployed Bytecode
0x6080604052600436106103e25760003560e01c80637abd66d81161020d578063c89e211d11610128578063e642d3da116100bb578063f2fde38b1161008a578063f688bcfb1161006f578063f688bcfb14610b7d578063f8eeed6214610b9d578063ff8fef9d14610bb257610436565b8063f2fde38b14610b55578063f6326fb314610b7557610436565b8063e642d3da14610ac7578063e7c80f1714610af5578063eb19345714610b15578063f0f4426014610b3557610436565b8063dd62ed3e116100f7578063dd62ed3e14610a45578063df65774914610a65578063dfce794214610a85578063e5066bbf14610aa557610436565b8063c89e211d146109db578063d4fd4f2b146109fb578063d55c476c14610a10578063dc110eee14610a2557610436565b80639d1b464a116101a0578063a9059cbb1161016f578063a9059cbb1461097c578063a98ad46c1461099c578063af7665ce146109b1578063b0a9f273146109c657610436565b80639d1b464a146109125780639e1379b614610927578063a0352ea314610947578063a457c2d71461095c57610436565b80638c65c81f116101dc5780638c65c81f1461088c5780638da5cb5b146108ba57806395d89b41146108cf578063987c56be146108e457610436565b80637abd66d814610822578063812a6dbd146108375780638a19c8bc146108575780638ab1d6811461086c57610436565b806342966c68116102fd578063653a908d11610290578063715018a61161025f578063715018a6146107b8578063792459d9146107cd57806379cc6790146107e25780637aa6636a1461080257610436565b8063653a908d146107435780636c4637f514610763578063709ef5e21461078357806370a082311461079857610436565b806354133307116102cc57806354133307146106cc5780635c32a441146106e15780635d0eaaaf1461070157806361d027b31461072e57610436565b806342966c6814610657578063466db44c146106775780634d1567e81461068c57806352173ba8146106ac57610436565b806318160ddd116103755780632601a2c3116103445780632601a2c3146105d3578063313ce567146105e857806334c3f6fa1461060a578063395093511461063757610436565b806318160ddd1461055e578063214405fc1461057357806323b872dd14610593578063245bde3e146105b357610436565b80630c2e4181116103b15780630c2e4181146104e557806310caf5a31461050757806311eac85514610527578063171fa7211461053c57610436565b8063042ee4261461043b57806306fdde031461045b578063095ea7b3146104865780630be913ae146104b357610436565b36610436577f5c2145746a96e247ab56dae7070701d6a6d52685eb027789d7a768552d262f63610410610bc7565b3460003660405161042494939291906151a8565b60405180910390a1610434610bcc565b005b600080fd5b34801561044757600080fd5b50610434610456366004614f1f565b610cb9565b34801561046757600080fd5b50610470610e02565b60405161047d9190615257565b60405180910390f35b34801561049257600080fd5b506104a66104a1366004614ed4565b610eb6565b60405161047d919061524c565b3480156104bf57600080fd5b506104d36104ce366004614e0b565b610ed4565b60405161047d96959493929190615bdf565b3480156104f157600080fd5b506104fa6111ac565b60405161047d9190615144565b34801561051357600080fd5b506104a6610522366004614e9f565b6111bb565b34801561053357600080fd5b506104fa6111db565b34801561054857600080fd5b506105516111ef565b60405161047d9190615cc1565b34801561056a57600080fd5b506105516111f6565b34801561057f57600080fd5b5061043461058e366004614ed4565b6111fc565b34801561059f57600080fd5b506104a66105ae366004614e5f565b611282565b3480156105bf57600080fd5b506104346105ce366004614f87565b611309565b3480156105df57600080fd5b506104fa611596565b3480156105f457600080fd5b506105fd6115a5565b60405161047d9190615ce1565b34801561061657600080fd5b5061062a610625366004614fd6565b6115ae565b60405161047d9190615bc3565b34801561064357600080fd5b506104a6610652366004614ed4565b61164b565b34801561066357600080fd5b50610434610672366004614fa6565b611699565b34801561068357600080fd5b506105516116aa565b34801561069857600080fd5b506104346106a7366004614e0b565b611746565b3480156106b857600080fd5b506104346106c7366004614e0b565b6117f8565b3480156106d857600080fd5b506105516118aa565b3480156106ed57600080fd5b506104346106fc366004614ffa565b6118b8565b34801561070d57600080fd5b5061072161071c366004614e0b565b611971565b60405161047d9190615bd1565b34801561073a57600080fd5b506104fa6119f0565b34801561074f57600080fd5b5061043461075e366004614e0b565b6119ff565b34801561076f57600080fd5b506104a661077e366004614fa6565b611ab6565b34801561078f57600080fd5b50610551611ae7565b3480156107a457600080fd5b506105516107b3366004614e0b565b611aee565b3480156107c457600080fd5b50610434611b09565b3480156107d957600080fd5b50610434611ba0565b3480156107ee57600080fd5b506104346107fd366004614ed4565b611bb2565b34801561080e57600080fd5b5061043461081d366004614e0b565b611c07565b34801561082e57600080fd5b50610551611cb9565b34801561084357600080fd5b50610434610852366004614f4e565b611cc1565b34801561086357600080fd5b50610551611d15565b34801561087857600080fd5b50610434610887366004614e0b565b611d74565b34801561089857600080fd5b506108ac6108a7366004614fa6565b611df7565b60405161047d929190615c7d565b3480156108c657600080fd5b506104fa611e38565b3480156108db57600080fd5b50610470611e47565b3480156108f057600080fd5b506109046108ff366004614f6a565b611ec6565b60405161047d929190615ca7565b34801561091e57600080fd5b50610551611f04565b34801561093357600080fd5b50610434610942366004614fa6565b611f76565b34801561095357600080fd5b50610551611ff7565b34801561096857600080fd5b506104a6610977366004614ed4565b611ffd565b34801561098857600080fd5b506104a6610997366004614ed4565b612065565b3480156109a857600080fd5b506104fa612079565b3480156109bd57600080fd5b506104fa612088565b3480156109d257600080fd5b50610551612097565b3480156109e757600080fd5b506105516109f6366004614e0b565b61209f565b348015610a0757600080fd5b506104346120c0565b348015610a1c57600080fd5b506105516121b7565b348015610a3157600080fd5b50610434610a40366004614f33565b612230565b348015610a5157600080fd5b50610551610a60366004614e27565b6126ff565b348015610a7157600080fd5b506104a6610a80366004614fa6565b61272a565b348015610a9157600080fd5b50610434610aa0366004614e0b565b61275a565b348015610ab157600080fd5b50610aba61280c565b60405161047d91906151f4565b348015610ad357600080fd5b50610ae7610ae2366004614f4e565b6128b7565b60405161047d929190615cca565b348015610b0157600080fd5b50610434610b10366004614fa6565b6128db565b348015610b2157600080fd5b50610551610b30366004614e0b565b612a7d565b348015610b4157600080fd5b50610434610b50366004614e0b565b612a9b565b348015610b6157600080fd5b50610434610b70366004614e0b565b612b73565b610434612c41565b348015610b8957600080fd5b50610434610b98366004614fa6565b612c8e565b348015610ba957600080fd5b50610551612d93565b348015610bbe57600080fd5b50610551612dbc565b335b90565b600b546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610c05573d6000803e3d6000fd5b506000670de0b6b3a7640000610ca3600a60009054906101000a90046001600160a01b03166001600160a01b031663bebf110a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9c9190614fbe565b3490612dc2565b81610caa57fe5b049050610cb681612fd0565b50565b610cc1610bc7565b6000546001600160a01b03908116911614610cf75760405162461bcd60e51b8152600401610cee9061581a565b60405180910390fd5b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda610d20610bc7565b600036604051610d329392919061517c565b60405180910390a16001600160a01b038316301415610d635760405162461bcd60e51b8152600401610cee906156e1565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a9059cbb90610daa90859085906004016151db565b602060405180830381600087803b158015610dc457600080fd5b505af1158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc9190614eff565b50505050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610eac5780601f10610e8157610100808354040283529160200191610eac565b820191906000526020600020905b815481529060010190602001808311610e8f57829003601f168201915b5050505050905090565b6000610eca610ec3610bc7565b848461326b565b5060015b92915050565b610edc614cd9565b610ee4614cf9565b610eec614d27565b6000610ef6614d54565b6001600160a01b0386166000908152600f60209081526040808320815160608101835290546001600160801b038116825270010000000000000000000000000000000081046effffffffffffffffffffffffffffff1693820193909352600160f81b90920460ff1690820152955060015b60168111611038576000818152600e602090815260408083206001600160a01b038c168452825291829020825160608101845281546effffffffffffffffffffffffffffff811682526f0100000000000000000000000000000081046001600160801b03169382019390935292909190830190600160f81b900460ff166001811115610fef57fe5b6001811115610ffa57fe5b905250867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83016016811061102b57fe5b6020020152600101610f67565b5060005b60068110156110dd576012600082600581111561105557fe5b600581111561106057fe5b600581111561106b57fe5b8152602080820192909252604090810160009081206001600160a01b038c16825283528190208151808301909252546001600160801b03808216835270010000000000000000000000000000000090910416918101919091528582600681106110d057fe5b602002015260010161103c565b506001600160a01b0387166000908152600f602052604081205470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16151593505b6004811015611197576001600160a01b03881660009081526013602052604081209082600381111561114f57fe5b600381111561115a57fe5b600381111561116557fe5b815260208101919091526040016000205460ff1683826004811061118557fe5b91151560209092020152600101611121565b506111a187611aee565b905091939550919395565b6009546001600160a01b031681565b601360209081526000928352604080842090915290825290205460ff1681565b60065461010090046001600160a01b031681565b620f424081565b60035490565b611204610bc7565b6000546001600160a01b039081169116146112315760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda61125a610bc7565b60003660405161126c9392919061517c565b60405180910390a161127e828261331f565b5050565b600061128f848484613398565b6112ff8461129b610bc7565b6112fa85604051806060016040528060288152602001615d5a602891396001600160a01b038a166000908152600260205260408120906112d9610bc7565b6001600160a01b031681526020810191909152604001600020549190612fa4565b61326b565b5060019392505050565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611332610bc7565b6000366040516113449392919061517c565b60405180910390a1611354611ba0565b61135c614d72565b6012600085600581111561136c57fe5b600581111561137757fe5b8152602001908152602001600020600061138f610bc7565b6001600160a01b0316815260208082019290925260409081016000208151808301909252546001600160801b038082168352700100000000000000000000000000000000909104169181018290529150156113fc5760405162461bcd60e51b8152600401610cee90615a0b565b80516001600160801b03168211156114265760405162461bcd60e51b8152600401610cee90615718565b80516114449061143f906001600160801b031684612e7b565b612e03565b6012600086600581111561145457fe5b600581111561145f57fe5b81526020019081526020016000206000611477610bc7565b6001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160801b0302191690836001600160801b0316021790555061151661143f83601260008860058111156114d557fe5b60058111156114e057fe5b8152602080820192909252604090810160009081206001600160a01b038a1682529092529020546001600160801b031690612e56565b6012600086600581111561152657fe5b600581111561153157fe5b8152602080820192909252604090810160009081206001600160a01b039790971681529590915290932080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0390941693909317909255505050565b6008546001600160a01b031681565b60065460ff1690565b6115b6614d89565b6000838152600e602090815260408083206001600160a01b0386168452825291829020825160608101845281546effffffffffffffffffffffffffffff811682526f0100000000000000000000000000000081046001600160801b03169382019390935292909190830190600160f81b900460ff16600181111561163657fe5b600181111561164157fe5b9052509392505050565b6000610eca611658610bc7565b846112fa8560026000611669610bc7565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612e56565b610cb66116a4610bc7565b826134ad565b600954604080517fbebf110a00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163bebf110a91600480830192602092919082900301818787803b15801561170957600080fd5b505af115801561171d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117419190614fbe565b905090565b61174e610bc7565b6000546001600160a01b0390811691161461177b5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda6117a4610bc7565b6000366040516117b69392919061517c565b60405180910390a1600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b611800610bc7565b6000546001600160a01b0390811691161461182d5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611856610bc7565b6000366040516118689392919061517c565b60405180910390a1600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b692855b982aee678b0000081565b6118c0610bc7565b6000546001600160a01b039081169116146118ed5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611916610bc7565b6000366040516119289392919061517c565b60405180910390a1600061193a6116aa565b905080831115801561194c5750818111155b6119685760405162461bcd60e51b8152600401610cee90615b8c565b610dfc8461358f565b611979614cd9565b506001600160a01b0381166000908152600f6020908152604091829020825160608101845290546001600160801b038116825270010000000000000000000000000000000081046effffffffffffffffffffffffffffff1692820192909252600160f81b90910460ff16918101919091525b919050565b600b546001600160a01b031681565b611a07610bc7565b6000546001600160a01b03908116911614611a345760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611a5d610bc7565b600036604051611a6f9392919061517c565b60405180910390a1600680546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6000610ece611ae2610e10611adc635f71d040611ad66201518088612dc2565b90612e56565b90612e7b565b613968565b6202e80c81565b6001600160a01b031660009081526001602052604090205490565b611b11610bc7565b6000546001600160a01b03908116911614611b3e5760405162461bcd60e51b8152600401610cee9061581a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b611bb0611bab610bc7565b61396d565b565b6000611be482604051806060016040528060248152602001615d8260249139611bdd86610a60610bc7565b9190612fa4565b9050611bf883611bf2610bc7565b8361326b565b611c0283836134ad565b505050565b611c0f610bc7565b6000546001600160a01b03908116911614611c3c5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611c65610bc7565b600036604051611c779392919061517c565b60405180910390a1600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b635f71d04081565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611cea610bc7565b600036604051611cfc9392919061517c565b60405180910390a1610cb681611d10610bc7565b613b6b565b6000611d24635f71d040613968565b611d405760405162461bcd60e51b8152600401610cee90615605565b611d4d635f8ed140613968565b15611d5a57506017610bc9565b61174162015180611d6e635f71d040613d5c565b90612ee0565b611d7c610bc7565b6000546001600160a01b03908116911614611da95760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611dd2610bc7565b600036604051611de49392919061517c565b60405180910390a1610cb681600061331f565b6014602052600090815260409020546effffffffffffffffffffffffffffff8116906f0100000000000000000000000000000090046001600160801b031682565b6000546001600160a01b031690565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610eac5780601f10610e8157610100808354040283529160200191610eac565b60126020908152600092835260408084209091529082529020546001600160801b038082169170010000000000000000000000000000000090041682565b600954604080517f7eeda70300000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691637eeda703916004808301926020929190829003018186803b158015611f6257600080fd5b505afa15801561171d573d6000803e3d6000fd5b611f7e610bc7565b6000546001600160a01b03908116911614611fab5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda611fd4610bc7565b600036604051611fe69392919061517c565b60405180910390a1610cb68161358f565b600c5481565b6000610eca61200a610bc7565b846112fa85604051806060016040528060258152602001615da66025913960026000612034610bc7565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612fa4565b6000610eca612072610bc7565b8484613398565b6007546001600160a01b031681565b600a546001600160a01b031681565b635f8ed14081565b6001600160a01b031660009081526010602052604090205463ffffffff1690565b6120c8610bc7565b6000546001600160a01b039081169116146120f55760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda61211e610bc7565b6000366040516121309392919061517c565b60405180910390a1612145635f8ed140613968565b6121615760405162461bcd60e51b8152600401610cee90615b55565b600d54156121815760405162461bcd60e51b8152600401610cee9061535c565b612189613d68565b6121a55760405162461bcd60e51b8152600401610cee90615325565b6121b2635f8ed140613d5c565b600d55565b60006121c6635f71d040613968565b6121e25760405162461bcd60e51b8152600401610cee90615605565b6121fa6121f5635f8ed140610e10612e7b565b613db5565b6122165760405162461bcd60e51b8152600401610cee90615560565b61174162015180611d6e610e10611ad6635f71d040613d5c565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda612259610bc7565b60003660405161226b9392919061517c565b60405180910390a1600061227d611d15565b9050600a811161229f5760405162461bcd60e51b8152600401610cee906157e3565b6122a7611ba0565b6122af614d72565b600080805260126020527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b906122e3610bc7565b6001600160a01b0316815260208082019290925260409081016000208151808301909252546001600160801b03808216808452700100000000000000000000000000000000909204169282019290925291506123515760405162461bcd60e51b8152600401610cee90615b1e565b600080808086600381111561236257fe5b1415612378575060079150600a905060566123cc565b600186600381111561238657fe5b141561239c5750600a9150600f905060506123cc565b60028660038111156123aa57fe5b14156123c05750600f91506014905060466123cc565b5060149150601e9050603c5b61242d601360006123db610bc7565b6001600160a01b03166001600160a01b03168152602001908152602001600020600088600381111561240957fe5b600381111561241457fe5b815260208101919091526040016000205460ff16613dc3565b6124495760405162461bcd60e51b8152600401610cee90615401565b600160136000612457610bc7565b6001600160a01b03166001600160a01b03168152602001908152602001600020600088600381111561248557fe5b600381111561249057fe5b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600c546124da9084612dc2565b6124e26116aa565b10156125005760405162461bcd60e51b8152600401610cee9061563c565b60208401518451600091612520916001600160801b039081169116612e7b565b9050600060646125308386612dc2565b8161253757fe5b049050600060646125488386612dc2565b8161254f57fe5b049050600061255e8383612e7b565b905061258361143f848a602001516001600160801b0316612e5690919063ffffffff16565b600080805260126020527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b906125b7610bc7565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316700100000000000000000000000000000000029216919091179055601689116126d7576000898152600e6020526040812061265c9161143f918591612620610bc7565b6001600160a01b031681526020810191909152604001600020546f0100000000000000000000000000000090046001600160801b031690612e56565b60008a8152600e6020526040812090612673610bc7565b6001600160a01b03168152602081019190915260400160002080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b6126e130826134ad565b6126f3306126ed610bc7565b84613398565b50505050505050505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000908152601460205260409020546f0100000000000000000000000000000090046001600160801b0316151590565b612762610bc7565b6000546001600160a01b0390811691161461278f5760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda6127b8610bc7565b6000366040516127ca9392919061517c565b60405180910390a1600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b612814614da7565b61281c614da7565b60015b601681116128b1576000818152601460209081526040918290208251808401909352546effffffffffffffffffffffffffffff811683526f0100000000000000000000000000000090046001600160801b031690820152827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301601681106128a457fe5b602002015260010161281f565b50905090565b60116020526000908152604090205463ffffffff8082169164010000000090041682565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda612904610bc7565b6000366040516129169392919061517c565b60405180910390a16007546001600160a01b03166323b872dd612937610bc7565b600b546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261297f92916001600160a01b0316908690600401615158565b602060405180830381600087803b15801561299957600080fd5b505af11580156129ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d19190614eff565b506000620f4240612a6a600860009054906101000a90046001600160a01b03166001600160a01b031663bebf110a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612a2b57600080fd5b505af1158015612a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a639190614fbe565b8490612dc2565b81612a7157fe5b04905061127e81612fd0565b6000612a8882613dc7565b604001516001600160801b031692915050565b612aa3610bc7565b6000546001600160a01b03908116911614612ad05760405162461bcd60e51b8152600401610cee9061581a565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda612af9610bc7565b600036604051612b0b9392919061517c565b60405180910390a16001600160a01b038116612b395760405162461bcd60e51b8152600401610cee90615a79565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b612b7b610bc7565b6000546001600160a01b03908116911614612ba85760405162461bcd60e51b8152600401610cee9061581a565b6001600160a01b038116612bce5760405162461bcd60e51b8152600401610cee90615438565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7f5c2145746a96e247ab56dae7070701d6a6d52685eb027789d7a768552d262f63612c6a610bc7565b34600036604051612c7e94939291906151a8565b60405180910390a1611bb0610bcc565b7f70d4241f29147d132737e3b0d80e661b9cc6b2911b7b9dc383ab54cf790a6eda612cb7610bc7565b600036604051612cc99392919061517c565b60405180910390a160065461010090046001600160a01b03166323b872dd612cef610bc7565b600b546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152612d3792916001600160a01b0316908690600401615158565b602060405180830381600087803b158015612d5157600080fd5b505af1158015612d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d899190614eff565b50610cb681612fd0565b600d5460009080612da8576000915050610bc9565b612db6635f8ed14082612e56565b91505090565b600d5481565b600082612dd157506000610ece565b82820282848281612dde57fe5b0414612dfc5760405162461bcd60e51b8152600401610cee9061574f565b9392505050565b60006001600160801b03821115612e2c5760405162461bcd60e51b8152600401610cee90615393565b5090565b600063ffffffff821115612e2c5760405162461bcd60e51b8152600401610cee906157ac565b600082820183811015612dfc5760405162461bcd60e51b8152600401610cee906154f2565b6000612dfc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612fa4565b600060ff821115612e2c5760405162461bcd60e51b8152600401610cee90615529565b600080612eed8484612f20565b1115612f0f57612f086001838581612f0157fe5b0490612e56565b9050610ece565b818381612f1857fe5b049392505050565b6000612dfc83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250614007565b6000612dfc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061403b565b60008184841115612fc85760405162461bcd60e51b8152600401610cee9190615257565b505050900390565b6000612fda6121b7565b6000818152600e602052604081209192509061302c90849083612ffb610bc7565b6001600160a01b031681526020810191909152604001600020546effffffffffffffffffffffffffffff1690612e56565b90506000600f600061303c610bc7565b6001600160a01b0316815260208101919091526040016000205470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060018314156130c657600081116130a65760405162461bcd60e51b8152600401610cee90615597565b808211156130c65760405162461bcd60e51b8152600401610cee90615886565b620f42408410156130e95760405162461bcd60e51b8152600401610cee90615673565b6130f282614072565b6000848152600e6020526040812090613109610bc7565b6001600160a01b031681526020808201929092526040908101600090812080547fffffffffffffffffffffffffffffffffff000000000000000000000000000000166effffffffffffffffffffffffffffff95861617905586815260149092529020546131809161317b911686612e56565b614072565b600084815260146020526040812080547fffffffffffffffffffffffffffffffffff000000000000000000000000000000166effffffffffffffffffffffffffffff9390931692909217909155600f906131d8610bc7565b6001600160a01b03168152602081019190915260400160002054600160f81b900460ff16610dfc5761320983612ebd565b600f6000613215610bc7565b6001600160a01b031681526020810191909152604001600020805460ff92909216600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905550505050565b6001600160a01b0383166132915760405162461bcd60e51b8152600401610cee906159ae565b6001600160a01b0382166132b75760405162461bcd60e51b8152600401610cee90615495565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613312908590615cc1565b60405180910390a3505050565b61332881614072565b6001600160a01b039092166000908152600f6020526040902080546effffffffffffffffffffffffffffff93909316700100000000000000000000000000000000027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093169290921790915550565b6001600160a01b0383166133be5760405162461bcd60e51b8152600401610cee90615951565b6001600160a01b0382166133e45760405162461bcd60e51b8152600401610cee906152c8565b6133ef8383836140a3565b61342c81604051806060016040528060268152602001615d34602691396001600160a01b0386166000908152600160205260409020549190612fa4565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461345b9082612e56565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613312908590615cc1565b6001600160a01b0382166134d35760405162461bcd60e51b8152600401610cee906158f4565b6134df826000836140a3565b61351c81604051806060016040528060228152602001615d12602291396001600160a01b0385166000908152600160205260409020549190612fa4565b6001600160a01b0383166000908152600160205260409020556003546135429082612e7b565b6003556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613583908590615cc1565b60405180910390a35050565b61359881611ab6565b6135b45760405162461bcd60e51b8152600401610cee9061584f565b6135bc614d72565b506000818152601460209081526040918290208251808401909352546effffffffffffffffffffffffffffff811683526f0100000000000000000000000000000090046001600160801b03169082018190521561362b5760405162461bcd60e51b8152600401610cee90615ab0565b60008211801561363b5750601782105b6136575760405162461bcd60e51b8152600401610cee906158bd565b81600114156137035780516136849061143f906effffffffffffffffffffffffffffff16620f4240612ee0565b6001600160801b0316602082018190526136a057600160208201525b60209081015160008381526014909252604090912080546001600160801b039092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff909216919091179055610cb6565b613711610a80836001612e7b565b61372d5760405162461bcd60e51b8152600401610cee906156aa565b60006137376116aa565b82519091506000908290613764906effffffffffffffffffffffffffffff16670de0b6b3a7640000612dc2565b8161376b57fe5b049050692855b982aee678b00000811015613887576137c361143f613794600a6202e80c612dc2565b8551611d6e906effffffffffffffffffffffffffffff16611ad6876137bd60096202e80c612dc2565b90612dc2565b6001600160801b0316602084018190528351600091906137fc906effffffffffffffffffffffffffffff16670de0b6b3a7640000612dc2565b8161380357fe5b60208087015160008981526014909252604090912080546001600160801b039092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790550490506138813061387c692855b982aee678b0000084612e7b565b6134ad565b50613904565b82516138ab9061143f906effffffffffffffffffffffffffffff166202e80c612ee0565b600085815260146020526040902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b83600a1415610dfc57600060025b600a811161395a576000818152601460205260409020546139509083906f0100000000000000000000000000000090046001600160801b0316612e56565b9150600101613912565b5060099004600c5550505050565b421190565b60016001600160a01b03821660009081527f63dac8ac72609a2437a2da33ae5c3341a805b2815f084aeb7a66b5dcf5c8eb596020526040902054600160f81b900460ff1660018111156139bc57fe5b14156139c757610cb6565b6001600160a01b0381166000908152600f6020526040902054600160f81b900460ff166139f357610cb6565b613a00635f71d040613db5565b15613a0a57610cb6565b6000613a14611d15565b6001600160a01b0383166000908152600f6020526040902054909150600160f81b900460ff165b81811015611c025760016000828152600e602090815260408083206001600160a01b0388168452909152902054600160f81b900460ff166001811115613a7d57fe5b1415613a8857613b63565b613a90614d72565b506000818152601460209081526040918290208251808401909352546effffffffffffffffffffffffffffff811683526f0100000000000000000000000000000090046001600160801b0316908201819052613afe5760405162461bcd60e51b8152600401610cee90615ae7565b6000828152600e602090815260408083206001600160a01b0388168452909152902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b179055613b5682858361455d565b613b618285836147d4565b505b600101613a3b565b613b73614d72565b60116000846005811115613b8357fe5b6005811115613b8e57fe5b8152602080820192909252604090810160002081518083019092525463ffffffff80821680845264010000000090920416928201929092529150613bd190613968565b613bed5760405162461bcd60e51b8152600401610cee90615a42565b613bf5614d72565b60126000856005811115613c0557fe5b6005811115613c1057fe5b8152602080820192909252604090810160009081206001600160a01b038716825283528181208251808401909352546001600160801b038082168085527001000000000000000000000000000000009092041683850181905293860151865193955090939263ffffffff91821691613c9391613c8c9116613d5c565b8590612dc2565b81613c9a57fe5b04905082811115613ca85750815b818111613cc75760405162461bcd60e51b8152600401610cee906155ce565b6000613cd38284612e7b565b9050613cde82612e03565b601260008a6005811115613cee57fe5b6005811115613cf957fe5b8152602080820192909252604090810160009081206001600160a01b038c168252909252902080546001600160801b03928316700100000000000000000000000000000000029216919091179055613d52308883613398565b5050505050505050565b6000610ece4283612e7b565b601660005260146020527f61dccb1ed53f90936bb85f76ea5b84a7d698d504a213db86a4df73c05a00c8d9546f0100000000000000000000000000000090046001600160801b0316151590565b6000610ece613dc383613968565b1590565b613dcf614dd5565b613dd7614dd5565b506001600160a01b0382166000908152601060209081526040918290208251608081018452815463ffffffff808216835264010000000082041693820193909352680100000000000000009092046001600160801b0316928201929092526001909101546060820152613e4983614b93565b613e545790506119eb565b602081015163ffffffff166000613e6a85611aee565b90506000613e76612d93565b905080156000613e9d613e92613e8b87613d5c565b8690612dc2565b606088015190612e56565b90508115613eff57606086018190528551613ecf90613ec19063ffffffff16613d5c565b8281613ec957fe5b04612e03565b6001600160801b03166040870152613ee642612e30565b63ffffffff166020870152509394506119eb9350505050565b6000613f2284611ad662278d006137bd62278d00613f1c8a613d5c565b90612f62565b9050808610613f375760608701829052613fe6565b6000613f438288612e7b565b90506000613f5f613f548884612dc2565b60608b015190612e56565b905085831415613f9c57613f89613ec18a6000015163ffffffff1685612e7b90919063ffffffff16565b6001600160801b031660408a0152613fcb565b62278d008211613fb357613f8962278d0082613ec9565b613fbc87612e03565b6001600160801b031660408a01525b613fde613fd784613d5c565b8890612dc2565b60608a015250505b613fef42612e30565b63ffffffff1660208801525094979650505050505050565b600081836140285760405162461bcd60e51b8152600401610cee9190615257565b5082848161403257fe5b06949350505050565b6000818361405c5760405162461bcd60e51b8152600401610cee9190615257565b50600083858161406857fe5b0495945050505050565b60006effffffffffffffffffffffffffffff821115612e2c5760405162461bcd60e51b8152600401610cee906153ca565b6140ac83614b93565b156140ba576140ba8361396d565b6140c7635f8ed140613db5565b156143655760016140db635f71d040613968565b156140eb576140e8611d15565b90505b6140f484614b93565b156141b3576000818152600e602090815260408083206001600160a01b03881684529091529020546141469061143f906f0100000000000000000000000000000090046001600160801b031684612e7b565b6000828152600e602090815260408083206001600160a01b0389168452909152902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b6141bc83614b93565b15614363576141c9614cd9565b506001600160a01b0383166000908152600f6020908152604091829020825160608101845290546001600160801b038116825270010000000000000000000000000000000081046effffffffffffffffffffffffffffff1692820192909252600160f81b90910460ff16918101829052906142975761424782612ebd565b6001600160a01b0385166000908152600f60205260409020805460ff92909216600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555b6001600160a01b0385163014614361576000828152600e602090815260408083206001600160a01b03881684529091529020546142f49061143f906f0100000000000000000000000000000090046001600160801b031685612e56565b6000838152600e602090815260408083206001600160a01b0389168452909152902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b505b505b600d5461454b5761437583614b93565b156143f9576001600160a01b0383166000908152600f60205260409020546143aa9061143f906001600160801b031683612e7b565b6001600160a01b0384166000908152600f6020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b03929092169190911790555b61440282614b93565b1561454b576001600160a01b0382166000908152600f60205260409020546144379061143f906001600160801b031683612e56565b6001600160a01b0383166000908152600f6020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b03959095169490941790935560109052205463ffffffff1661454b576144a242612e30565b6001600160a01b038316600090815260106020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790556144f642612e30565b6001600160a01b0383166000908152601060205260409020805463ffffffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9092169190911790555b61455483614bc8565b611c0282614bc8565b614565614d89565b6000848152600e602090815260408083206001600160a01b0387168452825291829020825160608101845281546effffffffffffffffffffffffffffff811682526f0100000000000000000000000000000081046001600160801b03169382019390935292909190830190600160f81b900460ff1660018111156145e557fe5b60018111156145f057fe5b815250509050600082602001516001600160801b0316614636670de0b6b3a764000084600001516effffffffffffffffffffffffffffff16612dc290919063ffffffff16565b8161463d57fe5b04905060006146628284602001516001600160801b0316612e5690919063ffffffff16565b905061466d81612e03565b6000878152600e602090815260408083206001600160a01b038a168452909152902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff90921691909117905560168610156147c15761474161143f82600e60006146f88b6001612e56565b8152602080820192909252604090810160009081206001600160a01b038c1682529092529020546f0100000000000000000000000000000090046001600160801b031690612e56565b600e6000614750896001612e56565b8152602080820192909252604090810160009081206001600160a01b038a168252909252902080546001600160801b03929092166f01000000000000000000000000000000027fff00000000000000000000000000000000ffffffffffffffffffffffffffffff9092169190911790555b6147cc308684613398565b505050505050565b60158311156147e257611c02565b6147ea614d89565b6000848152600e602090815260408083206001600160a01b0387168452825291829020825160608101845281546effffffffffffffffffffffffffffff811682526f0100000000000000000000000000000081046001600160801b03169382019390935292909190830190600160f81b900460ff16600181111561486a57fe5b600181111561487557fe5b9052509050600060018514156148b05760208201516064906148a1906001600160801b03166005612dc2565b816148a857fe5b049050614a1a565b60016000600e816148c18985612e7b565b8152602080820192909252604090810160009081206001600160a01b038a1682529092529020546f0100000000000000000000000000000090046001600160801b031690508015801590614935575060208401516001600160801b0316606461492b836065612dc2565b8161493257fe5b04105b1561493f57600291505b6020808601518651868301516001600160a01b038a1660009081527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582079094526040909320546001600160801b03928316936effffffffffffffffffffffffffffff90921692918216916002916006916f0100000000000000000000000000000090910416156149d0575060059050600f5b6149e26202e80c6137bd606488612dc2565b614a08886137bd86816149f5878b612dc2565b611adc6202e80c6137bd8e818d8d612e56565b81614a0f57fe5b049750505050505050505b3060009081527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b60205260409020546001600160801b031681811015614a5e578091505b6001600160a01b03851660009081527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b6020526040902054614aad9061143f906001600160801b031684612e56565b6001600160a01b03861660009081527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b6020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216919091179055614b2761143f8284612e7b565b3060009081527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b6020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216919091179055505050505050565b60006001600160a01b038216301480614bb357506001600160a01b038216155b15614bc0575060006119eb565b506001919050565b6001600160a01b03811660009081526010602052604090205463ffffffff64010000000090910416421415614bfc57610cb6565b614c0581613dc7565b6001600160a01b03919091166000908152601060209081526040918290208351815492850151938501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090931663ffffffff918216177fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff166401000000009190941602929092177fffffffffffffffff00000000000000000000000000000000ffffffffffffffff16680100000000000000006001600160801b0390921691909102178155606090910151600190910155565b604080516060810182526000808252602082018190529181019190915290565b604051806102c001604052806016905b614d11614d89565b815260200190600190039081614d095790505090565b6040518060c001604052806006905b614d3e614d72565b815260200190600190039081614d365790505090565b60405180608001604052806004906020820280368337509192915050565b604080518082019091526000808252602082015290565b60408051606081018252600080825260208201819052909182015290565b604051806102c001604052806016905b614dbf614d72565b815260200190600190039081614db75790505090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b803560048110610ece57600080fd5b600060208284031215614e1c578081fd5b8135612dfc81615cef565b60008060408385031215614e39578081fd5b8235614e4481615cef565b91506020830135614e5481615cef565b809150509250929050565b600080600060608486031215614e73578081fd5b8335614e7e81615cef565b92506020840135614e8e81615cef565b929592945050506040919091013590565b60008060408385031215614eb1578182fd5b8235614ebc81615cef565b9150614ecb8460208501614dfc565b90509250929050565b60008060408385031215614ee6578182fd5b8235614ef181615cef565b946020939093013593505050565b600060208284031215614f10578081fd5b81518015158114612dfc578182fd5b600080600060608486031215614e73578283fd5b600060208284031215614f44578081fd5b612dfc8383614dfc565b600060208284031215614f5f578081fd5b8135612dfc81615d04565b60008060408385031215614f7c578182fd5b8235614e4481615d04565b600080600060608486031215614f9b578283fd5b8335614e7e81615d04565b600060208284031215614fb7578081fd5b5035919050565b600060208284031215614fcf578081fd5b5051919050565b60008060408385031215614fe8578182fd5b823591506020830135614e5481615cef565b60008060006060848603121561500e578081fd5b505081359360208301359350604090920135919050565b600061503183836150cc565b505060600190565b80516001600160801b039081168352602091820151169082015260400190565b8060005b6004811015610dfc578151151584526020938401939091019060010161505d565b15159052565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b6effffffffffffffffffffffffffffff81511682526001600160801b03602082015116602083015260408101516002811061510357fe5b806040840152505050565b80516001600160801b031682526020808201516effffffffffffffffffffffffffffff169083015260409081015160ff16910152565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b03851682526040602083015261519f604083018486615084565b95945050505050565b60006001600160a01b0386168252846020830152606060408301526151d1606083018486615084565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6105808101818360005b601681101561524357815180516effffffffffffffffffffffffffffff1684526020908101516001600160801b031681850152604090930192909101906001016151fe565b50505092915050565b901515815260200190565b6000602080835283518082850152825b8181101561528357858101830151858201604001528201615267565b818111156152945783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f546f6b656e73616c65206973206e6f742070726f636573736564000000000000604082015260600190565b60208082526018908201527f50726f6475637420616c7265616479206c61756e636865640000000000000000604082015260600190565b60208082526010908201527f75696e74313238206f766572666c6f7700000000000000000000000000000000604082015260600190565b60208082526010908201527f75696e74313230206f766572666c6f7700000000000000000000000000000000604082015260600190565b60208082526016908201527f416c726561647920666f7263652072656c656173656400000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600e908201527f75696e7438206f766572666c6f77000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f4465706f7369747320656e646564000000000000000000000000000000000000604082015260600190565b6020808252600f908201527f4e6f742077686974656c69737465640000000000000000000000000000000000604082015260600190565b60208082526015908201527f496e73756666696369656e7420756e6c6f636b65640000000000000000000000604082015260600190565b60208082526019908201527f546f6b656e73616c65206e6f7420737461727465642079657400000000000000604082015260600190565b6020808252601a908201527f43757272656e7420707269636520697320746f6f20736d616c6c000000000000604082015260600190565b6020808252601f908201527f4c657373207468616e206d696e696d756d20616d6f756e742031207573646300604082015260600190565b6020808252601b908201527f50726576696f757320726f756e64206e6f742070726570617265640000000000604082015260600190565b60208082526014908201527f43616e6e6f742077697468647261772074686973000000000000000000000000604082015260600190565b60208082526019908201527f496e73756666697369656e74206c6f636b65642066756e647300000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600f908201527f75696e743332206f766572666c6f770000000000000000000000000000000000604082015260600190565b60208082526013908201527f4f6e6c7920616674657220313020726f756e6400000000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f4465706f73697420726f756e64206e6f7420656e646564000000000000000000604082015260600190565b60208082526018908201527f4465706f736974206c696d697420697320726561636865640000000000000000604082015260600190565b60208082526012908201527f526f756e64206973206e6f742076616c69640000000000000000000000000000604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f43616e6e6f74207472616e736665722061667465722072656c65617365000000604082015260600190565b6020808252601c908201527f52656c656173696e6720686173206e6f20737461727465642079657400000000604082015260600190565b60208082526019908201527f4e6f74207a65726f206164647265737320726571756972656400000000000000604082015260600190565b60208082526016908201527f526f756e6420616c726561647920707265706172656400000000000000000000604082015260600190565b60208082526015908201527f526f756e64206973206e6f742070726570617265640000000000000000000000604082015260600190565b60208082526017908201527f4e6f7468696e6720746f20666f72636520756e6c6f636b000000000000000000604082015260600190565b6020808252601a908201527f546f6b656e73616c65206973206e6f7420656e64656420796574000000000000604082015260600190565b60208082526015908201527f5072696365206973206f7574206f662072616e67650000000000000000000000604082015260600190565b60608101610ece82846150cc565b60608101610ece828461510e565b610ae08101615bee828961510e565b606082018760005b6016811015615c1b57615c0a838351615025565b925060209190910190600101615bf6565b5050506108a082018660005b6006811015615c4c57615c3b838351615039565b925060209190910190600101615c27565b505050615c5d610a2083018661507e565b615c6b610a40830185615059565b82610ac0830152979650505050505050565b6effffffffffffffffffffffffffffff9290921682526001600160801b0316602082015260400190565b6001600160801b0392831681529116602082015260400190565b90815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b6001600160a01b0381168114610cb657600080fd5b60068110610cb657600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122095202c00692f46c7242f867d579a62502759b59647effcb74c4ded33c67ce3f164736f6c63430007000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000303a83425d32a7c8be71abf65b7a223885387d77
-----Decoded View---------------
Arg [0] : _distributor (address): 0x303A83425d32A7c8bE71abf65B7A223885387D77
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000303a83425d32a7c8be71abf65b7a223885387d77
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.