- Contract name:
- NodeController
- Optimization enabled
- true
- Compiler version
- v0.8.12+commit.f00d7308
- Optimization runs
- 200
- Verified at
- 2023-07-31 08:12:05.765050Z
project:/contracts/nodes/NodeController.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.7;import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";import "../token/interfaces/IDeAnt3.sol";import "../token/interfaces/IAnt3.sol";import "../members/IMemberController.sol";import "./interfaces/INodePassive.sol";import "./interfaces/INodeActive.sol";import "./interfaces/INodeController.sol";contract NodeController is ContextUpgradeable, OwnableUpgradeable, IERC20Receiver, INodeController{ struct PackagePrice { uint256 alphaDeAntPrice; uint256 alphaGuardianPrice; uint256 betaDeAntPrice; uint256 betaGuardianPrice; uint256 gammaDeAntPrice; uint256 gammaGuardianPrice; uint256 packageId; } //token addresses, //guardian IDeAnt3 public deAnt3Token; IAnt3 public ant3Token; IERC20Upgradeable public guardianToken; PackagePrice public packagePrices; INodePassive public nodePassive; INodeActive public nodeActiveL1; INodeActive public nodeActiveL2; INodeActive public nodeActiveL3; INodeActive public nodeActiveL4; INodeActive public nodeActiveL5; INodeActive public nodeActiveL6; INodeActive[] public nodeActiveArray; IMemberController public memberController; mapping(address => uint256) public alphaAccmQty; mapping(address => uint256) public betaAccmQty; mapping(address => uint256) public gammaAccmQty; mapping(address => uint256) public referralRank; mapping(address => bool) public validCaller; //quotas uint256 public today; mapping(uint256 => uint256) defaultQuota; // initial will [1:10, 2:100, 3:300] mapping(uint256 => uint256) allQuota; // initial will defaultQuota uint256 lastPromoCode; // initial with 100000 uint256 public maxClaimRound; // initial to 10 rounds mapping(uint256 => address) allPromoCode; event NewActiveOrder( uint256 fromOrderID, uint256 activeOrderID, address fromAddress, address toAddress, uint256 level, uint256 daysActive, uint256 shareAmt, uint256 lastRound ); event MissingActiveOrder( uint256 fromOrderID, address fromAddress, address toAddress, uint256 level, uint256 daysActive, uint256 shareAmt, uint256 lastRound ); event ControllerReceivedTokens(address from, address to, uint256 amount); uint256 deAnt3Decimals; uint256 guardianDecimals; address private _guardianCollectAddress; modifier onlyAnt3() { require( msg.sender == address(ant3Token), "Only callable from ant3Contract" ); _; } modifier onlyValidCaller(address addr) { require(validCaller[addr], "Invalid caller."); _; } function initialize( address payable _deAnt3Token, address _ant3Token, address _guardianToken, address _memberController ) public initializer { __Ownable_init(); deAnt3Token = IDeAnt3(_deAnt3Token); ant3Token = IAnt3(_ant3Token); guardianToken = IERC20Upgradeable(_guardianToken); memberController = IMemberController(_memberController); _guardianCollectAddress = 0xF18dD3538362d890Cd13e06e6688aB7288eA764F; deAnt3Decimals = 10 ** 9; guardianDecimals = 10 ** 18; packagePrices.alphaDeAntPrice = 1000 * deAnt3Decimals; packagePrices.alphaGuardianPrice = 100 * guardianDecimals; packagePrices.betaDeAntPrice = 10000 * deAnt3Decimals; packagePrices.betaGuardianPrice = 1000 * guardianDecimals; packagePrices.gammaDeAntPrice = 100000 * deAnt3Decimals; packagePrices.gammaGuardianPrice = 10000 * guardianDecimals; lastPromoCode = 100000; defaultQuota[1] = 300; defaultQuota[2] = 100; defaultQuota[3] = 10; allQuota[1] = defaultQuota[1]; allQuota[2] = defaultQuota[2]; allQuota[3] = defaultQuota[3]; validCaller[owner()] = true; maxClaimRound = 10; } function setMemberControllerContract( address _memberController ) external onlyOwner { memberController = IMemberController(_memberController); } function setGuardianCollectAddress( address guardianCollectAddress_ ) external onlyOwner { _guardianCollectAddress = guardianCollectAddress_; } function setNodePassiveContract(address _nodePassive) external onlyOwner { nodePassive = INodePassive(_nodePassive); } function setNodeActiveContract( address _nodeActiveL1, address _nodeActiveL2, address _nodeActiveL3, address _nodeActiveL4, address _nodeActiveL5, address _nodeActiveL6 ) external onlyOwner { nodeActiveL1 = INodeActive(_nodeActiveL1); nodeActiveArray.push(nodeActiveL1); nodeActiveL2 = INodeActive(_nodeActiveL2); nodeActiveArray.push(nodeActiveL2); nodeActiveL3 = INodeActive(_nodeActiveL3); nodeActiveArray.push(nodeActiveL3); nodeActiveL4 = INodeActive(_nodeActiveL4); nodeActiveArray.push(nodeActiveL4); nodeActiveL5 = INodeActive(_nodeActiveL5); nodeActiveArray.push(nodeActiveL5); nodeActiveL6 = INodeActive(_nodeActiveL6); nodeActiveArray.push(nodeActiveL6); } function setPackagePrice( uint256 packageId, uint256 deAnt3, uint256 guardian ) external onlyOwner { if (packageId == 1) { packagePrices.alphaDeAntPrice = deAnt3; packagePrices.alphaGuardianPrice = guardian; } else if (packageId == 2) { packagePrices.betaDeAntPrice = deAnt3; packagePrices.betaGuardianPrice = guardian; } else if (packageId == 3) { packagePrices.gammaDeAntPrice = deAnt3; packagePrices.gammaGuardianPrice = guardian; } } function setMaxClaimRound(uint256 round) public onlyOwner { maxClaimRound = round; } function getMaxClaimRound() public view returns (uint256) { return maxClaimRound; } function getPackagePrice( uint256 packageId ) public view returns (uint256 deant, uint256 guardian) { if (packageId == 1) { return ( packagePrices.alphaDeAntPrice, packagePrices.alphaGuardianPrice ); } else if (packageId == 2) { return ( packagePrices.betaDeAntPrice, packagePrices.betaGuardianPrice ); } else if (packageId == 3) { return ( packagePrices.gammaDeAntPrice, packagePrices.gammaGuardianPrice ); } } function buyNodesPackage(uint256 packageId, uint256 promoCode) public { (uint256 deAntPrice, uint256 guardianPrice) = getPackagePrice( packageId ); require( deAntPrice > 0 && guardianPrice > 0, "Price must be more than 0" ); _checkQuota(packageId, promoCode, msg.sender); deAnt3Token.nodeControllerBurn(msg.sender, deAntPrice); guardianToken.transferFrom( msg.sender, _guardianCollectAddress, guardianPrice ); _setAccumulatedQty(msg.sender, packageId); if (packageId > referralRank[msg.sender]) { _setReferralRank(msg.sender, packageId); } uint256 userShare = _calculateShares(msg.sender, packageId); _mintAnt3Token(deAntPrice); uint256 fromMoId = nodePassive.addOrders( msg.sender, userShare, packageId, deAntPrice ); _addNodeActiveOrders(msg.sender, userShare, packageId, fromMoId); if (memberController.getMembers(msg.sender).referralCode == 0) { memberController.genReferralCode(msg.sender); } } function _addNodeActiveOrders( address sender, uint256 userShare, uint256 packageId, uint256 fromMoId ) private { //**Referral must have at least ONE active package. address[] memory uplines = memberController.getUplines(sender, 6); for (uint256 i = 0; i < uplines.length; i++) { if (uplines[i] != address(0)) { uint256 activeDays = _calculateActiveDays( packageId, referralRank[uplines[i]] ); if (nodePassive.getUserClockActive(uplines[i]) == true) { if ( i > 2 && memberController.checkMonthlyPassOrder(uplines[i]) == false ) { emit MissingActiveOrder( fromMoId, sender, uplines[i], i + 1, activeDays, userShare, nodeActiveArray[i].getLastRound() ); continue; } uint256 activeMoId = nodeActiveArray[i].addOrders( uplines[i], userShare, activeDays ); emit NewActiveOrder( fromMoId, activeMoId, sender, uplines[i], i + 1, activeDays, userShare, nodeActiveArray[i].getLastRound() ); } else { emit MissingActiveOrder( fromMoId, sender, uplines[i], i + 1, activeDays, userShare, nodeActiveArray[i].getLastRound() ); } } } } function _calculateActiveDays( uint256 packageId, uint256 rank ) private pure returns (uint256 day) { if (packageId == 1) { if (rank == 1) { return 20; } else if (rank == 2) { return 30; } else if (rank == 3) { return 40; } } else if (packageId == 2) { if (rank == 1) { return 30; } else if (rank == 2) { return 45; } else if (rank == 3) { return 50; } } else if (packageId == 3) { if (rank == 1) { return 40; } else if (rank == 2) { return 60; } else if (rank == 3) { return 80; } } } function _calculateShares( address _userAddress, uint256 packageId ) private view returns (uint256 shares) { if (packageId == 3) { if (gammaAccmQty[_userAddress] > 10) { return 1200; } else if ( gammaAccmQty[_userAddress] > 5 && gammaAccmQty[_userAddress] < 11 ) { return 1100; } else { return 1000; } } else if (packageId == 2) { if (betaAccmQty[_userAddress] > 10) { return 120; } else if ( (betaAccmQty[_userAddress] > 5 && betaAccmQty[_userAddress] < 11) ) { return 110; } else { return 100; } } else if (packageId == 1) { if (alphaAccmQty[_userAddress] > 10) { return 12; } else if ( (alphaAccmQty[_userAddress] > 5 && alphaAccmQty[_userAddress] < 11) ) { return 11; } else { return 10; } } } function _setAccumulatedQty( address _userAddress, uint256 _packageId ) private { if (_packageId == 1) { alphaAccmQty[_userAddress]++; } else if (_packageId == 2) { betaAccmQty[_userAddress]++; } else if (_packageId == 3) { gammaAccmQty[_userAddress]++; } } function _setReferralRank(address _userAddress, uint256 _rank) private { referralRank[_userAddress] = _rank; } function _mintAnt3Token(uint256 amount) private { ant3Token.mint(amount); } function onERC20Receive( address from, uint256 amount ) external onlyAnt3 returns (bool) { emit ControllerReceivedTokens(from, address(this), amount); uint256 passiveAmt = (amount * 70) / 100; uint256 activeAmt = amount - passiveAmt; uint256 active1Amt = (activeAmt * 40) / 100; uint256 active2Amt = (activeAmt * 20) / 100; uint256 active3Amt = (activeAmt * 5) / 100; uint256 active4Amt = (activeAmt * 5) / 100; uint256 active5Amt = (activeAmt * 10) / 100; uint256 active6Amt = activeAmt - active1Amt - active2Amt - active3Amt - active4Amt - active5Amt; ant3Token.transfer(address(nodePassive), passiveAmt); _afterTokenTransfer(address(nodePassive), passiveAmt); ant3Token.transfer(address(nodeActiveL1), active1Amt); _afterTokenTransfer(address(nodeActiveL1), active1Amt); ant3Token.transfer(address(nodeActiveL2), active2Amt); _afterTokenTransfer(address(nodeActiveL2), active2Amt); ant3Token.transfer(address(nodeActiveL3), active3Amt); _afterTokenTransfer(address(nodeActiveL3), active3Amt); ant3Token.transfer(address(nodeActiveL4), active4Amt); _afterTokenTransfer(address(nodeActiveL4), active4Amt); ant3Token.transfer(address(nodeActiveL5), active5Amt); _afterTokenTransfer(address(nodeActiveL5), active5Amt); ant3Token.transfer(address(nodeActiveL6), active6Amt); _afterTokenTransfer(address(nodeActiveL6), active6Amt); return true; } function _afterTokenTransfer(address to, uint256 amount) internal { if (to.code.length > 0) { // token recipient is a contract, notify them try IERC20Receiver(to).onERC20Receive(address(this), amount) { // the recipient returned a bool, TODO validate if they returned true } catch { // the notification failed (maybe they don't implement the `IERC20Receiver` interface?) } } } function setCaller(address addr) public onlyOwner { require(!validCaller[addr], "Address already is a valid caller."); validCaller[addr] = true; } function removeCaller(address addr) public onlyOwner { require(validCaller[addr], "Address is not a valid caller."); validCaller[addr] = false; } function expireUserOrder( address[] memory userAddress, uint256[] memory orderId, uint256[] memory expireRound ) public onlyValidCaller(msg.sender) { require( userAddress.length == orderId.length && userAddress.length == expireRound.length, "Invalid length of elements" ); uint256 highestPackage; bool updateRank; for (uint256 i = 0; i < userAddress.length; i++) { (highestPackage, updateRank) = nodePassive.expireOrder( userAddress[i], orderId[i], expireRound[i] ); // recalculate user ranking if (updateRank) { _setReferralRank(userAddress[i], highestPackage); } } } function setDefaultQuota( uint256 packageId, uint256 quota ) public onlyOwner { defaultQuota[packageId] = quota; } function checkQuota() public view returns (uint256[] memory) { uint256[] memory curQuota = new uint256[](3); for (uint256 i = 0; i < 3; i++) { curQuota[i] = allQuota[i + 1]; } return curQuota; } function _checkQuota( uint256 packageId, uint256 promoCode, address userAddress ) private { // reset quota everyday if (block.timestamp >= today + 24 hours) { for (uint256 i = 0; i < 3; i++) { allQuota[i + 1] = defaultQuota[i + 1]; } // update today if (today == 0) { today = block.timestamp; } else { today = today + 24 hours; } } // check whether got promocode if (promoCode > 0) { // check promocode valid require( allPromoCode[promoCode] == userAddress, "Invalid Promo Code." ); allPromoCode[promoCode] = address(0); } else { // check quota require(allQuota[packageId] > 0, "Reached limit of quota."); // deduct quota allQuota[packageId]--; } } function generatePromoCode( address[] memory userAddress, uint256[] memory quantity ) public onlyOwner { require( userAddress.length == quantity.length, "Invalid length of elements" ); for (uint256 i = 0; i < userAddress.length; i++) { for (uint256 j = 0; j < quantity[i]; j++) { lastPromoCode++; // Assign promocode to useraddress allPromoCode[lastPromoCode] = userAddress[i]; } } } //claimRewards for passive & actives function claimRewards(uint256 contractId) public { if (contractId == 0) { nodePassive.claimRewards(msg.sender); } else { nodeActiveArray[contractId - 1].claimRewards(msg.sender); } } function getUserLastClaimRound( uint256 contractId, address user ) public view returns (uint256) { if (contractId == 0) { return nodePassive.getUserLastClaimRound(user); } else { return nodeActiveArray[contractId - 1].getUserLastClaimRound(user); } } function getUserCurrentClaimableRewards( address user ) public view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) { return ( nodePassive.currentClaimableRewards(user), nodeActiveL1.currentClaimableRewards(user), nodeActiveL2.currentClaimableRewards(user), nodeActiveL3.currentClaimableRewards(user), nodeActiveL4.currentClaimableRewards(user), nodeActiveL5.currentClaimableRewards(user), nodeActiveL6.currentClaimableRewards(user) ); } function getUserTotalClaimableRewards( address user ) public view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) { return ( nodePassive.totalClaimableRewards(user), nodeActiveL1.totalClaimableRewards(user), nodeActiveL2.totalClaimableRewards(user), nodeActiveL3.totalClaimableRewards(user), nodeActiveL4.totalClaimableRewards(user), nodeActiveL5.totalClaimableRewards(user), nodeActiveL6.totalClaimableRewards(user) ); } function getUserTotalClaimableRewardsPerLevel( address user, uint256 level ) public view returns (uint256 reward) { if (level == 0) { return nodePassive.totalClaimableRewards(user); } else if (level == 1) { return nodeActiveL1.totalClaimableRewards(user); } else if (level == 2) { return nodeActiveL2.totalClaimableRewards(user); } else if (level == 3) { return nodeActiveL3.totalClaimableRewards(user); } else if (level == 4) { return nodeActiveL4.totalClaimableRewards(user); } else if (level == 5) { return nodeActiveL5.totalClaimableRewards(user); } else if (level == 6) { return nodeActiveL6.totalClaimableRewards(user); } }}
@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)pragma solidity ^0.8.0;import "../utils/ContextUpgradeable.sol";import "../proxy/utils/Initializable.sol";/** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap;}
@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.2;import "../../utils/AddressUpgradeable.sol";/** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } }}
@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.0;/** * @dev Interface of the ERC20 standard as defined in the EIP. */interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool);}
@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)pragma solidity ^0.8.1;/** * @dev Collection of functions related to the address type */library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }}
@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragma solidity ^0.8.0;import "../proxy/utils/Initializable.sol";/** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap;}
project:/contracts/members/IMemberController.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.7;struct Member { bool active; address upline; address[] directs; uint256 referralCode;}interface IMemberController { function register(address addr, uint256 referralCode) external; function getUplines( address addr, uint256 levels ) external view returns (address[] memory); function getDirects(address addr) external view returns (address[] memory); function setCaller(address addr) external; function genReferralCode(address addr) external returns (uint256); function getMembers(address sender) external view returns (Member memory); function checkBurnedLP() external pure returns (bool); function checkMonthlyPassOrder(address sender) external returns (bool);}
project:/contracts/nodes/interfaces/INodeActive.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.7;interface INodeActive { function addOrders( address from, uint256 endRound, uint256 shareAmt ) external returns (uint256); function getLastRound() external view returns (uint256); function claimRewards(address userAddress) external; function getUserLastClaimRound(address user) external view returns (uint256); function currentClaimableRewards(address userAddress) external view returns (uint256); function totalClaimableRewards(address userAddress) external view returns (uint256);}
project:/contracts/nodes/interfaces/INodeController.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.7;interface INodeController { function getMaxClaimRound() external view returns (uint256);}
project:/contracts/nodes/interfaces/INodePassive.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.7;struct Round { uint256 toDistribute; uint256 toCarryForward; uint256 accmStakedShare; uint256 startTime;}struct User { uint256 startingIndexForAddShare; uint256[] sortedRoundForAddShare; mapping(uint256 => uint256) roundAddShare; uint256 startingIndexForDeductShare; uint256[] sortedRoundForDeductShare; mapping(uint256 => uint256) roundDeductShare; uint256[] userOrders; uint256 lastClaimRound;}struct Order { uint256 startRound; uint256 endRound; uint256 shareReward; address owner; uint256 packageId;}interface INodePassive { function addOrders( address from, uint256 shareAmt, uint256 packageId, uint256 deAntPrice ) external returns (uint256); function expireOrder( address userAddress, uint256 orderId, uint256 expireRound ) external returns (uint256, bool); function getUserClockActive(address userAddress) external view returns (bool); function claimRewards(address userAddress) external; function getUserLastClaimRound(address user) external view returns (uint256); function currentClaimableRewards(address userAddress) external view returns (uint256); function totalClaimableRewards(address userAddress) external view returns (uint256);}
project:/contracts/token/interfaces/IAnt3.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.7;interface IERC20Receiver { function onERC20Receive(address from, uint256 amount) external returns (bool);}interface IAnt3 { function transfer(address recipient, uint256 amount) external returns (bool); function mint(uint256 amount) external;}
project:/contracts/token/interfaces/IDeAnt3.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.7;interface IDeAnt3 { function nodeControllerBurn(address account, uint256 amount) external; function permitMint2( address payable recipient, uint256 uniqueId, uint256 amount, uint256 deadline, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) external; function transfer( address recipient, uint256 amount ) external returns (bool);}
Contract ABI
[{"type":"event","name":"ControllerReceivedTokens","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"MissingActiveOrder","inputs":[{"type":"uint256","name":"fromOrderID","internalType":"uint256","indexed":false},{"type":"address","name":"fromAddress","internalType":"address","indexed":false},{"type":"address","name":"toAddress","internalType":"address","indexed":false},{"type":"uint256","name":"level","internalType":"uint256","indexed":false},{"type":"uint256","name":"daysActive","internalType":"uint256","indexed":false},{"type":"uint256","name":"shareAmt","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastRound","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewActiveOrder","inputs":[{"type":"uint256","name":"fromOrderID","internalType":"uint256","indexed":false},{"type":"uint256","name":"activeOrderID","internalType":"uint256","indexed":false},{"type":"address","name":"fromAddress","internalType":"address","indexed":false},{"type":"address","name":"toAddress","internalType":"address","indexed":false},{"type":"uint256","name":"level","internalType":"uint256","indexed":false},{"type":"uint256","name":"daysActive","internalType":"uint256","indexed":false},{"type":"uint256","name":"shareAmt","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastRound","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"alphaAccmQty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IAnt3"}],"name":"ant3Token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"betaAccmQty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buyNodesPackage","inputs":[{"type":"uint256","name":"packageId","internalType":"uint256"},{"type":"uint256","name":"promoCode","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"checkQuota","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimRewards","inputs":[{"type":"uint256","name":"contractId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDeAnt3"}],"name":"deAnt3Token","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"expireUserOrder","inputs":[{"type":"address[]","name":"userAddress","internalType":"address[]"},{"type":"uint256[]","name":"orderId","internalType":"uint256[]"},{"type":"uint256[]","name":"expireRound","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gammaAccmQty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"generatePromoCode","inputs":[{"type":"address[]","name":"userAddress","internalType":"address[]"},{"type":"uint256[]","name":"quantity","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMaxClaimRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"deant","internalType":"uint256"},{"type":"uint256","name":"guardian","internalType":"uint256"}],"name":"getPackagePrice","inputs":[{"type":"uint256","name":"packageId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserCurrentClaimableRewards","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserLastClaimRound","inputs":[{"type":"uint256","name":"contractId","internalType":"uint256"},{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserTotalClaimableRewards","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"reward","internalType":"uint256"}],"name":"getUserTotalClaimableRewardsPerLevel","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"level","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20Upgradeable"}],"name":"guardianToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"_deAnt3Token","internalType":"address payable"},{"type":"address","name":"_ant3Token","internalType":"address"},{"type":"address","name":"_guardianToken","internalType":"address"},{"type":"address","name":"_memberController","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxClaimRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMemberController"}],"name":"memberController","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveArray","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL3","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL4","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL5","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL6","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodePassive"}],"name":"nodePassive","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"onERC20Receive","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"alphaDeAntPrice","internalType":"uint256"},{"type":"uint256","name":"alphaGuardianPrice","internalType":"uint256"},{"type":"uint256","name":"betaDeAntPrice","internalType":"uint256"},{"type":"uint256","name":"betaGuardianPrice","internalType":"uint256"},{"type":"uint256","name":"gammaDeAntPrice","internalType":"uint256"},{"type":"uint256","name":"gammaGuardianPrice","internalType":"uint256"},{"type":"uint256","name":"packageId","internalType":"uint256"}],"name":"packagePrices","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"referralRank","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeCaller","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCaller","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDefaultQuota","inputs":[{"type":"uint256","name":"packageId","internalType":"uint256"},{"type":"uint256","name":"quota","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGuardianCollectAddress","inputs":[{"type":"address","name":"guardianCollectAddress_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxClaimRound","inputs":[{"type":"uint256","name":"round","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMemberControllerContract","inputs":[{"type":"address","name":"_memberController","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNodeActiveContract","inputs":[{"type":"address","name":"_nodeActiveL1","internalType":"address"},{"type":"address","name":"_nodeActiveL2","internalType":"address"},{"type":"address","name":"_nodeActiveL3","internalType":"address"},{"type":"address","name":"_nodeActiveL4","internalType":"address"},{"type":"address","name":"_nodeActiveL5","internalType":"address"},{"type":"address","name":"_nodeActiveL6","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNodePassiveContract","inputs":[{"type":"address","name":"_nodePassive","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPackagePrice","inputs":[{"type":"uint256","name":"packageId","internalType":"uint256"},{"type":"uint256","name":"deAnt3","internalType":"uint256"},{"type":"uint256","name":"guardian","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"today","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"validCaller","inputs":[{"type":"address","name":"","internalType":"address"}]}]
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061027f5760003560e01c8063804a88f61161015c578063c6b821fb116100ce578063f27726d911610087578063f27726d91461060c578063f2fde38b1461061f578063f794e8a414610632578063f8c8765e14610652578063fa180dc914610665578063fce9e70d1461067857600080fd5b8063c6b821fb1461058d578063c94924ac146105a0578063d2089862146105b3578063e3664210146105c6578063eef21cd2146105d9578063efaa0c99146105ec57600080fd5b8063b74e452b11610120578063b74e452b14610525578063bb36aebe1461052e578063beb92f5514610541578063c29889de14610554578063c30a802e14610567578063c5c8a8b21461057a57600080fd5b8063804a88f6146104b85780638b1154f0146104db5780638da5cb5b146104ee57806392a3eaf5146104ff57806392c82c371461051257600080fd5b80632d31a074116101f557806359d637ac116101b957806359d637ac1461040b5780635edcfc7c1461041357806371070aac14610426578063715018a61461044657806379b6340a1461044e5780637d60dc16146104a557600080fd5b80632d31a074146103b457806336f6cdee146103c757806337f960da146103da5780633fea1ade146103ed57806351ec4f561461040257600080fd5b806319801bfc1161024757806319801bfc146103355780631c67fc83146103485780631ccbe9171461035b578063293baee21461037b5780632a5833ad1461038e5780632d26254f146103a157600080fd5b806303d93828146102845780630962ef79146102ac57806311a0ed9b146102c1578063136caeb6146102e95780631712d6dc1461030a575b600080fd5b61029761029236600461301b565b61068b565b60405190151581526020015b60405180910390f35b6102bf6102ba366004613047565b610c23565b005b6102d46102cf366004613047565b610ce2565b604080519283526020830191909152016102a3565b6102fc6102f736600461301b565b610d32565b6040519081526020016102a3565b61031d610318366004613047565b610f11565b6040516001600160a01b0390911681526020016102a3565b6102bf610343366004613060565b610f3b565b60745461031d906001600160a01b031681565b6102fc6103693660046130e2565b607a6020526000908152604090205481565b60775461031d906001600160a01b031681565b6102bf61039c366004613106565b61104b565b60755461031d906001600160a01b031681565b606f5461031d906001600160a01b031681565b60735461031d906001600160a01b031681565b6102bf6103e8366004613262565b611065565b6103f5611261565b6040516102a391906132ea565b6102fc60815481565b6081546102fc565b6102bf610421366004613047565b6112e6565b6102fc6104343660046130e2565b60786020526000908152604090205481565b6102bf6112f3565b606854606954606a54606b54606c54606d54606e546104709695949392919087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016102a3565b60665461031d906001600160a01b031681565b6102976104c63660046130e2565b607c6020526000908152604090205460ff1681565b6104706104e93660046130e2565b611307565b6033546001600160a01b031661031d565b6102bf61050d36600461332e565b611650565b6102bf6105203660046130e2565b61176c565b6102fc607d5481565b60655461031d906001600160a01b031681565b6102bf61054f3660046130e2565b611796565b60715461031d906001600160a01b031681565b6102fc610575366004613392565b611836565b6102bf6105883660046130e2565b6118c7565b60725461031d906001600160a01b031681565b6104706105ae3660046130e2565b6118f1565b6102bf6105c13660046133c2565b611be2565b60705461031d906001600160a01b031681565b6102bf6105e73660046130e2565b611c29565b6102fc6105fa3660046130e2565b60796020526000908152604090205481565b6102bf61061a366004613106565b611cba565b6102bf61062d3660046130e2565b611fe0565b6102fc6106403660046130e2565b607b6020526000908152604090205481565b6102bf6106603660046133ee565b612056565b60675461031d906001600160a01b031681565b6102bf6106863660046130e2565b61235f565b6066546000906001600160a01b031633146106ed5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c792063616c6c61626c652066726f6d20616e7433436f6e74726163740060448201526064015b60405180910390fd5b604080516001600160a01b03851681523060208201529081018390527f36caad1537e014a281b9a1df0065dfc68fef76f0c9c6f8453b546e8b022e48a99060600160405180910390a160006064610745846046613460565b61074f919061347f565b9050600061075d82856134a1565b90506000606461076e836028613460565b610778919061347f565b905060006064610789846014613460565b610793919061347f565b9050600060646107a4856005613460565b6107ae919061347f565b9050600060646107bf866005613460565b6107c9919061347f565b9050600060646107da87600a613460565b6107e4919061347f565b90506000818385876107f68a8c6134a1565b61080091906134a1565b61080a91906134a1565b61081491906134a1565b61081e91906134a1565b606654606f5460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926108569216908c906004016134b8565b6020604051808303816000875af1158015610875573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089991906134e6565b50606f546108b0906001600160a01b031689612389565b60665460705460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926108e6929116908a906004016134b8565b6020604051808303816000875af1158015610905573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092991906134e6565b50607054610940906001600160a01b031687612389565b60665460715460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926109769291169089906004016134b8565b6020604051808303816000875af1158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b991906134e6565b506071546109d0906001600160a01b031686612389565b60665460725460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610a069291169088906004016134b8565b6020604051808303816000875af1158015610a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4991906134e6565b50607254610a60906001600160a01b031685612389565b60665460735460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610a969291169087906004016134b8565b6020604051808303816000875af1158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad991906134e6565b50607354610af0906001600160a01b031684612389565b60665460745460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610b269291169086906004016134b8565b6020604051808303816000875af1158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6991906134e6565b50607454610b80906001600160a01b031683612389565b60665460755460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610bb69291169085906004016134b8565b6020604051808303816000875af1158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf991906134e6565b50607554610c10906001600160a01b031682612389565b6001985050505050505050505b92915050565b80610c8957606f54604051633bd73ee360e21b81523360048201526001600160a01b039091169063ef5cfb8c906024015b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b5050505050565b6076610c966001836134a1565b81548110610ca657610ca6613501565b600091825260209091200154604051633bd73ee360e21b81523360048201526001600160a01b039091169063ef5cfb8c90602401610c54565b50565b6000808260011415610cfd5750506068546069549092909150565b8260021415610d15575050606a54606b549092909150565b8260031415610d2d575050606c54606d549092909150565b915091565b600081610daf57606f54604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e7906024015b602060405180830381865afa158015610d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da89190613517565b9050610c1d565b8160011415610dea57607054604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160021415610e2557607154604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160031415610e6057607254604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160041415610e9b57607354604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160051415610ed657607454604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160061415610c1d57607554604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b60768181548110610f2157600080fd5b6000918252602090912001546001600160a01b0316905081565b610f4361240a565b607080546001600160a01b039788166001600160a01b03199182168117909255607680546001818101835560008390527fb5732705f5241370a28908c2fe1303cb223f03b90d857fd0573f003f79fefed49182018054851690951790945560718054998b169984168a1790558154808501835581018054841690991790985560728054978a169783168817905580548084018255880180548316909717909655607380549589169582168617905585548083018755870180548216909517909455607480549388169385168417905584548082018655860180548516909317909255607580549190961690831681179095558254908101909255910180549091169091179055565b61105361240a565b6000918252607e602052604090912055565b336000818152607c602052604090205460ff166110b65760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21031b0b63632b91760891b60448201526064016106e4565b825184511480156110c8575081518451145b6111145760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206c656e677468206f6620656c656d656e747300000000000060448201526064016106e4565b60008060005b865181101561125857606f5487516001600160a01b039091169063b85b83559089908490811061114c5761114c613501565b602002602001015188848151811061116657611166613501565b602002602001015188858151811061118057611180613501565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0390931660048401526024830191909152604482015260640160408051808303816000875af11580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190613530565b909350915081156112465761124687828151811061122157611221613501565b6020026020010151846001600160a01b039091166000908152607b6020526040902055565b806112508161355c565b91505061111a565b50505050505050565b604080516003808252608082019092526060916000919060208201848036833701905050905060005b60038110156112e057607f60006112a2836001613577565b8152602001908152602001600020548282815181106112c3576112c3613501565b6020908102919091010152806112d88161355c565b91505061128a565b50919050565b6112ee61240a565b608155565b6112fb61240a565b6113056000612464565b565b606f54604051630757a7e760e01b81526001600160a01b0383811660048301526000928392839283928392839283921690630757a7e790602401602060405180830381865afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190613517565b607054604051630757a7e760e01b81526001600160a01b038b8116600483015290911690630757a7e790602401602060405180830381865afa1580156113cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f09190613517565b607154604051630757a7e760e01b81526001600160a01b038c8116600483015290911690630757a7e790602401602060405180830381865afa15801561143a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145e9190613517565b607254604051630757a7e760e01b81526001600160a01b038d8116600483015290911690630757a7e790602401602060405180830381865afa1580156114a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114cc9190613517565b607354604051630757a7e760e01b81526001600160a01b038e8116600483015290911690630757a7e790602401602060405180830381865afa158015611516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153a9190613517565b607454604051630757a7e760e01b81526001600160a01b038f8116600483015290911690630757a7e790602401602060405180830381865afa158015611584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a89190613517565b607560009054906101000a90046001600160a01b03166001600160a01b0316630757a7e78f6040518263ffffffff1660e01b81526004016115f891906001600160a01b0391909116815260200190565b602060405180830381865afa158015611615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116399190613517565b959e949d50929b5090995097509550909350915050565b61165861240a565b80518251146116a95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206c656e677468206f6620656c656d656e747300000000000060448201526064016106e4565b60005b82518110156117675760005b8282815181106116ca576116ca613501565b602002602001015181101561175457608080549060006116e98361355c565b919050555083828151811061170057611700613501565b602002602001015160826000608054815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550808061174c9061355c565b9150506116b8565b508061175f8161355c565b9150506116ac565b505050565b61177461240a565b606f80546001600160a01b0319166001600160a01b0392909216919091179055565b61179e61240a565b6001600160a01b0381166000908152607c602052604090205460ff16156118125760405162461bcd60e51b815260206004820152602260248201527f4164647265737320616c726561647920697320612076616c69642063616c6c65604482015261391760f11b60648201526084016106e4565b6001600160a01b03166000908152607c60205260409020805460ff19166001179055565b60008261186f57606f5460405163083108df60e41b81526001600160a01b038481166004830152909116906383108df090602401610d67565b607661187c6001856134a1565b8154811061188c5761188c613501565b60009182526020909120015460405163083108df60e41b81526001600160a01b038481166004830152909116906383108df090602401610d67565b6118cf61240a565b608580546001600160a01b0319166001600160a01b0392909216919091179055565b606f546040516356322e6760e01b81526001600160a01b03838116600483015260009283928392839283928392839216906356322e6790602401602060405180830381865afa158015611948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196c9190613517565b6070546040516356322e6760e01b81526001600160a01b038b81166004830152909116906356322e6790602401602060405180830381865afa1580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190613517565b6071546040516356322e6760e01b81526001600160a01b038c81166004830152909116906356322e6790602401602060405180830381865afa158015611a24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a489190613517565b6072546040516356322e6760e01b81526001600160a01b038d81166004830152909116906356322e6790602401602060405180830381865afa158015611a92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab69190613517565b6073546040516356322e6760e01b81526001600160a01b038e81166004830152909116906356322e6790602401602060405180830381865afa158015611b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b249190613517565b6074546040516356322e6760e01b81526001600160a01b038f81166004830152909116906356322e6790602401602060405180830381865afa158015611b6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b929190613517565b607560009054906101000a90046001600160a01b03166001600160a01b03166356322e678f6040518263ffffffff1660e01b81526004016115f891906001600160a01b0391909116815260200190565b611bea61240a565b8260011415611bff5760689190915560695550565b8260021415611c1457606a91909155606b5550565b826003141561176757606c91909155606d5550565b611c3161240a565b6001600160a01b0381166000908152607c602052604090205460ff16611c995760405162461bcd60e51b815260206004820152601e60248201527f41646472657373206973206e6f7420612076616c69642063616c6c65722e000060448201526064016106e4565b6001600160a01b03166000908152607c60205260409020805460ff19169055565b600080611cc684610ce2565b91509150600082118015611cda5750600081115b611d265760405162461bcd60e51b815260206004820152601960248201527f5072696365206d757374206265206d6f7265207468616e20300000000000000060448201526064016106e4565b611d318484336124b6565b606554604051631e71e43560e01b81526001600160a01b0390911690631e71e43590611d6390339086906004016134b8565b600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b50506067546085546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101869052911692506323b872dd91506064016020604051808303816000875af1158015611df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1491906134e6565b50611e1f3385612653565b336000908152607b6020526040902054841115611e4957336000908152607b602052604090208490555b6000611e5533866126e3565b9050611e6083612882565b606f5460405163ef134a5f60e01b81523360048201526024810183905260448101879052606481018590526000916001600160a01b03169063ef134a5f906084016020604051808303816000875af1158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee49190613517565b9050611ef2338388846128b3565b607754604051637854462960e01b81523360048201526001600160a01b0390911690637854462990602401600060405180830381865afa158015611f3a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f6291908101906135f3565b60600151611fd8576077546040516339f5e15760e01b81523360048201526001600160a01b03909116906339f5e157906024016020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112589190613517565b505050505050565b611fe861240a565b6001600160a01b03811661204d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e4565b610cdf81612464565b600054610100900460ff16158080156120765750600054600160ff909116105b806120905750303b158015612090575060005460ff166001145b6120f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106e4565b6000805460ff191660011790558015612116576000805461ff0019166101001790555b61211e612ef1565b606580546001600160a01b038088166001600160a01b031992831617909255606680548784169083161790556067805486841690831617905560778054928516928216929092179091556085805490911673f18dd3538362d890cd13e06e6688ab7288ea764f179055633b9aca006083819055670de0b6b3a76400006084556121a9906103e8613460565b6068556084546121ba906064613460565b6069556083546121cc90612710613460565b606a556084546121de906103e8613460565b606b556083546121f190620186a0613460565b606c5560845461220390612710613460565b606d55620186a060805561012c7f7afe9ba6764d98c6df14cc42f8e5ed95785704349c2ecc924e88cd230fc9ab7581905560647f08ca9dc48bce965d6f2f007711a9a92fa846b7d0efba56f78a29fe4b61a185d7819055600a7ff5600a943bce9b35b0c4adf419273389e664dbeb51324b92eba59a81caa2ca118190557f57d9663c02d8eb0b99c4a71b2749807eef71f465a7af3de873de3d7c68e90b41929092557f125ff6911def68700928aef26fba6eadb111f08ee8d391f09b2803312a3fa11d557f2c748d7cdfe52e800f46e51cb67b2f0fc77558b8617942a194e0158f17eafffe8190556033546001600160a01b03166000908152607c60205260409020805460ff191660011790556081558015610c82576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b61236761240a565b607780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163b1561240657604051627b270560e31b81526001600160a01b038316906303d93828906123c690309085906004016134b8565b6020604051808303816000875af1925050508015612401575060408051601f3d908101601f191682019092526123fe918101906134e6565b60015b611767575b5050565b6033546001600160a01b031633146113055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e4565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b607d546124c69062015180613577565b421061254f5760005b600381101561252a57607e60006124e7836001613577565b815260200190815260200160002054607f60008360016125079190613577565b8152602081019190915260400160002055806125228161355c565b9150506124cf565b50607d5461253b5742607d5561254f565b607d5461254b9062015180613577565b607d555b81156125d4576000828152608260205260409020546001600160a01b038281169116146125b45760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b210283937b6b79021b7b2329760691b60448201526064016106e4565b50600090815260826020526040902080546001600160a01b031916905550565b6000838152607f602052604090205461262f5760405162461bcd60e51b815260206004820152601760248201527f52656163686564206c696d6974206f662071756f74612e00000000000000000060448201526064016106e4565b6000838152607f60205260408120805491612649836136a7565b9190505550505050565b8060011415612689576001600160a01b03821660009081526078602052604081208054916126808361355c565b91905055505050565b80600214156126b6576001600160a01b03821660009081526079602052604081208054916126808361355c565b8060031415612406576001600160a01b0382166000908152607a602052604081208054916126808361355c565b60008160031415612774576001600160a01b0383166000908152607a6020526040902054600a101561271857506104b0610c1d565b6001600160a01b0383166000908152607a6020526040902054600510801561275857506001600160a01b0383166000908152607a6020526040902054600b115b15612766575061044c610c1d565b506103e8610c1d565b610c1d565b81600214156127fb576001600160a01b038316600090815260796020526040902054600a10156127a657506078610c1d565b6001600160a01b03831660009081526079602052604090205460051080156127e657506001600160a01b038316600090815260796020526040902054600b115b156127f35750606e610c1d565b506064610c1d565b8160011415610c1d576001600160a01b038316600090815260786020526040902054600a101561282d5750600c610c1d565b6001600160a01b038316600090815260786020526040902054600510801561286d57506001600160a01b038316600090815260786020526040902054600b115b1561287a5750600b610c1d565b50600a610c1d565b60665460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d6890602401610c54565b607754604051631c8a1fb760e21b81526000916001600160a01b0316906372287edc906128e79088906006906004016134b8565b600060405180830381865afa158015612904573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261292c91908101906136be565b905060005b8151811015611fd85760006001600160a01b031682828151811061295757612957613501565b60200260200101516001600160a01b031614612edf5760006129b785607b600086868151811061298957612989613501565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612f20565b606f5484519192506001600160a01b03169063b362725d908590859081106129e1576129e1613501565b60200260200101516040518263ffffffff1660e01b8152600401612a1491906001600160a01b0391909116815260200190565b602060405180830381865afa158015612a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5591906134e6565b151560011415612df057600282118015612b0b575060775483516001600160a01b039091169063746edc9e90859085908110612a9357612a93613501565b60200260200101516040518263ffffffff1660e01b8152600401612ac691906001600160a01b0391909116815260200190565b6020604051808303816000875af1158015612ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0991906134e6565b155b15612c02577f087111a51dd309c304c481ef791a6cebd4d033e7c27f2adf2f2d0af400f73a108488858581518110612b4557612b45613501565b6020026020010151856001612b5a9190613577565b858b60768981548110612b6f57612b6f613501565b6000918252602091829020015460408051634231a2c360e01b815290516001600160a01b0390921692634231a2c3926004808401938290030181865afa158015612bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be19190613517565b604051612bf497969594939291906136fb565b60405180910390a150612edf565b600060768381548110612c1757612c17613501565b60009182526020909120015484516001600160a01b039091169063ef75c38690869086908110612c4957612c49613501565b60209081029190910101516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018a9052604481018590526064016020604051808303816000875af1158015612ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccc9190613517565b90507fb94a08333baf9b3f9b10bc5d885893b4889cd7e9b376c8b5de26ef8b14fd2d1385828a878781518110612d0457612d04613501565b6020026020010151876001612d199190613577565b878d60768b81548110612d2e57612d2e613501565b6000918252602091829020015460408051634231a2c360e01b815290516001600160a01b0390921692634231a2c3926004808401938290030181865afa158015612d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da09190613517565b6040805198895260208901979097526001600160a01b0395861696880196909652939092166060860152608085015260a084015260c083015260e08201526101000160405180910390a150612edd565b7f087111a51dd309c304c481ef791a6cebd4d033e7c27f2adf2f2d0af400f73a108488858581518110612e2557612e25613501565b6020026020010151856001612e3a9190613577565b858b60768981548110612e4f57612e4f613501565b6000918252602091829020015460408051634231a2c360e01b815290516001600160a01b0390921692634231a2c3926004808401938290030181865afa158015612e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec19190613517565b604051612ed497969594939291906136fb565b60405180910390a15b505b80612ee98161355c565b915050612931565b600054610100900460ff16612f185760405162461bcd60e51b81526004016106e490613737565b611305612fd6565b60008260011415612f5e578160011415612f3c57506014610c1d565b8160021415612f4d5750601e610c1d565b816003141561276f57506028610c1d565b8260021415612f9a578160011415612f785750601e610c1d565b8160021415612f895750602d610c1d565b816003141561276f57506032610c1d565b8260031415610c1d578160011415612fb457506028610c1d565b8160021415612fc55750603c610c1d565b8160031415610c1d57506050610c1d565b600054610100900460ff16612ffd5760405162461bcd60e51b81526004016106e490613737565b61130533612464565b6001600160a01b0381168114610cdf57600080fd5b6000806040838503121561302e57600080fd5b823561303981613006565b946020939093013593505050565b60006020828403121561305957600080fd5b5035919050565b60008060008060008060c0878903121561307957600080fd5b863561308481613006565b9550602087013561309481613006565b945060408701356130a481613006565b935060608701356130b481613006565b925060808701356130c481613006565b915060a08701356130d481613006565b809150509295509295509295565b6000602082840312156130f457600080fd5b81356130ff81613006565b9392505050565b6000806040838503121561311957600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561316757613167613128565b604052919050565b600067ffffffffffffffff82111561318957613189613128565b5060051b60200190565b600082601f8301126131a457600080fd5b813560206131b96131b48361316f565b61313e565b82815260059290921b840181019181810190868411156131d857600080fd5b8286015b848110156131fc5780356131ef81613006565b83529183019183016131dc565b509695505050505050565b600082601f83011261321857600080fd5b813560206132286131b48361316f565b82815260059290921b8401810191818101908684111561324757600080fd5b8286015b848110156131fc578035835291830191830161324b565b60008060006060848603121561327757600080fd5b833567ffffffffffffffff8082111561328f57600080fd5b61329b87838801613193565b945060208601359150808211156132b157600080fd5b6132bd87838801613207565b935060408601359150808211156132d357600080fd5b506132e086828701613207565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561332257835183529284019291840191600101613306565b50909695505050505050565b6000806040838503121561334157600080fd5b823567ffffffffffffffff8082111561335957600080fd5b61336586838701613193565b9350602085013591508082111561337b57600080fd5b5061338885828601613207565b9150509250929050565b600080604083850312156133a557600080fd5b8235915060208301356133b781613006565b809150509250929050565b6000806000606084860312156133d757600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561340457600080fd5b843561340f81613006565b9350602085013561341f81613006565b9250604085013561342f81613006565b9150606085013561343f81613006565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561347a5761347a61344a565b500290565b60008261349c57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156134b3576134b361344a565b500390565b6001600160a01b03929092168252602082015260400190565b805180151581146134e157600080fd5b919050565b6000602082840312156134f857600080fd5b6130ff826134d1565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561352957600080fd5b5051919050565b6000806040838503121561354357600080fd5b82519150613553602084016134d1565b90509250929050565b60006000198214156135705761357061344a565b5060010190565b6000821982111561358a5761358a61344a565b500190565b600082601f8301126135a057600080fd5b815160206135b06131b48361316f565b82815260059290921b840181019181810190868411156135cf57600080fd5b8286015b848110156131fc5780516135e681613006565b83529183019183016135d3565b60006020828403121561360557600080fd5b815167ffffffffffffffff8082111561361d57600080fd5b908301906080828603121561363157600080fd5b60405160808101818110838211171561364c5761364c613128565b604052613658836134d1565b8152602083015161366881613006565b602082015260408301518281111561367f57600080fd5b61368b8782860161358f565b6040830152506060830151606082015280935050505092915050565b6000816136b6576136b661344a565b506000190190565b6000602082840312156136d057600080fd5b815167ffffffffffffffff8111156136e757600080fd5b6136f38482850161358f565b949350505050565b9687526001600160a01b0395861660208801529390941660408601526060850191909152608084015260a083019190915260c082015260e00190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220890d1d0b553ec84fc6426df862a605a0fc5f83a7b8251ecb11a53e5d1985d63964736f6c634300080c0033