contract RevocableToken is MintableToken {

    event Revoke(address indexed from, uint256 value);

    modifier canRevoke() {
        require(!mintingFinished);
        _;
    }

    /**
     * @dev Revokes minted tokens
     * @param _from The address whose tokens are revoked
     * @param _value The amount of token to revoke
     */
    function revoke(address _from, uint256 _value) onlyOwner canRevoke public returns (bool) {
        require(_value <= balances[_from]);
        // no need to require value <= totalSupply, since that would imply the
        // sender's balance is greater than the totalSupply, which *should* be an assertion failure

        balances[_from] = balances[_from].sub(_value);
        totalSupply_ = totalSupply_.sub(_value);

        emit Revoke(_from, _value);
        emit Transfer(_from, address(0), _value);
        return true;
    }
}
/**
 * @title Revocable Token
 * @dev Token that can be revokend until minting is not finished.
 */
function revoke(address _from, uint256 _value) onlyOwner canRevoke public returns (bool) {
    require(_value <= balances[_from]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    balances[_from] = balances[_from].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);

    emit Revoke(_from, _value);
    emit Transfer(_from, address(0), _value);
    return true;
}

/**
 * @dev Revokes minted tokens
 * @param _from The address whose tokens are revoked
 * @param _value The amount of token to revoke
 */