def extract_fwds(zero_rates_market_interpolated, liquid_maturities, fsp=20):
    """
    Extracts main (interpolated) forwards.
    Source: "Background Document On The Opinion On The 2020 Review Of Solvency II" p.787ff.

    :param zero_rates_market_interpolated: interpolated zero rates where index position indicates maturity (e.g. [4] corresponds to a maturity of 5y): 1d-Ndarray
    :param liquid_maturities: maturities of the respective interest rates: 1d-Ndarray
    :param fsp: maturity in years of first smoothing point: float
    :return: forwards_pre_fsp & forwards_llfr (rates required for llfr calculation): list
    """
    # Number of liquid maturities
    N = len(liquid_maturities)

    # Init
    forwards_pre_fsp = [zero_rates_market_interpolated[0]]
    forwards_llfr = []

    # Loop through each liquid rate pair and calculate required fwds
    for liquid_idx in range(1, N):

        t1 = liquid_maturities[liquid_idx]
        t2 = liquid_maturities[liquid_idx - 1]
        t = t1 - t2

        if t1 <= fsp:
            fwd = ((1 + zero_rates_market_interpolated[t1 - 1]) ** t1 / (
                        1 + zero_rates_market_interpolated[t2 - 1]) ** t2) ** (1 / t) - 1
            forwards_pre_fsp.append(fwd)

        if t1 == fsp:
            fwd = ((1 + zero_rates_market_interpolated[t1 - 1]) ** t1 / (
                        1 + zero_rates_market_interpolated[t2 - 1]) ** t2) ** (1 / t) - 1
            forwards_llfr.append(fwd)

        if t1 > fsp:
            t = t1 - fsp
            fwd = ((1 + zero_rates_market_interpolated[t1 - 1]) ** t1 / (
                        1 + zero_rates_market_interpolated[fsp - 1]) ** fsp) ** (1 / t) - 1
            forwards_llfr.append(fwd)

    return forwards_pre_fsp, forwards_llfr