function _mine(uint _rate, uint _inAmount) private returns (uint) {
    assert(_rate > 0);

    
    if (now > cycleEndTime && cycleMintSupply > 0) {
      return _inAmount;
    }
    uint tokens = _rate.mul(_inAmount).div(offset);
    uint refund = 0;

    
    uint futcFeed = tokens.mul(35).div(65);

    if (tokens + futcFeed + cycleMintSupply > CYCLE_CAP) {
      uint overage = tokens + futcFeed + cycleMintSupply - CYCLE_CAP;
      uint tokenOverage = overage.mul(65).div(100);
      futcFeed -= (overage - tokenOverage);
      tokens -= tokenOverage;

      
      refund = tokenOverage.mul(offset).div(_rate);
    }
    cycleMintSupply += (tokens + futcFeed);
    require(futcFeed > 0, "Mining payment too small.");
    MintableToken(this).mint(msg.sender, tokens);
    MintableToken(this).mint(FUTC, futcFeed);

    return refund;
  }