MATIC Price: $1.03 (-2.45%)
Gas: 127 GWei
 

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

MATIC Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
0x60806040449109262023-07-10 12:54:30235 days 54 mins ago1688993670IN
 Create: Staking
0 MATIC0.59259944155.42886807

Parent Txn Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Staking

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at polygonscan.com on 2023-07-10
*/

pragma solidity >=0.7.0 <0.9.0;
// SPDX-License-Identifier: MIT

/**
 * Generated by : https://www.cues.sg
 * Cues.sg : We make technology accessible.
 * Contract Type : Staking
*/

interface Nft_SSOPass{
	function balanceOf(address owner) external view returns (uint256);
}

interface ERC20{
	function balanceOf(address account) external view returns (uint256);
	function transfer(address recipient, uint256 amount) external returns (bool);
	function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

contract Staking {

	address owner;
	uint256 public principalAmtInBank = uint256(0);
	struct record1 { uint256 stakeTime; uint256 stakeAmt; uint256 lastUpdateTime; uint256 accumulatedInterestToUpdateTime; uint256 amtWithdrawn; }
	mapping(address => record1) public informationAboutStakeScheme1;
	mapping(uint256 => address) public addressStore1;
	uint256 public numberOfAddressesCurrentlyStaked1 = uint256(0);
	uint256 public totalWithdrawals1 = uint256(0);
	struct record2 { uint256 stakeTime; uint256 stakeAmt; uint256 lastUpdateTime; uint256 accumulatedInterestToUpdateTime; uint256 amtWithdrawn; }
	mapping(address => record2) public informationAboutStakeScheme2;
	mapping(uint256 => address) public addressStore2;
	uint256 public numberOfAddressesCurrentlyStaked2 = uint256(0);
	uint256 public totalWithdrawals2 = uint256(0);
	struct record3 { uint256 stakeTime; uint256 stakeAmt; uint256 lastUpdateTime; uint256 accumulatedInterestToUpdateTime; }
	mapping(address => record3) public informationAboutStakeScheme3;
	mapping(uint256 => address) public addressStore3;
	uint256 public numberOfAddressesCurrentlyStaked3 = uint256(0);
	uint256 public totalWithdrawals3 = uint256(0);
	event Staked (address indexed account);
	event Unstaked (address indexed account);

	constructor() {
		owner = 0xBDCBD23316AAA2aDecA774e107868adCE38cC69E;
	}

	//This function allows the owner to specify an address that will take over ownership rights instead. Please double check the address provided as once the function is executed, only the new owner will be able to change the address back.
	function changeOwner(address _newOwner) public onlyOwner {
		owner = _newOwner;
	}

	modifier onlyOwner() {
		require(msg.sender == owner);
		_;
	}

	function minUIntPair(uint _i, uint _j) internal pure returns (uint){
		if (_i < _j){
			return _i;
		}else{
			return _j;
		}
	}

/**
 * Function stake1
 * Daily Interest Rate : 0.2
 * Address Map : informationAboutStakeScheme1
 * The function takes in 1 variable, (zero or a positive integer) _stakeAmt. It can be called by functions both inside and outside of this contract. It does the following :
 * checks that _stakeAmt is strictly greater than 0
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme1 with element the address that called this function
 * if (thisRecord with element stakeAmt) is equals to 0 then (updates informationAboutStakeScheme1 (Element the address that called this function) as Struct comprising current time, _stakeAmt, current time, 0, 0; then updates addressStore1 (Element numberOfAddressesCurrentlyStaked1) as the address that called this function; and then updates numberOfAddressesCurrentlyStaked1 as (numberOfAddressesCurrentlyStaked1) + (1)) otherwise (updates informationAboutStakeScheme1 (Element the address that called this function) as Struct comprising current time, ((thisRecord with element stakeAmt) + (_stakeAmt)), current time, ((thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((10000) * (864)))) - (thisRecord with element lastUpdateTime)) * (2000)) / (86400000000))), (thisRecord with element amtWithdrawn))
 * calls ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at transferFrom function  with variable sender as (the address that called this function), variable recipient as (the address of this contract), variable amount as _stakeAmt
 * emits event Staked with inputs the address that called this function
*/
	function stake1(uint256 _stakeAmt) public {
		require((_stakeAmt > uint256(0)), "Staked amount needs to be greater than 0");
		record1 memory thisRecord = informationAboutStakeScheme1[msg.sender];
		if ((thisRecord.stakeAmt == uint256(0))){
			informationAboutStakeScheme1[msg.sender]  = record1 (block.timestamp, _stakeAmt, block.timestamp, uint256(0), uint256(0));
			addressStore1[numberOfAddressesCurrentlyStaked1]  = msg.sender;
			numberOfAddressesCurrentlyStaked1  = (numberOfAddressesCurrentlyStaked1 + uint256(1));
		}else{
			informationAboutStakeScheme1[msg.sender]  = record1 (block.timestamp, (thisRecord.stakeAmt + _stakeAmt), block.timestamp, (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(10000) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(2000)) / uint256(86400000000))), thisRecord.amtWithdrawn);
		}
		ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).transferFrom(msg.sender, address(this), _stakeAmt);
		emit Staked(msg.sender);
	}

/**
 * Function unstake1
 * The function takes in 1 variable, (zero or a positive integer) _unstakeAmt. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme1 with element the address that called this function
 * checks that _unstakeAmt is less than or equals to (thisRecord with element stakeAmt)
 * creates an internal variable newAccum with initial value (thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((10000) * (864)))) - (thisRecord with element lastUpdateTime)) * (2000)) / (86400000000))
 * creates an internal variable interestToRemove with initial value ((newAccum) * (_unstakeAmt)) / (thisRecord with element stakeAmt)
 * updates principalAmtInBank as (principalAmtInBank) + (((_unstakeAmt) * (1000000) * (100)) / (100000000))
 * if _unstakeAmt is equals to (thisRecord with element stakeAmt) then (repeat numberOfAddressesCurrentlyStaked1 times with loop variable i0 :  (if (addressStore1 with element Loop Variable i0) is equals to (the address that called this function) then (updates addressStore1 (Element Loop Variable i0) as addressStore1 with element (numberOfAddressesCurrentlyStaked1) - (1); then updates numberOfAddressesCurrentlyStaked1 as (numberOfAddressesCurrentlyStaked1) - (1); and then terminates the for-next loop)))
 * updates informationAboutStakeScheme1 (Element the address that called this function) as Struct comprising (thisRecord with element stakeTime), ((thisRecord with element stakeAmt) - (_unstakeAmt)), current time, ((newAccum) - (interestToRemove)), ((thisRecord with element amtWithdrawn) + (interestToRemove))
 * emits event Unstaked with inputs the address that called this function
 * checks that (ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to interestToRemove
 * if interestToRemove is strictly greater than 0 then (calls ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at transfer function  with variable recipient as (the address that called this function), variable amount as interestToRemove)
 * checks that (ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000))
 * if (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000)) is strictly greater than 0 then (calls ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at transfer function  with variable recipient as (the address that called this function), variable amount as (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000)))
 * updates totalWithdrawals1 as (totalWithdrawals1) + (interestToRemove)
*/
	function unstake1(uint256 _unstakeAmt) public {
		record1 memory thisRecord = informationAboutStakeScheme1[msg.sender];
		require((_unstakeAmt <= thisRecord.stakeAmt), "Withdrawing more than staked amount");
		uint256 newAccum = (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(10000) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(2000)) / uint256(86400000000)));
		uint256 interestToRemove = ((newAccum * _unstakeAmt) / thisRecord.stakeAmt);
		principalAmtInBank  = (principalAmtInBank + ((_unstakeAmt * uint256(1000000) * uint256(100)) / uint256(100000000)));
		if ((_unstakeAmt == thisRecord.stakeAmt)){
			for (uint i0 = 0; i0 < numberOfAddressesCurrentlyStaked1; i0++){
				if ((addressStore1[i0] == msg.sender)){
					addressStore1[i0]  = addressStore1[(numberOfAddressesCurrentlyStaked1 - uint256(1))];
					numberOfAddressesCurrentlyStaked1  = (numberOfAddressesCurrentlyStaked1 - uint256(1));
					break;
				}
			}
		}
		informationAboutStakeScheme1[msg.sender]  = record1 (thisRecord.stakeTime, (thisRecord.stakeAmt - _unstakeAmt), block.timestamp, (newAccum - interestToRemove), (thisRecord.amtWithdrawn + interestToRemove));
		emit Unstaked(msg.sender);
		require((ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).balanceOf(address(this)) >= interestToRemove), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((interestToRemove > uint256(0))){
			ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).transfer(msg.sender, interestToRemove);
		}
		require((ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).balanceOf(address(this)) >= ((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000))), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000)) > uint256(0))){
			ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).transfer(msg.sender, ((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000)));
		}
		totalWithdrawals1  = (totalWithdrawals1 + interestToRemove);
	}

/**
 * Function interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1
 * The function takes in 1 variable, (an address) _address. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme1 with element _address
 * returns (thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((10000) * (864)))) - (thisRecord with element lastUpdateTime)) * (2000)) / (86400000000)) as output
*/
	function interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1(address _address) public view returns (uint256) {
		record1 memory thisRecord = informationAboutStakeScheme1[_address];
		return (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(10000) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(2000)) / uint256(86400000000)));
	}

/**
 * Function totalStakedAmount1
 * The function takes in 0 variables. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable total with initial value 0
 * repeat numberOfAddressesCurrentlyStaked1 times with loop variable i0 :  (creates an internal variable thisRecord with initial value informationAboutStakeScheme1 with element addressStore1 with element Loop Variable i0; and then updates total as (total) + (thisRecord with element stakeAmt))
 * returns total as output
*/
	function totalStakedAmount1() public view returns (uint256) {
		uint256 total = uint256(0);
		for (uint i0 = 0; i0 < numberOfAddressesCurrentlyStaked1; i0++){
			record1 memory thisRecord = informationAboutStakeScheme1[addressStore1[i0]];
			total  = (total + thisRecord.stakeAmt);
		}
		return total;
	}

/**
 * Function totalAccumulatedInterest1
 * The function takes in 0 variables. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable total with initial value 0
 * repeat numberOfAddressesCurrentlyStaked1 times with loop variable i0 :  (updates total as (total) + (interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1 with variable _address as (addressStore1 with element Loop Variable i0)))
 * returns total as output
*/
	function totalAccumulatedInterest1() public view returns (uint256) {
		uint256 total = uint256(0);
		for (uint i0 = 0; i0 < numberOfAddressesCurrentlyStaked1; i0++){
			total  = (total + interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1(addressStore1[i0]));
		}
		return total;
	}

/**
 * Function withdrawInterestWithoutUnstaking1
 * The function takes in 1 variable, (zero or a positive integer) _withdrawalAmt. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable totalInterestEarnedTillNow with initial value interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1 with variable _address as (the address that called this function)
 * checks that _withdrawalAmt is less than or equals to totalInterestEarnedTillNow
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme1 with element the address that called this function
 * updates informationAboutStakeScheme1 (Element the address that called this function) as Struct comprising (thisRecord with element stakeTime), (thisRecord with element stakeAmt), (minimum of current time, ((thisRecord with element stakeTime) + ((10000) * (864)))), ((totalInterestEarnedTillNow) - (_withdrawalAmt)), ((thisRecord with element amtWithdrawn) + (_withdrawalAmt))
 * checks that (ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to _withdrawalAmt
 * if _withdrawalAmt is strictly greater than 0 then (calls ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at transfer function  with variable recipient as (the address that called this function), variable amount as _withdrawalAmt)
 * updates totalWithdrawals1 as (totalWithdrawals1) + (_withdrawalAmt)
*/
	function withdrawInterestWithoutUnstaking1(uint256 _withdrawalAmt) public {
		uint256 totalInterestEarnedTillNow = interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1(msg.sender);
		require((_withdrawalAmt <= totalInterestEarnedTillNow), "Withdrawn amount must be less than withdrawable amount");
		record1 memory thisRecord = informationAboutStakeScheme1[msg.sender];
		informationAboutStakeScheme1[msg.sender]  = record1 (thisRecord.stakeTime, thisRecord.stakeAmt, minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(10000) * uint256(864)))), (totalInterestEarnedTillNow - _withdrawalAmt), (thisRecord.amtWithdrawn + _withdrawalAmt));
		require((ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).balanceOf(address(this)) >= _withdrawalAmt), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((_withdrawalAmt > uint256(0))){
			ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).transfer(msg.sender, _withdrawalAmt);
		}
		totalWithdrawals1  = (totalWithdrawals1 + _withdrawalAmt);
	}

/**
 * Function withdrawAllInterestWithoutUnstaking1
 * The function takes in 0 variables. It can only be called by functions outside of this contract. It does the following :
 * calls withdrawInterestWithoutUnstaking1 with variable _withdrawalAmt as (interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1 with variable _address as (the address that called this function))
*/
	function withdrawAllInterestWithoutUnstaking1() external {
		withdrawInterestWithoutUnstaking1(interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1(msg.sender));
	}

/**
 * Function stake2
 * Daily Interest Rate : 0.11
 * Address Map : informationAboutStakeScheme2
 * The function takes in 1 variable, (zero or a positive integer) _stakeAmt. It can be called by functions both inside and outside of this contract. It does the following :
 * checks that _stakeAmt is strictly greater than 0
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme2 with element the address that called this function
 * if (thisRecord with element stakeAmt) is equals to 0 then (updates informationAboutStakeScheme2 (Element the address that called this function) as Struct comprising current time, _stakeAmt, current time, 0, 0; then updates addressStore2 (Element numberOfAddressesCurrentlyStaked2) as the address that called this function; and then updates numberOfAddressesCurrentlyStaked2 as (numberOfAddressesCurrentlyStaked2) + (1)) otherwise (updates informationAboutStakeScheme2 (Element the address that called this function) as Struct comprising current time, ((thisRecord with element stakeAmt) + (_stakeAmt)), current time, ((thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((36500) * (864)))) - (thisRecord with element lastUpdateTime)) * (1100)) / (86400000000))), (thisRecord with element amtWithdrawn))
 * calls ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at transferFrom function  with variable sender as (the address that called this function), variable recipient as (the address of this contract), variable amount as _stakeAmt
 * emits event Staked with inputs the address that called this function
*/
	function stake2(uint256 _stakeAmt) public {
		require((_stakeAmt > uint256(0)), "Staked amount needs to be greater than 0");
		record2 memory thisRecord = informationAboutStakeScheme2[msg.sender];
		if ((thisRecord.stakeAmt == uint256(0))){
			informationAboutStakeScheme2[msg.sender]  = record2 (block.timestamp, _stakeAmt, block.timestamp, uint256(0), uint256(0));
			addressStore2[numberOfAddressesCurrentlyStaked2]  = msg.sender;
			numberOfAddressesCurrentlyStaked2  = (numberOfAddressesCurrentlyStaked2 + uint256(1));
		}else{
			informationAboutStakeScheme2[msg.sender]  = record2 (block.timestamp, (thisRecord.stakeAmt + _stakeAmt), block.timestamp, (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(36500) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(1100)) / uint256(86400000000))), thisRecord.amtWithdrawn);
		}
		ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).transferFrom(msg.sender, address(this), _stakeAmt);
		emit Staked(msg.sender);
	}

/**
 * Function unstake2
 * The function takes in 1 variable, (zero or a positive integer) _unstakeAmt. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme2 with element the address that called this function
 * checks that _unstakeAmt is less than or equals to (thisRecord with element stakeAmt)
 * creates an internal variable newAccum with initial value (thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((36500) * (864)))) - (thisRecord with element lastUpdateTime)) * (1100)) / (86400000000))
 * creates an internal variable interestToRemove with initial value ((newAccum) * (_unstakeAmt)) / (thisRecord with element stakeAmt)
 * updates principalAmtInBank as (principalAmtInBank) + (((_unstakeAmt) * (1000000) * (100)) / (100000000))
 * if _unstakeAmt is equals to (thisRecord with element stakeAmt) then (repeat numberOfAddressesCurrentlyStaked2 times with loop variable i0 :  (if (addressStore2 with element Loop Variable i0) is equals to (the address that called this function) then (updates addressStore2 (Element Loop Variable i0) as addressStore2 with element (numberOfAddressesCurrentlyStaked2) - (1); then updates numberOfAddressesCurrentlyStaked2 as (numberOfAddressesCurrentlyStaked2) - (1); and then terminates the for-next loop)))
 * updates informationAboutStakeScheme2 (Element the address that called this function) as Struct comprising (thisRecord with element stakeTime), ((thisRecord with element stakeAmt) - (_unstakeAmt)), current time, ((newAccum) - (interestToRemove)), ((thisRecord with element amtWithdrawn) + (interestToRemove))
 * emits event Unstaked with inputs the address that called this function
 * checks that (ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to interestToRemove
 * if interestToRemove is strictly greater than 0 then (calls ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at transfer function  with variable recipient as (the address that called this function), variable amount as interestToRemove)
 * checks that (ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000))
 * if (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000)) is strictly greater than 0 then (calls ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at transfer function  with variable recipient as (the address that called this function), variable amount as (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000)))
 * updates totalWithdrawals2 as (totalWithdrawals2) + (interestToRemove)
*/
	function unstake2(uint256 _unstakeAmt) public {
		record2 memory thisRecord = informationAboutStakeScheme2[msg.sender];
		require((_unstakeAmt <= thisRecord.stakeAmt), "Withdrawing more than staked amount");
		uint256 newAccum = (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(36500) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(1100)) / uint256(86400000000)));
		uint256 interestToRemove = ((newAccum * _unstakeAmt) / thisRecord.stakeAmt);
		principalAmtInBank  = (principalAmtInBank + ((_unstakeAmt * uint256(1000000) * uint256(100)) / uint256(100000000)));
		if ((_unstakeAmt == thisRecord.stakeAmt)){
			for (uint i0 = 0; i0 < numberOfAddressesCurrentlyStaked2; i0++){
				if ((addressStore2[i0] == msg.sender)){
					addressStore2[i0]  = addressStore2[(numberOfAddressesCurrentlyStaked2 - uint256(1))];
					numberOfAddressesCurrentlyStaked2  = (numberOfAddressesCurrentlyStaked2 - uint256(1));
					break;
				}
			}
		}
		informationAboutStakeScheme2[msg.sender]  = record2 (thisRecord.stakeTime, (thisRecord.stakeAmt - _unstakeAmt), block.timestamp, (newAccum - interestToRemove), (thisRecord.amtWithdrawn + interestToRemove));
		emit Unstaked(msg.sender);
		require((ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).balanceOf(address(this)) >= interestToRemove), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((interestToRemove > uint256(0))){
			ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).transfer(msg.sender, interestToRemove);
		}
		require((ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).balanceOf(address(this)) >= ((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000))), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000)) > uint256(0))){
			ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).transfer(msg.sender, ((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000)));
		}
		totalWithdrawals2  = (totalWithdrawals2 + interestToRemove);
	}

/**
 * Function interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2
 * The function takes in 1 variable, (an address) _address. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme2 with element _address
 * returns (thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((36500) * (864)))) - (thisRecord with element lastUpdateTime)) * (1100)) / (86400000000)) as output
*/
	function interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2(address _address) public view returns (uint256) {
		record2 memory thisRecord = informationAboutStakeScheme2[_address];
		return (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(36500) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(1100)) / uint256(86400000000)));
	}

/**
 * Function totalStakedAmount2
 * The function takes in 0 variables. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable total with initial value 0
 * repeat numberOfAddressesCurrentlyStaked2 times with loop variable i0 :  (creates an internal variable thisRecord with initial value informationAboutStakeScheme2 with element addressStore2 with element Loop Variable i0; and then updates total as (total) + (thisRecord with element stakeAmt))
 * returns total as output
*/
	function totalStakedAmount2() public view returns (uint256) {
		uint256 total = uint256(0);
		for (uint i0 = 0; i0 < numberOfAddressesCurrentlyStaked2; i0++){
			record2 memory thisRecord = informationAboutStakeScheme2[addressStore2[i0]];
			total  = (total + thisRecord.stakeAmt);
		}
		return total;
	}

/**
 * Function totalAccumulatedInterest2
 * The function takes in 0 variables. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable total with initial value 0
 * repeat numberOfAddressesCurrentlyStaked2 times with loop variable i0 :  (updates total as (total) + (interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2 with variable _address as (addressStore2 with element Loop Variable i0)))
 * returns total as output
*/
	function totalAccumulatedInterest2() public view returns (uint256) {
		uint256 total = uint256(0);
		for (uint i0 = 0; i0 < numberOfAddressesCurrentlyStaked2; i0++){
			total  = (total + interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2(addressStore2[i0]));
		}
		return total;
	}

/**
 * Function withdrawInterestWithoutUnstaking2
 * The function takes in 1 variable, (zero or a positive integer) _withdrawalAmt. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable totalInterestEarnedTillNow with initial value interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2 with variable _address as (the address that called this function)
 * checks that _withdrawalAmt is less than or equals to totalInterestEarnedTillNow
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme2 with element the address that called this function
 * updates informationAboutStakeScheme2 (Element the address that called this function) as Struct comprising (thisRecord with element stakeTime), (thisRecord with element stakeAmt), (minimum of current time, ((thisRecord with element stakeTime) + ((36500) * (864)))), ((totalInterestEarnedTillNow) - (_withdrawalAmt)), ((thisRecord with element amtWithdrawn) + (_withdrawalAmt))
 * checks that (ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to _withdrawalAmt
 * if _withdrawalAmt is strictly greater than 0 then (calls ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at transfer function  with variable recipient as (the address that called this function), variable amount as _withdrawalAmt)
 * updates totalWithdrawals2 as (totalWithdrawals2) + (_withdrawalAmt)
*/
	function withdrawInterestWithoutUnstaking2(uint256 _withdrawalAmt) public {
		uint256 totalInterestEarnedTillNow = interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2(msg.sender);
		require((_withdrawalAmt <= totalInterestEarnedTillNow), "Withdrawn amount must be less than withdrawable amount");
		record2 memory thisRecord = informationAboutStakeScheme2[msg.sender];
		informationAboutStakeScheme2[msg.sender]  = record2 (thisRecord.stakeTime, thisRecord.stakeAmt, minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(36500) * uint256(864)))), (totalInterestEarnedTillNow - _withdrawalAmt), (thisRecord.amtWithdrawn + _withdrawalAmt));
		require((ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).balanceOf(address(this)) >= _withdrawalAmt), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((_withdrawalAmt > uint256(0))){
			ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).transfer(msg.sender, _withdrawalAmt);
		}
		totalWithdrawals2  = (totalWithdrawals2 + _withdrawalAmt);
	}

/**
 * Function withdrawAllInterestWithoutUnstaking2
 * The function takes in 0 variables. It can only be called by functions outside of this contract. It does the following :
 * calls withdrawInterestWithoutUnstaking2 with variable _withdrawalAmt as (interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2 with variable _address as (the address that called this function))
*/
	function withdrawAllInterestWithoutUnstaking2() external {
		withdrawInterestWithoutUnstaking2(interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2(msg.sender));
	}

/**
 * Function stake3
 * Daily Interest Rate : 0.22
 * Address Map : informationAboutStakeScheme3
 * The function takes in 1 variable, (zero or a positive integer) _stakeAmt. It can be called by functions both inside and outside of this contract. It does the following :
 * checks that _stakeAmt is strictly greater than 0
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme3 with element the address that called this function
 * if (thisRecord with element stakeAmt) is equals to 0 then (updates informationAboutStakeScheme3 (Element the address that called this function) as Struct comprising current time, _stakeAmt, current time, 0; then updates addressStore3 (Element numberOfAddressesCurrentlyStaked3) as the address that called this function; and then updates numberOfAddressesCurrentlyStaked3 as (numberOfAddressesCurrentlyStaked3) + (1)) otherwise (updates informationAboutStakeScheme3 (Element the address that called this function) as Struct comprising current time, ((thisRecord with element stakeAmt) + (_stakeAmt)), current time, ((thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((30000) * (864)))) - (thisRecord with element lastUpdateTime)) * (2200)) / (86400000000))))
 * calls ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at transferFrom function  with variable sender as (the address that called this function), variable recipient as (the address of this contract), variable amount as _stakeAmt
 * checks that (Contract with variables (the address that called this function)) is strictly greater than 0
 * emits event Staked with inputs the address that called this function
*/
	function stake3(uint256 _stakeAmt) public {
		require((_stakeAmt > uint256(0)), "Staked amount needs to be greater than 0");
		record3 memory thisRecord = informationAboutStakeScheme3[msg.sender];
		if ((thisRecord.stakeAmt == uint256(0))){
			informationAboutStakeScheme3[msg.sender]  = record3 (block.timestamp, _stakeAmt, block.timestamp, uint256(0));
			addressStore3[numberOfAddressesCurrentlyStaked3]  = msg.sender;
			numberOfAddressesCurrentlyStaked3  = (numberOfAddressesCurrentlyStaked3 + uint256(1));
		}else{
			informationAboutStakeScheme3[msg.sender]  = record3 (block.timestamp, (thisRecord.stakeAmt + _stakeAmt), block.timestamp, (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(30000) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(2200)) / uint256(86400000000))));
		}
		ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).transferFrom(msg.sender, address(this), _stakeAmt);
		require((Nft_SSOPass(0xDa688ebF6B0cAa9C166fAB3F080975fF573Aa93a).balanceOf(msg.sender) > uint256(0)), "You must hold a StarSeeds Original Pass to use this option. ");
		emit Staked(msg.sender);
	}

/**
 * Function unstake3
 * The function takes in 1 variable, (zero or a positive integer) _unstakeAmt. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme3 with element the address that called this function
 * checks that _unstakeAmt is less than or equals to (thisRecord with element stakeAmt)
 * creates an internal variable newAccum with initial value (thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((30000) * (864)))) - (thisRecord with element lastUpdateTime)) * (2200)) / (86400000000))
 * creates an internal variable interestToRemove with initial value ((newAccum) * (_unstakeAmt)) / (thisRecord with element stakeAmt)
 * updates principalAmtInBank as (principalAmtInBank) + (((_unstakeAmt) * (1000000) * (100)) / (100000000))
 * if _unstakeAmt is equals to (thisRecord with element stakeAmt) then (repeat numberOfAddressesCurrentlyStaked3 times with loop variable i0 :  (if (addressStore3 with element Loop Variable i0) is equals to (the address that called this function) then (updates addressStore3 (Element Loop Variable i0) as addressStore3 with element (numberOfAddressesCurrentlyStaked3) - (1); then updates numberOfAddressesCurrentlyStaked3 as (numberOfAddressesCurrentlyStaked3) - (1); and then terminates the for-next loop)))
 * updates informationAboutStakeScheme3 (Element the address that called this function) as Struct comprising (thisRecord with element stakeTime), ((thisRecord with element stakeAmt) - (_unstakeAmt)), current time, ((newAccum) - (interestToRemove))
 * emits event Unstaked with inputs the address that called this function
 * checks that (ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to interestToRemove
 * if interestToRemove is strictly greater than 0 then (calls ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at transfer function  with variable recipient as (the address that called this function), variable amount as interestToRemove)
 * checks that (ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000))
 * if (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000)) is strictly greater than 0 then (calls ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at transfer function  with variable recipient as (the address that called this function), variable amount as (((_unstakeAmt) * ((1000000) - (1000000))) / (1000000)))
 * updates totalWithdrawals3 as (totalWithdrawals3) + (interestToRemove)
*/
	function unstake3(uint256 _unstakeAmt) public {
		record3 memory thisRecord = informationAboutStakeScheme3[msg.sender];
		require((_unstakeAmt <= thisRecord.stakeAmt), "Withdrawing more than staked amount");
		uint256 newAccum = (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(30000) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(2200)) / uint256(86400000000)));
		uint256 interestToRemove = ((newAccum * _unstakeAmt) / thisRecord.stakeAmt);
		principalAmtInBank  = (principalAmtInBank + ((_unstakeAmt * uint256(1000000) * uint256(100)) / uint256(100000000)));
		if ((_unstakeAmt == thisRecord.stakeAmt)){
			for (uint i0 = 0; i0 < numberOfAddressesCurrentlyStaked3; i0++){
				if ((addressStore3[i0] == msg.sender)){
					addressStore3[i0]  = addressStore3[(numberOfAddressesCurrentlyStaked3 - uint256(1))];
					numberOfAddressesCurrentlyStaked3  = (numberOfAddressesCurrentlyStaked3 - uint256(1));
					break;
				}
			}
		}
		informationAboutStakeScheme3[msg.sender]  = record3 (thisRecord.stakeTime, (thisRecord.stakeAmt - _unstakeAmt), block.timestamp, (newAccum - interestToRemove));
		emit Unstaked(msg.sender);
		require((ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).balanceOf(address(this)) >= interestToRemove), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((interestToRemove > uint256(0))){
			ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).transfer(msg.sender, interestToRemove);
		}
		require((ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).balanceOf(address(this)) >= ((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000))), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000)) > uint256(0))){
			ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).transfer(msg.sender, ((_unstakeAmt * (uint256(1000000) - uint256(1000000))) / uint256(1000000)));
		}
		totalWithdrawals3  = (totalWithdrawals3 + interestToRemove);
	}

/**
 * Function interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn3
 * The function takes in 1 variable, (an address) _address. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable thisRecord with initial value informationAboutStakeScheme3 with element _address
 * returns (thisRecord with element accumulatedInterestToUpdateTime) + (((thisRecord with element stakeAmt) * ((minimum of current time, ((thisRecord with element stakeTime) + ((30000) * (864)))) - (thisRecord with element lastUpdateTime)) * (2200)) / (86400000000)) as output
*/
	function interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn3(address _address) public view returns (uint256) {
		record3 memory thisRecord = informationAboutStakeScheme3[_address];
		return (thisRecord.accumulatedInterestToUpdateTime + ((thisRecord.stakeAmt * (minUIntPair(block.timestamp, (thisRecord.stakeTime + (uint256(30000) * uint256(864)))) - thisRecord.lastUpdateTime) * uint256(2200)) / uint256(86400000000)));
	}

/**
 * Function totalStakedAmount3
 * The function takes in 0 variables. It can be called by functions both inside and outside of this contract. It does the following :
 * creates an internal variable total with initial value 0
 * repeat numberOfAddressesCurrentlyStaked3 times with loop variable i0 :  (creates an internal variable thisRecord with initial value informationAboutStakeScheme3 with element addressStore3 with element Loop Variable i0; and then updates total as (total) + (thisRecord with element stakeAmt))
 * returns total as output
*/
	function totalStakedAmount3() public view returns (uint256) {
		uint256 total = uint256(0);
		for (uint i0 = 0; i0 < numberOfAddressesCurrentlyStaked3; i0++){
			record3 memory thisRecord = informationAboutStakeScheme3[addressStore3[i0]];
			total  = (total + thisRecord.stakeAmt);
		}
		return total;
	}

/**
 * Function principalTaxWithdrawAmt
 * The function takes in 0 variables. It can be called by functions both inside and outside of this contract. It does the following :
 * checks that the function is called by the owner of the contract
 * checks that (ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to principalAmtInBank
 * if principalAmtInBank is strictly greater than 0 then (calls ERC20(Address 0x17840DF7CAa07e298b16E8612157B90ED231C973)'s at transfer function  with variable recipient as (the address that called this function), variable amount as principalAmtInBank)
 * updates principalAmtInBank as 0
*/
	function principalTaxWithdrawAmt() public onlyOwner {
		require((ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).balanceOf(address(this)) >= principalAmtInBank), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((principalAmtInBank > uint256(0))){
			ERC20(address(0x17840DF7CAa07e298b16E8612157B90ED231C973)).transfer(msg.sender, principalAmtInBank);
		}
		principalAmtInBank  = uint256(0);
	}

/**
 * Function withdrawToken
 * The function takes in 1 variable, (zero or a positive integer) _amt. It can be called by functions both inside and outside of this contract. It does the following :
 * checks that the function is called by the owner of the contract
 * checks that (ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at balanceOf function  with variable recipient as (the address of this contract)) is greater than or equals to ((_amt) + (totalAccumulatedInterest1) + (totalAccumulatedInterest2))
 * if _amt is strictly greater than 0 then (calls ERC20(Address 0xD289c01528921B5f6D5B111a50a99456D495bF78)'s at transfer function  with variable recipient as (the address that called this function), variable amount as _amt)
*/
	function withdrawToken(uint256 _amt) public onlyOwner {
		require((ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).balanceOf(address(this)) >= (_amt + totalAccumulatedInterest1() + totalAccumulatedInterest2())), "Insufficient amount of the token in this contract to transfer out. Please contact the contract owner to top up the token.");
		if ((_amt > uint256(0))){
			ERC20(address(0xD289c01528921B5f6D5B111a50a99456D495bF78)).transfer(msg.sender, _amt);
		}
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Unstaked","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressStore1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressStore2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressStore3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"informationAboutStakeScheme1","outputs":[{"internalType":"uint256","name":"stakeTime","type":"uint256"},{"internalType":"uint256","name":"stakeAmt","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"accumulatedInterestToUpdateTime","type":"uint256"},{"internalType":"uint256","name":"amtWithdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"informationAboutStakeScheme2","outputs":[{"internalType":"uint256","name":"stakeTime","type":"uint256"},{"internalType":"uint256","name":"stakeAmt","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"accumulatedInterestToUpdateTime","type":"uint256"},{"internalType":"uint256","name":"amtWithdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"informationAboutStakeScheme3","outputs":[{"internalType":"uint256","name":"stakeTime","type":"uint256"},{"internalType":"uint256","name":"stakeAmt","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"accumulatedInterestToUpdateTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"interestEarnedUpToNowBeforeTaxesAndNotYetWithdrawn3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfAddressesCurrentlyStaked1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfAddressesCurrentlyStaked2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfAddressesCurrentlyStaked3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principalAmtInBank","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principalTaxWithdrawAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeAmt","type":"uint256"}],"name":"stake1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeAmt","type":"uint256"}],"name":"stake2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeAmt","type":"uint256"}],"name":"stake3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAccumulatedInterest1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAccumulatedInterest2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedAmount1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedAmount2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedAmount3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWithdrawals1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWithdrawals2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWithdrawals3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unstakeAmt","type":"uint256"}],"name":"unstake1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unstakeAmt","type":"uint256"}],"name":"unstake2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unstakeAmt","type":"uint256"}],"name":"unstake3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllInterestWithoutUnstaking1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllInterestWithoutUnstaking2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalAmt","type":"uint256"}],"name":"withdrawInterestWithoutUnstaking1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalAmt","type":"uint256"}],"name":"withdrawInterestWithoutUnstaking2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060015560006004556000600555600060085560006009556000600c556000600d5534801561003357600080fd5b5073bdcbd23316aaa2adeca774e107868adce38cc69e6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614370806100976000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063908278d31161011a578063b86b682d116100ad578063c62d46d31161007c578063c62d46d3146105be578063cb5378ff146105f2578063d26639e81461060e578063eaba0b7814610618578063fcc671411461063457610206565b8063b86b682d14610536578063b937220f14610552578063be39817a14610570578063c30eb6b9146105a057610206565b8063a9ae28bb116100e9578063a9ae28bb14610496578063afd23b1c146104b4578063b057d583146104e8578063b81778aa1461050657610206565b8063908278d31461040b57806392f855871461043e5780639e31c35e1461045c578063a6f9dae11461047a57610206565b8063491c42801161019d5780635efbd74e1161016c5780635efbd74e1461038f578063605aadde146103ab578063606fa649146103c7578063686a14b2146103d157806387f583d3146103ed57610206565b8063491c42801461032f5780634ad768ae1461034b57806350baa6221461035557806355faf7be1461037157610206565b80631d554637116101d95780631d554637146102a75780632b9b38f3146102d757806341a5de5d146102f3578063442541b31461031157610206565b80630717d39f1461020b578063083a4c4e146102295780631479de71146102475780631c0a3f9614610277575b600080fd5b610213610664565b6040516102209190613b7b565b60405180910390f35b610231610759565b60405161023e9190613b7b565b60405180910390f35b610261600480360381019061025c9190613bc7565b6107d1565b60405161026e9190613c35565b60405180910390f35b610291600480360381019061028c9190613c7c565b610804565b60405161029e9190613b7b565b60405180910390f35b6102c160048036038101906102bc9190613c7c565b6108f5565b6040516102ce9190613b7b565b60405180910390f35b6102f160048036038101906102ec9190613bc7565b6109f0565b005b6102fb610e67565b6040516103089190613b7b565b60405180910390f35b610319610e6d565b6040516103269190613b7b565b60405180910390f35b61034960048036038101906103449190613bc7565b610e73565b005b6103536115c0565b005b61036f600480360381019061036a9190613bc7565b6115d3565b005b6103796117bf565b6040516103869190613b7b565b60405180910390f35b6103a960048036038101906103a49190613bc7565b611837565b005b6103c560048036038101906103c09190613bc7565b611f5b565b005b6103cf612331565b005b6103eb60048036038101906103e69190613bc7565b612344565b005b6103f5612a91565b6040516104029190613b7b565b60405180910390f35b61042560048036038101906104209190613c7c565b612a97565b6040516104359493929190613ca9565b60405180910390f35b610446612ac7565b6040516104539190613b7b565b60405180910390f35b610464612bbc565b6040516104719190613b7b565b60405180910390f35b610494600480360381019061048f9190613c7c565b612bc2565b005b61049e612c5d565b6040516104ab9190613b7b565b60405180910390f35b6104ce60048036038101906104c99190613c7c565b612c63565b6040516104df959493929190613cee565b60405180910390f35b6104f0612c99565b6040516104fd9190613b7b565b60405180910390f35b610520600480360381019061051b9190613c7c565b612c9f565b60405161052d9190613b7b565b60405180910390f35b610550600480360381019061054b9190613bc7565b612d9a565b005b61055a6130d4565b6040516105679190613b7b565b60405180910390f35b61058a60048036038101906105859190613bc7565b6131bf565b6040516105979190613c35565b60405180910390f35b6105a86131f2565b6040516105b59190613b7b565b60405180910390f35b6105d860048036038101906105d39190613c7c565b6131f8565b6040516105e9959493929190613cee565b60405180910390f35b61060c60048036038101906106079190613bc7565b61322e565b005b610616613568565b005b610632600480360381019061062d9190613bc7565b61373d565b005b61064e60048036038101906106499190613bc7565b613b13565b60405161065b9190613c35565b60405180910390f35b6000806000905060005b600854811015610751576000600660006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905080602001518361073b9190613d70565b925050808061074990613dc6565b91505061066e565b508091505090565b6000806000905060005b6008548110156107c9576107a96007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c9f565b826107b49190613d70565b915080806107c190613dc6565b915050610763565b508091505090565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905064141dd7600061089882604001516108b14261036061753061089d9190613e0e565b86600001516108ac9190613d70565b613b46565b6108bb9190613e68565b83602001516108ca9190613e0e565b6108d49190613e0e565b6108de9190613ecb565b81606001516108ed9190613d70565b915050919050565b600080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905064141dd760006107d082604001516109ac426103606127106109989190613e0e565b86600001516109a79190613d70565b613b46565b6109b69190613e68565b83602001516109c59190613e0e565b6109cf9190613e0e565b6109d99190613ecb565b81606001516109e89190613d70565b915050919050565b60008111610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90613f7f565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000816020015103610baf5760405180608001604052804281526020018381526020014281526020016000815250600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505033600b6000600c54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c54610ba49190613d70565b600c81905550610cbb565b6040518060800160405280428152602001838360200151610bd09190613d70565b815260200142815260200164141dd760006108988460400151610c1142610360617530610bfd9190613e0e565b8860000151610c0c9190613d70565b613b46565b610c1b9190613e68565b8560200151610c2a9190613e0e565b610c349190613e0e565b610c3e9190613ecb565b8360600151610c4d9190613d70565b815250600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050505b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610d0c93929190613f9f565b6020604051808303816000875af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f919061400e565b50600073da688ebf6b0caa9c166fab3f080975ff573aa93a73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610d9f9190613c35565b602060405180830381865afa158015610dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de09190614050565b11610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906140ef565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f77338642d9284a44296d29a273e04b8ab6b15c7d2439094cd460b7e4f0b3307460405160405180910390a25050565b60045481565b60015481565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090508060200151821115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190614181565b60405180910390fd5b600064141dd7600061044c8360400151610f7242610360618e94610f5e9190613e0e565b8760000151610f6d9190613d70565b613b46565b610f7c9190613e68565b8460200151610f8b9190613e0e565b610f959190613e0e565b610f9f9190613ecb565b8260600151610fae9190613d70565b9050600082602001518483610fc39190613e0e565b610fcd9190613ecb565b90506305f5e1006064620f424086610fe59190613e0e565b610fef9190613e0e565b610ff99190613ecb565b6001546110069190613d70565b6001819055508260200151840361114c5760005b60085481101561114a573373ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036111375760076000600160085461109d9190613e68565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160085461112c9190613e68565b60088190555061114a565b808061114290613dc6565b91505061101a565b505b6040518060a00160405280846000015181526020018585602001516111719190613e68565b815260200142815260200182846111889190613e68565b815260200182856080015161119d9190613d70565b815250600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050503373ffffffffffffffffffffffffffffffffffffffff167f908e667f6c2b13b8062954eb100253ea804c21222b190449e40d967a3ac0ff1360405160405180910390a28073d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112a59190613c35565b602060405180830381865afa1580156112c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e69190614050565b1015611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e9061425f565b60405180910390fd5b60008111156113c45773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161137f92919061427f565b6020604051808303816000875af115801561139e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c2919061400e565b505b620f424080620f42406113d79190613e68565b856113e29190613e0e565b6113ec9190613ecb565b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114399190613c35565b602060405180830381865afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190614050565b10156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b29061425f565b60405180910390fd5b6000620f424080620f42406114d09190613e68565b866114db9190613e0e565b6114e59190613ecb565b11156115a6577317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33620f424080620f424061152f9190613e68565b8861153a9190613e0e565b6115449190613ecb565b6040518363ffffffff1660e01b815260040161156192919061427f565b6020604051808303816000875af1158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a4919061400e565b505b806009546115b49190613d70565b60098190555050505050565b6115d16115cc336108f5565b612d9a565b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461162b57600080fd5b611633610759565b61163b6117bf565b826116469190613d70565b6116509190613d70565b73d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161169d9190613c35565b602060405180830381865afa1580156116ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116de9190614050565b101561171f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117169061425f565b60405180910390fd5b60008111156117bc5773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161177792919061427f565b6020604051808303816000875af1158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba919061400e565b505b50565b6000806000905060005b60045481101561182f5761180f6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166108f5565b8261181a9190613d70565b9150808061182790613dc6565b9150506117c9565b508091505090565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905080602001518211156118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614181565b60405180910390fd5b600064141dd76000610898836040015161192c426103606175306119189190613e0e565b87600001516119279190613d70565b613b46565b6119369190613e68565b84602001516119459190613e0e565b61194f9190613e0e565b6119599190613ecb565b82606001516119689190613d70565b905060008260200151848361197d9190613e0e565b6119879190613ecb565b90506305f5e1006064620f42408661199f9190613e0e565b6119a99190613e0e565b6119b39190613ecb565b6001546119c09190613d70565b60018190555082602001518403611b065760005b600c54811015611b04573373ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611af157600b60006001600c54611a579190613e68565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c54611ae69190613e68565b600c81905550611b04565b8080611afc90613dc6565b9150506119d4565b505b604051806080016040528084600001518152602001858560200151611b2b9190613e68565b81526020014281526020018284611b429190613e68565b815250600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050503373ffffffffffffffffffffffffffffffffffffffff167f908e667f6c2b13b8062954eb100253ea804c21222b190449e40d967a3ac0ff1360405160405180910390a28073d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c409190613c35565b602060405180830381865afa158015611c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c819190614050565b1015611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb99061425f565b60405180910390fd5b6000811115611d5f5773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d1a92919061427f565b6020604051808303816000875af1158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d919061400e565b505b620f424080620f4240611d729190613e68565b85611d7d9190613e0e565b611d879190613ecb565b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611dd49190613c35565b602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190614050565b1015611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d9061425f565b60405180910390fd5b6000620f424080620f4240611e6b9190613e68565b86611e769190613e0e565b611e809190613ecb565b1115611f41577317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33620f424080620f4240611eca9190613e68565b88611ed59190613e0e565b611edf9190613ecb565b6040518363ffffffff1660e01b8152600401611efc92919061427f565b6020604051808303816000875af1158015611f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3f919061400e565b505b80600d54611f4f9190613d70565b600d8190555050505050565b60008111611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590613f7f565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000816020015103612135576040518060a00160405280428152602001838152602001428152602001600081526020016000815250600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050503360076000600854815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160085461212a9190613d70565b600881905550612255565b6040518060a001604052804281526020018383602001516121569190613d70565b815260200142815260200164141dd7600061044c846040015161219742610360618e946121839190613e0e565b88600001516121929190613d70565b613b46565b6121a19190613e68565b85602001516121b09190613e0e565b6121ba9190613e0e565b6121c49190613ecb565b83606001516121d39190613d70565b81526020018260800151815250600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050505b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016122a693929190613f9f565b6020604051808303816000875af11580156122c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e9919061400e565b503373ffffffffffffffffffffffffffffffffffffffff167f77338642d9284a44296d29a273e04b8ab6b15c7d2439094cd460b7e4f0b3307460405160405180910390a25050565b61234261233d33612c9f565b61322e565b565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050806020015182111561240b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240290614181565b60405180910390fd5b600064141dd760006107d083604001516124434261036061271061242f9190613e0e565b876000015161243e9190613d70565b613b46565b61244d9190613e68565b846020015161245c9190613e0e565b6124669190613e0e565b6124709190613ecb565b826060015161247f9190613d70565b90506000826020015184836124949190613e0e565b61249e9190613ecb565b90506305f5e1006064620f4240866124b69190613e0e565b6124c09190613e0e565b6124ca9190613ecb565b6001546124d79190613d70565b6001819055508260200151840361261d5760005b60045481101561261b573373ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036126085760036000600160045461256e9190613e68565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016004546125fd9190613e68565b60048190555061261b565b808061261390613dc6565b9150506124eb565b505b6040518060a00160405280846000015181526020018585602001516126429190613e68565b815260200142815260200182846126599190613e68565b815260200182856080015161266e9190613d70565b815250600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050503373ffffffffffffffffffffffffffffffffffffffff167f908e667f6c2b13b8062954eb100253ea804c21222b190449e40d967a3ac0ff1360405160405180910390a28073d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127769190613c35565b602060405180830381865afa158015612793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b79190614050565b10156127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef9061425f565b60405180910390fd5b60008111156128955773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161285092919061427f565b6020604051808303816000875af115801561286f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612893919061400e565b505b620f424080620f42406128a89190613e68565b856128b39190613e0e565b6128bd9190613ecb565b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161290a9190613c35565b602060405180830381865afa158015612927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294b9190614050565b101561298c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129839061425f565b60405180910390fd5b6000620f424080620f42406129a19190613e68565b866129ac9190613e0e565b6129b69190613ecb565b1115612a77577317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33620f424080620f4240612a009190613e68565b88612a0b9190613e0e565b612a159190613ecb565b6040518363ffffffff1660e01b8152600401612a3292919061427f565b6020604051808303816000875af1158015612a51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a75919061400e565b505b80600554612a859190613d70565b60058190555050505050565b60055481565b600a6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000806000905060005b600454811015612bb4576000600260006003600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050806020015183612b9e9190613d70565b9250508080612bac90613dc6565b915050612ad1565b508091505090565b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c1a57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b60066020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b600c5481565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905064141dd7600061044c8260400151612d5642610360618e94612d429190613e0e565b8660000151612d519190613d70565b613b46565b612d609190613e68565b8360200151612d6f9190613e0e565b612d799190613e0e565b612d839190613ecb565b8160600151612d929190613d70565b915050919050565b6000612da5336108f5565b905080821115612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de19061431a565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506040518060a001604052808260000151815260200182602001518152602001612eb142610360612710612e9d9190613e0e565b8560000151612eac9190613d70565b613b46565b81526020018484612ec29190613e68565b8152602001848360800151612ed79190613d70565b815250600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508273d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f9c9190613c35565b602060405180830381865afa158015612fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fdd9190614050565b101561301e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130159061425f565b60405180910390fd5b60008311156130bb5773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b815260040161307692919061427f565b6020604051808303816000875af1158015613095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b9919061400e565b505b826005546130c99190613d70565b600581905550505050565b6000806000905060005b600c548110156131b7576000600a6000600b600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090508060200151836131a19190613d70565b92505080806131af90613dc6565b9150506130de565b508091505090565b600b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60026020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b600061323933612c9f565b90508082111561327e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132759061431a565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506040518060a00160405280826000015181526020018260200151815260200161334542610360618e946133319190613e0e565b85600001516133409190613d70565b613b46565b815260200184846133569190613e68565b815260200184836080015161336b9190613d70565b815250600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508273d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016134309190613c35565b602060405180830381865afa15801561344d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134719190614050565b10156134b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a99061425f565b60405180910390fd5b600083111561354f5773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b815260040161350a92919061427f565b6020604051808303816000875af1158015613529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354d919061400e565b505b8260095461355d9190613d70565b600981905550505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146135c057600080fd5b6001547317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016136109190613c35565b602060405180830381865afa15801561362d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136519190614050565b1015613692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136899061425f565b60405180910390fd5b60006001541115613733577317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336001546040518363ffffffff1660e01b81526004016136ee92919061427f565b6020604051808303816000875af115801561370d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613731919061400e565b505b6000600181905550565b60008111613780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377790613f7f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000816020015103613917576040518060a00160405280428152602001838152602001428152602001600081526020016000815250600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050503360036000600454815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160045461390c9190613d70565b600481905550613a37565b6040518060a001604052804281526020018383602001516139389190613d70565b815260200142815260200164141dd760006107d08460400151613979426103606127106139659190613e0e565b88600001516139749190613d70565b613b46565b6139839190613e68565b85602001516139929190613e0e565b61399c9190613e0e565b6139a69190613ecb565b83606001516139b59190613d70565b81526020018260800151815250600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050505b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401613a8893929190613f9f565b6020604051808303816000875af1158015613aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acb919061400e565b503373ffffffffffffffffffffffffffffffffffffffff167f77338642d9284a44296d29a273e04b8ab6b15c7d2439094cd460b7e4f0b3307460405160405180910390a25050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081831015613b5857829050613b5c565b8190505b92915050565b6000819050919050565b613b7581613b62565b82525050565b6000602082019050613b906000830184613b6c565b92915050565b600080fd5b613ba481613b62565b8114613baf57600080fd5b50565b600081359050613bc181613b9b565b92915050565b600060208284031215613bdd57613bdc613b96565b5b6000613beb84828501613bb2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c1f82613bf4565b9050919050565b613c2f81613c14565b82525050565b6000602082019050613c4a6000830184613c26565b92915050565b613c5981613c14565b8114613c6457600080fd5b50565b600081359050613c7681613c50565b92915050565b600060208284031215613c9257613c91613b96565b5b6000613ca084828501613c67565b91505092915050565b6000608082019050613cbe6000830187613b6c565b613ccb6020830186613b6c565b613cd86040830185613b6c565b613ce56060830184613b6c565b95945050505050565b600060a082019050613d036000830188613b6c565b613d106020830187613b6c565b613d1d6040830186613b6c565b613d2a6060830185613b6c565b613d376080830184613b6c565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d7b82613b62565b9150613d8683613b62565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dbb57613dba613d41565b5b828201905092915050565b6000613dd182613b62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e0357613e02613d41565b5b600182019050919050565b6000613e1982613b62565b9150613e2483613b62565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5d57613e5c613d41565b5b828202905092915050565b6000613e7382613b62565b9150613e7e83613b62565b925082821015613e9157613e90613d41565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ed682613b62565b9150613ee183613b62565b925082613ef157613ef0613e9c565b5b828204905092915050565b600082825260208201905092915050565b7f5374616b656420616d6f756e74206e6565647320746f2062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000613f69602883613efc565b9150613f7482613f0d565b604082019050919050565b60006020820190508181036000830152613f9881613f5c565b9050919050565b6000606082019050613fb46000830186613c26565b613fc16020830185613c26565b613fce6040830184613b6c565b949350505050565b60008115159050919050565b613feb81613fd6565b8114613ff657600080fd5b50565b60008151905061400881613fe2565b92915050565b60006020828403121561402457614023613b96565b5b600061403284828501613ff9565b91505092915050565b60008151905061404a81613b9b565b92915050565b60006020828403121561406657614065613b96565b5b60006140748482850161403b565b91505092915050565b7f596f75206d75737420686f6c64206120537461725365656473204f726967696e60008201527f616c205061737320746f207573652074686973206f7074696f6e2e2000000000602082015250565b60006140d9603c83613efc565b91506140e48261407d565b604082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b7f5769746864726177696e67206d6f7265207468616e207374616b656420616d6f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b600061416b602383613efc565b91506141768261410f565b604082019050919050565b6000602082019050818103600083015261419a8161415e565b9050919050565b7f496e73756666696369656e7420616d6f756e74206f662074686520746f6b656e60008201527f20696e207468697320636f6e747261637420746f207472616e73666572206f7560208201527f742e20506c6561736520636f6e746163742074686520636f6e7472616374206f60408201527f776e657220746f20746f702075702074686520746f6b656e2e00000000000000606082015250565b6000614249607983613efc565b9150614254826141a1565b608082019050919050565b600060208201905081810360008301526142788161423c565b9050919050565b60006040820190506142946000830185613c26565b6142a16020830184613b6c565b9392505050565b7f57697468647261776e20616d6f756e74206d757374206265206c65737320746860008201527f616e20776974686472617761626c6520616d6f756e7400000000000000000000602082015250565b6000614304603683613efc565b915061430f826142a8565b604082019050919050565b60006020820190508181036000830152614333816142f7565b905091905056fea26469706673582212208484281ee4a027eebc11410bbf5914cd33fa0ed6adf3810c0610d53c8a9be60864736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c8063908278d31161011a578063b86b682d116100ad578063c62d46d31161007c578063c62d46d3146105be578063cb5378ff146105f2578063d26639e81461060e578063eaba0b7814610618578063fcc671411461063457610206565b8063b86b682d14610536578063b937220f14610552578063be39817a14610570578063c30eb6b9146105a057610206565b8063a9ae28bb116100e9578063a9ae28bb14610496578063afd23b1c146104b4578063b057d583146104e8578063b81778aa1461050657610206565b8063908278d31461040b57806392f855871461043e5780639e31c35e1461045c578063a6f9dae11461047a57610206565b8063491c42801161019d5780635efbd74e1161016c5780635efbd74e1461038f578063605aadde146103ab578063606fa649146103c7578063686a14b2146103d157806387f583d3146103ed57610206565b8063491c42801461032f5780634ad768ae1461034b57806350baa6221461035557806355faf7be1461037157610206565b80631d554637116101d95780631d554637146102a75780632b9b38f3146102d757806341a5de5d146102f3578063442541b31461031157610206565b80630717d39f1461020b578063083a4c4e146102295780631479de71146102475780631c0a3f9614610277575b600080fd5b610213610664565b6040516102209190613b7b565b60405180910390f35b610231610759565b60405161023e9190613b7b565b60405180910390f35b610261600480360381019061025c9190613bc7565b6107d1565b60405161026e9190613c35565b60405180910390f35b610291600480360381019061028c9190613c7c565b610804565b60405161029e9190613b7b565b60405180910390f35b6102c160048036038101906102bc9190613c7c565b6108f5565b6040516102ce9190613b7b565b60405180910390f35b6102f160048036038101906102ec9190613bc7565b6109f0565b005b6102fb610e67565b6040516103089190613b7b565b60405180910390f35b610319610e6d565b6040516103269190613b7b565b60405180910390f35b61034960048036038101906103449190613bc7565b610e73565b005b6103536115c0565b005b61036f600480360381019061036a9190613bc7565b6115d3565b005b6103796117bf565b6040516103869190613b7b565b60405180910390f35b6103a960048036038101906103a49190613bc7565b611837565b005b6103c560048036038101906103c09190613bc7565b611f5b565b005b6103cf612331565b005b6103eb60048036038101906103e69190613bc7565b612344565b005b6103f5612a91565b6040516104029190613b7b565b60405180910390f35b61042560048036038101906104209190613c7c565b612a97565b6040516104359493929190613ca9565b60405180910390f35b610446612ac7565b6040516104539190613b7b565b60405180910390f35b610464612bbc565b6040516104719190613b7b565b60405180910390f35b610494600480360381019061048f9190613c7c565b612bc2565b005b61049e612c5d565b6040516104ab9190613b7b565b60405180910390f35b6104ce60048036038101906104c99190613c7c565b612c63565b6040516104df959493929190613cee565b60405180910390f35b6104f0612c99565b6040516104fd9190613b7b565b60405180910390f35b610520600480360381019061051b9190613c7c565b612c9f565b60405161052d9190613b7b565b60405180910390f35b610550600480360381019061054b9190613bc7565b612d9a565b005b61055a6130d4565b6040516105679190613b7b565b60405180910390f35b61058a60048036038101906105859190613bc7565b6131bf565b6040516105979190613c35565b60405180910390f35b6105a86131f2565b6040516105b59190613b7b565b60405180910390f35b6105d860048036038101906105d39190613c7c565b6131f8565b6040516105e9959493929190613cee565b60405180910390f35b61060c60048036038101906106079190613bc7565b61322e565b005b610616613568565b005b610632600480360381019061062d9190613bc7565b61373d565b005b61064e60048036038101906106499190613bc7565b613b13565b60405161065b9190613c35565b60405180910390f35b6000806000905060005b600854811015610751576000600660006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905080602001518361073b9190613d70565b925050808061074990613dc6565b91505061066e565b508091505090565b6000806000905060005b6008548110156107c9576107a96007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c9f565b826107b49190613d70565b915080806107c190613dc6565b915050610763565b508091505090565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905064141dd7600061089882604001516108b14261036061753061089d9190613e0e565b86600001516108ac9190613d70565b613b46565b6108bb9190613e68565b83602001516108ca9190613e0e565b6108d49190613e0e565b6108de9190613ecb565b81606001516108ed9190613d70565b915050919050565b600080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905064141dd760006107d082604001516109ac426103606127106109989190613e0e565b86600001516109a79190613d70565b613b46565b6109b69190613e68565b83602001516109c59190613e0e565b6109cf9190613e0e565b6109d99190613ecb565b81606001516109e89190613d70565b915050919050565b60008111610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90613f7f565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000816020015103610baf5760405180608001604052804281526020018381526020014281526020016000815250600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505033600b6000600c54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c54610ba49190613d70565b600c81905550610cbb565b6040518060800160405280428152602001838360200151610bd09190613d70565b815260200142815260200164141dd760006108988460400151610c1142610360617530610bfd9190613e0e565b8860000151610c0c9190613d70565b613b46565b610c1b9190613e68565b8560200151610c2a9190613e0e565b610c349190613e0e565b610c3e9190613ecb565b8360600151610c4d9190613d70565b815250600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050505b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610d0c93929190613f9f565b6020604051808303816000875af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f919061400e565b50600073da688ebf6b0caa9c166fab3f080975ff573aa93a73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610d9f9190613c35565b602060405180830381865afa158015610dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de09190614050565b11610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906140ef565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f77338642d9284a44296d29a273e04b8ab6b15c7d2439094cd460b7e4f0b3307460405160405180910390a25050565b60045481565b60015481565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090508060200151821115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190614181565b60405180910390fd5b600064141dd7600061044c8360400151610f7242610360618e94610f5e9190613e0e565b8760000151610f6d9190613d70565b613b46565b610f7c9190613e68565b8460200151610f8b9190613e0e565b610f959190613e0e565b610f9f9190613ecb565b8260600151610fae9190613d70565b9050600082602001518483610fc39190613e0e565b610fcd9190613ecb565b90506305f5e1006064620f424086610fe59190613e0e565b610fef9190613e0e565b610ff99190613ecb565b6001546110069190613d70565b6001819055508260200151840361114c5760005b60085481101561114a573373ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036111375760076000600160085461109d9190613e68565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160085461112c9190613e68565b60088190555061114a565b808061114290613dc6565b91505061101a565b505b6040518060a00160405280846000015181526020018585602001516111719190613e68565b815260200142815260200182846111889190613e68565b815260200182856080015161119d9190613d70565b815250600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050503373ffffffffffffffffffffffffffffffffffffffff167f908e667f6c2b13b8062954eb100253ea804c21222b190449e40d967a3ac0ff1360405160405180910390a28073d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112a59190613c35565b602060405180830381865afa1580156112c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e69190614050565b1015611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e9061425f565b60405180910390fd5b60008111156113c45773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161137f92919061427f565b6020604051808303816000875af115801561139e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c2919061400e565b505b620f424080620f42406113d79190613e68565b856113e29190613e0e565b6113ec9190613ecb565b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114399190613c35565b602060405180830381865afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190614050565b10156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b29061425f565b60405180910390fd5b6000620f424080620f42406114d09190613e68565b866114db9190613e0e565b6114e59190613ecb565b11156115a6577317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33620f424080620f424061152f9190613e68565b8861153a9190613e0e565b6115449190613ecb565b6040518363ffffffff1660e01b815260040161156192919061427f565b6020604051808303816000875af1158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a4919061400e565b505b806009546115b49190613d70565b60098190555050505050565b6115d16115cc336108f5565b612d9a565b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461162b57600080fd5b611633610759565b61163b6117bf565b826116469190613d70565b6116509190613d70565b73d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161169d9190613c35565b602060405180830381865afa1580156116ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116de9190614050565b101561171f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117169061425f565b60405180910390fd5b60008111156117bc5773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161177792919061427f565b6020604051808303816000875af1158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba919061400e565b505b50565b6000806000905060005b60045481101561182f5761180f6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166108f5565b8261181a9190613d70565b9150808061182790613dc6565b9150506117c9565b508091505090565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905080602001518211156118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614181565b60405180910390fd5b600064141dd76000610898836040015161192c426103606175306119189190613e0e565b87600001516119279190613d70565b613b46565b6119369190613e68565b84602001516119459190613e0e565b61194f9190613e0e565b6119599190613ecb565b82606001516119689190613d70565b905060008260200151848361197d9190613e0e565b6119879190613ecb565b90506305f5e1006064620f42408661199f9190613e0e565b6119a99190613e0e565b6119b39190613ecb565b6001546119c09190613d70565b60018190555082602001518403611b065760005b600c54811015611b04573373ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611af157600b60006001600c54611a579190613e68565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c54611ae69190613e68565b600c81905550611b04565b8080611afc90613dc6565b9150506119d4565b505b604051806080016040528084600001518152602001858560200151611b2b9190613e68565b81526020014281526020018284611b429190613e68565b815250600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050503373ffffffffffffffffffffffffffffffffffffffff167f908e667f6c2b13b8062954eb100253ea804c21222b190449e40d967a3ac0ff1360405160405180910390a28073d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c409190613c35565b602060405180830381865afa158015611c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c819190614050565b1015611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb99061425f565b60405180910390fd5b6000811115611d5f5773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d1a92919061427f565b6020604051808303816000875af1158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d919061400e565b505b620f424080620f4240611d729190613e68565b85611d7d9190613e0e565b611d879190613ecb565b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611dd49190613c35565b602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190614050565b1015611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d9061425f565b60405180910390fd5b6000620f424080620f4240611e6b9190613e68565b86611e769190613e0e565b611e809190613ecb565b1115611f41577317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33620f424080620f4240611eca9190613e68565b88611ed59190613e0e565b611edf9190613ecb565b6040518363ffffffff1660e01b8152600401611efc92919061427f565b6020604051808303816000875af1158015611f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3f919061400e565b505b80600d54611f4f9190613d70565b600d8190555050505050565b60008111611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590613f7f565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000816020015103612135576040518060a00160405280428152602001838152602001428152602001600081526020016000815250600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050503360076000600854815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160085461212a9190613d70565b600881905550612255565b6040518060a001604052804281526020018383602001516121569190613d70565b815260200142815260200164141dd7600061044c846040015161219742610360618e946121839190613e0e565b88600001516121929190613d70565b613b46565b6121a19190613e68565b85602001516121b09190613e0e565b6121ba9190613e0e565b6121c49190613ecb565b83606001516121d39190613d70565b81526020018260800151815250600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050505b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016122a693929190613f9f565b6020604051808303816000875af11580156122c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e9919061400e565b503373ffffffffffffffffffffffffffffffffffffffff167f77338642d9284a44296d29a273e04b8ab6b15c7d2439094cd460b7e4f0b3307460405160405180910390a25050565b61234261233d33612c9f565b61322e565b565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050806020015182111561240b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240290614181565b60405180910390fd5b600064141dd760006107d083604001516124434261036061271061242f9190613e0e565b876000015161243e9190613d70565b613b46565b61244d9190613e68565b846020015161245c9190613e0e565b6124669190613e0e565b6124709190613ecb565b826060015161247f9190613d70565b90506000826020015184836124949190613e0e565b61249e9190613ecb565b90506305f5e1006064620f4240866124b69190613e0e565b6124c09190613e0e565b6124ca9190613ecb565b6001546124d79190613d70565b6001819055508260200151840361261d5760005b60045481101561261b573373ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036126085760036000600160045461256e9190613e68565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016004546125fd9190613e68565b60048190555061261b565b808061261390613dc6565b9150506124eb565b505b6040518060a00160405280846000015181526020018585602001516126429190613e68565b815260200142815260200182846126599190613e68565b815260200182856080015161266e9190613d70565b815250600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050503373ffffffffffffffffffffffffffffffffffffffff167f908e667f6c2b13b8062954eb100253ea804c21222b190449e40d967a3ac0ff1360405160405180910390a28073d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127769190613c35565b602060405180830381865afa158015612793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b79190614050565b10156127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef9061425f565b60405180910390fd5b60008111156128955773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161285092919061427f565b6020604051808303816000875af115801561286f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612893919061400e565b505b620f424080620f42406128a89190613e68565b856128b39190613e0e565b6128bd9190613ecb565b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161290a9190613c35565b602060405180830381865afa158015612927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294b9190614050565b101561298c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129839061425f565b60405180910390fd5b6000620f424080620f42406129a19190613e68565b866129ac9190613e0e565b6129b69190613ecb565b1115612a77577317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33620f424080620f4240612a009190613e68565b88612a0b9190613e0e565b612a159190613ecb565b6040518363ffffffff1660e01b8152600401612a3292919061427f565b6020604051808303816000875af1158015612a51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a75919061400e565b505b80600554612a859190613d70565b60058190555050505050565b60055481565b600a6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000806000905060005b600454811015612bb4576000600260006003600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050806020015183612b9e9190613d70565b9250508080612bac90613dc6565b915050612ad1565b508091505090565b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c1a57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b60066020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b600c5481565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905064141dd7600061044c8260400151612d5642610360618e94612d429190613e0e565b8660000151612d519190613d70565b613b46565b612d609190613e68565b8360200151612d6f9190613e0e565b612d799190613e0e565b612d839190613ecb565b8160600151612d929190613d70565b915050919050565b6000612da5336108f5565b905080821115612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de19061431a565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506040518060a001604052808260000151815260200182602001518152602001612eb142610360612710612e9d9190613e0e565b8560000151612eac9190613d70565b613b46565b81526020018484612ec29190613e68565b8152602001848360800151612ed79190613d70565b815250600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508273d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f9c9190613c35565b602060405180830381865afa158015612fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fdd9190614050565b101561301e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130159061425f565b60405180910390fd5b60008311156130bb5773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b815260040161307692919061427f565b6020604051808303816000875af1158015613095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b9919061400e565b505b826005546130c99190613d70565b600581905550505050565b6000806000905060005b600c548110156131b7576000600a6000600b600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090508060200151836131a19190613d70565b92505080806131af90613dc6565b9150506130de565b508091505090565b600b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60026020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b600061323933612c9f565b90508082111561327e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132759061431a565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506040518060a00160405280826000015181526020018260200151815260200161334542610360618e946133319190613e0e565b85600001516133409190613d70565b613b46565b815260200184846133569190613e68565b815260200184836080015161336b9190613d70565b815250600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508273d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016134309190613c35565b602060405180830381865afa15801561344d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134719190614050565b10156134b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a99061425f565b60405180910390fd5b600083111561354f5773d289c01528921b5f6d5b111a50a99456d495bf7873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b815260040161350a92919061427f565b6020604051808303816000875af1158015613529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354d919061400e565b505b8260095461355d9190613d70565b600981905550505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146135c057600080fd5b6001547317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016136109190613c35565b602060405180830381865afa15801561362d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136519190614050565b1015613692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136899061425f565b60405180910390fd5b60006001541115613733577317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336001546040518363ffffffff1660e01b81526004016136ee92919061427f565b6020604051808303816000875af115801561370d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613731919061400e565b505b6000600181905550565b60008111613780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377790613f7f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000816020015103613917576040518060a00160405280428152602001838152602001428152602001600081526020016000815250600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050503360036000600454815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160045461390c9190613d70565b600481905550613a37565b6040518060a001604052804281526020018383602001516139389190613d70565b815260200142815260200164141dd760006107d08460400151613979426103606127106139659190613e0e565b88600001516139749190613d70565b613b46565b6139839190613e68565b85602001516139929190613e0e565b61399c9190613e0e565b6139a69190613ecb565b83606001516139b59190613d70565b81526020018260800151815250600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050505b7317840df7caa07e298b16e8612157b90ed231c97373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401613a8893929190613f9f565b6020604051808303816000875af1158015613aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acb919061400e565b503373ffffffffffffffffffffffffffffffffffffffff167f77338642d9284a44296d29a273e04b8ab6b15c7d2439094cd460b7e4f0b3307460405160405180910390a25050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081831015613b5857829050613b5c565b8190505b92915050565b6000819050919050565b613b7581613b62565b82525050565b6000602082019050613b906000830184613b6c565b92915050565b600080fd5b613ba481613b62565b8114613baf57600080fd5b50565b600081359050613bc181613b9b565b92915050565b600060208284031215613bdd57613bdc613b96565b5b6000613beb84828501613bb2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c1f82613bf4565b9050919050565b613c2f81613c14565b82525050565b6000602082019050613c4a6000830184613c26565b92915050565b613c5981613c14565b8114613c6457600080fd5b50565b600081359050613c7681613c50565b92915050565b600060208284031215613c9257613c91613b96565b5b6000613ca084828501613c67565b91505092915050565b6000608082019050613cbe6000830187613b6c565b613ccb6020830186613b6c565b613cd86040830185613b6c565b613ce56060830184613b6c565b95945050505050565b600060a082019050613d036000830188613b6c565b613d106020830187613b6c565b613d1d6040830186613b6c565b613d2a6060830185613b6c565b613d376080830184613b6c565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d7b82613b62565b9150613d8683613b62565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dbb57613dba613d41565b5b828201905092915050565b6000613dd182613b62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e0357613e02613d41565b5b600182019050919050565b6000613e1982613b62565b9150613e2483613b62565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5d57613e5c613d41565b5b828202905092915050565b6000613e7382613b62565b9150613e7e83613b62565b925082821015613e9157613e90613d41565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ed682613b62565b9150613ee183613b62565b925082613ef157613ef0613e9c565b5b828204905092915050565b600082825260208201905092915050565b7f5374616b656420616d6f756e74206e6565647320746f2062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000613f69602883613efc565b9150613f7482613f0d565b604082019050919050565b60006020820190508181036000830152613f9881613f5c565b9050919050565b6000606082019050613fb46000830186613c26565b613fc16020830185613c26565b613fce6040830184613b6c565b949350505050565b60008115159050919050565b613feb81613fd6565b8114613ff657600080fd5b50565b60008151905061400881613fe2565b92915050565b60006020828403121561402457614023613b96565b5b600061403284828501613ff9565b91505092915050565b60008151905061404a81613b9b565b92915050565b60006020828403121561406657614065613b96565b5b60006140748482850161403b565b91505092915050565b7f596f75206d75737420686f6c64206120537461725365656473204f726967696e60008201527f616c205061737320746f207573652074686973206f7074696f6e2e2000000000602082015250565b60006140d9603c83613efc565b91506140e48261407d565b604082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b7f5769746864726177696e67206d6f7265207468616e207374616b656420616d6f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b600061416b602383613efc565b91506141768261410f565b604082019050919050565b6000602082019050818103600083015261419a8161415e565b9050919050565b7f496e73756666696369656e7420616d6f756e74206f662074686520746f6b656e60008201527f20696e207468697320636f6e747261637420746f207472616e73666572206f7560208201527f742e20506c6561736520636f6e746163742074686520636f6e7472616374206f60408201527f776e657220746f20746f702075702074686520746f6b656e2e00000000000000606082015250565b6000614249607983613efc565b9150614254826141a1565b608082019050919050565b600060208201905081810360008301526142788161423c565b9050919050565b60006040820190506142946000830185613c26565b6142a16020830184613b6c565b9392505050565b7f57697468647261776e20616d6f756e74206d757374206265206c65737320746860008201527f616e20776974686472617761626c6520616d6f756e7400000000000000000000602082015250565b6000614304603683613efc565b915061430f826142a8565b604082019050919050565b60006020820190508181036000830152614333816142f7565b905091905056fea26469706673582212208484281ee4a027eebc11410bbf5914cd33fa0ed6adf3810c0610d53c8a9be60864736f6c634300080d0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.