function remoteWithdraw(
    uint256 _withdrawAmount,
    uint256 _feeAmount,
    uint256 _withdrawExpires,
    uint256 _salt,
    address _maker,
    address _restrictedTo, 
    uint8 _v,
    bytes32 _r,
    bytes32 _s
  )
    external
    notLocked
    returns(bool)
  {
    
    require(
        (balances[address(0x0)][_maker] >= safeAdd(_withdrawAmount, _feeAmount))
     && (
            (_restrictedTo == address(0x0))
         || (_restrictedTo == msg.sender)
        )
     && ((_feeAmount == 0) || (Compliance(complianceAddress).canDeposit(msg.sender)))
    );
    
    

    bytes32 hash = keccak256(
      this, 
      _withdrawAmount,
      _feeAmount,
      _withdrawExpires,
      _salt,
      _maker,
      _restrictedTo
    );

    require(orderFills[hash] == 0);

    
    require(
      ecrecover(keccak256(signedWithdrawHash, hash), _v, _r, _s) == _maker
    );
    
    
    orderFills[hash] = 1;

    balances[address(0x0)][_maker] =
      safeSub(balances[address(0x0)][_maker], safeAdd(_withdrawAmount, _feeAmount));
    
    balances[address(0x0)][msg.sender] = safeAdd(balances[address(0x0)][msg.sender], _feeAmount);
    
    globalBalance[address(0x0)] = safeSub(globalBalance[address(0x0)], _withdrawAmount);

    RemoteWithdraw(
      _maker,
      msg.sender,
      _withdrawAmount,
      _feeAmount,
      _withdrawExpires,
      _salt,
      _restrictedTo
    );

    
    _maker.transfer(_withdrawAmount);
    
    return(true);
  }