ETH Price: $2,055.36 (-1.53%)

Contract

0x8B78bF6C12E35B9dFeE7a97eB8899eEF615a0b83
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Owner109041082020-09-21 6:28:332008 days ago1600669713IN
0x8B78bF6C...F615a0b83
0 ETH0.00309312108
Batch Relay107650982020-08-30 23:01:342030 days ago1598828494IN
0x8B78bF6C...F615a0b83
0 ETH0.00830502116
Create Escrow107650782020-08-30 22:58:082030 days ago1598828288IN
0x8B78bF6C...F615a0b83
0 ETH0.00784519119
Batch Relay106396962020-08-11 16:27:012049 days ago1597163221IN
0x8B78bF6C...F615a0b83
0 ETH0.01074285150
Create Escrow106396872020-08-11 16:25:322049 days ago1597163132IN
0x8B78bF6C...F615a0b83
0 ETH0.0098925150
Batch Relay105891842020-08-03 21:12:512057 days ago1596489171IN
0x8B78bF6C...F615a0b83
0 ETH0.0032265957
Create Escrow105891492020-08-03 21:06:252057 days ago1596488785IN
0x8B78bF6C...F615a0b83
0 ETH0.0036925256
Batch Relay105891322020-08-03 21:01:522057 days ago1596488512IN
0x8B78bF6C...F615a0b83
0 ETH0.0040815957
Create Escrow105890822020-08-03 20:49:442057 days ago1596487784IN
0x8B78bF6C...F615a0b83
0 ETH0.0037716557.2
Batch Relay105695592020-07-31 20:33:002060 days ago1596227580IN
0x8B78bF6C...F615a0b83
0 ETH0.0028303550
Create Escrow105695422020-07-31 20:29:402060 days ago1596227380IN
0x8B78bF6C...F615a0b83
0 ETH0.003296350
Batch Relay105694262020-07-31 20:07:482060 days ago1596226068IN
0x8B78bF6C...F615a0b83
0 ETH0.0031140454.99999999
Create Escrow105693942020-07-31 20:01:072060 days ago1596225667IN
0x8B78bF6C...F615a0b83
0 ETH0.0037179356.375
Batch Relay105693312020-07-31 19:48:382060 days ago1596224918IN
0x8B78bF6C...F615a0b83
0 ETH0.004153258
Create Escrow105693082020-07-31 19:44:122060 days ago1596224652IN
0x8B78bF6C...F615a0b83
0 ETH0.0039562860
Batch Relay105572512020-07-29 22:35:372062 days ago1596062137IN
0x8B78bF6C...F615a0b83
0 ETH0.0025467745
Create Escrow105572372020-07-29 22:31:532062 days ago1596061913IN
0x8B78bF6C...F615a0b83
0 ETH0.0029672145
Batch Relay105571492020-07-29 22:11:302062 days ago1596060690IN
0x8B78bF6C...F615a0b83
0 ETH0.0025473145
Create Escrow105571222020-07-29 22:05:552062 days ago1596060355IN
0x8B78bF6C...F615a0b83
0 ETH0.0029672145
Batch Relay105570762020-07-29 21:57:002062 days ago1596059820IN
0x8B78bF6C...F615a0b83
0 ETH0.0025473145
Create Escrow105570662020-07-29 21:54:132062 days ago1596059653IN
0x8B78bF6C...F615a0b83
0 ETH0.0029672145
Batch Relay105570352020-07-29 21:47:222062 days ago1596059242IN
0x8B78bF6C...F615a0b83
0 ETH0.0025473145
Create Escrow105570092020-07-29 21:40:322062 days ago1596058832IN
0x8B78bF6C...F615a0b83
0 ETH0.0029672145
Batch Relay105567142020-07-29 20:31:252062 days ago1596054685IN
0x8B78bF6C...F615a0b83
0 ETH0.0034657748.4
Create Escrow105566892020-07-29 20:27:412062 days ago1596054461IN
0x8B78bF6C...F615a0b83
0 ETH0.003296950
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LocalCoinSwapDaiEscrow

Compiler Version
v0.5.2+commit.1df8f40c

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-01-28
*/

/**
 * Tether trading contract
*/

pragma solidity ^0.5.0;

contract DaiERC20 {
    function transfer(address _to, uint _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);
    function approve(address _spender, uint _value) public returns (bool success);
}

contract LocalCoinSwapDaiEscrow {
    /***********************
    +   Global settings   +
    ***********************/

    address public arbitrator;
    address public owner;
    address public relayer;
    uint256 public feesAvailableForWithdraw;
    // The contract address of the ERC20 token handled by this smart contract, can only be set once
    DaiERC20 public tokenContract;
    // The minimum value under which we will not accept the creation of escrow
    uint16 public minimumValue = 1;
    uint32 public requestCancellationMinimumTime = 2 hours;

    /***********************
    +   Escrow Structure   +
    ***********************/

    struct Escrow {
        // Set so we know the trade has already been created
        bool exists;
        uint32 sellerCanCancelAfter;
        // The total cost of gas spent by relaying parties. This amount will be
        //   emmitted to us once the escrow is finished for accounting purposes.
        uint128 totalGasFeesSpentByRelayer;
    }
    // Mapping of active trades. Key is a hash of the trade data
    mapping (bytes32 => Escrow) public escrows;

    /***********************
    +  Instruction types  +
    ***********************/

    // Called when the buyer marks payment as sent. Locks funds in escrow
    uint8 constant INSTRUCTION_SELLER_CANNOT_CANCEL = 0x01;
    // Buyer cancelling
    uint8 constant INSTRUCTION_BUYER_CANCEL = 0x02;
    // Seller cancelling
    uint8 constant INSTRUCTION_SELLER_CANCEL = 0x03;
    // Seller requesting to cancel. Begins a window for buyer to object
    uint8 constant INSTRUCTION_SELLER_REQUEST_CANCEL = 0x04;
    // Seller releasing funds to the buyer
    uint8 constant INSTRUCTION_RELEASE = 0x05;
    // Either party permitting the arbitrator to resolve a dispute
    uint8 constant INSTRUCTION_RESOLVE = 0x06;

    /***********************
    +       Events        +
    ***********************/

    event Created(bytes32 _tradeHash);
    event SellerCancelDisabled(bytes32 _tradeHash);
    event SellerRequestedCancel(bytes32 _tradeHash);
    event CancelledBySeller(bytes32 _tradeHash, uint128 totalGasFeesSpentByRelayer);
    event CancelledByBuyer(bytes32 _tradeHash, uint128 totalGasFeesSpentByRelayer);
    event Released(bytes32 _tradeHash, uint128 totalGasFeesSpentByRelayer);
    event DisputeResolved(bytes32 _tradeHash, uint128 totalGasFeesSpentByRelayer);

    /***********************
    +     Constructor      +
    ***********************/

    constructor(address initialAddress, DaiERC20 daiAddress) public {
        owner = initialAddress;
        arbitrator = initialAddress;
        relayer = initialAddress;
        tokenContract = daiAddress;
    }

    /***********************
    +    Handle Trades     +
    ***********************/

    /// @notice Create and fund a new escrow.
    /// @param _tradeID The unique ID of the trade, generated by localcoinswap.com
    /// @param _seller The selling party
    /// @param _buyer The buying party
    /// @param _value The amount of the escrow, exclusive of the fee
    /// @param _fee localcoinswap's commission in 1/10000ths
    /// @param _paymentWindowInSeconds The time in seconds from escrow creation that the seller can cancel after
    /// @param _expiry This transaction must be created before this time
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    function createEscrow(
      /**
       * Create a new escrow and add it to `escrows`.
       * _tradeHash is created by hashing _tradeID, _seller, _buyer, _value and _fee variables. These variables must be supplied on future contract calls.
       * v, r and s is the signature data supplied from the api. The sig is keccak256(_tradeHash, _paymentWindowInSeconds, _expiry).
       */
      bytes16 _tradeID, // The unique ID of the trade, generated by us
      address _seller, // The selling party of the trade
      address _buyer, // The buying party of the trade
      uint256 _value, // The token amount being held in escrow
      uint16 _fee, // Our fee in 1/10000ths of a token
      uint32 _paymentWindowInSeconds, // The time in seconds from contract creation that the buyer has to mark as paid
      uint32 _expiry, // Provided by us. This transaction must be created before this time.
      uint8 _v, // Signature value
      bytes32 _r, // Signature value
      bytes32 _s // Signature value
    ) external payable {
        bytes32 _tradeHash = keccak256(abi.encodePacked(_tradeID, _seller, _buyer, _value, _fee));
        require(!escrows[_tradeHash].exists, "Trade already exists in escrow mapping");
        bytes32 _invitationHash = keccak256(abi.encodePacked(
            _tradeHash,
            _paymentWindowInSeconds,
            _expiry
        ));
        require(_value > minimumValue, "Escrow value must be greater than minimum value"); // Check escrow value is greater than minimum value
        require(block.timestamp < _expiry, "Trade has already expired"); // solium-disable-line
        require(recoverAddress(_invitationHash, _v, _r, _s) == relayer, "Transaction signature did not come from relayer");
        tokenContract.transferFrom(msg.sender, address(this), _value);
        uint32 _sellerCanCancelAfter = _paymentWindowInSeconds == 0 ? 1 : uint32(block.timestamp) + _paymentWindowInSeconds; // solium-disable-line
        escrows[_tradeHash] = Escrow(true, _sellerCanCancelAfter, 0);
        emit Created(_tradeHash);
    }

    /// @notice Release ether in escrow to the buyer. Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function release(
        bytes16 _tradeID,
        address payable _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee
    ) external returns (bool){
        require(msg.sender == _seller, "Must be seller");
        return doRelease(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    uint16 constant GAS_doRelease = 46588;
    /// @notice Release escrow to the buyer. This completes it and removes it from the mapping.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doRelease(
        bytes16 _tradeID,
        address payable _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) return false;
        uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer + (msg.sender == relayer
                ? (GAS_doRelease + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit Released(_tradeHash, _gasFees);
        transferMinusFees(_buyer, _value, _fee);
        return true;
    }

    uint16 constant GAS_doResolveDispute = 36100;
    /// @notice Called by the arbitrator to resolve a dispute. Requires a signature from either party.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    /// @param _buyerPercent What % should be distributed to the buyer (this is usually 0 or 100)
    function resolveDispute(
        bytes16 _tradeID,
        address payable _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee,
        uint8 _v,
        bytes32 _r,
        bytes32 _s,
        uint8 _buyerPercent
    ) external onlyArbitrator {
        address _signature = recoverAddress(keccak256(abi.encodePacked(
            _tradeID,
            INSTRUCTION_RESOLVE
        )), _v, _r, _s);
        require(_signature == _buyer || _signature == _seller, "Must be buyer or seller");

        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        require(_escrow.exists, "Escrow does not exist");
        require(_buyerPercent <= 100, "_buyerPercent must be 100 or lower");

        _escrow.totalGasFeesSpentByRelayer += (GAS_doResolveDispute * uint128(tx.gasprice));

        delete escrows[_tradeHash];
        emit DisputeResolved(_tradeHash, _escrow.totalGasFeesSpentByRelayer);
        if (_buyerPercent > 0) {
          // If dispute goes to buyer take the fee
          uint256 _totalFees = (_value * _fee / 10000);
          // Prevent underflow
          require(_value * _buyerPercent / 100 - _totalFees <= _value, "Overflow error");
          feesAvailableForWithdraw += _totalFees;
          tokenContract.transfer(_buyer, _value * _buyerPercent / 100 - _totalFees);
        }
        if (_buyerPercent < 100) {
          tokenContract.transfer(_seller, _value * (100 - _buyerPercent) / 100);
        }
    }

    /// @notice Disable the seller from cancelling (i.e. "mark as paid"). Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function disableSellerCancel(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee
    ) external returns (bool) {
        require(msg.sender == _buyer, "Must be buyer");
        return doDisableSellerCancel(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    /// @notice Cancel the escrow as a buyer. Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function buyerCancel(
      bytes16 _tradeID,
      address payable _seller,
      address payable _buyer,
      uint256 _value,
      uint16 _fee
    ) external returns (bool) {
        require(msg.sender == _buyer, "Must be buyer");
        return doBuyerCancel(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    /// @notice Request to cancel as a seller. Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function sellerRequestCancel(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee
    ) external returns (bool) {
        require(msg.sender == _seller, "Must be seller");
        return doSellerRequestCancel(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    /// @notice Increase the amount of gas used during the trade, tracking is for accounting purposes
    /// @param _tradeHash Trade hash
    /// @param _gas Gas cost
    function increaseGasSpent(bytes32 _tradeHash, uint128 _gas) private {
        escrows[_tradeHash].totalGasFeesSpentByRelayer += _gas * uint128(tx.gasprice);
    }

    /// @notice Transfer the value of an escrow, minus the fees. We do not explicity handle gas costs of relayer
    /// @param _to Recipient address
    /// @param _value Value of the transfer
    /// @param _fee Commission in 1/10000ths
    function transferMinusFees(
        address payable _to,
        uint256 _value,
        uint16 _fee
    ) private {
        uint256 _totalFees = (_value * _fee / 10000);
        // Prevent underflow
        if(_value - _totalFees > _value) {
            return;
        }
        // Add fees to the pot for localcoinswap to withdraw
        feesAvailableForWithdraw += _totalFees;
        tokenContract.transfer(_to, _value - _totalFees);
    }

    uint16 constant GAS_doDisableSellerCancel = 28944;
    /// @notice Prevents the seller from cancelling an escrow. Used to "mark as paid" by the buyer.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doDisableSellerCancel(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) return false;
        if(_escrow.sellerCanCancelAfter == 0) return false;
        escrows[_tradeHash].sellerCanCancelAfter = 0;
        emit SellerCancelDisabled(_tradeHash);
        if (msg.sender == relayer) {
          increaseGasSpent(_tradeHash, GAS_doDisableSellerCancel + _additionalGas);
        }
        return true;
    }

    uint16 constant GAS_doBuyerCancel = 46255;
    /// @notice Cancels the trade and returns the ether to the seller. Can only be called the buyer.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doBuyerCancel(
        bytes16 _tradeID,
        address payable _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        require(_escrow.exists, "Escrow does not exist");
        if (!_escrow.exists) {
            return false;
        }
        uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer + (msg.sender == relayer
                ? (GAS_doBuyerCancel + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit CancelledByBuyer(_tradeHash, _gasFees);
        transferMinusFees(_seller, _value, 0);
        return true;
    }

    uint16 constant GAS_doSellerCancel = 46815;
    /// @notice Returns the ether in escrow to the seller. Called by the seller. Sometimes unavailable.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doSellerCancel(
        bytes16 _tradeID,
        address payable _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) {
            return false;
        }
        if(_escrow.sellerCanCancelAfter <= 1 || _escrow.sellerCanCancelAfter > block.timestamp) { // solium-disable-line
            return false;
        }
        uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer + (msg.sender == relayer
                ? (GAS_doSellerCancel + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit CancelledBySeller(_tradeHash, _gasFees);
        transferMinusFees(_seller, _value, 0);
        return true;
    }

    uint16 constant GAS_doSellerRequestCancel = 29507;
    /// @notice Request to cancel. Used if the buyer is unresponsive. Begins a countdown timer.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doSellerRequestCancel(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        // Called on unlimited payment window trades where the buyer is not responding
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) {
            return false;
        }
        if(_escrow.sellerCanCancelAfter != 1) {
            return false;
        }
        escrows[_tradeHash].sellerCanCancelAfter = uint32(block.timestamp) // solium-disable-line
            + requestCancellationMinimumTime;
        emit SellerRequestedCancel(_tradeHash);
        if (msg.sender == relayer) {
          increaseGasSpent(_tradeHash, GAS_doSellerRequestCancel + _additionalGas);
        }
        return true;
    }

    /***********************
    +        Relays        +
    ***********************/

    /// @notice Relay multiple signed instructions from parties of escrows.
    /// @param _tradeID List of _tradeID values
    /// @param _seller List of _seller values
    /// @param _buyer List of _buyer values
    /// @param _value List of _value values
    /// @param _fee List of _fee values
    /// @param _maximumGasPrice List of _maximumGasPrice values
    /// @param _v List of signature "v" components
    /// @param _r List of signature "r" components
    /// @param _s List of signature "s" components
    /// @param _instructionByte List of _instructionByte values
    /// @return bool List of results
    uint16 constant GAS_batchRelayBaseCost = 28500;
    function batchRelay(
        bytes16[] memory _tradeID,
        address payable[] memory _seller,
        address payable[] memory _buyer,
        uint256[] memory _value,
        uint16[] memory _fee,
        uint128[] memory _maximumGasPrice,
        uint8[] memory _v,
        bytes32[] memory _r,
        bytes32[] memory _s,
        uint8[] memory _instructionByte
    ) public returns (bool[] memory) {
        bool[] memory _results = new bool[](_tradeID.length);
        uint128 _additionalGas = uint128(msg.sender == relayer ? GAS_batchRelayBaseCost / _tradeID.length : 0);
        for (uint8 i = 0; i < _tradeID.length; i++) {
            _results[i] = relay(
                _tradeID[i],
                _seller[i],
                _buyer[i],
                _value[i],
                _fee[i],
                _maximumGasPrice[i],
                _v[i],
                _r[i],
                _s[i],
                _instructionByte[i],
                _additionalGas
            );
        }
        return _results;
    }

    /// @notice Relay a signed instruction from a party of an escrow.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _maximumGasPrice Maximum gas price permitted for the relayer (set by the instructor)
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function relay(
        bytes16 _tradeID,
        address payable _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _maximumGasPrice,
        uint8 _v,
        bytes32 _r,
        bytes32 _s,
        uint8 _instructionByte,
        uint128 _additionalGas
    ) private returns (bool) {
        address _relayedSender = getRelayedSender(
            _tradeID,
            _instructionByte,
            _maximumGasPrice,
            _v,
            _r,
            _s
        );
        if (_relayedSender == _buyer) {
            // Buyer's instructions:
            if (_instructionByte == INSTRUCTION_SELLER_CANNOT_CANCEL) {
                // Disable seller from cancelling
                return doDisableSellerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            } else if (_instructionByte == INSTRUCTION_BUYER_CANCEL) {
                // Cancel
                return doBuyerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            }
        } else if (_relayedSender == _seller) {
            // Seller's instructions:
            if (_instructionByte == INSTRUCTION_RELEASE) {
                // Release
                return doRelease(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            } else if (_instructionByte == INSTRUCTION_SELLER_CANCEL) {
                // Cancel
                return doSellerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            } else if (_instructionByte == INSTRUCTION_SELLER_REQUEST_CANCEL){
                // Request to cancel
                return doSellerRequestCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            }
        } else {
            require(msg.sender == _seller, "Unrecognised party");
            return false;
        }
    }

    /***********************
    +        Setters       +
    ***********************/

    /// @notice Set the arbitrator to a new address. Only the owner can call this.
    /// @param _newArbitrator Address of the replacement arbitrator
    function setArbitrator(address _newArbitrator) external onlyOwner {
        /**
         * Set the arbitrator to a new address. Only the owner can call this.
         * @param address _newArbitrator
         */
        arbitrator = _newArbitrator;
    }

    /// @notice Change the owner to a new address. Only the owner can call this.
    /// @param _newOwner Address of the replacement owner
    function setOwner(address _newOwner) external onlyOwner {
        /**
         * Change the owner to a new address. Only the owner can call this.
         * @param address _newOwner
         */
        owner = _newOwner;
    }

    /// @notice Change the relayer to a new address. Only the owner can call this.
    /// @param _newRelayer Address of the replacement relayer
    function setRelayer(address _newRelayer) external onlyOwner {
        /**
         * Change the relayer to a new address. Only the owner can call this.
         * @param address _newRelayer
         */
        relayer = _newRelayer;
    }

    /// @notice Change the minimum escrow value. Only the owner can call this.
    /// @param _newMinimumValue uint16 of the new minimum value
    function setMinimumValue(uint16 _newMinimumValue) external onlyOwner {
        /**
         * Change the value to a new minimum value. Only the owner can call this.
         * @param uint16 _newMinimumValue
         */
        minimumValue = _newMinimumValue;
    }

    /// @notice Change the requestCancellationMinimumTime. Only the owner can call this.
    /// @param _newRequestCancellationMinimumTime Replacement
    function setRequestCancellationMinimumTime(uint32 _newRequestCancellationMinimumTime) external onlyOwner {
        /**
         * Change the requestCancellationMinimumTime. Only the owner can call this.
         * @param uint32 _newRequestCancellationMinimumTime
         */
        requestCancellationMinimumTime = _newRequestCancellationMinimumTime;
    }

    /***********************
    +   Helper Functions   +
    ***********************/

    /// @notice Withdraw fees collected by the contract. Only the owner can call this.
    /// @param _to Address to withdraw fees in to
    /// @param _amount Amount to withdraw
    function withdrawFees(address payable _to, uint256 _amount) external onlyOwner {
        // This check also prevents underflow
        require(_amount <= feesAvailableForWithdraw, "Amount is higher than amount available");
        feesAvailableForWithdraw -= _amount;
        tokenContract.transfer(_to, _amount);
    }

    /// @notice Hashes the values and returns the matching escrow object and trade hash.
    /// @dev Returns an empty escrow struct and 0 _tradeHash if not found.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return Escrow
    function getEscrowAndHash(
      /**
       * Hashes the values and returns the matching escrow object and trade hash.
       * Returns an empty escrow struct and 0 _tradeHash if not found
       */
      bytes16 _tradeID,
      address _seller,
      address _buyer,
      uint256 _value,
      uint16 _fee
    ) private view returns (Escrow storage, bytes32) {
        bytes32 _tradeHash = keccak256(abi.encodePacked(_tradeID, _seller, _buyer, _value, _fee));
        return (escrows[_tradeHash], _tradeHash);
    }

    /// @notice Returns an empty escrow struct and 0 _tradeHash if not found.
    /// @param _h Data to be hashed
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    /// @return address
    function recoverAddress(
        bytes32 _h,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) private pure returns (address) {
        bytes memory _prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 _prefixedHash = keccak256(abi.encodePacked(_prefix, _h));
        return ecrecover(_prefixedHash, _v, _r, _s);
    }

    /// @notice Get the sender of the signed instruction.
    /// @param _tradeID Identifier of the trade
    /// @param _instructionByte Identifier of the instruction
    /// @param _maximumGasPrice Maximum gas price permitted by the sender
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    /// @return address
    function getRelayedSender(
      bytes16 _tradeID, // The unique ID of the trade, generated by us
      uint8 _instructionByte, // The desired action of the user, matching an ACTION_* constant
      uint128 _maximumGasPrice, // The maximum gas price the user is willing to pay
      uint8 _v, // Signature value
      bytes32 _r, // Signature value
      bytes32 _s // Signature value
    ) private view returns (address) {
        bytes32 _hash = keccak256(abi.encodePacked(_tradeID, _instructionByte, _maximumGasPrice));
        require(tx.gasprice < _maximumGasPrice, "Gas price is higher than maximum gas price");
        return recoverAddress(_hash, _v, _r, _s);
    }

    /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens.
    /// @param _tokenContract Token contract
    /// @param _transferTo Recipient
    /// @param _value Value
    function transferToken(DaiERC20 _tokenContract, address _transferTo, uint256 _value) external onlyOwner {
        /**
         * If ERC20 tokens are sent to this contract, they will be trapped forever.
         * This function is way for us to withdraw them so we can get them back to their rightful owner
         */
         _tokenContract.transfer(_transferTo, _value);
    }

    /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens.
    /// @param _tokenContract Token contract
    /// @param _transferTo Recipient
    /// @param _transferFrom Sender
    /// @param _value Value
    function transferTokenFrom(DaiERC20 _tokenContract, address _transferTo, address _transferFrom, uint256 _value) external onlyOwner {
        /**
         * If ERC20 tokens are sent to this contract, they will be trapped forever.
         * This function is way for us to withdraw them so we can get them back to their rightful owner
         */
         _tokenContract.transferFrom(_transferTo, _transferFrom, _value);
    }

    /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens.
    /// @param _tokenContract Token contract
    /// @param _spender Spender address
    /// @param _value Value
    function approveToken(DaiERC20 _tokenContract, address _spender, uint256 _value) external onlyOwner {
        /**
         * If ERC20 tokens are sent to this contract, they will be trapped forever.
         * This function is way for us to withdraw them so we can get them back to their rightful owner
         */
         _tokenContract.approve(_spender, _value);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the current owner can change the owner");
        _;
    }

    modifier onlyArbitrator() {
        require(msg.sender == arbitrator, "Only the current owner can change the arbitrator");
        _;
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_newRequestCancellationMinimumTime","type":"uint32"}],"name":"setRequestCancellationMinimumTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newMinimumValue","type":"uint16"}],"name":"setMinimumValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"},{"name":"_buyerPercent","type":"uint8"}],"name":"resolveDispute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"buyerCancel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"escrows","outputs":[{"name":"exists","type":"bool"},{"name":"sellerCanCancelAfter","type":"uint32"},{"name":"totalGasFeesSpentByRelayer","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"requestCancellationMinimumTime","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"disableSellerCancel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRelayer","type":"address"}],"name":"setRelayer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"sellerRequestCancel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"arbitrator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"relayer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minimumValue","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16[]"},{"name":"_seller","type":"address[]"},{"name":"_buyer","type":"address[]"},{"name":"_value","type":"uint256[]"},{"name":"_fee","type":"uint16[]"},{"name":"_maximumGasPrice","type":"uint128[]"},{"name":"_v","type":"uint8[]"},{"name":"_r","type":"bytes32[]"},{"name":"_s","type":"bytes32[]"},{"name":"_instructionByte","type":"uint8[]"}],"name":"batchRelay","outputs":[{"name":"","type":"bool[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newArbitrator","type":"address"}],"name":"setArbitrator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feesAvailableForWithdraw","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"},{"name":"_transferTo","type":"address"},{"name":"_transferFrom","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"release","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"},{"name":"_paymentWindowInSeconds","type":"uint32"},{"name":"_expiry","type":"uint32"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"createEscrow","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"},{"name":"_transferTo","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"initialAddress","type":"address"},{"name":"daiAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tradeHash","type":"bytes32"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tradeHash","type":"bytes32"}],"name":"SellerCancelDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tradeHash","type":"bytes32"}],"name":"SellerRequestedCancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tradeHash","type":"bytes32"},{"indexed":false,"name":"totalGasFeesSpentByRelayer","type":"uint128"}],"name":"CancelledBySeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tradeHash","type":"bytes32"},{"indexed":false,"name":"totalGasFeesSpentByRelayer","type":"uint128"}],"name":"CancelledByBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tradeHash","type":"bytes32"},{"indexed":false,"name":"totalGasFeesSpentByRelayer","type":"uint128"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tradeHash","type":"bytes32"},{"indexed":false,"name":"totalGasFeesSpentByRelayer","type":"uint128"}],"name":"DisputeResolved","type":"event"}]

6080604052600480547401000000000000000000000000000000000000000060a060020a61ffff02199091161760b060020a63ffffffff021916771c200000000000000000000000000000000000000000000017905534801561006157600080fd5b50604051604080612d038339810180604052604081101561008157600080fd5b50805160209091015160018054600160a060020a03938416600160a060020a031991821681179092556000805482168317905560028054821690921790915560048054939092169216919091179055612c24806100df6000396000f3fe60806040526004361061014f5760003560e060020a900480638406c079116100ba578063da3e339711610073578063da3e339714610af7578063de5785d514610b3a578063e599490514610b61578063e9600f1214610baa578063f1e03d6714610c08578063f5537ede14610c865761014f565b80638406c07914610490578063849aaf8e146104a55780638da5cb5b146104d15780638eb4e0ad146104e6578063ad3b1b4714610a8b578063b0eefabe14610ac45761014f565b806355a373d61161010c57806355a373d61461032d57806357938b2a1461035e5780635c810f091461038c5780636548e9bc146103ea5780636b4078371461041d5780636cc6cde11461047b5761014f565b806305b64993146101545780630d98ed3b1461018657806313af4035146101b457806324943c7d146101e75780632cc9636c146102635780632d83549c146102d5575b600080fd5b34801561016057600080fd5b506101846004803603602081101561017757600080fd5b503563ffffffff16610cc9565b005b34801561019257600080fd5b50610184600480360360208110156101a957600080fd5b503561ffff16610d61565b3480156101c057600080fd5b50610184600480360360208110156101d757600080fd5b5035600160a060020a0316610df1565b3480156101f357600080fd5b50610184600480360361012081101561020b57600080fd5b506001608060020a031981351690600160a060020a03602082013581169160408101359091169060608101359061ffff6080820135169060ff60a082013581169160c08101359160e082013591610100013516610e6c565b34801561026f57600080fd5b506102c1600480360360a081101561028657600080fd5b5080356001608060020a031916906020810135600160a060020a03908116916040810135909116906060810135906080013561ffff166112f2565b604080519115158252519081900360200190f35b3480156102e157600080fd5b506102ff600480360360208110156102f857600080fd5b503561136d565b60408051931515845263ffffffff90921660208401526001608060020a031682820152519081900360600190f35b34801561033957600080fd5b506103426113a2565b60408051600160a060020a039092168252519081900360200190f35b34801561036a57600080fd5b506103736113b1565b6040805163ffffffff9092168252519081900360200190f35b34801561039857600080fd5b506102c1600480360360a08110156103af57600080fd5b5080356001608060020a031916906020810135600160a060020a03908116916040810135909116906060810135906080013561ffff166113d7565b3480156103f657600080fd5b506101846004803603602081101561040d57600080fd5b5035600160a060020a0316611448565b34801561042957600080fd5b506102c1600480360360a081101561044057600080fd5b5080356001608060020a031916906020810135600160a060020a03908116916040810135909116906060810135906080013561ffff166114c3565b34801561048757600080fd5b50610342611534565b34801561049c57600080fd5b50610342611543565b3480156104b157600080fd5b506104ba611552565b6040805161ffff9092168252519081900360200190f35b3480156104dd57600080fd5b50610342611574565b3480156104f257600080fd5b50610a3b600480360361014081101561050a57600080fd5b81019060208101813564010000000081111561052557600080fd5b82018360208201111561053757600080fd5b8035906020019184602083028401116401000000008311171561055957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156105a957600080fd5b8201836020820111156105bb57600080fd5b803590602001918460208302840111640100000000831117156105dd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561062d57600080fd5b82018360208201111561063f57600080fd5b8035906020019184602083028401116401000000008311171561066157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156106b157600080fd5b8201836020820111156106c357600080fd5b803590602001918460208302840111640100000000831117156106e557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561073557600080fd5b82018360208201111561074757600080fd5b8035906020019184602083028401116401000000008311171561076957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156107b957600080fd5b8201836020820111156107cb57600080fd5b803590602001918460208302840111640100000000831117156107ed57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561083d57600080fd5b82018360208201111561084f57600080fd5b8035906020019184602083028401116401000000008311171561087157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156108c157600080fd5b8201836020820111156108d357600080fd5b803590602001918460208302840111640100000000831117156108f557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561094557600080fd5b82018360208201111561095757600080fd5b8035906020019184602083028401116401000000008311171561097957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156109c957600080fd5b8201836020820111156109db57600080fd5b803590602001918460208302840111640100000000831117156109fd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611583945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a77578181015183820152602001610a5f565b505050509050019250505060405180910390f35b348015610a9757600080fd5b5061018460048036036040811015610aae57600080fd5b50600160a060020a038135169060200135611743565b348015610ad057600080fd5b5061018460048036036020811015610ae757600080fd5b5035600160a060020a031661187f565b348015610b0357600080fd5b5061018460048036036060811015610b1a57600080fd5b50600160a060020a038135811691602081013590911690604001356118fa565b348015610b4657600080fd5b50610b4f6119da565b60408051918252519081900360200190f35b348015610b6d57600080fd5b5061018460048036036080811015610b8457600080fd5b50600160a060020a038135811691602081013582169160408201351690606001356119e0565b348015610bb657600080fd5b506102c1600480360360a0811015610bcd57600080fd5b5080356001608060020a031916906020810135600160a060020a03908116916040810135909116906060810135906080013561ffff16611ad2565b6101846004803603610140811015610c1f57600080fd5b506001608060020a031981351690600160a060020a03602082013581169160408101359091169060608101359061ffff6080820135169063ffffffff60a082013581169160c08101359091169060ff60e08201351690610100810135906101200135611b43565b348015610c9257600080fd5b5061018460048036036060811015610ca957600080fd5b50600160a060020a03813581169160208101359091169060400135611eff565b600154600160a060020a03163314610d155760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6004805463ffffffff9092167601000000000000000000000000000000000000000000000279ffffffff0000000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a03163314610dad5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6004805461ffff909216740100000000000000000000000000000000000000000275ffff000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a03163314610e3d5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610eb85760405160e560020a62461bcd028152600401808060200182810382526030815260200180612b496030913960400191505060405180910390fd5b604080516001608060020a03198b166020808301919091527f060000000000000000000000000000000000000000000000000000000000000060308301528251601181840301815260319092019092528051910120600090610f1c90868686611fae565b905087600160a060020a031681600160a060020a03161480610f4f575088600160a060020a031681600160a060020a0316145b1515610fa5576040805160e560020a62461bcd02815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610fad612a87565b6000610fbc8c8c8c8c8c6120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a0316918401919091529193509150611054576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b606460ff8516111561109a5760405160e560020a62461bcd028152600401808060200182810382526022815260200180612b276022913960400191505060405180910390fd5b604082810180513a618d0402016001608060020a03908116825260008481526005602090815290849020805474ffffffffffffffffffffffffffffffffffffffffff191690559151835185815291169181019190915281517f437ec3256bbed400455e142c7ce305c6e705cad2d1ba5a4ebed6a6dd133d93fb929181900390910190a160008460ff16111561123c5761271061ffff89168a0204606460ff86168b02048190038a1015611197576040805160e560020a62461bcd02815260206004820152600e60248201527f4f766572666c6f77206572726f72000000000000000000000000000000000000604482015290519081900360640190fd5b6003805482019055600454600160a060020a031663a9059cbb8c83606460ff8a168f0204036040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561120e57600080fd5b505af1158015611222573d6000803e3d6000fd5b505050506040513d602081101561123857600080fd5b5050505b60648460ff1610156112e457600454600160a060020a031663a9059cbb8c606460ff888203168d02046040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156112b757600080fd5b505af11580156112cb573d6000803e3d6000fd5b505050506040513d60208110156112e157600080fd5b50505b505050505050505050505050565b600033600160a060020a03851614611354576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b61136386868686866000612160565b9695505050505050565b60056020526000908152604090205460ff811690610100810463ffffffff16906501000000000090046001608060020a031683565b600454600160a060020a031681565b600454760100000000000000000000000000000000000000000000900463ffffffff1681565b600033600160a060020a03851614611439576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b611363868686868660006122de565b600154600160a060020a031633146114945760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600033600160a060020a03861614611525576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b611363868686868660006123e5565b600054600160a060020a031681565b600254600160a060020a031681565b60045474010000000000000000000000000000000000000000900461ffff1681565b600154600160a060020a031681565b6060808b516040519080825280602002602001820160405280156115b1578160200160208202803883390190505b50600254909150600090600160a060020a031633146115d15760006115e1565b8c51616f548115156115df57fe5b045b905060005b8d518160ff161015611731576117098e8260ff1681518110151561160657fe5b906020019060200201518e8360ff1681518110151561162157fe5b906020019060200201518e8460ff1681518110151561163c57fe5b906020019060200201518e8560ff1681518110151561165757fe5b906020019060200201518e8660ff1681518110151561167257fe5b906020019060200201518e8760ff1681518110151561168d57fe5b906020019060200201518e8860ff168151811015156116a857fe5b906020019060200201518e8960ff168151811015156116c357fe5b906020019060200201518e8a60ff168151811015156116de57fe5b906020019060200201518e8b60ff168151811015156116f957fe5b906020019060200201518c612516565b838260ff1681518110151561171a57fe5b9115156020928302909101909101526001016115e6565b50909c9b505050505050505050505050565b600154600160a060020a0316331461178f5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6003548111156117d35760405160e560020a62461bcd028152600401808060200182810382526026815260200180612bd36026913960400191505060405180910390fd5b60038054829003905560048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0386811694820194909452602481018590529051929091169163a9059cbb916044808201926020929091908290030181600087803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b505050506040513d602081101561187957600080fd5b50505050565b600154600160a060020a031633146118cb5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a031633146119465760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156119a957600080fd5b505af11580156119bd573d6000803e3d6000fd5b505050506040513d60208110156119d357600080fd5b5050505050565b60035481565b600154600160a060020a03163314611a2c5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b158015611aa057600080fd5b505af1158015611ab4573d6000803e3d6000fd5b505050506040513d6020811015611aca57600080fd5b505050505050565b600033600160a060020a03861614611b34576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b61136386868686866000612667565b604080516001608060020a03198c166020808301919091526c01000000000000000000000000600160a060020a03808e16820260308501528c16026044830152605882018a90527e0100000000000000000000000000000000000000000000000000000000000061ffff8a160260788301528251605a818403018152607a9092018352815191810191909120600081815260059092529190205460ff1615611c1f5760405160e560020a62461bcd028152600401808060200182810382526026815260200180612ad76026913960400191505060405180910390fd5b60408051602080820184905260e060020a63ffffffff808b168202848601528916026044830152825160288184030181526048909201909252805191012060045461ffff74010000000000000000000000000000000000000000909104168911611cbd5760405160e560020a62461bcd02815260040180806020018281038252602f815260200180612ba4602f913960400191505060405180910390fd5b63ffffffff86164210611d1a576040805160e560020a62461bcd02815260206004820152601960248201527f54726164652068617320616c7265616479206578706972656400000000000000604482015290519081900360640190fd5b600254600160a060020a0316611d3282878787611fae565b600160a060020a031614611d7a5760405160e560020a62461bcd02815260040180806020018281038252602f815260200180612aa8602f913960400191505060405180910390fd5b60048054604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523393810193909352306024840152604483018c905251600160a060020a03909116916323b872dd9160648083019260209291908290030181600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050506040513d6020811015611e1857600080fd5b506000905063ffffffff881615611e3157874201611e34565b60015b604080516060810182526001815263ffffffff838116602080840191825260008486018181528a82526005835290869020945185549351915160ff199094169015151764ffffffff00191661010091909416029290921774ffffffffffffffffffffffffffffffff00000000001916650100000000006001608060020a039092169190910217909155815186815291519293507f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c92918290030190a150505050505050505050505050565b600154600160a060020a03163314611f4b5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156119a957600080fd5b604080518082018252601c8082527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060208084019182529351600094859385938b939092019182918083835b602083106120195780518252601f199092019160209182019101611ffa565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152848301808352815191840191909120600090915281850180835281905260ff8c166060860152608085018b905260a085018a905290519095506001945060c080850194929350601f198201928290030190855afa1580156120a7573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b604080516001608060020a031996909616602080880191909152600160a060020a039586166c010000000000000000000000009081026030890152949095169093026044860152605885019190915261ffff167e010000000000000000000000000000000000000000000000000000000000000260788401528051808403605a018152607a90930181528251928201929092206000818152600590925291902091565b600061216a612a87565b600061217989898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a0316918401919091529193509150612211576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b8151151561222457600092505050611363565b600254600090600160a060020a03163314612240576000612248565b61b4af85013a025b60408085015160008581526005602090815290839020805474ffffffffffffffffffffffffffffffffffffffffff1916905582518681526001608060020a03949092019384169082015281519293507fef5d27f6da36198207d0bf4c1db4f2d6e12a27045c53f7e7f2529ec7045a65c0929081900390910190a16122ce89886000612778565b5060019998505050505050505050565b60006122e8612a87565b60006122f789898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a031691840191909152919350915061234a57600092505050611363565b602082015163ffffffff16151561236657600092505050611363565b600081815260056020908152604091829020805464ffffffff0019169055815183815291517fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb9281900390910190a1600254600160a060020a03163314156123d6576123d6816171108601612814565b50600198975050505050505050565b60006123ef612a87565b60006123fe89898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a031691840191909152919350915061245157600092505050611363565b816020015163ffffffff16600114151561247057600092505050611363565b60045460008281526005602090815260409182902080544263ffffffff7601000000000000000000000000000000000000000000009096048616019094166101000264ffffffff001990941693909317909255805183815290517f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab929181900390910190a1600254600160a060020a03163314156123d6576123d6816173438601612814565b6000806125278d858a8a8a8a612866565b90508a600160a060020a031681600160a060020a031614156125845760ff8416600114156125655761255d8d8d8d8d8d886122de565b915050612658565b60ff84166002141561257f5761255d8d8d8d8d8d88612160565b612656565b8b600160a060020a031681600160a060020a031614156125ec5760ff8416600514156125b85761255d8d8d8d8d8d88612667565b60ff8416600314156125d25761255d8d8d8d8d8d8861293e565b60ff84166004141561257f5761255d8d8d8d8d8d886123e5565b33600160a060020a038d161461264c576040805160e560020a62461bcd02815260206004820152601260248201527f556e7265636f676e697365642070617274790000000000000000000000000000604482015290519081900360640190fd5b6000915050612658565b505b9b9a5050505050505050505050565b6000612671612a87565b600061268089898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a03169184019190915291935091506126d357600092505050611363565b600254600090600160a060020a031633146126ef5760006126f7565b61b5fc85013a025b60408085015160008581526005602090815290839020805474ffffffffffffffffffffffffffffffffffffffffff1916905582518681526001608060020a03949092019384169082015281519293507f44306e460694e3f7e04300c4479a6818c0a825e0482fd6d4d0f16b0232e96205929081900390910190a16122ce8888885b61271061ffff8216830204808303831015612793575061280f565b600380548201905560048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945284870360248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b158015611aa057600080fd5b505050565b600091825260056020526040909120805474ffffffffffffffffffffffffffffffff00000000001981163a90930265010000000000918290046001608060020a03908116919091011602919091179055565b604080516001608060020a0319881660208083019190915260ff88167f01000000000000000000000000000000000000000000000000000000000000000260308301526001608060020a0387167001000000000000000000000000000000008102603184015283518084036021018152604190930190935281519101206000913a106129265760405160e560020a62461bcd02815260040180806020018281038252602a815260200180612afd602a913960400191505060405180910390fd5b61293281868686611fae565b98975050505050505050565b6000612948612a87565b600061295789898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a03169184019190915291935091506129aa57600092505050611363565b6001826020015163ffffffff161115806129cd575042826020015163ffffffff16115b156129dd57600092505050611363565b600254600090600160a060020a031633146129f9576000612a01565b61b6df85013a025b60408085015160008581526005602090815290839020805474ffffffffffffffffffffffffffffffffffffffffff1916905582518681526001608060020a03949092019384169082015281519293507f53a30a836c5a4e5b22cc088ba117d9c12c2ac15a5e862d39f7de4cbf8a7b609c929081900390910190a16122ce89886000612778565b60408051606081018252600080825260208201819052918101919091529056fe5472616e73616374696f6e207369676e617475726520646964206e6f7420636f6d652066726f6d2072656c61796572547261646520616c72656164792065786973747320696e20657363726f77206d617070696e6747617320707269636520697320686967686572207468616e206d6178696d756d206761732070726963655f627579657250657263656e74206d75737420626520313030206f72206c6f7765724f6e6c79207468652063757272656e74206f776e65722063616e206368616e6765207468652061726269747261746f724f6e6c79207468652063757272656e74206f776e65722063616e206368616e676520746865206f776e6572457363726f772076616c7565206d7573742062652067726561746572207468616e206d696e696d756d2076616c7565416d6f756e7420697320686967686572207468616e20616d6f756e7420617661696c61626c65a165627a7a723058204cfa9aefd4ee3472af8423ef60619c6f47f38da678ec9a50f433a2141e86d27c0029000000000000000000000000877cf5f02497607e0b4e4e6aaf6c275648cd5ce50000000000000000000000006b175474e89094c44da98b954eedeac495271d0f

Deployed Bytecode

0x60806040526004361061014f5760003560e060020a900480638406c079116100ba578063da3e339711610073578063da3e339714610af7578063de5785d514610b3a578063e599490514610b61578063e9600f1214610baa578063f1e03d6714610c08578063f5537ede14610c865761014f565b80638406c07914610490578063849aaf8e146104a55780638da5cb5b146104d15780638eb4e0ad146104e6578063ad3b1b4714610a8b578063b0eefabe14610ac45761014f565b806355a373d61161010c57806355a373d61461032d57806357938b2a1461035e5780635c810f091461038c5780636548e9bc146103ea5780636b4078371461041d5780636cc6cde11461047b5761014f565b806305b64993146101545780630d98ed3b1461018657806313af4035146101b457806324943c7d146101e75780632cc9636c146102635780632d83549c146102d5575b600080fd5b34801561016057600080fd5b506101846004803603602081101561017757600080fd5b503563ffffffff16610cc9565b005b34801561019257600080fd5b50610184600480360360208110156101a957600080fd5b503561ffff16610d61565b3480156101c057600080fd5b50610184600480360360208110156101d757600080fd5b5035600160a060020a0316610df1565b3480156101f357600080fd5b50610184600480360361012081101561020b57600080fd5b506001608060020a031981351690600160a060020a03602082013581169160408101359091169060608101359061ffff6080820135169060ff60a082013581169160c08101359160e082013591610100013516610e6c565b34801561026f57600080fd5b506102c1600480360360a081101561028657600080fd5b5080356001608060020a031916906020810135600160a060020a03908116916040810135909116906060810135906080013561ffff166112f2565b604080519115158252519081900360200190f35b3480156102e157600080fd5b506102ff600480360360208110156102f857600080fd5b503561136d565b60408051931515845263ffffffff90921660208401526001608060020a031682820152519081900360600190f35b34801561033957600080fd5b506103426113a2565b60408051600160a060020a039092168252519081900360200190f35b34801561036a57600080fd5b506103736113b1565b6040805163ffffffff9092168252519081900360200190f35b34801561039857600080fd5b506102c1600480360360a08110156103af57600080fd5b5080356001608060020a031916906020810135600160a060020a03908116916040810135909116906060810135906080013561ffff166113d7565b3480156103f657600080fd5b506101846004803603602081101561040d57600080fd5b5035600160a060020a0316611448565b34801561042957600080fd5b506102c1600480360360a081101561044057600080fd5b5080356001608060020a031916906020810135600160a060020a03908116916040810135909116906060810135906080013561ffff166114c3565b34801561048757600080fd5b50610342611534565b34801561049c57600080fd5b50610342611543565b3480156104b157600080fd5b506104ba611552565b6040805161ffff9092168252519081900360200190f35b3480156104dd57600080fd5b50610342611574565b3480156104f257600080fd5b50610a3b600480360361014081101561050a57600080fd5b81019060208101813564010000000081111561052557600080fd5b82018360208201111561053757600080fd5b8035906020019184602083028401116401000000008311171561055957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156105a957600080fd5b8201836020820111156105bb57600080fd5b803590602001918460208302840111640100000000831117156105dd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561062d57600080fd5b82018360208201111561063f57600080fd5b8035906020019184602083028401116401000000008311171561066157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156106b157600080fd5b8201836020820111156106c357600080fd5b803590602001918460208302840111640100000000831117156106e557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561073557600080fd5b82018360208201111561074757600080fd5b8035906020019184602083028401116401000000008311171561076957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156107b957600080fd5b8201836020820111156107cb57600080fd5b803590602001918460208302840111640100000000831117156107ed57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561083d57600080fd5b82018360208201111561084f57600080fd5b8035906020019184602083028401116401000000008311171561087157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156108c157600080fd5b8201836020820111156108d357600080fd5b803590602001918460208302840111640100000000831117156108f557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561094557600080fd5b82018360208201111561095757600080fd5b8035906020019184602083028401116401000000008311171561097957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156109c957600080fd5b8201836020820111156109db57600080fd5b803590602001918460208302840111640100000000831117156109fd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611583945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a77578181015183820152602001610a5f565b505050509050019250505060405180910390f35b348015610a9757600080fd5b5061018460048036036040811015610aae57600080fd5b50600160a060020a038135169060200135611743565b348015610ad057600080fd5b5061018460048036036020811015610ae757600080fd5b5035600160a060020a031661187f565b348015610b0357600080fd5b5061018460048036036060811015610b1a57600080fd5b50600160a060020a038135811691602081013590911690604001356118fa565b348015610b4657600080fd5b50610b4f6119da565b60408051918252519081900360200190f35b348015610b6d57600080fd5b5061018460048036036080811015610b8457600080fd5b50600160a060020a038135811691602081013582169160408201351690606001356119e0565b348015610bb657600080fd5b506102c1600480360360a0811015610bcd57600080fd5b5080356001608060020a031916906020810135600160a060020a03908116916040810135909116906060810135906080013561ffff16611ad2565b6101846004803603610140811015610c1f57600080fd5b506001608060020a031981351690600160a060020a03602082013581169160408101359091169060608101359061ffff6080820135169063ffffffff60a082013581169160c08101359091169060ff60e08201351690610100810135906101200135611b43565b348015610c9257600080fd5b5061018460048036036060811015610ca957600080fd5b50600160a060020a03813581169160208101359091169060400135611eff565b600154600160a060020a03163314610d155760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6004805463ffffffff9092167601000000000000000000000000000000000000000000000279ffffffff0000000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a03163314610dad5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6004805461ffff909216740100000000000000000000000000000000000000000275ffff000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a03163314610e3d5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610eb85760405160e560020a62461bcd028152600401808060200182810382526030815260200180612b496030913960400191505060405180910390fd5b604080516001608060020a03198b166020808301919091527f060000000000000000000000000000000000000000000000000000000000000060308301528251601181840301815260319092019092528051910120600090610f1c90868686611fae565b905087600160a060020a031681600160a060020a03161480610f4f575088600160a060020a031681600160a060020a0316145b1515610fa5576040805160e560020a62461bcd02815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610fad612a87565b6000610fbc8c8c8c8c8c6120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a0316918401919091529193509150611054576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b606460ff8516111561109a5760405160e560020a62461bcd028152600401808060200182810382526022815260200180612b276022913960400191505060405180910390fd5b604082810180513a618d0402016001608060020a03908116825260008481526005602090815290849020805474ffffffffffffffffffffffffffffffffffffffffff191690559151835185815291169181019190915281517f437ec3256bbed400455e142c7ce305c6e705cad2d1ba5a4ebed6a6dd133d93fb929181900390910190a160008460ff16111561123c5761271061ffff89168a0204606460ff86168b02048190038a1015611197576040805160e560020a62461bcd02815260206004820152600e60248201527f4f766572666c6f77206572726f72000000000000000000000000000000000000604482015290519081900360640190fd5b6003805482019055600454600160a060020a031663a9059cbb8c83606460ff8a168f0204036040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561120e57600080fd5b505af1158015611222573d6000803e3d6000fd5b505050506040513d602081101561123857600080fd5b5050505b60648460ff1610156112e457600454600160a060020a031663a9059cbb8c606460ff888203168d02046040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156112b757600080fd5b505af11580156112cb573d6000803e3d6000fd5b505050506040513d60208110156112e157600080fd5b50505b505050505050505050505050565b600033600160a060020a03851614611354576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b61136386868686866000612160565b9695505050505050565b60056020526000908152604090205460ff811690610100810463ffffffff16906501000000000090046001608060020a031683565b600454600160a060020a031681565b600454760100000000000000000000000000000000000000000000900463ffffffff1681565b600033600160a060020a03851614611439576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b611363868686868660006122de565b600154600160a060020a031633146114945760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600033600160a060020a03861614611525576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b611363868686868660006123e5565b600054600160a060020a031681565b600254600160a060020a031681565b60045474010000000000000000000000000000000000000000900461ffff1681565b600154600160a060020a031681565b6060808b516040519080825280602002602001820160405280156115b1578160200160208202803883390190505b50600254909150600090600160a060020a031633146115d15760006115e1565b8c51616f548115156115df57fe5b045b905060005b8d518160ff161015611731576117098e8260ff1681518110151561160657fe5b906020019060200201518e8360ff1681518110151561162157fe5b906020019060200201518e8460ff1681518110151561163c57fe5b906020019060200201518e8560ff1681518110151561165757fe5b906020019060200201518e8660ff1681518110151561167257fe5b906020019060200201518e8760ff1681518110151561168d57fe5b906020019060200201518e8860ff168151811015156116a857fe5b906020019060200201518e8960ff168151811015156116c357fe5b906020019060200201518e8a60ff168151811015156116de57fe5b906020019060200201518e8b60ff168151811015156116f957fe5b906020019060200201518c612516565b838260ff1681518110151561171a57fe5b9115156020928302909101909101526001016115e6565b50909c9b505050505050505050505050565b600154600160a060020a0316331461178f5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6003548111156117d35760405160e560020a62461bcd028152600401808060200182810382526026815260200180612bd36026913960400191505060405180910390fd5b60038054829003905560048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0386811694820194909452602481018590529051929091169163a9059cbb916044808201926020929091908290030181600087803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b505050506040513d602081101561187957600080fd5b50505050565b600154600160a060020a031633146118cb5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a031633146119465760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156119a957600080fd5b505af11580156119bd573d6000803e3d6000fd5b505050506040513d60208110156119d357600080fd5b5050505050565b60035481565b600154600160a060020a03163314611a2c5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b158015611aa057600080fd5b505af1158015611ab4573d6000803e3d6000fd5b505050506040513d6020811015611aca57600080fd5b505050505050565b600033600160a060020a03861614611b34576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b61136386868686866000612667565b604080516001608060020a03198c166020808301919091526c01000000000000000000000000600160a060020a03808e16820260308501528c16026044830152605882018a90527e0100000000000000000000000000000000000000000000000000000000000061ffff8a160260788301528251605a818403018152607a9092018352815191810191909120600081815260059092529190205460ff1615611c1f5760405160e560020a62461bcd028152600401808060200182810382526026815260200180612ad76026913960400191505060405180910390fd5b60408051602080820184905260e060020a63ffffffff808b168202848601528916026044830152825160288184030181526048909201909252805191012060045461ffff74010000000000000000000000000000000000000000909104168911611cbd5760405160e560020a62461bcd02815260040180806020018281038252602f815260200180612ba4602f913960400191505060405180910390fd5b63ffffffff86164210611d1a576040805160e560020a62461bcd02815260206004820152601960248201527f54726164652068617320616c7265616479206578706972656400000000000000604482015290519081900360640190fd5b600254600160a060020a0316611d3282878787611fae565b600160a060020a031614611d7a5760405160e560020a62461bcd02815260040180806020018281038252602f815260200180612aa8602f913960400191505060405180910390fd5b60048054604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523393810193909352306024840152604483018c905251600160a060020a03909116916323b872dd9160648083019260209291908290030181600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050506040513d6020811015611e1857600080fd5b506000905063ffffffff881615611e3157874201611e34565b60015b604080516060810182526001815263ffffffff838116602080840191825260008486018181528a82526005835290869020945185549351915160ff199094169015151764ffffffff00191661010091909416029290921774ffffffffffffffffffffffffffffffff00000000001916650100000000006001608060020a039092169190910217909155815186815291519293507f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c92918290030190a150505050505050505050505050565b600154600160a060020a03163314611f4b5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b79602b913960400191505060405180910390fd5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156119a957600080fd5b604080518082018252601c8082527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060208084019182529351600094859385938b939092019182918083835b602083106120195780518252601f199092019160209182019101611ffa565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152848301808352815191840191909120600090915281850180835281905260ff8c166060860152608085018b905260a085018a905290519095506001945060c080850194929350601f198201928290030190855afa1580156120a7573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b604080516001608060020a031996909616602080880191909152600160a060020a039586166c010000000000000000000000009081026030890152949095169093026044860152605885019190915261ffff167e010000000000000000000000000000000000000000000000000000000000000260788401528051808403605a018152607a90930181528251928201929092206000818152600590925291902091565b600061216a612a87565b600061217989898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a0316918401919091529193509150612211576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b8151151561222457600092505050611363565b600254600090600160a060020a03163314612240576000612248565b61b4af85013a025b60408085015160008581526005602090815290839020805474ffffffffffffffffffffffffffffffffffffffffff1916905582518681526001608060020a03949092019384169082015281519293507fef5d27f6da36198207d0bf4c1db4f2d6e12a27045c53f7e7f2529ec7045a65c0929081900390910190a16122ce89886000612778565b5060019998505050505050505050565b60006122e8612a87565b60006122f789898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a031691840191909152919350915061234a57600092505050611363565b602082015163ffffffff16151561236657600092505050611363565b600081815260056020908152604091829020805464ffffffff0019169055815183815291517fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb9281900390910190a1600254600160a060020a03163314156123d6576123d6816171108601612814565b50600198975050505050505050565b60006123ef612a87565b60006123fe89898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a031691840191909152919350915061245157600092505050611363565b816020015163ffffffff16600114151561247057600092505050611363565b60045460008281526005602090815260409182902080544263ffffffff7601000000000000000000000000000000000000000000009096048616019094166101000264ffffffff001990941693909317909255805183815290517f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab929181900390910190a1600254600160a060020a03163314156123d6576123d6816173438601612814565b6000806125278d858a8a8a8a612866565b90508a600160a060020a031681600160a060020a031614156125845760ff8416600114156125655761255d8d8d8d8d8d886122de565b915050612658565b60ff84166002141561257f5761255d8d8d8d8d8d88612160565b612656565b8b600160a060020a031681600160a060020a031614156125ec5760ff8416600514156125b85761255d8d8d8d8d8d88612667565b60ff8416600314156125d25761255d8d8d8d8d8d8861293e565b60ff84166004141561257f5761255d8d8d8d8d8d886123e5565b33600160a060020a038d161461264c576040805160e560020a62461bcd02815260206004820152601260248201527f556e7265636f676e697365642070617274790000000000000000000000000000604482015290519081900360640190fd5b6000915050612658565b505b9b9a5050505050505050505050565b6000612671612a87565b600061268089898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a03169184019190915291935091506126d357600092505050611363565b600254600090600160a060020a031633146126ef5760006126f7565b61b5fc85013a025b60408085015160008581526005602090815290839020805474ffffffffffffffffffffffffffffffffffffffffff1916905582518681526001608060020a03949092019384169082015281519293507f44306e460694e3f7e04300c4479a6818c0a825e0482fd6d4d0f16b0232e96205929081900390910190a16122ce8888885b61271061ffff8216830204808303831015612793575061280f565b600380548201905560048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945284870360248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b158015611aa057600080fd5b505050565b600091825260056020526040909120805474ffffffffffffffffffffffffffffffff00000000001981163a90930265010000000000918290046001608060020a03908116919091011602919091179055565b604080516001608060020a0319881660208083019190915260ff88167f01000000000000000000000000000000000000000000000000000000000000000260308301526001608060020a0387167001000000000000000000000000000000008102603184015283518084036021018152604190930190935281519101206000913a106129265760405160e560020a62461bcd02815260040180806020018281038252602a815260200180612afd602a913960400191505060405180910390fd5b61293281868686611fae565b98975050505050505050565b6000612948612a87565b600061295789898989896120bd565b60408051606081018252925460ff81161515808552610100820463ffffffff166020860152650100000000009091046001608060020a03169184019190915291935091506129aa57600092505050611363565b6001826020015163ffffffff161115806129cd575042826020015163ffffffff16115b156129dd57600092505050611363565b600254600090600160a060020a031633146129f9576000612a01565b61b6df85013a025b60408085015160008581526005602090815290839020805474ffffffffffffffffffffffffffffffffffffffffff1916905582518681526001608060020a03949092019384169082015281519293507f53a30a836c5a4e5b22cc088ba117d9c12c2ac15a5e862d39f7de4cbf8a7b609c929081900390910190a16122ce89886000612778565b60408051606081018252600080825260208201819052918101919091529056fe5472616e73616374696f6e207369676e617475726520646964206e6f7420636f6d652066726f6d2072656c61796572547261646520616c72656164792065786973747320696e20657363726f77206d617070696e6747617320707269636520697320686967686572207468616e206d6178696d756d206761732070726963655f627579657250657263656e74206d75737420626520313030206f72206c6f7765724f6e6c79207468652063757272656e74206f776e65722063616e206368616e6765207468652061726269747261746f724f6e6c79207468652063757272656e74206f776e65722063616e206368616e676520746865206f776e6572457363726f772076616c7565206d7573742062652067726561746572207468616e206d696e696d756d2076616c7565416d6f756e7420697320686967686572207468616e20616d6f756e7420617661696c61626c65a165627a7a723058204cfa9aefd4ee3472af8423ef60619c6f47f38da678ec9a50f433a2141e86d27c0029

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

000000000000000000000000877cf5f02497607e0b4e4e6aaf6c275648cd5ce50000000000000000000000006b175474e89094c44da98b954eedeac495271d0f

-----Decoded View---------------
Arg [0] : initialAddress (address): 0x877cf5F02497607E0B4e4E6AaF6C275648Cd5ce5
Arg [1] : daiAddress (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000877cf5f02497607e0b4e4e6aaf6c275648cd5ce5
Arg [1] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f


Deployed Bytecode Sourcemap

355:30612:0:-;;;;;;;;;;-1:-1:-1;;;355:30612:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25117:363;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25117:363:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25117:363:0;;;;:::i;:::-;;24685:271;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24685:271:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24685:271:0;;;;:::i;23901:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23901:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23901:232:0;-1:-1:-1;;;;;23901:232:0;;:::i;8550:1591::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8550:1591:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;;8550:1591:0;;;;-1:-1:-1;;;;;8550:1591:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;11178:323::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11178:323:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11178:323:0;;-1:-1:-1;;;;;;11178:323:0;;;;;;-1:-1:-1;;;;;11178:323:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1452:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1452:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1452:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1452:42:0;;;;;;;;;;;;;;720:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;720:29:0;;;:::i;:::-;;;;-1:-1:-1;;;;;720:29:0;;;;;;;;;;;;;;873:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;873:54:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10507:333;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10507:333:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;10507:333:0;;-1:-1:-1;;;;;;10507:333:0;;;;;;-1:-1:-1;;;;;10507:333:0;;;;;;;;;;;;;;;;;;;;;;;:::i;24288:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24288:244:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24288:244:0;-1:-1:-1;;;;;24288:244:0;;:::i;11840:335::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11840:335:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11840:335:0;;-1:-1:-1;;;;;;11840:335:0;;;;;;-1:-1:-1;;;;;11840:335:0;;;;;;;;;;;;;;;;;;;;;;;:::i;485:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;485:25:0;;;:::i;544:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;544:22:0;;;:::i;836:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;836:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;517:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;517:20:0;;;:::i;19624:1065::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19624:1065:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;19624:1065:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;;;;;;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;19624:1065:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19624:1065:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;19624:1065:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19624:1065:0;;-1:-1:-1;19624:1065:0;;-1:-1:-1;;;;;19624:1065:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;19624:1065:0;;;;;;;;;;;;;;;;;25762:324;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25762:324:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25762:324:0;;;;;;;;:::i;23493:259::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23493:259:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23493:259:0;-1:-1:-1;;;;;23493:259:0;;:::i;30303:376::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30303:376:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30303:376:0;;;;;;;;;;;;;;;;;:::i;573:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;573:39:0;;;:::i;:::-;;;;;;;;;;;;;;;;29645:430;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29645:430:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;29645:430:0;;;;;;;;;;;;;;;;;;;;;;:::i;6314:326::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6314:326:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;6314:326:0;;-1:-1:-1;;;;;;6314:326:0;;;;;;-1:-1:-1;;;;;6314:326:0;;;;;;;;;;;;;;;;;;;;;;;:::i;3874:2094::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;;3874:2094:0;;;;-1:-1:-1;;;;;3874:2094:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28999:384::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28999:384:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28999:384:0;;;;;;;;;;;;;;;;;:::i;25117:363::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25405:30;:67;;;;;;;;-1:-1:-1;;25405:67:0;;;;;;;;;25117:363::o;24685:271::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24917:12;:31;;;;;;;;-1:-1:-1;;24917:31:0;;;;;;;;;24685:271::o;23901:232::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24108:5;:17;;-1:-1:-1;;24108:17:0;-1:-1:-1;;;;;24108:17:0;;;;;;;;;;23901:232::o;8550:1591::-;30881:10;;-1:-1:-1;;;;;30881:10:0;30867;:24;30859:85;;;;-1:-1:-1;;;;;30859:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8894:84;;;-1:-1:-1;;;;;;8894:84:0;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;8894:84:0;;;;;;;8884:95;;;;;8848:18;;8869:123;;8981:2;8985;8989;8869:14;:123::i;:::-;8848:144;;9025:6;-1:-1:-1;;;;;9011:20:0;:10;-1:-1:-1;;;;;9011:20:0;;:45;;;;9049:7;-1:-1:-1;;;;;9035:21:0;:10;-1:-1:-1;;;;;9035:21:0;;9011:45;9003:81;;;;;;;-1:-1:-1;;;;;9003:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9097:21;;:::i;:::-;9129:18;9182:57;9199:8;9209:7;9218:6;9226;9234:4;9182:16;:57::i;:::-;9158:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9158:81:0;;;;;;;;;;-1:-1:-1;9158:81:0;-1:-1:-1;9250:48:0;;;;;-1:-1:-1;;;;;9250:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:3;9317:20;;;;;9309:67;;;;-1:-1:-1;;;;;9309:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9389:34;;;;:83;;9459:11;7965:5;9428:43;9389:83;-1:-1:-1;;;;;9389:83:0;;;;;-1:-1:-1;9492:19:0;;;:7;:19;;;;;;;;9485:26;;-1:-1:-1;;9485:26:0;;;9555:34;;9527:63;;;;;;;;;;;;;;;;;;;;;;;;;;;9621:1;9605:13;:17;;;9601:404;;;9727:5;9711:13;;;;;:21;9811:3;9786:22;;;;;:28;:41;;;:51;-1:-1:-1;9786:51:0;9778:78;;;;;-1:-1:-1;;;;;9778:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9869:24;:38;;;;;;9920:13;;-1:-1:-1;;;;;9920:13:0;:22;9943:6;9897:10;9976:3;9951:22;;;;;:28;:41;9920:73;;;;;-1:-1:-1;;;9920:73:0;;;;;;;-1:-1:-1;;;;;9920:73:0;-1:-1:-1;;;;;9920:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9920:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9920:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;9601:404:0;10035:3;10019:13;:19;;;10015:119;;;10053:13;;-1:-1:-1;;;;;10053:13:0;:22;10076:7;10118:3;10085:30;10095:19;;;10085:30;;;:36;10053:69;;;;;-1:-1:-1;;;10053:69:0;;;;;;;-1:-1:-1;;;;;10053:69:0;-1:-1:-1;;;;;10053:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10053:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10053:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10015:119:0;30955:1;;;8550:1591;;;;;;;;;:::o;11178:323::-;11355:4;11380:10;-1:-1:-1;;;;;11380:20:0;;;11372:46;;;;;-1:-1:-1;;;;;11372:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11436:57;11450:8;11460:7;11469:6;11477;11485:4;11491:1;11436:13;:57::i;:::-;11429:64;11178:323;-1:-1:-1;;;;;;11178:323:0:o;1452:42::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1452:42:0;;:::o;720:29::-;;;-1:-1:-1;;;;;720:29:0;;:::o;873:54::-;;;;;;;;;:::o;10507:333::-;10686:4;10711:10;-1:-1:-1;;;;;10711:20:0;;;10703:46;;;;;-1:-1:-1;;;;;10703:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10767:65;10789:8;10799:7;10808:6;10816;10824:4;10830:1;10767:21;:65::i;24288:244::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24503:7;:21;;-1:-1:-1;;24503:21:0;-1:-1:-1;;;;;24503:21:0;;;;;;;;;;24288:244::o;11840:335::-;12019:4;12044:10;-1:-1:-1;;;;;12044:21:0;;;12036:48;;;;;-1:-1:-1;;;;;12036:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12102:65;12124:8;12134:7;12143:6;12151;12159:4;12165:1;12102:21;:65::i;485:25::-;;;-1:-1:-1;;;;;485:25:0;;:::o;544:22::-;;;-1:-1:-1;;;;;544:22:0;;:::o;836:30::-;;;;;;;;;:::o;517:20::-;;;-1:-1:-1;;;;;517:20:0;;:::o;19624:1065::-;20027:13;20053:22;20089:8;:15;20078:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;20078:27:0;-1:-1:-1;20163:7:0;;20053:52;;-1:-1:-1;20116:22:0;;-1:-1:-1;;;;;20163:7:0;20149:10;:21;:68;;20216:1;20149:68;;;20198:15;;19612:5;20173:40;;;;;;;;20149:68;20116:102;-1:-1:-1;20234:7:0;20229:427;20251:8;:15;20247:1;:19;;;20229:427;;;20302:342;20326:8;20335:1;20326:11;;;;;;;;;;;;;;;;;;;;20356:7;20364:1;20356:10;;;;;;;;;;;;;;;;;;;;20385:6;20392:1;20385:9;;;;;;;;;;;;;;;;;;;;20413:6;20420:1;20413:9;;;;;;;;;;;;;;;;;;;;20441:4;20446:1;20441:7;;;;;;;;;;;;;;;;;;;;20467:16;20484:1;20467:19;;;;;;;;;;;;;;;;;;;;20505:2;20508:1;20505:5;;;;;;;;;;;;;;;;;;;;20529:2;20532:1;20529:5;;;;;;;;;;;;;;;;;;;;20553:2;20556:1;20553:5;;;;;;;;;;;;;;;;;;;;20577:16;20594:1;20577:19;;;;;;;;;;;;;;;;;;;;20615:14;20302:5;:342::i;:::-;20288:8;20297:1;20288:11;;;;;;;;;;;;:356;;;:11;;;;;;;;;;:356;20268:3;;20229:427;;;-1:-1:-1;20673:8:0;;19624:1065;-1:-1:-1;;;;;;;;;;;;19624:1065:0:o;25762:324::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25918:24;;25907:35;;;25899:86;;;;-1:-1:-1;;;;;25899:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25996:24;:35;;;;;;;26042:13;;;:36;;;;;;-1:-1:-1;;;;;26042:36:0;;;;;;;;;;;;;;;;;;:13;;;;;:22;;:36;;;;;;;;;;;;;;;25996:24;26042:13;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;26042:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26042:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;25762:324:0:o;23493:259::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23717:10;:27;;-1:-1:-1;;23717:27:0;-1:-1:-1;;;;;23717:27:0;;;;;;;;;;23493:259::o;30303:376::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30631:14;-1:-1:-1;;;;;30631:22:0;;30654:8;30664:6;30631:40;;;;;-1:-1:-1;;;30631:40:0;;;;;;;-1:-1:-1;;;;;30631:40:0;-1:-1:-1;;;;;30631:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30631:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30631:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;30303:376:0:o;573:39::-;;;;:::o;29645:430::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30004:63;;;;;;-1:-1:-1;;;;;30004:63:0;;;;;;;;;;;;;;;;;;;;;;:27;;;;;;:63;;;;;;;;;;;;;;;-1:-1:-1;30004:27:0;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;30004:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30004:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29645:430:0:o;6314:326::-;6497:4;6521:10;-1:-1:-1;;;;;6521:21:0;;;6513:48;;;;;-1:-1:-1;;;;;6513:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6579:53;6589:8;6599:7;6608:6;6616;6624:4;6630:1;6579:9;:53::i;3874:2094::-;4960:57;;;-1:-1:-1;;;;;;4960:57:0;;;;;;;;;;;-1:-1:-1;;;;;4960:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;4960:57:0;;;;;;4950:68;;;;;;;;;4929:18;5038:19;;;:7;:19;;;;;;:26;;;5037:27;5029:78;;;;-1:-1:-1;;;;;5029:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5154:112;;;;;;;;;;-1:-1:-1;;;5154:112:0;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;5154:112:0;;;;;;;5144:123;;;;;5154:112;5295:12;;;;;;;5286:21;;5278:81;;;;-1:-1:-1;;;;;5278:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5430:25;;;:15;:25;5422:63;;;;;-1:-1:-1;;;;;5422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5574:7;;-1:-1:-1;;;;;5574:7:0;5527:43;5542:15;5559:2;5563;5567;5527:14;:43::i;:::-;-1:-1:-1;;;;;5527:54:0;;5519:114;;;;-1:-1:-1;;;;;5519:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5644:13;;;:61;;;;;;5671:10;5644:61;;;;;;;5691:4;5644:61;;;;;;;;;;;-1:-1:-1;;;;;5644:13:0;;;;:26;;:61;;;;;;;;;;;;;;:13;;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;5644:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5644:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5716:28:0;;-1:-1:-1;5747:28:0;;;;:84;;5808:23;5789:15;5782:49;5747:84;;;5778:1;5747:84;5887:38;;;;;;;;5894:4;5887:38;;;;;;;;;;;;;-1:-1:-1;5887:38:0;;;;;;5865:19;;;:7;:19;;;;;;:60;;;;;;;;-1:-1:-1;;5865:60:0;;;;;;;-1:-1:-1;;5865:60:0;;;;;;;;;;;-1:-1:-1;;5865:60:0;;-1:-1:-1;;;;;5865:60:0;;;;;;;;;;;5941:19;;;;;;;5887:38;;-1:-1:-1;5941:19:0;;;;;;;;;3874:2094;;;;;;;;;;;;;:::o;28999:384::-;30741:5;;-1:-1:-1;;;;;30741:5:0;30727:10;:19;30719:75;;;;-1:-1:-1;;;;;30719:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29331:14;-1:-1:-1;;;;;29331:23:0;;29355:11;29368:6;29331:44;;;;;-1:-1:-1;;;29331:44:0;;;;;;;-1:-1:-1;;;;;29331:44:0;-1:-1:-1;;;;;29331:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;27333:349:0;27488:57;;;;;;;;;;;;;;;;;;;;27590:29;;27468:7;;;;27488:57;;27616:2;;27590:29;;;;;;27488:57;27590:29;27488:57;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;27590:29:0;;;;;-1:-1:-1;27590:29:0;;;26:21:-1;;;6:49;;27590:29:0;;;;;;27580:40;;;;;;;;;-1:-1:-1;27638:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27580:40;;-1:-1:-1;274:1;;-1:-1;27638:36:0;;;;;263:2:-1;;-1:-1;;;27638:36:0;;;;;;;;274:1:-1;27638:36:0;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27638:36:0;;-1:-1:-1;;27638:36:0;;;27333:349;-1:-1:-1;;;;;;;;27333:349:0:o;26525:530::-;26938:57;;;-1:-1:-1;;;;;;26938:57:0;;;;;;;;;;;;-1:-1:-1;;;;;26938:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;26938:57:0;;;;;;26928:68;;;;;;;;;-1:-1:-1;27015:19:0;;;:7;:19;;;;;;;26525:530::o;14984:883::-;15205:4;15222:21;;:::i;:::-;15254:18;15307:57;15324:8;15334:7;15343:6;15351;15359:4;15307:16;:57::i;:::-;15283:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15283:81:0;;;;;;;;;;-1:-1:-1;15283:81:0;-1:-1:-1;15375:48:0;;;;;-1:-1:-1;;;;;15375:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15439:14;;15438:15;15434:60;;;15477:5;15470:12;;;;;;15434:60;15575:7;;15504:16;;-1:-1:-1;;;;;15575:7:0;15561:10;:21;:122;;15682:1;15561:122;;;14525:5;15603:34;;15650:11;15602:60;15561:122;15523:34;;;;;15716:19;;;;:7;:19;;;;;;;;15709:26;;-1:-1:-1;;15709:26:0;;;15751:38;;;;;-1:-1:-1;;;;;15523:175:0;;;;15751:38;;;;;;;;;15523:175;;-1:-1:-1;15751:38:0;;;;;;;;;;;15800:37;15818:7;15827:6;15835:1;15800:17;:37::i;:::-;-1:-1:-1;15855:4:0;;14984:883;-1:-1:-1;;;;;;;;;14984:883:0:o;13737:744::-;13950:4;13967:21;;:::i;:::-;13999:18;14052:57;14069:8;14079:7;14088:6;14096;14104:4;14052:16;:57::i;:::-;14028:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14028:81:0;;;;;;;;;;-1:-1:-1;14028:81:0;-1:-1:-1;14120:33:0;;14148:5;14141:12;;;;;;14120:33;14167:28;;;;:33;;;14164:50;;;14209:5;14202:12;;;;;;14164:50;14268:1;14225:19;;;:7;:19;;;;;;;;;:44;;-1:-1:-1;;14225:44:0;;;14285:32;;;;;;;;;;;;;;;;;14346:7;;-1:-1:-1;;;;;14346:7:0;14332:10;:21;14328:124;;;14368:72;14385:10;13279:5;14397:42;;14368:16;:72::i;:::-;-1:-1:-1;14469:4:0;;13737:744;-1:-1:-1;;;;;;;;13737:744:0:o;17867:976::-;18080:4;18185:21;;:::i;:::-;18217:18;18270:57;18287:8;18297:7;18306:6;18314;18322:4;18270:16;:57::i;:::-;18246:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18246:81:0;;;;;;;;;;-1:-1:-1;18246:81:0;-1:-1:-1;18338:60:0;;18381:5;18374:12;;;;;;18338:60;18411:7;:28;;;:33;;18443:1;18411:33;;18408:77;;;18468:5;18461:12;;;;;;18408:77;18600:30;;18495:19;;;;:7;:19;;;;;;;;;:135;;18545:15;18600:30;;;;;;;18538:92;18495:135;;;18600:30;18495:135;-1:-1:-1;;18495:135:0;;;;;;;;;;18646:33;;;;;;;;;;;;;;;;;;18708:7;;-1:-1:-1;;;;;18708:7:0;18694:10;:21;18690:124;;;18730:72;18747:10;17413:5;18759:42;;18730:16;:72::i;21343:1897::-;21685:4;21702:22;21727:163;21758:8;21781:16;21812;21843:2;21860;21877;21727:16;:163::i;:::-;21702:188;;21923:6;-1:-1:-1;;;;;21905:24:0;:14;-1:-1:-1;;;;;21905:24:0;;21901:1332;;;21988:52;;;1719:4;21988:52;21984:424;;;22119:78;22141:8;22151:7;22160:6;22168;22176:4;22182:14;22119:21;:78::i;:::-;22112:85;;;;;21984:424;22223:44;;;1797:4;22223:44;22219:189;;;22322:70;22336:8;22346:7;22355:6;22363;22371:4;22377:14;22322:13;:70::i;22219:189::-;21901:1332;;;22447:7;-1:-1:-1;;;;;22429:25:0;:14;-1:-1:-1;;;;;22429:25:0;;22425:808;;;22514:39;;;2104:4;22514:39;22510:600;;;22609:66;22619:8;22629:7;22638:6;22646;22654:4;22660:14;22609:9;:66::i;22510:600::-;22701:45;;;1877:4;22701:45;22697:413;;;22801:71;22816:8;22826:7;22835:6;22843;22851:4;22857:14;22801;:71::i;22697:413::-;22898:53;;;2012:4;22898:53;22894:216;;;23016:78;23038:8;23048:7;23057:6;23065;23073:4;23079:14;23016:21;:78::i;22425:808::-;23150:10;-1:-1:-1;;;;;23150:21:0;;;23142:52;;;;;-1:-1:-1;;;;;23142:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23216:5;23209:12;;;;;22425:808;21343:1897;;;;;;;;;;;;;;;:::o;7134:784::-;7351:4;7368:21;;:::i;:::-;7400:18;7453:57;7470:8;7480:7;7489:6;7497;7505:4;7453:16;:57::i;:::-;7429:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7429:81:0;;;;;;;;;;-1:-1:-1;7429:81:0;-1:-1:-1;7521:33:0;;7549:5;7542:12;;;;;;7521:33;7636:7;;7565:16;;-1:-1:-1;;;;;7636:7:0;7622:10;:21;:118;;7739:1;7622:118;;;6680:5;7664:30;;7707:11;7663:56;7622:118;7584:34;;;;;7773:19;;;;:7;:19;;;;;;;;7766:26;;-1:-1:-1;;7766:26:0;;;7808:30;;;;;-1:-1:-1;;;;;7584:171:0;;;;7808:30;;;;;;;;;7584:171;;-1:-1:-1;7808:30:0;;;;;;;;;;;7849:39;7867:6;7875;7883:4;12769:458;12937:5;12921:13;;;;;:21;12987:19;;;:28;-1:-1:-1;12984:66:0;;;13032:7;;;12984:66;13122:24;:38;;;;;;13171:13;;;:48;;;;;;-1:-1:-1;;;;;13171:48:0;;;;;;;;;;13199:19;;;13171:48;;;;;;:13;;;;;:22;;:48;;;;;;;;;;;;;;;13122:24;13171:13;:48;;;5:2:-1;;;;30:1;27;20:12;12769:458:0;;;;:::o;12354:164::-;12433:19;;;;:7;:19;;;;;;:77;;-1:-1:-1;;12433:77:0;;12498:11;12483:27;;;12433:77;;;;;-1:-1:-1;;;;;12433:77:0;;;;;;;;;;;;;;;12354:164::o;28090:684::-;28556:62;;;-1:-1:-1;;;;;;28556:62:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28556:62:0;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;28556:62:0;;;;;;;28546:73;;;;;-1:-1:-1;;28638:11:0;:30;28630:85;;;;-1:-1:-1;;;;;28630:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28733:33;28748:5;28755:2;28759;28763;28733:14;:33::i;:::-;28726:40;28090:684;-1:-1:-1;;;;;;;;28090:684:0:o;16374:987::-;16596:4;16613:21;;:::i;:::-;16645:18;16698:57;16715:8;16725:7;16734:6;16742;16750:4;16698:16;:57::i;:::-;16674:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16674:81:0;;;;;;;;;;-1:-1:-1;16674:81:0;-1:-1:-1;16766:60:0;;16809:5;16802:12;;;;;;16766:60;16871:1;16839:7;:28;;;:33;;;;:83;;;;16907:15;16876:7;:28;;;:46;;;16839:83;16836:150;;;16969:5;16962:12;;;;;;16836:150;17067:7;;16996:16;;-1:-1:-1;;;;;17067:7:0;17053:10;:21;:123;;17175:1;17053:123;;;15912:5;17095:35;;17143:11;17094:61;17053:123;17015:34;;;;;17209:19;;;;:7;:19;;;;;;;;17202:26;;-1:-1:-1;;17202:26:0;;;17244:39;;;;;-1:-1:-1;;;;;17015:176:0;;;;17244:39;;;;;;;;;17015:176;;-1:-1:-1;17244:39:0;;;;;;;;;;;17294:37;17312:7;17321:6;17329:1;17294:17;:37::i;355:30612::-;;;;;;;;;-1:-1:-1;355:30612:0;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://4cfa9aefd4ee3472af8423ef60619c6f47f38da678ec9a50f433a2141e86d27c

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.