Overview
ETH Balance
0.056857185183397883 ETH
Eth Value
$202.86 (@ $3,567.89/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 131 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Cash Out | 12339767 | 1063 days ago | IN | 0 ETH | 0.00159315 | ||||
Sell Tokens | 12339760 | 1063 days ago | IN | 0 ETH | 0.00281118 | ||||
Cash Out | 11899173 | 1131 days ago | IN | 0 ETH | 0.00646704 | ||||
Sell Tokens | 11899093 | 1131 days ago | IN | 0 ETH | 0.01077861 | ||||
Cash Out | 10933587 | 1280 days ago | IN | 0 ETH | 0.00350298 | ||||
Sell Tokens | 10933568 | 1280 days ago | IN | 0 ETH | 0.00697257 | ||||
Cash Out | 10459888 | 1353 days ago | IN | 0 ETH | 0.00075448 | ||||
Sell Tokens | 10456075 | 1353 days ago | IN | 0 ETH | 0.00254208 | ||||
Double Down | 9869210 | 1444 days ago | IN | 0 ETH | 0.00034384 | ||||
Sell Tokens | 9800732 | 1455 days ago | IN | 0 ETH | 0.00043571 | ||||
Cash Out | 9800712 | 1455 days ago | IN | 0 ETH | 0.00043113 | ||||
Cash Out | 9751693 | 1462 days ago | IN | 0 ETH | 0.00005389 | ||||
Transfer | 9699188 | 1470 days ago | IN | 0 ETH | 0.0004423 | ||||
Cash Out | 9690289 | 1472 days ago | IN | 0 ETH | 0.00026946 | ||||
Sell Tokens | 9690289 | 1472 days ago | IN | 0 ETH | 0.00036309 | ||||
Cash Out | 9645231 | 1479 days ago | IN | 0 ETH | 0.00017245 | ||||
Sell Tokens | 9645221 | 1479 days ago | IN | 0 ETH | 0.00020917 | ||||
Cash Out | 9549687 | 1493 days ago | IN | 0 ETH | 0.00005389 | ||||
Sell Tokens | 9549687 | 1493 days ago | IN | 0 ETH | 0.0000726 | ||||
Cash Out | 9513927 | 1499 days ago | IN | 0 ETH | 0.00021556 | ||||
Cash Out | 9503596 | 1500 days ago | IN | 0 ETH | 0.00005389 | ||||
Sell Tokens | 9503147 | 1501 days ago | IN | 0 ETH | 0.00014526 | ||||
Sell Tokens | 9467040 | 1506 days ago | IN | 0 ETH | 0.00058076 | ||||
Sell Tokens | 9460336 | 1507 days ago | IN | 0 ETH | 0.00035038 | ||||
Sell Tokens | 9458636 | 1507 days ago | IN | 0 ETH | 0.00043797 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
12339767 | 1063 days ago | 0.68263763 ETH | ||||
12339760 | 1063 days ago | 0.52246717 ETH | ||||
12339760 | 1063 days ago | 0.06883282 ETH | ||||
12339750 | 1063 days ago | 0.04710525 ETH | ||||
11899173 | 1131 days ago | 0.16586947 ETH | ||||
11899105 | 1131 days ago | 0.07042055 ETH | ||||
11899093 | 1131 days ago | 0.62223028 ETH | ||||
11899093 | 1131 days ago | 0.02308057 ETH | ||||
10933587 | 1280 days ago | 0.1696946 ETH | ||||
10933578 | 1280 days ago | 0.12817774 ETH | ||||
10933568 | 1280 days ago | 1.76386446 ETH | ||||
10933568 | 1280 days ago | 0.09747492 ETH | ||||
10459888 | 1353 days ago | 0.24372799 ETH | ||||
10456075 | 1353 days ago | 2.09782305 ETH | ||||
10456075 | 1353 days ago | 0.1100642 ETH | ||||
10202088 | 1393 days ago | 0.02030291 ETH | ||||
9869210 | 1444 days ago | 0.00004974 ETH | ||||
9800733 | 1455 days ago | 0.00758871 ETH | ||||
9800732 | 1455 days ago | 0.09958265 ETH | ||||
9800732 | 1455 days ago | 0.00406124 ETH | ||||
9800712 | 1455 days ago | 0.00446567 ETH | ||||
9751693 | 1462 days ago | 0.0000475 ETH | ||||
9751584 | 1462 days ago | 0.00466456 ETH | ||||
9699188 | 1470 days ago | 0.00037141 ETH | ||||
9690293 | 1472 days ago | 0.00967754 ETH |
Loading...
Loading
Contract Name:
SHILLcoin
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-01-25 */ pragma solidity ^0.5.10; /// @title An economic simulation and game /// @author TheTokenPhysicist /// @dev NatSpec comments provide broader information. Detailed comments available in source code contract SHILLcoin //start contract { //NOTE: in general modifiers have been defined/placed just before the functions that use them //STATE VARIABLES //INTERNAL CONSTANTS //internal constant used for math uint256 constant internal MAGNITUDE = 2**64; int256 constant internal IMAGNITUDE = 2**64; //NOTE that 1ETHER = 1e18 wei uint256 constant internal FEE_CYCLE_SIZE = 25e16 wei; //(6553/65536 = 10.00%) uint16 constant internal MAX_VARIANCE = 6553; //(1638/65536 = 2.50%) uint constant internal BASE_RATE = 1638; //max rate = base_rate + max_variance (8191/65536 = 12.50%) //limits for setup phase uint256 constant internal SETUP_LIMIT = 6e18; uint256 constant internal CONTRIBUTOR_PURCHASE_MAX = 25e17; //parameters for token bonding curve //set to 0.000001=10^-6 (ETH/token), i.e. 10^6 tokens/ETH (ignoring rise due to price increment) uint256 constant internal TOKEN_PRICE_INITIAL = 0.000001 ether; //set to 0.000000001=10^-9 (ETH/token), representing an increase of 10^-9 ETH in the price of each token per outstanding token uint256 constant internal TOKEN_PRICE_INCREMENT = 0.000000001 ether; //PUBLIC CONSTANTS //ERC 20 standard for the number of decimals the token uses uint8 constant public decimals = 18; //PUBLIC VARIABLES string public name = "SHILLcoin"; string public symbol = "SHILL"; //tracks total ether stored in unwithdrawn dividends uint256 public _slushFundBalance = 0; //initializes fee rate at BASE_RATE uint16 public _feeRate = uint16(BASE_RATE); //tracks total accumulated rewards per token uint256 public _rewardsPerTokenAllTime = 0; //tracks total existing number of tokens. named to match ERC-20 standard (see https://eips.ethereum.org/EIPS/eip-20) uint256 public totalSupply = 0; //partner contract address will be set IRREVERSIBLY by administrator in setup phase //partner address initially set to administrator address to avoid divide by zero error on first token purchase address payable public partnerAddress_ = msg.sender; bool public partnerSet = false; // when setupPhase is set to true, only contributors can purchase tokens - used during contract setup //this is automatically switched off (irreversibly) after setupLimit is met, or can be switched off manually by admin with endSetupPhase() bool public setupPhase = true; //MAPPINGS // track token balances mapping(address => uint256) public tokenBalanceLedger_; // track payouts mapping(address => int256) public payoutsToLedger_; //track approved addresses to allow transferFrom functionality - stored as allowance[from][spender] = allowance that [spender] is approved to send from [from] //named to match ERC-20 standard mapping(address => mapping(address => uint256)) allowance; //track ether spending in setup phase mapping(address => uint256) internal accumulatedContributorSpends_; //tracks administrator(s) & contributors mapping(address => bool) public administrator_; mapping(address => bool) public contributors_; //EVENTS //when a transfer is completed //also emitted for token mint/burn events, in which cases, respectively, from/to is set to the 0 address (matches ERC20 standard) event Transfer( address indexed from, address indexed to, uint256 tokensTransferred ); // ERC20 compliance //when the tokenOwner address adjusts the allowance that the approvedAddress is allowed to transfer from the holdings of tokenOwner //relevant to transferFrom functionality event Approval( address indexed tokenOwner, address indexed approvedAddress, uint256 newAllowance ); //when a player spends their rewards to purchase more tokens event DoubleDown( address indexed playerAddress, uint256 etherValue, //etherValue of the spent rewards uint256 tokensMinted ); //when a player withdraws their rewards as ether event CashOut( address indexed playerAddress, uint256 etherValue ); //event announced when the fee rate is recalculated (occurs whenever slush fund balance changes) //NOTE: fee rate is represented as 16-bit int; calculations of the fee itself use value*feeRate/65536 (65536 = 2^16) event AnnounceFeeRate( uint16 newFeeRate ); //CONSTRUCTOR/INITIALIZATION constructor() public { //sets up admin(s) and contributors administrator_[msg.sender] = true; //TheTokenPhysicist -- Mastermind contributors_[msg.sender] = true; contributors_[0xF7388B6a9c65BCEECfaaB0beD560dc229A899848] = true; //MaddEconomist -- Advisor contributors_[0x8DA88ecAc7C71EDc34C742232C8D1fdc61C5f8bE] = true; //swimmingly -- Tester & design review contributors_[0x6Fa716966c81e8f907629f90352452d8F2dD0dF4] = true; //cryptoGENIUS17 -- Design consulting & editing } //FALLBACK /// @notice fallback function. ensures that you still receive tokens if you just send money directly to the contract /// @dev fallback function. buys tokens with all sent ether *unless* ether is sent from partner address; if it is, then distributes ether as rewards to token holders function() external payable { if ( msg.sender == partnerAddress_ ) { //convert money sent from partner contract into rewards for all token holders makeItRain(); } else { purchaseTokens( msg.sender, msg.value ); } } //EXTERNAL FUNCTIONS /// @notice buys tokens with all sent funds. tokens are automatically credited to sender address /// @dev emits event Transfer(address(0), playerAddress, newTokens) since function mint is called internally function buyTokens() external payable { purchaseTokens( msg.sender, msg.value ); } /// @notice uses all of message sender's accumulated rewards to buy more tokens for the sender /// @dev emits event DoubleDown(msg.sender, rewards , newTokens) and event Transfer(address(0), playerAddress, newTokens) since function mint is called internally function doubleDown() external { //pull current ether value of sender's rewards uint256 etherValue = rewardsOf( msg.sender ); //update rewards tracker to reflect payout. performed before rewards are sent to prevent re-entrancy updateSpentRewards( msg.sender , etherValue); //update slush fund and fee rate _slushFundBalance -= etherValue; require( calcFeeRate(), "error in calling calcFeeRate" ); // use rewards to buy new tokens uint256 newTokens = purchaseTokens(msg.sender , etherValue); //NOTE: purchaseTokens already emits an event, but this is useful for tracking specifically DoubleDown events emit DoubleDown(msg.sender, etherValue , newTokens); } /// @notice converts all of message senders's accumulated rewards into cold, hard ether /// @dev emits event CashOut( msg.sender, etherValue ) /// @return etherValue sent to account holder function cashOut() external returns (uint256 etherValue) { //pull current ether value of sender's rewards etherValue = rewardsOf( msg.sender ); //update rewards tracker to reflect payout. performed before rewards are sent to prevent re-entrancy updateSpentRewards( msg.sender , etherValue); //update slush fund and fee rate _slushFundBalance -= etherValue; require( calcFeeRate(), "error in calling calcFeeRate" ); //transfer rewards to sender msg.sender.transfer( etherValue ); //NOTE: purchaseTokens already emits an event, but this is useful for tracking specifically CashOut events emit CashOut( msg.sender, etherValue ); } /// @notice sells all of sender's tokens /// @dev emits event Transfer(playerAddress, address(0), amountTokens) since function burn is called internally function sellAll() external returns (bool) { uint256 tokens = tokenBalanceLedger_[msg.sender]; if ( tokens > 0 ) { sell(tokens); } return true; } /// @notice sells desired number of message sender's tokens /// @dev emits event Transfer(playerAddress, address(0), amountTokens) since function burn is called internally /// @param amountTokens The number of tokens the sender wants to sell function sellTokens( uint256 amountTokens ) external returns (bool) { require( amountTokens <= tokenBalanceLedger_[msg.sender], "insufficient funds available" ); sell(amountTokens); return true; } /// @notice transfers tokens from sender to another address. Pays fee at same rate as buy/sell /// @dev emits event Transfer( msg.sender, toAddress, tokensAfterFee ) /// @param toAddress Destination for transferred tokens /// @param amountTokens The number of tokens the sender wants to transfer function transfer( address toAddress, uint256 amountTokens ) external returns( bool ) { //make sure message sender has the requested tokens (transfers also disabled during SetupPhase) require( ( amountTokens <= tokenBalanceLedger_[ msg.sender ] && !setupPhase ), "transfer not allowed" ); //make the transfer internally require( transferInternal( msg.sender, toAddress, amountTokens ), "error in internal token transfer" ); //ERC20 compliance return true; } /// @notice sets approved amount of tokens that an external address can transfer on behalf of the user /// @dev emits event Approval(msg.sender, approvedAddress, amountTokens) /// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens) /// @param amountTokens The number of tokens the sender wants to approve the external address to transfer for them function approve( address approvedAddress, uint256 amountTokens) external returns (bool) { allowance[msg.sender][approvedAddress] = amountTokens; emit Approval(msg.sender, approvedAddress, amountTokens); return true; } /// @notice increases approved amount of tokens that an external address can transfer on behalf of the user /// @dev emits event Approval(msg.sender, approvedAddress, newAllowance) /// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens) /// @param amountTokens The number of tokens by which the sender wants to increase the external address' allowance function increaseAllowance( address approvedAddress, uint256 amountTokens) external returns (bool) { uint256 pastAllowance = allowance[msg.sender][approvedAddress]; uint256 newAllowance = SafeMath.add( pastAllowance , amountTokens ); allowance[msg.sender][approvedAddress] = newAllowance; emit Approval(msg.sender, approvedAddress, newAllowance); return true; } /// @notice decreases approved amount of tokens that an external address can transfer on behalf of the user /// @dev emits event Approval(msg.sender, approvedAddress, newAllowance) /// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens) /// @param amountTokens The number of tokens by which the sender wants to decrease the external address' allowance function decreaseAllowance( address approvedAddress, uint256 amountTokens) external returns (bool) { uint256 pastAllowance = allowance[msg.sender][approvedAddress]; uint256 newAllowance = SafeMath.sub( pastAllowance , amountTokens ); allowance[msg.sender][approvedAddress] = newAllowance; emit Approval(msg.sender, approvedAddress, newAllowance); return true; } modifier checkTransferApproved(address fromAddress, uint256 amountTokens){ require( allowance[fromAddress][msg.sender] <= amountTokens, "transfer not authorized (allowance insufficient)" ); _; } /// @notice transfers tokens from one address to another. Pays fee at same rate as buy/sell /// @dev emits event Transfer( fromAddress, toAddress, tokensAfterFee ) /// @param fromAddress Account that sender wishes to transfer tokens from /// @param toAddress Destination for transferred tokens /// @param amountTokens The number of tokens the sender wants to transfer function transferFrom(address payable fromAddress, address payable toAddress, uint256 amountTokens) checkTransferApproved(fromAddress , amountTokens) external returns (bool) { // make sure sending address has requested tokens (transfers also disabled during SetupPhase) require( ( amountTokens <= tokenBalanceLedger_[ fromAddress ] && !setupPhase ), "transfer not allowed - insufficient funds available" ); //update allowance (reduce it by tokens to be sent) uint256 pastAllowance = allowance[fromAddress][msg.sender]; uint256 newAllowance = SafeMath.sub( pastAllowance , amountTokens ); allowance[fromAddress][msg.sender] = newAllowance; //make the transfer internally require( transferInternal( fromAddress, toAddress, amountTokens ), "error in internal token transfer" ); // ERC20 compliance return true; } /// @notice called by users to exchange between token types. Pays fee at half the rate of buy/sell /// @param amountTokens the number of tokens the user wishes to exchange function exchangeTokens( uint256 amountTokens ) external returns(bool) { // make sure sending address has requested tokens (transfers also disabled during SetupPhase) require( ( amountTokens <= tokenBalanceLedger_[ msg.sender ] && !setupPhase ), "transfer not allowed - insufficient funds available" ); //mirrors valueAfterFee function, but with fee halved (half fee is also charged by the other contract) uint256 amountEther = tokensToEther( amountTokens ); uint256 fee = SafeMath.div( ( amountEther * _feeRate / 2 ) , 65536 ); //fee uint256 valueAfterFee = SafeMath.sub( amountEther , fee ); //value after fee //destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance //also updates reward tracker (payoutsToLedger_) for player address burn(msg.sender, amountTokens); //mirrors makeItRain function (distributes fee to token holders) uint256 addedRewards = SafeMath.mul( fee , MAGNITUDE ); uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply ); _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken ); //updates balance in slush fund and calculates new fee rate require( updateSlushFund( fee ), "error in calling updateSlushFund" ); //sends remainder to partner contract, to be used to buy tokens from that contract address payable buddy = partnerAddress_; ( bool success, bytes memory returnData ) = buddy.call.value( valueAfterFee )(abi.encodeWithSignature("incomingExchangeRequest(address)", msg.sender)); //no need to check return data since partner is a trusted entity require( success, "failed to send funds to partner contract (not enough gas provided?)" ); return true; } /// @notice handles exchange. only callable by partner contract. /// @param playerAddress passed on from call to exchangeTokens function. used to track player address function incomingExchangeRequest( address playerAddress ) external payable returns(bool) { require( (msg.sender == partnerAddress_), "this function can only be called by the partner contract" ); //mirrors valueAfterFee function, but with fee halved (half fee is also charged by the other contract) uint256 amountEther = msg.value; uint256 fee = SafeMath.div( ( amountEther * _feeRate / 2 ) , 65536 ); //fee uint256 valueAfterFee = SafeMath.sub( amountEther , fee ); //value after fee //mirrors makeItRain function (distributes fee to token holders) uint256 addedRewards = SafeMath.mul( fee , MAGNITUDE ); uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply ); _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken ); //updates balance in slush fund and calculates new fee rate require( updateSlushFund( fee ), "error in calling updateSlushFund" ); //mirrors purchaseTokens function uint256 amountTokens = etherToTokens( valueAfterFee ); //adds new tokens to total token supply and gives them to the player //also updates reward tracker (payoutsToLedger_) for player address mint( playerAddress, amountTokens ); return true; } //ADMIN ONLY FUNCTIONS (ALL EXTERNAL AS WELL) //defines modifier for functions that only contract admin(s) can use modifier onlyAdministrator() { require( administrator_[ msg.sender ] == true, "function can only be called by contract admin" ); _; } /// @notice admin only function. irreversibly sets address of partner contract /// @param partner Address of partner contract function setPartner( address payable partner) onlyAdministrator() public { if ( partnerSet == false ) { partnerAddress_ = partner; partnerSet = true; } } /// @notice admin only function. irreversibly ends SetupPhase /// @dev SetupPhase also ends automatically if contract holds more than (SETUP_LIMIT) in ether. see modifier purchaseAllowed(uint256 amountEther) function endSetupPhase() onlyAdministrator() public { setupPhase = false; } /// @notice admin only function. simple name change /// @param newName Desired new name for contract function setName( string memory newName ) onlyAdministrator() public { name = newName; } /// @notice admin only function. simple symbol change /// @param newSymbol Desired new symbol for contract function setSymbol( string memory newSymbol ) onlyAdministrator() public { symbol = newSymbol; } //HELPER FUNCTIONS (ALL EXTERNAL AS WELL) -- used to pull information /// @notice returns current sell price for one token function sellPrice() external view returns(uint256) { // avoid dividing by zero require(totalSupply != 0, "function called too early (supply is zero)"); //represents selling one "full token" since the token has 18 decimals uint256 etherValue = tokensToEther( 1e18 ); uint[2] memory feeAndValue = valueAfterFee( etherValue ); return feeAndValue[1]; } /// @notice calculates current buy price for one token function currentBuyPrice() external view returns(uint256) { // avoid dividing by zero require(totalSupply != 0, "function called too early (supply is zero)"); //represents buying one "full token" since the token has 18 decimals uint256 etherValue = tokensToEther( 1e18 ); uint[2] memory feeAndValue = valueAfterFee( etherValue ); //NOTE: this is not strictly correct, but gets very close to real purchase value uint256 totalCost = etherValue + feeAndValue[0]; return totalCost; } /// @notice calculates number of tokens that can be bought at current price and fee rate for input amount of ether /// @param etherValue Desired amount of ether from which to calculate equivalent number of tokens /// @return amountTokens Expected return of tokens for spending etherValue function calculateExpectedTokens(uint256 etherValue) external view returns(uint256) { uint256 etherAfterFee = valueAfterFee( etherValue )[1]; uint256 amountTokens = etherToTokens( etherAfterFee ); return amountTokens; } /// @notice calculates amount of ether (as wei) received if input number of tokens is sold at current price and fee rate /// @param tokensToSell Desired number of tokens (as an integer) from which to calculate equivalent value of ether /// @return etherAfterFee Amount of ether that would be received for selling tokens function calculateExpectedWei(uint256 tokensToSell) external view returns(uint256) { require( tokensToSell <= totalSupply, "unable to calculate for amount of tokens greater than current supply" ); //finds ether value of tokens before fee uint256 etherValue = tokensToEther( tokensToSell ); //calculates ether after fee uint256 etherAfterFee = valueAfterFee( etherValue )[1]; return etherAfterFee; } /// @notice returns total ether balance of contract function totalEtherBalance() external view returns(uint) { return address(this).balance; } /// @notice returns number of tokens owned by message sender function myTokens() external view returns(uint256) { return tokenBalanceLedger_[msg.sender]; } /// @notice returns reward balance of message sender function myRewards() external view returns(uint256) { return rewardsOf( msg.sender ); } /// @notice returns token balance of desired address /// @dev conforms to ERC-20 standard /// @param playerAddress Address which sender wants to know the balance of /// @return balance Current raw token balance of playerAddress function balanceOf( address playerAddress ) external view returns(uint256 balance) { return (tokenBalanceLedger_[playerAddress]); } //PUBLIC FUNCTIONS /// @notice function for donating to slush fund. adjusts current fee rate as fast as possible but does not give the message sender any tokens /// @dev invoked internally when partner contract sends funds to this contract (see fallback function) function makeItRain() public payable returns(bool) { //avoid dividing by zero require(totalSupply != 0, "makeItRain function called too early (supply is zero)"); uint256 amountEther = msg.value; uint256 addedRewards = SafeMath.mul( amountEther , MAGNITUDE ); uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply ); _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken ); //updates balance in slush fund and calculates new fee rate require( updateSlushFund( amountEther ), "error in calling updateSlushFund" ); return true; } /// @notice returns reward balance of desired address /// @dev invoked internally in cashOut and doubleDown functions /// @param playerAddress Address which sender wants to know the rewards balance of /// @return playerRewards Current ether value of unspent rewards of playerAddress function rewardsOf( address playerAddress ) public view returns(uint256 playerRewards) { playerRewards = (uint256) ( ( (int256)( _rewardsPerTokenAllTime * tokenBalanceLedger_[ playerAddress ] ) - payoutsToLedger_[ playerAddress ] ) / IMAGNITUDE ); return playerRewards; } //INTERNAL FUNCTIONS //recalculates fee rate given current contract state function calcFeeRate() internal returns(bool) { uint excessSlush = ( (_slushFundBalance % FEE_CYCLE_SIZE) * MAX_VARIANCE ); uint16 cycleLocation = uint16( excessSlush / FEE_CYCLE_SIZE ); uint16 newFeeRate = uint16( BASE_RATE + cycleLocation ); //copy local variable to state variable _feeRate = newFeeRate; //anounce new rate emit AnnounceFeeRate( newFeeRate ); return(true); } //updates balance in slush fund and calculates new fee rate function updateSlushFund( uint256 amountEther ) internal returns(bool) { _slushFundBalance += amountEther; require( calcFeeRate(), "error in calling calcFeeRate" ); return true; } //update rewards tracker when a user withdraws their rewards function updateSpentRewards( address playerAddress, uint256 etherValue ) internal returns(bool) { int256 updatedPayouts = payoutsToLedger_[playerAddress] + int256 ( SafeMath.mul( etherValue, MAGNITUDE ) ); require( (updatedPayouts >= payoutsToLedger_[playerAddress]), "ERROR: integer overflow in updateSpentRewards function" ); payoutsToLedger_[playerAddress] = updatedPayouts; return true; } //updates rewards tracker. makes sure that player does not receive any rewards accumulated before they purchased/received these tokens function updateRewardsOnPurchase( address playerAddress, uint256 amountTokens ) internal returns(bool) { int256 updatedPayouts = payoutsToLedger_[playerAddress] + int256 ( SafeMath.mul( _rewardsPerTokenAllTime, amountTokens ) ); require( (updatedPayouts >= payoutsToLedger_[playerAddress]), "ERROR: integer overflow in updateRewardsOnPurchase function" ); payoutsToLedger_[playerAddress] = updatedPayouts; return true; } //adds new tokens to total token supply and gives them to the player function mint(address playerAddress, uint256 amountTokens) internal { require( playerAddress != address(0), "cannot mint tokens for zero address" ); totalSupply = SafeMath.add( totalSupply, amountTokens ); //updates rewards tracker. makes sure that player does not receive any rewards accumulated before they purchased these tokens updateRewardsOnPurchase( playerAddress, amountTokens ); //give tokens to player. performed last to prevent re-entrancy attacks tokenBalanceLedger_[playerAddress] = SafeMath.add( tokenBalanceLedger_[playerAddress] , amountTokens ); //event conforms to ERC-20 standard emit Transfer(address(0), playerAddress, amountTokens); } //Modifier that limits buying while contract setup occurs modifier purchaseAllowed(uint256 amountEther){ //check if still in setup phase if ( setupPhase ) { //check that sender is in contributor list require( contributors_[ msg.sender ] == true, "purchases currently limited only to contributors" ); //check that sender hasn't deposited more ether than allowed uint256 contributorSpent = SafeMath.add( accumulatedContributorSpends_[ msg.sender ] , amountEther ); require( contributorSpent <= CONTRIBUTOR_PURCHASE_MAX, "attempted purchase would exceed limit placed upon contributors" ); //before SETUP_LIMIT is met, track contributor spends if ( ( address(this).balance + amountEther ) <= SETUP_LIMIT ) { //update the amount spent by address accumulatedContributorSpends_[ msg.sender ] = contributorSpent; } else { //if conditions have been met to end setup phase, then exit it automatically. admin also has ability to end setup phase manually setupPhase = false; } } _; } //gives appropriate number of tokens to purchasing address function purchaseTokens(address payable playerAddress, uint256 etherValue) //checks if purchase allowed -- only relevant for limiting actions during setup phase purchaseAllowed( etherValue ) internal returns( uint256 ) { //calculates fee/rewards uint[2] memory feeAndValue = valueAfterFee( etherValue ); //calculates tokens from postFee value of input ether uint256 amountTokens = etherToTokens( feeAndValue[1] ); //avoid overflow errors require ( ( (amountTokens + totalSupply) > totalSupply), "purchase would cause integer overflow" ); // send rewards to partner contract, to be distributed to its holders address payable buddy = partnerAddress_; ( bool success, bytes memory returnData ) = buddy.call.value( feeAndValue[0] )(""); require( success, "failed to send funds to partner contract (not enough gas provided?)" ); //adds new tokens to total token supply and gives them to the player //also updates reward tracker (payoutsToLedger_) for player address mint( playerAddress, amountTokens ); return( amountTokens ); } //update rewards tracker. makes sure that player can still withdraw rewards that accumulated while they were holding their sold/transferred tokens function updateRewardsOnSale( address playerAddress, uint256 amountTokens ) internal returns(bool) { int256 updatedPayouts = payoutsToLedger_[playerAddress] - int256 ( SafeMath.mul( _rewardsPerTokenAllTime, amountTokens ) ); require( (updatedPayouts <= payoutsToLedger_[playerAddress]), "ERROR: integer underflow in updateRewardsOnSale function" ); payoutsToLedger_[playerAddress] = updatedPayouts; return true; } //destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance function burn(address playerAddress, uint256 amountTokens) internal { require( playerAddress != address(0), "cannot burn tokens for zero address" ); require( amountTokens <= tokenBalanceLedger_[ playerAddress ], "insufficient funds available" ); //subtract tokens from player balance. performed first to prevent possibility of re-entrancy attacks tokenBalanceLedger_[playerAddress] = SafeMath.sub( tokenBalanceLedger_[playerAddress], amountTokens ); //remove tokens from total supply totalSupply = SafeMath.sub( totalSupply, amountTokens ); //update rewards tracker. makes sure that player can still withdraw rewards that accumulated while they were holding their sold tokens updateRewardsOnSale( playerAddress, amountTokens ); //event conforms to ERC-20 standard emit Transfer(playerAddress, address(0), amountTokens); } //sells desired amount of tokens for ether function sell(uint256 amountTokens) internal returns (bool) { require( amountTokens <= tokenBalanceLedger_[ msg.sender ], "insufficient funds available" ); //calculates fee and net value to send to seller uint256 etherValue = tokensToEther( amountTokens ); uint[2] memory feeAndValue = valueAfterFee( etherValue ); //destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance //also updates reward tracker (payoutsToLedger_) for player address burn(msg.sender, amountTokens); // sends rewards to partner contract, to be distributed to its holders address payable buddy = partnerAddress_; ( bool success, bytes memory returnData ) = buddy.call.value( feeAndValue[0] )(""); require( success, "failed to send funds to partner contract (not enough gas provided?)" ); //sends ether to seller //NOTE: occurs last to avoid re-entrancy attacks msg.sender.transfer( feeAndValue[1] ); return true; } //takes in amount and returns fee to pay on it and the value after the fee //classified as view since needs to access state (to pull current fee rate) but not write to it function valueAfterFee( uint amount ) internal view returns (uint[2] memory outArray_ ) { outArray_[0] = SafeMath.div( SafeMath.mul(amount, _feeRate), 65536 ); //fee outArray_[1] = SafeMath.sub( amount , outArray_[0] ); //value after fee return outArray_; } //returns purchased number of tokens based on linear bonding curve with fee //it's the quadratic formula stupid! function etherToTokens(uint256 etherValue) internal view returns(uint256) { uint256 tokenPriceInitial = TOKEN_PRICE_INITIAL * 1e18; uint256 _tokensReceived = ( ( // avoids underflow SafeMath.sub( ( sqrt( ( tokenPriceInitial**2 ) + ( 2 * ( TOKEN_PRICE_INCREMENT * 1e18 ) * ( etherValue * 1e18 ) ) + ( ( ( TOKEN_PRICE_INCREMENT ) ** 2 ) * ( totalSupply ** 2 ) ) + ( 2 * ( TOKEN_PRICE_INCREMENT ) * tokenPriceInitial * totalSupply ) ) ), tokenPriceInitial ) ) / ( TOKEN_PRICE_INCREMENT ) ) - ( totalSupply ); return _tokensReceived; } //returns sell value of tokens based on linear bonding curve with fee //~inverse of etherToTokens, but with rounding down to ensure contract is always more than solvent function tokensToEther(uint256 inputTokens) internal view returns(uint256) { uint256 tokens = ( inputTokens + 1e18 ); uint256 functionTotalSupply = ( totalSupply + 1e18 ); uint256 etherReceived = ( // avoids underflow SafeMath.sub( ( ( ( TOKEN_PRICE_INITIAL + ( TOKEN_PRICE_INCREMENT * ( functionTotalSupply / 1e18 ) ) ) - TOKEN_PRICE_INCREMENT ) * ( tokens - 1e18 ) ), ( TOKEN_PRICE_INCREMENT * ( ( tokens ** 2 - tokens ) / 1e18 ) ) / 2 ) / 1e18 ); return etherReceived; } //manages transfers of tokens in both transfer and transferFrom functions function transferInternal( address fromAddress, address toAddress, uint256 amountTokens ) internal returns( bool ) { uint[2] memory feeAndValue = valueAfterFee( amountTokens ); //(token fee) and (amount of tokens after fee) uint256 etherRewards = tokensToEther( feeAndValue[0] ); //destroy the tokens paid as fee totalSupply = SafeMath.sub(totalSupply , feeAndValue[0]); //emit event to reflect destruction of tokens (conforms to ERC-20 standard) emit Transfer(fromAddress, address(0), feeAndValue[0]); //remove tokens from sending address tokenBalanceLedger_[ fromAddress ] = SafeMath.sub( tokenBalanceLedger_[ fromAddress ], amountTokens ); //makes sure that receiving address does not receive any rewards accumulated before they received these tokens updateRewardsOnPurchase( toAddress, feeAndValue[1] ); //give tokens to receiving address tokenBalanceLedger_[ toAddress ] = SafeMath.add( tokenBalanceLedger_[ toAddress ], feeAndValue[1] ); //makes sure that sender can still withdraw rewards that accumulated while they were holding their transferred tokens //NOTE: uses amountTokens as input since this is what the sending address sends, while receiving address gets (feeAndValue[1]) tokens updateRewardsOnSale( fromAddress, amountTokens ); //send rewards to partner contract, to be distributed to its holders address payable buddy = partnerAddress_; ( bool success, bytes memory returnData ) = buddy.call.value( etherRewards )(""); require( success, "failed to send funds to partner contract (not enough gas provided?)" ); // emit event emit Transfer( fromAddress, toAddress, feeAndValue[1] ); return true; } //utility for calculating (approximate) square roots. simple implementation of Babylonian method //see: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method function sqrt(uint x) internal pure returns (uint y) { uint z = (x + 1) / 2; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } //end contract } //MATH OPERATIONS -- designed to avoid possibility of errors with built-in math functions library SafeMath { //@dev Multiplies two numbers, throws on overflow. function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } //@dev Integer division of two numbers, truncating the quotient. function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } //@dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } //@dev Adds two numbers, throws on overflow. function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } //end library }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newFeeRate","type":"uint16"}],"name":"AnnounceFeeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"address","name":"approvedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newAllowance","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"etherValue","type":"uint256"}],"name":"CashOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"etherValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"}],"name":"DoubleDown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensTransferred","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"_feeRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_rewardsPerTokenAllTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_slushFundBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"administrator_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"}],"name":"calculateExpectedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokensToSell","type":"uint256"}],"name":"calculateExpectedWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cashOut","outputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributors_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentBuyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"doubleDown","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"endSetupPhase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"exchangeTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"incomingExchangeRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"makeItRain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"myRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"myTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"partnerAddress_","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"partnerSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payoutsToLedger_","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"rewardsOf","outputs":[{"internalType":"uint256","name":"playerRewards","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sellAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"sellTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"partner","type":"address"}],"name":"setPartner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newSymbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"setupPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenBalanceLedger_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEtherBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"fromAddress","type":"address"},{"internalType":"address payable","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600981526020017f5348494c4c636f696e000000000000000000000000000000000000000000000081525060009080519060200190620000519291906200034d565b506040518060400160405280600581526020017f5348494c4c000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200034d565b506000600255610666600360006101000a81548161ffff021916908361ffff1602179055506000600455600060055533600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660146101000a81548160ff0219169083151502179055506001600660156101000a81548160ff0219169083151502179055503480156200015257600080fd5b506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c600073f7388b6a9c65bceecfaab0bed560dc229a89984873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000738da88ecac7c71edc34c742232c8d1fdc61c5f8be73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000736fa716966c81e8f907629f90352452d8f2dd0df473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003fc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039057805160ff1916838001178555620003c1565b82800160010185558215620003c1579182015b82811115620003c0578251825591602001919060010190620003a3565b5b509050620003d09190620003d4565b5090565b620003f991905b80821115620003f5576000816000905550600101620003db565b5090565b90565b6143b1806200040c6000396000f3fe60806040526004361061023b5760003560e01c806364d156401161012e578063a16d5960116100ab578063b84c82461161006f578063b84c824614610d44578063c47f002714610e0c578063d0febe4c14610ed4578063dcdfbbb914610ede578063e625d51514610f0d5761023b565b8063a16d596014610bc3578063a457c2d714610c14578063a7e1f6a214610c87578063a9059cbb14610c9e578063b2131f7d14610d115761023b565b8063949e8acd116100f2578063949e8acd14610a45578063958507eb14610a7057806395d89b4114610a9b5780639b7a629c14610b2b5780639e57ada614610b5a5761023b565b806364d15640146108ae57806365a23cca146109135780636c11bcd31461096257806370a08231146109b5578063793cd71e14610a1a5761023b565b806340477126116101bc5780634ead0590116101805780634ead0590146107515780635c5a0a9d146107ad5780635d86685a146108125780635dae4e50146108615780635f5ad897146108835761023b565b8063404771261461061857806342a7afe21461066b57806345fd71e114610696578063479ba7ae146106c15780634b750334146107265761023b565b806316e457f01161020357806316e457f01461048757806318160ddd146104b657806323b872dd146104e1578063313ce5671461057457806339509351146105a55761023b565b806305a051eb146102ad57806306fdde031461030457806307410b5b14610394578063095ea7b3146103fd5780630afc2c2814610470575b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561029f57610299610f38565b506102ab565b6102a93334611058565b505b005b3480156102b957600080fd5b506102c26113f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031057600080fd5b5061031961141e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035957808201518184015260208101905061033e565b50505050905090810190601f1680156103865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a057600080fd5b506103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114bc565b604051808215151515815260200191505060405180910390f35b34801561040957600080fd5b506104566004803603604081101561042057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114dc565b604051808215151515815260200191505060405180910390f35b34801561047c57600080fd5b506104856115ce565b005b34801561049357600080fd5b5061049c611694565b604051808215151515815260200191505060405180910390f35b3480156104c257600080fd5b506104cb6116f5565b6040518082815260200191505060405180910390f35b3480156104ed57600080fd5b5061055a6004803603606081101561050457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116fb565b604051808215151515815260200191505060405180910390f35b34801561058057600080fd5b50610589611a21565b604051808260ff1660ff16815260200191505060405180910390f35b3480156105b157600080fd5b506105fe600480360360408110156105c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a26565b604051808215151515815260200191505060405180910390f35b34801561062457600080fd5b506106516004803603602081101561063b57600080fd5b8101908080359060200190929190505050611ba8565b604051808215151515815260200191505060405180910390f35b34801561067757600080fd5b50610680611f68565b6040518082815260200191505060405180910390f35b3480156106a257600080fd5b506106ab611f78565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b50610710600480360360208110156106e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061201e565b6040518082815260200191505060405180910390f35b34801561073257600080fd5b5061073b6120c1565b6040518082815260200191505060405180910390f35b6107936004803603602081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061215f565b604051808215151515815260200191505060405180910390f35b3480156107b957600080fd5b506107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b34801561081e57600080fd5b5061084b6004803603602081101561083557600080fd5b810190808035906020019092919050505061233d565b6040518082815260200191505060405180910390f35b610869610f38565b604051808215151515815260200191505060405180910390f35b34801561088f57600080fd5b50610898612373565b6040518082815260200191505060405180910390f35b3480156108ba57600080fd5b506108fd600480360360208110156108d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b6040518082815260200191505060405180910390f35b34801561091f57600080fd5b5061094c6004803603602081101561093657600080fd5b8101908080359060200190929190505050612391565b6040518082815260200191505060405180910390f35b34801561096e57600080fd5b5061099b6004803603602081101561098557600080fd5b8101908080359060200190929190505050612423565b604051808215151515815260200191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124ed565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a2f612536565b6040518082815260200191505060405180910390f35b348015610a5157600080fd5b50610a5a612670565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610a856126b7565b6040518082815260200191505060405180910390f35b348015610aa757600080fd5b50610ab06126bd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610af0578082015181840152602081019050610ad5565b50505050905090810190601f168015610b1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b3757600080fd5b50610b4061275b565b604051808215151515815260200191505060405180910390f35b348015610b6657600080fd5b50610ba960048036036020811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061276e565b604051808215151515815260200191505060405180910390f35b348015610bcf57600080fd5b50610c1260048036036020811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061278e565b005b348015610c2057600080fd5b50610c6d60048036036040811015610c3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506128b3565b604051808215151515815260200191505060405180910390f35b348015610c9357600080fd5b50610c9c612a35565b005b348015610caa57600080fd5b50610cf760048036036040811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b3f565b604051808215151515815260200191505060405180910390f35b348015610d1d57600080fd5b50610d26612c96565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5057600080fd5b50610e0a60048036036020811015610d6757600080fd5b8101908080359060200190640100000000811115610d8457600080fd5b820183602082011115610d9657600080fd5b80359060200191846001830284011164010000000083111715610db857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612caa565b005b348015610e1857600080fd5b50610ed260048036036020811015610e2f57600080fd5b8101908080359060200190640100000000811115610e4c57600080fd5b820183602082011115610e5e57600080fd5b80359060200191846001830284011164010000000083111715610e8057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d6d565b005b610edc612e30565b005b348015610eea57600080fd5b50610ef3612e3d565b604051808215151515815260200191505060405180910390f35b348015610f1957600080fd5b50610f22612e50565b6040518082815260200191505060405180910390f35b6000806005541415610f95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140806035913960400191505060405180910390fd5b60003490506000610faf8268010000000000000000612e6f565b90506000610fbf82600554612ea6565b9050610fcd60045482612ebf565b600481905550610fdc83612edb565b61104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6001935050505090565b600081600660159054906101000a900460ff16156112565760011515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806141696030913960400191505060405180910390fd5b6000611164600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612ebf565b90506722b1c8c1227a00008111156111c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806141bc603e913960400191505060405180910390fd5b6753444835ec580000823073ffffffffffffffffffffffffffffffffffffffff163101116112385780600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611254565b6000600660156101000a81548160ff0219169083151502179055505b505b61125e613f85565b61126784612f70565b905060006112858260016002811061127b57fe5b6020020151612ff1565b90506005546005548201116112e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061431d6025913960400191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168560006002811061133457fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461137f576040519150601f19603f3d011682016040523d82523d6000602084013e611384565b606091505b5091509150816113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b6113e98985613078565b83965050505050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b505050505081565b600c6020528060005260406000206000915054906101000a900460ff1681565b600081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b6000600660156101000a81548160ff021916908315150217905550565b600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116ed576116eb81613211565b505b600191505090565b60055481565b6000838280600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061426a6030913960400191505060405180910390fd5b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111580156118305750600660159054906101000a900460ff16155b611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006119128287613452565b905080600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119a0888888613469565b611a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b60019450505050509392505050565b601281565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000611ab48285612ebf565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015611c065750600660159054906101000a900460ff16155b611c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000611c66836137f5565b90506000611c976002600360009054906101000a900461ffff1661ffff16840281611c8d57fe5b0462010000612ea6565b90506000611ca58383613452565b9050611cb13386613896565b6000611cc68368010000000000000000612e6f565b90506000611cd682600554612ea6565b9050611ce460045482612ebf565b600481905550611cf384612edb565b611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168633604051602401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506040516020818303038152906040527f4ead0590000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310611e955780518252602082019150602081019050602083039250611e72565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ef7576040519150601f19603f3d011682016040523d82523d6000602084013e611efc565b606091505b509150915081611f57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b600198505050505050505050919050565b6000611f733361201e565b905090565b6000806005541415611fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000611fe8670de0b6b3a76400006137f5565b9050611ff2613f85565b611ffb82612f70565b905060008160006002811061200c57fe5b60200201518301905080935050505090565b600068010000000000000000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546004540203816120b657fe5b059050809050919050565b600080600554141561211e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000612131670de0b6b3a76400006137f5565b905061213b613f85565b61214482612f70565b90508060016002811061215357fe5b60200201519250505090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140b56038913960400191505060405180910390fd5b6000349050600061223b6002600360009054906101000a900461ffff1661ffff1684028161223157fe5b0462010000612ea6565b905060006122498383613452565b905060006122608368010000000000000000612e6f565b9050600061227082600554612ea6565b905061227e60045482612ebf565b60048190555061228d84612edb565b6122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b600061230a84612ff1565b90506123168882613078565b60019650505050505050919050565b60076020528060005260406000206000915090505481565b60008061234983612f70565b60016002811061235557fe5b60200201519050600061236782612ff1565b90508092505050919050565b60045481565b60086020528060005260406000206000915090505481565b60006005548211156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806141256044913960600191505060405180910390fd5b60006123f9836137f5565b9050600061240682612f70565b60016002811061241257fe5b602002015190508092505050919050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156124da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b6124e382613211565b5060019050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006125413361201e565b905061254d3382613ae4565b5080600260008282540392505081905550612566613c24565b6125d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561261e573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fab933177d8753a66dd869151cf9aa88649e067b7a4e2dad9d5d192d61cf593b0826040518082815260200191505060405180910390a290565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60025481565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127535780601f1061272857610100808354040283529160200191612753565b820191906000526020600020905b81548152906001019060200180831161273657829003601f168201915b505050505081565b600660149054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b60001515600660149054906101000a900460ff16151514156128b05780600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600660146101000a81548160ff0219169083151502179055505b50565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006129418285613452565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000612a403361201e565b9050612a4c3382613ae4565b5080600260008282540392505081905550612a65613c24565b612ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b6000612ae33383611058565b90503373ffffffffffffffffffffffffffffffffffffffff167f4de94b39625248a5696f0c1f78680ee8dad819ce02dc53b3b5ed5db8d95cd3d88383604051808381526020018281526020019250505060405180910390a25050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015612b9d5750600660159054906101000a900460ff16155b612c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e73666572206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b612c1a338484613469565b612c8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b6001905092915050565b600360009054906101000a900461ffff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612d53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060019080519060200190612d69929190613fa7565b5050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060009080519060200190612e2c929190613fa7565b5050565b612e3a3334611058565b50565b600660159054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080831415612e825760009050612ea0565b6000828402905082848281612e9357fe5b0414612e9b57fe5b809150505b92915050565b600080828481612eb257fe5b0490508091505092915050565b600080828401905083811015612ed157fe5b8091505092915050565b600081600260008282540192505081905550612ef5613c24565b612f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b60019050919050565b612f78613f85565b612fa2612f9983600360009054906101000a900461ffff1661ffff16612e6f565b62010000612ea6565b81600060028110612faf57fe5b602002018181525050612fd38282600060028110612fc957fe5b6020020151613452565b81600160028110612fe057fe5b602002018181525050809050919050565b600080670de0b6b3a764000064e8d4a510000290506000600554633b9aca0061306361305d60055486633b9aca00600202020260026005540a6002633b9aca000a02670de0b6b3a76400008a02670de0b6b3a7640000633b9aca0002600202026002890a010101613cce565b85613452565b8161306a57fe5b040390508092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061429a6023913960400191505060405180910390fd5b61310a60055482612ebf565b60058190555061311a8282613d13565b50613164600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482612ebf565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156132c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b60006132d3836137f5565b90506132dd613f85565b6132e682612f70565b90506132f23385613896565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460006002811061334157fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b5091509150816133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc8560016002811061341357fe5b60200201519081150290604051600060405180830381858888f19350505050158015613443573d6000803e3d6000fd5b50600195505050505050919050565b60008282111561345e57fe5b818303905092915050565b6000613473613f85565b61347c83612f70565b9050600061349a8260006002811061349057fe5b60200201516137f5565b90506134b9600554836000600281106134af57fe5b6020020151613452565b600581905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460006002811061351c57fe5b60200201516040518082815260200191505060405180910390a361357f600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485613452565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135dd85836001600281106135d357fe5b6020020151613d13565b50613638600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548360016002811061362e57fe5b6020020151612ebf565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136858685613e4c565b506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460405180600001905060006040518083038185875af1925050503d806000811461370f576040519150601f19603f3d011682016040523d82523d6000602084013e613714565b606091505b50915091508161376f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876001600281106137cb57fe5b60200201516040518082815260200191505060405180910390a36001955050505050509392505050565b600080670de0b6b3a7640000830190506000670de0b6b3a76400006005540190506000670de0b6b3a7640000613881670de0b6b3a76400008503633b9aca00670de0b6b3a7640000868161384557fe5b04633b9aca000264e8d4a510000103026002670de0b6b3a7640000876002890a038161386d57fe5b04633b9aca00028161387b57fe5b04613452565b8161388857fe5b049050809350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561391c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141996023913960400191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156139d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b613a1a600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613452565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a6960055482613452565b600581905550613a798282613e4c565b50600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080613afa8368010000000000000000612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142bd6036913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b60008061199961ffff166703782dace9d9000060025481613c4157fe5b0602905060006703782dace9d900008281613c5857fe5b04905060008161ffff1661066601905080600360006101000a81548161ffff021916908361ffff1602179055507fc2cc2ca038d89e4eb3ed987815f876e8e6aaee289e7be6e8d951d2424930763e81604051808261ffff1661ffff16815260200191505060405180910390a16001935050505090565b60008060026001840181613cde57fe5b0490508291505b81811015613d0d57809150600281828581613cfc57fe5b040181613d0557fe5b049050613ce5565b50919050565b600080613d2260045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180614342603b913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b600080613e5b60045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054039050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811315613f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140ed6038913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b6040518060400160405280600290602082028038833980820191505090505090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fe857805160ff1916838001178555614016565b82800160010185558215614016579182015b82811115614015578251825591602001919060010190613ffa565b5b5090506140239190614027565b5090565b61404991905b8082111561404557600081600090555060010161402d565b5090565b9056fe7472616e73666572206e6f7420616c6c6f776564202d20696e73756666696369656e742066756e647320617661696c61626c656d616b6549745261696e2066756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29746869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520706172746e657220636f6e74726163744552524f523a20696e746567657220756e646572666c6f7720696e20757064617465526577617264734f6e53616c652066756e6374696f6e756e61626c6520746f2063616c63756c61746520666f7220616d6f756e74206f6620746f6b656e732067726561746572207468616e2063757272656e7420737570706c797075726368617365732063757272656e746c79206c696d69746564206f6e6c7920746f20636f6e7472696275746f727363616e6e6f74206275726e20746f6b656e7320666f72207a65726f2061646472657373617474656d7074656420707572636861736520776f756c6420657863656564206c696d697420706c616365642075706f6e20636f6e7472696275746f727366756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920636f6e74726163742061646d696e6661696c656420746f2073656e642066756e647320746f20706172746e657220636f6e747261637420286e6f7420656e6f756768206761732070726f76696465643f297472616e73666572206e6f7420617574686f72697a65642028616c6c6f77616e636520696e73756666696369656e742963616e6e6f74206d696e7420746f6b656e7320666f72207a65726f20616464726573734552524f523a20696e7465676572206f766572666c6f7720696e207570646174655370656e74526577617264732066756e6374696f6e66756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29707572636861736520776f756c6420636175736520696e7465676572206f766572666c6f774552524f523a20696e7465676572206f766572666c6f7720696e20757064617465526577617264734f6e50757263686173652066756e6374696f6ea265627a7a7231582005a4502a65bb0e2a1a551683a17b6451794fc459ac3de41d759414e829c63ad564736f6c634300050c0032
Deployed Bytecode
0x60806040526004361061023b5760003560e01c806364d156401161012e578063a16d5960116100ab578063b84c82461161006f578063b84c824614610d44578063c47f002714610e0c578063d0febe4c14610ed4578063dcdfbbb914610ede578063e625d51514610f0d5761023b565b8063a16d596014610bc3578063a457c2d714610c14578063a7e1f6a214610c87578063a9059cbb14610c9e578063b2131f7d14610d115761023b565b8063949e8acd116100f2578063949e8acd14610a45578063958507eb14610a7057806395d89b4114610a9b5780639b7a629c14610b2b5780639e57ada614610b5a5761023b565b806364d15640146108ae57806365a23cca146109135780636c11bcd31461096257806370a08231146109b5578063793cd71e14610a1a5761023b565b806340477126116101bc5780634ead0590116101805780634ead0590146107515780635c5a0a9d146107ad5780635d86685a146108125780635dae4e50146108615780635f5ad897146108835761023b565b8063404771261461061857806342a7afe21461066b57806345fd71e114610696578063479ba7ae146106c15780634b750334146107265761023b565b806316e457f01161020357806316e457f01461048757806318160ddd146104b657806323b872dd146104e1578063313ce5671461057457806339509351146105a55761023b565b806305a051eb146102ad57806306fdde031461030457806307410b5b14610394578063095ea7b3146103fd5780630afc2c2814610470575b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561029f57610299610f38565b506102ab565b6102a93334611058565b505b005b3480156102b957600080fd5b506102c26113f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031057600080fd5b5061031961141e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035957808201518184015260208101905061033e565b50505050905090810190601f1680156103865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a057600080fd5b506103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114bc565b604051808215151515815260200191505060405180910390f35b34801561040957600080fd5b506104566004803603604081101561042057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114dc565b604051808215151515815260200191505060405180910390f35b34801561047c57600080fd5b506104856115ce565b005b34801561049357600080fd5b5061049c611694565b604051808215151515815260200191505060405180910390f35b3480156104c257600080fd5b506104cb6116f5565b6040518082815260200191505060405180910390f35b3480156104ed57600080fd5b5061055a6004803603606081101561050457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116fb565b604051808215151515815260200191505060405180910390f35b34801561058057600080fd5b50610589611a21565b604051808260ff1660ff16815260200191505060405180910390f35b3480156105b157600080fd5b506105fe600480360360408110156105c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a26565b604051808215151515815260200191505060405180910390f35b34801561062457600080fd5b506106516004803603602081101561063b57600080fd5b8101908080359060200190929190505050611ba8565b604051808215151515815260200191505060405180910390f35b34801561067757600080fd5b50610680611f68565b6040518082815260200191505060405180910390f35b3480156106a257600080fd5b506106ab611f78565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b50610710600480360360208110156106e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061201e565b6040518082815260200191505060405180910390f35b34801561073257600080fd5b5061073b6120c1565b6040518082815260200191505060405180910390f35b6107936004803603602081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061215f565b604051808215151515815260200191505060405180910390f35b3480156107b957600080fd5b506107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b34801561081e57600080fd5b5061084b6004803603602081101561083557600080fd5b810190808035906020019092919050505061233d565b6040518082815260200191505060405180910390f35b610869610f38565b604051808215151515815260200191505060405180910390f35b34801561088f57600080fd5b50610898612373565b6040518082815260200191505060405180910390f35b3480156108ba57600080fd5b506108fd600480360360208110156108d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b6040518082815260200191505060405180910390f35b34801561091f57600080fd5b5061094c6004803603602081101561093657600080fd5b8101908080359060200190929190505050612391565b6040518082815260200191505060405180910390f35b34801561096e57600080fd5b5061099b6004803603602081101561098557600080fd5b8101908080359060200190929190505050612423565b604051808215151515815260200191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124ed565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a2f612536565b6040518082815260200191505060405180910390f35b348015610a5157600080fd5b50610a5a612670565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610a856126b7565b6040518082815260200191505060405180910390f35b348015610aa757600080fd5b50610ab06126bd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610af0578082015181840152602081019050610ad5565b50505050905090810190601f168015610b1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b3757600080fd5b50610b4061275b565b604051808215151515815260200191505060405180910390f35b348015610b6657600080fd5b50610ba960048036036020811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061276e565b604051808215151515815260200191505060405180910390f35b348015610bcf57600080fd5b50610c1260048036036020811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061278e565b005b348015610c2057600080fd5b50610c6d60048036036040811015610c3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506128b3565b604051808215151515815260200191505060405180910390f35b348015610c9357600080fd5b50610c9c612a35565b005b348015610caa57600080fd5b50610cf760048036036040811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b3f565b604051808215151515815260200191505060405180910390f35b348015610d1d57600080fd5b50610d26612c96565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5057600080fd5b50610e0a60048036036020811015610d6757600080fd5b8101908080359060200190640100000000811115610d8457600080fd5b820183602082011115610d9657600080fd5b80359060200191846001830284011164010000000083111715610db857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612caa565b005b348015610e1857600080fd5b50610ed260048036036020811015610e2f57600080fd5b8101908080359060200190640100000000811115610e4c57600080fd5b820183602082011115610e5e57600080fd5b80359060200191846001830284011164010000000083111715610e8057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d6d565b005b610edc612e30565b005b348015610eea57600080fd5b50610ef3612e3d565b604051808215151515815260200191505060405180910390f35b348015610f1957600080fd5b50610f22612e50565b6040518082815260200191505060405180910390f35b6000806005541415610f95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140806035913960400191505060405180910390fd5b60003490506000610faf8268010000000000000000612e6f565b90506000610fbf82600554612ea6565b9050610fcd60045482612ebf565b600481905550610fdc83612edb565b61104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6001935050505090565b600081600660159054906101000a900460ff16156112565760011515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806141696030913960400191505060405180910390fd5b6000611164600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612ebf565b90506722b1c8c1227a00008111156111c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806141bc603e913960400191505060405180910390fd5b6753444835ec580000823073ffffffffffffffffffffffffffffffffffffffff163101116112385780600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611254565b6000600660156101000a81548160ff0219169083151502179055505b505b61125e613f85565b61126784612f70565b905060006112858260016002811061127b57fe5b6020020151612ff1565b90506005546005548201116112e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061431d6025913960400191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168560006002811061133457fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461137f576040519150601f19603f3d011682016040523d82523d6000602084013e611384565b606091505b5091509150816113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b6113e98985613078565b83965050505050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b505050505081565b600c6020528060005260406000206000915054906101000a900460ff1681565b600081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b6000600660156101000a81548160ff021916908315150217905550565b600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116ed576116eb81613211565b505b600191505090565b60055481565b6000838280600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061426a6030913960400191505060405180910390fd5b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111580156118305750600660159054906101000a900460ff16155b611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006119128287613452565b905080600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119a0888888613469565b611a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b60019450505050509392505050565b601281565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000611ab48285612ebf565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015611c065750600660159054906101000a900460ff16155b611c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000611c66836137f5565b90506000611c976002600360009054906101000a900461ffff1661ffff16840281611c8d57fe5b0462010000612ea6565b90506000611ca58383613452565b9050611cb13386613896565b6000611cc68368010000000000000000612e6f565b90506000611cd682600554612ea6565b9050611ce460045482612ebf565b600481905550611cf384612edb565b611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168633604051602401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506040516020818303038152906040527f4ead0590000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310611e955780518252602082019150602081019050602083039250611e72565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ef7576040519150601f19603f3d011682016040523d82523d6000602084013e611efc565b606091505b509150915081611f57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b600198505050505050505050919050565b6000611f733361201e565b905090565b6000806005541415611fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000611fe8670de0b6b3a76400006137f5565b9050611ff2613f85565b611ffb82612f70565b905060008160006002811061200c57fe5b60200201518301905080935050505090565b600068010000000000000000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546004540203816120b657fe5b059050809050919050565b600080600554141561211e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000612131670de0b6b3a76400006137f5565b905061213b613f85565b61214482612f70565b90508060016002811061215357fe5b60200201519250505090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140b56038913960400191505060405180910390fd5b6000349050600061223b6002600360009054906101000a900461ffff1661ffff1684028161223157fe5b0462010000612ea6565b905060006122498383613452565b905060006122608368010000000000000000612e6f565b9050600061227082600554612ea6565b905061227e60045482612ebf565b60048190555061228d84612edb565b6122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b600061230a84612ff1565b90506123168882613078565b60019650505050505050919050565b60076020528060005260406000206000915090505481565b60008061234983612f70565b60016002811061235557fe5b60200201519050600061236782612ff1565b90508092505050919050565b60045481565b60086020528060005260406000206000915090505481565b60006005548211156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806141256044913960600191505060405180910390fd5b60006123f9836137f5565b9050600061240682612f70565b60016002811061241257fe5b602002015190508092505050919050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156124da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b6124e382613211565b5060019050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006125413361201e565b905061254d3382613ae4565b5080600260008282540392505081905550612566613c24565b6125d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561261e573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fab933177d8753a66dd869151cf9aa88649e067b7a4e2dad9d5d192d61cf593b0826040518082815260200191505060405180910390a290565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60025481565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127535780601f1061272857610100808354040283529160200191612753565b820191906000526020600020905b81548152906001019060200180831161273657829003601f168201915b505050505081565b600660149054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b60001515600660149054906101000a900460ff16151514156128b05780600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600660146101000a81548160ff0219169083151502179055505b50565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006129418285613452565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000612a403361201e565b9050612a4c3382613ae4565b5080600260008282540392505081905550612a65613c24565b612ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b6000612ae33383611058565b90503373ffffffffffffffffffffffffffffffffffffffff167f4de94b39625248a5696f0c1f78680ee8dad819ce02dc53b3b5ed5db8d95cd3d88383604051808381526020018281526020019250505060405180910390a25050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015612b9d5750600660159054906101000a900460ff16155b612c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e73666572206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b612c1a338484613469565b612c8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b6001905092915050565b600360009054906101000a900461ffff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612d53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060019080519060200190612d69929190613fa7565b5050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060009080519060200190612e2c929190613fa7565b5050565b612e3a3334611058565b50565b600660159054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080831415612e825760009050612ea0565b6000828402905082848281612e9357fe5b0414612e9b57fe5b809150505b92915050565b600080828481612eb257fe5b0490508091505092915050565b600080828401905083811015612ed157fe5b8091505092915050565b600081600260008282540192505081905550612ef5613c24565b612f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b60019050919050565b612f78613f85565b612fa2612f9983600360009054906101000a900461ffff1661ffff16612e6f565b62010000612ea6565b81600060028110612faf57fe5b602002018181525050612fd38282600060028110612fc957fe5b6020020151613452565b81600160028110612fe057fe5b602002018181525050809050919050565b600080670de0b6b3a764000064e8d4a510000290506000600554633b9aca0061306361305d60055486633b9aca00600202020260026005540a6002633b9aca000a02670de0b6b3a76400008a02670de0b6b3a7640000633b9aca0002600202026002890a010101613cce565b85613452565b8161306a57fe5b040390508092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061429a6023913960400191505060405180910390fd5b61310a60055482612ebf565b60058190555061311a8282613d13565b50613164600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482612ebf565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156132c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b60006132d3836137f5565b90506132dd613f85565b6132e682612f70565b90506132f23385613896565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460006002811061334157fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b5091509150816133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc8560016002811061341357fe5b60200201519081150290604051600060405180830381858888f19350505050158015613443573d6000803e3d6000fd5b50600195505050505050919050565b60008282111561345e57fe5b818303905092915050565b6000613473613f85565b61347c83612f70565b9050600061349a8260006002811061349057fe5b60200201516137f5565b90506134b9600554836000600281106134af57fe5b6020020151613452565b600581905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460006002811061351c57fe5b60200201516040518082815260200191505060405180910390a361357f600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485613452565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135dd85836001600281106135d357fe5b6020020151613d13565b50613638600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548360016002811061362e57fe5b6020020151612ebf565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136858685613e4c565b506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460405180600001905060006040518083038185875af1925050503d806000811461370f576040519150601f19603f3d011682016040523d82523d6000602084013e613714565b606091505b50915091508161376f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876001600281106137cb57fe5b60200201516040518082815260200191505060405180910390a36001955050505050509392505050565b600080670de0b6b3a7640000830190506000670de0b6b3a76400006005540190506000670de0b6b3a7640000613881670de0b6b3a76400008503633b9aca00670de0b6b3a7640000868161384557fe5b04633b9aca000264e8d4a510000103026002670de0b6b3a7640000876002890a038161386d57fe5b04633b9aca00028161387b57fe5b04613452565b8161388857fe5b049050809350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561391c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141996023913960400191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156139d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b613a1a600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613452565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a6960055482613452565b600581905550613a798282613e4c565b50600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080613afa8368010000000000000000612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142bd6036913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b60008061199961ffff166703782dace9d9000060025481613c4157fe5b0602905060006703782dace9d900008281613c5857fe5b04905060008161ffff1661066601905080600360006101000a81548161ffff021916908361ffff1602179055507fc2cc2ca038d89e4eb3ed987815f876e8e6aaee289e7be6e8d951d2424930763e81604051808261ffff1661ffff16815260200191505060405180910390a16001935050505090565b60008060026001840181613cde57fe5b0490508291505b81811015613d0d57809150600281828581613cfc57fe5b040181613d0557fe5b049050613ce5565b50919050565b600080613d2260045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180614342603b913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b600080613e5b60045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054039050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811315613f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140ed6038913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b6040518060400160405280600290602082028038833980820191505090505090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fe857805160ff1916838001178555614016565b82800160010185558215614016579182015b82811115614015578251825591602001919060010190613ffa565b5b5090506140239190614027565b5090565b61404991905b8082111561404557600081600090555060010161402d565b5090565b9056fe7472616e73666572206e6f7420616c6c6f776564202d20696e73756666696369656e742066756e647320617661696c61626c656d616b6549745261696e2066756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29746869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520706172746e657220636f6e74726163744552524f523a20696e746567657220756e646572666c6f7720696e20757064617465526577617264734f6e53616c652066756e6374696f6e756e61626c6520746f2063616c63756c61746520666f7220616d6f756e74206f6620746f6b656e732067726561746572207468616e2063757272656e7420737570706c797075726368617365732063757272656e746c79206c696d69746564206f6e6c7920746f20636f6e7472696275746f727363616e6e6f74206275726e20746f6b656e7320666f72207a65726f2061646472657373617474656d7074656420707572636861736520776f756c6420657863656564206c696d697420706c616365642075706f6e20636f6e7472696275746f727366756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920636f6e74726163742061646d696e6661696c656420746f2073656e642066756e647320746f20706172746e657220636f6e747261637420286e6f7420656e6f756768206761732070726f76696465643f297472616e73666572206e6f7420617574686f72697a65642028616c6c6f77616e636520696e73756666696369656e742963616e6e6f74206d696e7420746f6b656e7320666f72207a65726f20616464726573734552524f523a20696e7465676572206f766572666c6f7720696e207570646174655370656e74526577617264732066756e6374696f6e66756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29707572636861736520776f756c6420636175736520696e7465676572206f766572666c6f774552524f523a20696e7465676572206f766572666c6f7720696e20757064617465526577617264734f6e50757263686173652066756e6374696f6ea265627a7a7231582005a4502a65bb0e2a1a551683a17b6451794fc459ac3de41d759414e829c63ad564736f6c634300050c0032
Deployed Bytecode Sourcemap
202:34512:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5297:15;;;;;;;;;;;5283:29;;:10;:29;;;5278:219;;;5413:12;:10;:12::i;:::-;;5278:219;;;5449:39;5465:10;5477:9;5449:14;:39::i;:::-;;5278:219;202:34512;2153:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2153:51:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1471:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1471:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1471:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3137:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3137:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3137:45:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9740:245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9740:245:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9740:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17342:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17342:92:0;;;:::i;:::-;;7865:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7865:186:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1923:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1923:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12204:877;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12204:877:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12204:877:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1411:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1411:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10404:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10404:398:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10404:398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13259:1814;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13259:1814:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13259:1814:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20726:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20726:112:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18460:537;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18460:537:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22440:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22440:298:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22440:298:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18003:397;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18003:397:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15246:1290;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15246:1290:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2556:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2556:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2556:54:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19292:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19292:252:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19292:252:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21500:649;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1760:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1760:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2631:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2631:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2631:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19871:446;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19871:446:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19871:446:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8300:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8300:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8300:223:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21074:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21074:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21074:153:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7012:694;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7012:694:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20552:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20552:116:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1593:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1593:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1506:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1506:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1506:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2207:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3088:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3088:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3088:46:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16935:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16935:193:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16935:193:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11221:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11221:398:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11221:398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6099:717;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6099:717:0;;;:::i;:::-;;8827:499;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8827:499:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8827:499:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1669:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1669:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17759:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17759:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17759:113:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17759:113:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17759:113:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17759:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17759:113:0;;;;;;;;;;;;;;;:::i;:::-;;17541:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17541:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17541:105:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17541:105:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17541:105:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17541:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17541:105:0;;;;;;;;;;;;;;;:::i;:::-;;5736:99;;;:::i;:::-;;2483:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2483:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20374:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20374:112:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21500:649;21560:4;21627:1;21612:11;;:16;;21604:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21693:19;21715:9;21693:31;;21731:20;21754:39;21768:11;454:5;21754:12;:39::i;:::-;21731:62;;21800:33;21836:42;21850:12;21865:11;;21836:12;:42::i;:::-;21800:78;;21911:67;21925:23;;21951:25;21911:12;:67::i;:::-;21885:23;:93;;;;22059:30;22076:11;22059:15;:30::i;:::-;22050:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22141:4;22134:11;;;;;21500:649;:::o;26567:1119::-;26800:7;26755:10;25540;;;;;;;;;;;25535:959;;;25656:4;25625:35;;:13;:27;25640:10;25625:27;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;25616:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25795:24;25822:73;25836:29;:43;25867:10;25836:43;;;;;;;;;;;;;;;;25882:11;25822:12;:73::i;:::-;25795:100;;921:5;25915:16;:44;;25906:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;861:4;26132:11;26116:4;26108:21;;;:35;26106:54;26101:386;;26274:16;26228:29;:43;26259:10;26228:43;;;;;;;;;;;;;;;:62;;;;26101:386;;;26470:5;26457:10;;:18;;;;;;;;;;;;;;;;;;26101:386;25535:959;;26848:26;;:::i;:::-;26877:27;26892:10;26877:13;:27::i;:::-;26848:56;;26970:20;26993:31;27008:11;27020:1;27008:14;;;;;;;;;;;26993:13;:31::i;:::-;26970:54;;27103:11;;27088;;27073:12;:26;27072:42;27060:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27240:21;27264:15;;;;;;;;;;;27240:39;;27288:12;27302:23;27330:5;:10;;27348:11;27360:1;27348:14;;;;;;;;;;;27330:38;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;27286:82:0;;;;27384:7;27375:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27618:35;27624:13;27639:12;27618:4;:35::i;:::-;27668:12;27660:22;;;;;;;26567:1119;;;;;:::o;2153:51::-;;;;;;;;;;;;;:::o;1471:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3137:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;9740:245::-;9833:4;9888:12;9847:9;:21;9857:10;9847:21;;;;;;;;;;;;;;;:38;9869:15;9847:38;;;;;;;;;;;;;;;:53;;;;9933:15;9912:51;;9921:10;9912:51;;;9950:12;9912:51;;;;;;;;;;;;;;;;;;9977:4;9970:11;;9740:245;;;;:::o;17342:92::-;16738:4;16706:36;;:14;:28;16722:10;16706:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16697:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17425:5;17412:10;;:18;;;;;;;;;;;;;;;;;;17342:92::o;7865:186::-;7912:4;7926:14;7943:19;:31;7963:10;7943:31;;;;;;;;;;;;;;;;7926:48;;7995:1;7986:6;:10;7981:49;;;8010:12;8015:6;8010:4;:12::i;:::-;;7981:49;8043:4;8036:11;;;7865:186;:::o;1923:30::-;;;;:::o;12204:877::-;12387:4;12331:11;12345:12;11750;11712:9;:22;11722:11;11712:22;;;;;;;;;;;;;;;:34;11735:10;11712:34;;;;;;;;;;;;;;;;:50;;11703:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12527:19;:34;12548:11;12527:34;;;;;;;;;;;;;;;;12511:12;:50;;:65;;;;;12566:10;;;;;;;;;;;12565:11;12511:65;12500:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12699:21;12723:9;:22;12733:11;12723:22;;;;;;;;;;;;;;;:34;12746:10;12723:34;;;;;;;;;;;;;;;;12699:58;;12764:20;12787:44;12801:13;12817:12;12787;:44::i;:::-;12764:67;;12875:12;12838:9;:22;12848:11;12838:22;;;;;;;;;;;;;;;:34;12861:10;12838:34;;;;;;;;;;;;;;;:49;;;;12939:56;12957:11;12970:9;12981:12;12939:16;:56::i;:::-;12930:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13073:4;13066:11;;;;12204:877;;;;;;;:::o;1411:35::-;1444:2;1411:35;:::o;10404:398::-;10507:4;10521:21;10545:9;:21;10555:10;10545:21;;;;;;;;;;;;;;;:38;10567:15;10545:38;;;;;;;;;;;;;;;;10521:62;;10590:20;10613:44;10627:13;10643:12;10613;:44::i;:::-;10590:67;;10705:12;10664:9;:21;10674:10;10664:21;;;;;;;;;;;;;;;:38;10686:15;10664:38;;;;;;;;;;;;;;;:53;;;;10750:15;10729:51;;10738:10;10729:51;;;10767:12;10729:51;;;;;;;;;;;;;;;;;;10794:4;10787:11;;;;10404:398;;;;:::o;13259:1814::-;13334:4;13474:19;:33;13495:10;13474:33;;;;;;;;;;;;;;;;13458:12;:49;;:64;;;;;13512:10;;;;;;;;;;;13511:11;13458:64;13447:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13696:19;13718:29;13733:12;13718:13;:29::i;:::-;13696:51;;13754:11;13768:54;13809:1;13798:8;;;;;;;;;;;13784:22;;:11;:22;:26;;;;;;13815:5;13768:12;:54::i;:::-;13754:68;;13835:21;13859:33;13873:11;13887:3;13859:12;:33::i;:::-;13835:57;;14103:30;14108:10;14120:12;14103:4;:30::i;:::-;14210:20;14233:31;14247:3;454:5;14233:12;:31::i;:::-;14210:54;;14271:33;14307:42;14321:12;14336:11;;14307:12;:42::i;:::-;14271:78;;14382:67;14396:23;;14422:25;14382:12;:67::i;:::-;14356:23;:93;;;;14530:22;14547:3;14530:15;:22::i;:::-;14521:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14685:21;14709:15;;;;;;;;;;;14685:39;;14733:12;14747:23;14775:5;:10;;14793:13;14869:10;14809:71;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14809:71:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;14809:71:0;14775:106;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14775:106:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;14731:150:0;;;;14967:7;14958:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15061:4;15054:11;;;;;;;;;;13259:1814;;;:::o;20726:112::-;20787:7;20811:23;20822:10;20811:9;:23::i;:::-;20804:30;;20726:112;:::o;18460:537::-;18525:7;18596:1;18581:11;;:16;;18573:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18725:18;18746:21;18761:4;18746:13;:21::i;:::-;18725:42;;18774:26;;:::i;:::-;18803:27;18818:10;18803:13;:27::i;:::-;18774:56;;18923:17;18956:11;18968:1;18956:14;;;;;;;;;;;18943:10;:27;18923:47;;18984:9;18977:16;;;;;18460:537;:::o;22440:298::-;22519:21;500:5;22657:16;:33;22675:13;22657:33;;;;;;;;;;;;;;;;22616:19;:36;22637:13;22616:36;;;;;;;;;;;;;;;;22590:23;;:62;22580:110;22578:127;;;;;;22550:157;;22721:13;22714:20;;22440:298;;;:::o;18003:397::-;18062:7;18133:1;18118:11;;:16;;18110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18263:18;18284:21;18299:4;18284:13;:21::i;:::-;18263:42;;18312:26;;:::i;:::-;18341:27;18356:10;18341:13;:27::i;:::-;18312:56;;18382:11;18394:1;18382:14;;;;;;;;;;;18375:21;;;;18003:397;:::o;15246:1290::-;15344:4;15382:15;;;;;;;;;;;15368:29;;:10;:29;;;15358:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15575:19;15597:9;15575:31;;15613:11;15627:54;15668:1;15657:8;;;;;;;;;;;15643:22;;:11;:22;:26;;;;;;15674:5;15627:12;:54::i;:::-;15613:68;;15694:21;15718:33;15732:11;15746:3;15718:12;:33::i;:::-;15694:57;;15846:20;15869:31;15883:3;454:5;15869:12;:31::i;:::-;15846:54;;15907:33;15943:42;15957:12;15972:11;;15943:12;:42::i;:::-;15907:78;;16018:67;16032:23;;16058:25;16018:12;:67::i;:::-;15992:23;:93;;;;16166:22;16183:3;16166:15;:22::i;:::-;16157:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16272:20;16295:30;16310:13;16295;:30::i;:::-;16272:53;;16479:35;16485:13;16500:12;16479:4;:35::i;:::-;16528:4;16521:11;;;;;;;;15246:1290;;;:::o;2556:54::-;;;;;;;;;;;;;;;;;:::o;19292:252::-;19383:7;19400:21;19424:27;19439:10;19424:13;:27::i;:::-;19452:1;19424:30;;;;;;;;;;;19400:54;;19461:20;19484:30;19499:13;19484;:30::i;:::-;19461:53;;19528:12;19521:19;;;;19292:252;;;:::o;1760:42::-;;;;:::o;2631:50::-;;;;;;;;;;;;;;;;;:::o;19871:446::-;19961:7;20003:11;;19987:12;:27;;19978:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20141:18;20162:29;20177:12;20162:13;:29::i;:::-;20141:50;;20232:21;20256:27;20271:10;20256:13;:27::i;:::-;20284:1;20256:30;;;;;;;;;;;20232:54;;20300:13;20293:20;;;;19871:446;;;:::o;8300:223::-;8372:4;8411:19;:31;8431:10;8411:31;;;;;;;;;;;;;;;;8395:12;:47;;8386:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8483:18;8488:12;8483:4;:18::i;:::-;;8515:4;8508:11;;8300:223;;;:::o;21074:153::-;21155:15;21188:19;:34;21208:13;21188:34;;;;;;;;;;;;;;;;21180:43;;21074:153;;;:::o;7012:694::-;7059:18;7152:23;7163:10;7152:9;:23::i;:::-;7139:36;;7288:44;7308:10;7321;7288:18;:44::i;:::-;;7398:10;7377:17;;:31;;;;;;;;;;;7424:13;:11;:13::i;:::-;7415:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7512:10;:19;;:33;7533:10;7512:33;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7512:33:0;7678:10;7669:33;;;7690:10;7669:33;;;;;;;;;;;;;;;;;;7012:694;:::o;20552:116::-;20609:7;20633:19;:31;20653:10;20633:31;;;;;;;;;;;;;;;;20626:38;;20552:116;:::o;1593:36::-;;;;:::o;1506:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2207:::-;;;;;;;;;;;;;:::o;3088:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;16935:193::-;16738:4;16706:36;;:14;:28;16722:10;16706:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16697:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17045:5;17031:19;;:10;;;;;;;;;;;:19;;;17026:99;;;17082:7;17064:15;;:25;;;;;;;;;;;;;;;;;;17113:4;17100:10;;:17;;;;;;;;;;;;;;;;;;17026:99;16935:193;:::o;11221:398::-;11324:4;11338:21;11362:9;:21;11372:10;11362:21;;;;;;;;;;;;;;;:38;11384:15;11362:38;;;;;;;;;;;;;;;;11338:62;;11407:20;11430:44;11444:13;11460:12;11430;:44::i;:::-;11407:67;;11522:12;11481:9;:21;11491:10;11481:21;;;;;;;;;;;;;;;:38;11503:15;11481:38;;;;;;;;;;;;;;;:53;;;;11567:15;11546:51;;11555:10;11546:51;;;11584:12;11546:51;;;;;;;;;;;;;;;;;;11611:4;11604:11;;;;11221:398;;;;:::o;6099:717::-;6195:18;6216:23;6227:10;6216:9;:23::i;:::-;6195:44;;6352;6372:10;6385;6352:18;:44::i;:::-;;6462:10;6441:17;;:31;;;;;;;;;;;6488:13;:11;:13::i;:::-;6479:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6580:17;6600:39;6615:10;6628;6600:14;:39::i;:::-;6580:59;;6777:10;6766:46;;;6789:10;6802:9;6766:46;;;;;;;;;;;;;;;;;;;;;;;;6099:717;;:::o;8827:499::-;8916:4;9059:19;:33;9080:10;9059:33;;;;;;;;;;;;;;;;9043:12;:49;;:64;;;;;9097:10;;;;;;;;;;;9096:11;9043:64;9032:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9187:55;9205:10;9217:9;9228:12;9187:16;:55::i;:::-;9178:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9318:4;9311:11;;8827:499;;;;:::o;1669:42::-;;;;;;;;;;;;;:::o;17759:113::-;16738:4;16706:36;;:14;:28;16722:10;16706:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16697:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17859:9;17850:6;:18;;;;;;;;;;;;:::i;:::-;;17759:113;:::o;17541:105::-;16738:4;16706:36;;:14;:28;16722:10;16706:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16697:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17635:7;17628:4;:14;;;;;;;;;;;;:::i;:::-;;17541:105;:::o;5736:99::-;5792:39;5808:10;5820:9;5792:14;:39::i;:::-;;5736:99::o;2483:29::-;;;;;;;;;;;;;:::o;20374:112::-;20440:4;20469;20461:21;;;20454:28;;20374:112;:::o;34886:180::-;34944:7;34969:1;34964;:6;34960:39;;;34990:1;34983:8;;;;34960:39;35005:9;35021:1;35017;:5;35005:17;;35045:1;35040;35036;:5;;;;;;:10;35029:18;;;;35061:1;35054:8;;;34886:180;;;;;:::o;35136:268::-;35194:7;35285:9;35301:1;35297;:5;;;;;;35285:17;;35399:1;35392:8;;;35136:268;;;;:::o;35666:131::-;35724:7;35740:9;35756:1;35752;:5;35740:17;;35776:1;35771;:6;;35764:14;;;;35792:1;35785:8;;;35666:131;;;;:::o;23314:206::-;23389:4;23424:11;23403:17;;:32;;;;;;;;;;;23451:13;:11;:13::i;:::-;23442:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23512:4;23505:11;;23314:206;;;:::o;30524:289::-;30600:24;;:::i;:::-;30650:53;30664:30;30677:6;30685:8;;;;;;;;;;;30664:30;;:12;:30::i;:::-;30696:5;30650:12;:53::i;:::-;30635:9;30645:1;30635:12;;;;;;;;;;:68;;;;;30731:37;30745:6;30754:9;30764:1;30754:12;;;;;;;;;;;30731;:37::i;:::-;30716:9;30726:1;30716:12;;;;;;;;;;:52;;;;;30800:9;30793:16;;30524:289;;;:::o;30932:779::-;31012:7;31029:25;31079:4;1113:14;31057:26;31029:54;;31090:23;31661:11;;1308:17;31182:428;31215:355;31534:11;;31514:17;1308;31482:1;:29;:49;:63;31447:1;31432:11;;:16;31424:1;1308:17;31395:30;31393:57;31355:4;31342:10;:17;31331:4;1308:17;31307:28;31301:1;:36;:60;31268:1;31249:17;:20;31247:116;:205;:300;31215:4;:355::i;:::-;31591:17;31182:12;:428::i;:::-;31134:515;;;;;;31123:551;31090:584;;31692:15;31685:22;;;;30932:779;;;:::o;24680:703::-;24795:1;24770:27;;:13;:27;;;;24761:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24859:41;24873:11;;24886:12;24859;:41::i;:::-;24845:11;:55;;;;25038:54;25063:13;25078:12;25038:23;:54::i;:::-;;25212:65;25226:19;:34;25246:13;25226:34;;;;;;;;;;;;;;;;25263:12;25212;:65::i;:::-;25175:19;:34;25195:13;25175:34;;;;;;;;;;;;;;;:102;;;;25351:13;25330:49;;25347:1;25330:49;;;25366:12;25330:49;;;;;;;;;;;;;;;;;;24680:703;;:::o;29324:1023::-;29388:4;29427:19;:33;29448:10;29427:33;;;;;;;;;;;;;;;;29411:12;:49;;29402:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29555:18;29576:29;29591:12;29576:13;:29::i;:::-;29555:50;;29612:26;;:::i;:::-;29641:27;29656:10;29641:13;:27::i;:::-;29612:56;;29861:30;29866:10;29878:12;29861:4;:30::i;:::-;29974:21;29998:15;;;;;;;;;;;29974:39;;30022:12;30036:23;30064:5;:10;;30082:11;30094:1;30082:14;;;;;;;;;;;30064:38;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;30020:82:0;;;;30118:7;30109:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30288:10;:19;;:37;30309:11;30321:1;30309:14;;;;;;;;;;;30288:37;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30288:37:0;30339:4;30332:11;;;;;;;29324:1023;;;:::o;35505:111::-;35563:7;35591:1;35586;:6;;35579:14;;;;35611:1;35607;:5;35600:12;;35505:111;;;;:::o;32574:1736::-;32692:4;32707:26;;:::i;:::-;32736:29;32751:12;32736:13;:29::i;:::-;32707:58;;32819:20;32842:31;32857:11;32869:1;32857:14;;;;;;;;;;;32842:13;:31::i;:::-;32819:54;;32932:42;32945:11;;32959;32971:1;32959:14;;;;;;;;;;;32932:12;:42::i;:::-;32918:11;:56;;;;33097:1;33067:49;;33076:11;33067:49;;;33101:11;33113:1;33101:14;;;;;;;;;;;33067:49;;;;;;;;;;;;;;;;;;33202:64;33216:19;:34;33237:11;33216:34;;;;;;;;;;;;;;;;33252:12;33202;:64::i;:::-;33165:19;:34;33186:11;33165:34;;;;;;;;;;;;;;;:101;;;;33389:52;33414:9;33425:11;33437:1;33425:14;;;;;;;;;;;33389:23;:52::i;:::-;;33523:64;33537:19;:32;33558:9;33537:32;;;;;;;;;;;;;;;;33571:11;33583:1;33571:14;;;;;;;;;;;33523:12;:64::i;:::-;33488:19;:32;33509:9;33488:32;;;;;;;;;;;;;;;:99;;;;33856:48;33877:11;33890:12;33856:19;:48::i;:::-;;33985:21;34009:15;;;;;;;;;;;33985:39;;34033:12;34047:23;34075:5;:10;;34093:12;34075:36;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;34031:80:0;;;;34127:7;34118:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34261:9;34238:50;;34248:11;34238:50;;;34272:11;34284:1;34272:14;;;;;;;;;;;34238:50;;;;;;;;;;;;;;;;;;34302:4;34295:11;;;;;;;32574:1736;;;;;:::o;31886:609::-;31967:7;31984:14;32017:4;32003:11;:18;31984:39;;32030:27;32076:4;32062:11;;:18;32030:52;;32089:21;32458:4;32153:293;32354:4;32345:6;:13;1308:17;32275:4;32253:19;:26;;;;;;1308:17;32227:54;1113:14;32203:80;32201:124;32182:178;32443:1;32432:4;32421:6;32417:1;32407:6;:11;:20;32405:31;;;;;;1308:17;32379:59;32377:67;;;;;;32153:12;:293::i;:::-;:309;;;;;;32089:375;;32478:13;32471:20;;;;;31886:609;;;:::o;28396:880::-;28511:1;28486:27;;:13;:27;;;;28477:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28586:19;:36;28607:13;28586:36;;;;;;;;;;;;;;;;28570:12;:52;;28561:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28806:64;28820:19;:34;28840:13;28820:34;;;;;;;;;;;;;;;;28856:12;28806;:64::i;:::-;28769:19;:34;28789:13;28769:34;;;;;;;;;;;;;;;:101;;;;28930:41;28944:11;;28957:12;28930;:41::i;:::-;28916:11;:55;;;;29118:50;29139:13;29154:12;29118:19;:50::i;:::-;;29253:1;29221:49;;29230:13;29221:49;;;29257:12;29221:49;;;;;;;;;;;;;;;;;;28396:880;;:::o;23586:424::-;23686:4;23700:21;23767:37;23781:10;454:5;23767:12;:37::i;:::-;23724:16;:31;23741:13;23724:31;;;;;;;;;;;;;;;;:82;23700:106;;23841:16;:31;23858:13;23841:31;;;;;;;;;;;;;;;;23823:14;:49;;23813:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23974:14;23940:16;:31;23957:13;23940:31;;;;;;;;;;;;;;;:48;;;;24002:4;23995:11;;;23586:424;;;;:::o;22820:429::-;22870:4;22884:16;661:4;22905:51;;584:9;22906:17;;:34;;;;;;22905:51;22884:74;;22965:20;584:9;22996:11;:28;;;;;;22965:61;;23033:17;23073:13;23061:25;;727:4;23061:25;23033:55;;23151:10;23140:8;;:21;;;;;;;;;;;;;;;;;;23197:29;23214:10;23197:29;;;;;;;;;;;;;;;;;;;;;;23240:4;23233:12;;;;;22820:429;:::o;34502:191::-;34562:6;34578;34597:1;34592;34588;:5;34587:11;;;;;;34578:20;;34609:1;34605:5;;34617:73;34628:1;34624;:5;34617:73;;;34651:1;34647:5;;34681:1;34676;34672;34668;:5;;;;;;:9;34667:15;;;;;;34663:19;;34617:73;;;34502:191;;;;:::o;24150:456::-;24257:4;24271:21;24338:53;24352:23;;24377:12;24338;:53::i;:::-;24295:16;:31;24312:13;24295:31;;;;;;;;;;;;;;;;:98;24271:122;;24428:16;:31;24445:13;24428:31;;;;;;;;;;;;;;;;24410:14;:49;;24400:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24566:14;24532:16;:31;24549:13;24532:31;;;;;;;;;;;;;;;:48;;;;24598:4;24591:11;;;24150:456;;;;:::o;27838:445::-;27941:4;27955:21;28022:53;28036:23;;28061:12;28022;:53::i;:::-;27979:16;:31;27996:13;27979:31;;;;;;;;;;;;;;;;:98;27955:122;;28112:16;:31;28129:13;28112:31;;;;;;;;;;;;;;;;28094:14;:49;;28084:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28247:14;28213:16;:31;28230:13;28213:31;;;;;;;;;;;;;;;:48;;;;28275:4;28268:11;;;27838:445;;;;:::o;202:34512::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;202:34512:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://05a4502a65bb0e2a1a551683a17b6451794fc459ac3de41d759414e829c63ad5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,568.61 | 0.0569 | $202.9 |
[ Download: CSV Export ]
[ 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.