function hirerReleaseFunds(
    bytes16 _jobId,
    address _hirer,
    address _contractor,
    uint256 _value,
    uint256 _fee
  ) external onlyHirer(_hirer)
  {

    bytes32 jobHash = getJobHash(
      _jobId,
      _hirer,
      _contractor,
      _value,
      _fee);

    
    require(jobEscrows[jobHash].exists);

    
    require(hirerEscrowMap[msg.sender][jobHash] > 0);

    
    uint256 jobValue = hirerEscrowMap[msg.sender][jobHash];

    
    require(jobValue > 0 && jobValue == _value);

    
    require(jobValue >= jobValue.sub(_fee));

    
    require(totalInEscrow >= jobValue && totalInEscrow > 0);

     
    emit HirerReleased(
      jobHash,
      msg.sender,
      _contractor,
      jobValue);

     
    emit AddFeesToCoinSparrowPool(jobHash, _fee);

    
    delete jobEscrows[jobHash];
    
    delete hirerEscrowMap[msg.sender][jobHash];

    
    feesAvailableForWithdraw = feesAvailableForWithdraw.add(_fee);

    
    totalInEscrow = totalInEscrow.sub(jobValue);

    
    _contractor.transfer(jobValue.sub(_fee));

  }