<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add(a, b, allow_overflow=False):
 """Adds two instances of `Money`. Args: a (:class:`endpoints_management.gen.servicecontrol_v1_messages.Money`):
 one money value b (:class:`endpoints_management.gen.servicecontrol_v1_messages.Money`):
 another money value allow_overflow: determines if the addition is allowed to overflow Return: `Money`: an instance of Money Raises: ValueError: if the inputs do not have the same currency code OverflowError: if the sum overflows and allow_overflow is not `True` """

    for m in (a, b):
        if not isinstance(m, sc_messages.Money):
            raise ValueError(u'Inputs should be of type %s' % (sc_messages.Money,))
    if a.currencyCode != b.currencyCode:
        raise ValueError(u'Money values need the same currency to be summed')
    nano_carry, nanos_sum = _sum_nanos(a, b)
    units_sum_no_carry = a.units + b.units
    units_sum = units_sum_no_carry + nano_carry

    # Adjust when units_sum and nanos_sum have different signs
    if units_sum > 0 and nanos_sum < 0:
        units_sum -= 1
        nanos_sum += _BILLION
    elif units_sum < 0 and nanos_sum > 0:
        units_sum += 1
        nanos_sum -= _BILLION

    # Return the result, detecting overflow if it occurs
    sign_a = _sign_of(a)
    sign_b = _sign_of(b)
    if sign_a > 0 and sign_b > 0 and units_sum >= _INT64_MAX:
        if not allow_overflow:
            raise OverflowError(u'Money addition positive overflow')
        else:
            return sc_messages.Money(units=_INT64_MAX,
                                     nanos=MAX_NANOS,
                                     currencyCode=a.currencyCode)
    elif (sign_a < 0 and sign_b < 0 and
          (units_sum_no_carry <= -_INT64_MAX or units_sum <= -_INT64_MAX)):
        if not allow_overflow:
            raise OverflowError(u'Money addition negative overflow')
        else:
            return sc_messages.Money(units=_INT64_MIN,
                                     nanos=-MAX_NANOS,
                                     currencyCode=a.currencyCode)
    else:
        return sc_messages.Money(units=units_sum,
                                 nanos=nanos_sum,
                                 currencyCode=a.currencyCode)