From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6BAD91061B3F for ; Tue, 31 Mar 2026 12:42:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To: Content-Transfer-Encoding:Content-Type:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=rgA11HDczqj+mucrYhzIMHkePQsQPCUpPUEsQkXB2XY=; b=zlY/PvyJuB8gw90x+XIBnc/4FV dFN2Jj2TsqfYjEj/DA7DZwZvfio73azr2wArN/pjR5SXiEkXbdOspOQcpF7ftwxFOLjXjjXB3xIfe Xntz4zOGL4H4cHqsHD9bj5/0StCCCA5N4O4iITuA74cw2QWGXHRdpykbagR1BfneWK+JEXTj20cFo AW1ied+mQCmfVqfM+EZA9rILZVwpTMqt8cL/UWbfhGRwjZUjEp/qPQWmpR75bndQZUVTaVvyWScs4 GregjsciExXnsl1XxWbsRdHt8WULc9y2SG3E8ZnTMLtG6x/wkF70PTMA5MXh3764/mck4Yg5iEXJO LHOnSmZA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1w7YQe-0000000CxMD-2YXD; Tue, 31 Mar 2026 12:42:44 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1w7YQb-0000000CxLi-1kdU; Tue, 31 Mar 2026 12:42:42 +0000 Received: from ideasonboard.com (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B728C1B3C; Tue, 31 Mar 2026 14:41:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774960874; bh=MuDYKc4VyzVNWdEsNuECcwGP7U49LRul+h8RIZ2dN5k=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=VipjOevZSQDXQUE4sHeKth7vpFeB60K5tDrgU4MGM1A63N5PufKrXvdj/0PgL6fOX oLuwKjJUXjo4TbB3g5SLZVRXWmwtCaMBZQutvSt7eQNGpeeYnVEtTo11BtidF8o1Gf I9ekBezFqInSX8sGsD4am50+Xi9bKAs0ur3czK6s= Date: Tue, 31 Mar 2026 14:42:33 +0200 From: Jacopo Mondi To: =?utf-8?Q?Barnab=C3=A1s_P=C5=91cze?= Cc: Jacopo Mondi , Dafna Hirschfeld , Laurent Pinchart , Mauro Carvalho Chehab , Heiko Stuebner , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v1] media: rkisp1: Add support for CAC Message-ID: References: <20260323140216.1486161-1-barnabas.pocze@ideasonboard.com> <6c7ffd2d-94fa-4408-ac24-1e7adac95e5d@ideasonboard.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <6c7ffd2d-94fa-4408-ac24-1e7adac95e5d@ideasonboard.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260331_054241_749350_94BD4E49 X-CRM114-Status: GOOD ( 52.04 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Barnabás On Mon, Mar 30, 2026 at 04:40:18PM +0200, Barnabás Pőcze wrote: > Hi > > 2026. 03. 25. 16:21 keltezéssel, Jacopo Mondi írta: > > Hi Barnabás > > > > On Mon, Mar 23, 2026 at 03:02:16PM +0100, Barnabás Pőcze wrote: > > > The CAC block implements chromatic aberration correction. Expose it to > > > userspace using the extensible parameters format. This was tested on the > > > i.MX8MP platform, but based on available documentation it is also present > > > in the RK3399 variant (V10). Thus presumably also in later versions, > > > so no feature flag is introduced. > > > > > > Signed-off-by: Barnabás Pőcze > > > > Only minors.. > > > > > --- > > > .../platform/rockchip/rkisp1/rkisp1-params.c | 69 ++++++++++++ > > > .../platform/rockchip/rkisp1/rkisp1-regs.h | 21 +++- > > > include/uapi/linux/rkisp1-config.h | 106 +++++++++++++++++- > > > 3 files changed, 193 insertions(+), 3 deletions(-) > > > > > > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c > > > index 6442436a5e428..b889af9dcee45 100644 > > > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c > > > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c > > > @@ -64,6 +64,7 @@ union rkisp1_ext_params_config { > > > struct rkisp1_ext_params_compand_bls_config compand_bls; > > > struct rkisp1_ext_params_compand_curve_config compand_curve; > > > struct rkisp1_ext_params_wdr_config wdr; > > > + struct rkisp1_ext_params_cac_config cac; > > > }; > > > > > > enum rkisp1_params_formats { > > > @@ -1413,6 +1414,48 @@ static void rkisp1_wdr_config(struct rkisp1_params *params, > > > RKISP1_CIF_ISP_WDR_TONE_CURVE_YM_MASK); > > > } > > > > > > +static void > > > +rkisp1_cac_config(struct rkisp1_params *params, > > > + const struct rkisp1_cif_isp_cac_config *arg) > > > > Fits in one line without going over 80 cols > > This is what the other functions looks like, so went this this. It seems to me not all of them are broken, but only the ones that go over 80 cols in example: static void rkisp1_dpf_config(struct rkisp1_params *params, const struct rkisp1_cif_isp_dpf_config *arg) A detail anyway, up to you > > > > > > > +{ > > > + u32 regval; > > > + > > > + /* > > > + * The enable bit is in the same register (RKISP1_CIF_ISP_CAC_CTRL), > > > + * so only set the clipping mode, and do not modify the other bits. > > > + */ > > > + regval = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_CAC_CTRL); > > > + regval &= ~(RKISP1_CIF_ISP_CAC_CTRL_H_CLIP_MODE | > > > + RKISP1_CIF_ISP_CAC_CTRL_V_CLIP_MODE); > > > + regval |= FIELD_PREP(RKISP1_CIF_ISP_CAC_CTRL_H_CLIP_MODE, arg->h_clip_mode) | > > > + FIELD_PREP(RKISP1_CIF_ISP_CAC_CTRL_V_CLIP_MODE, arg->v_clip_mode); > > > + rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CAC_CTRL, regval); > > > + > > > + regval = FIELD_PREP(RKISP1_CIF_ISP_CAC_COUNT_START_H_MASK, arg->h_count_start) | > > > + FIELD_PREP(RKISP1_CIF_ISP_CAC_COUNT_START_V_MASK, arg->v_count_start); > > > + rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CAC_COUNT_START, regval); > > > + > > > + regval = FIELD_PREP(RKISP1_CIF_ISP_CAC_A_RED_MASK, arg->red[0]) | > > > + FIELD_PREP(RKISP1_CIF_ISP_CAC_A_BLUE_MASK, arg->blue[0]); > > > + rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CAC_A, regval); > > > + > > > + regval = FIELD_PREP(RKISP1_CIF_ISP_CAC_B_RED_MASK, arg->red[1]) | > > > + FIELD_PREP(RKISP1_CIF_ISP_CAC_B_BLUE_MASK, arg->blue[1]); > > > + rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CAC_B, regval); > > > + > > > + regval = FIELD_PREP(RKISP1_CIF_ISP_CAC_C_RED_MASK, arg->red[2]) | > > > + FIELD_PREP(RKISP1_CIF_ISP_CAC_C_BLUE_MASK, arg->blue[2]); > > > + rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CAC_C, regval); > > > + > > > + regval = FIELD_PREP(RKISP1_CIF_ISP_CAC_X_NORM_NF_MASK, arg->x_nf) | > > > + FIELD_PREP(RKISP1_CIF_ISP_CAC_X_NORM_NS_MASK, arg->x_ns); > > > + rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CAC_X_NORM, regval); > > > + > > > + regval = FIELD_PREP(RKISP1_CIF_ISP_CAC_Y_NORM_NF_MASK, arg->y_nf) | > > > + FIELD_PREP(RKISP1_CIF_ISP_CAC_Y_NORM_NS_MASK, arg->y_ns); > > > + rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CAC_Y_NORM, regval); > > > +} > > > + > > > static void > > > rkisp1_isp_isr_other_config(struct rkisp1_params *params, > > > const struct rkisp1_params_cfg *new_params) > > > @@ -2089,6 +2132,25 @@ static void rkisp1_ext_params_wdr(struct rkisp1_params *params, > > > RKISP1_CIF_ISP_WDR_CTRL_ENABLE); > > > } > > > > > > +static void rkisp1_ext_params_cac(struct rkisp1_params *params, > > > + const union rkisp1_ext_params_config *block) > > > +{ > > > + const struct rkisp1_ext_params_cac_config *cac = &block->cac; > > > + > > > + if (cac->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { > > > + rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CAC_CTRL, > > > + RKISP1_CIF_ISP_CAC_CTRL_ENABLE); > > > + return; > > > + } > > > + > > > + rkisp1_cac_config(params, &cac->config); > > > + > > > + if ((cac->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE) && > > > + !(params->enabled_blocks & BIT(cac->header.type))) > > > + rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CAC_CTRL, > > > + RKISP1_CIF_ISP_CAC_CTRL_ENABLE); > > > +} > > > + > > > typedef void (*rkisp1_block_handler)(struct rkisp1_params *params, > > > const union rkisp1_ext_params_config *config); > > > > > > @@ -2185,6 +2247,10 @@ static const struct rkisp1_ext_params_handler { > > > .handler = rkisp1_ext_params_wdr, > > > .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, > > > }, > > > + [RKISP1_EXT_PARAMS_BLOCK_TYPE_CAC] = { > > > + .handler = rkisp1_ext_params_cac, > > > + .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, > > > + }, > > > }; > > > > > > #define RKISP1_PARAMS_BLOCK_INFO(block, data) \ > > > @@ -2215,6 +2281,7 @@ rkisp1_ext_params_block_types_info[] = { > > > RKISP1_PARAMS_BLOCK_INFO(COMPAND_EXPAND, compand_curve), > > > RKISP1_PARAMS_BLOCK_INFO(COMPAND_COMPRESS, compand_curve), > > > RKISP1_PARAMS_BLOCK_INFO(WDR, wdr), > > > + RKISP1_PARAMS_BLOCK_INFO(CAC, cac), > > > }; > > > > > > static_assert(ARRAY_SIZE(rkisp1_ext_params_handlers) == > > > @@ -2474,6 +2541,8 @@ void rkisp1_params_disable(struct rkisp1_params *params) > > > rkisp1_ie_enable(params, false); > > > rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPF_MODE, > > > RKISP1_CIF_ISP_DPF_MODE_EN); > > > + rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CAC_CTRL, > > > + RKISP1_CIF_ISP_CAC_CTRL_ENABLE); > > > } > > > > > > static const struct rkisp1_params_ops rkisp1_v10_params_ops = { > > > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-regs.h b/drivers/media/platform/rockchip/rkisp1/rkisp1-regs.h > > > index fbeb186cde0d5..8e25537459bbd 100644 > > > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-regs.h > > > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-regs.h > > > @@ -724,6 +724,23 @@ > > > #define RKISP1_CIF_ISP_WDR_DMIN_STRENGTH_MASK GENMASK(20, 16) > > > #define RKISP1_CIF_ISP_WDR_DMIN_STRENGTH_MAX 16U > > > > > > +/* CAC */ > > > +#define RKISP1_CIF_ISP_CAC_CTRL_ENABLE BIT(0) > > > +#define RKISP1_CIF_ISP_CAC_CTRL_V_CLIP_MODE GENMASK(2, 1) > > > +#define RKISP1_CIF_ISP_CAC_CTRL_H_CLIP_MODE GENMASK(3, 3) > > > +#define RKISP1_CIF_ISP_CAC_COUNT_START_H_MASK GENMASK(12, 0) > > > +#define RKISP1_CIF_ISP_CAC_COUNT_START_V_MASK GENMASK(28, 16) > > > +#define RKISP1_CIF_ISP_CAC_A_RED_MASK GENMASK(8, 0) > > > +#define RKISP1_CIF_ISP_CAC_A_BLUE_MASK GENMASK(24, 16) > > > +#define RKISP1_CIF_ISP_CAC_B_RED_MASK GENMASK(8, 0) > > > +#define RKISP1_CIF_ISP_CAC_B_BLUE_MASK GENMASK(24, 16) > > > +#define RKISP1_CIF_ISP_CAC_C_RED_MASK GENMASK(8, 0) > > > +#define RKISP1_CIF_ISP_CAC_C_BLUE_MASK GENMASK(24, 16) > > > > All these masks for coefficients 0, 1 and 2 are identical. Maybe > > #define RKISP1_CIF_ISP_CAC_RED_MASK GENMASK(8, 0) > > #define RKISP1_CIF_ISP_CAC_BLUE_MASK GENMASK(24, 16) > > > > is enough > > Adjusted. > > > > > > > +#define RKISP1_CIF_ISP_CAC_X_NORM_NF_MASK GENMASK(4, 0) > > > +#define RKISP1_CIF_ISP_CAC_X_NORM_NS_MASK GENMASK(19, 16) > > > +#define RKISP1_CIF_ISP_CAC_Y_NORM_NF_MASK GENMASK(4, 0) > > > +#define RKISP1_CIF_ISP_CAC_Y_NORM_NS_MASK GENMASK(19, 16) > > Did the same with these as well. > Ah thanks! > > > > + > > > /* =================================================================== */ > > > /* CIF Registers */ > > > /* =================================================================== */ > > > @@ -1196,8 +1213,8 @@ > > > #define RKISP1_CIF_ISP_CAC_A (RKISP1_CIF_ISP_CAC_BASE + 0x00000008) > > > #define RKISP1_CIF_ISP_CAC_B (RKISP1_CIF_ISP_CAC_BASE + 0x0000000c) > > > #define RKISP1_CIF_ISP_CAC_C (RKISP1_CIF_ISP_CAC_BASE + 0x00000010) > > > -#define RKISP1_CIF_ISP_X_NORM (RKISP1_CIF_ISP_CAC_BASE + 0x00000014) > > > -#define RKISP1_CIF_ISP_Y_NORM (RKISP1_CIF_ISP_CAC_BASE + 0x00000018) > > > +#define RKISP1_CIF_ISP_CAC_X_NORM (RKISP1_CIF_ISP_CAC_BASE + 0x00000014) > > > +#define RKISP1_CIF_ISP_CAC_Y_NORM (RKISP1_CIF_ISP_CAC_BASE + 0x00000018) > > > > > > #define RKISP1_CIF_ISP_EXP_BASE 0x00002600 > > > #define RKISP1_CIF_ISP_EXP_CTRL (RKISP1_CIF_ISP_EXP_BASE + 0x00000000) > > > diff --git a/include/uapi/linux/rkisp1-config.h b/include/uapi/linux/rkisp1-config.h > > > index b2d2a71f7baff..d8acccaddd0e9 100644 > > > --- a/include/uapi/linux/rkisp1-config.h > > > +++ b/include/uapi/linux/rkisp1-config.h > > > @@ -967,6 +967,92 @@ struct rkisp1_cif_isp_wdr_config { > > > __u8 use_iref; > > > }; > > > > > > +/* > > > + * enum rkisp1_cif_isp_cac_h_clip_mode - horizontal clipping mode > > > + * > > > + * @RKISP1_CIF_ISP_CAC_H_CLIP_MODE_4PX: +/- 4 pixels > > > + * @RKISP1_CIF_ISP_CAC_H_CLIP_MODE_4_5PX: +/- 4/5 pixels depending on bayer position > > > + */ > > > +enum rkisp1_cif_isp_cac_h_clip_mode { > > > + RKISP1_CIF_ISP_CAC_H_CLIP_MODE_4PX = 0, > > > + RKISP1_CIF_ISP_CAC_H_CLIP_MODE_4_5PX = 1, > > > +}; > > > + > > > +/** > > > + * enum rkisp1_cif_isp_cac_v_clip_mode - vertical clipping mode > > > + * > > > + * @RKISP1_CIF_ISP_CAC_V_CLIP_MODE_2PX: +/- 2 pixels > > > + * @RKISP1_CIF_ISP_CAC_V_CLIP_MODE_3PX: +/- 3 pixels > > > + * @RKISP1_CIF_ISP_CAC_V_CLIP_MODE_3_4PX: +/- 3/4 pixels depending on bayer position > > > + */ > > > +enum rkisp1_cif_isp_cac_v_clip_mode { > > > + RKISP1_CIF_ISP_CAC_V_CLIP_MODE_2PX = 0, > > > + RKISP1_CIF_ISP_CAC_V_CLIP_MODE_3PX = 1, > > > + RKISP1_CIF_ISP_CAC_V_CLIP_MODE_3_4PX = 2, > > > +}; > > > + > > > +/** > > > + * struct rkisp1_cif_isp_cac_config - chromatic aberration correction configuration > > > + * > > > + * The correction is carried out by shifting the red and blue pixels relative > > > + * to the green ones, depending on the distance from the optical center: > > > > Yes, the distance to the center is one parameter, but the shifting > > amount depends on other things. I would drop the last part of the > > sentence and move the description of the two below fields after the > > text > > That's true, but within a specific image, the only varying quantity > is the distance, so I think it is important to emphasize that. > > And I also quite like this structure of > - description of step > - parameters of step > - description of step > ... > > so I would love to keep it like this, if that's ok? > Ok! > > > > > > + * > > > + * @h_count_start: horizontal coordinate of the optical center (13-bit unsigned integer; [1,8191]) > > > + * @v_count_start: vertical coordinate of the optical center (13-bit unsigned integer; [1,8191]) > > > > so these could go just before @x_nf > > > > > + * > > > + * For each pixel, the x/y distances from the optical center are calculated and > > > > I forgot: did we establish that the correction is applied to the > > euclidean distance or to x and y separately ? > > Given that there are two sets of "normalization" parameters, the assumption is that > at least the x/y distances are transformed separately. I see two reasonable choices > after that: (a) use the two distances separately, (b) use the radial distance. The > documentation says (b). However, testing with sensor test patterns suggests that > it is not the case (a horizontal/vertical boundary between appropriately colored > regions should have a curvature after the transformation with appropriate parameters). I now recall that you have been able to shift just one plan when using the sensor's test pattern > > > > > > > + * then transformed into the [0,255] range based on the following formula: > > > > s/transformed/normalized ? > > To be honest I vastly prefer "transform" / "map" over "normalize" here. You're right here, the below formula doesn't normalize the distance in an interval but just re-scale it > > > > > > > + * > > > + * (((d << 4) >> s) * f) >> 5 > > > + * > > > + * where `d` is the distance, `s` and `f` are the normalization parameters: > > > > Can you use 'ns' and 'nf' to match the below ? > > Adjusted. > Thanks! > > > > > > + * > > > + * @x_nf: horizontal normalization scale parameter (5-bit unsigned integer; [0,31]) > > > + * @x_ns: horizontal normalization shift parameter (4-bit unsigned integer; [0,15]) > > > + * > > > + * @y_nf: vertical normalization scale parameter (5-bit unsigned integer; [0,31]) > > > + * @y_ns: vertical normalization shift parameter (4-bit unsigned integer; [0,15]) > > > + * > > > + * These parameters should be chosen based on the image resolution, the position > > > + * of the optical center, and the shape of pixels: so that no normalized distance > > > > s/pixels:/pixels/ > > Replaced `:` with `,`. > > > > > > > + * is larger than 255. If the pixels have square shape, the two sets of parameters > > > + * should be equal. > > > + * > > > + * The actual amount of correction is calculated with a third degree polynomial: > > > + * > > > + * c[0] * r + c[1] * r^2 + c[2] * r^3 > > > + * > > > + * where `c` is the set of coefficients for the given color, and `r` is distance: > > > + * > > > + * @red: red coefficients (5.4 two's complement; [-16,15.9375]) > > > + * @blue: blue coefficients (5.4 two's complement; [-16,15.9375]) > > > + * > > > + * Finally, the amount is clipped as requested: > > > + * > > > + * @h_clip_mode: maximum horizontal shift (from enum rkisp1_cif_isp_cac_h_clip_mode) > > > + * @v_clip_mode: maximum vertical shift (from enum rkisp1_cif_isp_cac_v_clip_mode) > > > + * > > > + * A positive result will shift away from the optical center, while a negative > > > + * one will shift towards the optical center. In the latter case, the pixel > > > + * values at the edges are duplicated. > > > + */ > > > +struct rkisp1_cif_isp_cac_config { > > > + __u8 h_clip_mode; > > > + __u8 v_clip_mode; > > > + > > > + __u16 h_count_start; > > > + __u16 v_count_start; > > > + > > > + __u16 red[3]; > > > + __u16 blue[3]; > > > + > > > + __u8 x_nf; > > > + __u8 x_ns; > > > + > > > + __u8 y_nf; > > > + __u8 y_ns; > > > +}; > > > + > > > /*---------- PART2: Measurement Statistics ------------*/ > > > > > > /** > > > @@ -1161,6 +1247,7 @@ enum rkisp1_ext_params_block_type { > > > RKISP1_EXT_PARAMS_BLOCK_TYPE_COMPAND_EXPAND, > > > RKISP1_EXT_PARAMS_BLOCK_TYPE_COMPAND_COMPRESS, > > > RKISP1_EXT_PARAMS_BLOCK_TYPE_WDR, > > > + RKISP1_EXT_PARAMS_BLOCK_TYPE_CAC, > > > }; > > > > > > /* For backward compatibility */ > > > @@ -1507,6 +1594,22 @@ struct rkisp1_ext_params_wdr_config { > > > struct rkisp1_cif_isp_wdr_config config; > > > } __attribute__((aligned(8))); > > > > > > +/** > > > + * struct rkisp1_ext_params_cac_config - RkISP1 extensible params CAC config > > > + * > > > + * RkISP1 extensible parameters CAC block. > > > + * Identified by :c:type:`RKISP1_EXT_PARAMS_BLOCK_TYPE_CAC`. > > > + * > > > + * @header: The RkISP1 extensible parameters header, see > > > + * :c:type:`rkisp1_ext_params_block_header` > > > + * @config: CAC configuration, see > > > + * :c:type:`rkisp1_cif_isp_cac_config` > > > + */ > > > +struct rkisp1_ext_params_cac_config { > > > + struct rkisp1_ext_params_block_header header; > > > + struct rkisp1_cif_isp_cac_config config; > > > +} __attribute__((aligned(8))); > > > + > > > /* > > > * The rkisp1_ext_params_compand_curve_config structure is counted twice as it > > > * is used for both the COMPAND_EXPAND and COMPAND_COMPRESS block types. > > > @@ -1532,7 +1635,8 @@ struct rkisp1_ext_params_wdr_config { > > > sizeof(struct rkisp1_ext_params_compand_bls_config) +\ > > > sizeof(struct rkisp1_ext_params_compand_curve_config) +\ > > > sizeof(struct rkisp1_ext_params_compand_curve_config) +\ > > > - sizeof(struct rkisp1_ext_params_wdr_config)) > > > + sizeof(struct rkisp1_ext_params_wdr_config) +\ > > > + sizeof(struct rkisp1_ext_params_cac_config)) > > > > All minors, please add > > Reviewed-by: Jacopo Mondi > > > > Thanks > > j > > > > > > > > /** > > > * enum rksip1_ext_param_buffer_version - RkISP1 extensible parameters version > > > -- > > > 2.53.0 > > > > > > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 51CFC1061B3C for ; Tue, 31 Mar 2026 12:42:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=0s5F8pRL6UZauoo72PZRXVcuAFqDetjfgkUXZIYzTQE=; b=gpImHJSQfSFN5o K4hX4OJJF73NLPYOzX8PNiM0nx5nFrqLV+ndb59kOZ8o+xB9DypTHnJaLKqPQBJK25L4j4JK0HLdw ENHceTWHv8hX2E/zkt0Q429ZglpyvSzOmIeaKFzYWS0rOXkWnigLcyi7DrpEACM1zmayVef1IYrdA IoDbzFEmFfkOETqnUvHkn+y/aA+ncIzPe/OLLcGpftZebvY2Wcf+QVAc+QLZz1KfTRIBeWPtkFUQA mgTDYNudnA/w9CQGEZtRrRZ5CrzH29qNvpRzPiJFehhr++5a3bwl1TZReeJ1xiKRUawQdZtGJ5ikn xbcLENa4iGkf4W85cMHg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1w7YQe-0000000CxMI-3kub; Tue, 31 Mar 2026 12:42:44 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1w7YQb-0000000CxLi-1kdU; Tue, 31 Mar 2026 12:42:42 +0000 Received: from ideasonboard.com (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B728C1B3C; Tue, 31 Mar 2026 14:41:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774960874; bh=MuDYKc4VyzVNWdEsNuECcwGP7U49LRul+h8RIZ2dN5k=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=VipjOevZSQDXQUE4sHeKth7vpFeB60K5tDrgU4MGM1A63N5PufKrXvdj/0PgL6fOX oLuwKjJUXjo4TbB3g5SLZVRXWmwtCaMBZQutvSt7eQNGpeeYnVEtTo11BtidF8o1Gf I9ekBezFqInSX8sGsD4am50+Xi9bKAs0ur3czK6s= Date: Tue, 31 Mar 2026 14:42:33 +0200 From: Jacopo Mondi To: =?utf-8?Q?Barnab=C3=A1s_P=C5=91cze?= Cc: Jacopo Mondi , Dafna Hirschfeld , Laurent Pinchart , Mauro Carvalho Chehab , Heiko Stuebner , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v1] media: rkisp1: Add support for CAC Message-ID: References: <20260323140216.1486161-1-barnabas.pocze@ideasonboard.com> <6c7ffd2d-94fa-4408-ac24-1e7adac95e5d@ideasonboard.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <6c7ffd2d-94fa-4408-ac24-1e7adac95e5d@ideasonboard.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260331_054241_749350_94BD4E49 X-CRM114-Status: GOOD ( 52.04 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SGkgQmFybmFiw6FzCgpPbiBNb24sIE1hciAzMCwgMjAyNiBhdCAwNDo0MDoxOFBNICswMjAwLCBC YXJuYWLDoXMgUMWRY3plIHdyb3RlOgo+IEhpCj4KPiAyMDI2LiAwMy4gMjUuIDE2OjIxIGtlbHRl esOpc3NlbCwgSmFjb3BvIE1vbmRpIMOtcnRhOgo+ID4gSGkgQmFybmFiw6FzCj4gPgo+ID4gT24g TW9uLCBNYXIgMjMsIDIwMjYgYXQgMDM6MDI6MTZQTSArMDEwMCwgQmFybmFiw6FzIFDFkWN6ZSB3 cm90ZToKPiA+ID4gVGhlIENBQyBibG9jayBpbXBsZW1lbnRzIGNocm9tYXRpYyBhYmVycmF0aW9u IGNvcnJlY3Rpb24uIEV4cG9zZSBpdCB0bwo+ID4gPiB1c2Vyc3BhY2UgdXNpbmcgdGhlIGV4dGVu c2libGUgcGFyYW1ldGVycyBmb3JtYXQuIFRoaXMgd2FzIHRlc3RlZCBvbiB0aGUKPiA+ID4gaS5N WDhNUCBwbGF0Zm9ybSwgYnV0IGJhc2VkIG9uIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGl0IGlz IGFsc28gcHJlc2VudAo+ID4gPiBpbiB0aGUgUkszMzk5IHZhcmlhbnQgKFYxMCkuIFRodXMgcHJl c3VtYWJseSBhbHNvIGluIGxhdGVyIHZlcnNpb25zLAo+ID4gPiBzbyBubyBmZWF0dXJlIGZsYWcg aXMgaW50cm9kdWNlZC4KPiA+ID4KPiA+ID4gU2lnbmVkLW9mZi1ieTogQmFybmFiw6FzIFDFkWN6 ZSA8YmFybmFiYXMucG9jemVAaWRlYXNvbmJvYXJkLmNvbT4KPiA+Cj4gPiBPbmx5IG1pbm9ycy4u Cj4gPgo+ID4gPiAtLS0KPiA+ID4gICAuLi4vcGxhdGZvcm0vcm9ja2NoaXAvcmtpc3AxL3JraXNw MS1wYXJhbXMuYyAgfCAgNjkgKysrKysrKysrKysrCj4gPiA+ICAgLi4uL3BsYXRmb3JtL3JvY2tj aGlwL3JraXNwMS9ya2lzcDEtcmVncy5oICAgIHwgIDIxICsrKy0KPiA+ID4gICBpbmNsdWRlL3Vh cGkvbGludXgvcmtpc3AxLWNvbmZpZy5oICAgICAgICAgICAgfCAxMDYgKysrKysrKysrKysrKysr KystCj4gPiA+ICAgMyBmaWxlcyBjaGFuZ2VkLCAxOTMgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlv bnMoLSkKPiA+ID4KPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcm9j a2NoaXAvcmtpc3AxL3JraXNwMS1wYXJhbXMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcm9j a2NoaXAvcmtpc3AxL3JraXNwMS1wYXJhbXMuYwo+ID4gPiBpbmRleCA2NDQyNDM2YTVlNDI4Li5i ODg5YWY5ZGNlZTQ1IDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3Jv Y2tjaGlwL3JraXNwMS9ya2lzcDEtcGFyYW1zLmMKPiA+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9yb2NrY2hpcC9ya2lzcDEvcmtpc3AxLXBhcmFtcy5jCj4gPiA+IEBAIC02NCw2ICs2 NCw3IEBAIHVuaW9uIHJraXNwMV9leHRfcGFyYW1zX2NvbmZpZyB7Cj4gPiA+ICAgCXN0cnVjdCBy a2lzcDFfZXh0X3BhcmFtc19jb21wYW5kX2Jsc19jb25maWcgY29tcGFuZF9ibHM7Cj4gPiA+ICAg CXN0cnVjdCBya2lzcDFfZXh0X3BhcmFtc19jb21wYW5kX2N1cnZlX2NvbmZpZyBjb21wYW5kX2N1 cnZlOwo+ID4gPiAgIAlzdHJ1Y3Qgcmtpc3AxX2V4dF9wYXJhbXNfd2RyX2NvbmZpZyB3ZHI7Cj4g PiA+ICsJc3RydWN0IHJraXNwMV9leHRfcGFyYW1zX2NhY19jb25maWcgY2FjOwo+ID4gPiAgIH07 Cj4gPiA+Cj4gPiA+ICAgZW51bSBya2lzcDFfcGFyYW1zX2Zvcm1hdHMgewo+ID4gPiBAQCAtMTQx Myw2ICsxNDE0LDQ4IEBAIHN0YXRpYyB2b2lkIHJraXNwMV93ZHJfY29uZmlnKHN0cnVjdCBya2lz cDFfcGFyYW1zICpwYXJhbXMsCj4gPiA+ICAgCQkJCSAgICAgUktJU1AxX0NJRl9JU1BfV0RSX1RP TkVfQ1VSVkVfWU1fTUFTSyk7Cj4gPiA+ICAgfQo+ID4gPgo+ID4gPiArc3RhdGljIHZvaWQKPiA+ ID4gK3JraXNwMV9jYWNfY29uZmlnKHN0cnVjdCBya2lzcDFfcGFyYW1zICpwYXJhbXMsCj4gPiA+ ICsJCSAgY29uc3Qgc3RydWN0IHJraXNwMV9jaWZfaXNwX2NhY19jb25maWcgKmFyZykKPiA+Cj4g PiBGaXRzIGluIG9uZSBsaW5lIHdpdGhvdXQgZ29pbmcgb3ZlciA4MCBjb2xzCj4KPiBUaGlzIGlz IHdoYXQgdGhlIG90aGVyIGZ1bmN0aW9ucyBsb29rcyBsaWtlLCBzbyB3ZW50IHRoaXMgdGhpcy4K Ckl0IHNlZW1zIHRvIG1lIG5vdCBhbGwgb2YgdGhlbSBhcmUgYnJva2VuLCBidXQgb25seSB0aGUg b25lcyB0aGF0IGdvCm92ZXIgODAgY29scwoKaW4gZXhhbXBsZToKCnN0YXRpYyB2b2lkIHJraXNw MV9kcGZfY29uZmlnKHN0cnVjdCBya2lzcDFfcGFyYW1zICpwYXJhbXMsCgkJCSAgICAgIGNvbnN0 IHN0cnVjdCBya2lzcDFfY2lmX2lzcF9kcGZfY29uZmlnICphcmcpCgpBIGRldGFpbCBhbnl3YXks IHVwIHRvIHlvdQoKPgo+Cj4gPgo+ID4gPiArewo+ID4gPiArCXUzMiByZWd2YWw7Cj4gPiA+ICsK PiA+ID4gKwkvKgo+ID4gPiArCSAqIFRoZSBlbmFibGUgYml0IGlzIGluIHRoZSBzYW1lIHJlZ2lz dGVyIChSS0lTUDFfQ0lGX0lTUF9DQUNfQ1RSTCksCj4gPiA+ICsJICogc28gb25seSBzZXQgdGhl IGNsaXBwaW5nIG1vZGUsIGFuZCBkbyBub3QgbW9kaWZ5IHRoZSBvdGhlciBiaXRzLgo+ID4gPiAr CSAqLwo+ID4gPiArCXJlZ3ZhbCA9IHJraXNwMV9yZWFkKHBhcmFtcy0+cmtpc3AxLCBSS0lTUDFf Q0lGX0lTUF9DQUNfQ1RSTCk7Cj4gPiA+ICsJcmVndmFsICY9IH4oUktJU1AxX0NJRl9JU1BfQ0FD X0NUUkxfSF9DTElQX01PREUgfAo+ID4gPiArCQkgICAgUktJU1AxX0NJRl9JU1BfQ0FDX0NUUkxf Vl9DTElQX01PREUpOwo+ID4gPiArCXJlZ3ZhbCB8PSBGSUVMRF9QUkVQKFJLSVNQMV9DSUZfSVNQ X0NBQ19DVFJMX0hfQ0xJUF9NT0RFLCBhcmctPmhfY2xpcF9tb2RlKSB8Cj4gPiA+ICsJCSAgRklF TERfUFJFUChSS0lTUDFfQ0lGX0lTUF9DQUNfQ1RSTF9WX0NMSVBfTU9ERSwgYXJnLT52X2NsaXBf bW9kZSk7Cj4gPiA+ICsJcmtpc3AxX3dyaXRlKHBhcmFtcy0+cmtpc3AxLCBSS0lTUDFfQ0lGX0lT UF9DQUNfQ1RSTCwgcmVndmFsKTsKPiA+ID4gKwo+ID4gPiArCXJlZ3ZhbCA9IEZJRUxEX1BSRVAo UktJU1AxX0NJRl9JU1BfQ0FDX0NPVU5UX1NUQVJUX0hfTUFTSywgYXJnLT5oX2NvdW50X3N0YXJ0 KSB8Cj4gPiA+ICsJCSBGSUVMRF9QUkVQKFJLSVNQMV9DSUZfSVNQX0NBQ19DT1VOVF9TVEFSVF9W X01BU0ssIGFyZy0+dl9jb3VudF9zdGFydCk7Cj4gPiA+ICsJcmtpc3AxX3dyaXRlKHBhcmFtcy0+ cmtpc3AxLCBSS0lTUDFfQ0lGX0lTUF9DQUNfQ09VTlRfU1RBUlQsIHJlZ3ZhbCk7Cj4gPiA+ICsK PiA+ID4gKwlyZWd2YWwgPSBGSUVMRF9QUkVQKFJLSVNQMV9DSUZfSVNQX0NBQ19BX1JFRF9NQVNL LCBhcmctPnJlZFswXSkgfAo+ID4gPiArCQkgRklFTERfUFJFUChSS0lTUDFfQ0lGX0lTUF9DQUNf QV9CTFVFX01BU0ssIGFyZy0+Ymx1ZVswXSk7Cj4gPiA+ICsJcmtpc3AxX3dyaXRlKHBhcmFtcy0+ cmtpc3AxLCBSS0lTUDFfQ0lGX0lTUF9DQUNfQSwgcmVndmFsKTsKPiA+ID4gKwo+ID4gPiArCXJl Z3ZhbCA9IEZJRUxEX1BSRVAoUktJU1AxX0NJRl9JU1BfQ0FDX0JfUkVEX01BU0ssIGFyZy0+cmVk WzFdKSB8Cj4gPiA+ICsJCSBGSUVMRF9QUkVQKFJLSVNQMV9DSUZfSVNQX0NBQ19CX0JMVUVfTUFT SywgYXJnLT5ibHVlWzFdKTsKPiA+ID4gKwlya2lzcDFfd3JpdGUocGFyYW1zLT5ya2lzcDEsIFJL SVNQMV9DSUZfSVNQX0NBQ19CLCByZWd2YWwpOwo+ID4gPiArCj4gPiA+ICsJcmVndmFsID0gRklF TERfUFJFUChSS0lTUDFfQ0lGX0lTUF9DQUNfQ19SRURfTUFTSywgYXJnLT5yZWRbMl0pIHwKPiA+ ID4gKwkJIEZJRUxEX1BSRVAoUktJU1AxX0NJRl9JU1BfQ0FDX0NfQkxVRV9NQVNLLCBhcmctPmJs dWVbMl0pOwo+ID4gPiArCXJraXNwMV93cml0ZShwYXJhbXMtPnJraXNwMSwgUktJU1AxX0NJRl9J U1BfQ0FDX0MsIHJlZ3ZhbCk7Cj4gPiA+ICsKPiA+ID4gKwlyZWd2YWwgPSBGSUVMRF9QUkVQKFJL SVNQMV9DSUZfSVNQX0NBQ19YX05PUk1fTkZfTUFTSywgYXJnLT54X25mKSB8Cj4gPiA+ICsJCSBG SUVMRF9QUkVQKFJLSVNQMV9DSUZfSVNQX0NBQ19YX05PUk1fTlNfTUFTSywgYXJnLT54X25zKTsK PiA+ID4gKwlya2lzcDFfd3JpdGUocGFyYW1zLT5ya2lzcDEsIFJLSVNQMV9DSUZfSVNQX0NBQ19Y X05PUk0sIHJlZ3ZhbCk7Cj4gPiA+ICsKPiA+ID4gKwlyZWd2YWwgPSBGSUVMRF9QUkVQKFJLSVNQ MV9DSUZfSVNQX0NBQ19ZX05PUk1fTkZfTUFTSywgYXJnLT55X25mKSB8Cj4gPiA+ICsJCSBGSUVM RF9QUkVQKFJLSVNQMV9DSUZfSVNQX0NBQ19ZX05PUk1fTlNfTUFTSywgYXJnLT55X25zKTsKPiA+ ID4gKwlya2lzcDFfd3JpdGUocGFyYW1zLT5ya2lzcDEsIFJLSVNQMV9DSUZfSVNQX0NBQ19ZX05P Uk0sIHJlZ3ZhbCk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gICBzdGF0aWMgdm9pZAo+ID4gPiAg IHJraXNwMV9pc3BfaXNyX290aGVyX2NvbmZpZyhzdHJ1Y3Qgcmtpc3AxX3BhcmFtcyAqcGFyYW1z LAo+ID4gPiAgIAkJCSAgICBjb25zdCBzdHJ1Y3Qgcmtpc3AxX3BhcmFtc19jZmcgKm5ld19wYXJh bXMpCj4gPiA+IEBAIC0yMDg5LDYgKzIxMzIsMjUgQEAgc3RhdGljIHZvaWQgcmtpc3AxX2V4dF9w YXJhbXNfd2RyKHN0cnVjdCBya2lzcDFfcGFyYW1zICpwYXJhbXMsCj4gPiA+ICAgCQkJCSAgICAg IFJLSVNQMV9DSUZfSVNQX1dEUl9DVFJMX0VOQUJMRSk7Cj4gPiA+ICAgfQo+ID4gPgo+ID4gPiAr c3RhdGljIHZvaWQgcmtpc3AxX2V4dF9wYXJhbXNfY2FjKHN0cnVjdCBya2lzcDFfcGFyYW1zICpw YXJhbXMsCj4gPiA+ICsJCQkJICBjb25zdCB1bmlvbiBya2lzcDFfZXh0X3BhcmFtc19jb25maWcg KmJsb2NrKQo+ID4gPiArewo+ID4gPiArCWNvbnN0IHN0cnVjdCBya2lzcDFfZXh0X3BhcmFtc19j YWNfY29uZmlnICpjYWMgPSAmYmxvY2stPmNhYzsKPiA+ID4gKwo+ID4gPiArCWlmIChjYWMtPmhl YWRlci5mbGFncyAmIFJLSVNQMV9FWFRfUEFSQU1TX0ZMX0JMT0NLX0RJU0FCTEUpIHsKPiA+ID4g KwkJcmtpc3AxX3BhcmFtX2NsZWFyX2JpdHMocGFyYW1zLCBSS0lTUDFfQ0lGX0lTUF9DQUNfQ1RS TCwKPiA+ID4gKwkJCQkJUktJU1AxX0NJRl9JU1BfQ0FDX0NUUkxfRU5BQkxFKTsKPiA+ID4gKwkJ cmV0dXJuOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCXJraXNwMV9jYWNfY29uZmlnKHBhcmFt cywgJmNhYy0+Y29uZmlnKTsKPiA+ID4gKwo+ID4gPiArCWlmICgoY2FjLT5oZWFkZXIuZmxhZ3Mg JiBSS0lTUDFfRVhUX1BBUkFNU19GTF9CTE9DS19FTkFCTEUpICYmCj4gPiA+ICsJICAgICEocGFy YW1zLT5lbmFibGVkX2Jsb2NrcyAmIEJJVChjYWMtPmhlYWRlci50eXBlKSkpCj4gPiA+ICsJCXJr aXNwMV9wYXJhbV9zZXRfYml0cyhwYXJhbXMsIFJLSVNQMV9DSUZfSVNQX0NBQ19DVFJMLAo+ID4g PiArCQkJCSAgICAgIFJLSVNQMV9DSUZfSVNQX0NBQ19DVFJMX0VOQUJMRSk7Cj4gPiA+ICt9Cj4g PiA+ICsKPiA+ID4gICB0eXBlZGVmIHZvaWQgKCpya2lzcDFfYmxvY2tfaGFuZGxlcikoc3RydWN0 IHJraXNwMV9wYXJhbXMgKnBhcmFtcywKPiA+ID4gICAJCQkgICAgIGNvbnN0IHVuaW9uIHJraXNw MV9leHRfcGFyYW1zX2NvbmZpZyAqY29uZmlnKTsKPiA+ID4KPiA+ID4gQEAgLTIxODUsNiArMjI0 NywxMCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHJraXNwMV9leHRfcGFyYW1zX2hhbmRsZXIgewo+ ID4gPiAgIAkJLmhhbmRsZXIJPSBya2lzcDFfZXh0X3BhcmFtc193ZHIsCj4gPiA+ICAgCQkuZ3Jv dXAJCT0gUktJU1AxX0VYVF9QQVJBTVNfQkxPQ0tfR1JPVVBfT1RIRVJTLAo+ID4gPiAgIAl9LAo+ ID4gPiArCVtSS0lTUDFfRVhUX1BBUkFNU19CTE9DS19UWVBFX0NBQ10gPSB7Cj4gPiA+ICsJCS5o YW5kbGVyCT0gcmtpc3AxX2V4dF9wYXJhbXNfY2FjLAo+ID4gPiArCQkuZ3JvdXAJCT0gUktJU1Ax X0VYVF9QQVJBTVNfQkxPQ0tfR1JPVVBfT1RIRVJTLAo+ID4gPiArCX0sCj4gPiA+ICAgfTsKPiA+ ID4KPiA+ID4gICAjZGVmaW5lIFJLSVNQMV9QQVJBTVNfQkxPQ0tfSU5GTyhibG9jaywgZGF0YSkg XAo+ID4gPiBAQCAtMjIxNSw2ICsyMjgxLDcgQEAgcmtpc3AxX2V4dF9wYXJhbXNfYmxvY2tfdHlw ZXNfaW5mb1tdID0gewo+ID4gPiAgIAlSS0lTUDFfUEFSQU1TX0JMT0NLX0lORk8oQ09NUEFORF9F WFBBTkQsIGNvbXBhbmRfY3VydmUpLAo+ID4gPiAgIAlSS0lTUDFfUEFSQU1TX0JMT0NLX0lORk8o Q09NUEFORF9DT01QUkVTUywgY29tcGFuZF9jdXJ2ZSksCj4gPiA+ICAgCVJLSVNQMV9QQVJBTVNf QkxPQ0tfSU5GTyhXRFIsIHdkciksCj4gPiA+ICsJUktJU1AxX1BBUkFNU19CTE9DS19JTkZPKENB QywgY2FjKSwKPiA+ID4gICB9Owo+ID4gPgo+ID4gPiAgIHN0YXRpY19hc3NlcnQoQVJSQVlfU0la RShya2lzcDFfZXh0X3BhcmFtc19oYW5kbGVycykgPT0KPiA+ID4gQEAgLTI0NzQsNiArMjU0MSw4 IEBAIHZvaWQgcmtpc3AxX3BhcmFtc19kaXNhYmxlKHN0cnVjdCBya2lzcDFfcGFyYW1zICpwYXJh bXMpCj4gPiA+ICAgCXJraXNwMV9pZV9lbmFibGUocGFyYW1zLCBmYWxzZSk7Cj4gPiA+ICAgCXJr aXNwMV9wYXJhbV9jbGVhcl9iaXRzKHBhcmFtcywgUktJU1AxX0NJRl9JU1BfRFBGX01PREUsCj4g PiA+ICAgCQkJCVJLSVNQMV9DSUZfSVNQX0RQRl9NT0RFX0VOKTsKPiA+ID4gKwlya2lzcDFfcGFy YW1fY2xlYXJfYml0cyhwYXJhbXMsIFJLSVNQMV9DSUZfSVNQX0NBQ19DVFJMLAo+ID4gPiArCQkJ CVJLSVNQMV9DSUZfSVNQX0NBQ19DVFJMX0VOQUJMRSk7Cj4gPiA+ICAgfQo+ID4gPgo+ID4gPiAg IHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmtpc3AxX3BhcmFtc19vcHMgcmtpc3AxX3YxMF9wYXJhbXNf b3BzID0gewo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9yb2NrY2hp cC9ya2lzcDEvcmtpc3AxLXJlZ3MuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcm9ja2NoaXAv cmtpc3AxL3JraXNwMS1yZWdzLmgKPiA+ID4gaW5kZXggZmJlYjE4NmNkZTBkNS4uOGUyNTUzNzQ1 OWJiZCAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9yb2NrY2hpcC9y a2lzcDEvcmtpc3AxLXJlZ3MuaAo+ID4gPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3Jv Y2tjaGlwL3JraXNwMS9ya2lzcDEtcmVncy5oCj4gPiA+IEBAIC03MjQsNiArNzI0LDIzIEBACj4g PiA+ICAgI2RlZmluZSBSS0lTUDFfQ0lGX0lTUF9XRFJfRE1JTl9TVFJFTkdUSF9NQVNLCQlHRU5N QVNLKDIwLCAxNikKPiA+ID4gICAjZGVmaW5lIFJLSVNQMV9DSUZfSVNQX1dEUl9ETUlOX1NUUkVO R1RIX01BWAkJMTZVCj4gPiA+Cj4gPiA+ICsvKiBDQUMgKi8KPiA+ID4gKyNkZWZpbmUgUktJU1Ax X0NJRl9JU1BfQ0FDX0NUUkxfRU5BQkxFCQlCSVQoMCkKPiA+ID4gKyNkZWZpbmUgUktJU1AxX0NJ Rl9JU1BfQ0FDX0NUUkxfVl9DTElQX01PREUJR0VOTUFTSygyLCAxKQo+ID4gPiArI2RlZmluZSBS S0lTUDFfQ0lGX0lTUF9DQUNfQ1RSTF9IX0NMSVBfTU9ERQlHRU5NQVNLKDMsIDMpCj4gPiA+ICsj ZGVmaW5lIFJLSVNQMV9DSUZfSVNQX0NBQ19DT1VOVF9TVEFSVF9IX01BU0sJR0VOTUFTSygxMiwg MCkKPiA+ID4gKyNkZWZpbmUgUktJU1AxX0NJRl9JU1BfQ0FDX0NPVU5UX1NUQVJUX1ZfTUFTSwlH RU5NQVNLKDI4LCAxNikKPiA+ID4gKyNkZWZpbmUgUktJU1AxX0NJRl9JU1BfQ0FDX0FfUkVEX01B U0sJCUdFTk1BU0soOCwgMCkKPiA+ID4gKyNkZWZpbmUgUktJU1AxX0NJRl9JU1BfQ0FDX0FfQkxV RV9NQVNLCQlHRU5NQVNLKDI0LCAxNikKPiA+ID4gKyNkZWZpbmUgUktJU1AxX0NJRl9JU1BfQ0FD X0JfUkVEX01BU0sJCUdFTk1BU0soOCwgMCkKPiA+ID4gKyNkZWZpbmUgUktJU1AxX0NJRl9JU1Bf Q0FDX0JfQkxVRV9NQVNLCQlHRU5NQVNLKDI0LCAxNikKPiA+ID4gKyNkZWZpbmUgUktJU1AxX0NJ Rl9JU1BfQ0FDX0NfUkVEX01BU0sJCUdFTk1BU0soOCwgMCkKPiA+ID4gKyNkZWZpbmUgUktJU1Ax X0NJRl9JU1BfQ0FDX0NfQkxVRV9NQVNLCQlHRU5NQVNLKDI0LCAxNikKPiA+Cj4gPiBBbGwgdGhl c2UgbWFza3MgZm9yIGNvZWZmaWNpZW50cyAwLCAxIGFuZCAyIGFyZSBpZGVudGljYWwuIE1heWJl Cj4gPiAjZGVmaW5lIFJLSVNQMV9DSUZfSVNQX0NBQ19SRURfTUFTSwkJR0VOTUFTSyg4LCAwKQo+ ID4gI2RlZmluZSBSS0lTUDFfQ0lGX0lTUF9DQUNfQkxVRV9NQVNLCQlHRU5NQVNLKDI0LCAxNikK PiA+Cj4gPiBpcyBlbm91Z2gKPgo+IEFkanVzdGVkLgo+Cj4KPiA+Cj4gPiA+ICsjZGVmaW5lIFJL SVNQMV9DSUZfSVNQX0NBQ19YX05PUk1fTkZfTUFTSwlHRU5NQVNLKDQsIDApCj4gPiA+ICsjZGVm aW5lIFJLSVNQMV9DSUZfSVNQX0NBQ19YX05PUk1fTlNfTUFTSwlHRU5NQVNLKDE5LCAxNikKPiA+ ID4gKyNkZWZpbmUgUktJU1AxX0NJRl9JU1BfQ0FDX1lfTk9STV9ORl9NQVNLCUdFTk1BU0soNCwg MCkKPiA+ID4gKyNkZWZpbmUgUktJU1AxX0NJRl9JU1BfQ0FDX1lfTk9STV9OU19NQVNLCUdFTk1B U0soMTksIDE2KQo+Cj4gRGlkIHRoZSBzYW1lIHdpdGggdGhlc2UgYXMgd2VsbC4KPgoKQWggdGhh bmtzIQoKPgo+ID4gPiArCj4gPiA+ICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwo+ID4gPiAgIC8qICAgICAg ICAgICAgICAgICAgICAgICAgICAgIENJRiBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKi8KPiA+ID4gICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCj4gPiA+IEBAIC0xMTk2LDggKzEyMTMs OCBAQAo+ID4gPiAgICNkZWZpbmUgUktJU1AxX0NJRl9JU1BfQ0FDX0EJCQkoUktJU1AxX0NJRl9J U1BfQ0FDX0JBU0UgKyAweDAwMDAwMDA4KQo+ID4gPiAgICNkZWZpbmUgUktJU1AxX0NJRl9JU1Bf Q0FDX0IJCQkoUktJU1AxX0NJRl9JU1BfQ0FDX0JBU0UgKyAweDAwMDAwMDBjKQo+ID4gPiAgICNk ZWZpbmUgUktJU1AxX0NJRl9JU1BfQ0FDX0MJCQkoUktJU1AxX0NJRl9JU1BfQ0FDX0JBU0UgKyAw eDAwMDAwMDEwKQo+ID4gPiAtI2RlZmluZSBSS0lTUDFfQ0lGX0lTUF9YX05PUk0JCQkoUktJU1Ax X0NJRl9JU1BfQ0FDX0JBU0UgKyAweDAwMDAwMDE0KQo+ID4gPiAtI2RlZmluZSBSS0lTUDFfQ0lG X0lTUF9ZX05PUk0JCQkoUktJU1AxX0NJRl9JU1BfQ0FDX0JBU0UgKyAweDAwMDAwMDE4KQo+ID4g PiArI2RlZmluZSBSS0lTUDFfQ0lGX0lTUF9DQUNfWF9OT1JNCQkoUktJU1AxX0NJRl9JU1BfQ0FD X0JBU0UgKyAweDAwMDAwMDE0KQo+ID4gPiArI2RlZmluZSBSS0lTUDFfQ0lGX0lTUF9DQUNfWV9O T1JNCQkoUktJU1AxX0NJRl9JU1BfQ0FDX0JBU0UgKyAweDAwMDAwMDE4KQo+ID4gPgo+ID4gPiAg ICNkZWZpbmUgUktJU1AxX0NJRl9JU1BfRVhQX0JBU0UJCQkweDAwMDAyNjAwCj4gPiA+ICAgI2Rl ZmluZSBSS0lTUDFfQ0lGX0lTUF9FWFBfQ1RSTAkJCShSS0lTUDFfQ0lGX0lTUF9FWFBfQkFTRSAr IDB4MDAwMDAwMDApCj4gPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcmtpc3Ax LWNvbmZpZy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3JraXNwMS1jb25maWcuaAo+ID4gPiBpbmRl eCBiMmQyYTcxZjdiYWZmLi5kOGFjY2NhZGRkMGU5IDEwMDY0NAo+ID4gPiAtLS0gYS9pbmNsdWRl L3VhcGkvbGludXgvcmtpc3AxLWNvbmZpZy5oCj4gPiA+ICsrKyBiL2luY2x1ZGUvdWFwaS9saW51 eC9ya2lzcDEtY29uZmlnLmgKPiA+ID4gQEAgLTk2Nyw2ICs5NjcsOTIgQEAgc3RydWN0IHJraXNw MV9jaWZfaXNwX3dkcl9jb25maWcgewo+ID4gPiAgIAlfX3U4IHVzZV9pcmVmOwo+ID4gPiAgIH07 Cj4gPiA+Cj4gPiA+ICsvKgo+ID4gPiArICogZW51bSBya2lzcDFfY2lmX2lzcF9jYWNfaF9jbGlw X21vZGUgLSBob3Jpem9udGFsIGNsaXBwaW5nIG1vZGUKPiA+ID4gKyAqCj4gPiA+ICsgKiBAUktJ U1AxX0NJRl9JU1BfQ0FDX0hfQ0xJUF9NT0RFXzRQWDogKy8tIDQgcGl4ZWxzCj4gPiA+ICsgKiBA UktJU1AxX0NJRl9JU1BfQ0FDX0hfQ0xJUF9NT0RFXzRfNVBYOiArLy0gNC81IHBpeGVscyBkZXBl bmRpbmcgb24gYmF5ZXIgcG9zaXRpb24KPiA+ID4gKyAqLwo+ID4gPiArZW51bSBya2lzcDFfY2lm X2lzcF9jYWNfaF9jbGlwX21vZGUgewo+ID4gPiArCVJLSVNQMV9DSUZfSVNQX0NBQ19IX0NMSVBf TU9ERV80UFggPSAwLAo+ID4gPiArCVJLSVNQMV9DSUZfSVNQX0NBQ19IX0NMSVBfTU9ERV80XzVQ WCA9IDEsCj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+ICsvKioKPiA+ID4gKyAqIGVudW0gcmtpc3Ax X2NpZl9pc3BfY2FjX3ZfY2xpcF9tb2RlIC0gdmVydGljYWwgY2xpcHBpbmcgbW9kZQo+ID4gPiAr ICoKPiA+ID4gKyAqIEBSS0lTUDFfQ0lGX0lTUF9DQUNfVl9DTElQX01PREVfMlBYOiArLy0gMiBw aXhlbHMKPiA+ID4gKyAqIEBSS0lTUDFfQ0lGX0lTUF9DQUNfVl9DTElQX01PREVfM1BYOiArLy0g MyBwaXhlbHMKPiA+ID4gKyAqIEBSS0lTUDFfQ0lGX0lTUF9DQUNfVl9DTElQX01PREVfM180UFg6 ICsvLSAzLzQgcGl4ZWxzIGRlcGVuZGluZyBvbiBiYXllciBwb3NpdGlvbgo+ID4gPiArICovCj4g PiA+ICtlbnVtIHJraXNwMV9jaWZfaXNwX2NhY192X2NsaXBfbW9kZSB7Cj4gPiA+ICsJUktJU1Ax X0NJRl9JU1BfQ0FDX1ZfQ0xJUF9NT0RFXzJQWCA9IDAsCj4gPiA+ICsJUktJU1AxX0NJRl9JU1Bf Q0FDX1ZfQ0xJUF9NT0RFXzNQWCA9IDEsCj4gPiA+ICsJUktJU1AxX0NJRl9JU1BfQ0FDX1ZfQ0xJ UF9NT0RFXzNfNFBYID0gMiwKPiA+ID4gK307Cj4gPiA+ICsKPiA+ID4gKy8qKgo+ID4gPiArICog c3RydWN0IHJraXNwMV9jaWZfaXNwX2NhY19jb25maWcgLSBjaHJvbWF0aWMgYWJlcnJhdGlvbiBj b3JyZWN0aW9uIGNvbmZpZ3VyYXRpb24KPiA+ID4gKyAqCj4gPiA+ICsgKiBUaGUgY29ycmVjdGlv biBpcyBjYXJyaWVkIG91dCBieSBzaGlmdGluZyB0aGUgcmVkIGFuZCBibHVlIHBpeGVscyByZWxh dGl2ZQo+ID4gPiArICogdG8gdGhlIGdyZWVuIG9uZXMsIGRlcGVuZGluZyBvbiB0aGUgZGlzdGFu Y2UgZnJvbSB0aGUgb3B0aWNhbCBjZW50ZXI6Cj4gPgo+ID4gWWVzLCB0aGUgZGlzdGFuY2UgdG8g dGhlIGNlbnRlciBpcyBvbmUgcGFyYW1ldGVyLCBidXQgdGhlIHNoaWZ0aW5nCj4gPiBhbW91bnQg ZGVwZW5kcyBvbiBvdGhlciB0aGluZ3MuIEkgd291bGQgZHJvcCB0aGUgbGFzdCBwYXJ0IG9mIHRo ZQo+ID4gc2VudGVuY2UgYW5kIG1vdmUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0d28gYmVsb3cg ZmllbGRzIGFmdGVyIHRoZQo+ID4gdGV4dAo+Cj4gVGhhdCdzIHRydWUsIGJ1dCB3aXRoaW4gYSBz cGVjaWZpYyBpbWFnZSwgdGhlIG9ubHkgdmFyeWluZyBxdWFudGl0eQo+IGlzIHRoZSBkaXN0YW5j ZSwgc28gSSB0aGluayBpdCBpcyBpbXBvcnRhbnQgdG8gZW1waGFzaXplIHRoYXQuCj4KPiBBbmQg SSBhbHNvIHF1aXRlIGxpa2UgdGhpcyBzdHJ1Y3R1cmUgb2YKPiAgIC0gZGVzY3JpcHRpb24gb2Yg c3RlcAo+ICAgLSBwYXJhbWV0ZXJzIG9mIHN0ZXAKPiAgIC0gZGVzY3JpcHRpb24gb2Ygc3RlcAo+ ICAgLi4uCj4KPiBzbyBJIHdvdWxkIGxvdmUgdG8ga2VlcCBpdCBsaWtlIHRoaXMsIGlmIHRoYXQn cyBvaz8KPgoKT2shCgo+Cj4gPgo+ID4gPiArICoKPiA+ID4gKyAqIEBoX2NvdW50X3N0YXJ0OiBo b3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIG9wdGljYWwgY2VudGVyICgxMy1iaXQgdW5zaWdu ZWQgaW50ZWdlcjsgWzEsODE5MV0pCj4gPiA+ICsgKiBAdl9jb3VudF9zdGFydDogdmVydGljYWwg Y29vcmRpbmF0ZSBvZiB0aGUgb3B0aWNhbCBjZW50ZXIgKDEzLWJpdCB1bnNpZ25lZCBpbnRlZ2Vy OyBbMSw4MTkxXSkKPiA+Cj4gPiBzbyB0aGVzZSBjb3VsZCBnbyBqdXN0IGJlZm9yZSBAeF9uZgo+ ID4KPiA+ID4gKyAqCj4gPiA+ICsgKiBGb3IgZWFjaCBwaXhlbCwgdGhlIHgveSBkaXN0YW5jZXMg ZnJvbSB0aGUgb3B0aWNhbCBjZW50ZXIgYXJlIGNhbGN1bGF0ZWQgYW5kCj4gPgo+ID4gSSBmb3Jn b3Q6IGRpZCB3ZSBlc3RhYmxpc2ggdGhhdCB0aGUgY29ycmVjdGlvbiBpcyBhcHBsaWVkIHRvIHRo ZQo+ID4gZXVjbGlkZWFuIGRpc3RhbmNlIG9yIHRvIHggYW5kIHkgc2VwYXJhdGVseSA/Cj4KPiBH aXZlbiB0aGF0IHRoZXJlIGFyZSB0d28gc2V0cyBvZiAibm9ybWFsaXphdGlvbiIgcGFyYW1ldGVy cywgdGhlIGFzc3VtcHRpb24gaXMgdGhhdAo+IGF0IGxlYXN0IHRoZSB4L3kgZGlzdGFuY2VzIGFy ZSB0cmFuc2Zvcm1lZCBzZXBhcmF0ZWx5LiBJIHNlZSB0d28gcmVhc29uYWJsZSBjaG9pY2VzCj4g YWZ0ZXIgdGhhdDogKGEpIHVzZSB0aGUgdHdvIGRpc3RhbmNlcyBzZXBhcmF0ZWx5LCAoYikgdXNl IHRoZSByYWRpYWwgZGlzdGFuY2UuIFRoZQo+IGRvY3VtZW50YXRpb24gc2F5cyAoYikuIEhvd2V2 ZXIsIHRlc3Rpbmcgd2l0aCBzZW5zb3IgdGVzdCBwYXR0ZXJucyBzdWdnZXN0cyB0aGF0Cj4gaXQg aXMgbm90IHRoZSBjYXNlIChhIGhvcml6b250YWwvdmVydGljYWwgYm91bmRhcnkgYmV0d2VlbiBh cHByb3ByaWF0ZWx5IGNvbG9yZWQKPiByZWdpb25zIHNob3VsZCBoYXZlIGEgY3VydmF0dXJlIGFm dGVyIHRoZSB0cmFuc2Zvcm1hdGlvbiB3aXRoIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMpLgoKSSBu b3cgcmVjYWxsIHRoYXQgeW91IGhhdmUgYmVlbiBhYmxlIHRvIHNoaWZ0IGp1c3Qgb25lIHBsYW4g d2hlbiB1c2luZwp0aGUgc2Vuc29yJ3MgdGVzdCBwYXR0ZXJuCgo+Cj4KPiA+Cj4gPiA+ICsgKiB0 aGVuIHRyYW5zZm9ybWVkIGludG8gdGhlIFswLDI1NV0gcmFuZ2UgYmFzZWQgb24gdGhlIGZvbGxv d2luZyBmb3JtdWxhOgo+ID4KPiA+IHMvdHJhbnNmb3JtZWQvbm9ybWFsaXplZCA/Cj4KPiBUbyBi ZSBob25lc3QgSSB2YXN0bHkgcHJlZmVyICJ0cmFuc2Zvcm0iIC8gIm1hcCIgb3ZlciAibm9ybWFs aXplIiBoZXJlLgoKWW91J3JlIHJpZ2h0IGhlcmUsIHRoZSBiZWxvdyBmb3JtdWxhIGRvZXNuJ3Qg bm9ybWFsaXplIHRoZQpkaXN0YW5jZSBpbiBhbiBpbnRlcnZhbCBidXQganVzdCByZS1zY2FsZSBp dAoKPgo+Cj4gPgo+ID4gPiArICoKPiA+ID4gKyAqICAgKCgoZCA8PCA0KSA+PiBzKSAqIGYpID4+ IDUKPiA+ID4gKyAqCj4gPiA+ICsgKiB3aGVyZSBgZGAgaXMgdGhlIGRpc3RhbmNlLCBgc2AgYW5k IGBmYCBhcmUgdGhlIG5vcm1hbGl6YXRpb24gcGFyYW1ldGVyczoKPiA+Cj4gPiBDYW4geW91IHVz ZSAnbnMnIGFuZCAnbmYnIHRvIG1hdGNoIHRoZSBiZWxvdyA/Cj4KPiBBZGp1c3RlZC4KPgoKVGhh bmtzIQoKPgo+ID4KPiA+ID4gKyAqCj4gPiA+ICsgKiBAeF9uZjogaG9yaXpvbnRhbCBub3JtYWxp emF0aW9uIHNjYWxlIHBhcmFtZXRlciAoNS1iaXQgdW5zaWduZWQgaW50ZWdlcjsgWzAsMzFdKQo+ ID4gPiArICogQHhfbnM6IGhvcml6b250YWwgbm9ybWFsaXphdGlvbiBzaGlmdCBwYXJhbWV0ZXIg KDQtYml0IHVuc2lnbmVkIGludGVnZXI7IFswLDE1XSkKPiA+ID4gKyAqCj4gPiA+ICsgKiBAeV9u ZjogdmVydGljYWwgbm9ybWFsaXphdGlvbiBzY2FsZSBwYXJhbWV0ZXIgKDUtYml0IHVuc2lnbmVk IGludGVnZXI7IFswLDMxXSkKPiA+ID4gKyAqIEB5X25zOiB2ZXJ0aWNhbCBub3JtYWxpemF0aW9u IHNoaWZ0IHBhcmFtZXRlciAoNC1iaXQgdW5zaWduZWQgaW50ZWdlcjsgWzAsMTVdKQo+ID4gPiAr ICoKPiA+ID4gKyAqIFRoZXNlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGNob3NlbiBiYXNlZCBvbiB0 aGUgaW1hZ2UgcmVzb2x1dGlvbiwgdGhlIHBvc2l0aW9uCj4gPiA+ICsgKiBvZiB0aGUgb3B0aWNh bCBjZW50ZXIsIGFuZCB0aGUgc2hhcGUgb2YgcGl4ZWxzOiBzbyB0aGF0IG5vIG5vcm1hbGl6ZWQg ZGlzdGFuY2UKPiA+Cj4gPiBzL3BpeGVsczovcGl4ZWxzLwo+Cj4gUmVwbGFjZWQgYDpgIHdpdGgg YCxgLgo+Cj4KPiA+Cj4gPiA+ICsgKiBpcyBsYXJnZXIgdGhhbiAyNTUuIElmIHRoZSBwaXhlbHMg aGF2ZSBzcXVhcmUgc2hhcGUsIHRoZSB0d28gc2V0cyBvZiBwYXJhbWV0ZXJzCj4gPiA+ICsgKiBz aG91bGQgYmUgZXF1YWwuCj4gPiA+ICsgKgo+ID4gPiArICogVGhlIGFjdHVhbCBhbW91bnQgb2Yg Y29ycmVjdGlvbiBpcyBjYWxjdWxhdGVkIHdpdGggYSB0aGlyZCBkZWdyZWUgcG9seW5vbWlhbDoK PiA+ID4gKyAqCj4gPiA+ICsgKiAgIGNbMF0gKiByICsgY1sxXSAqIHJeMiArIGNbMl0gKiByXjMK PiA+ID4gKyAqCj4gPiA+ICsgKiB3aGVyZSBgY2AgaXMgdGhlIHNldCBvZiBjb2VmZmljaWVudHMg Zm9yIHRoZSBnaXZlbiBjb2xvciwgYW5kIGByYCBpcyBkaXN0YW5jZToKPiA+ID4gKyAqCj4gPiA+ ICsgKiBAcmVkOiByZWQgY29lZmZpY2llbnRzICg1LjQgdHdvJ3MgY29tcGxlbWVudDsgWy0xNiwx NS45Mzc1XSkKPiA+ID4gKyAqIEBibHVlOiBibHVlIGNvZWZmaWNpZW50cyAoNS40IHR3bydzIGNv bXBsZW1lbnQ7IFstMTYsMTUuOTM3NV0pCj4gPiA+ICsgKgo+ID4gPiArICogRmluYWxseSwgdGhl IGFtb3VudCBpcyBjbGlwcGVkIGFzIHJlcXVlc3RlZDoKPiA+ID4gKyAqCj4gPiA+ICsgKiBAaF9j bGlwX21vZGU6IG1heGltdW0gaG9yaXpvbnRhbCBzaGlmdCAoZnJvbSBlbnVtIHJraXNwMV9jaWZf aXNwX2NhY19oX2NsaXBfbW9kZSkKPiA+ID4gKyAqIEB2X2NsaXBfbW9kZTogbWF4aW11bSB2ZXJ0 aWNhbCBzaGlmdCAoZnJvbSBlbnVtIHJraXNwMV9jaWZfaXNwX2NhY192X2NsaXBfbW9kZSkKPiA+ ID4gKyAqCj4gPiA+ICsgKiBBIHBvc2l0aXZlIHJlc3VsdCB3aWxsIHNoaWZ0IGF3YXkgZnJvbSB0 aGUgb3B0aWNhbCBjZW50ZXIsIHdoaWxlIGEgbmVnYXRpdmUKPiA+ID4gKyAqIG9uZSB3aWxsIHNo aWZ0IHRvd2FyZHMgdGhlIG9wdGljYWwgY2VudGVyLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBw aXhlbAo+ID4gPiArICogdmFsdWVzIGF0IHRoZSBlZGdlcyBhcmUgZHVwbGljYXRlZC4KPiA+ID4g KyAqLwo+ID4gPiArc3RydWN0IHJraXNwMV9jaWZfaXNwX2NhY19jb25maWcgewo+ID4gPiArCV9f dTggaF9jbGlwX21vZGU7Cj4gPiA+ICsJX191OCB2X2NsaXBfbW9kZTsKPiA+ID4gKwo+ID4gPiAr CV9fdTE2IGhfY291bnRfc3RhcnQ7Cj4gPiA+ICsJX191MTYgdl9jb3VudF9zdGFydDsKPiA+ID4g Kwo+ID4gPiArCV9fdTE2IHJlZFszXTsKPiA+ID4gKwlfX3UxNiBibHVlWzNdOwo+ID4gPiArCj4g PiA+ICsJX191OCB4X25mOwo+ID4gPiArCV9fdTggeF9uczsKPiA+ID4gKwo+ID4gPiArCV9fdTgg eV9uZjsKPiA+ID4gKwlfX3U4IHlfbnM7Cj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+ICAgLyotLS0t LS0tLS0tIFBBUlQyOiBNZWFzdXJlbWVudCBTdGF0aXN0aWNzIC0tLS0tLS0tLS0tLSovCj4gPiA+ Cj4gPiA+ICAgLyoqCj4gPiA+IEBAIC0xMTYxLDYgKzEyNDcsNyBAQCBlbnVtIHJraXNwMV9leHRf cGFyYW1zX2Jsb2NrX3R5cGUgewo+ID4gPiAgIAlSS0lTUDFfRVhUX1BBUkFNU19CTE9DS19UWVBF X0NPTVBBTkRfRVhQQU5ELAo+ID4gPiAgIAlSS0lTUDFfRVhUX1BBUkFNU19CTE9DS19UWVBFX0NP TVBBTkRfQ09NUFJFU1MsCj4gPiA+ICAgCVJLSVNQMV9FWFRfUEFSQU1TX0JMT0NLX1RZUEVfV0RS LAo+ID4gPiArCVJLSVNQMV9FWFRfUEFSQU1TX0JMT0NLX1RZUEVfQ0FDLAo+ID4gPiAgIH07Cj4g PiA+Cj4gPiA+ICAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KPiA+ID4gQEAgLTE1 MDcsNiArMTU5NCwyMiBAQCBzdHJ1Y3Qgcmtpc3AxX2V4dF9wYXJhbXNfd2RyX2NvbmZpZyB7Cj4g PiA+ICAgCXN0cnVjdCBya2lzcDFfY2lmX2lzcF93ZHJfY29uZmlnIGNvbmZpZzsKPiA+ID4gICB9 IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKPiA+ID4KPiA+ID4gKy8qKgo+ID4gPiArICog c3RydWN0IHJraXNwMV9leHRfcGFyYW1zX2NhY19jb25maWcgLSBSa0lTUDEgZXh0ZW5zaWJsZSBw YXJhbXMgQ0FDIGNvbmZpZwo+ID4gPiArICoKPiA+ID4gKyAqIFJrSVNQMSBleHRlbnNpYmxlIHBh cmFtZXRlcnMgQ0FDIGJsb2NrLgo+ID4gPiArICogSWRlbnRpZmllZCBieSA6Yzp0eXBlOmBSS0lT UDFfRVhUX1BBUkFNU19CTE9DS19UWVBFX0NBQ2AuCj4gPiA+ICsgKgo+ID4gPiArICogQGhlYWRl cjogVGhlIFJrSVNQMSBleHRlbnNpYmxlIHBhcmFtZXRlcnMgaGVhZGVyLCBzZWUKPiA+ID4gKyAq CSAgICA6Yzp0eXBlOmBya2lzcDFfZXh0X3BhcmFtc19ibG9ja19oZWFkZXJgCj4gPiA+ICsgKiBA Y29uZmlnOiBDQUMgY29uZmlndXJhdGlvbiwgc2VlCj4gPiA+ICsgKgkgICAgOmM6dHlwZTpgcmtp c3AxX2NpZl9pc3BfY2FjX2NvbmZpZ2AKPiA+ID4gKyAqLwo+ID4gPiArc3RydWN0IHJraXNwMV9l eHRfcGFyYW1zX2NhY19jb25maWcgewo+ID4gPiArCXN0cnVjdCBya2lzcDFfZXh0X3BhcmFtc19i bG9ja19oZWFkZXIgaGVhZGVyOwo+ID4gPiArCXN0cnVjdCBya2lzcDFfY2lmX2lzcF9jYWNfY29u ZmlnIGNvbmZpZzsKPiA+ID4gK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwo+ID4gPiAr Cj4gPiA+ICAgLyoKPiA+ID4gICAgKiBUaGUgcmtpc3AxX2V4dF9wYXJhbXNfY29tcGFuZF9jdXJ2 ZV9jb25maWcgc3RydWN0dXJlIGlzIGNvdW50ZWQgdHdpY2UgYXMgaXQKPiA+ID4gICAgKiBpcyB1 c2VkIGZvciBib3RoIHRoZSBDT01QQU5EX0VYUEFORCBhbmQgQ09NUEFORF9DT01QUkVTUyBibG9j ayB0eXBlcy4KPiA+ID4gQEAgLTE1MzIsNyArMTYzNSw4IEBAIHN0cnVjdCBya2lzcDFfZXh0X3Bh cmFtc193ZHJfY29uZmlnIHsKPiA+ID4gICAJc2l6ZW9mKHN0cnVjdCBya2lzcDFfZXh0X3BhcmFt c19jb21wYW5kX2Jsc19jb25maWcpCQkrXAo+ID4gPiAgIAlzaXplb2Yoc3RydWN0IHJraXNwMV9l eHRfcGFyYW1zX2NvbXBhbmRfY3VydmVfY29uZmlnKQkJK1wKPiA+ID4gICAJc2l6ZW9mKHN0cnVj dCBya2lzcDFfZXh0X3BhcmFtc19jb21wYW5kX2N1cnZlX2NvbmZpZykJCStcCj4gPiA+IC0Jc2l6 ZW9mKHN0cnVjdCBya2lzcDFfZXh0X3BhcmFtc193ZHJfY29uZmlnKSkKPiA+ID4gKwlzaXplb2Yo c3RydWN0IHJraXNwMV9leHRfcGFyYW1zX3dkcl9jb25maWcpCQkJK1wKPiA+ID4gKwlzaXplb2Yo c3RydWN0IHJraXNwMV9leHRfcGFyYW1zX2NhY19jb25maWcpKQo+ID4KPiA+IEFsbCBtaW5vcnMs IHBsZWFzZSBhZGQKPiA+IFJldmlld2VkLWJ5OiBKYWNvcG8gTW9uZGkgPGphY29wby5tb25kaUBp ZGVhc29uYm9hcmQuY29tPgo+ID4KPiA+IFRoYW5rcwo+ID4gICAgago+ID4KPiA+ID4KPiA+ID4g ICAvKioKPiA+ID4gICAgKiBlbnVtIHJrc2lwMV9leHRfcGFyYW1fYnVmZmVyX3ZlcnNpb24gLSBS a0lTUDEgZXh0ZW5zaWJsZSBwYXJhbWV0ZXJzIHZlcnNpb24KPiA+ID4gLS0KPiA+ID4gMi41My4w Cj4gPiA+Cj4gPiA+Cj4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCkxpbnV4LXJvY2tjaGlwIG1haWxpbmcgbGlzdApMaW51eC1yb2NrY2hpcEBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtcm9ja2NoaXAK