Latest 25 from a total of 54 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Settled Convertv... | 23635247 | 15 days ago | IN | 0 ETH | 0.00007135 | ||||
| Settled Convertv... | 23635209 | 15 days ago | IN | 0 ETH | 0.00013431 | ||||
| Settled Convert ... | 13865215 | 1414 days ago | IN | 0 ETH | 0.00242715 | ||||
| Register Globall... | 13865215 | 1414 days ago | IN | 0 ETH | 0.00505214 | ||||
| Withdraw WEI | 13193267 | 1519 days ago | IN | 0 ETH | 0.00409188 | ||||
| Repayv SPY | 13193073 | 1519 days ago | IN | 0 ETH | 0.00555326 | ||||
| Withdraw WEI | 13193062 | 1519 days ago | IN | 0 ETH | 0.00318633 | ||||
| Repayv SPY | 13193047 | 1519 days ago | IN | 0 ETH | 0.00651603 | ||||
| Oracle Updatewei... | 13154481 | 1525 days ago | IN | 0 ETH | 0.00299023 | ||||
| Oracle Updatewei... | 13083470 | 1536 days ago | IN | 0 ETH | 0.0016856 | ||||
| Gov Start Global... | 13058021 | 1540 days ago | IN | 0 ETH | 0.00303732 | ||||
| Oracle Updatewei... | 13014521 | 1547 days ago | IN | 0 ETH | 0.00101136 | ||||
| Oracle Updatewei... | 12961029 | 1555 days ago | IN | 0 ETH | 0.00121363 | ||||
| Withdraw WEI | 12960395 | 1555 days ago | IN | 0 ETH | 0.00203797 | ||||
| Repayv SPY | 12960354 | 1555 days ago | IN | 0 ETH | 0.00251273 | ||||
| Oracle Updatewei... | 12871550 | 1569 days ago | IN | 0 ETH | 0.0011462 | ||||
| Oracle Updatewei... | 12777572 | 1584 days ago | IN | 0 ETH | 0.0011462 | ||||
| Oracle Updatewei... | 12603370 | 1611 days ago | IN | 0 ETH | 0.00040454 | ||||
| Oracle Updatewei... | 12489097 | 1629 days ago | IN | 0 ETH | 0.00101169 | ||||
| Oracle Updatewei... | 12434951 | 1637 days ago | IN | 0 ETH | 0.0039443 | ||||
| Oracle Updatewei... | 12331036 | 1653 days ago | IN | 0 ETH | 0.00226207 | ||||
| Oracle Updatewei... | 12272067 | 1662 days ago | IN | 0 ETH | 0.00509051 | ||||
| Oracle Updatewei... | 12156066 | 1680 days ago | IN | 0 ETH | 0.00424597 | ||||
| Oracle Updatewei... | 12078586 | 1692 days ago | IN | 0 ETH | 0.00356175 | ||||
| Oracle Updatewei... | 12025559 | 1700 days ago | IN | 0 ETH | 0.00457009 |
Latest 9 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 23635247 | 15 days ago | 0.13915381 ETH | ||||
| Transfer | 23635209 | 15 days ago | 1.26898817 ETH | ||||
| - | 13865215 | 1414 days ago | 1.07319984 ETH | ||||
| - | 13193267 | 1519 days ago | 23 ETH | ||||
| - | 13193062 | 1519 days ago | 0.15 ETH | ||||
| - | 12960395 | 1555 days ago | 22 ETH | ||||
| - | 11284758 | 1814 days ago | 0.05 ETH | ||||
| - | 11271402 | 1816 days ago | Contract Creation | 0 ETH | |||
| - | 11271402 | 1816 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
VaultSystem
Compiler Version
v0.7.2+commit.51b20bc0
Contract Source Code (Solidity Multiple files format)
pragma solidity 0.7.2;
// SPDX-License-Identifier: JPLv1.2-NRS Public License; Special Conditions with IVT being the Token, ItoVault the copyright holder
import "./SafeMath.sol";
import "./GeneralToken.sol";
contract VaultSystem {
using SafeMath for uint256;
event loguint(string name, uint value);
GeneralToken public vSPYToken;
GeneralToken public ivtToken;
// NB: None of the storage variables below should store numbers greater than 1E36. uint256 overflow above 1E73.
// So it is safe to mul two numbers always. But to mul more than 2 requires decimal counting.
uint public weiPervSPY = 10 ** 18;
uint public maxvSPYE18 = 1000 * 10 ** 18; // Upper Bound on Number of vSPY tokens
uint public outstandingvSPYE18 = 0; // Current outstanding vSPY tokens
// Forward (not counter) Vault System
uint public initialLTVE10 = 7 * 10 ** 9; // Maximum starting loan to value of a vault [Integer / 1E10]
uint public maintLTVE10 = 8 * 10 ** 9; // Maximum maintnenance loan to value of a vault [Integer / 1E10]
uint public liqPenaltyE10 = 1 * 10 ** 9; // Bonus paid to any address for liquidating non-compliant
// contract [Integer / 1E10]
// In this system, individual vaults *are* addresses. Instances of vaults then are mapped by bare address
// Each vault has an "asset" side and a "debt" side
mapping(address => uint) public weiAsset; // Weis the Vault owns -- the asset side
mapping(address => uint) public vSPYDebtE18; // vSPY -- the debt side of the balance sheet of each Vault
// Counter Vault Contract
uint public initialLTVCounterVaultE10 = 7 * 10 ** 9; // Maximum starting loan to value of a vault [Integer / 1E10]
uint public maintLTVCounterVaultE10 = 8 * 10 ** 9; // Maximum maintnenance loan to value of a vault [Integer / 1E10]
uint public liqPenaltyCounterVaultE10 = 1 * 10 ** 9; // Bonus paid to any address for liquidating non-compliant
// contract [Integer / 1E10]
mapping(address => uint) public vSPYAssetCounterVaultE18; // vSPY deposited in inverse vault
mapping(address => uint) public weiDebtCounterVault; // weiDebtCounterVault
// The following variables track all Vaults. Not strictly needed, but helps liquidate non-compliant vaults
mapping(address => bool) public isAddressRegistered; // Forward map to emulate a "set" struct
address[] public registeredAddresses; // Backward map for "set" struct
address payable public owner; // owner is also governor here. to be passed to WATDAO in the future
address payable public oracle; //
bool public inGlobalSettlement = false;
uint public globalSettlementStartTime;
uint public settledWeiPervSPY;
bool public isGloballySettled = false;
uint public lastOracleTime;
bool public oracleChallenged = false; // Is the whitelisted oracle (system) in challenge?
uint public lastChallengeValue; // The weiPervSPY value of the last challenge [Integer atomic weis per 1 unit SPX (e.g. SPX ~ $3300 in Oct 2020)]
uint public lastChallengeIVT; // The WATs staked in the last challenge [WAT atomic units]
uint public lastChallengeTime; // The time of the last challenge, used for challenge expiry[Seconds since Epoch]
uint[] public challengeIVTokens; // Dynamic array of all challenges, integer indexed to match analagous arrays, used like a stack in code
uint[] public challengeValues; // Dynamic array of all challenges, integer indexed, used like a stack in code
address[] public challengers; // Dynamic array of all challengers, integer indexed, used like a stack in code
constructor() {
owner = msg.sender;
oracle = msg.sender;
vSPYToken = new GeneralToken(10 ** 30, address(this), "vSPY Token V_1_0_0", "vSPY V1_0"); // 18 decimals after the point, 12 before
ivtToken = new GeneralToken(10 ** 30, msg.sender, "ItoVault Token V_1_0_0", "IVT V1_0");
}
// Oracle Functions
function oracleUpdateweiPervSPY(uint _weiPervSPY) public {
require(msg.sender == oracle, "Disallowed: You are not oracle");
weiPervSPY = _weiPervSPY;
lastOracleTime = block.timestamp;
}
// Governance Functions
function govUpdateinitialLTVE10(uint _initialLTVE10) public {
require(msg.sender == owner, "Disallowed: You are not governance");
initialLTVE10 = _initialLTVE10;
}
function govUpdatemaintLTVE10(uint _maintLTVE10) public {
require(msg.sender == owner, "Disallowed: You are not governance");
maintLTVE10 = _maintLTVE10;
}
function govUpdateliqPenaltyE10(uint _liqPenaltyE10) public {
require(msg.sender == owner, "Disallowed: You are not governance");
liqPenaltyE10 = _liqPenaltyE10;
}
function govUpdateinitialLTVCounterVaultE10(uint _initialLTVCounterVaultE10) public {
require(msg.sender == owner, "Disallowed: You are not governance");
initialLTVCounterVaultE10 = _initialLTVCounterVaultE10;
}
function govUpdatemaintLTVCounterVaultE10(uint _maintLTVCounterVaultE10) public {
require(msg.sender == owner, "Disallowed: You are not governance");
maintLTVCounterVaultE10 = _maintLTVCounterVaultE10;
}
function govUpdateliqPenaltyCounterVaultE10(uint _liqPenaltyCounterVaultE10) public {
require(msg.sender == owner, "Disallowed: You are not governance");
liqPenaltyCounterVaultE10 = _liqPenaltyCounterVaultE10;
}
function govChangeOwner(address payable _owner) public {
require(msg.sender == owner, "Disallowed: You are not governance");
owner = _owner;
}
function govChangeOracle(address payable _oracle) public {
require(msg.sender == owner, "Disallowed: You are not governance");
oracle = _oracle;
}
function govChangeMaxvSPYE18(uint _maxvSPYE18) public {
require(msg.sender == owner, "Disallowed: You are not governance");
maxvSPYE18 = _maxvSPYE18;
}
function govStartGlobalSettlement() public {
require(msg.sender == owner, "Disallowed: You are not governance");
inGlobalSettlement = true;
globalSettlementStartTime = block.timestamp;
}
// Vault Functions
function depositWEI() public payable { // same as receive fallback; but explictily declared for symmetry
require(msg.value > 0, "Must Deposit Nonzero Wei");
weiAsset[msg.sender] = weiAsset[msg.sender].add( msg.value );
if(isAddressRegistered[msg.sender] != true) { // if user was not registered before
isAddressRegistered[msg.sender] = true;
registeredAddresses.push(msg.sender);
}
}
receive() external payable { // same as receive fallback; but explictily declared for symmetry
require(msg.value > 0, "Must Deposit Nonzero Wei");
// Receiving is automatic so double entry accounting not possible here
weiAsset[msg.sender] = weiAsset[msg.sender].add( msg.value );
if(isAddressRegistered[msg.sender] != true) { // if user was not registered before
isAddressRegistered[msg.sender] = true;
registeredAddresses.push(msg.sender);
}
}
function withdrawWEI(uint _weiWithdraw) public { // NB: Security model is against msg.sender
// presuming contract withdrawal is from own vault
require( _weiWithdraw < 10 ** 30, "Protective max bound for uint argument");
// Maintenence Equation: (vSPYDebtE18/1E18) * weiPervSPY <= (weiAsset) * (initialLTVE10/1E10)
// I need: (vSPYDebtE18)/1E18 * weiPervSPY <= (weiAsset - _weiWithdraw) * (initialLTVE10/1E10)
uint LHS = vSPYDebtE18[msg.sender].mul( weiPervSPY ).mul( 10 ** 10 );
uint RHS = (weiAsset[msg.sender].sub( _weiWithdraw )).mul( initialLTVE10 ).mul( 10 ** 18 );
require ( LHS <= RHS, "Your initial margin is insufficient for withdrawing.");
// Double Entry Accounting
weiAsset[msg.sender] = weiAsset[msg.sender].sub( _weiWithdraw ); // penalize wei deposited before sending money out
msg.sender.transfer(_weiWithdraw);
}
function lendvSPY(uint _vSPYLendE18) public {
//presuming message sender is using his own vault
require(_vSPYLendE18 < 10 ** 30, "Protective max bound for uint argument");
require(outstandingvSPYE18.add( _vSPYLendE18 ) <= maxvSPYE18, "Current version limits max amount of vSPY possible");
// Maintenence Equation: (vSPYDebtE18/1E18) * weiPervSPY <= (weiAsset) * (initialLTVE10/1E10)
// I need: (_vSPYLendE18 + vSPYDebtE18)/1E18 * weiPervSPY < weiAsset * (initialLTVE10/1E10)
uint LHS = vSPYDebtE18[msg.sender].add( _vSPYLendE18 ).mul( weiPervSPY ).mul( 10 ** 10 );
uint RHS = weiAsset[msg.sender].mul( initialLTVE10 ).mul( 10 ** 18 );
require(LHS < RHS, "Your initial margin is insufficient for lending");
// Double Entry Accounting
vSPYDebtE18[msg.sender] = vSPYDebtE18[msg.sender].add( _vSPYLendE18 ); // penalize debt first.
outstandingvSPYE18 = outstandingvSPYE18.add(_vSPYLendE18);
vSPYToken.transfer(msg.sender, _vSPYLendE18);
}
function repayvSPY(uint _vSPYRepayE18) public {
require(_vSPYRepayE18 < 10 ** 30, "Protective max bound for uint argument");
vSPYToken.ownerApprove(msg.sender, _vSPYRepayE18);
// Double Entry Accounting
vSPYToken.transferFrom(msg.sender, address(this), _vSPYRepayE18); // the actual deduction from the token contract
vSPYDebtE18[msg.sender] = vSPYDebtE18[msg.sender].sub( _vSPYRepayE18 );
outstandingvSPYE18 = outstandingvSPYE18.sub(_vSPYRepayE18);
}
function liquidateNonCompliant(uint _vSPYProvidedE18, address payable target_address) public { // liquidates a portion of the contract for non-compliance
// While it possible to have a more complex liquidation system, since liqudations are off-equilibrium, for the MVP
// We have decided we want overly aggressive liqudiations
// Maintenence Equation: (vSPYDebtE18/1E18) * weiPervSPY <= (weiAsset) * (maintLTVE10/1E10)
// For a violation, the above will be flipped: (vSPYDebtE18/1E18) * weiPervSPY > (weiAsset) * (maintLTVE10/1E10)
require( _vSPYProvidedE18 <= vSPYDebtE18[target_address], "You cannot provide more vSPY than vSPYDebt outstanding");
uint LHS = vSPYDebtE18[target_address].mul( weiPervSPY ).mul( 10 ** 10);
uint RHS = weiAsset[target_address].mul( maintLTVE10 ).mul( 10 ** 18);
require(LHS > RHS, "Current contract is within maintainance margin, so you cannot run this");
// If this vault is underwater-with-respect-to-rewards (different than noncompliant), liquidation is pro-rata
// underater iff: weiAsset[target_address] < vSPYDebtE18[target_address]/1E18 * weiPervSPY * (liqPenaltyE10+1E10)/1E10
uint LHS2 = weiAsset[target_address].mul( 10 ** 18 ).mul( 10 ** 10);
uint RHS2 = vSPYDebtE18[target_address].mul( weiPervSPY ).mul( liqPenaltyE10.add( 10 ** 10 ));
uint weiClaim;
if( LHS2 < RHS2 ) { // pro-rata claim
// weiClaim = ( _vSPYProvidedE18 / vSPYDebtE18[target_address]) * weiAsset[target_address];
weiClaim = _vSPYProvidedE18.mul( weiAsset[target_address] ).div( vSPYDebtE18[target_address] );
} else {
// maxWeiClaim = _vSPYProvidedE18/1E18 * weiPervSPY * (1+liqPenaltyE10/1E10)
weiClaim = _vSPYProvidedE18.mul( weiPervSPY ).mul( liqPenaltyE10.add( 10 ** 10 )).div( 10 ** 18 ).div( 10 ** 10 );
}
require(weiClaim <= weiAsset[target_address], "Code Error if you reached this point");
// Double Entry Accounting for returning vSPY Debt back
vSPYToken.ownerApprove(msg.sender, _vSPYProvidedE18);
vSPYToken.transferFrom(msg.sender, address(this), _vSPYProvidedE18); // the actual deduction from the token contract
vSPYDebtE18[target_address] = vSPYDebtE18[target_address].sub( _vSPYProvidedE18 );
outstandingvSPYE18 = outstandingvSPYE18.sub( _vSPYProvidedE18 );
// Double Entry Accounting for deducting the vault's assets
weiAsset[target_address] = weiAsset[target_address].sub( weiClaim );
msg.sender.transfer( weiClaim );
}
// Counter Vault Functions
function depositvSPYCounterVault(uint _vSPYDepositE18) public {
require( _vSPYDepositE18 < 10 ** 30, "Protective max bound for uint argument");
// Transfer Tokens from sender, then double-entry account for it
vSPYToken.ownerApprove(msg.sender, _vSPYDepositE18);
vSPYToken.transferFrom(msg.sender, address(this), _vSPYDepositE18);
vSPYAssetCounterVaultE18[msg.sender] = vSPYAssetCounterVaultE18[msg.sender].add(_vSPYDepositE18);
if(isAddressRegistered[msg.sender] != true) { // if user was not registered before
isAddressRegistered[msg.sender] = true;
registeredAddresses.push(msg.sender);
}
}
function withdrawvSPYCounterVault(uint _vSPYWithdrawE18) public {
require( _vSPYWithdrawE18 < 10 ** 30, "Protective max bound for uint argument");
// Master equation for countervault: (weiDebtCounterVault ) < (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (initialLTVCounterVaultE10/1E10)
// I need: (weiDebtCounterVault ) < (vSPYAssetCounterVaultE18 - _vSPYLendE18)/1E18 * weiPervSPY * (initialLTVCounterVaultE10/1E10)
uint LHS = weiDebtCounterVault[msg.sender].mul( 10 ** 10 ).mul( 10 ** 18 );
uint RHS = vSPYAssetCounterVaultE18[msg.sender].sub( _vSPYWithdrawE18 ).mul( weiPervSPY ).mul( initialLTVCounterVaultE10 );
require ( LHS <= RHS, 'Your initial margin is insufficient for withdrawing.' );
vSPYAssetCounterVaultE18[msg.sender] = vSPYAssetCounterVaultE18[msg.sender].sub( _vSPYWithdrawE18 ); // Penalize Account First
vSPYToken.transfer(msg.sender, _vSPYWithdrawE18);
}
function lendWeiCounterVault(uint _weiLend) public {
//presuming message sender is using his own vault
require(_weiLend < 10 ** 30, "Protective Max Bound for Input Hit");
// Master equation for countervault: (weiDebtCounterVault ) < (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (initialLTVCounterVaultE10/1E10)
// I need: (weiDebtCounterVault + _weiWithdraw ) < weiPervSPY * (vSPYAssetCounterVaultE18/1E18) * (initialLTVCounterVaultE10/1E10)
uint LHS = weiDebtCounterVault[msg.sender].add( _weiLend ).mul( 10** 18 ).mul( 10 ** 10 );
uint RHS = weiPervSPY.mul( vSPYAssetCounterVaultE18[msg.sender] ).mul( initialLTVCounterVaultE10 );
require(LHS <= RHS, "Your initial margin is insufficient for lending.");
// Double-entry accounting
weiDebtCounterVault[msg.sender] = weiDebtCounterVault[msg.sender].add( _weiLend ); // penalize debt first.
msg.sender.transfer(_weiLend);
}
function repayWeiCounterVault() public payable {
require(msg.value < 10 ** 30, "Protective Max Bound for Input Hit");
require(msg.value <= weiDebtCounterVault[msg.sender], "You cannot pay down more Wei debt than exists in this counterVault");
// Single entry accounting
weiDebtCounterVault[msg.sender] = weiDebtCounterVault[msg.sender].sub( msg.value );
}
function liquidateNonCompliantCounterVault(address payable _targetCounterVault) payable public { // liquidates a portion of the counterVault for non-compliance
// Security Presumption here is against favor of the runner of this function
require( msg.value < 10 ** 30 , "Protective Max Bound for WEI Hit");
require( msg.value <= weiDebtCounterVault[_targetCounterVault], "You cannot provide more Wei than Wei debt outstanding");
// Vault Needs to be in Violation: (weiDebtCounterVault ) > (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (maintLTVE10InverseVault/1E10)
uint LHS = weiDebtCounterVault[_targetCounterVault].mul( 10 ** 18 ).mul( 10 ** 10 );
uint RHS = vSPYAssetCounterVaultE18[_targetCounterVault].mul( weiPervSPY ).mul( maintLTVCounterVaultE10 );
emit loguint("RHS", RHS);
emit loguint("LHS", LHS);
require(LHS > RHS, "Current contract is within maintenence margin");
// If this Counter Vault is underwater-with-respect-to-rewards (different than noncompliant), liquidation is pro-rata
// underater iff: vSPYAssetCounterVaultE18[_targetCounterVault] < (weiDebtCounterVault[_targetCounterVault]/ weiPervSPY) * 1E18 * (liqPenaltyCounterVaultE10+1E10)/1E10
uint LHS2 = vSPYAssetCounterVaultE18[_targetCounterVault];
uint RHS2 = weiDebtCounterVault[_targetCounterVault].mul( liqPenaltyCounterVaultE10.add( 10 ** 10 )).mul( 10 ** 8 ).div( weiPervSPY );
emit loguint("RHS2", RHS2);
emit loguint("LHS2", LHS2);
uint vSPYClaimE18;
if( LHS2 < RHS2 ) { // if vault is rewards-underwater, pro-rate
// vSPYClaimE18 = ( msg.value / weiDebtCounterVault[_targetCounterVault]) * vSPYAssetCounterVaultE18[_targetCounterVault];
vSPYClaimE18 = msg.value.mul( vSPYAssetCounterVaultE18[_targetCounterVault] ).div( weiDebtCounterVault[_targetCounterVault] );
require(vSPYClaimE18 <= vSPYAssetCounterVaultE18[_targetCounterVault], "Code Error Branch 1 if you reached this point");
} else { // if we have more than enough assets in this countervault
// vSPYClaimE18 = (msg.value / weiPervSPY) * 1E18 * (1E10+liqPenaltyE10) /1E10
vSPYClaimE18 = msg.value.mul( liqPenaltyCounterVaultE10.add( 10 ** 10 )).mul( 10 ** 8 ).div(weiPervSPY) ;
require(vSPYClaimE18 <= vSPYAssetCounterVaultE18[_targetCounterVault], "Code Error Branch 2 if you reached this point");
}
// Single Entry Accounting for Returning the wei Debt
weiDebtCounterVault[_targetCounterVault] = weiDebtCounterVault[_targetCounterVault].sub( msg.value );
// Double Entry Accounting
vSPYAssetCounterVaultE18[_targetCounterVault] = vSPYAssetCounterVaultE18[_targetCounterVault].sub( vSPYClaimE18 ); // Amount of Assets to Transfer override
vSPYToken.transfer( msg.sender , vSPYClaimE18 );
}
function partial1LiquidateNonCompliantCounterVault(address payable _targetCounterVault) payable public returns(uint, uint) { // liquidates a portion of the counterVault for non-compliance
// Security Presumption here is against favor of the runner of this function
require( msg.value < 10 ** 30 , "Protective Max Bound for WEI Hit");
require( msg.value <= weiDebtCounterVault[_targetCounterVault], "You cannot provide more Wei than Wei debt outstanding");
// Vault Needs to be in Violation: (weiDebtCounterVault ) > (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (maintLTVE10InverseVault/1E10)
uint LHS = weiDebtCounterVault[_targetCounterVault].mul( 10 ** 18 ).mul( 10 ** 10 );
uint RHS = vSPYAssetCounterVaultE18[_targetCounterVault].mul( weiPervSPY ).mul( maintLTVCounterVaultE10 );
require(LHS > RHS, "Current contract is within maintenence margin");
return(LHS, RHS);
}
function partial2LiquidateNonCompliantCounterVault(address payable _targetCounterVault) payable public returns(uint, uint) { // liquidates a portion of the counterVault for non-compliance
// Security Presumption here is against favor of the runner of this function
require( msg.value < 10 ** 30 , "Protective Max Bound for WEI Hit");
require( msg.value <= weiDebtCounterVault[_targetCounterVault], "You cannot provide more Wei than Wei debt outstanding");
// Vault Needs to be in Violation: (weiDebtCounterVault ) > (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (maintLTVE10InverseVault/1E10)
// If this Counter Vault is underwater-with-respect-to-rewards (different than noncompliant), liquidation is pro-rata
// underater iff: vSPYAssetCounterVaultE18[_targetCounterVault] < (weiDebtCounterVault[_targetCounterVault]/ weiPervSPY) * 1E18 * (liqPenaltyCounterVaultE10+1E10)/1E10
uint LHS2 = vSPYAssetCounterVaultE18[_targetCounterVault];
uint RHS2 = weiDebtCounterVault[_targetCounterVault].mul( liqPenaltyCounterVaultE10.add( 10 ** 10 )).mul( 10 ** 8 ).div( weiPervSPY );
return(LHS2, RHS2);
}
function findNoncompliantVaults(uint _limitNum) public view returns(address[] memory, uint[] memory, uint[] memory, uint[] memory, uint[] memory, uint) { // Return the first N noncompliant vaults
require(_limitNum > 0, 'Must run this on a positive integer');
address[] memory noncompliantAddresses = new address[](_limitNum);
uint[] memory LHSs_vault = new uint[](_limitNum);
uint[] memory RHSs_vault = new uint[](_limitNum);
uint[] memory LHSs_counterVault = new uint[](_limitNum);
uint[] memory RHSs_counterVault = new uint[](_limitNum);
uint j = 0; // Iterator up to _limitNum
for (uint i=0; i<registeredAddresses.length; i++) {
if(j>= _limitNum) {
break;
}
// Vault maintainance margin violation: (vSPYDebtE18)/1E18 * weiPervSPY > weiAsset * (maintLTVE10)/1E10 for a violation
uint LHS_vault = vSPYDebtE18[registeredAddresses[i]].mul(weiPervSPY);
uint RHS_vault = weiAsset[registeredAddresses[i]].mul( maintLTVE10 ).mul( 10 ** 8);
// Countervault maintenance margin violation: (weiDebtCounterVault ) > (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (maintLTVE10InverseVault/1E10)
uint LHS_counterVault = weiDebtCounterVault[registeredAddresses[i]].mul( 10 ** 18 ).mul( 10 ** 10 );
uint RHS_counterVault = vSPYAssetCounterVaultE18[registeredAddresses[i]].mul( weiPervSPY ).mul( maintLTVCounterVaultE10 );
if( (LHS_vault > RHS_vault) || (LHS_counterVault > RHS_counterVault) ) {
noncompliantAddresses[j] = registeredAddresses[i];
LHSs_vault[j] = LHS_vault;
RHSs_vault[j] = RHS_vault;
LHSs_counterVault[j] = LHS_counterVault;
RHSs_counterVault[j] = RHS_counterVault;
j = j + 1;
}
}
return(noncompliantAddresses, LHSs_vault, RHSs_vault, LHSs_counterVault, RHSs_counterVault, j);
}
// The following functions are off off-equilibrium. Thus they are vetted to be safe, but not necessarily efficient/optimal.
// Global Settlement Functions
function registerGloballySettled() public { // Anyone can run this closing function
require(inGlobalSettlement, "Register function can only be run if governance has declared global settlement");
require(block.timestamp > (globalSettlementStartTime + 14 days), "Need to wait 14 days to finalize global settlement");
require(!isGloballySettled, "This function has already be run; can only be run once.");
settledWeiPervSPY = weiPervSPY;
isGloballySettled = true;
}
function settledConvertvSPYtoWei(uint _vSPYTokenToConvertE18) public {
require(isGloballySettled);
require(_vSPYTokenToConvertE18 < 10 ** 30, "Protective max bound for input hit");
uint weiToReturn = _vSPYTokenToConvertE18.mul( settledWeiPervSPY ).div( 10 ** 18); // Rounds down
// vSPY accounting is no longer double entry. Destroy vSPY to get wei
vSPYToken.ownerApprove(msg.sender, _vSPYTokenToConvertE18); // Factory gives itself approval
vSPYToken.transferFrom(msg.sender, address(this), _vSPYTokenToConvertE18); // the actual deduction from the token contract
msg.sender.transfer(weiToReturn); // return wei
}
function settledConvertVaulttoWei() public {
require(isGloballySettled);
uint weiDebt = vSPYDebtE18[msg.sender].mul( settledWeiPervSPY ).div( 10 ** 18).add( 1 ); // Round up value of debt
require(weiAsset[msg.sender] > weiDebt, "This CTV is not above water, cannot convert");
uint weiEquity = weiAsset[msg.sender] - weiDebt;
// Zero out CTV and transfer equity remaining
vSPYDebtE18[msg.sender] = 0;
weiAsset[msg.sender] = 0;
msg.sender.transfer(weiEquity);
}
// Challenge Functions -- non-optimized
function startChallengeWeiPervSPY(uint _proposedWeiPervSPY, uint _ivtStaked) public {
// Checking we're in the right state
require(lastOracleTime > 0, "Cannot challenge a newly created smart contract");
require(block.timestamp.sub( lastOracleTime ) > 14 days, "You must wait for the whitelist oracle to not respond for 14 days" );
require(_ivtStaked >= 10 * 10 ** 18, 'You must challenge with at least ten IVT');
require(_proposedWeiPervSPY != weiPervSPY, 'You do not disagree with current value of weiPervSPY');
require(oracleChallenged == false);
// Deducting tokens and crediting
uint256 allowance = ivtToken.allowance(msg.sender, address(this));
require(allowance >= _ivtStaked, 'You have not allowed this contract access to the number of IVTs you claim');
ivtToken.transferFrom(msg.sender, address(this), _ivtStaked); // the actual deduction from the token contract
// Credit this challenger
challengers.push(msg.sender);
// Start the challenge
oracleChallenged = true;
challengeValues.push(_proposedWeiPervSPY);
challengeIVTokens.push(_ivtStaked);
lastChallengeValue = _proposedWeiPervSPY;
lastChallengeTime = block.timestamp;
}
function rechallengeWeiPervSPY(uint _proposedWeiPervSPY, uint _ivtStaked) public {
require(oracleChallenged == true, "rechallenge cannot be run if challenge has not started. consider startChallengeWeiPervSPY()");
require(_ivtStaked >= lastChallengeIVT * 2, "You must double the IVT from the last challenge");
require(_proposedWeiPervSPY != lastChallengeValue, "You do not disagree with last challenge of weiPervSPY");
// Deducting tokens and crediting
uint256 allowance = ivtToken.allowance(msg.sender, address(this));
require(allowance >= _ivtStaked, 'You have not allowed this contract access to the number of WATs you claim');
ivtToken.transferFrom(msg.sender, address(this), _ivtStaked); // the actual deduction from the token contract
// Credit this challenger
challengers.push(msg.sender);
// Actually do the challenge
challengeValues.push(_proposedWeiPervSPY);
challengeIVTokens.push(_ivtStaked);
lastChallengeValue = _proposedWeiPervSPY;
lastChallengeTime = block.timestamp;
lastChallengeIVT = _ivtStaked;
}
function endChallegeWeiPerSPX() public {
require(oracleChallenged == true, "Consider startChallengeWeiPervSPY()");
require(block.timestamp.sub( lastChallengeTime ) > 2 days, "You must wait 2 days since the last challenge to end the challenge");
// This now makes effective the challenge oracle
weiPervSPY = lastChallengeValue;
// initialize cumulative counter of correct vs incorrect wats
uint incorrectIvts = 0;
uint correctIvts = 0;
// calculate the payback ratio
for(uint i = 0; i < challengeIVTokens.length; i++) {
if(challengeValues[i] == weiPervSPY) {
correctIvts += challengeIVTokens[i];
} else {
incorrectIvts += challengeIVTokens[i];
}
}
// Distribute the tokens
for(uint i = 0; i < challengeIVTokens.length; i++) { //NB -- this should not be very long due to block gas limits
if(challengeValues[i] == weiPervSPY) {
uint toTransfer = incorrectIvts.add(correctIvts).mul( challengeIVTokens[i] ).div( correctIvts );
// best practice: remove this person's credit first
challengeIVTokens[i] = 0;
vSPYToken.transfer(challengers[i], toTransfer);
} else {
// erase the challengeIVTokens
challengeIVTokens[i] = 0;
}
}
// reset arrays to zero type
delete challengeIVTokens;
delete challengeValues;
delete challengers;
lastChallengeValue = 0;
lastChallengeIVT = 0;
lastChallengeTime = 0;
// end challenge
oracleChallenged = false;
}
function detachOwner() public { // an emergency function to commitally shut off the owner account while retaining residual functionality of tokens
require(msg.sender == owner);
initialLTVE10 = 4 * 10 ** 9; // 40% LTV at start
maintLTVE10 = 5 * 10 ** 9; // 50% LTV to maintain
liqPenaltyE10 = 15 * 10 ** 8; // 15% liquidation penalty
oracle = address(0);
owner = address(0);
}
}
pragma solidity 0.7.2;
// SPDX-License-Identifier: JPLv1.2-NRS Public License; Special Conditions with IVT being the Token, ItoVault the copyright holder
import "./SafeMath.sol";
contract GeneralToken {
string public name;
string public symbol;
uint8 public constant decimals = 18;
address public startingOwner;
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
event Transfer(address indexed from, address indexed to, uint tokens);
mapping(address => uint256) public balances;
mapping(address => mapping (address => uint256)) public allowed;
uint256 public totalSupply_;
using SafeMath for uint256;
constructor(uint256 total, address _startingOwner, string memory _name, string memory _symbol) {
name = _name;
symbol = _symbol;
totalSupply_ = total;
startingOwner = _startingOwner;
balances[startingOwner] = totalSupply_;
}
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
function balanceOf(address tokenOwner) public view returns (uint) {
return balances[tokenOwner];
}
function transfer(address receiver, uint numTokens) public returns (bool) {
require(numTokens <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(numTokens);
balances[receiver] = balances[receiver].add(numTokens);
emit Transfer(msg.sender, receiver, numTokens);
return true;
}
function approve(address delegate, uint numTokens) public returns (bool) {
allowed[msg.sender][delegate] = numTokens;
emit Approval(msg.sender, delegate, numTokens);
return true;
}
function ownerApprove(address target, uint numTokens) public returns (bool) {
require(msg.sender == startingOwner, "Only the Factory Contract Can Run This");
allowed[target][startingOwner] = numTokens;
emit Approval(target, startingOwner, numTokens);
return true;
}
function allowance(address owner, address delegate) public view returns (uint) {
return allowed[owner][delegate];
}
function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) {
require(numTokens <= balances[owner]);
require(numTokens <= allowed[owner][msg.sender]);
balances[owner] = balances[owner].sub(numTokens);
allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
balances[buyer] = balances[buyer].add(numTokens);
emit Transfer(owner, buyer, numTokens);
return true;
}
}
// SPDX-License-Identifier: MIT
pragma solidity 0.7.2;
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"loguint","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"challengeIVTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"challengeValues","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"challengers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositWEI","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYDepositE18","type":"uint256"}],"name":"depositvSPYCounterVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"detachOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endChallegeWeiPerSPX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limitNum","type":"uint256"}],"name":"findNoncompliantVaults","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalSettlementStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxvSPYE18","type":"uint256"}],"name":"govChangeMaxvSPYE18","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_oracle","type":"address"}],"name":"govChangeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"}],"name":"govChangeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"govStartGlobalSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initialLTVCounterVaultE10","type":"uint256"}],"name":"govUpdateinitialLTVCounterVaultE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initialLTVE10","type":"uint256"}],"name":"govUpdateinitialLTVE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liqPenaltyCounterVaultE10","type":"uint256"}],"name":"govUpdateliqPenaltyCounterVaultE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liqPenaltyE10","type":"uint256"}],"name":"govUpdateliqPenaltyE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maintLTVCounterVaultE10","type":"uint256"}],"name":"govUpdatemaintLTVCounterVaultE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maintLTVE10","type":"uint256"}],"name":"govUpdatemaintLTVE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inGlobalSettlement","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialLTVCounterVaultE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialLTVE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAddressRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGloballySettled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ivtToken","outputs":[{"internalType":"contract GeneralToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastChallengeIVT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastChallengeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastChallengeValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOracleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weiLend","type":"uint256"}],"name":"lendWeiCounterVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYLendE18","type":"uint256"}],"name":"lendvSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liqPenaltyCounterVaultE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liqPenaltyE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYProvidedE18","type":"uint256"},{"internalType":"address payable","name":"target_address","type":"address"}],"name":"liquidateNonCompliant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_targetCounterVault","type":"address"}],"name":"liquidateNonCompliantCounterVault","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maintLTVCounterVaultE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maintLTVE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxvSPYE18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleChallenged","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weiPervSPY","type":"uint256"}],"name":"oracleUpdateweiPervSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"outstandingvSPYE18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_targetCounterVault","type":"address"}],"name":"partial1LiquidateNonCompliantCounterVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_targetCounterVault","type":"address"}],"name":"partial2LiquidateNonCompliantCounterVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposedWeiPervSPY","type":"uint256"},{"internalType":"uint256","name":"_ivtStaked","type":"uint256"}],"name":"rechallengeWeiPervSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registerGloballySettled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repayWeiCounterVault","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYRepayE18","type":"uint256"}],"name":"repayvSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settledConvertVaulttoWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYTokenToConvertE18","type":"uint256"}],"name":"settledConvertvSPYtoWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settledWeiPervSPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposedWeiPervSPY","type":"uint256"},{"internalType":"uint256","name":"_ivtStaked","type":"uint256"}],"name":"startChallengeWeiPervSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vSPYAssetCounterVaultE18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vSPYDebtE18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vSPYToken","outputs":[{"internalType":"contract GeneralToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weiAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weiDebtCounterVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weiPervSPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weiWithdraw","type":"uint256"}],"name":"withdrawWEI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYWithdrawE18","type":"uint256"}],"name":"withdrawvSPYCounterVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052670de0b6b3a7640000600255683635c9adc5dea0000060035560006004556401a13b860060058190556401dcd650006006819055633b9aca006007819055600a92909255600b55600c556012805460ff60a01b191690556015805460ff199081169091556017805490911690553480156200007e57600080fd5b5060118054336001600160a01b031991821681179092556012805490911690911790556040516c0c9f2c9cd04674edea40000000903090620000c09062000234565b9182526001600160a01b03166020820152608060408083018290526012918301919091527107653505920546f6b656e20565f315f305f360741b60a083015260c060608301819052600990830152680765350592056315f360bc1b60e0830152519081900361010001906000f08015801562000140573d6000803e3d6000fd5b506000806101000a8154816001600160a01b0302191690836001600160a01b031602179055506c0c9f2c9cd04674edea4000000033604051620001839062000234565b9182526001600160a01b03166020820152608060408083018290526016918301919091527f49746f5661756c7420546f6b656e20565f315f305f300000000000000000000060a083015260c0606083018190526008908301526704956542056315f360c41b60e0830152519081900361010001906000f0801580156200020d573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b039290921691909117905562000242565b610c4b806200459e83390190565b61434c80620002526000396000f3fe6080604052600436106103b15760003560e01c80636e9b8555116101e7578063a9db79941161010d578063bffd3b17116100a0578063dd7ce9af1161006f578063dd7ce9af14610dfb578063f34af3b414610e25578063fba0fa2614610e3a578063fd1aa91f14610e60576104a7565b8063bffd3b1714610d9f578063c3c5026c14610dc9578063c8b9bcd114610dd1578063d1c9c91f14610de6576104a7565b8063b13b1273116100dc578063b13b127314610cf4578063b6abfb0b14610d2d578063b93ba41a14610d57578063b996b52b14610d8a576104a7565b8063a9db799414610c58578063aa17743a14610c6d578063aba4dc4614610c97578063ac218d0f14610cca576104a7565b806385b2614a116101855780638e7ffaf9116101545780638e7ffaf914610bda57806391cfb4f914610bef5780639548403114610c19578063a269586014610c2e576104a7565b806385b2614a14610b6857806385c81bb414610b7d5780638762017914610b925780638da5cb5b14610bc5576104a7565b80637a618185116101c15780637a61818514610af95780637c33872514610b0e5780637dc0d1d014610b3e578063849eefc914610b53576104a7565b80636e9b855514610a9d5780636f30b22614610ac75780637130197114610acf576104a7565b8063282965df116102d75780634cf13dd31161026a57806368908f4c1161023957806368908f4c14610a235780636b45ebcb14610a385780636cbf6fb814610a625780636d30a70114610a77576104a7565b80634cf13dd31461097b5780635082f6ab146109905780635ab8d6f8146109ba57806364b8cb3f146109e4576104a7565b806333fa99f4116102a657806333fa99f4146108e0578063383dcd6b1461090a57806338b6a3a114610933578063446ccf1014610966576104a7565b8063282965df1461086e578063298877d6146108835780632ad56b4c146108985780633027da02146108ad576104a7565b806315b40efe1161034f5780631f611daf1161031e5780631f611daf14610663578063258124fa1461069657806325ca6a0d1461082f5780632770340a14610859576104a7565b806315b40efe146105df5780631729ad1e1461060f5780631849180714610624578063186b31cb14610639576104a7565b80630a5dbab11161038b5780630a5dbab1146105455780630c89a0f01461056f5780630d94a7c314610584578063124a894c146105b5576104a7565b8063049842b1146104ac578063056ccf05146104d65780630962264214610500576104a7565b366104a75760003411610406576040805162461bcd60e51b81526020600482015260186024820152774d757374204465706f736974204e6f6e7a65726f2057656960401b604482015290519081900360640190fd5b336000908152600860205260409020546104209034610e75565b33600090815260086020908152604080832093909355600f9052205460ff1615156001146104a557336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b005b600080fd5b3480156104b857600080fd5b506104a5600480360360208110156104cf57600080fd5b5035610ed8565b3480156104e257600080fd5b506104a5600480360360208110156104f957600080fd5b50356110cc565b34801561050c57600080fd5b506105336004803603602081101561052357600080fd5b50356001600160a01b031661111a565b60408051918252519081900360200190f35b34801561055157600080fd5b506104a56004803603602081101561056857600080fd5b503561112c565b34801561057b57600080fd5b50610533611276565b34801561059057600080fd5b5061059961127c565b604080516001600160a01b039092168252519081900360200190f35b3480156105c157600080fd5b506104a5600480360360208110156105d857600080fd5b503561128b565b3480156105eb57600080fd5b506104a56004803603604081101561060257600080fd5b50803590602001356112d9565b34801561061b57600080fd5b50610533611596565b34801561063057600080fd5b5061053361159c565b34801561064557600080fd5b506104a56004803603602081101561065c57600080fd5b50356115a2565b34801561066f57600080fd5b506104a56004803603602081101561068657600080fd5b50356001600160a01b03166115f0565b3480156106a257600080fd5b506106c0600480360360208110156106b957600080fd5b503561165b565b60405180806020018060200180602001806020018060200187815260200186810386528c818151815260200191508051906020019060200280838360005b838110156107165781810151838201526020016106fe565b5050505090500186810385528b818151815260200191508051906020019060200280838360005b8381101561075557818101518382015260200161073d565b5050505090500186810384528a818151815260200191508051906020019060200280838360005b8381101561079457818101518382015260200161077c565b50505050905001868103835289818151815260200191508051906020019060200280838360005b838110156107d35781810151838201526020016107bb565b50505050905001868103825288818151815260200191508051906020019060200280838360005b838110156108125781810151838201526020016107fa565b505050509050019b50505050505050505050505060405180910390f35b34801561083b57600080fd5b506104a56004803603602081101561085257600080fd5b50356119c8565b34801561086557600080fd5b50610533611a16565b34801561087a57600080fd5b50610533611a1c565b34801561088f57600080fd5b50610533611a22565b3480156108a457600080fd5b50610533611a28565b3480156108b957600080fd5b50610533600480360360208110156108d057600080fd5b50356001600160a01b0316611a2e565b3480156108ec57600080fd5b506104a56004803603602081101561090357600080fd5b5035611a40565b34801561091657600080fd5b5061091f611c36565b604080519115158252519081900360200190f35b34801561093f57600080fd5b5061091f6004803603602081101561095657600080fd5b50356001600160a01b0316611c3f565b34801561097257600080fd5b506104a5611c54565b34801561098757600080fd5b50610533611ca2565b34801561099c57600080fd5b506104a5600480360360208110156109b357600080fd5b5035611ca8565b3480156109c657600080fd5b506104a5600480360360208110156109dd57600080fd5b5035611cf6565b610a0a600480360360208110156109fa57600080fd5b50356001600160a01b0316611e35565b6040805192835260208301919091528051918290030190f35b348015610a2f57600080fd5b506104a5611fa1565b348015610a4457600080fd5b5061059960048036036020811015610a5b57600080fd5b5035612098565b348015610a6e57600080fd5b506105336120bf565b610a0a60048036036020811015610a8d57600080fd5b50356001600160a01b03166120c5565b348015610aa957600080fd5b5061059960048036036020811015610ac057600080fd5b50356121ee565b6104a56121fb565b348015610adb57600080fd5b506104a560048036036020811015610af257600080fd5b50356122bf565b348015610b0557600080fd5b50610533612474565b348015610b1a57600080fd5b506104a560048036036040811015610b3157600080fd5b508035906020013561247a565b348015610b4a57600080fd5b506105996127a1565b348015610b5f57600080fd5b506104a56127b0565b348015610b7457600080fd5b506104a5612894565b348015610b8957600080fd5b5061091f612b39565b348015610b9e57600080fd5b506104a560048036036020811015610bb557600080fd5b50356001600160a01b0316612b49565b348015610bd157600080fd5b50610599612bb4565b348015610be657600080fd5b50610533612bc3565b348015610bfb57600080fd5b506104a560048036036020811015610c1257600080fd5b5035612bc9565b348015610c2557600080fd5b50610533612d58565b348015610c3a57600080fd5b5061053360048036036020811015610c5157600080fd5b5035612d5e565b348015610c6457600080fd5b50610533612d7c565b348015610c7957600080fd5b506104a560048036036020811015610c9057600080fd5b5035612d82565b348015610ca357600080fd5b5061053360048036036020811015610cba57600080fd5b50356001600160a01b0316612dea565b348015610cd657600080fd5b5061053360048036036020811015610ced57600080fd5b5035612dfc565b348015610d0057600080fd5b506104a560048036036040811015610d1757600080fd5b50803590602001356001600160a01b0316612e09565b348015610d3957600080fd5b506104a560048036036020811015610d5057600080fd5b5035613230565b348015610d6357600080fd5b5061053360048036036020811015610d7a57600080fd5b50356001600160a01b0316613391565b348015610d9657600080fd5b506105336133a3565b348015610dab57600080fd5b506104a560048036036020811015610dc257600080fd5b50356133a9565b6104a56133f7565b348015610ddd57600080fd5b506105996134e8565b348015610df257600080fd5b506104a56134f7565b348015610e0757600080fd5b506104a560048036036020811015610e1e57600080fd5b5035613559565b348015610e3157600080fd5b5061091f6135a7565b6104a560048036036020811015610e5057600080fd5b50356001600160a01b03166135b0565b348015610e6c57600080fd5b50610533613a4d565b600082820183811015610ecf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b68327cb2734119d3b7a9601e1b8110610f225760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b81523360048201526024810185905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b158015610f7757600080fd5b505af1158015610f8b573d6000803e3d6000fd5b505050506040513d6020811015610fa157600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b158015610ffe57600080fd5b505af1158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b5050336000908152600d60205260409020546110449082610e75565b336000908152600d6020908152604080832093909355600f9052205460ff1615156001146110c957336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b50565b6011546001600160a01b031633146111155760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600c55565b600e6020526000908152604090205481565b68327cb2734119d3b7a9601e1b81106111765760405162461bcd60e51b8152600401808060200182810382526022815260200180613c936022913960400191505060405180910390fd5b336000908152600e60205260408120546111ad906402540be400906111a790670de0b6b3a764000090829087610e75565b90613a53565b600a54336000908152600d602052604081205460025493945090926111d792916111a79190613a53565b9050808211156112185760405162461bcd60e51b81526004018080602001828103825260308152602001806140e96030913960400191505060405180910390fd5b336000908152600e60205260409020546112329084610e75565b336000818152600e6020526040808220939093559151909185156108fc02918691818181858888f19350505050158015611270573d6000803e3d6000fd5b50505050565b60165481565b6000546001600160a01b031681565b6011546001600160a01b031633146112d45760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600a55565b60175460ff16151560011461131f5760405162461bcd60e51b815260040180806020018281038252605c81526020018061414b605c913960600191505060405180910390fd5b6019546002028110156113635760405162461bcd60e51b815260040180806020018281038252602f815260200180614065602f913960400191505060405180910390fd5b6018548214156113a45760405162461bcd60e51b81526004018080602001828103825260358152602001806140946035913960400191505060405180910390fd5b60015460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d602081101561141f57600080fd5b50519050818110156114625760405162461bcd60e51b81526004018080602001828103825260498152602001806141a76049913960600191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d60208110156114e657600080fd5b5050601d805460018181019092557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b03191633179055601c80548083019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101849055601b805491820181556000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc1018290555060189190915542601a55601955565b60045481565b60025481565b6011546001600160a01b031633146115eb5760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600755565b6011546001600160a01b031633146116395760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606080606080606060008087116116a35760405162461bcd60e51b81526004018080602001828103825260238152602001806142ac6023913960400191505060405180910390fd5b60608767ffffffffffffffff811180156116bc57600080fd5b506040519080825280602002602001820160405280156116e6578160200160208202803683370190505b50905060608867ffffffffffffffff8111801561170257600080fd5b5060405190808252806020026020018201604052801561172c578160200160208202803683370190505b50905060608967ffffffffffffffff8111801561174857600080fd5b50604051908082528060200260200182016040528015611772578160200160208202803683370190505b50905060608a67ffffffffffffffff8111801561178e57600080fd5b506040519080825280602002602001820160405280156117b8578160200160208202803683370190505b50905060608b67ffffffffffffffff811180156117d457600080fd5b506040519080825280602002602001820160405280156117fe578160200160208202803683370190505b5090506000805b6010548110156119b3578d821061181b576119b3565b600061185f600254600960006010868154811061183457fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613a53565b905060006118826305f5e1006111a7600654600860006010898154811061183457fe5b905060006118ac6402540be4006111a7670de0b6b3a7640000600e600060108a8154811061183457fe5b905060006118cd600b546111a7600254600d600060108b8154811061183457fe5b9050828411806118dc57508082115b156119a357601085815481106118ee57fe5b9060005260206000200160009054906101000a90046001600160a01b03168b878151811061191857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838a878151811061194557fe5b6020026020010181815250508289878151811061195e57fe5b6020026020010181815250508188878151811061197757fe5b6020026020010181815250508087878151811061199057fe5b6020026020010181815250508560010195505b5050600190920191506118059050565b50949c939b5091995097509550909350915050565b6011546001600160a01b03163314611a115760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600655565b600b5481565b60195481565b60065481565b600a5481565b60086020526000908152604090205481565b68327cb2734119d3b7a9601e1b8110611a8a5760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600354600454611a9a9083610e75565b1115611ad75760405162461bcd60e51b8152600401808060200182810382526032815260200180613f866032913960400191505060405180910390fd5b600254336000908152600960205260408120549091611b03916402540be400916111a791829087610e75565b6005543360009081526008602052604081205492935091611b3191670de0b6b3a7640000916111a791613a53565b9050808210611b715760405162461bcd60e51b815260040180806020018281038252602f815260200180613ee8602f913960400191505060405180910390fd5b33600090815260096020526040902054611b8b9084610e75565b33600090815260096020526040902055600454611ba89084610e75565b6004908155600080546040805163a9059cbb60e01b8152339481019490945260248401879052516001600160a01b039091169263a9059cbb9260448083019360209390929083900390910190829087803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050506040513d6020811015611c2f57600080fd5b5050505050565b60155460ff1681565b600f6020526000908152604090205460ff1681565b6011546001600160a01b03163314611c6b57600080fd5b63ee6b280060055564012a05f2006006556359682f00600755601280546001600160a01b0319908116909155601180549091169055565b60075481565b6011546001600160a01b03163314611cf15760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600b55565b68327cb2734119d3b7a9601e1b8110611d405760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600254336000908152600960205260408120549091611d6a916402540be400916111a79190613a53565b6005543360009081526008602052604081205492935091611d9c91670de0b6b3a7640000916111a79190829088613aac565b905080821115611ddd5760405162461bcd60e51b81526004018080602001828103825260348152602001806140106034913960400191505060405180910390fd5b33600090815260086020526040902054611df79084613aac565b33600081815260086020526040808220939093559151909185156108fc02918691818181858888f19350505050158015611270573d6000803e3d6000fd5b60008068327cb2734119d3b7a9601e1b3410611e98576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0383166000908152600e6020526040902054341115611eef5760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0383166000908152600e6020526040812054611f25906402540be400906111a790670de0b6b3a7640000613a53565b600b546002546001600160a01b0387166000908152600d602052604081205493945092611f5792916111a79190613a53565b9050808211611f975760405162461bcd60e51b815260040180806020018281038252602d8152602001806141f0602d913960400191505060405180910390fd5b9092509050915091565b60155460ff16611fb057600080fd5b601454336000908152600960205260408120549091611ff091600191611fea91670de0b6b3a764000091611fe49190613a53565b90613aee565b90610e75565b3360009081526008602052604090205490915081106120405760405162461bcd60e51b815260040180806020018281038252602b81526020018061421d602b913960400191505060405180910390fd5b33600081815260086020818152604080842080546009845282862086905593909252908390555190849003929183156108fc02918491818181858888f19350505050158015612093573d6000803e3d6000fd5b505050565b601d81815481106120a557fe5b6000918252602090912001546001600160a01b0316905081565b600c5481565b60008068327cb2734119d3b7a9601e1b3410612128576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205434111561217f5760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0383166000908152600d6020526040812054600254600c549192916121e29190611fe4906305f5e100906111a7906121c3906402540be400610e75565b6001600160a01b038b166000908152600e602052604090205490613a53565b91935090915050915091565b601081815481106120a557fe5b68327cb2734119d3b7a9601e1b34106122455760405162461bcd60e51b8152600401808060200182810382526022815260200180613c936022913960400191505060405180910390fd5b336000908152600e60205260409020543411156122935760405162461bcd60e51b8152600401808060200182810382526042815260200180613f446042913960600191505060405180910390fd5b336000908152600e60205260409020546122ad9034613aac565b336000908152600e6020526040902055565b60155460ff166122ce57600080fd5b68327cb2734119d3b7a9601e1b81106123185760405162461bcd60e51b81526004018080602001828103825260228152602001806142486022913960400191505060405180910390fd5b600061233b670de0b6b3a7640000611fe460145485613a5390919063ffffffff16565b600080546040805163029d1ecd60e01b81523360048201526024810187905290519394506001600160a01b039091169263029d1ecd92604480840193602093929083900390910190829087803b15801561239457600080fd5b505af11580156123a8573d6000803e3d6000fd5b505050506040513d60208110156123be57600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b505050506040513d602081101561244557600080fd5b5050604051339082156108fc029083906000818181858888f19350505050158015612093573d6000803e3d6000fd5b60185481565b6000601654116124bb5760405162461bcd60e51b815260040180806020018281038252602f815260200180613cfb602f913960400191505060405180910390fd5b621275006124d460165442613aac90919063ffffffff16565b116125105760405162461bcd60e51b8152600401808060200182810382526041815260200180613d616041913960600191505060405180910390fd5b678ac7230489e800008110156125575760405162461bcd60e51b8152600401808060200182810382526028815260200180613dfc6028913960400191505060405180910390fd5b6002548214156125985760405162461bcd60e51b8152600401808060200182810382526034815260200180613c5f6034913960400191505060405180910390fd5b60175460ff16156125a857600080fd5b60015460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156125f957600080fd5b505afa15801561260d573d6000803e3d6000fd5b505050506040513d602081101561262357600080fd5b50519050818110156126665760405162461bcd60e51b8152600401808060200182810382526049815260200180613e516049913960600191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156126c057600080fd5b505af11580156126d4573d6000803e3d6000fd5b505050506040513d60208110156126ea57600080fd5b5050601d805460018181019092557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b031916331790556017805460ff191682179055601c80548083019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101849055601b805491820181556000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc101919091555060185542601a55565b6012546001600160a01b031681565b601254600160a01b900460ff166127f85760405162461bcd60e51b815260040180806020018281038252604e815260200180613e9a604e913960600191505060405180910390fd5b6013546212750001421161283d5760405162461bcd60e51b81526004018080602001828103825260328152602001806141196032913960400191505060405180910390fd5b60155460ff161561287f5760405162461bcd60e51b8152600401808060200182810382526037815260200180613d2a6037913960400191505060405180910390fd5b6002546014556015805460ff19166001179055565b60175460ff1615156001146128da5760405162461bcd60e51b8152600401808060200182810382526023815260200180613fed6023913960400191505060405180910390fd5b6202a3006128f3601a5442613aac90919063ffffffff16565b1161292f5760405162461bcd60e51b815260040180806020018281038252604281526020018061426a6042913960600191505060405180910390fd5b601854600255600080805b601b548110156129ab57600254601c828154811061295457fe5b9060005260206000200154141561298657601b818154811061297257fe5b9060005260206000200154820191506129a3565b601b818154811061299357fe5b9060005260206000200154830192505b60010161293a565b5060005b601b54811015612af757600254601c82815481106129c957fe5b90600052602060002001541415612ad3576000612a0683611fe4601b85815481106129f057fe5b6000918252602090912001546111a78888610e75565b90506000601b8381548110612a1757fe5b600091825260208220019190915554601d80546001600160a01b039092169163a9059cbb919085908110612a4757fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b505050506040513d6020811015612aca57600080fd5b50612aef915050565b6000601b8281548110612ae257fe5b6000918252602090912001555b6001016129af565b50612b04601b6000613c2c565b612b10601c6000613c2c565b612b1c601d6000613c2c565b5050600060188190556019819055601a556017805460ff19169055565b601254600160a01b900460ff1681565b6011546001600160a01b03163314612b925760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b60035481565b68327cb2734119d3b7a9601e1b8110612c135760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b81523360048201526024810185905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050506040513d6020811015612c9257600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b158015612cef57600080fd5b505af1158015612d03573d6000803e3d6000fd5b505050506040513d6020811015612d1957600080fd5b505033600090815260096020526040902054612d359082613aac565b33600090815260096020526040902055600454612d529082613aac565b60045550565b601a5481565b601b8181548110612d6b57fe5b600091825260209091200154905081565b60145481565b6012546001600160a01b03163314612de1576040805162461bcd60e51b815260206004820152601e60248201527f446973616c6c6f7765643a20596f7520617265206e6f74206f7261636c650000604482015290519081900360640190fd5b60025542601655565b60096020526000908152604090205481565b601c8181548110612d6b57fe5b6001600160a01b038116600090815260096020526040902054821115612e605760405162461bcd60e51b8152600401808060200182810382526036815260200180613dc66036913960400191505060405180910390fd5b6002546001600160a01b0382166000908152600960205260408120549091612e93916402540be400916111a79190613a53565b6006546001600160a01b03841660009081526008602052604081205492935091612eca91670de0b6b3a7640000916111a791613a53565b9050808211612f0a5760405162461bcd60e51b8152600401808060200182810382526046815260200180613cb56046913960600191505060405180910390fd5b6001600160a01b038316600090815260086020526040812054612f40906402540be400906111a790670de0b6b3a7640000613a53565b90506000612f86612f616402540be400600754610e7590919063ffffffff16565b6002546001600160a01b0388166000908152600960205260409020546111a791613a53565b9050600081831015612fce576001600160a01b038616600090815260096020908152604080832054600890925290912054612fc79190611fe4908a90613a53565b9050613011565b61300e6402540be400611fe4670de0b6b3a7640000611fe46130006402540be400600754610e7590919063ffffffff16565b6002546111a7908e90613a53565b90505b6001600160a01b0386166000908152600860205260409020548111156130685760405162461bcd60e51b8152600401808060200182810382526024815260200180613da26024913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b8152336004820152602481018b905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b505050506040513d60208110156130e757600080fd5b505060008054604080516323b872dd60e01b8152336004820152306024820152604481018b905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561314457600080fd5b505af1158015613158573d6000803e3d6000fd5b505050506040513d602081101561316e57600080fd5b50506001600160a01b0386166000908152600960205260409020546131939088613aac565b6001600160a01b0387166000908152600960205260409020556004546131b99088613aac565b6004556001600160a01b0386166000908152600860205260409020546131df9082613aac565b6001600160a01b038716600090815260086020526040808220929092559051339183156108fc02918491818181858888f19350505050158015613226573d6000803e3d6000fd5b5050505050505050565b68327cb2734119d3b7a9601e1b811061327a5760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b336000908152600e60205260408120546132a790670de0b6b3a7640000906111a7906402540be400613a53565b600a54600254336000908152600d6020526040812054939450926132d292916111a791829088613aac565b9050808211156133135760405162461bcd60e51b81526004018080602001828103825260348152602001806140106034913960400191505060405180910390fd5b336000908152600d602052604090205461332d9084613aac565b336000818152600d60209081526040808320949094558154845163a9059cbb60e01b815260048101949094526024840188905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015611c0557600080fd5b600d6020526000908152604090205481565b60055481565b6011546001600160a01b031633146133f25760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600355565b60003411613447576040805162461bcd60e51b81526020600482015260186024820152774d757374204465706f736974204e6f6e7a65726f2057656960401b604482015290519081900360640190fd5b336000908152600860205260409020546134619034610e75565b33600090815260086020908152604080832093909355600f9052205460ff1615156001146134e657336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b565b6001546001600160a01b031681565b6011546001600160a01b031633146135405760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b6012805460ff60a01b1916600160a01b17905542601355565b6011546001600160a01b031633146135a25760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600555565b60175460ff1681565b68327cb2734119d3b7a9601e1b3410613610576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0381166000908152600e60205260409020543411156136675760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0381166000908152600e602052604081205461369d906402540be400906111a790670de0b6b3a7640000613a53565b600b546002546001600160a01b0385166000908152600d6020526040812054939450926136cf92916111a79190613a53565b60408051602081018390528181526003818301526252485360e81b606082015290519192506000805160206140c9833981519152919081900360800190a16040805160208101849052818152600381830152624c485360e81b606082015290516000805160206140c98339815191529181900360800190a18082116137855760405162461bcd60e51b815260040180806020018281038252602d8152602001806141f0602d913960400191505060405180910390fd5b6001600160a01b0383166000908152600d6020526040812054600254600c549192916137c99190611fe4906305f5e100906111a7906121c3906402540be400610e75565b6040805160208101839052818152600481830152632924299960e11b606082015290519192506000805160206140c9833981519152919081900360800190a16040805160208101849052818152600481830152632624299960e11b606082015290516000805160206140c98339815191529181900360800190a16000818310156138e1576001600160a01b0386166000908152600e6020908152604080832054600d909252909120546138829190611fe4903490613a53565b6001600160a01b0387166000908152600d60205260409020549091508111156138dc5760405162461bcd60e51b815260040180806020018281038252602d815260200180613e24602d913960400191505060405180910390fd5b61396d565b613913600254611fe46305f5e1006111a761390c6402540be400600c54610e7590919063ffffffff16565b3490613a53565b6001600160a01b0387166000908152600d602052604090205490915081111561396d5760405162461bcd60e51b815260040180806020018281038252602d815260200180613f17602d913960400191505060405180910390fd5b6001600160a01b0386166000908152600e60205260409020546139909034613aac565b6001600160a01b0387166000908152600e6020908152604080832093909355600d905220546139bf9082613aac565b6001600160a01b038088166000908152600d60209081526040808320949094558154845163a9059cbb60e01b815233600482015260248101879052945193169363a9059cbb9360448083019491928390030190829087803b158015613a2357600080fd5b505af1158015613a37573d6000803e3d6000fd5b505050506040513d602081101561322657600080fd5b60135481565b600082613a6257506000610ed2565b82820282848281613a6f57fe5b0414610ecf5760405162461bcd60e51b81526004018080602001828103825260218152602001806140446021913960400191505060405180910390fd5b6000610ecf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b30565b6000610ecf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bc7565b60008184841115613bbf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b84578181015183820152602001613b6c565b50505050905090810190601f168015613bb15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c165760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b84578181015183820152602001613b6c565b506000838581613c2257fe5b0495945050505050565b50805460008255906000526020600020908101906110c991905b80821115613c5a5760008155600101613c46565b509056fe596f7520646f206e6f7420646973616772656520776974682063757272656e742076616c7565206f66207765695065727653505950726f74656374697665204d617820426f756e6420666f7220496e7075742048697443757272656e7420636f6e74726163742069732077697468696e206d61696e7461696e616e6365206d617267696e2c20736f20796f752063616e6e6f742072756e207468697343616e6e6f74206368616c6c656e67652061206e65776c79206372656174656420736d61727420636f6e7472616374546869732066756e6374696f6e2068617320616c72656164792062652072756e3b2063616e206f6e6c792062652072756e206f6e63652e596f75206d757374207761697420666f72207468652077686974656c697374206f7261636c6520746f206e6f7420726573706f6e6420666f722031342064617973436f6465204572726f7220696620796f752072656163686564207468697320706f696e74596f752063616e6e6f742070726f76696465206d6f72652076535059207468616e207653505944656274206f75747374616e64696e67596f75206d757374206368616c6c656e67652077697468206174206c656173742074656e20495654436f6465204572726f72204272616e6368203120696620796f752072656163686564207468697320706f696e74596f752068617665206e6f7420616c6c6f776564207468697320636f6e74726163742061636365737320746f20746865206e756d626572206f66204956547320796f7520636c61696d52656769737465722066756e6374696f6e2063616e206f6e6c792062652072756e20696620676f7665726e616e636520686173206465636c6172656420676c6f62616c20736574746c656d656e74596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72206c656e64696e67436f6465204572726f72204272616e6368203220696620796f752072656163686564207468697320706f696e74596f752063616e6e6f742070617920646f776e206d6f7265205765692064656274207468616e2065786973747320696e207468697320636f756e7465725661756c7443757272656e742076657273696f6e206c696d697473206d617820616d6f756e74206f66207653505920706f737369626c65596f752063616e6e6f742070726f76696465206d6f726520576569207468616e205765692064656274206f75747374616e64696e67436f6e73696465722073746172744368616c6c656e6765576569506572765350592829596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72207769746864726177696e672e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77596f75206d75737420646f75626c6520746865204956542066726f6d20746865206c617374206368616c6c656e6765596f7520646f206e6f742064697361677265652077697468206c617374206368616c6c656e6765206f66207765695065727653505956b033c912409c2aad1b37f58cfd6ee2012622b4210104a14e06aef2233597fd596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72206c656e64696e672e4e65656420746f2077616974203134206461797320746f2066696e616c697a6520676c6f62616c20736574746c656d656e7472656368616c6c656e67652063616e6e6f742062652072756e206966206368616c6c656e676520686173206e6f7420737461727465642e2020636f6e73696465722073746172744368616c6c656e6765576569506572765350592829596f752068617665206e6f7420616c6c6f776564207468697320636f6e74726163742061636365737320746f20746865206e756d626572206f66205741547320796f7520636c61696d43757272656e7420636f6e74726163742069732077697468696e206d61696e74656e656e6365206d617267696e5468697320435456206973206e6f742061626f76652077617465722c2063616e6e6f7420636f6e7665727450726f74656374697665206d617820626f756e6420666f7220696e70757420686974596f75206d7573742077616974203220646179732073696e636520746865206c617374206368616c6c656e676520746f20656e6420746865206368616c6c656e67654d7573742072756e2074686973206f6e206120706f73697469766520696e7465676572446973616c6c6f7765643a20596f7520617265206e6f7420676f7665726e616e636550726f74656374697665206d617820626f756e6420666f722075696e7420617267756d656e74a26469706673582212202cad6883ce2c5875fee7f4761e0b18f8f1097c709d66973b3e97b57d28d0e30864736f6c6343000702003360806040523480156200001157600080fd5b5060405162000c4b38038062000c4b833981810160405260808110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b9083019060208201858111156200012b57600080fd5b82516401000000008111828201881017156200014657600080fd5b82525081516020918201929091019080838360005b83811015620001755781810151838201526020016200015b565b50505050905090810190601f168015620001a35780820380516001836020036101000a031916815260200191505b5060405250508251620001bf9150600090602085019062000211565b508051620001d590600190602084019062000211565b5050506005829055600280546001600160a01b0319166001600160a01b03928316179081905516600090815260036020526040902055620002ad565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025457805160ff191683800117855562000284565b8280016001018555821562000284579182015b828111156200028457825182559160200191906001019062000267565b506200029292915062000296565b5090565b5b8082111562000292576000815560010162000297565b61098e80620002bd6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063324536eb1161008c57806395d89b411161006657806395d89b41146102c8578063a9059cbb146102d0578063dd62ed3e146102fc578063ec318dc81461032a576100ea565b8063324536eb1461026c5780635c6581651461027457806370a08231146102a2576100ea565b806318160ddd116100c857806318160ddd146101d857806323b872dd146101f257806327e235e314610228578063313ce5671461024e576100ea565b8063029d1ecd146100ef57806306fdde031461012f578063095ea7b3146101ac575b600080fd5b61011b6004803603604081101561010557600080fd5b506001600160a01b03813516906020013561034e565b604080519115158252519081900360200190f35b610137610407565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610171578181015183820152602001610159565b50505050905090810190601f16801561019e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61011b600480360360408110156101c257600080fd5b506001600160a01b038135169060200135610495565b6101e06104fb565b60408051918252519081900360200190f35b61011b6004803603606081101561020857600080fd5b506001600160a01b03813581169160208101359091169060400135610501565b6101e06004803603602081101561023e57600080fd5b50356001600160a01b031661064f565b610256610661565b6040805160ff9092168252519081900360200190f35b6101e0610666565b6101e06004803603604081101561028a57600080fd5b506001600160a01b038135811691602001351661066c565b6101e0600480360360208110156102b857600080fd5b50356001600160a01b0316610689565b6101376106a4565b61011b600480360360408110156102e657600080fd5b506001600160a01b0381351690602001356106fe565b6101e06004803603604081101561031257600080fd5b506001600160a01b03813581169160200135166107be565b6103326107e9565b604080516001600160a01b039092168252519081900360200190f35b6002546000906001600160a01b0316331461039a5760405162461bcd60e51b81526004018080602001828103825260268152602001806109336026913960400191505060405180910390fd5b6001600160a01b0380841660008181526004602090815260408083206002805487168552908352928190208790559154825187815292519416937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a350600192915050565b6000805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561048d5780601f106104625761010080835404028352916020019161048d565b820191906000526020600020905b81548152906001019060200180831161047057829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60055490565b6001600160a01b03831660009081526003602052604081205482111561052657600080fd5b6001600160a01b038416600090815260046020908152604080832033845290915290205482111561055657600080fd5b6001600160a01b03841660009081526003602052604090205461057990836107f8565b6001600160a01b03851660009081526003602090815260408083209390935560048152828220338352905220546105b090836107f8565b6001600160a01b0380861660009081526004602090815260408083203384528252808320949094559186168152600390915220546105ee9083610841565b6001600160a01b0380851660008181526003602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b60036020526000908152604090205481565b601281565b60055481565b600460209081526000928352604080842090915290825290205481565b6001600160a01b031660009081526003602052604090205490565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561048d5780601f106104625761010080835404028352916020019161048d565b3360009081526003602052604081205482111561071a57600080fd5b3360009081526003602052604090205461073490836107f8565b33600090815260036020526040808220929092556001600160a01b038516815220546107609083610841565b6001600160a01b0384166000818152600360209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6002546001600160a01b031681565b600061083a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061089b565b9392505050565b60008282018381101561083a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000818484111561092a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156108ef5781810151838201526020016108d7565b50505050905090810190601f16801561091c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4f6e6c792074686520466163746f727920436f6e74726163742043616e2052756e2054686973a264697066735822122082a7b3fffed66de333732de5476306f7383f3360cf83e39c4d8c8520d071ab1264736f6c63430007020033
Deployed Bytecode
0x6080604052600436106103b15760003560e01c80636e9b8555116101e7578063a9db79941161010d578063bffd3b17116100a0578063dd7ce9af1161006f578063dd7ce9af14610dfb578063f34af3b414610e25578063fba0fa2614610e3a578063fd1aa91f14610e60576104a7565b8063bffd3b1714610d9f578063c3c5026c14610dc9578063c8b9bcd114610dd1578063d1c9c91f14610de6576104a7565b8063b13b1273116100dc578063b13b127314610cf4578063b6abfb0b14610d2d578063b93ba41a14610d57578063b996b52b14610d8a576104a7565b8063a9db799414610c58578063aa17743a14610c6d578063aba4dc4614610c97578063ac218d0f14610cca576104a7565b806385b2614a116101855780638e7ffaf9116101545780638e7ffaf914610bda57806391cfb4f914610bef5780639548403114610c19578063a269586014610c2e576104a7565b806385b2614a14610b6857806385c81bb414610b7d5780638762017914610b925780638da5cb5b14610bc5576104a7565b80637a618185116101c15780637a61818514610af95780637c33872514610b0e5780637dc0d1d014610b3e578063849eefc914610b53576104a7565b80636e9b855514610a9d5780636f30b22614610ac75780637130197114610acf576104a7565b8063282965df116102d75780634cf13dd31161026a57806368908f4c1161023957806368908f4c14610a235780636b45ebcb14610a385780636cbf6fb814610a625780636d30a70114610a77576104a7565b80634cf13dd31461097b5780635082f6ab146109905780635ab8d6f8146109ba57806364b8cb3f146109e4576104a7565b806333fa99f4116102a657806333fa99f4146108e0578063383dcd6b1461090a57806338b6a3a114610933578063446ccf1014610966576104a7565b8063282965df1461086e578063298877d6146108835780632ad56b4c146108985780633027da02146108ad576104a7565b806315b40efe1161034f5780631f611daf1161031e5780631f611daf14610663578063258124fa1461069657806325ca6a0d1461082f5780632770340a14610859576104a7565b806315b40efe146105df5780631729ad1e1461060f5780631849180714610624578063186b31cb14610639576104a7565b80630a5dbab11161038b5780630a5dbab1146105455780630c89a0f01461056f5780630d94a7c314610584578063124a894c146105b5576104a7565b8063049842b1146104ac578063056ccf05146104d65780630962264214610500576104a7565b366104a75760003411610406576040805162461bcd60e51b81526020600482015260186024820152774d757374204465706f736974204e6f6e7a65726f2057656960401b604482015290519081900360640190fd5b336000908152600860205260409020546104209034610e75565b33600090815260086020908152604080832093909355600f9052205460ff1615156001146104a557336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b005b600080fd5b3480156104b857600080fd5b506104a5600480360360208110156104cf57600080fd5b5035610ed8565b3480156104e257600080fd5b506104a5600480360360208110156104f957600080fd5b50356110cc565b34801561050c57600080fd5b506105336004803603602081101561052357600080fd5b50356001600160a01b031661111a565b60408051918252519081900360200190f35b34801561055157600080fd5b506104a56004803603602081101561056857600080fd5b503561112c565b34801561057b57600080fd5b50610533611276565b34801561059057600080fd5b5061059961127c565b604080516001600160a01b039092168252519081900360200190f35b3480156105c157600080fd5b506104a5600480360360208110156105d857600080fd5b503561128b565b3480156105eb57600080fd5b506104a56004803603604081101561060257600080fd5b50803590602001356112d9565b34801561061b57600080fd5b50610533611596565b34801561063057600080fd5b5061053361159c565b34801561064557600080fd5b506104a56004803603602081101561065c57600080fd5b50356115a2565b34801561066f57600080fd5b506104a56004803603602081101561068657600080fd5b50356001600160a01b03166115f0565b3480156106a257600080fd5b506106c0600480360360208110156106b957600080fd5b503561165b565b60405180806020018060200180602001806020018060200187815260200186810386528c818151815260200191508051906020019060200280838360005b838110156107165781810151838201526020016106fe565b5050505090500186810385528b818151815260200191508051906020019060200280838360005b8381101561075557818101518382015260200161073d565b5050505090500186810384528a818151815260200191508051906020019060200280838360005b8381101561079457818101518382015260200161077c565b50505050905001868103835289818151815260200191508051906020019060200280838360005b838110156107d35781810151838201526020016107bb565b50505050905001868103825288818151815260200191508051906020019060200280838360005b838110156108125781810151838201526020016107fa565b505050509050019b50505050505050505050505060405180910390f35b34801561083b57600080fd5b506104a56004803603602081101561085257600080fd5b50356119c8565b34801561086557600080fd5b50610533611a16565b34801561087a57600080fd5b50610533611a1c565b34801561088f57600080fd5b50610533611a22565b3480156108a457600080fd5b50610533611a28565b3480156108b957600080fd5b50610533600480360360208110156108d057600080fd5b50356001600160a01b0316611a2e565b3480156108ec57600080fd5b506104a56004803603602081101561090357600080fd5b5035611a40565b34801561091657600080fd5b5061091f611c36565b604080519115158252519081900360200190f35b34801561093f57600080fd5b5061091f6004803603602081101561095657600080fd5b50356001600160a01b0316611c3f565b34801561097257600080fd5b506104a5611c54565b34801561098757600080fd5b50610533611ca2565b34801561099c57600080fd5b506104a5600480360360208110156109b357600080fd5b5035611ca8565b3480156109c657600080fd5b506104a5600480360360208110156109dd57600080fd5b5035611cf6565b610a0a600480360360208110156109fa57600080fd5b50356001600160a01b0316611e35565b6040805192835260208301919091528051918290030190f35b348015610a2f57600080fd5b506104a5611fa1565b348015610a4457600080fd5b5061059960048036036020811015610a5b57600080fd5b5035612098565b348015610a6e57600080fd5b506105336120bf565b610a0a60048036036020811015610a8d57600080fd5b50356001600160a01b03166120c5565b348015610aa957600080fd5b5061059960048036036020811015610ac057600080fd5b50356121ee565b6104a56121fb565b348015610adb57600080fd5b506104a560048036036020811015610af257600080fd5b50356122bf565b348015610b0557600080fd5b50610533612474565b348015610b1a57600080fd5b506104a560048036036040811015610b3157600080fd5b508035906020013561247a565b348015610b4a57600080fd5b506105996127a1565b348015610b5f57600080fd5b506104a56127b0565b348015610b7457600080fd5b506104a5612894565b348015610b8957600080fd5b5061091f612b39565b348015610b9e57600080fd5b506104a560048036036020811015610bb557600080fd5b50356001600160a01b0316612b49565b348015610bd157600080fd5b50610599612bb4565b348015610be657600080fd5b50610533612bc3565b348015610bfb57600080fd5b506104a560048036036020811015610c1257600080fd5b5035612bc9565b348015610c2557600080fd5b50610533612d58565b348015610c3a57600080fd5b5061053360048036036020811015610c5157600080fd5b5035612d5e565b348015610c6457600080fd5b50610533612d7c565b348015610c7957600080fd5b506104a560048036036020811015610c9057600080fd5b5035612d82565b348015610ca357600080fd5b5061053360048036036020811015610cba57600080fd5b50356001600160a01b0316612dea565b348015610cd657600080fd5b5061053360048036036020811015610ced57600080fd5b5035612dfc565b348015610d0057600080fd5b506104a560048036036040811015610d1757600080fd5b50803590602001356001600160a01b0316612e09565b348015610d3957600080fd5b506104a560048036036020811015610d5057600080fd5b5035613230565b348015610d6357600080fd5b5061053360048036036020811015610d7a57600080fd5b50356001600160a01b0316613391565b348015610d9657600080fd5b506105336133a3565b348015610dab57600080fd5b506104a560048036036020811015610dc257600080fd5b50356133a9565b6104a56133f7565b348015610ddd57600080fd5b506105996134e8565b348015610df257600080fd5b506104a56134f7565b348015610e0757600080fd5b506104a560048036036020811015610e1e57600080fd5b5035613559565b348015610e3157600080fd5b5061091f6135a7565b6104a560048036036020811015610e5057600080fd5b50356001600160a01b03166135b0565b348015610e6c57600080fd5b50610533613a4d565b600082820183811015610ecf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b68327cb2734119d3b7a9601e1b8110610f225760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b81523360048201526024810185905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b158015610f7757600080fd5b505af1158015610f8b573d6000803e3d6000fd5b505050506040513d6020811015610fa157600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b158015610ffe57600080fd5b505af1158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b5050336000908152600d60205260409020546110449082610e75565b336000908152600d6020908152604080832093909355600f9052205460ff1615156001146110c957336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b50565b6011546001600160a01b031633146111155760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600c55565b600e6020526000908152604090205481565b68327cb2734119d3b7a9601e1b81106111765760405162461bcd60e51b8152600401808060200182810382526022815260200180613c936022913960400191505060405180910390fd5b336000908152600e60205260408120546111ad906402540be400906111a790670de0b6b3a764000090829087610e75565b90613a53565b600a54336000908152600d602052604081205460025493945090926111d792916111a79190613a53565b9050808211156112185760405162461bcd60e51b81526004018080602001828103825260308152602001806140e96030913960400191505060405180910390fd5b336000908152600e60205260409020546112329084610e75565b336000818152600e6020526040808220939093559151909185156108fc02918691818181858888f19350505050158015611270573d6000803e3d6000fd5b50505050565b60165481565b6000546001600160a01b031681565b6011546001600160a01b031633146112d45760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600a55565b60175460ff16151560011461131f5760405162461bcd60e51b815260040180806020018281038252605c81526020018061414b605c913960600191505060405180910390fd5b6019546002028110156113635760405162461bcd60e51b815260040180806020018281038252602f815260200180614065602f913960400191505060405180910390fd5b6018548214156113a45760405162461bcd60e51b81526004018080602001828103825260358152602001806140946035913960400191505060405180910390fd5b60015460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d602081101561141f57600080fd5b50519050818110156114625760405162461bcd60e51b81526004018080602001828103825260498152602001806141a76049913960600191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d60208110156114e657600080fd5b5050601d805460018181019092557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b03191633179055601c80548083019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101849055601b805491820181556000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc1018290555060189190915542601a55601955565b60045481565b60025481565b6011546001600160a01b031633146115eb5760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600755565b6011546001600160a01b031633146116395760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606080606080606060008087116116a35760405162461bcd60e51b81526004018080602001828103825260238152602001806142ac6023913960400191505060405180910390fd5b60608767ffffffffffffffff811180156116bc57600080fd5b506040519080825280602002602001820160405280156116e6578160200160208202803683370190505b50905060608867ffffffffffffffff8111801561170257600080fd5b5060405190808252806020026020018201604052801561172c578160200160208202803683370190505b50905060608967ffffffffffffffff8111801561174857600080fd5b50604051908082528060200260200182016040528015611772578160200160208202803683370190505b50905060608a67ffffffffffffffff8111801561178e57600080fd5b506040519080825280602002602001820160405280156117b8578160200160208202803683370190505b50905060608b67ffffffffffffffff811180156117d457600080fd5b506040519080825280602002602001820160405280156117fe578160200160208202803683370190505b5090506000805b6010548110156119b3578d821061181b576119b3565b600061185f600254600960006010868154811061183457fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613a53565b905060006118826305f5e1006111a7600654600860006010898154811061183457fe5b905060006118ac6402540be4006111a7670de0b6b3a7640000600e600060108a8154811061183457fe5b905060006118cd600b546111a7600254600d600060108b8154811061183457fe5b9050828411806118dc57508082115b156119a357601085815481106118ee57fe5b9060005260206000200160009054906101000a90046001600160a01b03168b878151811061191857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838a878151811061194557fe5b6020026020010181815250508289878151811061195e57fe5b6020026020010181815250508188878151811061197757fe5b6020026020010181815250508087878151811061199057fe5b6020026020010181815250508560010195505b5050600190920191506118059050565b50949c939b5091995097509550909350915050565b6011546001600160a01b03163314611a115760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600655565b600b5481565b60195481565b60065481565b600a5481565b60086020526000908152604090205481565b68327cb2734119d3b7a9601e1b8110611a8a5760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600354600454611a9a9083610e75565b1115611ad75760405162461bcd60e51b8152600401808060200182810382526032815260200180613f866032913960400191505060405180910390fd5b600254336000908152600960205260408120549091611b03916402540be400916111a791829087610e75565b6005543360009081526008602052604081205492935091611b3191670de0b6b3a7640000916111a791613a53565b9050808210611b715760405162461bcd60e51b815260040180806020018281038252602f815260200180613ee8602f913960400191505060405180910390fd5b33600090815260096020526040902054611b8b9084610e75565b33600090815260096020526040902055600454611ba89084610e75565b6004908155600080546040805163a9059cbb60e01b8152339481019490945260248401879052516001600160a01b039091169263a9059cbb9260448083019360209390929083900390910190829087803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050506040513d6020811015611c2f57600080fd5b5050505050565b60155460ff1681565b600f6020526000908152604090205460ff1681565b6011546001600160a01b03163314611c6b57600080fd5b63ee6b280060055564012a05f2006006556359682f00600755601280546001600160a01b0319908116909155601180549091169055565b60075481565b6011546001600160a01b03163314611cf15760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600b55565b68327cb2734119d3b7a9601e1b8110611d405760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600254336000908152600960205260408120549091611d6a916402540be400916111a79190613a53565b6005543360009081526008602052604081205492935091611d9c91670de0b6b3a7640000916111a79190829088613aac565b905080821115611ddd5760405162461bcd60e51b81526004018080602001828103825260348152602001806140106034913960400191505060405180910390fd5b33600090815260086020526040902054611df79084613aac565b33600081815260086020526040808220939093559151909185156108fc02918691818181858888f19350505050158015611270573d6000803e3d6000fd5b60008068327cb2734119d3b7a9601e1b3410611e98576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0383166000908152600e6020526040902054341115611eef5760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0383166000908152600e6020526040812054611f25906402540be400906111a790670de0b6b3a7640000613a53565b600b546002546001600160a01b0387166000908152600d602052604081205493945092611f5792916111a79190613a53565b9050808211611f975760405162461bcd60e51b815260040180806020018281038252602d8152602001806141f0602d913960400191505060405180910390fd5b9092509050915091565b60155460ff16611fb057600080fd5b601454336000908152600960205260408120549091611ff091600191611fea91670de0b6b3a764000091611fe49190613a53565b90613aee565b90610e75565b3360009081526008602052604090205490915081106120405760405162461bcd60e51b815260040180806020018281038252602b81526020018061421d602b913960400191505060405180910390fd5b33600081815260086020818152604080842080546009845282862086905593909252908390555190849003929183156108fc02918491818181858888f19350505050158015612093573d6000803e3d6000fd5b505050565b601d81815481106120a557fe5b6000918252602090912001546001600160a01b0316905081565b600c5481565b60008068327cb2734119d3b7a9601e1b3410612128576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205434111561217f5760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0383166000908152600d6020526040812054600254600c549192916121e29190611fe4906305f5e100906111a7906121c3906402540be400610e75565b6001600160a01b038b166000908152600e602052604090205490613a53565b91935090915050915091565b601081815481106120a557fe5b68327cb2734119d3b7a9601e1b34106122455760405162461bcd60e51b8152600401808060200182810382526022815260200180613c936022913960400191505060405180910390fd5b336000908152600e60205260409020543411156122935760405162461bcd60e51b8152600401808060200182810382526042815260200180613f446042913960600191505060405180910390fd5b336000908152600e60205260409020546122ad9034613aac565b336000908152600e6020526040902055565b60155460ff166122ce57600080fd5b68327cb2734119d3b7a9601e1b81106123185760405162461bcd60e51b81526004018080602001828103825260228152602001806142486022913960400191505060405180910390fd5b600061233b670de0b6b3a7640000611fe460145485613a5390919063ffffffff16565b600080546040805163029d1ecd60e01b81523360048201526024810187905290519394506001600160a01b039091169263029d1ecd92604480840193602093929083900390910190829087803b15801561239457600080fd5b505af11580156123a8573d6000803e3d6000fd5b505050506040513d60208110156123be57600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b505050506040513d602081101561244557600080fd5b5050604051339082156108fc029083906000818181858888f19350505050158015612093573d6000803e3d6000fd5b60185481565b6000601654116124bb5760405162461bcd60e51b815260040180806020018281038252602f815260200180613cfb602f913960400191505060405180910390fd5b621275006124d460165442613aac90919063ffffffff16565b116125105760405162461bcd60e51b8152600401808060200182810382526041815260200180613d616041913960600191505060405180910390fd5b678ac7230489e800008110156125575760405162461bcd60e51b8152600401808060200182810382526028815260200180613dfc6028913960400191505060405180910390fd5b6002548214156125985760405162461bcd60e51b8152600401808060200182810382526034815260200180613c5f6034913960400191505060405180910390fd5b60175460ff16156125a857600080fd5b60015460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156125f957600080fd5b505afa15801561260d573d6000803e3d6000fd5b505050506040513d602081101561262357600080fd5b50519050818110156126665760405162461bcd60e51b8152600401808060200182810382526049815260200180613e516049913960600191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156126c057600080fd5b505af11580156126d4573d6000803e3d6000fd5b505050506040513d60208110156126ea57600080fd5b5050601d805460018181019092557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b031916331790556017805460ff191682179055601c80548083019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101849055601b805491820181556000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc101919091555060185542601a55565b6012546001600160a01b031681565b601254600160a01b900460ff166127f85760405162461bcd60e51b815260040180806020018281038252604e815260200180613e9a604e913960600191505060405180910390fd5b6013546212750001421161283d5760405162461bcd60e51b81526004018080602001828103825260328152602001806141196032913960400191505060405180910390fd5b60155460ff161561287f5760405162461bcd60e51b8152600401808060200182810382526037815260200180613d2a6037913960400191505060405180910390fd5b6002546014556015805460ff19166001179055565b60175460ff1615156001146128da5760405162461bcd60e51b8152600401808060200182810382526023815260200180613fed6023913960400191505060405180910390fd5b6202a3006128f3601a5442613aac90919063ffffffff16565b1161292f5760405162461bcd60e51b815260040180806020018281038252604281526020018061426a6042913960600191505060405180910390fd5b601854600255600080805b601b548110156129ab57600254601c828154811061295457fe5b9060005260206000200154141561298657601b818154811061297257fe5b9060005260206000200154820191506129a3565b601b818154811061299357fe5b9060005260206000200154830192505b60010161293a565b5060005b601b54811015612af757600254601c82815481106129c957fe5b90600052602060002001541415612ad3576000612a0683611fe4601b85815481106129f057fe5b6000918252602090912001546111a78888610e75565b90506000601b8381548110612a1757fe5b600091825260208220019190915554601d80546001600160a01b039092169163a9059cbb919085908110612a4757fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b505050506040513d6020811015612aca57600080fd5b50612aef915050565b6000601b8281548110612ae257fe5b6000918252602090912001555b6001016129af565b50612b04601b6000613c2c565b612b10601c6000613c2c565b612b1c601d6000613c2c565b5050600060188190556019819055601a556017805460ff19169055565b601254600160a01b900460ff1681565b6011546001600160a01b03163314612b925760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b60035481565b68327cb2734119d3b7a9601e1b8110612c135760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b81523360048201526024810185905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050506040513d6020811015612c9257600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b158015612cef57600080fd5b505af1158015612d03573d6000803e3d6000fd5b505050506040513d6020811015612d1957600080fd5b505033600090815260096020526040902054612d359082613aac565b33600090815260096020526040902055600454612d529082613aac565b60045550565b601a5481565b601b8181548110612d6b57fe5b600091825260209091200154905081565b60145481565b6012546001600160a01b03163314612de1576040805162461bcd60e51b815260206004820152601e60248201527f446973616c6c6f7765643a20596f7520617265206e6f74206f7261636c650000604482015290519081900360640190fd5b60025542601655565b60096020526000908152604090205481565b601c8181548110612d6b57fe5b6001600160a01b038116600090815260096020526040902054821115612e605760405162461bcd60e51b8152600401808060200182810382526036815260200180613dc66036913960400191505060405180910390fd5b6002546001600160a01b0382166000908152600960205260408120549091612e93916402540be400916111a79190613a53565b6006546001600160a01b03841660009081526008602052604081205492935091612eca91670de0b6b3a7640000916111a791613a53565b9050808211612f0a5760405162461bcd60e51b8152600401808060200182810382526046815260200180613cb56046913960600191505060405180910390fd5b6001600160a01b038316600090815260086020526040812054612f40906402540be400906111a790670de0b6b3a7640000613a53565b90506000612f86612f616402540be400600754610e7590919063ffffffff16565b6002546001600160a01b0388166000908152600960205260409020546111a791613a53565b9050600081831015612fce576001600160a01b038616600090815260096020908152604080832054600890925290912054612fc79190611fe4908a90613a53565b9050613011565b61300e6402540be400611fe4670de0b6b3a7640000611fe46130006402540be400600754610e7590919063ffffffff16565b6002546111a7908e90613a53565b90505b6001600160a01b0386166000908152600860205260409020548111156130685760405162461bcd60e51b8152600401808060200182810382526024815260200180613da26024913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b8152336004820152602481018b905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b505050506040513d60208110156130e757600080fd5b505060008054604080516323b872dd60e01b8152336004820152306024820152604481018b905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561314457600080fd5b505af1158015613158573d6000803e3d6000fd5b505050506040513d602081101561316e57600080fd5b50506001600160a01b0386166000908152600960205260409020546131939088613aac565b6001600160a01b0387166000908152600960205260409020556004546131b99088613aac565b6004556001600160a01b0386166000908152600860205260409020546131df9082613aac565b6001600160a01b038716600090815260086020526040808220929092559051339183156108fc02918491818181858888f19350505050158015613226573d6000803e3d6000fd5b5050505050505050565b68327cb2734119d3b7a9601e1b811061327a5760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b336000908152600e60205260408120546132a790670de0b6b3a7640000906111a7906402540be400613a53565b600a54600254336000908152600d6020526040812054939450926132d292916111a791829088613aac565b9050808211156133135760405162461bcd60e51b81526004018080602001828103825260348152602001806140106034913960400191505060405180910390fd5b336000908152600d602052604090205461332d9084613aac565b336000818152600d60209081526040808320949094558154845163a9059cbb60e01b815260048101949094526024840188905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015611c0557600080fd5b600d6020526000908152604090205481565b60055481565b6011546001600160a01b031633146133f25760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600355565b60003411613447576040805162461bcd60e51b81526020600482015260186024820152774d757374204465706f736974204e6f6e7a65726f2057656960401b604482015290519081900360640190fd5b336000908152600860205260409020546134619034610e75565b33600090815260086020908152604080832093909355600f9052205460ff1615156001146134e657336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b565b6001546001600160a01b031681565b6011546001600160a01b031633146135405760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b6012805460ff60a01b1916600160a01b17905542601355565b6011546001600160a01b031633146135a25760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600555565b60175460ff1681565b68327cb2734119d3b7a9601e1b3410613610576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0381166000908152600e60205260409020543411156136675760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0381166000908152600e602052604081205461369d906402540be400906111a790670de0b6b3a7640000613a53565b600b546002546001600160a01b0385166000908152600d6020526040812054939450926136cf92916111a79190613a53565b60408051602081018390528181526003818301526252485360e81b606082015290519192506000805160206140c9833981519152919081900360800190a16040805160208101849052818152600381830152624c485360e81b606082015290516000805160206140c98339815191529181900360800190a18082116137855760405162461bcd60e51b815260040180806020018281038252602d8152602001806141f0602d913960400191505060405180910390fd5b6001600160a01b0383166000908152600d6020526040812054600254600c549192916137c99190611fe4906305f5e100906111a7906121c3906402540be400610e75565b6040805160208101839052818152600481830152632924299960e11b606082015290519192506000805160206140c9833981519152919081900360800190a16040805160208101849052818152600481830152632624299960e11b606082015290516000805160206140c98339815191529181900360800190a16000818310156138e1576001600160a01b0386166000908152600e6020908152604080832054600d909252909120546138829190611fe4903490613a53565b6001600160a01b0387166000908152600d60205260409020549091508111156138dc5760405162461bcd60e51b815260040180806020018281038252602d815260200180613e24602d913960400191505060405180910390fd5b61396d565b613913600254611fe46305f5e1006111a761390c6402540be400600c54610e7590919063ffffffff16565b3490613a53565b6001600160a01b0387166000908152600d602052604090205490915081111561396d5760405162461bcd60e51b815260040180806020018281038252602d815260200180613f17602d913960400191505060405180910390fd5b6001600160a01b0386166000908152600e60205260409020546139909034613aac565b6001600160a01b0387166000908152600e6020908152604080832093909355600d905220546139bf9082613aac565b6001600160a01b038088166000908152600d60209081526040808320949094558154845163a9059cbb60e01b815233600482015260248101879052945193169363a9059cbb9360448083019491928390030190829087803b158015613a2357600080fd5b505af1158015613a37573d6000803e3d6000fd5b505050506040513d602081101561322657600080fd5b60135481565b600082613a6257506000610ed2565b82820282848281613a6f57fe5b0414610ecf5760405162461bcd60e51b81526004018080602001828103825260218152602001806140446021913960400191505060405180910390fd5b6000610ecf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b30565b6000610ecf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bc7565b60008184841115613bbf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b84578181015183820152602001613b6c565b50505050905090810190601f168015613bb15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c165760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b84578181015183820152602001613b6c565b506000838581613c2257fe5b0495945050505050565b50805460008255906000526020600020908101906110c991905b80821115613c5a5760008155600101613c46565b509056fe596f7520646f206e6f7420646973616772656520776974682063757272656e742076616c7565206f66207765695065727653505950726f74656374697665204d617820426f756e6420666f7220496e7075742048697443757272656e7420636f6e74726163742069732077697468696e206d61696e7461696e616e6365206d617267696e2c20736f20796f752063616e6e6f742072756e207468697343616e6e6f74206368616c6c656e67652061206e65776c79206372656174656420736d61727420636f6e7472616374546869732066756e6374696f6e2068617320616c72656164792062652072756e3b2063616e206f6e6c792062652072756e206f6e63652e596f75206d757374207761697420666f72207468652077686974656c697374206f7261636c6520746f206e6f7420726573706f6e6420666f722031342064617973436f6465204572726f7220696620796f752072656163686564207468697320706f696e74596f752063616e6e6f742070726f76696465206d6f72652076535059207468616e207653505944656274206f75747374616e64696e67596f75206d757374206368616c6c656e67652077697468206174206c656173742074656e20495654436f6465204572726f72204272616e6368203120696620796f752072656163686564207468697320706f696e74596f752068617665206e6f7420616c6c6f776564207468697320636f6e74726163742061636365737320746f20746865206e756d626572206f66204956547320796f7520636c61696d52656769737465722066756e6374696f6e2063616e206f6e6c792062652072756e20696620676f7665726e616e636520686173206465636c6172656420676c6f62616c20736574746c656d656e74596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72206c656e64696e67436f6465204572726f72204272616e6368203220696620796f752072656163686564207468697320706f696e74596f752063616e6e6f742070617920646f776e206d6f7265205765692064656274207468616e2065786973747320696e207468697320636f756e7465725661756c7443757272656e742076657273696f6e206c696d697473206d617820616d6f756e74206f66207653505920706f737369626c65596f752063616e6e6f742070726f76696465206d6f726520576569207468616e205765692064656274206f75747374616e64696e67436f6e73696465722073746172744368616c6c656e6765576569506572765350592829596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72207769746864726177696e672e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77596f75206d75737420646f75626c6520746865204956542066726f6d20746865206c617374206368616c6c656e6765596f7520646f206e6f742064697361677265652077697468206c617374206368616c6c656e6765206f66207765695065727653505956b033c912409c2aad1b37f58cfd6ee2012622b4210104a14e06aef2233597fd596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72206c656e64696e672e4e65656420746f2077616974203134206461797320746f2066696e616c697a6520676c6f62616c20736574746c656d656e7472656368616c6c656e67652063616e6e6f742062652072756e206966206368616c6c656e676520686173206e6f7420737461727465642e2020636f6e73696465722073746172744368616c6c656e6765576569506572765350592829596f752068617665206e6f7420616c6c6f776564207468697320636f6e74726163742061636365737320746f20746865206e756d626572206f66205741547320796f7520636c61696d43757272656e7420636f6e74726163742069732077697468696e206d61696e74656e656e6365206d617267696e5468697320435456206973206e6f742061626f76652077617465722c2063616e6e6f7420636f6e7665727450726f74656374697665206d617820626f756e6420666f7220696e70757420686974596f75206d7573742077616974203220646179732073696e636520746865206c617374206368616c6c656e676520746f20656e6420746865206368616c6c656e67654d7573742072756e2074686973206f6e206120706f73697469766520696e7465676572446973616c6c6f7765643a20596f7520617265206e6f7420676f7665726e616e636550726f74656374697665206d617820626f756e6420666f722075696e7420617267756d656e74a26469706673582212202cad6883ce2c5875fee7f4761e0b18f8f1097c709d66973b3e97b57d28d0e30864736f6c63430007020033
Deployed Bytecode Sourcemap
218:30900:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7634:1;7622:9;:13;7614:50;;;;;-1:-1:-1;;;7614:50:2;;;;;;;;;;;;-1:-1:-1;;;7614:50:2;;;;;;;;;;;;;;;7798:10;7789:20;;;;:8;:20;;;;;;:37;;7815:9;7789:24;:37::i;:::-;7775:10;7766:20;;;;:8;:20;;;;;;;;:60;;;;7850:19;:31;;;;;;:39;;:31;:39;7847:197;;7963:10;7943:31;;;;:19;:31;;;;;:38;;-1:-1:-1;;7943:38:2;7977:4;7943:38;;;;;;7996:19;:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;7996:36:2;;;;;;7847:197;218:30900;;;;;13466:708;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13466:708:2;;:::i;5981:234::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5981:234:2;;:::i;2541:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2541:51:2;-1:-1:-1;;;;;2541:51:2;;:::i;:::-;;;;;;;;;;;;;;;;15184:1006;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15184:1006:2;;:::i;3355:26::-;;;;;;;;;;;;;:::i;336:29::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;336:29:2;;;;;;;;;;;;;;5497:234;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5497:234:2;;:::i;27617:1196::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27617:1196:2;;;;;;;:::i;775:34::-;;;;;;;;;;;;;:::i;637:33::-;;;;;;;;;;;;;:::i;5299:186::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5299:186:2;;:::i;6227:165::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6227:165:2;-1:-1:-1;;;;;6227:165:2;;:::i;22006:2106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22006:2106:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5109:178;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5109:178:2;;:::i;1997:53::-;;;;;;;;;;;;;:::i;3660:28::-;;;;;;;;;;;;;:::i;1050:41::-;;;;;;;;;;;;;:::i;1845:53::-;;;;;;;;;;;;;:::i;1587:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1587:40:2;-1:-1:-1;;;;;1587:40:2;;:::i;9023:1068::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9023:1068:2;;:::i;3299:37::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2763:51;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2763:51:2;-1:-1:-1;;;;;2763:51:2;;:::i;30673:434::-;;;;;;;;;;;;;:::i;1180:41::-;;;;;;;;;;;;;:::i;5743:226::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5743:226:2;;:::i;8059:946::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8059:946:2;;:::i;19725:1002::-;;;;;;;;;;;;;;;;-1:-1:-1;19725:1002:2;-1:-1:-1;;;;;19725:1002:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25606:597;;;;;;;;;;;;;:::i;4169:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4169:28:2;;:::i;2149:53::-;;;;;;;;;;;;;:::i;20745:1237::-;;;;;;;;;;;;;;;;-1:-1:-1;20745:1237:2;-1:-1:-1;;;;;20745:1237:2;;:::i;2865:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2865:36:2;;:::i;16202:406::-;;;:::i;24820:768::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24820:768:2;;:::i;3494:30::-;;;;;;;;;;;;;:::i;26264:1341::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26264:1341:2;;;;;;;:::i;3096:29::-;;;;;;;;;;;;;:::i;24296:512::-;;;;;;;;;;;;;:::i;28825:1838::-;;;;;;;;;;;;;:::i;3173:38::-;;;;;;;;;;;;;:::i;6404:169::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6404:169:2;-1:-1:-1;;;;;6404:169:2;;:::i;2965:28::-;;;;;;;;;;;;;:::i;678:40::-;;;;;;;;;;;;;:::i;10103:530::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10103:530:2;;:::i;3776:29::-;;;;;;;;;;;;;:::i;3907:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3907:31:2;;:::i;3262:29::-;;;;;;;;;;;;;:::i;4651:217::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4651:217:2;;:::i;1685:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1685:43:2;-1:-1:-1;;;;;1685:43:2;;:::i;4053:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4053:29:2;;:::i;10651:2759::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10651:2759:2;;;;;;-1:-1:-1;;;;;10651:2759:2;;:::i;14188:978::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14188:978:2;;:::i;2431:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2431:56:2;-1:-1:-1;;;;;2431:56:2;;:::i;922:41::-;;;;;;;;;;;;;:::i;6585:174::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6585:174:2;;:::i;7037:461::-;;;:::i;372:28::-;;;;;;;;;;;;;:::i;6771:218::-;;;;;;;;;;;;;:::i;4911:186::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4911:186:2;;:::i;3388:36::-;;;;;;;;;;;;;:::i;16638:3063::-;;;;;;;;;;;;;;;;-1:-1:-1;16638:3063:2;-1:-1:-1;;;;;16638:3063:2;;:::i;3218:37::-;;;;;;;;;;;;;:::i;324:181:1:-;382:7;414:5;;;438:6;;;;430:46;;;;;-1:-1:-1;;;430:46:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;496:1;-1:-1:-1;324:181:1;;;;;:::o;13466:708:2:-;-1:-1:-1;;;13549:15:2;:26;13540:78;;;;-1:-1:-1;;;13540:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13713:9;;;:51;;;-1:-1:-1;;;13713:51:2;;13736:10;13713:51;;;;;;;;;;;;-1:-1:-1;;;;;13713:9:2;;;;:22;;:51;;;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13776:9:2;;;:66;;;-1:-1:-1;;;13776:66:2;;13799:10;13776:66;;;;13819:4;13776:66;;;;;;;;;;;;-1:-1:-1;;;;;13776:9:2;;;;:22;;:66;;;;;13713:51;;13776:66;;;;;;;;;;:9;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13917:10:2;13892:36;;;;:24;13776:66;13892:36;;;;;:57;;13933:15;13892:40;:57::i;:::-;13878:10;13853:36;;;;:24;:36;;;;;;;;:96;;;;13973:19;:31;;;;;;:39;;:31;:39;13970:197;;14086:10;14066:31;;;;:19;:31;;;;;:38;;-1:-1:-1;;14066:38:2;14100:4;14066:38;;;;;;14119:19;:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;14119:36:2;;;;;;13970:197;13466:708;:::o;5981:234::-;6098:5;;-1:-1:-1;;;;;6098:5:2;6084:10;:19;6076:66;;;;-1:-1:-1;;;6076:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6153:25;:54;5981:234::o;2541:51::-;;;;;;;;;;;;;:::o;15184:1006::-;-1:-1:-1;;;15313:8:2;:19;15305:66;;;;-1:-1:-1;;;15305:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15718:10;15687:8;15698:31;;;:19;:31;;;;;;:78;;15766:8;;15698:62;;15751:7;;15698:62;;15735:8;15698:35;:47::i;:::-;:51;;:62::i;:78::-;15858:25;;15839:10;15787:8;15814:36;;;:24;:36;;;;;;15798:10;;15687:89;;-1:-1:-1;15787:8:2;;15798:87;;15858:25;15798:54;;:10;:14;:54::i;:87::-;15787:98;;15921:3;15914;:10;;15906:71;;;;-1:-1:-1;;;15906:71:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16088:10;16068:31;;;;:19;:31;;;;;;:47;;16105:8;16068:35;:47::i;:::-;16054:10;16034:31;;;;:19;:31;;;;;;:81;;;;16153:29;;16054:10;;16153:29;;;;;16173:8;;16153:29;16034:31;16153:29;16173:8;16054:10;16153:29;;;;;;;;;;;;;;;;;;;;;15184:1006;;;:::o;3355:26::-;;;;:::o;336:29::-;;;-1:-1:-1;;;;;336:29:2;;:::o;5497:234::-;5614:5;;-1:-1:-1;;;;;5614:5:2;5600:10;:19;5592:66;;;;-1:-1:-1;;;5592:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5669:25;:54;5497:234::o;27617:1196::-;27717:16;;;;:24;;:16;:24;27709:129;;;;-1:-1:-1;;;27709:129:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27871:16;;27890:1;27871:20;27857:10;:34;;27849:94;;;;-1:-1:-1;;;27849:94:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27985:18;;27962:19;:41;;27954:107;;;;-1:-1:-1;;;27954:107:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28155:8;;:45;;;-1:-1:-1;;;28155:45:2;;28174:10;28155:45;;;;28194:4;28155:45;;;;;;28135:17;;-1:-1:-1;;;;;28155:8:2;;:18;;:45;;;;;;;;;;;;;;:8;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28155:45:2;;-1:-1:-1;28219:23:2;;;;28211:109;;;;-1:-1:-1;;;28211:109:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28331:8;;:60;;;-1:-1:-1;;;28331:60:2;;28353:10;28331:60;;;;28373:4;28331:60;;;;;;;;;;;;-1:-1:-1;;;;;28331:8:2;;;;:21;;:60;;;;;;;;;;;;;;;:8;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28495:11:2;:28;;;;;;;;;;;;;-1:-1:-1;;;;;;28495:28:2;28512:10;28495:28;;;28582:15;:41;;;;;;;;;;;;;28634:17;:34;;;;;;;-1:-1:-1;28634:34:2;;;;;;-1:-1:-1;28679:18:2;:40;;;;28750:15;28730:17;:35;28776:16;:29;27617:1196::o;775:34::-;;;;:::o;637:33::-;;;;:::o;5299:186::-;5392:5;;-1:-1:-1;;;;;5392:5:2;5378:10;:19;5370:66;;;;-1:-1:-1;;;5370:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5447:13;:30;5299:186::o;6227:165::-;6315:5;;-1:-1:-1;;;;;6315:5:2;6301:10;:19;6293:66;;;;-1:-1:-1;;;6293:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6370:5;:14;;-1:-1:-1;;;;;;6370:14:2;-1:-1:-1;;;;;6370:14:2;;;;;;;;;;6227:165::o;22006:2106::-;22074:16;22092:13;22107;22122;22137;22152:4;22233:1;22221:9;:13;22213:61;;;;-1:-1:-1;;;22213:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22285:38;22340:9;22326:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22326:24:2;;22285:65;;22361:24;22399:9;22388:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22388:21:2;;22361:48;;22420:24;22458:9;22447:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22447:21:2;;22420:48;;22489:31;22534:9;22523:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22523:21:2;;22489:55;;22555:31;22600:9;22589:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22589:21:2;;22555:55;;22641:6;22696;22691:1308;22708:19;:26;22706:28;;22691:1308;;;22763:9;22759:1;:13;22756:58;;22793:5;;22756:58;22963:14;22980:51;23020:10;;22980:11;:35;22992:19;23012:1;22992:22;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22992:22:2;22980:35;;;;;;;;;;;;;;:39;:51::i;:::-;22963:68;;23046:14;23064:65;23121:7;23064:51;23102:11;;23064:8;:32;23073:19;23093:1;23073:22;;;;;;;23064:65;23046:83;;23335:21;23359:75;23424:8;23359:59;23408:8;23359:19;:43;23379:19;23399:1;23379:22;;;;;;;23359:75;23335:99;;23449:21;23473:97;23545:23;;23473:66;23527:10;;23473:24;:48;23498:19;23518:1;23498:22;;;;;;;23473:97;23449:121;;23616:9;23604;:21;23603:64;;;;23650:16;23631;:35;23603:64;23599:389;;;23716:19;23736:1;23716:22;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23716:22:2;23689:21;23711:1;23689:24;;;;;;;;;;;;;:49;-1:-1:-1;;;;;23689:49:2;;;-1:-1:-1;;;;;23689:49:2;;;;;23773:9;23757:10;23768:1;23757:13;;;;;;;;;;;;;:25;;;;;23817:9;23801:10;23812:1;23801:13;;;;;;;;;;;;;:25;;;;;23868:16;23845:17;23863:1;23845:20;;;;;;;;;;;;;:39;;;;;23926:16;23903:17;23921:1;23903:20;;;;;;;;;;;;;:39;;;;;23967:1;23971;23967:5;23963:9;;23599:389;-1:-1:-1;;22736:3:2;;;;;-1:-1:-1;22691:1308:2;;-1:-1:-1;22691:1308:2;;-1:-1:-1;24016:21:2;;24039:10;;-1:-1:-1;24051:10:2;;-1:-1:-1;24051:10:2;-1:-1:-1;24039:10:2;-1:-1:-1;24016:21:2;;-1:-1:-1;22006:2106:2;-1:-1:-1;;22006:2106:2:o;5109:178::-;5198:5;;-1:-1:-1;;;;;5198:5:2;5184:10;:19;5176:66;;;;-1:-1:-1;;;5176:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5253:11;:26;5109:178::o;1997:53::-;;;;:::o;3660:28::-;;;;:::o;1050:41::-;;;;:::o;1845:53::-;;;;:::o;1587:40::-;;;;;;;;;;;;;:::o;9023:1068::-;-1:-1:-1;;;9145:12:2;:23;9137:74;;;;-1:-1:-1;;;9137:74:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9272:10;;9230:18;;:38;;9254:12;9230:22;:38::i;:::-;:52;;9222:115;;;;-1:-1:-1;;;9222:115:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9623:10;;9586;9563:8;9574:23;;;:11;:23;;;;;;9563:8;;9574:77;;9641:8;;9574:61;;;;9603:12;9574:27;:43::i;:77::-;9699:13;;9682:10;9662:8;9673:20;;;:8;:20;;;;;;9563:88;;-1:-1:-1;9662:8:2;9673:57;;9720:8;;9673:41;;:24;:41::i;:57::-;9662:68;;9755:3;9749;:9;9741:69;;;;-1:-1:-1;;;9741:69:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9905:10;9893:23;;;;:11;:23;;;;;;:43;;9922:12;9893:27;:43::i;:::-;9879:10;9867:23;;;;:11;:23;;;;;:69;9992:18;;:36;;10015:12;9992:22;:36::i;:::-;9971:18;:57;;;10039:9;;;:44;;;-1:-1:-1;;;10039:44:2;;10058:10;10039:44;;;;;;;;;;;;;;-1:-1:-1;;;;;10039:9:2;;;;:18;;:44;;;;;;;;;;;;;;;;;;;:9;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9023:1068:2:o;3299:37::-;;;;;;:::o;2763:51::-;;;;;;;;;;;;;;;:::o;30673:434::-;30851:5;;-1:-1:-1;;;;;30851:5:2;30837:10;:19;30829:28;;;;;;30884:11;30868:13;:27;30940:11;30926;:25;31001:12;30985:13;:28;31051:6;:19;;-1:-1:-1;;;;;;31051:19:2;;;;;;31081:5;:18;;;;;;;30673:434::o;1180:41::-;;;;:::o;5743:226::-;5856:5;;-1:-1:-1;;;;;5856:5:2;5842:10;:19;5834:66;;;;-1:-1:-1;;;5834:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5911:23;:50;5743:226::o;8059:946::-;-1:-1:-1;;;8231:12:2;:23;8222:75;;;;-1:-1:-1;;;8222:75:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8565:10;;8548;8525:8;8536:23;;;:11;:23;;;;;;8525:8;;8536:57;;8583:8;;8536:41;;:23;:27;:41::i;:57::-;8663:13;;8625:10;8604:8;8616:20;;;:8;:20;;;;;;8525:68;;-1:-1:-1;8604:8:2;8615:79;;8684:8;;8615:63;;8663:13;8615:63;;8642:12;8616:24;:40::i;8615:79::-;8604:90;;8722:3;8715;:10;;8705:77;;;;-1:-1:-1;;;8705:77:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8871:10;8862:20;;;;:8;:20;;;;;;:40;;8888:12;8862:24;:40::i;:::-;8848:10;8839:20;;;;:8;:20;;;;;;:63;;;;8964:33;;8848:10;;8964:33;;;;;8984:12;;8964:33;8839:20;8964:33;8984:12;8848:10;8964:33;;;;;;;;;;;;;;;;;;;19725:1002;19836:4;19842;-1:-1:-1;;;20028:9:2;:20;20019:67;;;;;-1:-1:-1;;;20019:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20119:40:2;;;;;;:19;:40;;;;;;20106:9;:53;;20097:120;;;;-1:-1:-1;;;20097:120:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20396:40:2;;20385:8;20396:40;;;:19;:40;;;;;;:72;;20458:8;;20396:56;;20442:8;20396:44;:56::i;:72::-;20559:23;;20541:10;;-1:-1:-1;;;;;20490:45:2;;20479:8;20490:45;;;:24;:45;;;;;;20385:83;;-1:-1:-1;20479:8:2;20490:94;;20559:23;20490:63;;:45;:49;:63::i;:94::-;20479:105;;20619:3;20613;:9;20605:67;;;;-1:-1:-1;;;20605:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20700:3;;-1:-1:-1;20705:3:2;-1:-1:-1;19725:1002:2;;;:::o;25606:597::-;25668:17;;;;25660:26;;;;;;25751:17;;25734:10;25707:12;25722:23;;;:11;:23;;;;;;25707:12;;25722:72;;25791:1;;25722:63;;25776:8;;25722:48;;:23;:27;:48::i;:::-;:52;;:63::i;:::-;:67;;:72::i;:::-;25862:10;25853:20;;;;:8;:20;;;;;;25707:87;;-1:-1:-1;25853:30:2;-1:-1:-1;25845:86:2;;;;-1:-1:-1;;;25845:86:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25983:10;25957:14;25974:20;;;:8;:20;;;;;;;;;;26090:11;:23;;;;;:27;;;26128:20;;;;:24;;;;26163:30;25974;;;;;25983:10;26163:30;;;;;25974;;26163;25957:14;26163:30;25974;25983:10;26163:30;;;;;;;;;;;;;;;;;;;;;25606:597;;:::o;4169:28::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4169:28:2;;-1:-1:-1;4169:28:2;:::o;2149:53::-;;;;:::o;20745:1237::-;20856:4;20862;-1:-1:-1;;;21048:9:2;:20;21039:67;;;;;-1:-1:-1;;;21039:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21139:40:2;;;;;;:19;:40;;;;;;21126:9;:53;;21117:120;;;;-1:-1:-1;;;21117:120:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21746:45:2;;21734:9;21746:45;;;:24;:45;;;;;;21923:10;;21860:25;;21746:45;;21734:9;21814:121;;21923:10;21814:103;;21908:7;;21814:88;;21860:41;;21891:8;21860:29;:41::i;:::-;-1:-1:-1;;;;;21814:40:2;;;;;;:19;:40;;;;;;;:44;:88::i;:121::-;21953:4;;-1:-1:-1;21802:133:2;;-1:-1:-1;;20745:1237:2;;;:::o;2865:36::-;;;;;;;;;;16202:406;-1:-1:-1;;;16268:9:2;:20;16260:67;;;;-1:-1:-1;;;16260:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16379:10;16359:31;;;;:19;:31;;;;;;16346:9;:44;;16338:123;;;;-1:-1:-1;;;16338:123:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16572:10;16552:31;;;;:19;:31;;;;;;:48;;16589:9;16552:35;:48::i;:::-;16538:10;16518:31;;;;:19;:31;;;;;:82;16202:406::o;24820:768::-;24908:17;;;;24900:26;;;;;;-1:-1:-1;;;24945:22:2;:33;24937:80;;;;-1:-1:-1;;;24937:80:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25038:16;25057:62;25110:8;25057:47;25085:17;;25057:22;:26;;:47;;;;:::i;:62::-;25235:9;;;:58;;;-1:-1:-1;;;25235:58:2;;25258:10;25235:58;;;;;;;;;;;;25038:81;;-1:-1:-1;;;;;;25235:9:2;;;;:22;;:58;;;;;;;;;;;;;;;;;;:9;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25357:9:2;;;:73;;;-1:-1:-1;;;25357:73:2;;25380:10;25357:73;;;;25400:4;25357:73;;;;;;;;;;;;-1:-1:-1;;;;;25357:9:2;;;;:22;;:73;;;;;25235:58;;25357:73;;;;;;;;;;:9;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25492:32:2;;:10;;:32;;;;;25512:11;;25492:32;;;;25512:11;25492:10;:32;;;;;;;;;;;;;;;;;;;3494:30;;;;:::o;26264:1341::-;26430:1;26413:14;;:18;26405:78;;;;-1:-1:-1;;;26405:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26542:7;26502:37;26523:14;;26502:15;:19;;:37;;;;:::i;:::-;:47;26494:126;;;;-1:-1:-1;;;26494:126:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26653:13;26639:10;:27;;26631:80;;;;-1:-1:-1;;;26631:80:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26753:10;;26730:19;:33;;26722:98;;;;-1:-1:-1;;;26722:98:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26839:16;;;;:25;26831:34;;;;;;26959:8;;:45;;;-1:-1:-1;;;26959:45:2;;26978:10;26959:45;;;;26998:4;26959:45;;;;;;26939:17;;-1:-1:-1;;;;;26959:8:2;;:18;;:45;;;;;;;;;;;;;;:8;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26959:45:2;;-1:-1:-1;27023:23:2;;;;27015:109;;;;-1:-1:-1;;;27015:109:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27135:8;;:60;;;-1:-1:-1;;;27135:60:2;;27157:10;27135:60;;;;27177:4;27135:60;;;;;;;;;;;;-1:-1:-1;;;;;27135:8:2;;;;:21;;:60;;;;;;;;;;;;;;;:8;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27299:11:2;:28;;;;;;;;;;;;;-1:-1:-1;;;;;;27299:28:2;27316:10;27299:28;;;27380:16;:23;;-1:-1:-1;;27380:23:2;;;;;27414:15;:41;;;;;;;;;;;;;27466:17;:34;;;;;;;-1:-1:-1;27466:34:2;;;;;;;-1:-1:-1;27511:18:2;:40;27582:15;27562:17;:35;26264:1341::o;3096:29::-;;;-1:-1:-1;;;;;3096:29:2;;:::o;24296:512::-;24397:18;;-1:-1:-1;;;24397:18:2;;;;24389:109;;;;-1:-1:-1;;;24389:109:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24536:25;;24564:7;24536:35;24517:15;:55;24509:118;;;;-1:-1:-1;;;24509:118:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24647:17;;;;24646:18;24638:86;;;;-1:-1:-1;;;24638:86:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24755:10;;24735:17;:30;24776:17;:24;;-1:-1:-1;;24776:24:2;24796:4;24776:24;;;24296:512::o;28825:1838::-;28883:16;;;;:24;;:16;:24;28875:72;;;;-1:-1:-1;;;28875:72:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29009:6;28966:40;28987:17;;28966:15;:19;;:40;;;;:::i;:::-;:49;28958:128;;;;-1:-1:-1;;;28958:128:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29178:18;;29165:10;:31;-1:-1:-1;;;29403:262:2;29423:17;:24;29419:28;;29403:262;;;29494:10;;29472:15;29488:1;29472:18;;;;;;;;;;;;;;;;:32;29469:185;;;29540:17;29558:1;29540:20;;;;;;;;;;;;;;;;29525:35;;;;29469:185;;;29618:17;29636:1;29618:20;;;;;;;;;;;;;;;;29601:37;;;;29469:185;29449:3;;29403:262;;;;29723:6;29719:615;29739:17;:24;29735:28;;29719:615;;;29872:10;;29850:15;29866:1;29850:18;;;;;;;;;;;;;;;;:32;29847:476;;;29903:15;29922:77;29986:11;29922:58;29958:17;29976:1;29958:20;;;;;;;;;;;;;;;;;;29922:30;:13;29940:11;29922:17;:30::i;:77::-;29903:96;;30128:1;30105:17;30123:1;30105:20;;;;;;;;;;;;;;;;:24;;;;30148:9;30167:11;:14;;-1:-1:-1;;;;;30148:9:2;;;;:18;;30167:11;30179:1;;30167:14;;;;;;;;;;;;;;;;;;30148:46;;;-1:-1:-1;;;;;;30148:46:2;;;;;;;-1:-1:-1;;;;;30167:14:2;;;30148:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29847:476:2;;-1:-1:-1;;29847:476:2;;30306:1;30283:17;30301:1;30283:20;;;;;;;;;;;;;;;;;:24;29847:476;29765:3;;29719:615;;;-1:-1:-1;30392:24:2;30399:17;;30392:24;:::i;:::-;30427:22;30434:15;;30427:22;:::i;:::-;30460:18;30467:11;;30460:18;:::i;:::-;-1:-1:-1;;30520:1:2;30499:18;:22;;;30532:16;:20;;;30563:17;:21;30631:16;:24;;-1:-1:-1;;30631:24:2;;;28825:1838::o;3173:38::-;;;-1:-1:-1;;;3173:38:2;;;;;:::o;6404:169::-;6494:5;;-1:-1:-1;;;;;6494:5:2;6480:10;:19;6472:66;;;;-1:-1:-1;;;6472:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6549:6;:16;;-1:-1:-1;;;;;;6549:16:2;-1:-1:-1;;;;;6549:16:2;;;;;;;;;;6404:169::o;2965:28::-;;;-1:-1:-1;;;;;2965:28:2;;:::o;678:40::-;;;;:::o;10103:530::-;-1:-1:-1;;;10168:13:2;:24;10160:75;;;;-1:-1:-1;;;10160:75:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10256:9;;;:49;;;-1:-1:-1;;;10256:49:2;;10279:10;10256:49;;;;;;;;;;;;-1:-1:-1;;;;;10256:9:2;;;;:22;;:49;;;;;;;;;;;;;;;;;:9;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10363:9:2;;;:64;;;-1:-1:-1;;;10363:64:2;;10386:10;10363:64;;;;10406:4;10363:64;;;;;;;;;;;;-1:-1:-1;;;;;10363:9:2;;;;:22;;:64;;;;;10256:49;;10363:64;;;;;;;;;;:9;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10524:10:2;10512:23;;;;:11;10363:64;10512:23;;;;;:44;;10541:13;10512:27;:44::i;:::-;10498:10;10486:23;;;;:11;:23;;;;;:70;10588:18;;:37;;10611:13;10588:22;:37::i;:::-;10567:18;:58;-1:-1:-1;10103:530:2:o;3776:29::-;;;;:::o;3907:31::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3907:31:2;:::o;3262:29::-;;;;:::o;4651:217::-;4741:6;;-1:-1:-1;;;;;4741:6:2;4727:10;:20;4719:63;;;;;-1:-1:-1;;;4719:63:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;4793:10;:24;4845:15;4828:14;:32;4651:217::o;1685:43::-;;;;;;;;;;;;;:::o;4053:29::-;;;;;;;;;;10651:2759;-1:-1:-1;;;;;11281:27:2;;;;;;:11;:27;;;;;;11261:47;;;11252:115;;;;-1:-1:-1;;;11252:115:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11432:10;;-1:-1:-1;;;;;11399:27:2;;11388:8;11399:27;;;:11;:27;;;;;;11388:8;;11399:60;;11450:8;;11399:45;;:27;:31;:45::i;:60::-;11511:11;;-1:-1:-1;;;;;11481:24:2;;11470:8;11481:24;;;:8;:24;;;;;;11388:71;;-1:-1:-1;11470:8:2;11481:58;;11530:8;;11481:43;;:28;:43::i;:58::-;11470:69;;11564:3;11558;:9;11550:92;;;;-1:-1:-1;;;11550:92:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11954:24:2;;11942:9;11954:24;;;:8;:24;;;;;;:55;;12000:8;;11954:40;;11984:8;11954:28;:40::i;:55::-;11942:67;;12020:9;12032:81;12083:29;12102:8;12083:13;;:17;;:29;;;;:::i;:::-;12065:10;;-1:-1:-1;;;;;12032:27:2;;;;;;:11;:27;;;;;;:45;;:31;:45::i;:81::-;12020:93;;12134:13;12169:4;12162;:11;12158:499;;;-1:-1:-1;;;;;12380:27:2;;;;;;:11;:27;;;;;;;;;12348:8;:24;;;;;;;12326:83;;12380:27;12326:48;;:16;;:20;:48::i;:83::-;12315:94;;12158:499;;;12543:102;12635:8;12543:86;12619:8;12543:70;12583:29;12602:8;12583:13;;:17;;:29;;;;:::i;:::-;12565:10;;12543:34;;:16;;:20;:34::i;:102::-;12532:113;;12158:499;-1:-1:-1;;;;;12687:24:2;;;;;;:8;:24;;;;;;12675:36;;;12667:85;;;;-1:-1:-1;;;12667:85:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12848:9;;;:52;;;-1:-1:-1;;;12848:52:2;;12871:10;12848:52;;;;;;;;;;;;-1:-1:-1;;;;;12848:9:2;;;;:22;;:52;;;;;;;;;;;;;;;;;:9;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12912:9:2;;;:67;;;-1:-1:-1;;;12912:67:2;;12935:10;12912:67;;;;12955:4;12912:67;;;;;;;;;;;;-1:-1:-1;;;;;12912:9:2;;;;:22;;:67;;;;;12848:52;;12912:67;;;;;;;;;;:9;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;13068:27:2;;;;;;:11;12912:67;13068:27;;;;;:51;;13101:16;13068:31;:51::i;:::-;-1:-1:-1;;;;;13038:27:2;;;;;;:11;:27;;;;;:81;13151:18;;:42;;13175:16;13151:22;:42::i;:::-;13130:18;:63;-1:-1:-1;;;;;13320:24:2;;;;;;:8;:24;;;;;;:40;;13350:8;13320:28;:40::i;:::-;-1:-1:-1;;;;;13293:24:2;;;;;;:8;:24;;;;;;:67;;;;13371:31;;:10;;:31;;;;;13392:8;;13371:31;13293:24;13371:31;13392:8;13371:10;:31;;;;;;;;;;;;;;;;;;;;;10651:2759;;;;;;;:::o;14188:978::-;-1:-1:-1;;;14272:16:2;:27;14263:79;;;;-1:-1:-1;;;14263:79:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14687:10;14656:8;14667:31;;;:19;:31;;;;;;:63;;14720:8;;14667:47;;14704:8;14667:35;:47::i;:63::-;14836:25;;14818:10;;14777;14741:8;14752:36;;;:24;:36;;;;;;14656:74;;-1:-1:-1;14741:8:2;14752:111;;14836:25;14752:78;;;;14794:16;14752:40;:60::i;:111::-;14741:122;;14891:3;14884;:10;;14874:78;;;;-1:-1:-1;;;14874:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15038:10;15013:36;;;;:24;:36;;;;;;:60;;15055:16;15013:40;:60::i;:::-;14998:10;14973:36;;;;:24;:36;;;;;;;;:100;;;;15110:9;;:48;;-1:-1:-1;;;15110:48:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15110:9:2;;;;:18;;:48;;;;;;;;;;;;;:9;:48;;;;;;;;;;2431:56;;;;;;;;;;;;;:::o;922:41::-;;;;:::o;6585:174::-;6672:5;;-1:-1:-1;;;;;6672:5:2;6658:10;:19;6650:66;;;;-1:-1:-1;;;6650:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6727:10;:24;6585:174::o;7037:461::-;7171:1;7159:9;:13;7151:50;;;;;-1:-1:-1;;;7151:50:2;;;;;;;;;;;;-1:-1:-1;;;7151:50:2;;;;;;;;;;;;;;;7245:10;7236:20;;;;:8;:20;;;;;;:37;;7262:9;7236:24;:37::i;:::-;7222:10;7213:20;;;;:8;:20;;;;;;;;:60;;;;7297:19;:31;;;;;;:39;;:31;:39;7294:197;;7410:10;7390:31;;;;:19;:31;;;;;:38;;-1:-1:-1;;7390:38:2;7424:4;7390:38;;;;;;7443:19;:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;7443:36:2;;;;;;7294:197;7037:461::o;372:28::-;;;-1:-1:-1;;;;;372:28:2;;:::o;6771:218::-;6847:5;;-1:-1:-1;;;;;6847:5:2;6833:10;:19;6825:66;;;;-1:-1:-1;;;6825:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6902:18;:25;;-1:-1:-1;;;;6902:25:2;-1:-1:-1;;;6902:25:2;;;6966:15;6938:25;:43;6771:218::o;4911:186::-;5004:5;;-1:-1:-1;;;;;5004:5:2;4990:10;:19;4982:66;;;;-1:-1:-1;;;4982:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5059:13;:30;4911:186::o;3388:36::-;;;;;;:::o;16638:3063::-;-1:-1:-1;;;16912:9:2;:20;16903:67;;;;;-1:-1:-1;;;16903:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17003:40:2;;;;;;:19;:40;;;;;;16990:9;:53;;16981:120;;;;-1:-1:-1;;;16981:120:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17280:40:2;;17269:8;17280:40;;;:19;:40;;;;;;:72;;17342:8;;17280:56;;17326:8;17280:44;:56::i;:72::-;17443:23;;17425:10;;-1:-1:-1;;;;;17374:45:2;;17363:8;17374:45;;;:24;:45;;;;;;17269:83;;-1:-1:-1;17363:8:2;17374:94;;17443:23;17374:63;;:45;:49;:63::i;:94::-;17484:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;17484:19:2;;;;;;17363:105;;-1:-1:-1;;;;;;;;;;;;17484:19:2;;;;;;;;;17519;;;;;;;;;;;;;;;;;-1:-1:-1;;;17519:19:2;;;;;;-1:-1:-1;;;;;;;;;;;17519:19:2;;;;;;;;17573:3;17567;:9;17559:67;;;;-1:-1:-1;;;17559:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17976:45:2;;17964:9;17976:45;;;:24;:45;;;;;;18153:10;;18090:25;;17976:45;;17964:9;18044:121;;18153:10;18044:103;;18138:7;;18044:88;;18090:41;;18121:8;18090:29;:41::i;18044:121::-;18191:21;;;;;;;;;;;;;;;;;-1:-1:-1;;;18191:21:2;;;;;;18032:133;;-1:-1:-1;;;;;;;;;;;;18191:21:2;;;;;;;;;18228;;;;;;;;;;;;;;;;;-1:-1:-1;;;18228:21:2;;;;;;-1:-1:-1;;;;;;;;;;;18228:21:2;;;;;;;;18270:17;18309:4;18302;:11;18298:921;;;-1:-1:-1;;;;;18595:40:2;;;;;;:19;:40;;;;;;;;;18542:24;:45;;;;;;;18527:110;;18595:40;18527:62;;:9;;:13;:62::i;:110::-;-1:-1:-1;;;;;18676:45:2;;;;;;:24;:45;;;;;;18512:125;;-1:-1:-1;18660:61:2;;;18652:119;;;;-1:-1:-1;;;18652:119:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18298:921;;;18970:88;19047:10;;18970:72;19033:7;18970:57;18985:41;19016:8;18985:25;;:29;;:41;;;;:::i;:::-;18970:9;;:13;:57::i;:88::-;-1:-1:-1;;;;;19098:45:2;;;;;;:24;:45;;;;;;18955:103;;-1:-1:-1;19082:61:2;;;19074:119;;;;-1:-1:-1;;;19074:119:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19355:40:2;;;;;;:19;:40;;;;;;:57;;19401:9;19355:44;:57::i;:::-;-1:-1:-1;;;;;19312:40:2;;;;;;:19;:40;;;;;;;;:100;;;;19519:24;:45;;;;:65;;19570:12;19519:49;:65::i;:::-;-1:-1:-1;;;;;19471:45:2;;;;;;;:24;:45;;;;;;;;:113;;;;19636:9;;:47;;-1:-1:-1;;;19636:47:2;;19656:10;19636:47;;;;;;;;;;;;:9;;;:18;;:47;;;;;;;;;;;;;;:9;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3218:37;;;;:::o;1678:471:1:-;1736:7;1981:6;1977:47;;-1:-1:-1;2011:1:1;2004:8;;1977:47;2048:5;;;2052:1;2048;:5;:1;2072:5;;;;;:10;2064:56;;;;-1:-1:-1;;;2064:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;788:136;846:7;873:43;877:1;880;873:43;;;;;;;;;;;;;;;;;:3;:43::i;2625:132::-;2683:7;2710:39;2714:1;2717;2710:39;;;;;;;;;;;;;;;;;:3;:39::i;1227:192::-;1313:7;1349:12;1341:6;;;;1333:29;;;;-1:-1:-1;;;1333:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1385:5:1;;;1227:192::o;3253:278::-;3339:7;3374:12;3367:5;3359:28;;;;-1:-1:-1;;;3359:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3398:9;3414:1;3410;:5;;;;;;;3253:278;-1:-1:-1;;;;;3253:278:1:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://82a7b3fffed66de333732de5476306f7383f3360cf83e39c4d8c8520d071ab12
Loading...
Loading
Loading...
Loading
OVERVIEW
Deployer address for ItoVault.Loading...
Loading
[ 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.