ETH Price: $2,457.29 (+2.59%)
Gas: 2.29 Gwei

Contract

0xe300Dc2859b1436Daa125B3aDFcd5e5EEe92c3A6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Make Loan Paymen...168438452023-03-17 0:03:11538 days ago1679011391IN
0xe300Dc28...EEe92c3A6
0 ETH0.0063733744.50027685
Resolve Breach167999582023-03-10 20:00:23544 days ago1678478423IN
0xe300Dc28...EEe92c3A6
0 ETH0.0016069940.31095936
Make Loan Paymen...167999402023-03-10 19:56:47544 days ago1678478207IN
0xe300Dc28...EEe92c3A6
0.9140825 ETH0.0067426333.10779791
Request Draw165010012023-01-27 22:02:11586 days ago1674856931IN
0xe300Dc28...EEe92c3A6
0 ETH0.0016373719.8903581
Fund Loan165009972023-01-27 22:01:23586 days ago1674856883IN
0xe300Dc28...EEe92c3A6
25.213 ETH0.0033365220.17354665
Accept Terms165009892023-01-27 21:59:47586 days ago1674856787IN
0xe300Dc28...EEe92c3A6
0.1664058 ETH0.0067602317.34268672
Propose Terms165009562023-01-27 21:53:11586 days ago1674856391IN
0xe300Dc28...EEe92c3A6
0 ETH0.0012858419.53612497
Request Loan165009442023-01-27 21:50:47586 days ago1674856247IN
0xe300Dc28...EEe92c3A6
0 ETH0.0030925717.33291083
0x60806040164924742023-01-26 17:26:23587 days ago1674753983IN
 Create: loan20230123
0 ETH0.072899823.06388818

Latest 8 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
168438452023-03-17 0:03:11538 days ago1679011391
0xe300Dc28...EEe92c3A6
0.008838 ETH
168438452023-03-17 0:03:11538 days ago1679011391
0xe300Dc28...EEe92c3A6
0.4419 ETH
168438452023-03-17 0:03:11538 days ago1679011391
0xe300Dc28...EEe92c3A6
0.00630325 ETH
167999402023-03-10 19:56:47544 days ago1678478207
0xe300Dc28...EEe92c3A6
0.008838 ETH
167999402023-03-10 19:56:47544 days ago1678478207
0xe300Dc28...EEe92c3A6
0.4419 ETH
167999402023-03-10 19:56:47544 days ago1678478207
0xe300Dc28...EEe92c3A6
0.00630325 ETH
165010012023-01-27 22:02:11586 days ago1674856931
0xe300Dc28...EEe92c3A6
25.213 ETH
165009972023-01-27 22:01:23586 days ago1674856883
0xe300Dc28...EEe92c3A6
0.1664058 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
loan20230123

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *Submitted for verification at Etherscan.io on 2023-01-27
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.1;

//deployed on mainet at xxx

//import "@openzeppelin/contracts/access/Ownable.sol";


interface InftContract {
    function ownerOf(uint256 tokenId) external view returns (address owner);    
}

//interface to insurance contracty
interface Iinsurance {
    function proposeIns(
        uint256 _terms, address _beni, address _fundMngr, address _insured, 
        address _primOracle, uint256 _baseFunding, uint256 _insEnds, uint256 _maxBeniPaym
    ) external returns (uint256 propPayment);
    //function payBeni() external;
    function requestClaim() external;
    function payPremium() external payable returns (bool);
    function claimsPayed() external returns (uint256);
    function repayAccum() external returns (uint256);
    function maxBeniPaym() external returns (uint256);//maxBeniPaym()
    function claimPaymentRepay() external payable returns (bool);
    function getMinPayment(uint256 _fundsPromised, uint256 _terms) external returns (uint256);
}

contract loan20230123 {

    uint256 public terms; //enumerated terms of contract: 
    /*
    0 = none,
    1= 10% apr, 1'month' paymentInterval, $50 processing fee(one time-set in principal), 
        originLoanAmount/1200 Tot Min (Monthly) Payment, overpayment goes to pricipal, 
        $5 officer fees, $5 developer fee, contract breach at 1'month', 1% insurance premium,
         2'week' drawInterval, %25 (of origninal loan amount) drawMax, %50 funding for initilizaiton
    */
    uint256 public apr; //Anual Percent Rate. as a divisor of balance. ie: balance/apr
    uint256 public loanBalance; //remaing balnace of loan. in Wei
    uint256 public amountFunded; //SUM of amount given to the contract to fund "originLoanAmount". in Wei
    uint256 public originLoanAmount; //orginating loan amount. in Wei
    uint256 public paymentDue; //unix time of when the next loan payment is due
    uint256 public paymentMin; //amount value of the minimum next payment. in Wei.
    uint256 public paymentInterval; //seconds between payments
    uint256 public currPaymentAccum; //CURRent PAYMENT intervals ACCUMulator of payments made (if borrower pays partial payments)
    uint256 public breachStatus; //enumerated value of if loan is in default (breach of contract): 
    uint256 public insuranceFee; //'monthly' fee proposed by the insurance contract
    /*
    "breachStatus":
    000=0=no faults,
    001 to 009 = lender fault: ????
    010 to 090 = borrower fault: 010= min payment not made in time, 020=Forclosure
    100 to 900 = oracle fault: 100=unlisted oracle fault, 

    */

    uint256 public authDrawAmount; //the amount value that is authorized and available to be withdrawn. in Wei.
    uint256 public loanRequExpires; //unix time of when the current(if avail) loan Request Expires
    uint256 public loanRequInterval; //LOAN REQUEST INTERVAL in seconds
    uint256 public minFunding; //minimum amount of funding for loan to initialize per terms. SET HIGH (999999....) for default.
    uint256 public paymentsMade; //count of payments made
    uint256 public paymentsRequired; //count of payments due to date
    uint256 public drawDivisor; //divisor for loan amount to be "Portioned" into. MUST NOT = 0.
    uint256 public drawsMade; //count of draws made 
    uint256 public drawInterval; //seconds between draws. set high(999999999999......)  for safetey.
    uint256 public lastDraw; //time stamp of last draw
    uint256 public loanIniDateTime; //time stamp of loan initialization
    

    bool public borrowerAuthed; //true IF borrower has aggreed to the proposed terms of the lender.
    bool public lenderFunded; //true IF full amount of the originLoanAmount has been provided
    bool public loanInitialized; //true IF loan services have began and all parties agree
    bool public termsProposed; //true IF lender has proposed terms

    //address payable public lender; //address of lender= contract owner
    address public borrower; //address of borrower
    address public authAgent; //address of authorizing agent (for draws). officer
    address payable public underWriter; //address of insuring entity(=owner=lender if none)
    address payable public helixAddr; //address of helix main account
    uint256 public processFee;  //fee to be paid with each payment made to Helix

    ////define: nftContrAddress, tokenId in constructor
    address nftContrAddress;
    uint256 tokenId;


    //EVENT LIST HERE:
    event loanRequest(address _from);
    event loanProposal(uint256 terms, uint256 originLoanAmount);

    ////set: nftContrAddress, tokenId in constructor
    constructor(address _nftContrAddress, uint256 _tokenId){
        //set all public var's default settings
        
        terms=0; //enumerated terms of contract: 0 = none, 1= 10%apr, 1'month' paymentInterval, $50 processing  
        loanBalance=0; //remaing balnace of loan
        amountFunded=0;
        originLoanAmount=0; //orginating loan amount
        paymentDue=0; //unix time of when the next loan payment is due
        paymentInterval=0;
        currPaymentAccum=0;
        paymentMin=0; //amount value of the minimum next payment
        breachStatus=0; //enumerated value of if loan is in default (breach of contract): 0=no problem, 1=
        authDrawAmount=0; //the amount value that is authorized and available to be withdrawn
        loanRequExpires=0; //unix time of when the current(if avail) loan Request Expires
        minFunding=99999999999999999999999999999999999999999999999999999999999;
        paymentsMade=0;
        paymentsRequired=0;
        drawDivisor=1;
        drawsMade=0;
        drawInterval=9999999999999999999999999999999999999;
        lastDraw=0; //time stamp of last draw
        loanIniDateTime=0; 
        apr=1; //set for default. NOTE number is divisor. Must NOT = 0 !!!!!!!!!!!!!!!!!!

        borrowerAuthed=false; //true IF borrower has aggreed to the proposed terms of the lender.
        lenderFunded=false; //true IF full amount of the originLoanAmount has been provided. !!!!!!!!!!!!!! needs work
        loanInitialized=false;
        termsProposed=false;

        //lender=payable(msg.sender); //address of lender= contract owner
        //borrower=0; //address of borrower
        authAgent=msg.sender; //address of authorizing agent (for draws). officer
        underWriter=payable(msg.sender); //address of insuring entity=owner=lender if none
        helixAddr=payable(msg.sender); //!!!!!! change on MAINET DEPLOY !!!!!!!!!!!!!!!!
        //loanReqestInterval=60*10; //!!!!!!!!!!!! change on MAINNET DEPLOY !!!!!!!!!!!!!!!!!!!!!
        processFee=8000000000000000; //initialy set at .008=~$11(USD)

        //set: nftContrAddress, tokenId in constructor
        nftContrAddress=_nftContrAddress;
        tokenId=_tokenId;

    }

    //add "onlyNftOwner" modifier
    modifier onlyNftOwner(){
        //set: nftContrAddress, tokenId in constructor
        InftContract nftContr=InftContract(nftContrAddress);
        address nftOwner=nftContr.ownerOf(tokenId);
        require(msg.sender==nftOwner);
        _;
    }

    /*
    function getNftOwner() public view returns (address){
        InftContract nftContr=InftContract(nftContrAddress);
        return nftContr.ownerOf(tokenId);
    }
    */
    function getNftOwner() public view returns (address){
        InftContract nftContr=InftContract(nftContrAddress);
        address _nftOwner=nftContr.ownerOf(tokenId);
        return _nftOwner;
    }

    //resolve a breach
    function resolveBreach(uint256 _move) public onlyNftOwner {
        /*
        "_move" enumerations: acknowledge=1, forgive payment=2, forgive loan=3, 
        claim insurance=4, reset "breach status"=5, forclose=6, reset loan=7.....
        */

        /*
        "breachStatus":
        000=0=no faults,
        001 to 009 = lender fault: ????
        010 to 090 = borrower fault: 010= min payment not made in time, 020=Forclosure,
            030=ins' claims requested, 040=ins' claim paid,..
        100 to 900 = oracle fault: 100=unlisted oracle fault, 

        */
        //solve breach (if possible per aggrement terms)
        //determine breach type to solve
        if(borrowerAuthed==false){
            if(_move==7){ resetLoan();}
        }
        
        if (breachStatus==10 || breachStatus==30){
            //require lender/owner to resolve breach
            //require(this.owner==msg.sender);
            if(_move==2){ 
                paymentsMade++; 
                //reduce balance per interval. !!!!!!!!!!!!!!!!!!
                breachStatus=0;
            }
            if(_move==3){
                resetLoan();
            }
            if(_move==4){
                Iinsurance insContr=Iinsurance(underWriter);  //create interface ie:Iweth9 iWeth9=Iweth9(WETH);
                insContr.requestClaim();    //NOTE: "payBeni()" (on ins' contr) must be also called once claim is requested
                breachStatus=30; //!!!!!!!!!!!!!!!!! change to enumeration for "insurance" paid BUT "not is good standing"
            }
            if(_move==5){
                //reset breach status to 0. Assumes borrower is "caught up"
                breachStatus=0;
            }
            if(_move==6){
                //Forclose
                breachStatus=20;
                //emit notice to/for all parties
            }
        }
        if (breachStatus==20){
            if(_move==3){
                //recomend "requestCollection();" first
                distributeFinalPayments();
                resetLoan();
            }
        }
        if(breachStatus==40){
            //claim payments have been recieved and borower was/is is late w/payemnts
            if(_move==6){
                //Forclose
                breachStatus=20;
                //emit notice to/for all parties
            }
        }
    }

    //CALCUlate PAYments REQUIRED = number of payments required (so far) to date. 
    function calcPaymentsRequired() internal {
        //require(loanInitialized==true);
        if(loanInitialized){
            paymentsRequired=(block.timestamp-loanIniDateTime)/paymentInterval;
        }else{
            paymentsRequired=0;
        }
    }

    function distributeFinalPayments() internal {
        //pay insurance fee
        if(address(this).balance>insuranceFee){
                if(insuranceFee!=0){
                    Iinsurance insContr=Iinsurance(payable(underWriter));
                    bool premPaid=insContr.payPremium{value: insuranceFee}();
                    if(premPaid){ currPaymentAccum=currPaymentAccum-insuranceFee; }//adjust currPayAccum
                }
        }
        //pay insurance claim repay IF required
        if(breachStatus==40){
            //get claims payed from insurer
            Iinsurance insContr=Iinsurance(payable(underWriter));
            uint256 amountOwedToIns=insContr.maxBeniPaym()*insContr.claimsPayed();//!!!change!!
            uint256 rePayIns=address(this).balance;
            if(rePayIns>amountOwedToIns){rePayIns=amountOwedToIns;}
            bool claimRepaid=insContr.claimPaymentRepay{value: rePayIns}(); 
            if(claimRepaid){ 
                currPaymentAccum=currPaymentAccum-rePayIns;
                //breachStatus=0;
            }
        }
        //pay processor
        if(address(this).balance>=processFee){
            transfer(payable(helixAddr),processFee);
            currPaymentAccum=currPaymentAccum-processFee;
        }
        
        //calculate amount owed to owner(typicaly remaining balance)
        uint256 payNftOwner=paymentMin;  //!!!!!!!!!!!!!!!!!Needs calculation !!!!!!!!!!!!!!
        //pay Nft Owner
        address _owner=getNftOwner(); 
        if(address(this).balance>payNftOwner){
            transfer(payable(_owner),payNftOwner);
            currPaymentAccum=currPaymentAccum-payNftOwner;
            //?? Pay overpayment to Borower IF required
            if(paymentsRequired<=paymentsMade){
                if(breachStatus==0){ transfer(payable(borrower),address(this).balance);}
            }

        }else{
            //pay ALL remaining balance to NftOwner
            if(address(this).balance!=0){
                transfer(payable(_owner),address(this).balance);
            }
        }

        
        //reset breachStatus
        breachStatus=0;
    }
    
    function distributeFees(uint256 currentIntrest)  internal {
        // pay/distribute fees: intrest->owner, insurance->insurer, manageFee->manager FROM currPayemntAccum
        //transfer(payable(underWriter), insuranceFee); //call payPremium()
        //(bool success, ) = underWriter.call{value: insuranceFee}("");
        
        // !!!!!!!!!!!!! revise this with new terms format !!!!!!!!!!!!!!!
        if((terms!=0) && (currPaymentAccum>insuranceFee)){
            Iinsurance insContr=Iinsurance(payable(underWriter));  //create interface ie:Iweth9 iWeth9=Iweth9(WETH);
            //IF balance>insuranceFee
            if(address(this).balance>insuranceFee){
                if(insuranceFee!=0){
                    bool premPaid=insContr.payPremium{value: insuranceFee}();
                    if(premPaid){ currPaymentAccum=currPaymentAccum-insuranceFee; }//adjust currPayAccum
                }
            }
            
          
        
        address _owner=getNftOwner();   //owner();
        //IF balance>currentIntrest
        if(address(this).balance>currentIntrest){
            transfer(payable(_owner),currentIntrest);
            currPaymentAccum=currPaymentAccum-currentIntrest;
        }
        
        //IF balce>processfee
        if(address(this).balance>=processFee){
            transfer(payable(helixAddr),processFee);
            currPaymentAccum=currPaymentAccum-processFee;
        }
        }
    }

    //this function called WHEN "if(currPaymentAccum>=paymentMin)"
    function calcNewBalance() internal{
        require(loanInitialized==true);
        //require(currPaymentAccum>=paymentMin);
        //calculate new balance with currPaymenAccum. 
        //apply overpayment to Balance IF Terms approve
        uint256 applyToBalance = 0; 
        
        
        uint256 currentIntrest=calcCurrentIntrest();    //(loanBalance*apr)/100;   
        
        //NOTE: (currentIntrest + insuranceFee + processFee) MUST NOT BE > paymentMin
        applyToBalance=applyToBalance + (paymentMin-currentIntrest-insuranceFee-processFee); //!!!!!!!!! fees need defined !!!!!!!!!!!
        if(applyToBalance>loanBalance){ applyToBalance=loanBalance;}
        loanBalance=loanBalance-applyToBalance;
        
        //distribute fees: intrest->owner, insurance->insurer, manageFee->manager
        distributeFees(currentIntrest+applyToBalance);
        paymentDue=paymentDue + paymentInterval;
        paymentsMade=paymentsMade + 1;
        

        
        
    }
    function calcCurrentIntrest() internal returns(uint256){
        uint256 aprDivisor=12;  //divisor of apr pay intevals. default set to "12" for monthly
        //adjust divisor per paymentInterval:
        if(paymentInterval==60*5){aprDivisor=6;} //speed test every 5 min.(with assumes of 2 months
        if(paymentInterval==60*60*24){aprDivisor=365;} //daily
        if(paymentInterval==60*60*24*7){aprDivisor=52;} //weekly
        if(paymentInterval==60*60*24*7*2){aprDivisor=26;} //every 2 weeks
        if(paymentInterval==2628000){aprDivisor=12;} //monthly
        if(paymentInterval==7889238){aprDivisor=4;} //quarterly
        if(paymentInterval==31556952){aprDivisor=1;} //annually
        uint256 currentIntrest=(loanBalance*apr)/100;   
        //!!!!!!!!!!!!!!! needs revision for dynamic test payment intervals.pays per annum
        currentIntrest=currentIntrest/aprDivisor; //"12" for monthly payment terms only !!!!!!!!!!!
        return currentIntrest;
    }

    function calcBreachStatus() public {
        require(loanInitialized==true);
        //check current interval time status
        calcPaymentsRequired(); //CALCUlate PAYments REQUIRED
        
        //breachStatus "40"= claim(s) have been paid.
        if(breachStatus==40){
            //claim(s) has been paid
            //check if borrower is caught up
            if(paymentsMade>paymentsRequired){
                //refund underwriter/insurer. call"function claimPaymentRepay() external payable;"
                Iinsurance insContr=Iinsurance(payable(underWriter));  //create interface ie:Iweth9 iWeth9=Iweth9(WETH);
                //!!!!!!!!!!!!!!!!!!!
                //add "repay amount"=maxBeniPaym (of Ins' contract)
                //maxBeniPay
                //NOTE: !!!!!!! maxBeniPaym(of Ins' contract) MUST equal "original" paymentMin(of Loan contract)
                uint256 rePayIns=currPaymentAccum;
                
                
                uint256 amountOwedToIns=insContr.maxBeniPaym()-insContr.repayAccum();//!!!change!!
                if(rePayIns>amountOwedToIns){rePayIns=amountOwedToIns;}
                bool claimRepaid=insContr.claimPaymentRepay{value: rePayIns}(); 
                
                //IF 'claim repay' returns TRUE THEN decrement paymentsMade
                if(claimRepaid){ 
                    paymentsMade=paymentsMade+1; 
                    currPaymentAccum=currPaymentAccum-rePayIns;
                    breachStatus=0;
                }
                
                
            }
        }
        

        if(currPaymentAccum>=paymentMin){ 
            calcNewBalance(); //calculate new balance
            //IF loan is over THEN "terms=0" IGNORE Following lines
            
            uint256 makeUpPaymentsNeeded=0; //!!!!!!!!!!!!!change to be set 
            if(paymentsRequired>paymentsMade){ makeUpPaymentsNeeded=paymentsRequired-paymentsMade;}
            uint256 makeUpPaymentsAvailable=currPaymentAccum/paymentMin;
            if(makeUpPaymentsAvailable>makeUpPaymentsNeeded){ makeUpPaymentsAvailable=makeUpPaymentsNeeded;}           
            if(makeUpPaymentsAvailable>0){
                for(uint i=0; i>makeUpPaymentsAvailable; i++){
                    if(currPaymentAccum>=paymentMin){calcNewBalance(); }//calculate new balance
                    //IF loan is over THEN "terms=0" IGNORE Following lines
                    if(terms==0){ i=makeUpPaymentsAvailable+1;}
                }
            }
        }

        //IF "Loan Balance" is less than payment min...."Final Payment" set.
        if(loanBalance<paymentMin){
            uint256 aprDivisor=12;  //divisor of apr pay intevals. default set to "12" for monthly
            //adjust divisor per paymentInterval:
            if(paymentInterval==60*5){aprDivisor=6;} //speed test every 5 min.(with assumes of 2 months
            if(paymentInterval==60*60*24){aprDivisor=365;} //daily
            if(paymentInterval==60*60*24*7){aprDivisor=52;} //weekly
            if(paymentInterval==60*60*24*7*2){aprDivisor=26;} //every 2 weeks
            if(paymentInterval==2628000){aprDivisor=12;} //monthly
            if(paymentInterval==7889238){aprDivisor=4;} //quarterly
            if(paymentInterval==31556952){aprDivisor=1;} //annually
            uint256 currentIntrest=(loanBalance*apr)/100;   
            //!!!!!!!!!!!!!!! needs revision for dynamic test payment intervals.pays per annum
            currentIntrest=currentIntrest/aprDivisor; //"12" for monthly payment terms only !!!!!!!!!!!

            paymentMin=loanBalance + currentIntrest + insuranceFee + processFee;
        }

        if(breachStatus!=20){
            if(breachStatus!=40){
                if(paymentsRequired>paymentsMade){ breachStatus=10; } //breachStaqtus "010" = NON MISSED PAYMENT(s)
            }
        }
        
    }

    

    function resetLoan() internal {
        //reset all var's back to constructor. NOT A PUBLIC VAR.
        //set/reset defaultStatus var per terms of agreement
        terms=0; //enumerated terms of contract: 0 = none, 1= 10%apr, 1'month' paymentInterval, $50 processing  
        loanBalance=0; //remaing balnace of loan
        amountFunded=0;
        originLoanAmount=0; //orginating loan amount
        paymentDue=0; //unix time of when the next loan payment is due
        paymentInterval=0;
        currPaymentAccum=0;
        paymentMin=0; //amount value of the minimum next payment
        breachStatus=0; //enumerated value of if loan is in default (breach of contract): 0=no problem, 1=
        authDrawAmount=0; //the amount value that is authorized and available to be withdrawn
        loanRequExpires=0; //unix time of when the current(if avail) loan Request Expires
        minFunding=99999999999999999999999999999999999999999999999999999999999;
        paymentsMade=0;
        paymentsRequired=0;
        drawDivisor=1;
        drawsMade=0;
        drawInterval=9999999999999999999999999999999999999;
        lastDraw=0;
        apr=1;

        borrowerAuthed=false; //true IF borrower has aggreed to the proposed terms of the lender.
        lenderFunded=false; //true IF full amount of the originLoanAmount has been provided
        loanInitialized=false;
        termsProposed=false;

        //lender=0; //address of lender= contract owner
        //borrower=0; //address of borrower
        authAgent=getNftOwner();//lender; //"Officer"/"Oricale". address of authorizing agent (for draws). officer
        underWriter=payable(getNftOwner());//lender; //address of insuring entity=owner=lender if none
    }

    function requestLoan(uint256 _terms, uint256 _originLoanAmount) public {
        //check inputs to be in "bounds"
        require(loanInitialized==false);
        if (loanRequExpires==0 || loanRequExpires<block.timestamp){
            //!!!!check for currPaymentAcumm>0 (borrower may have began Auth' process)!!!!!
            require(currPaymentAccum>=address(this).balance);
            //refund borrower currPaymentAccum. !!!!!!!!!!!!!!!!!!!!!!!
            if(currPaymentAccum!=0){transfer(payable(borrower),currPaymentAccum);}
            currPaymentAccum=0;
            resetLoan();
            //set public var's: terms, loanBalance, borrower addr......
            terms=_terms; //enumerated terms of contract: 0 = none, 1= 10%apr, 1'month' paymentInterval, $50 processing  
            originLoanAmount=_originLoanAmount; //orginating loan amount
            loanRequExpires=block.timestamp + loanRequInterval; //unix time of when the current(if avail) loan Request Expires
            borrower=msg.sender; //address of borrower
            
            //call insurance contract for proposed insuranc request
            //emit "loan requ'" event
            emit loanRequest(borrower);
        }
        
    }

    //call this function to Propose Terms OR to reset to Default (if Loan Request has Expired)
    function proposeTerms(uint256 _terms, uint256 _amount, address _insurer) external onlyNftOwner {
        require(loanInitialized==false);
        if (loanRequExpires!=0 || loanRequExpires>block.timestamp){
            //set public var's: terms, loanBalance, borrower addr......
            terms=_terms; //enumerated terms of contract: 0 = none, 1= 10%apr, 1'month' paymentInterval, $50 processing  
            originLoanAmount=_amount; //orginating loan amount
            loanRequExpires=block.timestamp + loanRequInterval; //unix time of when the current(if avail) loan Request Expires
            termsProposed=true;  
            underWriter=payable(_insurer);
            emit loanProposal(terms, originLoanAmount);//emit "proposal event"
        }else{
            //!!!!check for currPaymentAcumm>0 (borrower may have began Auth' process)!!!!!
            require(currPaymentAccum>=address(this).balance);
            //refund borrower currPaymentAccum. !!!!!!!!!!!!!!!!!!!!!!!
            if(currPaymentAccum!=0){transfer(payable(borrower),currPaymentAccum);}
            currPaymentAccum=0;
            resetLoan();
        }
    }

    //borrower can accept terms IF termsProposed==true
    function acceptTerms() payable public {
        //get addr of caller
        //verify addr=borrower
        require (termsProposed==true);
        require(loanInitialized==false);
        require(borrower==msg.sender); 

        //bool accept=false;
        //uint256 amountPaid=msg.value;
        currPaymentAccum=currPaymentAccum + msg.value;
        uint256 iniFee=(66*originLoanAmount)/10000;
        if(currPaymentAccum>=iniFee){
            borrowerAuthed=true;
            bool setError=setTerms();
            if(setError==true){ loanInitialized=false;}
        }
        
        if(msg.value==0){
            //borrower is declining 
            require(currPaymentAccum>=address(this).balance);
            //refund borrower currPaymentAccum. !!!!!!!!!!!!!!!!!!!!!!!
            if(currPaymentAccum!=0){transfer(payable(borrower),currPaymentAccum);}
            currPaymentAccum=0;
            resetLoan();
        }
        
        
    }

    function setTerms() internal returns (bool){
        //AB ie 12. B is 1 for overpayment to principle OR 0 if overpayemnt goes to next month payment
        bool setError=false; //!!!!!!!!!!!!!! needs to be set in each "if" block !!!!!!!!!!!!!!!!!!!!
        
        //new terms format:1,aaaa,bbbb,cccc,dddd,eeeeee
        /*
        aaaa=total designed payments
        bbbb=payment frequency
        cccc=apr
        dddd=insurance divisor
        eeeeee=Initial Base Payment="eth"/10000. see "iniPaymentCalc"- sheets/excell sheet to calc'
        
        Example:"speed test"            =10006000100020202001686, with 1 ETH loan
        Example2:"unInsured speed test" =10006000100020200001686, with 1 ETH loan
        0006=total designed payments
        0001=payment frequency=enumeration of "speed test"=every 5 min
        0002=apr=2 percent=.02
        xx02=insurance divisor, xx=insurance terms(see ins' contract)
        016="eth"/100=.16 (eth)
        */
        require(terms>100000000000000000000); //ie 12222333344445555666666
        
        originLoanAmount=originLoanAmount+ 0;//"50USD"; //!!!!!!!!!need to set standard for adding USD to WEI !!!!!!!!!!!!
        minFunding=originLoanAmount / 2; //???????????????????????????
        
        uint256 _terms=terms;
        
        
        uint256 iniPayment=_terms % 1000000;
        _terms=_terms - iniPayment;
        _terms=_terms/1000000;
        iniPayment=iniPayment * 10**14;
        /*
        uint256 iniPayment=_terms % 10000;
        _terms=_terms - iniPayment;
        _terms=_terms/10000;
        iniPayment=iniPayment * 10**16;
        */
        uint256 insDivisor= _terms % 10000;
        _terms=_terms - insDivisor;
        _terms=_terms/10000;
        
        apr= _terms % 10000;
        _terms=_terms - apr;
        _terms=_terms/10000;
        
        
        uint256 payFrequ= _terms % 10000;
        _terms=_terms - payFrequ;
        _terms=_terms/10000;
        //paymentInterval=60*5;
        paymentInterval=0;
        if(payFrequ==1){ paymentInterval=60*5;} //speed test every 5 min
        if(payFrequ==2){ paymentInterval=60*60*24;} //daily
        if(payFrequ==3){ paymentInterval=60*60*24*7;} //weekly
        if(payFrequ==4){ paymentInterval=60*60*24*7*2;} //every 2 weeks
        if(payFrequ==5){ paymentInterval=2628000;} //monthly
        if(payFrequ==6){ paymentInterval=7889238;} //quarterly
        if(payFrequ==7){ paymentInterval=31556952;} //annually
        require(paymentInterval!=0);
        
        uint256 totPayments= _terms % 10000;
            //_terms=_terms - totPays;
            //_terms=_terms/10000;
            
            breachStatus=0; //enumerated value of if loan is in default (breach of contract): 0=no problem, 1=
            authDrawAmount=0; //the amount value that is authorized and available to be withdrawn
            authAgent=payable(getNftOwner());   //this.owner.address);
            drawDivisor=1; //set to divide the total loan amount into "1" protions.= max amount of draws
            drawInterval=0; //all can be drawn upfront
            lastDraw=0; //timestamp of previouw draw
            authAgent=getNftOwner();//lender; //lender is authAgent
            //underWriter=lender; //lender is insurer....is set with "proposal"
            processFee=(2*iniPayment)/100; //processFee: set as a function of "iniPayment". = .02 of iniPayent
            
            if(insDivisor!=0){
                /*
                uint256 insDivisor= _terms % 10000;
                _terms=_terms - insDivisor;
                _terms=_terms/10000;
                */
                //parse terms, divisor
                _terms=insDivisor;
                insDivisor=_terms % 100;
                _terms=_terms - insDivisor;
                _terms=_terms/100;
                uint256 insTerms=_terms % 100;

                
                //!!!!!!call insurance contract's "propose" function (IF underWriter!=lender)
                Iinsurance insContr=Iinsurance(underWriter);  //create interface ie:Iweth9 iWeth9=Iweth9(WETH);
                /*
                (
                uint256 _terms, address _beni, address _fundMngr, address _insured, 
                address _primOracle, uint256 _baseFunding, uint256 _insEnds, uint256 _maxBeniPaym
                )   
                */
                //!!!!!!!!!!!! NOTE: address(this)=this.owner.address
                
                //uint256 insFeeEstimate=(originLoanAmount/insDivisor);
                //insFeeEstimate=(insFeeEstimate*5)/10000;    //!!!!!!!!!!!!revise with data from ins' contract
                //call "function getMinPayment(uint256 _fundsPromised, uint256 _terms)" FROM ins'
                uint256 insFeeEstimate=insContr.getMinPayment((originLoanAmount/insDivisor), insTerms);
                uint256 insEnds=block.timestamp + (paymentInterval*totPayments);
                uint256 maxBeniPay=iniPayment + processFee + insFeeEstimate;
                address _owner=getNftOwner();   //
                insuranceFee=insContr.proposeIns(insTerms, address(this), _owner, address(this), 
                address(this),(originLoanAmount/insDivisor), insEnds, maxBeniPay);
                if(insuranceFee==99999999999999999999999999){ setError=true; } // THEN error 
                if(insuranceFee==0){ setError=true; }
                require(setError==false, "Ins Fee NOT Set");
            }else{
                insuranceFee=0;

        }
        //processFee=(2*iniPayment)/100; //processFee: set as a function of "iniPayment". = .02 of iniPayent
        paymentMin=iniPayment + processFee + insuranceFee;
        return setError;
    }
    
    // Function to deposit Ether into this contract.
    // Call this function along with some Ether.
    // The balance of this contract will be automatically updated. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    function fundLoan() public payable {
        //get address of lender
        //get address of caller
        //check var's to be in bounds: originLoanAmount
        amountFunded=amountFunded + msg.value;
        if (amountFunded>=minFunding && loanInitialized==false){
            //Disperse iniFee=currPaymentAccum. !!!!!!!!!!!!!!!!!!!!!
            transfer(payable(helixAddr),currPaymentAccum);
            currPaymentAccum=0;
            
            
            initializeLoan();
        }
        //set public var's: loanBalance, authorized draw amount...
    }

    function initializeLoan() internal {
        //initialize starting dates and draw schedules... per terms
        require(loanInitialized==false);
        loanInitialized=true;
        paymentsMade=0;
        paymentsRequired=0;
        drawsMade=0;
        loanBalance=originLoanAmount; //remaing balnace of loan
        loanIniDateTime=block.timestamp; //set loan start timeStamp
        paymentDue=loanIniDateTime + paymentInterval; //unix time of when the next loan payment is due
        authDrawAmount=originLoanAmount / drawDivisor; //the amount value that is authorized and available to be withdrawn
        
        
        
    }

    function requestDraw() public {
        require(loanInitialized==true);
        require(borrower==msg.sender); 
        require(breachStatus==0); 
        require(drawsMade<drawDivisor);
        require(block.timestamp>(lastDraw + drawInterval));
        //require: "contract balance" > authDrawAmount
        //check contract status: authorized draw amount, lastDraw, default status, ...
        //if OK: send _amount to borrower: authDrawAmount
        address payable _to = payable(borrower);
        (bool success, ) = _to.call{value: authDrawAmount}("");
        require(success, "Failed to send Ether");

        //update: drawsMade, authDrawAmount, lastDraw
        drawsMade++;
        lastDraw=block.timestamp;
        authDrawAmount=0; //needs to be reset by Officer/Oricle

    }

    //must be called after each draw
    function authorizeDraw() public {
        require(authAgent==msg.sender); //get address of caller
        require(drawsMade<drawDivisor);
        //verify authAgent = caller
        authDrawAmount=originLoanAmount / drawDivisor; //set authDrawAmount var
    }

    

    function makeLoanPayment() public payable {
        uint256 amountPaid=msg.value;
        currPaymentAccum=currPaymentAccum + amountPaid;
        
        //payment is for "claim". set breach status for "claim payed".
        if(msg.sender==underWriter){ breachStatus=40;}
        
        if(loanBalance==0){
            //distributeFees(address(this).balance);
            distributeFinalPayments();
            if(breachStatus==0){ resetLoan();}
        }else{
            calcBreachStatus();
        }

        
    }

    //lender request to contract for dispersement of recieved funds
    function requestCollection() external onlyNftOwner{
        
        //IF loan is not "initialized" (forclosed?)
        if(loanInitialized==false){
            //loan has been reset (?after forclosure)
            //check paymAccum for any value-if "true" THEN "fast pay" all parties(insurance, processor(Helix),...)
            //!!!! Caluclate (per terms) insurance portion !!!!!!!!
            uint256 payIns=insuranceFee*(paymentsRequired-paymentsMade);
            //pay insurance
             //create interface ie:Iweth9 iWeth9=Iweth9(WETH);
            
            if(terms!=40 && payIns!=0){
                Iinsurance insContr=Iinsurance(underWriter);  //create interface ie:Iweth9 iWeth9=Iweth9(WETH);
                bool premPaid=insContr.payPremium{value: payIns}();
                if(premPaid){ insuranceFee=0; }//set vars for no more ins' pay's
                //check for claims paid
                //uint256 claimsPaid=insContr.claimsPayed();
            }  

            //!!!! Calculate (per terms Helix portion)  !!!!!!!!!!!!
            //pay Helix
            //"process fee"="helix fee"= function of "originLoanAmount"
            /*
            (=originLoanAmount * "intrest percent rate Interval")/("# of payments per Interval" * 1000)
            */
            //uint256 processFee=(originLoanAmount*5)/1000;
            //processFee=processFee/12;//aka: (originLoanAmount*5)/12000
            uint256 payHelix=processFee*(paymentsRequired-paymentsMade);
            transfer(payable(helixAddr),payHelix);

            //pay remaining balnace to lender(owner)
            address payable p=payable(msg.sender);
            (bool success, ) = p.call{value: address(this).balance}("");
            require(success, "Failed to send Ether");

            resetLoan();//reset all loan var's


        }
    }



    // Function to transfer Ether from this contract to address from input. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    function transfer(address payable _to, uint _amount) internal {
        // Note that "to" is declared as payable
        (bool success, ) = _to.call{value: _amount}("");
        require(success, "Failed to send Ether");
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nftContrAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"terms","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"originLoanAmount","type":"uint256"}],"name":"loanProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"}],"name":"loanRequest","type":"event"},{"inputs":[],"name":"acceptTerms","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"amountFunded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authAgent","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authDrawAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authorizeDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"borrower","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowerAuthed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breachStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcBreachStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currPaymentAccum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drawDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drawInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drawsMade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundLoan","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getNftOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"helixAddr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"insuranceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lenderFunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanIniDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanRequExpires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanRequInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"makeLoanPayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minFunding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originLoanAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentDue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentsMade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentsRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_terms","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_insurer","type":"address"}],"name":"proposeTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_terms","type":"uint256"},{"internalType":"uint256","name":"_originLoanAmount","type":"uint256"}],"name":"requestLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_move","type":"uint256"}],"name":"resolveBreach","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"termsProposed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underWriter","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620036ce380380620036ce8339818101604052810190620000379190620002b7565b60008081905550600060028190555060006003819055506000600481905550600060058190555060006007819055506000600881905550600060068190555060006009819055506000600b819055506000600c81905550780fee50b7025c36a0802f236d04753d5b48e7ffffffffffffff600e819055506000600f819055506000601081905550600160118190555060006012819055506f0785ee10d5da46d900f4369fffffffff60138190555060006014819055506000601581905550600180819055506000601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055506000601660026101000a81548160ff0219169083151502179055506000601660036101000a81548160ff02191690831515021790555033601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550661c6bf526340000601a8190555081601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601c8190555050506200036a565b6000815190506200029a8162000336565b92915050565b600081519050620002b18162000350565b92915050565b60008060408385031215620002cb57600080fd5b6000620002db8582860162000289565b9250506020620002ee85828601620002a0565b9150509250929050565b600062000305826200030c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6200034181620002f8565b81146200034d57600080fd5b50565b6200035b816200032c565b81146200036757600080fd5b50565b613354806200037a6000396000f3fe6080604052600436106102515760003560e01c806387f478de11610139578063aa452fa6116100b6578063d50256251161007a578063d5025625146107a9578063e24078e8146107d4578063e792847b146107ff578063ec9fba451461082a578063f1e02f3e14610855578063f9c36fde1461088057610251565b8063aa452fa6146106d4578063ad4d6cb7146106fd578063ae20a8e114610728578063b6768cd114610753578063bc06c4cc1461077e57610251565b80639598c02f116100fd5780639598c02f1461061157806397c4fac71461063c5780639a4df66f14610667578063a57848b614610692578063a8e981ed146106a957610251565b806387f478de1461055d5780638afbfa45146105885780638c8a9a8b146105b15780638db57994146105dc57806391440260146105e657610251565b806351c6411e116101d257806372aea1d51161019657806372aea1d51461047e57806374f91591146104a95780637674cee3146104d25780637df1f1b9146104fd578063815af9081461052857806383b2fb301461053257610251565b806351c6411e146103cf57806357ded9c9146103e65780635dd577ec1461041157806361aa8d931461043c5780636df7f5ed1461046757610251565b80631bf05579116102195780631bf055791461030c5780631cc1cf46146103375780632b8fdd89146103625780632dae710b1461038d5780634ff59cf8146103a457610251565b80630aad8a86146102565780630f554b171461028157806314ee728b146102ac57806315978dbf146102d7578063193a4249146102e1575b600080fd5b34801561026257600080fd5b5061026b6108ab565b6040516102789190612f5f565b60405180910390f35b34801561028d57600080fd5b506102966108b1565b6040516102a39190612f5f565b60405180910390f35b3480156102b857600080fd5b506102c16108b7565b6040516102ce9190612ee9565b60405180910390f35b6102df6108dd565b005b3480156102ed57600080fd5b506102f661098d565b6040516103039190612f5f565b60405180910390f35b34801561031857600080fd5b50610321610993565b60405161032e9190612f5f565b60405180910390f35b34801561034357600080fd5b5061034c610999565b6040516103599190612f5f565b60405180910390f35b34801561036e57600080fd5b5061037761099f565b6040516103849190612ece565b60405180910390f35b34801561039957600080fd5b506103a2610a5e565b005b3480156103b057600080fd5b506103b9610e73565b6040516103c69190612f5f565b60405180910390f35b3480156103db57600080fd5b506103e4610e79565b005b3480156103f257600080fd5b506103fb61118a565b6040516104089190612f5f565b60405180910390f35b34801561041d57600080fd5b50610426611190565b6040516104339190612f5f565b60405180910390f35b34801561044857600080fd5b50610451611196565b60405161045e9190612f5f565b60405180910390f35b34801561047357600080fd5b5061047c61119c565b005b34801561048a57600080fd5b5061049361121e565b6040516104a09190612f04565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190612d37565b611231565b005b3480156104de57600080fd5b506104e76114aa565b6040516104f49190612f5f565b60405180910390f35b34801561050957600080fd5b506105126114b0565b60405161051f9190612ece565b60405180910390f35b6105306114d6565b005b34801561053e57600080fd5b50610547611664565b6040516105549190612f5f565b60405180910390f35b34801561056957600080fd5b5061057261166a565b60405161057f9190612f5f565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190612dc5565b611670565b005b3480156105bd57600080fd5b506105c66118b6565b6040516105d39190612f5f565b60405180910390f35b6105e46118bc565b005b3480156105f257600080fd5b506105fb61193d565b6040516106089190612f5f565b60405180910390f35b34801561061d57600080fd5b50610626611943565b6040516106339190612f5f565b60405180910390f35b34801561064857600080fd5b50610651611949565b60405161065e9190612f5f565b60405180910390f35b34801561067357600080fd5b5061067c61194f565b6040516106899190612f5f565b60405180910390f35b34801561069e57600080fd5b506106a7611955565b005b3480156106b557600080fd5b506106be611b09565b6040516106cb9190612f5f565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f69190612d89565b611b0f565b005b34801561070957600080fd5b50610712611c5f565b60405161071f9190612f5f565b60405180910390f35b34801561073457600080fd5b5061073d611c65565b60405161074a9190612ee9565b60405180910390f35b34801561075f57600080fd5b50610768611c8b565b6040516107759190612f5f565b60405180910390f35b34801561078a57600080fd5b50610793611c91565b6040516107a09190612f5f565b60405180910390f35b3480156107b557600080fd5b506107be611c97565b6040516107cb9190612f5f565b60405180910390f35b3480156107e057600080fd5b506107e9611c9d565b6040516107f69190612f04565b60405180910390f35b34801561080b57600080fd5b50610814611cb0565b6040516108219190612ece565b60405180910390f35b34801561083657600080fd5b5061083f611cd6565b60405161084c9190612f04565b60405180910390f35b34801561086157600080fd5b5061086a611ce9565b6040516108779190612f04565b60405180910390f35b34801561088c57600080fd5b50610895611cfc565b6040516108a29190612f5f565b60405180910390f35b60085481565b60125481565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000349050806008546108f0919061303d565b600881905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156109555760286009819055505b6000600254141561098157610968611d02565b6000600954141561097c5761097b6120cb565b5b61098a565b610989610a5e565b5b50565b600e5481565b60025481565b60075481565b600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e601c546040518263ffffffff1660e01b8152600401610a049190612f5f565b60206040518083038186803b158015610a1c57600080fd5b505afa158015610a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a549190612ce5565b9050809250505090565b60011515601660029054906101000a900460ff16151514610a7e57600080fd5b610a86612286565b60286009541415610ca857601054600f541115610ca7576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600854905060008273ffffffffffffffffffffffffffffffffffffffff1663de3ce0a26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b1557600080fd5b505af1158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d9190612d60565b8373ffffffffffffffffffffffffffffffffffffffff1663cff6c3bb6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcd9190612d60565b610bd7919061311e565b905080821115610be5578091505b60008373ffffffffffffffffffffffffffffffffffffffff1663d78c06e4846040518263ffffffff1660e01b81526004016020604051808303818588803b158015610c2f57600080fd5b505af1158015610c43573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c689190612d0e565b90508015610ca2576001600f54610c7f919061303d565b600f8190555082600854610c93919061311e565b60088190555060006009819055505b505050505b5b60065460085410610d5657610cbb6122cc565b6000600f546010541115610cdc57600f54601054610cd9919061311e565b90505b6000600654600854610cee9190613093565b905081811115610cfc578190505b6000811115610d535760005b81811115610d515760065460085410610d2457610d236122cc565b5b600080541415610d3e57600182610d3b919061303d565b90505b8080610d49906131ac565b915050610d08565b505b50505b6006546002541015610e46576000600c905061012c6007541415610d7957600690505b620151806007541415610d8c5761016d90505b62093a806007541415610d9e57603490505b621275006007541415610db057601a90505b622819a06007541415610dc257600c90505b627861566007541415610dd457600490505b6301e185586007541415610de757600190505b60006064600154600254610dfb91906130c4565b610e059190613093565b90508181610e139190613093565b9050601a54600a5482600254610e29919061303d565b610e33919061303d565b610e3d919061303d565b60068190555050505b601460095414610e7157602860095414610e7057600f546010541115610e6f57600a6009819055505b5b5b565b600f5481565b6000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e601c546040518263ffffffff1660e01b8152600401610edd9190612f5f565b60206040518083038186803b158015610ef557600080fd5b505afa158015610f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2d9190612ce5565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f6757600080fd5b60001515601660029054906101000a900460ff1615151415611186576000600f54601054610f95919061311e565b600a54610fa291906130c4565b9050602860005414158015610fb8575060008114155b1561107b576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166329c08ba2846040518263ffffffff1660e01b81526004016020604051808303818588803b15801561102e57600080fd5b505af1158015611042573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110679190612d0e565b90508015611078576000600a819055505b50505b6000600f5460105461108d919061311e565b601a5461109a91906130c4565b90506110c8601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612395565b600033905060008173ffffffffffffffffffffffffffffffffffffffff16476040516110f390612eb9565b60006040518083038185875af1925050503d8060008114611130576040519150601f19603f3d011682016040523d82523d6000602084013e611135565b606091505b5050905080611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090612f3f565b60405180910390fd5b6111816120cb565b505050505b5050565b60015481565b60145481565b601a5481565b3373ffffffffffffffffffffffffffffffffffffffff16601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f657600080fd5b6011546012541061120657600080fd5b6011546004546112169190613093565b600b81905550565b601660009054906101000a900460ff1681565b6000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e601c546040518263ffffffff1660e01b81526004016112959190612f5f565b60206040518083038186803b1580156112ad57600080fd5b505afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190612ce5565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461131f57600080fd5b60001515601660009054906101000a900460ff161515141561134e57600783141561134d5761134c6120cb565b5b5b600a60095414806113615750601e600954145b1561146157600283141561139057600f6000815480929190611382906131ac565b919050555060006009819055505b60038314156113a2576113a16120cb565b5b600483141561143c576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663ceddc0216040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561141a57600080fd5b505af115801561142e573d6000803e3d6000fd5b50505050601e600981905550505b600583141561144e5760006009819055505b60068314156114605760146009819055505b5b601460095414156114875760038314156114865761147d611d02565b6114856120cb565b5b5b602860095414156114a55760068314156114a45760146009819055505b5b505050565b60065481565b601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60011515601660039054906101000a900460ff161515146114f657600080fd5b60001515601660029054906101000a900460ff1615151461151657600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461157057600080fd5b3460085461157e919061303d565b6008819055506000612710600454604261159891906130c4565b6115a29190613093565b905080600854106115ff576001601660006101000a81548160ff02191690831515021790555060006115d2612446565b90506001151581151514156115fd576000601660026101000a81548160ff0219169083151502179055505b505b60003414156116615747600854101561161757600080fd5b6000600854146116505761164f601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854612395565b5b60006008819055506116606120cb565b5b50565b600c5481565b60155481565b6000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e601c546040518263ffffffff1660e01b81526004016116d49190612f5f565b60206040518083038186803b1580156116ec57600080fd5b505afa158015611700573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117249190612ce5565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461175e57600080fd5b60001515601660029054906101000a900460ff1615151461177e57600080fd5b6000600c54141580611791575042600c54115b15611856578460008190555083600481905550600d54426117b2919061303d565b600c819055506001601660036101000a81548160ff02191690831515021790555082601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f66e7c6e6e9e553f9cb93553cfc3a1ba6b3cb9661e2692f0de116f95243220a6e600054600454604051611849929190612ff8565b60405180910390a16118af565b47600854101561186557600080fd5b60006008541461189e5761189d601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854612395565b5b60006008819055506118ae6120cb565b5b5050505050565b60045481565b346003546118ca919061303d565b600381905550600e54600354101580156118f7575060001515601660029054906101000a900460ff161515145b1561193b5761192a601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854612395565b600060088190555061193a6129ac565b5b565b60095481565b60115481565b600a5481565b600b5481565b60011515601660029054906101000a900460ff1615151461197557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119cf57600080fd5b6000600954146119de57600080fd5b601154601254106119ee57600080fd5b6013546014546119fe919061303d565b4211611a0957600080fd5b6000601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16600b54604051611a5890612eb9565b60006040518083038185875af1925050503d8060008114611a95576040519150601f19603f3d011682016040523d82523d6000602084013e611a9a565b606091505b5050905080611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad590612f3f565b60405180910390fd5b60126000815480929190611af1906131ac565b9190505550426014819055506000600b819055505050565b60105481565b60001515601660029054906101000a900460ff16151514611b2f57600080fd5b6000600c541480611b41575042600c54105b15611c5b57476008541015611b5557600080fd5b600060085414611b8e57611b8d601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854612395565b5b6000600881905550611b9e6120cb565b8160008190555080600481905550600d5442611bba919061303d565b600c8190555033601660046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f67ca08caf70795730bd13ffa9b5077c10f5b4ff44422517830ebe06c053685ae601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051611c529190612ece565b60405180910390a15b5050565b600d5481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60135481565b60005481565b601660039054906101000a900460ff1681565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601660019054906101000a900460ff1681565b601660029054906101000a900460ff1681565b60035481565b600a54471115611de5576000600a5414611de4576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166329c08ba2600a546040518263ffffffff1660e01b81526004016020604051808303818588803b158015611d8957600080fd5b505af1158015611d9d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611dc29190612d0e565b90508015611de157600a54600854611dda919061311e565b6008819055505b50505b5b60286009541415611fdb576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663f953c2f36040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611e6157600080fd5b505af1158015611e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e999190612d60565b8273ffffffffffffffffffffffffffffffffffffffff1663cff6c3bb6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611ee157600080fd5b505af1158015611ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f199190612d60565b611f2391906130c4565b9050600047905081811115611f36578190505b60008373ffffffffffffffffffffffffffffffffffffffff1663d78c06e4836040518263ffffffff1660e01b81526004016020604051808303818588803b158015611f8057600080fd5b505af1158015611f94573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fb99190612d0e565b90508015611fd65781600854611fcf919061311e565b6008819055505b505050505b601a54471061202957612012601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601a54612395565b601a54600854612022919061311e565b6008819055505b60006006549050600061203a61099f565b9050814711156120ab5761204e8183612395565b8160085461205c919061311e565b600881905550600f54601054116120a657600060095414156120a5576120a4601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647612395565b5b5b6120bf565b600047146120be576120bd8147612395565b5b5b60006009819055505050565b60008081905550600060028190555060006003819055506000600481905550600060058190555060006007819055506000600881905550600060068190555060006009819055506000600b819055506000600c81905550780fee50b7025c36a0802f236d04753d5b48e7ffffffffffffff600e819055506000600f819055506000601081905550600160118190555060006012819055506f0785ee10d5da46d900f4369fffffffff6013819055506000601481905550600180819055506000601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055506000601660026101000a81548160ff0219169083151502179055506000601660036101000a81548160ff0219169083151502179055506121fc61099f565b601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061224461099f565b601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601660029054906101000a900460ff16156122c157600754601554426122ac919061311e565b6122b69190613093565b6010819055506122ca565b60006010819055505b565b60011515601660029054906101000a900460ff161515146122ec57600080fd5b6000806122f7612a3d565b9050601a54600a548260065461230d919061311e565b612317919061311e565b612321919061311e565b8261232c919061303d565b915060025482111561233e5760025491505b8160025461234c919061311e565b6002819055506123668282612361919061303d565b612af9565b600754600554612376919061303d565b6005819055506001600f5461238b919061303d565b600f819055505050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123bb90612eb9565b60006040518083038185875af1925050503d80600081146123f8576040519150601f19603f3d011682016040523d82523d6000602084013e6123fd565b606091505b5050905080612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890612f3f565b60405180910390fd5b505050565b6000806000905068056bc75e2d631000006000541161246457600080fd5b6000600454612473919061303d565b60048190555060026004546124889190613093565b600e819055506000805490506000620f4240826124a591906131f5565b905080826124b3919061311e565b9150620f4240826124c49190613093565b9150655af3107a4000816124d891906130c4565b90506000612710836124ea91906131f5565b905080836124f8919061311e565b9250612710836125089190613093565b92506127108361251891906131f5565b6001819055506001548361252c919061311e565b92506127108361253c9190613093565b925060006127108461254e91906131f5565b9050808461255c919061311e565b93506127108461256c9190613093565b9350600060078190555060018114156125895761012c6007819055505b600281141561259d57620151806007819055505b60038114156125b15762093a806007819055505b60048114156125c557621275006007819055505b60058114156125d957622819a06007819055505b60068114156125ed57627861566007819055505b6007811415612602576301e185586007819055505b6000600754141561261257600080fd5b60006127108561262291906131f5565b905060006009819055506000600b8190555061263c61099f565b601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016011819055506000601381905550600060148190555061269c61099f565b601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060648460026126eb91906130c4565b6126f59190613093565b601a81905550600083146129765782945060648561271391906131f5565b92508285612721919061311e565b94506064856127309190613093565b9450600060648661274191906131f5565b90506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663b08d2829876004546127969190613093565b856040518363ffffffff1660e01b81526004016127b4929190612ff8565b602060405180830381600087803b1580156127ce57600080fd5b505af11580156127e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128069190612d60565b905060008460075461281891906130c4565b42612823919061303d565b9050600082601a548a612836919061303d565b612840919061303d565b9050600061284c61099f565b90508473ffffffffffffffffffffffffffffffffffffffff1663efd1a84c87308430308f60045461287d9190613093565b8a8a6040518963ffffffff1660e01b81526004016128a2989796959493929190612f7a565b602060405180830381600087803b1580156128bc57600080fd5b505af11580156128d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f49190612d60565b600a819055506a52b7d2dcc80cd2e3ffffff600a5414156129145760019b505b6000600a5414156129245760019b505b600015158c15151461296b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296290612f1f565b60405180910390fd5b50505050505061297f565b6000600a819055505b600a54601a5485612990919061303d565b61299a919061303d565b60068190555085965050505050505090565b60001515601660029054906101000a900460ff161515146129cc57600080fd5b6001601660026101000a81548160ff0219169083151502179055506000600f819055506000601081905550600060128190555060045460028190555042601581905550600754601554612a1f919061303d565b600581905550601154600454612a359190613093565b600b81905550565b600080600c905061012c6007541415612a5557600690505b620151806007541415612a685761016d90505b62093a806007541415612a7a57603490505b621275006007541415612a8c57601a90505b622819a06007541415612a9e57600c90505b627861566007541415612ab057600490505b6301e185586007541415612ac357600190505b60006064600154600254612ad791906130c4565b612ae19190613093565b90508181612aef9190613093565b9050809250505090565b6000805414158015612b0e5750600a54600854115b15612c79576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600a54471115612bf5576000600a5414612bf45760008173ffffffffffffffffffffffffffffffffffffffff166329c08ba2600a546040518263ffffffff1660e01b81526004016020604051808303818588803b158015612b9a57600080fd5b505af1158015612bae573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bd39190612d0e565b90508015612bf257600a54600854612beb919061311e565b6008819055505b505b5b6000612bff61099f565b905082471115612c2857612c138184612395565b82600854612c21919061311e565b6008819055505b601a544710612c7657612c5f601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601a54612395565b601a54600854612c6f919061311e565b6008819055505b50505b50565b600081359050612c8b816132d9565b92915050565b600081519050612ca0816132d9565b92915050565b600081519050612cb5816132f0565b92915050565b600081359050612cca81613307565b92915050565b600081519050612cdf81613307565b92915050565b600060208284031215612cf757600080fd5b6000612d0584828501612c91565b91505092915050565b600060208284031215612d2057600080fd5b6000612d2e84828501612ca6565b91505092915050565b600060208284031215612d4957600080fd5b6000612d5784828501612cbb565b91505092915050565b600060208284031215612d7257600080fd5b6000612d8084828501612cd0565b91505092915050565b60008060408385031215612d9c57600080fd5b6000612daa85828601612cbb565b9250506020612dbb85828601612cbb565b9150509250929050565b600080600060608486031215612dda57600080fd5b6000612de886828701612cbb565b9350506020612df986828701612cbb565b9250506040612e0a86828701612c7c565b9150509250925092565b612e1d81613164565b82525050565b612e2c81613152565b82525050565b612e3b81613176565b82525050565b6000612e4e600f8361302c565b9150612e5982613284565b602082019050919050565b6000612e7160148361302c565b9150612e7c826132ad565b602082019050919050565b6000612e94600083613021565b9150612e9f826132d6565b600082019050919050565b612eb3816131a2565b82525050565b6000612ec482612e87565b9150819050919050565b6000602082019050612ee36000830184612e23565b92915050565b6000602082019050612efe6000830184612e14565b92915050565b6000602082019050612f196000830184612e32565b92915050565b60006020820190508181036000830152612f3881612e41565b9050919050565b60006020820190508181036000830152612f5881612e64565b9050919050565b6000602082019050612f746000830184612eaa565b92915050565b600061010082019050612f90600083018b612eaa565b612f9d602083018a612e23565b612faa6040830189612e23565b612fb76060830188612e23565b612fc46080830187612e23565b612fd160a0830186612eaa565b612fde60c0830185612eaa565b612feb60e0830184612eaa565b9998505050505050505050565b600060408201905061300d6000830185612eaa565b61301a6020830184612eaa565b9392505050565b600081905092915050565b600082825260208201905092915050565b6000613048826131a2565b9150613053836131a2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561308857613087613226565b5b828201905092915050565b600061309e826131a2565b91506130a9836131a2565b9250826130b9576130b8613255565b5b828204905092915050565b60006130cf826131a2565b91506130da836131a2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561311357613112613226565b5b828202905092915050565b6000613129826131a2565b9150613134836131a2565b92508282101561314757613146613226565b5b828203905092915050565b600061315d82613182565b9050919050565b600061316f82613182565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006131b7826131a2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131ea576131e9613226565b5b600182019050919050565b6000613200826131a2565b915061320b836131a2565b92508261321b5761321a613255565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f496e7320466565204e4f54205365740000000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b50565b6132e281613152565b81146132ed57600080fd5b50565b6132f981613176565b811461330457600080fd5b50565b613310816131a2565b811461331b57600080fd5b5056fea26469706673582212202c3df9072463e2e10906999dfc988e4b685042b28a1bce7b475aa7202c360c3764736f6c63430008010033000000000000000000000000d340a138109f0c37ed4c8a35bac6951b3a96a24d000000000000000000000000000000000000000000000000000000000000013b

Deployed Bytecode

0x6080604052600436106102515760003560e01c806387f478de11610139578063aa452fa6116100b6578063d50256251161007a578063d5025625146107a9578063e24078e8146107d4578063e792847b146107ff578063ec9fba451461082a578063f1e02f3e14610855578063f9c36fde1461088057610251565b8063aa452fa6146106d4578063ad4d6cb7146106fd578063ae20a8e114610728578063b6768cd114610753578063bc06c4cc1461077e57610251565b80639598c02f116100fd5780639598c02f1461061157806397c4fac71461063c5780639a4df66f14610667578063a57848b614610692578063a8e981ed146106a957610251565b806387f478de1461055d5780638afbfa45146105885780638c8a9a8b146105b15780638db57994146105dc57806391440260146105e657610251565b806351c6411e116101d257806372aea1d51161019657806372aea1d51461047e57806374f91591146104a95780637674cee3146104d25780637df1f1b9146104fd578063815af9081461052857806383b2fb301461053257610251565b806351c6411e146103cf57806357ded9c9146103e65780635dd577ec1461041157806361aa8d931461043c5780636df7f5ed1461046757610251565b80631bf05579116102195780631bf055791461030c5780631cc1cf46146103375780632b8fdd89146103625780632dae710b1461038d5780634ff59cf8146103a457610251565b80630aad8a86146102565780630f554b171461028157806314ee728b146102ac57806315978dbf146102d7578063193a4249146102e1575b600080fd5b34801561026257600080fd5b5061026b6108ab565b6040516102789190612f5f565b60405180910390f35b34801561028d57600080fd5b506102966108b1565b6040516102a39190612f5f565b60405180910390f35b3480156102b857600080fd5b506102c16108b7565b6040516102ce9190612ee9565b60405180910390f35b6102df6108dd565b005b3480156102ed57600080fd5b506102f661098d565b6040516103039190612f5f565b60405180910390f35b34801561031857600080fd5b50610321610993565b60405161032e9190612f5f565b60405180910390f35b34801561034357600080fd5b5061034c610999565b6040516103599190612f5f565b60405180910390f35b34801561036e57600080fd5b5061037761099f565b6040516103849190612ece565b60405180910390f35b34801561039957600080fd5b506103a2610a5e565b005b3480156103b057600080fd5b506103b9610e73565b6040516103c69190612f5f565b60405180910390f35b3480156103db57600080fd5b506103e4610e79565b005b3480156103f257600080fd5b506103fb61118a565b6040516104089190612f5f565b60405180910390f35b34801561041d57600080fd5b50610426611190565b6040516104339190612f5f565b60405180910390f35b34801561044857600080fd5b50610451611196565b60405161045e9190612f5f565b60405180910390f35b34801561047357600080fd5b5061047c61119c565b005b34801561048a57600080fd5b5061049361121e565b6040516104a09190612f04565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190612d37565b611231565b005b3480156104de57600080fd5b506104e76114aa565b6040516104f49190612f5f565b60405180910390f35b34801561050957600080fd5b506105126114b0565b60405161051f9190612ece565b60405180910390f35b6105306114d6565b005b34801561053e57600080fd5b50610547611664565b6040516105549190612f5f565b60405180910390f35b34801561056957600080fd5b5061057261166a565b60405161057f9190612f5f565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190612dc5565b611670565b005b3480156105bd57600080fd5b506105c66118b6565b6040516105d39190612f5f565b60405180910390f35b6105e46118bc565b005b3480156105f257600080fd5b506105fb61193d565b6040516106089190612f5f565b60405180910390f35b34801561061d57600080fd5b50610626611943565b6040516106339190612f5f565b60405180910390f35b34801561064857600080fd5b50610651611949565b60405161065e9190612f5f565b60405180910390f35b34801561067357600080fd5b5061067c61194f565b6040516106899190612f5f565b60405180910390f35b34801561069e57600080fd5b506106a7611955565b005b3480156106b557600080fd5b506106be611b09565b6040516106cb9190612f5f565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f69190612d89565b611b0f565b005b34801561070957600080fd5b50610712611c5f565b60405161071f9190612f5f565b60405180910390f35b34801561073457600080fd5b5061073d611c65565b60405161074a9190612ee9565b60405180910390f35b34801561075f57600080fd5b50610768611c8b565b6040516107759190612f5f565b60405180910390f35b34801561078a57600080fd5b50610793611c91565b6040516107a09190612f5f565b60405180910390f35b3480156107b557600080fd5b506107be611c97565b6040516107cb9190612f5f565b60405180910390f35b3480156107e057600080fd5b506107e9611c9d565b6040516107f69190612f04565b60405180910390f35b34801561080b57600080fd5b50610814611cb0565b6040516108219190612ece565b60405180910390f35b34801561083657600080fd5b5061083f611cd6565b60405161084c9190612f04565b60405180910390f35b34801561086157600080fd5b5061086a611ce9565b6040516108779190612f04565b60405180910390f35b34801561088c57600080fd5b50610895611cfc565b6040516108a29190612f5f565b60405180910390f35b60085481565b60125481565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000349050806008546108f0919061303d565b600881905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156109555760286009819055505b6000600254141561098157610968611d02565b6000600954141561097c5761097b6120cb565b5b61098a565b610989610a5e565b5b50565b600e5481565b60025481565b60075481565b600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e601c546040518263ffffffff1660e01b8152600401610a049190612f5f565b60206040518083038186803b158015610a1c57600080fd5b505afa158015610a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a549190612ce5565b9050809250505090565b60011515601660029054906101000a900460ff16151514610a7e57600080fd5b610a86612286565b60286009541415610ca857601054600f541115610ca7576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600854905060008273ffffffffffffffffffffffffffffffffffffffff1663de3ce0a26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b1557600080fd5b505af1158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d9190612d60565b8373ffffffffffffffffffffffffffffffffffffffff1663cff6c3bb6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcd9190612d60565b610bd7919061311e565b905080821115610be5578091505b60008373ffffffffffffffffffffffffffffffffffffffff1663d78c06e4846040518263ffffffff1660e01b81526004016020604051808303818588803b158015610c2f57600080fd5b505af1158015610c43573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c689190612d0e565b90508015610ca2576001600f54610c7f919061303d565b600f8190555082600854610c93919061311e565b60088190555060006009819055505b505050505b5b60065460085410610d5657610cbb6122cc565b6000600f546010541115610cdc57600f54601054610cd9919061311e565b90505b6000600654600854610cee9190613093565b905081811115610cfc578190505b6000811115610d535760005b81811115610d515760065460085410610d2457610d236122cc565b5b600080541415610d3e57600182610d3b919061303d565b90505b8080610d49906131ac565b915050610d08565b505b50505b6006546002541015610e46576000600c905061012c6007541415610d7957600690505b620151806007541415610d8c5761016d90505b62093a806007541415610d9e57603490505b621275006007541415610db057601a90505b622819a06007541415610dc257600c90505b627861566007541415610dd457600490505b6301e185586007541415610de757600190505b60006064600154600254610dfb91906130c4565b610e059190613093565b90508181610e139190613093565b9050601a54600a5482600254610e29919061303d565b610e33919061303d565b610e3d919061303d565b60068190555050505b601460095414610e7157602860095414610e7057600f546010541115610e6f57600a6009819055505b5b5b565b600f5481565b6000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e601c546040518263ffffffff1660e01b8152600401610edd9190612f5f565b60206040518083038186803b158015610ef557600080fd5b505afa158015610f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2d9190612ce5565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f6757600080fd5b60001515601660029054906101000a900460ff1615151415611186576000600f54601054610f95919061311e565b600a54610fa291906130c4565b9050602860005414158015610fb8575060008114155b1561107b576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166329c08ba2846040518263ffffffff1660e01b81526004016020604051808303818588803b15801561102e57600080fd5b505af1158015611042573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110679190612d0e565b90508015611078576000600a819055505b50505b6000600f5460105461108d919061311e565b601a5461109a91906130c4565b90506110c8601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612395565b600033905060008173ffffffffffffffffffffffffffffffffffffffff16476040516110f390612eb9565b60006040518083038185875af1925050503d8060008114611130576040519150601f19603f3d011682016040523d82523d6000602084013e611135565b606091505b5050905080611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090612f3f565b60405180910390fd5b6111816120cb565b505050505b5050565b60015481565b60145481565b601a5481565b3373ffffffffffffffffffffffffffffffffffffffff16601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f657600080fd5b6011546012541061120657600080fd5b6011546004546112169190613093565b600b81905550565b601660009054906101000a900460ff1681565b6000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e601c546040518263ffffffff1660e01b81526004016112959190612f5f565b60206040518083038186803b1580156112ad57600080fd5b505afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190612ce5565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461131f57600080fd5b60001515601660009054906101000a900460ff161515141561134e57600783141561134d5761134c6120cb565b5b5b600a60095414806113615750601e600954145b1561146157600283141561139057600f6000815480929190611382906131ac565b919050555060006009819055505b60038314156113a2576113a16120cb565b5b600483141561143c576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663ceddc0216040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561141a57600080fd5b505af115801561142e573d6000803e3d6000fd5b50505050601e600981905550505b600583141561144e5760006009819055505b60068314156114605760146009819055505b5b601460095414156114875760038314156114865761147d611d02565b6114856120cb565b5b5b602860095414156114a55760068314156114a45760146009819055505b5b505050565b60065481565b601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60011515601660039054906101000a900460ff161515146114f657600080fd5b60001515601660029054906101000a900460ff1615151461151657600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461157057600080fd5b3460085461157e919061303d565b6008819055506000612710600454604261159891906130c4565b6115a29190613093565b905080600854106115ff576001601660006101000a81548160ff02191690831515021790555060006115d2612446565b90506001151581151514156115fd576000601660026101000a81548160ff0219169083151502179055505b505b60003414156116615747600854101561161757600080fd5b6000600854146116505761164f601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854612395565b5b60006008819055506116606120cb565b5b50565b600c5481565b60155481565b6000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e601c546040518263ffffffff1660e01b81526004016116d49190612f5f565b60206040518083038186803b1580156116ec57600080fd5b505afa158015611700573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117249190612ce5565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461175e57600080fd5b60001515601660029054906101000a900460ff1615151461177e57600080fd5b6000600c54141580611791575042600c54115b15611856578460008190555083600481905550600d54426117b2919061303d565b600c819055506001601660036101000a81548160ff02191690831515021790555082601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f66e7c6e6e9e553f9cb93553cfc3a1ba6b3cb9661e2692f0de116f95243220a6e600054600454604051611849929190612ff8565b60405180910390a16118af565b47600854101561186557600080fd5b60006008541461189e5761189d601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854612395565b5b60006008819055506118ae6120cb565b5b5050505050565b60045481565b346003546118ca919061303d565b600381905550600e54600354101580156118f7575060001515601660029054906101000a900460ff161515145b1561193b5761192a601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854612395565b600060088190555061193a6129ac565b5b565b60095481565b60115481565b600a5481565b600b5481565b60011515601660029054906101000a900460ff1615151461197557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119cf57600080fd5b6000600954146119de57600080fd5b601154601254106119ee57600080fd5b6013546014546119fe919061303d565b4211611a0957600080fd5b6000601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16600b54604051611a5890612eb9565b60006040518083038185875af1925050503d8060008114611a95576040519150601f19603f3d011682016040523d82523d6000602084013e611a9a565b606091505b5050905080611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad590612f3f565b60405180910390fd5b60126000815480929190611af1906131ac565b9190505550426014819055506000600b819055505050565b60105481565b60001515601660029054906101000a900460ff16151514611b2f57600080fd5b6000600c541480611b41575042600c54105b15611c5b57476008541015611b5557600080fd5b600060085414611b8e57611b8d601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854612395565b5b6000600881905550611b9e6120cb565b8160008190555080600481905550600d5442611bba919061303d565b600c8190555033601660046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f67ca08caf70795730bd13ffa9b5077c10f5b4ff44422517830ebe06c053685ae601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051611c529190612ece565b60405180910390a15b5050565b600d5481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60135481565b60005481565b601660039054906101000a900460ff1681565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601660019054906101000a900460ff1681565b601660029054906101000a900460ff1681565b60035481565b600a54471115611de5576000600a5414611de4576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166329c08ba2600a546040518263ffffffff1660e01b81526004016020604051808303818588803b158015611d8957600080fd5b505af1158015611d9d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611dc29190612d0e565b90508015611de157600a54600854611dda919061311e565b6008819055505b50505b5b60286009541415611fdb576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663f953c2f36040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611e6157600080fd5b505af1158015611e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e999190612d60565b8273ffffffffffffffffffffffffffffffffffffffff1663cff6c3bb6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611ee157600080fd5b505af1158015611ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f199190612d60565b611f2391906130c4565b9050600047905081811115611f36578190505b60008373ffffffffffffffffffffffffffffffffffffffff1663d78c06e4836040518263ffffffff1660e01b81526004016020604051808303818588803b158015611f8057600080fd5b505af1158015611f94573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fb99190612d0e565b90508015611fd65781600854611fcf919061311e565b6008819055505b505050505b601a54471061202957612012601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601a54612395565b601a54600854612022919061311e565b6008819055505b60006006549050600061203a61099f565b9050814711156120ab5761204e8183612395565b8160085461205c919061311e565b600881905550600f54601054116120a657600060095414156120a5576120a4601660049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647612395565b5b5b6120bf565b600047146120be576120bd8147612395565b5b5b60006009819055505050565b60008081905550600060028190555060006003819055506000600481905550600060058190555060006007819055506000600881905550600060068190555060006009819055506000600b819055506000600c81905550780fee50b7025c36a0802f236d04753d5b48e7ffffffffffffff600e819055506000600f819055506000601081905550600160118190555060006012819055506f0785ee10d5da46d900f4369fffffffff6013819055506000601481905550600180819055506000601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055506000601660026101000a81548160ff0219169083151502179055506000601660036101000a81548160ff0219169083151502179055506121fc61099f565b601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061224461099f565b601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601660029054906101000a900460ff16156122c157600754601554426122ac919061311e565b6122b69190613093565b6010819055506122ca565b60006010819055505b565b60011515601660029054906101000a900460ff161515146122ec57600080fd5b6000806122f7612a3d565b9050601a54600a548260065461230d919061311e565b612317919061311e565b612321919061311e565b8261232c919061303d565b915060025482111561233e5760025491505b8160025461234c919061311e565b6002819055506123668282612361919061303d565b612af9565b600754600554612376919061303d565b6005819055506001600f5461238b919061303d565b600f819055505050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123bb90612eb9565b60006040518083038185875af1925050503d80600081146123f8576040519150601f19603f3d011682016040523d82523d6000602084013e6123fd565b606091505b5050905080612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890612f3f565b60405180910390fd5b505050565b6000806000905068056bc75e2d631000006000541161246457600080fd5b6000600454612473919061303d565b60048190555060026004546124889190613093565b600e819055506000805490506000620f4240826124a591906131f5565b905080826124b3919061311e565b9150620f4240826124c49190613093565b9150655af3107a4000816124d891906130c4565b90506000612710836124ea91906131f5565b905080836124f8919061311e565b9250612710836125089190613093565b92506127108361251891906131f5565b6001819055506001548361252c919061311e565b92506127108361253c9190613093565b925060006127108461254e91906131f5565b9050808461255c919061311e565b93506127108461256c9190613093565b9350600060078190555060018114156125895761012c6007819055505b600281141561259d57620151806007819055505b60038114156125b15762093a806007819055505b60048114156125c557621275006007819055505b60058114156125d957622819a06007819055505b60068114156125ed57627861566007819055505b6007811415612602576301e185586007819055505b6000600754141561261257600080fd5b60006127108561262291906131f5565b905060006009819055506000600b8190555061263c61099f565b601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016011819055506000601381905550600060148190555061269c61099f565b601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060648460026126eb91906130c4565b6126f59190613093565b601a81905550600083146129765782945060648561271391906131f5565b92508285612721919061311e565b94506064856127309190613093565b9450600060648661274191906131f5565b90506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663b08d2829876004546127969190613093565b856040518363ffffffff1660e01b81526004016127b4929190612ff8565b602060405180830381600087803b1580156127ce57600080fd5b505af11580156127e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128069190612d60565b905060008460075461281891906130c4565b42612823919061303d565b9050600082601a548a612836919061303d565b612840919061303d565b9050600061284c61099f565b90508473ffffffffffffffffffffffffffffffffffffffff1663efd1a84c87308430308f60045461287d9190613093565b8a8a6040518963ffffffff1660e01b81526004016128a2989796959493929190612f7a565b602060405180830381600087803b1580156128bc57600080fd5b505af11580156128d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f49190612d60565b600a819055506a52b7d2dcc80cd2e3ffffff600a5414156129145760019b505b6000600a5414156129245760019b505b600015158c15151461296b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296290612f1f565b60405180910390fd5b50505050505061297f565b6000600a819055505b600a54601a5485612990919061303d565b61299a919061303d565b60068190555085965050505050505090565b60001515601660029054906101000a900460ff161515146129cc57600080fd5b6001601660026101000a81548160ff0219169083151502179055506000600f819055506000601081905550600060128190555060045460028190555042601581905550600754601554612a1f919061303d565b600581905550601154600454612a359190613093565b600b81905550565b600080600c905061012c6007541415612a5557600690505b620151806007541415612a685761016d90505b62093a806007541415612a7a57603490505b621275006007541415612a8c57601a90505b622819a06007541415612a9e57600c90505b627861566007541415612ab057600490505b6301e185586007541415612ac357600190505b60006064600154600254612ad791906130c4565b612ae19190613093565b90508181612aef9190613093565b9050809250505090565b6000805414158015612b0e5750600a54600854115b15612c79576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600a54471115612bf5576000600a5414612bf45760008173ffffffffffffffffffffffffffffffffffffffff166329c08ba2600a546040518263ffffffff1660e01b81526004016020604051808303818588803b158015612b9a57600080fd5b505af1158015612bae573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bd39190612d0e565b90508015612bf257600a54600854612beb919061311e565b6008819055505b505b5b6000612bff61099f565b905082471115612c2857612c138184612395565b82600854612c21919061311e565b6008819055505b601a544710612c7657612c5f601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601a54612395565b601a54600854612c6f919061311e565b6008819055505b50505b50565b600081359050612c8b816132d9565b92915050565b600081519050612ca0816132d9565b92915050565b600081519050612cb5816132f0565b92915050565b600081359050612cca81613307565b92915050565b600081519050612cdf81613307565b92915050565b600060208284031215612cf757600080fd5b6000612d0584828501612c91565b91505092915050565b600060208284031215612d2057600080fd5b6000612d2e84828501612ca6565b91505092915050565b600060208284031215612d4957600080fd5b6000612d5784828501612cbb565b91505092915050565b600060208284031215612d7257600080fd5b6000612d8084828501612cd0565b91505092915050565b60008060408385031215612d9c57600080fd5b6000612daa85828601612cbb565b9250506020612dbb85828601612cbb565b9150509250929050565b600080600060608486031215612dda57600080fd5b6000612de886828701612cbb565b9350506020612df986828701612cbb565b9250506040612e0a86828701612c7c565b9150509250925092565b612e1d81613164565b82525050565b612e2c81613152565b82525050565b612e3b81613176565b82525050565b6000612e4e600f8361302c565b9150612e5982613284565b602082019050919050565b6000612e7160148361302c565b9150612e7c826132ad565b602082019050919050565b6000612e94600083613021565b9150612e9f826132d6565b600082019050919050565b612eb3816131a2565b82525050565b6000612ec482612e87565b9150819050919050565b6000602082019050612ee36000830184612e23565b92915050565b6000602082019050612efe6000830184612e14565b92915050565b6000602082019050612f196000830184612e32565b92915050565b60006020820190508181036000830152612f3881612e41565b9050919050565b60006020820190508181036000830152612f5881612e64565b9050919050565b6000602082019050612f746000830184612eaa565b92915050565b600061010082019050612f90600083018b612eaa565b612f9d602083018a612e23565b612faa6040830189612e23565b612fb76060830188612e23565b612fc46080830187612e23565b612fd160a0830186612eaa565b612fde60c0830185612eaa565b612feb60e0830184612eaa565b9998505050505050505050565b600060408201905061300d6000830185612eaa565b61301a6020830184612eaa565b9392505050565b600081905092915050565b600082825260208201905092915050565b6000613048826131a2565b9150613053836131a2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561308857613087613226565b5b828201905092915050565b600061309e826131a2565b91506130a9836131a2565b9250826130b9576130b8613255565b5b828204905092915050565b60006130cf826131a2565b91506130da836131a2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561311357613112613226565b5b828202905092915050565b6000613129826131a2565b9150613134836131a2565b92508282101561314757613146613226565b5b828203905092915050565b600061315d82613182565b9050919050565b600061316f82613182565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006131b7826131a2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131ea576131e9613226565b5b600182019050919050565b6000613200826131a2565b915061320b836131a2565b92508261321b5761321a613255565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f496e7320466565204e4f54205365740000000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b50565b6132e281613152565b81146132ed57600080fd5b50565b6132f981613176565b811461330457600080fd5b50565b613310816131a2565b811461331b57600080fd5b5056fea26469706673582212202c3df9072463e2e10906999dfc988e4b685042b28a1bce7b475aa7202c360c3764736f6c63430008010033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d340a138109f0c37ed4c8a35bac6951b3a96a24d000000000000000000000000000000000000000000000000000000000000013b

-----Decoded View---------------
Arg [0] : _nftContrAddress (address): 0xD340a138109f0c37eD4c8a35BAc6951B3A96a24D
Arg [1] : _tokenId (uint256): 315

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d340a138109f0c37ed4c8a35bac6951b3a96a24d
Arg [1] : 000000000000000000000000000000000000000000000000000000000000013b


Deployed Bytecode Sourcemap

1058:35672:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2119:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3321:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4180:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33881:537;;;:::i;:::-;;2966:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1645:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2055:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7451:203;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16212:3937;;;;;;;;;;;;;:::i;:::-;;3095:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34495:1874;;;;;;;;;;;;;:::i;:::-;;1557:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3477:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4344:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33601:264;;;;;;;;;;;;;:::i;:::-;;3614:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7686:2412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1971:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4045:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24500:978;;;:::i;:::-;;2793:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3533;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23276:1160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1819:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31496:582;;;:::i;:::-;;2250:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3224:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2351:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2680:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32747:808;;;;;;;;;;;;;:::i;:::-;;3154:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21930:1242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2893:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4273:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1890:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3375:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1089:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3901:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4097:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3715;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3810:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1712;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2119:31;;;;:::o;3321:24::-;;;;:::o;4180:34::-;;;;;;;;;;;;;:::o;33881:537::-;33934:18;33953:9;33934:28;;34009:10;33990:16;;:29;;;;:::i;:::-;33973:16;:46;;;;34127:11;;;;;;;;;;;34115:23;;:10;:23;;;34112:46;;;34154:2;34141:12;:15;;;;34112:46;34194:1;34181:11;;:14;34178:221;;;34265:25;:23;:25::i;:::-;34322:1;34308:12;;:15;34305:34;;;34326:11;:9;:11::i;:::-;34305:34;34178:221;;;34369:18;:16;:18::i;:::-;34178:221;33881:537;:::o;2966:25::-;;;;:::o;1645:26::-;;;;:::o;2055:30::-;;;;:::o;7451:203::-;7495:7;7514:21;7549:15;;;;;;;;;;;7514:51;;7576:17;7594:8;:16;;;7611:7;;7594:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7576:43;;7637:9;7630:16;;;;7451:203;:::o;16212:3937::-;16283:4;16266:21;;:15;;;;;;;;;;;:21;;;16258:30;;;;;;16345:22;:20;:22::i;:::-;16490:2;16476:12;;:16;16473:1334;;;16608:16;;16595:12;;:29;16592:1204;;;16744:19;16783:11;;;;;;;;;;;16744:52;;17118:16;17135;;17118:33;;17206:23;17253:8;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17230:8;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;;:::i;:::-;17206:68;;17318:15;17309:8;:24;17306:55;;;17344:15;17335:24;;17306:55;17379:16;17396:8;:26;;;17430:8;17396:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17379:62;;17559:11;17556:189;;;17621:1;17608:12;;:14;;;;:::i;:::-;17595:12;:27;;;;17680:8;17663:16;;:25;;;;:::i;:::-;17646:16;:42;;;;17724:1;17711:12;:14;;;;17556:189;16592:1204;;;;;16473:1334;17850:10;;17832:16;;:28;17829:938;;17877:16;:14;:16::i;:::-;18015:28;18113:12;;18096:16;;:29;18093:87;;;18166:12;;18149:16;;:29;;;;:::i;:::-;18128:50;;18093:87;18194:31;18243:10;;18226:16;;:27;;;;:::i;:::-;18194:59;;18295:20;18271:23;:44;18268:96;;;18342:20;18318:44;;18268:96;18416:1;18392:23;:25;18389:367;;;18441:6;18437:304;18453:23;18451:1;:25;18437:304;;;18526:10;;18508:16;;:28;18505:52;;18538:16;:14;:16::i;:::-;18505:52;18689:1;18682:5;;:8;18679:43;;;18719:1;18695:23;:25;;;;:::i;:::-;18693:27;;18679:43;18478:3;;;;;:::i;:::-;;;;18437:304;;;;18389:367;17829:938;;;18872:10;;18860:11;;:22;18857:1064;;;18898:18;18917:2;18898:21;;19069:4;19052:15;;:21;19049:40;;;19086:1;19075:12;;19049:40;19174:8;19157:15;;:25;19154:46;;;19195:3;19184:14;;19154:46;19242:10;19225:15;;:27;19222:47;;;19265:2;19254:13;;19222:47;19312:12;19295:15;;:29;19292:49;;;19337:2;19326:13;;19292:49;19391:7;19374:15;;:24;19371:44;;;19411:2;19400:13;;19371:44;19459:7;19442:15;;:24;19439:43;;;19479:1;19468:12;;19439:43;19528:8;19511:15;;:25;19508:44;;;19549:1;19538:12;;19508:44;19577:22;19618:3;19613;;19601:11;;:15;;;;:::i;:::-;19600:21;;;;:::i;:::-;19577:44;;19765:10;19750:14;:25;;;;:::i;:::-;19735:40;;19899:10;;19884:12;;19867:14;19853:11;;:28;;;;:::i;:::-;:43;;;;:::i;:::-;:56;;;;:::i;:::-;19842:10;:67;;;;18857:1064;;;19950:2;19936:12;;:16;19933:199;;19985:2;19971:12;;:16;19968:153;;20027:12;;20010:16;;:29;20007:53;;;20055:2;20042:12;:15;;;;20007:53;19968:153;19933:199;16212:3937::o;3095:27::-;;;;:::o;34495:1874::-;7092:21;7127:15;;;;;;;;;;;7092:51;;7154:16;7171:8;:16;;;7188:7;;7171:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7154:42;;7227:8;7215:20;;:10;:20;;;7207:29;;;;;;34639:5:::1;34622:22;;:15;;;;;;;;;;;:22;;;34619:1743;;;34900:14;34946:12;;34929:16;;:29;;;;:::i;:::-;34915:12;;:44;;;;:::i;:::-;34900:59;;35091:2;35084:5;;:9;;:22;;;;;35105:1;35097:6;:9;;35084:22;35081:409;;;35126:19;35157:11;;;;;;;;;;;35126:43;;35239:13;35253:8;:19;;;35280:6;35253:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35239:50;;35311:8;35308:31;;;35335:1;35322:12;:14;;;;35308:31;35081:409;;;35948:16;35994:12;;35977:16;;:29;;;;:::i;:::-;35965:10;;:42;;;;:::i;:::-;35948:59;;36022:37;36039:9;;;;;;;;;;;36050:8;36022;:37::i;:::-;36130:17;36156:10;36130:37;;36183:12;36201:1;:6;;36215:21;36201:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36182:59;;;36264:7;36256:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;36313:11;:9;:11::i;:::-;34619:1743;;;;;34495:1874:::0;;:::o;1557:18::-;;;;:::o;3477:23::-;;;;:::o;4344:25::-;;;;:::o;33601:264::-;33663:10;33652:21;;:9;;;;;;;;;;;:21;;;33644:30;;;;;;33727:11;;33717:9;;:21;33709:30;;;;;;33821:11;;33802:16;;:30;;;;:::i;:::-;33787:14;:45;;;;33601:264::o;3614:26::-;;;;;;;;;;;;;:::o;7686:2412::-;7092:21;7127:15;;;;;;;;;;;7092:51;;7154:16;7171:8;:16;;;7188:7;;7171:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7154:42;;7227:8;7215:20;;:10;:20;;;7207:29;;;;;;8399:5:::1;8383:21;;:14;;;;;;;;;;;:21;;;8380:78;;;8430:1;8423:5;:8;8420:27;;;8434:11;:9;:11::i;:::-;8420:27;8380:78;8496:2;8482:12;;:16;:36;;;;8516:2;8502:12;;:16;8482:36;8478:1114;;;8646:1;8639:5;:8;8636:163;;;8668:12;;:14;;;;;;;;;:::i;:::-;;;;;;8782:1;8769:12;:14;;;;8636:163;8823:1;8816:5;:8;8813:58;;;8844:11;:9;:11::i;:::-;8813:58;8895:1;8888:5;:8;8885:390;;;8916:19;8947:11;;;;;;;;;;;8916:43;;9029:8;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9167:2;9154:12;:15;;;;8885:390;;9299:1;9292:5;:8;9289:138;;;9410:1;9397:12;:14;;;;9289:138;9451:1;9444:5;:8;9441:140;;;9513:2;9500:12;:15;;;;9441:140;8478:1114;9620:2;9606:12;;:16;9602:206;;;9648:1;9641:5;:8;9638:159;;;9726:25;:23;:25::i;:::-;9770:11;:9;:11::i;:::-;9638:159;9602:206;9835:2;9821:12;;:16;9818:273;;;9950:1;9943:5;:8;9940:140;;;10012:2;9999:12;:15;;;;9940:140;9818:273;7686:2412:::0;;;:::o;1971:25::-;;;;:::o;4045:23::-;;;;;;;;;;;;;:::o;24500:978::-;24635:4;24620:19;;:13;;;;;;;;;;;:19;;;24611:29;;;;;;24676:5;24659:22;;:15;;;;;;;;;;;:22;;;24651:31;;;;;;24711:10;24701:20;;:8;;;;;;;;;;;:20;;;24693:29;;;;;;24843:9;24824:16;;:28;;;;:::i;:::-;24807:16;:45;;;;24863:14;24900:5;24882:16;;24879:2;:19;;;;:::i;:::-;24878:27;;;;:::i;:::-;24863:42;;24937:6;24919:16;;:24;24916:170;;24974:4;24959:14;;:19;;;;;;;;;;;;;;;;;;24993:13;25007:10;:8;:10::i;:::-;24993:24;;25045:4;25035:14;;:8;:14;;;25032:43;;;25068:5;25052:15;;:21;;;;;;;;;;;;;;;;;;25032:43;24916:170;;25120:1;25109:9;:12;25106:345;;;25201:21;25183:16;;:39;;25175:48;;;;;;25332:1;25314:16;;:19;25311:70;;25335:44;25352:8;;;;;;;;;;;25362:16;;25335:8;:44::i;:::-;25311:70;25412:1;25395:16;:18;;;;25428:11;:9;:11::i;:::-;25106:345;24500:978;:::o;2793:30::-;;;;:::o;3533:::-;;;;:::o;23276:1160::-;7092:21;7127:15;;;;;;;;;;;7092:51;;7154:16;7171:8;:16;;;7188:7;;7171:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7154:42;;7227:8;7215:20;;:10;:20;;;7207:29;;;;;;23407:5:::1;23390:22;;:15;;;;;;;;;;;:22;;;23382:31;;;::::0;::::1;;23445:1;23428:15;;:18;;:53;;;;23466:15;23450;;:31;23428:53;23424:1005;;;23576:6;23570:5;:12;;;;23710:7;23693:16;:24;;;;23791:16;;23773:15;:34;;;;:::i;:::-;23757:15;:50;;;;23899:4;23885:13;;:18;;;;;;;;;;;;;;;;;;23940:8;23920:11;;:29;;;;;;;;;;;;;;;;;;23969:37;23982:5;;23989:16;;23969:37;;;;;;;:::i;:::-;;;;;;;;23424:1005;;;24179:21;24161:16;;:39;;24153:48;;;::::0;::::1;;24310:1;24292:16;;:19;24289:70;;24313:44;24330:8;;;;;;;;;;;24340:16;;24313:8;:44::i;:::-;24289:70;24390:1;24373:16;:18;;;;24406:11;:9;:11::i;:::-;23424:1005;23276:1160:::0;;;;;:::o;1819:31::-;;;;:::o;31496:582::-;31693:9;31678:12;;:24;;;;:::i;:::-;31665:12;:37;;;;31731:10;;31717:12;;:24;;:50;;;;;31762:5;31745:22;;:15;;;;;;;;;;;:22;;;31717:50;31713:290;;;31854:45;31871:9;;;;;;;;;;;31882:16;;31854:8;:45::i;:::-;31931:1;31914:16;:18;;;;31975:16;:14;:16::i;:::-;31713:290;31496:582::o;2250:27::-;;;;:::o;3224:26::-;;;;:::o;2351:27::-;;;;:::o;2680:29::-;;;;:::o;32747:808::-;32813:4;32796:21;;:15;;;;;;;;;;;:21;;;32788:30;;;;;;32847:10;32837:20;;:8;;;;;;;;;;;:20;;;32829:29;;;;;;32892:1;32878:12;;:15;32870:24;;;;;;32924:11;;32914:9;;:21;32906:30;;;;;;32983:12;;32972:8;;:23;;;;:::i;:::-;32955:15;:41;32947:50;;;;;;33211:19;33241:8;;;;;;;;;;;33211:39;;33262:12;33280:3;:8;;33296:14;;33280:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33261:54;;;33334:7;33326:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;33434:9;;:11;;;;;;;;;:::i;:::-;;;;;;33465:15;33456:8;:24;;;;33506:1;33491:14;:16;;;;32747:808;;:::o;3154:31::-;;;;:::o;21930:1242::-;22079:5;22062:22;;:15;;;;;;;;;;;:22;;;22054:31;;;;;;22117:1;22100:15;;:18;:53;;;;22138:15;22122;;:31;22100:53;22096:1059;;;22288:21;22270:16;;:39;;22262:48;;;;;;22419:1;22401:16;;:19;22398:70;;22422:44;22439:8;;;;;;;;;;;22449:16;;22422:8;:44::i;:::-;22398:70;22499:1;22482:16;:18;;;;22515:11;:9;:11::i;:::-;22620:6;22614:5;:12;;;;22754:17;22737:16;:34;;;;22845:16;;22827:15;:34;;;;:::i;:::-;22811:15;:50;;;;22948:10;22939:8;;:19;;;;;;;;;;;;;;;;;;23122:21;23134:8;;;;;;;;;;;23122:21;;;;;;:::i;:::-;;;;;;;;22096:1059;21930:1242;;:::o;2893:31::-;;;;:::o;4273:32::-;;;;;;;;;;;;;:::o;1890:25::-;;;;:::o;3375:27::-;;;;:::o;1089:20::-;;;;:::o;3901:25::-;;;;;;;;;;;;;:::o;4097:24::-;;;;;;;;;;;;;:::o;3715:::-;;;;;;;;;;;;;:::o;3810:27::-;;;;;;;;;;;;;:::o;1712:::-;;;;:::o;10461:2180::-;10570:12;;10548:21;:34;10545:367;;;10619:1;10605:12;;:15;10602:299;;10644:19;10683:11;;;;;;;;;;;10644:52;;10719:13;10733:8;:19;;;10760:12;;10733:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10719:56;;10801:8;10798:63;;;10846:12;;10829:16;;:29;;;;:::i;:::-;10812:16;:46;;;;10798:63;10602:299;;;10545:367;10988:2;10974:12;;:16;10971:583;;;11051:19;11090:11;;;;;;;;;;;11051:52;;11118:23;11165:8;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11142:8;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;;:::i;:::-;11118:69;;11215:16;11232:21;11215:38;;11280:15;11271:8;:24;11268:55;;;11306:15;11297:24;;11268:55;11337:16;11354:8;:26;;;11388:8;11354:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11337:62;;11418:11;11415:128;;;11484:8;11467:16;;:25;;;;:::i;:::-;11450:16;:42;;;;11415:128;10971:583;;;;;11615:10;;11592:21;:33;11589:162;;11641:39;11658:9;;;;;;;;;;;11669:10;;11641:8;:39::i;:::-;11729:10;;11712:16;;:27;;;;:::i;:::-;11695:16;:44;;;;11589:162;11841:19;11861:10;;11841:30;;11960:14;11975:13;:11;:13::i;:::-;11960:28;;12025:11;12003:21;:33;12000:567;;;12052:37;12069:6;12077:11;12052:8;:37::i;:::-;12138:11;12121:16;;:28;;;;:::i;:::-;12104:16;:45;;;;12242:12;;12224:16;;:30;12221:140;;12291:1;12277:12;;:15;12274:72;;;12295:49;12312:8;;;;;;;;;;;12322:21;12295:8;:49::i;:::-;12274:72;12221:140;12000:567;;;12472:1;12449:21;:24;12446:110;;12493:47;12510:6;12518:21;12493:8;:47::i;:::-;12446:110;12000:567;12632:1;12619:12;:14;;;;10461:2180;;:::o;20165:1757::-;20340:1;20334:5;:7;;;;20460:1;20448:11;:13;;;;20511:1;20498:12;:14;;;;20540:1;20523:16;:18;;;;20588:1;20577:10;:12;;;;20665:1;20649:15;:17;;;;20694:1;20677:16;:18;;;;20717:1;20706:10;:12;;;;20785:1;20772:12;:14;;;;20895:1;20880:14;:16;;;;20991:1;20975:15;:17;;;;21077:59;21066:10;:70;;;;21160:1;21147:12;:14;;;;21189:1;21172:16;:18;;;;21213:1;21201:11;:13;;;;21235:1;21225:9;:11;;;;21260:37;21247:12;:50;;;;21317:1;21308:8;:10;;;;21333:1;21329:3;:5;;;;21362;21347:14;;:20;;;;;;;;;;;;;;;;;;21459:5;21446:12;;:18;;;;;;;;;;;;;;;;;;21555:5;21539:15;;:21;;;;;;;;;;;;;;;;;;21585:5;21571:13;;:19;;;;;;;;;;;;;;;;;;21715:13;:11;:13::i;:::-;21705:9;;:23;;;;;;;;;;;;;;;;;;21841:13;:11;:13::i;:::-;21821:11;;:34;;;;;;;;;;;;;;;;;;20165:1757::o;10190:263::-;10288:15;;;;;;;;;;;10285:161;;;10370:15;;10353;;10337;:31;;;;:::i;:::-;10336:49;;;;:::i;:::-;10319:16;:66;;;;10285:161;;;10433:1;10416:16;:18;;;;10285:161;10190:263::o;14197:1012::-;14267:4;14250:21;;:15;;;;;;;;;;;:21;;;14242:30;;;;;;14446:22;14504;14527:20;:18;:20::i;:::-;14504:43;;14758:10;;14745:12;;14730:14;14719:10;;:25;;;;:::i;:::-;:38;;;;:::i;:::-;:49;;;;:::i;:::-;14701:14;:68;;;;:::i;:::-;14686:83;;14840:11;;14825:14;:26;14822:60;;;14869:11;;14854:26;;14822:60;14916:14;14904:11;;:26;;;;:::i;:::-;14892:11;:38;;;;15034:45;15064:14;15049;:29;;;;:::i;:::-;15034:14;:45::i;:::-;15114:15;;15101:10;;:28;;;;:::i;:::-;15090:10;:39;;;;15168:1;15153:12;;:16;;;;:::i;:::-;15140:12;:29;;;;14197:1012;;:::o;36492:229::-;36616:12;36634:3;:8;;36650:7;36634:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36615:47;;;36681:7;36673:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;36492:229;;;:::o;25486:5786::-;25524:4;25644:13;25658:5;25644:19;;26495:21;26489:5;;:27;26481:36;;;;;;26602:1;26584:16;;:19;;;;:::i;:::-;26567:16;:36;;;;26721:1;26702:16;;:20;;;;:::i;:::-;26691:10;:31;;;;26773:14;26788:5;;26773:20;;26824:18;26852:7;26843:6;:16;;;;:::i;:::-;26824:35;;26886:10;26877:6;:19;;;;:::i;:::-;26870:26;;26921:7;26914:6;:14;;;;:::i;:::-;26907:21;;26963:6;26950:10;:19;;;;:::i;:::-;26939:30;;27156:18;27185:5;27176:6;:14;;;;:::i;:::-;27156:34;;27217:10;27208:6;:19;;;;:::i;:::-;27201:26;;27252:5;27245:6;:12;;;;:::i;:::-;27238:19;;27292:5;27283:6;:14;;;;:::i;:::-;27278:3;:19;;;;27324:3;;27315:6;:12;;;;:::i;:::-;27308:19;;27352:5;27345:6;:12;;;;:::i;:::-;27338:19;;27388:16;27415:5;27406:6;:14;;;;:::i;:::-;27388:32;;27447:8;27438:6;:17;;;;:::i;:::-;27431:24;;27480:5;27473:6;:12;;;;:::i;:::-;27466:19;;27545:1;27529:15;:17;;;;27570:1;27560:8;:11;27557:39;;;27590:4;27574:15;:20;;;;27557:39;27644:1;27634:8;:11;27631:43;;;27664:8;27648:15;:24;;;;27631:43;27705:1;27695:8;:11;27692:45;;;27725:10;27709:15;:26;;;;27692:45;27769:1;27759:8;:11;27756:47;;;27789:12;27773:15;:28;;;;27756:47;27842:1;27832:8;:11;27829:42;;;27862:7;27846:15;:23;;;;27829:42;27904:1;27894:8;:11;27891:42;;;27924:7;27908:15;:23;;;;27891:42;27968:1;27958:8;:11;27955:43;;;27988:8;27972:15;:24;;;;27955:43;28044:1;28027:15;;:18;;28019:27;;;;;;28067:19;28097:5;28088:6;:14;;;;:::i;:::-;28067:35;;28220:1;28207:12;:14;;;;28334:1;28319:14;:16;;;;28436:13;:11;:13::i;:::-;28418:9;;:32;;;;;;;;;;;;;;;;;;28502:1;28490:11;:13;;;;28609:1;28596:12;:14;;;;28661:1;28652:8;:10;;;;28716:13;:11;:13::i;:::-;28706:9;;:23;;;;;;;;;;;;;;;;;;28882:3;28870:10;28868:1;:12;;;;:::i;:::-;28867:18;;;;:::i;:::-;28856:10;:29;;;;28997:1;28985:10;:13;28982:2087;;29241:10;29234:17;;29290:3;29281:6;:12;;;;:::i;:::-;29270:23;;29328:10;29319:6;:19;;;;:::i;:::-;29312:26;;29371:3;29364:6;:10;;;;:::i;:::-;29357:17;;29393:16;29419:3;29410:6;:12;;;;:::i;:::-;29393:29;;29556:19;29587:11;;;;;;;;;;;29556:43;;30309:22;30332:8;:22;;;30373:10;30356:16;;:27;;;;:::i;:::-;30386:8;30332:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30309:86;;30414:15;30465:11;30449:15;;:27;;;;:::i;:::-;30430:15;:47;;;;:::i;:::-;30414:63;;30496:18;30541:14;30528:10;;30515;:23;;;;:::i;:::-;:40;;;;:::i;:::-;30496:59;;30574:14;30589:13;:11;:13::i;:::-;30574:28;;30639:8;:19;;;30659:8;30677:4;30684:6;30700:4;30733;30757:10;30740:16;;:27;;;;:::i;:::-;30770:7;30779:10;30639:151;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30626:12;:164;;;;30826:26;30812:12;;:40;30809:62;;;30864:4;30855:13;;30809:62;30921:1;30907:12;;:15;30904:37;;;30934:4;30925:13;;30904:37;30977:5;30967:15;;:8;:15;;;30959:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;28982:2087;;;;;;;;;31054:1;31041:12;:14;;;;28982:2087;31226:12;;31213:10;;31200;:23;;;;:::i;:::-;:38;;;;:::i;:::-;31189:10;:49;;;;31256:8;31249:15;;;;;;;;25486:5786;:::o;32086:653::-;32226:5;32209:22;;:15;;;;;;;;;;;:22;;;32201:31;;;;;;32259:4;32243:15;;:20;;;;;;;;;;;;;;;;;;32287:1;32274:12;:14;;;;32316:1;32299:16;:18;;;;32338:1;32328:9;:11;;;;32362:16;;32350:11;:28;;;;32431:15;32415;:31;;;;32513:15;;32495;;:33;;;;:::i;:::-;32484:10;:44;;;;32622:11;;32603:16;;:30;;;;:::i;:::-;32588:14;:45;;;;32086:653::o;15215:989::-;15262:7;15281:18;15300:2;15281:21;;15444:4;15427:15;;:21;15424:40;;;15461:1;15450:12;;15424:40;15545:8;15528:15;;:25;15525:46;;;15566:3;15555:14;;15525:46;15609:10;15592:15;;:27;15589:47;;;15632:2;15621:13;;15589:47;15675:12;15658:15;;:29;15655:49;;;15700:2;15689:13;;15655:49;15750:7;15733:15;;:24;15730:44;;;15770:2;15759:13;;15730:44;15814:7;15797:15;;:24;15794:43;;;15834:1;15823:12;;15794:43;15879:8;15862:15;;:25;15859:44;;;15900:1;15889:12;;15859:44;15924:22;15965:3;15960;;15948:11;;:15;;;;:::i;:::-;15947:21;;;;:::i;:::-;15924:44;;16104:10;16089:14;:25;;;;:::i;:::-;16074:40;;16182:14;16175:21;;;;15215:989;:::o;12653:1468::-;13079:1;13072:5;;:8;;13071:45;;;;;13103:12;;13086:16;;:29;13071:45;13068:1046;;;13132:19;13171:11;;;;;;;;;;;13132:52;;13314:12;;13292:21;:34;13289:296;;;13363:1;13349:12;;:15;13346:224;;13388:13;13402:8;:19;;;13429:12;;13402:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13388:56;;13470:8;13467:63;;;13515:12;;13498:16;;:29;;;;:::i;:::-;13481:16;:46;;;;13467:63;13346:224;;13289:296;13631:14;13646:13;:11;:13::i;:::-;13631:28;;13745:14;13723:21;:36;13720:170;;;13775:40;13792:6;13800:14;13775:8;:40::i;:::-;13864:14;13847:16;;:31;;;;:::i;:::-;13830:16;:48;;;;13720:170;13967:10;;13944:21;:33;13941:162;;13993:39;14010:9;;;;;;;;;;;14021:10;;13993:8;:39::i;:::-;14081:10;;14064:16;;:27;;;;:::i;:::-;14047:16;:44;;;;13941:162;13068:1046;;;12653:1468;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:137::-;;386:6;380:13;371:22;;402:30;426:5;402:30;:::i;:::-;361:77;;;;:::o;444:139::-;;528:6;515:20;506:29;;544:33;571:5;544:33;:::i;:::-;496:87;;;;:::o;589:143::-;;677:6;671:13;662:22;;693:33;720:5;693:33;:::i;:::-;652:80;;;;:::o;738:284::-;;857:2;845:9;836:7;832:23;828:32;825:2;;;873:1;870;863:12;825:2;916:1;941:64;997:7;988:6;977:9;973:22;941:64;:::i;:::-;931:74;;887:128;815:207;;;;:::o;1028:278::-;;1144:2;1132:9;1123:7;1119:23;1115:32;1112:2;;;1160:1;1157;1150:12;1112:2;1203:1;1228:61;1281:7;1272:6;1261:9;1257:22;1228:61;:::i;:::-;1218:71;;1174:125;1102:204;;;;:::o;1312:262::-;;1420:2;1408:9;1399:7;1395:23;1391:32;1388:2;;;1436:1;1433;1426:12;1388:2;1479:1;1504:53;1549:7;1540:6;1529:9;1525:22;1504:53;:::i;:::-;1494:63;;1450:117;1378:196;;;;:::o;1580:284::-;;1699:2;1687:9;1678:7;1674:23;1670:32;1667:2;;;1715:1;1712;1705:12;1667:2;1758:1;1783:64;1839:7;1830:6;1819:9;1815:22;1783:64;:::i;:::-;1773:74;;1729:128;1657:207;;;;:::o;1870:407::-;;;1995:2;1983:9;1974:7;1970:23;1966:32;1963:2;;;2011:1;2008;2001:12;1963:2;2054:1;2079:53;2124:7;2115:6;2104:9;2100:22;2079:53;:::i;:::-;2069:63;;2025:117;2181:2;2207:53;2252:7;2243:6;2232:9;2228:22;2207:53;:::i;:::-;2197:63;;2152:118;1953:324;;;;;:::o;2283:552::-;;;;2425:2;2413:9;2404:7;2400:23;2396:32;2393:2;;;2441:1;2438;2431:12;2393:2;2484:1;2509:53;2554:7;2545:6;2534:9;2530:22;2509:53;:::i;:::-;2499:63;;2455:117;2611:2;2637:53;2682:7;2673:6;2662:9;2658:22;2637:53;:::i;:::-;2627:63;;2582:118;2739:2;2765:53;2810:7;2801:6;2790:9;2786:22;2765:53;:::i;:::-;2755:63;;2710:118;2383:452;;;;;:::o;2841:142::-;2944:32;2970:5;2944:32;:::i;:::-;2939:3;2932:45;2922:61;;:::o;2989:118::-;3076:24;3094:5;3076:24;:::i;:::-;3071:3;3064:37;3054:53;;:::o;3113:109::-;3194:21;3209:5;3194:21;:::i;:::-;3189:3;3182:34;3172:50;;:::o;3228:366::-;;3391:67;3455:2;3450:3;3391:67;:::i;:::-;3384:74;;3467:93;3556:3;3467:93;:::i;:::-;3585:2;3580:3;3576:12;3569:19;;3374:220;;;:::o;3600:366::-;;3763:67;3827:2;3822:3;3763:67;:::i;:::-;3756:74;;3839:93;3928:3;3839:93;:::i;:::-;3957:2;3952:3;3948:12;3941:19;;3746:220;;;:::o;3972:398::-;;4152:83;4233:1;4228:3;4152:83;:::i;:::-;4145:90;;4244:93;4333:3;4244:93;:::i;:::-;4362:1;4357:3;4353:11;4346:18;;4135:235;;;:::o;4376:118::-;4463:24;4481:5;4463:24;:::i;:::-;4458:3;4451:37;4441:53;;:::o;4500:379::-;;4706:147;4849:3;4706:147;:::i;:::-;4699:154;;4870:3;4863:10;;4688:191;;;:::o;4885:222::-;;5016:2;5005:9;5001:18;4993:26;;5029:71;5097:1;5086:9;5082:17;5073:6;5029:71;:::i;:::-;4983:124;;;;:::o;5113:254::-;;5260:2;5249:9;5245:18;5237:26;;5273:87;5357:1;5346:9;5342:17;5333:6;5273:87;:::i;:::-;5227:140;;;;:::o;5373:210::-;;5498:2;5487:9;5483:18;5475:26;;5511:65;5573:1;5562:9;5558:17;5549:6;5511:65;:::i;:::-;5465:118;;;;:::o;5589:419::-;;5793:2;5782:9;5778:18;5770:26;;5842:9;5836:4;5832:20;5828:1;5817:9;5813:17;5806:47;5870:131;5996:4;5870:131;:::i;:::-;5862:139;;5760:248;;;:::o;6014:419::-;;6218:2;6207:9;6203:18;6195:26;;6267:9;6261:4;6257:20;6253:1;6242:9;6238:17;6231:47;6295:131;6421:4;6295:131;:::i;:::-;6287:139;;6185:248;;;:::o;6439:222::-;;6570:2;6559:9;6555:18;6547:26;;6583:71;6651:1;6640:9;6636:17;6627:6;6583:71;:::i;:::-;6537:124;;;;:::o;6667:997::-;;6994:3;6983:9;6979:19;6971:27;;7008:71;7076:1;7065:9;7061:17;7052:6;7008:71;:::i;:::-;7089:72;7157:2;7146:9;7142:18;7133:6;7089:72;:::i;:::-;7171;7239:2;7228:9;7224:18;7215:6;7171:72;:::i;:::-;7253;7321:2;7310:9;7306:18;7297:6;7253:72;:::i;:::-;7335:73;7403:3;7392:9;7388:19;7379:6;7335:73;:::i;:::-;7418;7486:3;7475:9;7471:19;7462:6;7418:73;:::i;:::-;7501;7569:3;7558:9;7554:19;7545:6;7501:73;:::i;:::-;7584;7652:3;7641:9;7637:19;7628:6;7584:73;:::i;:::-;6961:703;;;;;;;;;;;:::o;7670:332::-;;7829:2;7818:9;7814:18;7806:26;;7842:71;7910:1;7899:9;7895:17;7886:6;7842:71;:::i;:::-;7923:72;7991:2;7980:9;7976:18;7967:6;7923:72;:::i;:::-;7796:206;;;;;:::o;8008:147::-;;8146:3;8131:18;;8121:34;;;;:::o;8161:169::-;;8279:6;8274:3;8267:19;8319:4;8314:3;8310:14;8295:29;;8257:73;;;;:::o;8336:305::-;;8395:20;8413:1;8395:20;:::i;:::-;8390:25;;8429:20;8447:1;8429:20;:::i;:::-;8424:25;;8583:1;8515:66;8511:74;8508:1;8505:81;8502:2;;;8589:18;;:::i;:::-;8502:2;8633:1;8630;8626:9;8619:16;;8380:261;;;;:::o;8647:185::-;;8704:20;8722:1;8704:20;:::i;:::-;8699:25;;8738:20;8756:1;8738:20;:::i;:::-;8733:25;;8777:1;8767:2;;8782:18;;:::i;:::-;8767:2;8824:1;8821;8817:9;8812:14;;8689:143;;;;:::o;8838:348::-;;8901:20;8919:1;8901:20;:::i;:::-;8896:25;;8935:20;8953:1;8935:20;:::i;:::-;8930:25;;9123:1;9055:66;9051:74;9048:1;9045:81;9040:1;9033:9;9026:17;9022:105;9019:2;;;9130:18;;:::i;:::-;9019:2;9178:1;9175;9171:9;9160:20;;8886:300;;;;:::o;9192:191::-;;9252:20;9270:1;9252:20;:::i;:::-;9247:25;;9286:20;9304:1;9286:20;:::i;:::-;9281:25;;9325:1;9322;9319:8;9316:2;;;9330:18;;:::i;:::-;9316:2;9375:1;9372;9368:9;9360:17;;9237:146;;;;:::o;9389:96::-;;9455:24;9473:5;9455:24;:::i;:::-;9444:35;;9434:51;;;:::o;9491:104::-;;9565:24;9583:5;9565:24;:::i;:::-;9554:35;;9544:51;;;:::o;9601:90::-;;9678:5;9671:13;9664:21;9653:32;;9643:48;;;:::o;9697:126::-;;9774:42;9767:5;9763:54;9752:65;;9742:81;;;:::o;9829:77::-;;9895:5;9884:16;;9874:32;;;:::o;9912:233::-;;9974:24;9992:5;9974:24;:::i;:::-;9965:33;;10020:66;10013:5;10010:77;10007:2;;;10090:18;;:::i;:::-;10007:2;10137:1;10130:5;10126:13;10119:20;;9955:190;;;:::o;10151:176::-;;10200:20;10218:1;10200:20;:::i;:::-;10195:25;;10234:20;10252:1;10234:20;:::i;:::-;10229:25;;10273:1;10263:2;;10278:18;;:::i;:::-;10263:2;10319:1;10316;10312:9;10307:14;;10185:142;;;;:::o;10333:180::-;10381:77;10378:1;10371:88;10478:4;10475:1;10468:15;10502:4;10499:1;10492:15;10519:180;10567:77;10564:1;10557:88;10664:4;10661:1;10654:15;10688:4;10685:1;10678:15;10705:165;10845:17;10841:1;10833:6;10829:14;10822:41;10811:59;:::o;10876:170::-;11016:22;11012:1;11004:6;11000:14;10993:46;10982:64;:::o;11052:114::-;11158:8;:::o;11172:122::-;11245:24;11263:5;11245:24;:::i;:::-;11238:5;11235:35;11225:2;;11284:1;11281;11274:12;11225:2;11215:79;:::o;11300:116::-;11370:21;11385:5;11370:21;:::i;:::-;11363:5;11360:32;11350:2;;11406:1;11403;11396:12;11350:2;11340:76;:::o;11422:122::-;11495:24;11513:5;11495:24;:::i;:::-;11488:5;11485:35;11475:2;;11534:1;11531;11524:12;11475:2;11465:79;:::o

Swarm Source

ipfs://2c3df9072463e2e10906999dfc988e4b685042b28a1bce7b475aa7202c360c37

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.