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 X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0AD66C433DB for ; Mon, 21 Dec 2020 22:00:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 92CD922A83 for ; Mon, 21 Dec 2020 22:00:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725908AbgLUWAC (ORCPT ); Mon, 21 Dec 2020 17:00:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725892AbgLUWAC (ORCPT ); Mon, 21 Dec 2020 17:00:02 -0500 Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4DFB8C0613D3 for ; Mon, 21 Dec 2020 13:59:21 -0800 (PST) Received: by mail-wm1-x336.google.com with SMTP id x22so281272wmc.5 for ; Mon, 21 Dec 2020 13:59:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=JsYeT92Qa7qgMIANJuTqCUKwRFmtaYgEx+dUjz2/0A4=; b=MJ5I9nWITyMGnDO7ocXRdXONNPwWucIDetJX0LrfZWpJocSDMZF8EhpEI/t/6rbllc BF2v0kFQahQdzw9Zo4v+edJY3odJyN8ONRELD1iLDLVdxxAqGn0170FWlL0EIEOUujwD df3X1T4TGqiylaJR4lh9y15vw01aWdoibj7Us= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=JsYeT92Qa7qgMIANJuTqCUKwRFmtaYgEx+dUjz2/0A4=; b=L/9Gkic3RJjKKtV3pJzeWECCgXqpo7ANBB8p39Mx6X/CrPHpHjbOJ/YmHdX5f7eCvk 8gR7OQt+asME6Duwc7w40YJgyLohe1bsX1QUR8FR0ryWMU69iEAf69us1gRXVQlDGkXN 39n0pqACiPbC6YprOJ1zY/330l9rABkLFLH3rwjLPRvaMm3iUKqfHCHcc8Zzp4xryI/w /ozDbIIpkcAvLGBukhk5MW9IX/TC//VPF7R9x8a/7/b26wN2CdDMes/vFECaWW4mJXVt ne0Z2YKFyVBbmLMy2Z6+/yXwrG7sFnGO1t+bcUDtbYkJydyWMkGT+O7SbuQJBDrpezEj nxCQ== X-Gm-Message-State: AOAM531/Ar+UrWsPIOpR4nOP6i1uRTVs66Dpe9qi/8xXnQNJWX4d/IX0 /x2EiW+JKQW7KH4Q0o4rAGjchg== X-Google-Smtp-Source: ABdhPJw/h4DzRfSZd9EbInj31j6yeg5rnClBWwFepgmSb3a87s2bT3p8MYDn7o/+J03Oe7hKzKNxZA== X-Received: by 2002:a1c:9ccd:: with SMTP id f196mr18898170wme.82.1608587959948; Mon, 21 Dec 2020 13:59:19 -0800 (PST) Received: from phenom.ffwll.local ([2a02:168:57f4:0:efd0:b9e5:5ae6:c2fa]) by smtp.gmail.com with ESMTPSA id h5sm29674698wrp.56.2020.12.21.13.59.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Dec 2020 13:59:19 -0800 (PST) Date: Mon, 21 Dec 2020 22:59:17 +0100 From: Daniel Vetter To: Laurent Pinchart Cc: Daniel Vetter , Laurent Pinchart , dri-devel , "open list:DRM DRIVERS FOR RENESAS" , Kieran Bingham , Ville =?iso-8859-1?Q?Syrj=E4l=E4?= , Pekka Paalanen , Kieran Bingham Subject: Re: [PATCH 3/4] drm: Extend color correction to support 3D-CLU Message-ID: References: <20201221015730.28333-1-laurent.pinchart+renesas@ideasonboard.com> <20201221015730.28333-4-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Operating-System: Linux phenom 5.7.0-1-amd64 Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org On Mon, Dec 21, 2020 at 08:38:44PM +0200, Laurent Pinchart wrote: > Hi Daniel, > > On Mon, Dec 21, 2020 at 07:36:22PM +0100, Daniel Vetter wrote: > > On Mon, Dec 21, 2020 at 2:57 AM Laurent Pinchart wrote: > > > > > > From: Kieran Bingham > > > > > > Extend the existing color management properties to support provision > > > of a 3D cubic look up table, allowing for color specific adjustments. > > > > > > Signed-off-by: Kieran Bingham > > > Co-developed-by: Laurent Pinchart > > > Signed-off-by: Laurent Pinchart > > > > Assuming this is meant for merging to upstream: Needs igt + open > > userspace in a compositor that cares enough. > > Please see the cover letter :-) Feedback on what an appropriate > userspace would be would be appreciated. Oops sorry. Wrt userspace CrOS was the one originally used to merge this, they do the full ICC color correction for their panels with degamm + ctm + lut. So if you somewhat care about that (or can make google care about 3d/cube luts) then that might be simplest. The Kodi people also care quite a lot about color correction stuff, and iirc some of the per-plane color management is being prototyped with code (so that the movie and the UI both have their correct colors). Otherwise I guess weston is the closest with real color management, but nothing merged yet. -Daniel > > > > --- > > > drivers/gpu/drm/drm_atomic_helper.c | 1 + > > > drivers/gpu/drm/drm_atomic_state_helper.c | 3 ++ > > > drivers/gpu/drm/drm_atomic_uapi.c | 10 ++++++ > > > drivers/gpu/drm/drm_color_mgmt.c | 41 +++++++++++++++++++---- > > > drivers/gpu/drm/drm_mode_config.c | 14 ++++++++ > > > include/drm/drm_crtc.h | 9 +++++ > > > include/drm/drm_mode_config.h | 11 ++++++ > > > 7 files changed, 82 insertions(+), 7 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > > > index ba1507036f26..0f54897d3c8d 100644 > > > --- a/drivers/gpu/drm/drm_atomic_helper.c > > > +++ b/drivers/gpu/drm/drm_atomic_helper.c > > > @@ -3558,6 +3558,7 @@ int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc, > > > replaced = drm_property_replace_blob(&crtc_state->degamma_lut, NULL); > > > replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL); > > > replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, blob); > > > + replaced |= drm_property_replace_blob(&crtc_state->cubic_lut, NULL); > > > crtc_state->color_mgmt_changed |= replaced; > > > > > > ret = drm_atomic_commit(state); > > > diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c > > > index ddcf5c2c8e6a..61c685b50677 100644 > > > --- a/drivers/gpu/drm/drm_atomic_state_helper.c > > > +++ b/drivers/gpu/drm/drm_atomic_state_helper.c > > > @@ -141,6 +141,8 @@ void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc, > > > drm_property_blob_get(state->ctm); > > > if (state->gamma_lut) > > > drm_property_blob_get(state->gamma_lut); > > > + if (state->cubic_lut) > > > + drm_property_blob_get(state->cubic_lut); > > > state->mode_changed = false; > > > state->active_changed = false; > > > state->planes_changed = false; > > > @@ -213,6 +215,7 @@ void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state) > > > drm_property_blob_put(state->degamma_lut); > > > drm_property_blob_put(state->ctm); > > > drm_property_blob_put(state->gamma_lut); > > > + drm_property_blob_put(state->cubic_lut); > > > } > > > EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state); > > > > > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > > > index 268bb69c2e2f..07229acab71c 100644 > > > --- a/drivers/gpu/drm/drm_atomic_uapi.c > > > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > > > @@ -471,6 +471,14 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc, > > > &replaced); > > > state->color_mgmt_changed |= replaced; > > > return ret; > > > + } else if (property == config->cubic_lut_property) { > > > + ret = drm_atomic_replace_property_blob_from_id(dev, > > > + &state->cubic_lut, > > > + val, > > > + -1, sizeof(struct drm_color_lut), > > > + &replaced); > > > + state->color_mgmt_changed |= replaced; > > > + return ret; > > > } else if (property == config->prop_out_fence_ptr) { > > > s32 __user *fence_ptr = u64_to_user_ptr(val); > > > > > > @@ -516,6 +524,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc, > > > *val = (state->ctm) ? state->ctm->base.id : 0; > > > else if (property == config->gamma_lut_property) > > > *val = (state->gamma_lut) ? state->gamma_lut->base.id : 0; > > > + else if (property == config->cubic_lut_property) > > > + *val = (state->cubic_lut) ? state->cubic_lut->base.id : 0; > > > else if (property == config->prop_out_fence_ptr) > > > *val = 0; > > > else if (property == crtc->scaling_filter_property) > > > diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c > > > index 3bcabc2f6e0e..85bbbc8ce8e5 100644 > > > --- a/drivers/gpu/drm/drm_color_mgmt.c > > > +++ b/drivers/gpu/drm/drm_color_mgmt.c > > > @@ -33,7 +33,7 @@ > > > /** > > > * DOC: overview > > > * > > > - * Color management or color space adjustments is supported through a set of 5 > > > + * Color management or color space adjustments is supported through a set of 7 > > > * properties on the &drm_crtc object. They are set up by calling > > > * drm_crtc_enable_color_mgmt(). > > > * > > > @@ -60,7 +60,7 @@ > > > * “CTM”: > > > * Blob property to set the current transformation matrix (CTM) apply to > > > * pixel data after the lookup through the degamma LUT and before the > > > - * lookup through the gamma LUT. The data is interpreted as a struct > > > + * lookup through the cubic LUT. The data is interpreted as a struct > > > * &drm_color_ctm. > > > * > > > * Setting this to NULL (blob property value set to 0) means a > > > @@ -68,13 +68,40 @@ > > > * boot-up state too. Drivers can access the blob for the color conversion > > > * matrix through &drm_crtc_state.ctm. > > > * > > > + * ”CUBIC_LUT”: > > > + * Blob property to set the cubic (3D) lookup table performing color > > > + * mapping after the transformation matrix and before the lookup through > > > + * the gamma LUT. Unlike the degamma and gamma LUTs that map color > > > + * components independently, the 3D LUT converts an input color to an > > > + * output color by indexing into the 3D table using the color components > > > + * as a 3D coordinate. The LUT is subsampled as 8-bit (or more) precision > > > + * would require too much storage space in the hardware, so the precision > > > + * of the color components is reduced before the look up, and the low > > > + * order bits may be used to interpolate between the nearest points in 3D > > > + * space. > > > + * > > > + * The data is interpreted as an array of &struct drm_color_lut elements. > > > + * Hardware might choose not to use the full precision of the LUT > > > + * elements. > > > + * > > > + * Setting this to NULL (blob property value set to 0) means the output > > > + * color is identical to the input color. This is generally the driver > > > + * boot-up state too. Drivers can access this blob through > > > + * &drm_crtc_state.cubic_lut. > > > + * > > > + * ”CUBIC_LUT_SIZE”: > > > + * Unsigned range property to give the size of the lookup table to be set > > > + * on the CUBIC_LUT property (the size depends on the underlying hardware). > > > + * If drivers support multiple LUT sizes then they should publish the > > > + * largest size, and sub-sample smaller sized LUTs appropriately. > > > + * > > > * “GAMMA_LUT”: > > > * Blob property to set the gamma lookup table (LUT) mapping pixel data > > > - * after the transformation matrix to data sent to the connector. The > > > - * data is interpreted as an array of &struct drm_color_lut elements. > > > - * Hardware might choose not to use the full precision of the LUT elements > > > - * nor use all the elements of the LUT (for example the hardware might > > > - * choose to interpolate between LUT[0] and LUT[4]). > > > + * after the cubic LUT to data sent to the connector. The data is > > > + * interpreted as an array of &struct drm_color_lut elements. Hardware > > > + * might choose not to use the full precision of the LUT elements nor use > > > + * all the elements of the LUT (for example the hardware might choose to > > > + * interpolate between LUT[0] and LUT[4]). > > > * > > > * Setting this to NULL (blob property value set to 0) means a > > > * linear/pass-thru gamma table should be used. This is generally the > > > diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c > > > index f1affc1bb679..6c3324f60e7d 100644 > > > --- a/drivers/gpu/drm/drm_mode_config.c > > > +++ b/drivers/gpu/drm/drm_mode_config.c > > > @@ -364,6 +364,20 @@ static int drm_mode_create_standard_properties(struct drm_device *dev) > > > return -ENOMEM; > > > dev->mode_config.gamma_lut_size_property = prop; > > > > > > + prop = drm_property_create(dev, > > > + DRM_MODE_PROP_BLOB, > > > + "CUBIC_LUT", 0); > > > + if (!prop) > > > + return -ENOMEM; > > > + dev->mode_config.cubic_lut_property = prop; > > > + > > > + prop = drm_property_create_range(dev, > > > + DRM_MODE_PROP_IMMUTABLE, > > > + "CUBIC_LUT_SIZE", 0, UINT_MAX); > > > + if (!prop) > > > + return -ENOMEM; > > > + dev->mode_config.cubic_lut_size_property = prop; > > > + > > > prop = drm_property_create(dev, > > > DRM_MODE_PROP_IMMUTABLE | DRM_MODE_PROP_BLOB, > > > "IN_FORMATS", 0); > > > diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h > > > index 5f43d64d2a07..df5cc2239adb 100644 > > > --- a/include/drm/drm_crtc.h > > > +++ b/include/drm/drm_crtc.h > > > @@ -288,6 +288,15 @@ struct drm_crtc_state { > > > */ > > > struct drm_property_blob *gamma_lut; > > > > > > + /** > > > + * @cubic_lut: > > > + * > > > + * Cubic Lookup table for converting pixel data. See > > > + * drm_crtc_enable_color_mgmt(). The blob (if not NULL) is a 3D array > > > + * of &struct drm_color_lut. > > > + */ > > > + struct drm_property_blob *cubic_lut; > > > + > > > /** > > > * @target_vblank: > > > * > > > diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h > > > index ab424ddd7665..8edb0094e5a7 100644 > > > --- a/include/drm/drm_mode_config.h > > > +++ b/include/drm/drm_mode_config.h > > > @@ -800,6 +800,17 @@ struct drm_mode_config { > > > */ > > > struct drm_property *gamma_lut_size_property; > > > > > > + /** > > > + * @cubic_lut_property: Optional CRTC property to set the 3D LUT used to > > > + * convert color spaces. > > > + */ > > > + struct drm_property *cubic_lut_property; > > > + /** > > > + * @cubic_lut_size_property: Optional CRTC property for the size of the > > > + * 3D LUT as supported by the driver (read-only). > > > + */ > > > + struct drm_property *cubic_lut_size_property; > > > + > > > /** > > > * @suggested_x_property: Optional connector property with a hint for > > > * the position of the output on the host's screen. > > -- > Regards, > > Laurent Pinchart -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch 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 X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17BD7C433E0 for ; Mon, 21 Dec 2020 21:59:25 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DE92B22A83 for ; Mon, 21 Dec 2020 21:59:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DE92B22A83 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ffwll.ch Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 505D66E5AE; Mon, 21 Dec 2020 21:59:22 +0000 (UTC) Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6D9B46E5AE for ; Mon, 21 Dec 2020 21:59:21 +0000 (UTC) Received: by mail-wm1-x331.google.com with SMTP id a6so289260wmc.2 for ; Mon, 21 Dec 2020 13:59:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=JsYeT92Qa7qgMIANJuTqCUKwRFmtaYgEx+dUjz2/0A4=; b=MJ5I9nWITyMGnDO7ocXRdXONNPwWucIDetJX0LrfZWpJocSDMZF8EhpEI/t/6rbllc BF2v0kFQahQdzw9Zo4v+edJY3odJyN8ONRELD1iLDLVdxxAqGn0170FWlL0EIEOUujwD df3X1T4TGqiylaJR4lh9y15vw01aWdoibj7Us= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=JsYeT92Qa7qgMIANJuTqCUKwRFmtaYgEx+dUjz2/0A4=; b=qOmkZH7apoLNP6KK1NfF1m675mUYbtzL5KsbaJdkK9jaiFzCTxWEOHwgh3XOB9fFPx gUd13iv7dEjAxGGqpG3rF5GlBQ4uNi+KzOs4mFBdacMFexPbpgTDv8p7BNc0aU7TFGwD k57Gbhj1XGSRTTmhNuaiEljHCQtZ2Eyx2IhM1rZcTcph2qQTMUsStTMKrHdwfUP2sT7X 5YvXUspHS0Al3ILVwAmGJCxGuUH27+fT89F0g8WQax5Uk+vaD5v/rQUlkt0VyvjDVgEC PWTSq3j8QVhetSmJloqvU4/K3AFhAAhDfVoCR+c2FPHiHeuthY7YXouHD1yUnut8bA2f ITDw== X-Gm-Message-State: AOAM532fdoFsdY8rJj1Co8j0nNcZVu5wmUhUrjTWeIHCvy3N5+zIkAFc 1AJjCQVyos/07lK26eJ8rB8uLg== X-Google-Smtp-Source: ABdhPJw/h4DzRfSZd9EbInj31j6yeg5rnClBWwFepgmSb3a87s2bT3p8MYDn7o/+J03Oe7hKzKNxZA== X-Received: by 2002:a1c:9ccd:: with SMTP id f196mr18898170wme.82.1608587959948; Mon, 21 Dec 2020 13:59:19 -0800 (PST) Received: from phenom.ffwll.local ([2a02:168:57f4:0:efd0:b9e5:5ae6:c2fa]) by smtp.gmail.com with ESMTPSA id h5sm29674698wrp.56.2020.12.21.13.59.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Dec 2020 13:59:19 -0800 (PST) Date: Mon, 21 Dec 2020 22:59:17 +0100 From: Daniel Vetter To: Laurent Pinchart Subject: Re: [PATCH 3/4] drm: Extend color correction to support 3D-CLU Message-ID: References: <20201221015730.28333-1-laurent.pinchart+renesas@ideasonboard.com> <20201221015730.28333-4-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Operating-System: Linux phenom 5.7.0-1-amd64 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Pinchart , Kieran Bingham , dri-devel , "open list:DRM DRIVERS FOR RENESAS" , Kieran Bingham Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gTW9uLCBEZWMgMjEsIDIwMjAgYXQgMDg6Mzg6NDRQTSArMDIwMCwgTGF1cmVudCBQaW5jaGFy dCB3cm90ZToKPiBIaSBEYW5pZWwsCj4gCj4gT24gTW9uLCBEZWMgMjEsIDIwMjAgYXQgMDc6MzY6 MjJQTSArMDEwMCwgRGFuaWVsIFZldHRlciB3cm90ZToKPiA+IE9uIE1vbiwgRGVjIDIxLCAyMDIw IGF0IDI6NTcgQU0gTGF1cmVudCBQaW5jaGFydCB3cm90ZToKPiA+ID4KPiA+ID4gRnJvbTogS2ll cmFuIEJpbmdoYW0gPGtpZXJhbi5iaW5naGFtK3JlbmVzYXNAaWRlYXNvbmJvYXJkLmNvbT4KPiA+ ID4KPiA+ID4gRXh0ZW5kIHRoZSBleGlzdGluZyBjb2xvciBtYW5hZ2VtZW50IHByb3BlcnRpZXMg dG8gc3VwcG9ydCBwcm92aXNpb24KPiA+ID4gb2YgYSAzRCBjdWJpYyBsb29rIHVwIHRhYmxlLCBh bGxvd2luZyBmb3IgY29sb3Igc3BlY2lmaWMgYWRqdXN0bWVudHMuCj4gPiA+Cj4gPiA+IFNpZ25l ZC1vZmYtYnk6IEtpZXJhbiBCaW5naGFtIDxraWVyYW4uYmluZ2hhbStyZW5lc2FzQGlkZWFzb25i b2FyZC5jb20+Cj4gPiA+IENvLWRldmVsb3BlZC1ieTogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVu dC5waW5jaGFydCtyZW5lc2FzQGlkZWFzb25ib2FyZC5jb20+Cj4gPiA+IFNpZ25lZC1vZmYtYnk6 IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnQrcmVuZXNhc0BpZGVhc29uYm9hcmQu Y29tPgo+ID4gCj4gPiBBc3N1bWluZyB0aGlzIGlzIG1lYW50IGZvciBtZXJnaW5nIHRvIHVwc3Ry ZWFtOiBOZWVkcyBpZ3QgKyBvcGVuCj4gPiB1c2Vyc3BhY2UgaW4gYSBjb21wb3NpdG9yIHRoYXQg Y2FyZXMgZW5vdWdoLgo+IAo+IFBsZWFzZSBzZWUgdGhlIGNvdmVyIGxldHRlciA6LSkgRmVlZGJh Y2sgb24gd2hhdCBhbiBhcHByb3ByaWF0ZQo+IHVzZXJzcGFjZSB3b3VsZCBiZSB3b3VsZCBiZSBh cHByZWNpYXRlZC4KCk9vcHMgc29ycnkuCgpXcnQgdXNlcnNwYWNlIENyT1Mgd2FzIHRoZSBvbmUg b3JpZ2luYWxseSB1c2VkIHRvIG1lcmdlIHRoaXMsIHRoZXkgZG8gdGhlCmZ1bGwgSUNDIGNvbG9y IGNvcnJlY3Rpb24gZm9yIHRoZWlyIHBhbmVscyB3aXRoIGRlZ2FtbSArIGN0bSArIGx1dC4gU28g aWYKeW91IHNvbWV3aGF0IGNhcmUgYWJvdXQgdGhhdCAob3IgY2FuIG1ha2UgZ29vZ2xlIGNhcmUg YWJvdXQgM2QvY3ViZSBsdXRzKQp0aGVuIHRoYXQgbWlnaHQgYmUgc2ltcGxlc3QuCgpUaGUgS29k aSBwZW9wbGUgYWxzbyBjYXJlIHF1aXRlIGEgbG90IGFib3V0IGNvbG9yIGNvcnJlY3Rpb24gc3R1 ZmYsIGFuZAppaXJjIHNvbWUgb2YgdGhlIHBlci1wbGFuZSBjb2xvciBtYW5hZ2VtZW50IGlzIGJl aW5nIHByb3RvdHlwZWQgd2l0aCBjb2RlCihzbyB0aGF0IHRoZSBtb3ZpZSBhbmQgdGhlIFVJIGJv dGggaGF2ZSB0aGVpciBjb3JyZWN0IGNvbG9ycykuCgpPdGhlcndpc2UgSSBndWVzcyB3ZXN0b24g aXMgdGhlIGNsb3Nlc3Qgd2l0aCByZWFsIGNvbG9yIG1hbmFnZW1lbnQsIGJ1dApub3RoaW5nIG1l cmdlZCB5ZXQuCi1EYW5pZWwKCj4gCj4gPiA+IC0tLQo+ID4gPiAgZHJpdmVycy9ncHUvZHJtL2Ry bV9hdG9taWNfaGVscGVyLmMgICAgICAgfCAgMSArCj4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vZHJt X2F0b21pY19zdGF0ZV9oZWxwZXIuYyB8ICAzICsrCj4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vZHJt X2F0b21pY191YXBpLmMgICAgICAgICB8IDEwICsrKysrKwo+ID4gPiAgZHJpdmVycy9ncHUvZHJt L2RybV9jb2xvcl9tZ210LmMgICAgICAgICAgfCA0MSArKysrKysrKysrKysrKysrKysrLS0tLQo+ ID4gPiAgZHJpdmVycy9ncHUvZHJtL2RybV9tb2RlX2NvbmZpZy5jICAgICAgICAgfCAxNCArKysr KysrKwo+ID4gPiAgaW5jbHVkZS9kcm0vZHJtX2NydGMuaCAgICAgICAgICAgICAgICAgICAgfCAg OSArKysrKwo+ID4gPiAgaW5jbHVkZS9kcm0vZHJtX21vZGVfY29uZmlnLmggICAgICAgICAgICAg fCAxMSArKysrKysKPiA+ID4gIDcgZmlsZXMgY2hhbmdlZCwgODIgaW5zZXJ0aW9ucygrKSwgNyBk ZWxldGlvbnMoLSkKPiA+ID4KPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1f YXRvbWljX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVscGVyLmMKPiA+ ID4gaW5kZXggYmExNTA3MDM2ZjI2Li4wZjU0ODk3ZDNjOGQgMTAwNjQ0Cj4gPiA+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX2hlbHBlci5jCj4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9kcm1fYXRvbWljX2hlbHBlci5jCj4gPiA+IEBAIC0zNTU4LDYgKzM1NTgsNyBAQCBpbnQg ZHJtX2F0b21pY19oZWxwZXJfbGVnYWN5X2dhbW1hX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMs Cj4gPiA+ICAgICAgICAgcmVwbGFjZWQgID0gZHJtX3Byb3BlcnR5X3JlcGxhY2VfYmxvYigmY3J0 Y19zdGF0ZS0+ZGVnYW1tYV9sdXQsIE5VTEwpOwo+ID4gPiAgICAgICAgIHJlcGxhY2VkIHw9IGRy bV9wcm9wZXJ0eV9yZXBsYWNlX2Jsb2IoJmNydGNfc3RhdGUtPmN0bSwgTlVMTCk7Cj4gPiA+ICAg ICAgICAgcmVwbGFjZWQgfD0gZHJtX3Byb3BlcnR5X3JlcGxhY2VfYmxvYigmY3J0Y19zdGF0ZS0+ Z2FtbWFfbHV0LCBibG9iKTsKPiA+ID4gKyAgICAgICByZXBsYWNlZCB8PSBkcm1fcHJvcGVydHlf cmVwbGFjZV9ibG9iKCZjcnRjX3N0YXRlLT5jdWJpY19sdXQsIE5VTEwpOwo+ID4gPiAgICAgICAg IGNydGNfc3RhdGUtPmNvbG9yX21nbXRfY2hhbmdlZCB8PSByZXBsYWNlZDsKPiA+ID4KPiA+ID4g ICAgICAgICByZXQgPSBkcm1fYXRvbWljX2NvbW1pdChzdGF0ZSk7Cj4gPiA+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19zdGF0ZV9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1 L2RybS9kcm1fYXRvbWljX3N0YXRlX2hlbHBlci5jCj4gPiA+IGluZGV4IGRkY2Y1YzJjOGU2YS4u NjFjNjg1YjUwNjc3IDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21p Y19zdGF0ZV9oZWxwZXIuYwo+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19z dGF0ZV9oZWxwZXIuYwo+ID4gPiBAQCAtMTQxLDYgKzE0MSw4IEBAIHZvaWQgX19kcm1fYXRvbWlj X2hlbHBlcl9jcnRjX2R1cGxpY2F0ZV9zdGF0ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCj4gPiA+ ICAgICAgICAgICAgICAgICBkcm1fcHJvcGVydHlfYmxvYl9nZXQoc3RhdGUtPmN0bSk7Cj4gPiA+ ICAgICAgICAgaWYgKHN0YXRlLT5nYW1tYV9sdXQpCj4gPiA+ICAgICAgICAgICAgICAgICBkcm1f cHJvcGVydHlfYmxvYl9nZXQoc3RhdGUtPmdhbW1hX2x1dCk7Cj4gPiA+ICsgICAgICAgaWYgKHN0 YXRlLT5jdWJpY19sdXQpCj4gPiA+ICsgICAgICAgICAgICAgICBkcm1fcHJvcGVydHlfYmxvYl9n ZXQoc3RhdGUtPmN1YmljX2x1dCk7Cj4gPiA+ICAgICAgICAgc3RhdGUtPm1vZGVfY2hhbmdlZCA9 IGZhbHNlOwo+ID4gPiAgICAgICAgIHN0YXRlLT5hY3RpdmVfY2hhbmdlZCA9IGZhbHNlOwo+ID4g PiAgICAgICAgIHN0YXRlLT5wbGFuZXNfY2hhbmdlZCA9IGZhbHNlOwo+ID4gPiBAQCAtMjEzLDYg KzIxNSw3IEBAIHZvaWQgX19kcm1fYXRvbWljX2hlbHBlcl9jcnRjX2Rlc3Ryb3lfc3RhdGUoc3Ry dWN0IGRybV9jcnRjX3N0YXRlICpzdGF0ZSkKPiA+ID4gICAgICAgICBkcm1fcHJvcGVydHlfYmxv Yl9wdXQoc3RhdGUtPmRlZ2FtbWFfbHV0KTsKPiA+ID4gICAgICAgICBkcm1fcHJvcGVydHlfYmxv Yl9wdXQoc3RhdGUtPmN0bSk7Cj4gPiA+ICAgICAgICAgZHJtX3Byb3BlcnR5X2Jsb2JfcHV0KHN0 YXRlLT5nYW1tYV9sdXQpOwo+ID4gPiArICAgICAgIGRybV9wcm9wZXJ0eV9ibG9iX3B1dChzdGF0 ZS0+Y3ViaWNfbHV0KTsKPiA+ID4gIH0KPiA+ID4gIEVYUE9SVF9TWU1CT0woX19kcm1fYXRvbWlj X2hlbHBlcl9jcnRjX2Rlc3Ryb3lfc3RhdGUpOwo+ID4gPgo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9t aWNfdWFwaS5jCj4gPiA+IGluZGV4IDI2OGJiNjljMmUyZi4uMDcyMjlhY2FiNzFjIDEwMDY0NAo+ ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY191YXBpLmMKPiA+ID4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jCj4gPiA+IEBAIC00NzEsNiArNDcxLDE0 IEBAIHN0YXRpYyBpbnQgZHJtX2F0b21pY19jcnRjX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Ny dGMgKmNydGMsCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm cmVwbGFjZWQpOwo+ID4gPiAgICAgICAgICAgICAgICAgc3RhdGUtPmNvbG9yX21nbXRfY2hhbmdl ZCB8PSByZXBsYWNlZDsKPiA+ID4gICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiA+ICsg ICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25maWctPmN1YmljX2x1dF9wcm9wZXJ0eSkg ewo+ID4gPiArICAgICAgICAgICAgICAgcmV0ID0gZHJtX2F0b21pY19yZXBsYWNlX3Byb3BlcnR5 X2Jsb2JfZnJvbV9pZChkZXYsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAmc3RhdGUtPmN1YmljX2x1dCwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHZhbCwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC0xLCBzaXplb2Yoc3RydWN0IGRybV9jb2xvcl9sdXQpLAo+ID4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VkKTsKPiA+ID4gKyAgICAg ICAgICAgICAgIHN0YXRlLT5jb2xvcl9tZ210X2NoYW5nZWQgfD0gcmVwbGFjZWQ7Cj4gPiA+ICsg ICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gPiAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVy dHkgPT0gY29uZmlnLT5wcm9wX291dF9mZW5jZV9wdHIpIHsKPiA+ID4gICAgICAgICAgICAgICAg IHMzMiBfX3VzZXIgKmZlbmNlX3B0ciA9IHU2NF90b191c2VyX3B0cih2YWwpOwo+ID4gPgo+ID4g PiBAQCAtNTE2LDYgKzUyNCw4IEBAIGRybV9hdG9taWNfY3J0Y19nZXRfcHJvcGVydHkoc3RydWN0 IGRybV9jcnRjICpjcnRjLAo+ID4gPiAgICAgICAgICAgICAgICAgKnZhbCA9IChzdGF0ZS0+Y3Rt KSA/IHN0YXRlLT5jdG0tPmJhc2UuaWQgOiAwOwo+ID4gPiAgICAgICAgIGVsc2UgaWYgKHByb3Bl cnR5ID09IGNvbmZpZy0+Z2FtbWFfbHV0X3Byb3BlcnR5KQo+ID4gPiAgICAgICAgICAgICAgICAg KnZhbCA9IChzdGF0ZS0+Z2FtbWFfbHV0KSA/IHN0YXRlLT5nYW1tYV9sdXQtPmJhc2UuaWQgOiAw Owo+ID4gPiArICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmZpZy0+Y3ViaWNfbHV0X3By b3BlcnR5KQo+ID4gPiArICAgICAgICAgICAgICAgKnZhbCA9IChzdGF0ZS0+Y3ViaWNfbHV0KSA/ IHN0YXRlLT5jdWJpY19sdXQtPmJhc2UuaWQgOiAwOwo+ID4gPiAgICAgICAgIGVsc2UgaWYgKHBy b3BlcnR5ID09IGNvbmZpZy0+cHJvcF9vdXRfZmVuY2VfcHRyKQo+ID4gPiAgICAgICAgICAgICAg ICAgKnZhbCA9IDA7Cj4gPiA+ICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkgPT0gY3J0Yy0+c2Nh bGluZ19maWx0ZXJfcHJvcGVydHkpCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v ZHJtX2NvbG9yX21nbXQuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY29sb3JfbWdtdC5jCj4gPiA+ IGluZGV4IDNiY2FiYzJmNmUwZS4uODViYmJjOGNlOGU1IDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vZHJtX2NvbG9yX21nbXQuYwo+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v ZHJtX2NvbG9yX21nbXQuYwo+ID4gPiBAQCAtMzMsNyArMzMsNyBAQAo+ID4gPiAgLyoqCj4gPiA+ ICAgKiBET0M6IG92ZXJ2aWV3Cj4gPiA+ICAgKgo+ID4gPiAtICogQ29sb3IgbWFuYWdlbWVudCBv ciBjb2xvciBzcGFjZSBhZGp1c3RtZW50cyBpcyBzdXBwb3J0ZWQgdGhyb3VnaCBhIHNldCBvZiA1 Cj4gPiA+ICsgKiBDb2xvciBtYW5hZ2VtZW50IG9yIGNvbG9yIHNwYWNlIGFkanVzdG1lbnRzIGlz IHN1cHBvcnRlZCB0aHJvdWdoIGEgc2V0IG9mIDcKPiA+ID4gICAqIHByb3BlcnRpZXMgb24gdGhl ICZkcm1fY3J0YyBvYmplY3QuIFRoZXkgYXJlIHNldCB1cCBieSBjYWxsaW5nCj4gPiA+ICAgKiBk cm1fY3J0Y19lbmFibGVfY29sb3JfbWdtdCgpLgo+ID4gPiAgICoKPiA+ID4gQEAgLTYwLDcgKzYw LDcgQEAKPiA+ID4gICAqIOKAnENUTeKAnToKPiA+ID4gICAqICAgICBCbG9iIHByb3BlcnR5IHRv IHNldCB0aGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKENUTSkgYXBwbHkgdG8KPiA+ ID4gICAqICAgICBwaXhlbCBkYXRhIGFmdGVyIHRoZSBsb29rdXAgdGhyb3VnaCB0aGUgZGVnYW1t YSBMVVQgYW5kIGJlZm9yZSB0aGUKPiA+ID4gLSAqICAgICBsb29rdXAgdGhyb3VnaCB0aGUgZ2Ft bWEgTFVULiBUaGUgZGF0YSBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cnVjdAo+ID4gPiArICogICAg IGxvb2t1cCB0aHJvdWdoIHRoZSBjdWJpYyBMVVQuIFRoZSBkYXRhIGlzIGludGVycHJldGVkIGFz IGEgc3RydWN0Cj4gPiA+ICAgKiAgICAgJmRybV9jb2xvcl9jdG0uCj4gPiA+ICAgKgo+ID4gPiAg ICogICAgIFNldHRpbmcgdGhpcyB0byBOVUxMIChibG9iIHByb3BlcnR5IHZhbHVlIHNldCB0byAw KSBtZWFucyBhCj4gPiA+IEBAIC02OCwxMyArNjgsNDAgQEAKPiA+ID4gICAqICAgICBib290LXVw IHN0YXRlIHRvby4gRHJpdmVycyBjYW4gYWNjZXNzIHRoZSBibG9iIGZvciB0aGUgY29sb3IgY29u dmVyc2lvbgo+ID4gPiAgICogICAgIG1hdHJpeCB0aHJvdWdoICZkcm1fY3J0Y19zdGF0ZS5jdG0u Cj4gPiA+ICAgKgo+ID4gPiArICog4oCdQ1VCSUNfTFVU4oCdOgo+ID4gPiArICogICAgIEJsb2Ig cHJvcGVydHkgdG8gc2V0IHRoZSBjdWJpYyAoM0QpIGxvb2t1cCB0YWJsZSBwZXJmb3JtaW5nIGNv bG9yCj4gPiA+ICsgKiAgICAgbWFwcGluZyBhZnRlciB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4 IGFuZCBiZWZvcmUgdGhlIGxvb2t1cCB0aHJvdWdoCj4gPiA+ICsgKiAgICAgdGhlIGdhbW1hIExV VC4gVW5saWtlIHRoZSBkZWdhbW1hIGFuZCBnYW1tYSBMVVRzIHRoYXQgbWFwIGNvbG9yCj4gPiA+ ICsgKiAgICAgY29tcG9uZW50cyBpbmRlcGVuZGVudGx5LCB0aGUgM0QgTFVUIGNvbnZlcnRzIGFu IGlucHV0IGNvbG9yIHRvIGFuCj4gPiA+ICsgKiAgICAgb3V0cHV0IGNvbG9yIGJ5IGluZGV4aW5n IGludG8gdGhlIDNEIHRhYmxlIHVzaW5nIHRoZSBjb2xvciBjb21wb25lbnRzCj4gPiA+ICsgKiAg ICAgYXMgYSAzRCBjb29yZGluYXRlLiBUaGUgTFVUIGlzIHN1YnNhbXBsZWQgYXMgOC1iaXQgKG9y IG1vcmUpIHByZWNpc2lvbgo+ID4gPiArICogICAgIHdvdWxkIHJlcXVpcmUgdG9vIG11Y2ggc3Rv cmFnZSBzcGFjZSBpbiB0aGUgaGFyZHdhcmUsIHNvIHRoZSBwcmVjaXNpb24KPiA+ID4gKyAqICAg ICBvZiB0aGUgY29sb3IgY29tcG9uZW50cyBpcyByZWR1Y2VkIGJlZm9yZSB0aGUgbG9vayB1cCwg YW5kIHRoZSBsb3cKPiA+ID4gKyAqICAgICBvcmRlciBiaXRzIG1heSBiZSB1c2VkIHRvIGludGVy cG9sYXRlIGJldHdlZW4gdGhlIG5lYXJlc3QgcG9pbnRzIGluIDNECj4gPiA+ICsgKiAgICAgc3Bh Y2UuCj4gPiA+ICsgKgo+ID4gPiArICogICAgIFRoZSBkYXRhIGlzIGludGVycHJldGVkIGFzIGFu IGFycmF5IG9mICZzdHJ1Y3QgZHJtX2NvbG9yX2x1dCBlbGVtZW50cy4KPiA+ID4gKyAqICAgICBI YXJkd2FyZSBtaWdodCBjaG9vc2Ugbm90IHRvIHVzZSB0aGUgZnVsbCBwcmVjaXNpb24gb2YgdGhl IExVVAo+ID4gPiArICogICAgIGVsZW1lbnRzLgo+ID4gPiArICoKPiA+ID4gKyAqICAgICBTZXR0 aW5nIHRoaXMgdG8gTlVMTCAoYmxvYiBwcm9wZXJ0eSB2YWx1ZSBzZXQgdG8gMCkgbWVhbnMgdGhl IG91dHB1dAo+ID4gPiArICogICAgIGNvbG9yIGlzIGlkZW50aWNhbCB0byB0aGUgaW5wdXQgY29s b3IuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBkcml2ZXIKPiA+ID4gKyAqICAgICBib290LXVwIHN0 YXRlIHRvby4gRHJpdmVycyBjYW4gYWNjZXNzIHRoaXMgYmxvYiB0aHJvdWdoCj4gPiA+ICsgKiAg ICAgJmRybV9jcnRjX3N0YXRlLmN1YmljX2x1dC4KPiA+ID4gKyAqCj4gPiA+ICsgKiDigJ1DVUJJ Q19MVVRfU0laReKAnToKPiA+ID4gKyAqICAgICBVbnNpZ25lZCByYW5nZSBwcm9wZXJ0eSB0byBn aXZlIHRoZSBzaXplIG9mIHRoZSBsb29rdXAgdGFibGUgdG8gYmUgc2V0Cj4gPiA+ICsgKiAgICAg b24gdGhlIENVQklDX0xVVCBwcm9wZXJ0eSAodGhlIHNpemUgZGVwZW5kcyBvbiB0aGUgdW5kZXJs eWluZyBoYXJkd2FyZSkuCj4gPiA+ICsgKiAgICAgSWYgZHJpdmVycyBzdXBwb3J0IG11bHRpcGxl IExVVCBzaXplcyB0aGVuIHRoZXkgc2hvdWxkIHB1Ymxpc2ggdGhlCj4gPiA+ICsgKiAgICAgbGFy Z2VzdCBzaXplLCBhbmQgc3ViLXNhbXBsZSBzbWFsbGVyIHNpemVkIExVVHMgYXBwcm9wcmlhdGVs eS4KPiA+ID4gKyAqCj4gPiA+ICAgKiDigJxHQU1NQV9MVVTigJ06Cj4gPiA+ICAgKiAgICAgQmxv YiBwcm9wZXJ0eSB0byBzZXQgdGhlIGdhbW1hIGxvb2t1cCB0YWJsZSAoTFVUKSBtYXBwaW5nIHBp eGVsIGRhdGEKPiA+ID4gLSAqICAgICBhZnRlciB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRv IGRhdGEgc2VudCB0byB0aGUgY29ubmVjdG9yLiBUaGUKPiA+ID4gLSAqICAgICBkYXRhIGlzIGlu dGVycHJldGVkIGFzIGFuIGFycmF5IG9mICZzdHJ1Y3QgZHJtX2NvbG9yX2x1dCBlbGVtZW50cy4K PiA+ID4gLSAqICAgICBIYXJkd2FyZSBtaWdodCBjaG9vc2Ugbm90IHRvIHVzZSB0aGUgZnVsbCBw cmVjaXNpb24gb2YgdGhlIExVVCBlbGVtZW50cwo+ID4gPiAtICogICAgIG5vciB1c2UgYWxsIHRo ZSBlbGVtZW50cyBvZiB0aGUgTFVUIChmb3IgZXhhbXBsZSB0aGUgaGFyZHdhcmUgbWlnaHQKPiA+ ID4gLSAqICAgICBjaG9vc2UgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBMVVRbMF0gYW5kIExVVFs0 XSkuCj4gPiA+ICsgKiAgICAgYWZ0ZXIgdGhlIGN1YmljIExVVCB0byBkYXRhIHNlbnQgdG8gdGhl IGNvbm5lY3Rvci4gVGhlIGRhdGEgaXMKPiA+ID4gKyAqICAgICBpbnRlcnByZXRlZCBhcyBhbiBh cnJheSBvZiAmc3RydWN0IGRybV9jb2xvcl9sdXQgZWxlbWVudHMuIEhhcmR3YXJlCj4gPiA+ICsg KiAgICAgbWlnaHQgY2hvb3NlIG5vdCB0byB1c2UgdGhlIGZ1bGwgcHJlY2lzaW9uIG9mIHRoZSBM VVQgZWxlbWVudHMgbm9yIHVzZQo+ID4gPiArICogICAgIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhl IExVVCAoZm9yIGV4YW1wbGUgdGhlIGhhcmR3YXJlIG1pZ2h0IGNob29zZSB0bwo+ID4gPiArICog ICAgIGludGVycG9sYXRlIGJldHdlZW4gTFVUWzBdIGFuZCBMVVRbNF0pLgo+ID4gPiAgICoKPiA+ ID4gICAqICAgICBTZXR0aW5nIHRoaXMgdG8gTlVMTCAoYmxvYiBwcm9wZXJ0eSB2YWx1ZSBzZXQg dG8gMCkgbWVhbnMgYQo+ID4gPiAgICogICAgIGxpbmVhci9wYXNzLXRocnUgZ2FtbWEgdGFibGUg c2hvdWxkIGJlIHVzZWQuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZQo+ID4gPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2RybV9tb2RlX2NvbmZpZy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9t b2RlX2NvbmZpZy5jCj4gPiA+IGluZGV4IGYxYWZmYzFiYjY3OS4uNmMzMzI0ZjYwZTdkIDEwMDY0 NAo+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVfY29uZmlnLmMKPiA+ID4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2RybV9tb2RlX2NvbmZpZy5jCj4gPiA+IEBAIC0zNjQsNiArMzY0 LDIwIEBAIHN0YXRpYyBpbnQgZHJtX21vZGVfY3JlYXRlX3N0YW5kYXJkX3Byb3BlcnRpZXMoc3Ry dWN0IGRybV9kZXZpY2UgKmRldikKPiA+ID4gICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVN Owo+ID4gPiAgICAgICAgIGRldi0+bW9kZV9jb25maWcuZ2FtbWFfbHV0X3NpemVfcHJvcGVydHkg PSBwcm9wOwo+ID4gPgo+ID4gPiArICAgICAgIHByb3AgPSBkcm1fcHJvcGVydHlfY3JlYXRlKGRl diwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgRFJNX01PREVfUFJPUF9CTE9CLAo+ID4g PiArICAgICAgICAgICAgICAgICAgICAgICAiQ1VCSUNfTFVUIiwgMCk7Cj4gPiA+ICsgICAgICAg aWYgKCFwcm9wKQo+ID4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gPiA+ICsg ICAgICAgZGV2LT5tb2RlX2NvbmZpZy5jdWJpY19sdXRfcHJvcGVydHkgPSBwcm9wOwo+ID4gPiAr Cj4gPiA+ICsgICAgICAgcHJvcCA9IGRybV9wcm9wZXJ0eV9jcmVhdGVfcmFuZ2UoZGV2LAo+ID4g PiArICAgICAgICAgICAgICAgICAgICAgICBEUk1fTU9ERV9QUk9QX0lNTVVUQUJMRSwKPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgIkNVQklDX0xVVF9TSVpFIiwgMCwgVUlOVF9NQVgpOwo+ ID4gPiArICAgICAgIGlmICghcHJvcCkKPiA+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5P TUVNOwo+ID4gPiArICAgICAgIGRldi0+bW9kZV9jb25maWcuY3ViaWNfbHV0X3NpemVfcHJvcGVy dHkgPSBwcm9wOwo+ID4gPiArCj4gPiA+ICAgICAgICAgcHJvcCA9IGRybV9wcm9wZXJ0eV9jcmVh dGUoZGV2LAo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9NT0RF X1BST1BfSU1NVVRBQkxFIHwgRFJNX01PREVfUFJPUF9CTE9CLAo+ID4gPiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICJJTl9GT1JNQVRTIiwgMCk7Cj4gPiA+IGRpZmYgLS1naXQg YS9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaAo+ID4gPiBp bmRleCA1ZjQzZDY0ZDJhMDcuLmRmNWNjMjIzOWFkYiAxMDA2NDQKPiA+ID4gLS0tIGEvaW5jbHVk ZS9kcm0vZHJtX2NydGMuaAo+ID4gPiArKysgYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCj4gPiA+ IEBAIC0yODgsNiArMjg4LDE1IEBAIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSB7Cj4gPiA+ICAgICAg ICAgICovCj4gPiA+ICAgICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iICpnYW1tYV9sdXQ7 Cj4gPiA+Cj4gPiA+ICsgICAgICAgLyoqCj4gPiA+ICsgICAgICAgICogQGN1YmljX2x1dDoKPiA+ ID4gKyAgICAgICAgKgo+ID4gPiArICAgICAgICAqIEN1YmljIExvb2t1cCB0YWJsZSBmb3IgY29u dmVydGluZyBwaXhlbCBkYXRhLiBTZWUKPiA+ID4gKyAgICAgICAgKiBkcm1fY3J0Y19lbmFibGVf Y29sb3JfbWdtdCgpLiBUaGUgYmxvYiAoaWYgbm90IE5VTEwpIGlzIGEgM0QgYXJyYXkKPiA+ID4g KyAgICAgICAgKiBvZiAmc3RydWN0IGRybV9jb2xvcl9sdXQuCj4gPiA+ICsgICAgICAgICovCj4g PiA+ICsgICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iICpjdWJpY19sdXQ7Cj4gPiA+ICsK PiA+ID4gICAgICAgICAvKioKPiA+ID4gICAgICAgICAgKiBAdGFyZ2V0X3ZibGFuazoKPiA+ID4g ICAgICAgICAgKgo+ID4gPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX21vZGVfY29uZmln LmggYi9pbmNsdWRlL2RybS9kcm1fbW9kZV9jb25maWcuaAo+ID4gPiBpbmRleCBhYjQyNGRkZDc2 NjUuLjhlZGIwMDk0ZTVhNyAxMDA2NDQKPiA+ID4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX21vZGVf Y29uZmlnLmgKPiA+ID4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX21vZGVfY29uZmlnLmgKPiA+ID4g QEAgLTgwMCw2ICs4MDAsMTcgQEAgc3RydWN0IGRybV9tb2RlX2NvbmZpZyB7Cj4gPiA+ICAgICAg ICAgICovCj4gPiA+ICAgICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqZ2FtbWFfbHV0X3NpemVf cHJvcGVydHk7Cj4gPiA+Cj4gPiA+ICsgICAgICAgLyoqCj4gPiA+ICsgICAgICAgICogQGN1Ymlj X2x1dF9wcm9wZXJ0eTogT3B0aW9uYWwgQ1JUQyBwcm9wZXJ0eSB0byBzZXQgdGhlIDNEIExVVCB1 c2VkIHRvCj4gPiA+ICsgICAgICAgICogY29udmVydCBjb2xvciBzcGFjZXMuCj4gPiA+ICsgICAg ICAgICovCj4gPiA+ICsgICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqY3ViaWNfbHV0X3Byb3Bl cnR5Owo+ID4gPiArICAgICAgIC8qKgo+ID4gPiArICAgICAgICAqIEBjdWJpY19sdXRfc2l6ZV9w cm9wZXJ0eTogT3B0aW9uYWwgQ1JUQyBwcm9wZXJ0eSBmb3IgdGhlIHNpemUgb2YgdGhlCj4gPiA+ ICsgICAgICAgICogM0QgTFVUIGFzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyIChyZWFkLW9ubHkp Lgo+ID4gPiArICAgICAgICAqLwo+ID4gPiArICAgICAgIHN0cnVjdCBkcm1fcHJvcGVydHkgKmN1 YmljX2x1dF9zaXplX3Byb3BlcnR5Owo+ID4gPiArCj4gPiA+ICAgICAgICAgLyoqCj4gPiA+ICAg ICAgICAgICogQHN1Z2dlc3RlZF94X3Byb3BlcnR5OiBPcHRpb25hbCBjb25uZWN0b3IgcHJvcGVy dHkgd2l0aCBhIGhpbnQgZm9yCj4gPiA+ICAgICAgICAgICogdGhlIHBvc2l0aW9uIG9mIHRoZSBv dXRwdXQgb24gdGhlIGhvc3QncyBzY3JlZW4uCj4gCj4gLS0gCj4gUmVnYXJkcywKPiAKPiBMYXVy ZW50IFBpbmNoYXJ0CgotLSAKRGFuaWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwg Q29ycG9yYXRpb24KaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vZHJpLWRldmVsCg==