contract CGCXTimelockFixedBasic {
  using SafeERC20 for ERC20;

  // ERC20 basic token contract being held
  ERC20 public token;

  // beneficiary of tokens after they are released
  address public beneficiary;

  // timestamp when token release is enabled
  uint256 public releaseTime = 1540857600;

  constructor(
    address _token,
    address _beneficiary
  )
    public
  {
    require(_beneficiary != address(0));
    // solium-disable-next-line security/no-block-members
    token = ERC20(_token);
    beneficiary = _beneficiary;
  }

  /**
   * @notice Transfers tokens held by timelock to beneficiary.
   */
  function release() public {
    uint256 amount;
    // solium-disable-next-line security/no-block-members
    if (block.timestamp >= releaseTime) {
      amount = token.balanceOf(this);
      require(amount > 0);
      token.safeTransfer(beneficiary, amount);
      releaseTime = 0;
    } else {
      revert();
    }
  }


}
/**
 * @title TokenTimelock
 * @dev TokenTimelock is a token holder contract that will allow a
 * beneficiary to extract the tokens after a given release time
 */
function release() public {
  uint256 amount;
  // solium-disable-next-line security/no-block-members
  if (block.timestamp >= releaseTime) {
    amount = token.balanceOf(this);
    require(amount > 0);
    token.safeTransfer(beneficiary, amount);
    releaseTime = 0;
  } else {
    revert();
  }
}

/**
 * @notice Transfers tokens held by timelock to beneficiary.
 */