contract Burnable is ERC20 {

  /**
   * Event that notifies clients about the amount burnt
   * @param from Address owner of the burnt funds
   * @param value Amount of tokens burnt
   */
  event Burn(
    address indexed from,
    uint256 value
  );
  
  /**
   * @dev Burns a specific amount of tokens.
   * @param value The amount of token to be burned.
   */
  function burn(uint256 value) public {
    _burn(msg.sender, value);
  }

  /**
   * @dev Burns a specific amount of tokens from the target address and decrements allowance
   * @param from address The address which you want to send tokens from
   * @param value uint256 The amount of token to be burned
   */
  function burnFrom(address from, uint256 value) public {
    require(value <= allowed[from][msg.sender], "Burnable: Amount to be burnt exceeds the account balance");

    // Should https://github.com/OpenZeppelin/zeppelin-solidity/issues/707 be accepted,
    // this function needs to emit an event with the updated approval.
    allowed[from][msg.sender] = allowed[from][msg.sender].sub(value);
    _burn(from, value);
  }

  /**
   * @dev Internal function that burns an amount of the token of a given
   * account.
   * @param account The account whose tokens will be burnt.
   * @param amount The amount that will be burnt.
   */
  function _burn(address account, uint256 amount) internal {
    require(account != address(0), "Burnable: Burn from the zero address");
    require(amount > 0, "Burnable: Can not burn negative amount");
    require(amount <= balances[account], "Burnable: Amount to be burnt exceeds the account balance");

    totalSupply = totalSupply.sub(amount);
    balances[account] = balances[account].sub(amount);
    emit Burn(account, amount);
  }
}
/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
function burnFrom(address from, uint256 value) public {
  require(value <= allowed[from][msg.sender], "Burnable: Amount to be burnt exceeds the account balance");

  // Should https://github.com/OpenZeppelin/zeppelin-solidity/issues/707 be accepted,
  // this function needs to emit an event with the updated approval.
  allowed[from][msg.sender] = allowed[from][msg.sender].sub(value);
  _burn(from, value);
}

/**
 * @dev Burns a specific amount of tokens from the target address and decrements allowance
 * @param from address The address which you want to send tokens from
 * @param value uint256 The amount of token to be burned
 */