<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def cftime_range(start=None, end=None, periods=None, freq='D', normalize=False, name=None, closed=None, calendar='standard'):
 """Return a fixed frequency CFTimeIndex. Parameters start : str or cftime.datetime, optional Left bound for generating dates. end : str or cftime.datetime, optional Right bound for generating dates. periods : integer, optional Number of periods to generate. freq : str, default 'D', BaseCFTimeOffset, or None Frequency strings can have multiples, e.g. '5H'. normalize : bool, default False Normalize start/end dates to midnight before generating date range. name : str, default None Name of the resulting index closed : {None, 'left', 'right'}, optional Make the interval closed with respect to the given frequency to the 'left', 'right', or both sides (None, the default). calendar : str Calendar type for the datetimes (default 'standard'). Returns ------- CFTimeIndex Notes ----- This function is an analog of ``pandas.date_range`` for use in generating sequences of ``cftime.datetime`` objects. It supports most of the features of ``pandas.date_range`` (e.g. specifying how the index is ``closed`` on either side, or whether or not to ``normalize`` the start and end bounds); however, there are some notable exceptions: - You cannot specify a ``tz`` (time zone) argument. - Start or end dates specified as partial-datetime strings must use the `ISO-8601 format <https://en.wikipedia.org/wiki/ISO_8601>`_. - It supports many, but not all, frequencies supported by ``pandas.date_range``. For example it does not currently support any of the business-related, semi-monthly, or sub-second frequencies. - Compound sub-monthly frequencies are not supported, e.g. '1H1min', as these can easily be written in terms of the finest common resolution, e.g. '61min'. Valid simple frequency strings for use with ``cftime``-calendars include any multiples of the following. | Alias | Description | +========+==========================+ | A, Y | Year-end frequency | | AS, YS | Year-start frequency | | Q | Quarter-end frequency | | QS | Quarter-start frequency | | M | Month-end frequency | | MS | Month-start frequency | | D | Day frequency | | H | Hour frequency | | T, min | Minute frequency | | S | Second frequency | Any multiples of the following anchored offsets are also supported. | Alias | Description | +==========+====================================================================+ | A(S)-JAN | Annual frequency, anchored at the end (or beginning) of January | | A(S)-FEB | Annual frequency, anchored at the end (or beginning) of February | | A(S)-MAR | Annual frequency, anchored at the end (or beginning) of March | | A(S)-APR | Annual frequency, anchored at the end (or beginning) of April | | A(S)-MAY | Annual frequency, anchored at the end (or beginning) of May | | A(S)-JUN | Annual frequency, anchored at the end (or beginning) of June | | A(S)-JUL | Annual frequency, anchored at the end (or beginning) of July | | A(S)-AUG | Annual frequency, anchored at the end (or beginning) of August | | A(S)-SEP | Annual frequency, anchored at the end (or beginning) of September | | A(S)-OCT | Annual frequency, anchored at the end (or beginning) of October | | A(S)-NOV | Annual frequency, anchored at the end (or beginning) of November | | A(S)-DEC | Annual frequency, anchored at the end (or beginning) of December | | Q(S)-JAN | Quarter frequency, anchored at the end (or beginning) of January | | Q(S)-FEB | Quarter frequency, anchored at the end (or beginning) of February | | Q(S)-MAR | Quarter frequency, anchored at the end (or beginning) of March | | Q(S)-APR | Quarter frequency, anchored at the end (or beginning) of April | | Q(S)-MAY | Quarter frequency, anchored at the end (or beginning) of May | | Q(S)-JUN | Quarter frequency, anchored at the end (or beginning) of June | | Q(S)-JUL | Quarter frequency, anchored at the end (or beginning) of July | | Q(S)-AUG | Quarter frequency, anchored at the end (or beginning) of August | | Q(S)-SEP | Quarter frequency, anchored at the end (or beginning) of September | | Q(S)-OCT | Quarter frequency, anchored at the end (or beginning) of October | | Q(S)-NOV | Quarter frequency, anchored at the end (or beginning) of November | | Q(S)-DEC | Quarter frequency, anchored at the end (or beginning) of December | Finally, the following calendar aliases are supported. | Alias | Date type | +================================+=======================================+ | standard, gregorian | ``cftime.DatetimeGregorian`` | | proleptic_gregorian | ``cftime.DatetimeProlepticGregorian`` | | noleap, 365_day | ``cftime.DatetimeNoLeap`` | | all_leap, 366_day | ``cftime.DatetimeAllLeap`` | | 360_day | ``cftime.Datetime360Day`` | | julian | ``cftime.DatetimeJulian`` | Examples -------- This function returns a ``CFTimeIndex``, populated with ``cftime.datetime`` objects associated with the specified calendar type, e.g. CFTimeIndex([2000-01-01 00:00:00, 2000-03-01 00:00:00, 2000-05-01 00:00:00, 2000-07-01 00:00:00, 2000-09-01 00:00:00, 2000-11-01 00:00:00], dtype='object') As in the standard pandas function, three of the ``start``, ``end``, ``periods``, or ``freq`` arguments must be specified at a given time, with the other set to ``None``. See the `pandas documentation <https://pandas.pydata.org/pandas-docs/stable/generated/pandas.date_range.html#pandas.date_range>`_ for more examples of the behavior of ``date_range`` with each of the parameters. See Also -------- pandas.date_range """
  # noqa: E501
    # Adapted from pandas.core.indexes.datetimes._generate_range.
    if _count_not_none(start, end, periods, freq) != 3:
        raise ValueError(
            "Of the arguments 'start', 'end', 'periods', and 'freq', three "
            "must be specified at a time.")

    if start is not None:
        start = to_cftime_datetime(start, calendar)
        start = _maybe_normalize_date(start, normalize)
    if end is not None:
        end = to_cftime_datetime(end, calendar)
        end = _maybe_normalize_date(end, normalize)

    if freq is None:
        dates = _generate_linear_range(start, end, periods)
    else:
        offset = to_offset(freq)
        dates = np.array(list(_generate_range(start, end, periods, offset)))

    left_closed = False
    right_closed = False

    if closed is None:
        left_closed = True
        right_closed = True
    elif closed == 'left':
        left_closed = True
    elif closed == 'right':
        right_closed = True
    else:
        raise ValueError("Closed must be either 'left', 'right' or None")

    if (not left_closed and len(dates) and
            start is not None and dates[0] == start):
        dates = dates[1:]
    if (not right_closed and len(dates) and
            end is not None and dates[-1] == end):
        dates = dates[:-1]

    return CFTimeIndex(dates, name=name)