From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0EB9B1F7541; Fri, 20 Feb 2026 19:54:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771617299; cv=none; b=nwTM/sVSXgJUE5jmHMAkj9AVo/qqfEKTjOYhIytxd2PonziHAYuoRAN4u2S9Oj+E76lplAldka7hAEO+xaehN89tG3Vu6YwLktBNf52UO51haOamkXmMRuhpOaAT9RAo476uznnz7zyXGels+t387+d4ybMdCPu/ZISc+M2Sb3k= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771617299; c=relaxed/simple; bh=G8bBEO/g8w7OleXjDK76ZPJ7XfuuZF81p9PP5s2xJGw=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=UBBWuq4x+ni7HlvlNOkMEmZ3Vl/NaAAqrg/n3DzEz39clBXSxlRjhl4zwnA0DDu2SHSLD15mIZPeMpaT3T6uqGdcMmgdgd/gUvgl0JFBMYhjfnZYe2ynFmYu3iKxCntIgFxcMyvdU84V4OrWKaAwYO1wTckGcHWtSiu53jfN2rw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EbWQ4DZr; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EbWQ4DZr" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E4341C116C6; Fri, 20 Feb 2026 19:54:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771617298; bh=G8bBEO/g8w7OleXjDK76ZPJ7XfuuZF81p9PP5s2xJGw=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=EbWQ4DZrULRIpfj3CJM7KKV//fsDC8CLhHmiPL0HturNAqFKrFk527trkEU6xhW2f w3SwTGScz1OkFw/9wovoXiC5e/95USuL7WrS9naQxcnv9wrrTqtb/IlHaGMsSezJhm br/QmCkRWyndpOzfSqun5kQUylX2CtCuiuK7FT2+5dCG3hjC1sJ8nNnSFugHlLq2Ht TZ9igfItIvo0leyV6QSa6cea+Ij6FrmhLbopseM+g86V9TQ0DtTZ+E5I37+aJQhFf2 JxupJktMKVQw45FKa3v1BaBYGIxB1QcTI+GrKklrwf6jKjr3cLj4fTR2h2gbQPwZ4D COnH7NWf35U8g== Date: Fri, 20 Feb 2026 11:54:56 -0800 From: Drew Fustini To: yunhui cui Cc: Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Radim =?utf-8?B?S3LEjW3DocWZ?= , Samuel Holland , Adrien Ricciardi , Nicolas Pitre , Kornel =?utf-8?Q?Dul=C4=99ba?= , Atish Patra , Atish Kumar Patra , Vasudevan Srinivasan , Ved Shanbhogue , Chen Pei , Liu Zhiwei , Weiwei Li , guo.wenjia23@zte.com.cn, liu.qingtao2@zte.com.cn, Reinette Chatre , Tony Luck , Babu Moger , Peter Newman , Fenghua Yu , James Morse , Ben Horgan , Dave Martin , linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, x86@kernel.org, Rob Herring , "Rafael J. Wysocki" , Len Brown , Robert Moore , Sunil V L , Krzysztof Kozlowski , Conor Dooley , Paul Walmsley , linux-acpi@vger.kernel.org, acpica-devel@lists.linux.dev, devicetree@vger.kernel.org Subject: Re: [External] [PATCH RFC v2 08/17] RISC-V: QoS: add resctrl interface for CBQRI controllers Message-ID: References: <20260128-ssqosid-cbqri-v2-0-dca586b091b9@kernel.org> <20260128-ssqosid-cbqri-v2-8-dca586b091b9@kernel.org> Precedence: bulk X-Mailing-List: acpica-devel@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Mon, Feb 02, 2026 at 12:12:28PM +0800, yunhui cui wrote: > Hi Drew, Hi, thanks for your review, sorry I had this reply in draft for awhile and failed to actually send it. All good points from you and I've been working on fixing up the code. > On Thu, Jan 29, 2026 at 4:28 AM Drew Fustini wrote: > > > > Add interface for CBQRI controller drivers to make use of the resctrl > > filesystem. > > > > Co-developed-by: Adrien Ricciardi > > Signed-off-by: Adrien Ricciardi > > Signed-off-by: Drew Fustini > > --- > > arch/riscv/kernel/qos/qos_resctrl.c | 1192 +++++++++++++++++++++++++++++++++++ > > 1 file changed, 1192 insertions(+) > > > > diff --git a/arch/riscv/kernel/qos/qos_resctrl.c b/arch/riscv/kernel/qos/qos_resctrl.c > > new file mode 100644 > > index 000000000000..d500098599d2 > > --- /dev/null > > +++ b/arch/riscv/kernel/qos/qos_resctrl.c > > @@ -0,0 +1,1192 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > + > > +#define pr_fmt(fmt) "qos: resctrl: " fmt > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include "internal.h" > > + > > +#define MAX_CONTROLLERS 6 > > +static struct cbqri_controller controllers[MAX_CONTROLLERS]; > > Switch to dynamic allocation? Remove MAX_CONTROLLERS. Yes, I am reworking the implementation to dynamically allocate the cbqri_controller array based on the number of controllers actually in the system. > > +int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_mon_domain *d, > > + u32 closid, u32 rmid, enum resctrl_event_id eventid, > > + u64 *val, void *arch_mon_ctx) > > +{ > > + /* > > + * The current Qemu implementation of CBQRI capacity and bandwidth > > + * controllers do not emulate the utilization of resources over > > + * time. Therefore, Qemu currently sets the invalid bit in > > + * cc_mon_ctr_val and bc_mon_ctr_val, and there is no meaningful > > + * value other than 0 to return for reading an RMID (e.g. MCID in > > + * CBQRI terminology) > > + */ > > + > > + return 0; > > Implement per the spec's description directly, not as this comment states? Good point that this should actually perform the operation to read the value, even if Qemu is just setting the invalid bit as there is no real value implemented in Qemu. > > +/* > > + * Note: for the purposes of the CBQRI proof-of-concept, debug logging > > + * has been left in this function that detects the properties of CBQRI > > + * capable controllers in the system. pr_info calls would be removed > > + * before submitting non-RFC patches. > > + */ > > +static int cbqri_probe_controller(struct cbqri_controller_info *ctrl_info, > > + struct cbqri_controller *ctrl) > > +{ > > + int err = 0, status; > > + u64 reg; > > + > > + pr_info("controller info: type=%d addr=0x%lx size=%lu max-rcid=%u max-mcid=%u", > > + ctrl_info->type, ctrl_info->addr, ctrl_info->size, > > + ctrl_info->rcid_count, ctrl_info->mcid_count); > > + > > + /* max_rmid is used by resctrl_arch_system_num_rmid_idx() */ > > + max_rmid = ctrl_info->mcid_count; > > Get the min of all controllers? Yes, I will change the logic to do that. > > +static int qos_init_domain_ctrlval(struct rdt_resource *r, struct rdt_ctrl_domain *d) > > +{ > > + struct cbqri_resctrl_res *hw_res; > > + struct cbqri_resctrl_dom *hw_dom; > > + u64 *dc; > > + int err = 0; > > + int i; > > + > > + hw_res = container_of(r, struct cbqri_resctrl_res, resctrl_res); > > + if (!hw_res) > > + return -ENOMEM; > > + > > + hw_dom = container_of(d, struct cbqri_resctrl_dom, resctrl_ctrl_dom); > > + if (!hw_dom) > > + return -ENOMEM; > > + > > + dc = kmalloc_array(hw_res->max_rcid, sizeof(*hw_dom->ctrl_val), > > + GFP_KERNEL); > > + if (!dc) > > + return -ENOMEM; > > + > > + hw_dom->ctrl_val = dc; > > + > > + for (i = 0; i < hw_res->max_rcid; i++, dc++) { > > + err = resctrl_arch_update_one(r, d, i, 0, resctrl_get_default_ctrl(r)); > > + if (err) > > + return 0; > > return 0 ? Ah, yes, I will update to return error instead of silencing it. > > +static int qos_resctrl_add_controller_domain(struct cbqri_controller *ctrl, int *id) > > +{ > > + struct rdt_ctrl_domain *domain = NULL; > > + struct cbqri_resctrl_res *cbqri_res = NULL; > > + struct rdt_resource *res = NULL; > > + int internal_id = *id; > > + int err = 0; > > + > > + domain = qos_new_domain(ctrl); > > + if (!domain) > > + return -ENOSPC; > > + if (ctrl->ctrl_info->type == CBQRI_CONTROLLER_TYPE_CAPACITY) { > > + cpumask_copy(&domain->hdr.cpu_mask, &ctrl->ctrl_info->cache.cpu_mask); > > + if (ctrl->ctrl_info->cache.cache_level == 2) { > > + cbqri_res = &cbqri_resctrl_resources[RDT_RESOURCE_L2]; > > + cbqri_res->max_rcid = ctrl->ctrl_info->rcid_count; > > + cbqri_res->max_mcid = ctrl->ctrl_info->mcid_count; > > + res = &cbqri_res->resctrl_res; > > + res->mon.num_rmid = ctrl->ctrl_info->mcid_count; > > + res->rid = RDT_RESOURCE_L2; > > + res->name = "L2"; > > + res->alloc_capable = ctrl->alloc_capable; > > + res->mon_capable = ctrl->mon_capable; > > + res->schema_fmt = RESCTRL_SCHEMA_BITMAP; > > + res->ctrl_scope = RESCTRL_L2_CACHE; > > + res->cache.arch_has_sparse_bitmasks = false; > > + res->cache.arch_has_per_cpu_cfg = false; > > + res->cache.cbm_len = ctrl->cc.ncblks; > > + res->cache.shareable_bits = resctrl_get_default_ctrl(res); > > + res->cache.min_cbm_bits = 1; > > + } else if (ctrl->ctrl_info->cache.cache_level == 3) { > > + cbqri_res = &cbqri_resctrl_resources[RDT_RESOURCE_L3]; > > + cbqri_res->max_rcid = ctrl->ctrl_info->rcid_count; > > + cbqri_res->max_mcid = ctrl->ctrl_info->mcid_count; > > + res = &cbqri_res->resctrl_res; > > + res->mon.num_rmid = ctrl->ctrl_info->mcid_count; > > + res->rid = RDT_RESOURCE_L3; > > + res->name = "L3"; > > + res->schema_fmt = RESCTRL_SCHEMA_BITMAP; > > + res->ctrl_scope = RESCTRL_L3_CACHE; > > + res->alloc_capable = ctrl->alloc_capable; > > + res->mon_capable = ctrl->mon_capable; > > + res->cache.arch_has_sparse_bitmasks = false; > > + res->cache.arch_has_per_cpu_cfg = false; > > + res->cache.cbm_len = ctrl->cc.ncblks; > > + res->cache.shareable_bits = resctrl_get_default_ctrl(res); > > + res->cache.min_cbm_bits = 1; > > + } else { > > + pr_warn("%s(): unknown cache level %d", __func__, > > + ctrl->ctrl_info->cache.cache_level); > > + err = -ENODEV; > > + goto err_free_domain; > > + } > > + } else if (ctrl->ctrl_info->type == CBQRI_CONTROLLER_TYPE_BANDWIDTH) { > > + if (ctrl->alloc_capable) { > > + cbqri_res = &cbqri_resctrl_resources[RDT_RESOURCE_MBA]; > > + cbqri_res->max_rcid = ctrl->ctrl_info->rcid_count; > > + cbqri_res->max_mcid = ctrl->ctrl_info->mcid_count; > > + res = &cbqri_res->resctrl_res; > > + res->mon.num_rmid = ctrl->ctrl_info->mcid_count; > > + res->rid = RDT_RESOURCE_MBA; > > + res->name = "MB"; > > + res->schema_fmt = RESCTRL_SCHEMA_RANGE; > > + res->ctrl_scope = RESCTRL_L3_CACHE; > > + res->alloc_capable = ctrl->alloc_capable; > > + res->mon_capable = false; > > + res->membw.delay_linear = true; > > + res->membw.arch_needs_linear = true; > > + res->membw.throttle_mode = THREAD_THROTTLE_UNDEFINED; > > + // The minimum percentage allowed by the CBQRI spec > > + res->membw.min_bw = 1; > > + // The maximum percentage allowed by the CBQRI spec > > + res->membw.max_bw = 80; > > + res->membw.bw_gran = 1; > > + } > > Wrap a function. I am guessing you mean to break up this long function into a couple of smaller functions? I will give that a try for the next rev. > > + } else { > > + pr_warn("%s(): unknown resource %d", __func__, ctrl->ctrl_info->type); > > + err = -ENODEV; > > + goto err_free_domain; > > + } > > + > > + domain->hdr.id = internal_id; > > + err = qos_init_domain_ctrlval(res, domain); > > + if (err) > > + goto err_free_domain; > > + > > + if (cbqri_res) { > > + list_add_tail(&domain->hdr.list, &cbqri_res->resctrl_res.ctrl_domains); > > + *id = internal_id; > > + err = resctrl_online_ctrl_domain(res, domain); > > + if (err) { > > + pr_warn("%s(): failed to online cbqri_res domain", __func__); > > + goto err_free_domain; > > + } > > + } > > + > > + return 0; > > + > > +err_free_domain: > > + pr_warn("%s(): err_free_domain", __func__); > > + kfree(container_of(domain, struct cbqri_resctrl_dom, resctrl_ctrl_dom)); > > free hw_dom->ctrl_val ? I'll take a closer look at the error cleanup path and fix in the next rev. Thanks, Drew 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 2F77AC5AE49 for ; Fri, 20 Feb 2026 19:55:10 +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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=qVILohPQaEEwOiNbCctGXTe/wzUfFw9GKcBYa9DqoVw=; b=oHIXyENfAHSNSV CH2jW2WKq3s9v5EsrpZm6o+kq/GLpsb61M2rTK45ztcOeGBt+Y/1tBVUInP9ukOqPRFs0F3xeEo7N xcKN8KTkQk9mZfQnZCWfuBtb0udw6iLibZGuc08IK62yL+mhWGNGccqOO+JCLcZt5Q4AvHYfG9Cch AQe/z7TPB4Mwyvzpde1q9pQGjICXA7Lile3W9/qd+J4TKdQ/XHoRyovWKR/w+toZIyF1U66wD9WmF h2JJ4YumYhg0+tQOZrCOIkBiKLuup9MQ2v2A8hhw3xBzLhDJlmgHgDlQuIhNtxD8yBX3DCWDRPBO6 hwX0jDgxGnwi1SdGXmEA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vtWac-0000000FXbv-48a6; Fri, 20 Feb 2026 19:55:02 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vtWaa-0000000FXb9-3lcm for linux-riscv@lists.infradead.org; Fri, 20 Feb 2026 19:55:02 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id D6DA743A15; Fri, 20 Feb 2026 19:54:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E4341C116C6; Fri, 20 Feb 2026 19:54:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771617298; bh=G8bBEO/g8w7OleXjDK76ZPJ7XfuuZF81p9PP5s2xJGw=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=EbWQ4DZrULRIpfj3CJM7KKV//fsDC8CLhHmiPL0HturNAqFKrFk527trkEU6xhW2f w3SwTGScz1OkFw/9wovoXiC5e/95USuL7WrS9naQxcnv9wrrTqtb/IlHaGMsSezJhm br/QmCkRWyndpOzfSqun5kQUylX2CtCuiuK7FT2+5dCG3hjC1sJ8nNnSFugHlLq2Ht TZ9igfItIvo0leyV6QSa6cea+Ij6FrmhLbopseM+g86V9TQ0DtTZ+E5I37+aJQhFf2 JxupJktMKVQw45FKa3v1BaBYGIxB1QcTI+GrKklrwf6jKjr3cLj4fTR2h2gbQPwZ4D COnH7NWf35U8g== Date: Fri, 20 Feb 2026 11:54:56 -0800 From: Drew Fustini To: yunhui cui Subject: Re: [External] [PATCH RFC v2 08/17] RISC-V: QoS: add resctrl interface for CBQRI controllers Message-ID: References: <20260128-ssqosid-cbqri-v2-0-dca586b091b9@kernel.org> <20260128-ssqosid-cbqri-v2-8-dca586b091b9@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260220_115500_982425_0CDDB9CC X-CRM114-Status: GOOD ( 35.78 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Atish Patra , Adrien Ricciardi , Atish Kumar Patra , Conor Dooley , Nicolas Pitre , devicetree@vger.kernel.org, Liu Zhiwei , guo.wenjia23@zte.com.cn, linux-riscv@lists.infradead.org, Rob Herring , Peter Newman , x86@kernel.org, acpica-devel@lists.linux.dev, Robert Moore , liu.qingtao2@zte.com.cn, linux-acpi@vger.kernel.org, Ben Horgan , James Morse , Radim =?utf-8?B?S3LEjW3DocWZ?= , Dave Martin , Len Brown , Fenghua Yu , Chen Pei , Albert Ou , Kornel =?utf-8?Q?Dul=C4=99ba?= , Babu Moger , Weiwei Li , Paul Walmsley , Ved Shanbhogue , Reinette Chatre , Vasudevan Srinivasan , Tony Luck , Alexandre Ghiti , linux-kernel@vger.kernel.org, Samuel Holland , Krzysztof Kozlowski , Palmer Dabbelt , "Rafael J. Wysocki" , Paul Walmsley Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gTW9uLCBGZWIgMDIsIDIwMjYgYXQgMTI6MTI6MjhQTSArMDgwMCwgeXVuaHVpIGN1aSB3cm90 ZToKPiBIaSBEcmV3LAoKSGksIHRoYW5rcyBmb3IgeW91ciByZXZpZXcsIHNvcnJ5IEkgaGFkIHRo aXMgcmVwbHkgaW4gZHJhZnQgZm9yIGF3aGlsZQphbmQgZmFpbGVkIHRvIGFjdHVhbGx5IHNlbmQg aXQuIEFsbCBnb29kIHBvaW50cyBmcm9tIHlvdSBhbmQgSSd2ZSBiZWVuCndvcmtpbmcgb24gZml4 aW5nIHVwIHRoZSBjb2RlLgoKPiBPbiBUaHUsIEphbiAyOSwgMjAyNiBhdCA0OjI44oCvQU0gRHJl dyBGdXN0aW5pIDxmdXN0aW5pQGtlcm5lbC5vcmc+IHdyb3RlOgo+ID4KPiA+IEFkZCBpbnRlcmZh Y2UgZm9yIENCUVJJIGNvbnRyb2xsZXIgZHJpdmVycyB0byBtYWtlIHVzZSBvZiB0aGUgcmVzY3Ry bAo+ID4gZmlsZXN5c3RlbS4KPiA+Cj4gPiBDby1kZXZlbG9wZWQtYnk6IEFkcmllbiBSaWNjaWFy ZGkgPGFyaWNjaWFyZGlAYmF5bGlicmUuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogQWRyaWVuIFJp Y2NpYXJkaSA8YXJpY2NpYXJkaUBiYXlsaWJyZS5jb20+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBEcmV3 IEZ1c3RpbmkgPGZ1c3RpbmlAa2VybmVsLm9yZz4KPiA+IC0tLQo+ID4gIGFyY2gvcmlzY3Yva2Vy bmVsL3Fvcy9xb3NfcmVzY3RybC5jIHwgMTE5MiArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKwo+ID4gIDEgZmlsZSBjaGFuZ2VkLCAxMTkyIGluc2VydGlvbnMoKykKPiA+Cj4gPiBk aWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvcW9zL3Fvc19yZXNjdHJsLmMgYi9hcmNoL3Jp c2N2L2tlcm5lbC9xb3MvcW9zX3Jlc2N0cmwuYwo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ IGluZGV4IDAwMDAwMDAwMDAwMC4uZDUwMDA5ODU5OWQyCj4gPiAtLS0gL2Rldi9udWxsCj4gPiAr KysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9xb3MvcW9zX3Jlc2N0cmwuYwo+ID4gQEAgLTAsMCArMSwx MTkyIEBACj4gPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ID4g Kwo+ID4gKyNkZWZpbmUgcHJfZm10KGZtdCkgInFvczogcmVzY3RybDogIiBmbXQKPiA+ICsKPiA+ ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KPiA+ ICsjaW5jbHVkZSA8bGludXgvcmlzY3ZfcW9zLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Jlc2N0 cmwuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL2Nz ci5oPgo+ID4gKyNpbmNsdWRlIDxhc20vcW9zLmg+Cj4gPiArI2luY2x1ZGUgImludGVybmFsLmgi Cj4gPiArCj4gPiArI2RlZmluZSBNQVhfQ09OVFJPTExFUlMgNgo+ID4gK3N0YXRpYyBzdHJ1Y3Qg Y2JxcmlfY29udHJvbGxlciBjb250cm9sbGVyc1tNQVhfQ09OVFJPTExFUlNdOwo+IAo+IFN3aXRj aCB0byBkeW5hbWljIGFsbG9jYXRpb24/IFJlbW92ZSBNQVhfQ09OVFJPTExFUlMuCgpZZXMsIEkg YW0gcmV3b3JraW5nIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0 aGUKY2JxcmlfY29udHJvbGxlciBhcnJheSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRyb2xs ZXJzIGFjdHVhbGx5IGluCnRoZSBzeXN0ZW0uCgo+ID4gK2ludCByZXNjdHJsX2FyY2hfcm1pZF9y ZWFkKHN0cnVjdCByZHRfcmVzb3VyY2UgKnIsIHN0cnVjdCByZHRfbW9uX2RvbWFpbiAqZCwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBjbG9zaWQsIHUzMiBybWlkLCBlbnVtIHJl c2N0cmxfZXZlbnRfaWQgZXZlbnRpZCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIHU2 NCAqdmFsLCB2b2lkICphcmNoX21vbl9jdHgpCj4gPiArewo+ID4gKyAgICAgICAvKgo+ID4gKyAg ICAgICAgKiBUaGUgY3VycmVudCBRZW11IGltcGxlbWVudGF0aW9uIG9mIENCUVJJIGNhcGFjaXR5 IGFuZCBiYW5kd2lkdGgKPiA+ICsgICAgICAgICogY29udHJvbGxlcnMgZG8gbm90IGVtdWxhdGUg dGhlIHV0aWxpemF0aW9uIG9mIHJlc291cmNlcyBvdmVyCj4gPiArICAgICAgICAqIHRpbWUuIFRo ZXJlZm9yZSwgUWVtdSBjdXJyZW50bHkgc2V0cyB0aGUgaW52YWxpZCBiaXQgaW4KPiA+ICsgICAg ICAgICogY2NfbW9uX2N0cl92YWwgYW5kIGJjX21vbl9jdHJfdmFsLCBhbmQgdGhlcmUgaXMgbm8g bWVhbmluZ2Z1bAo+ID4gKyAgICAgICAgKiB2YWx1ZSBvdGhlciB0aGFuIDAgdG8gcmV0dXJuIGZv ciByZWFkaW5nIGFuIFJNSUQgKGUuZy4gTUNJRCBpbgo+ID4gKyAgICAgICAgKiBDQlFSSSB0ZXJt aW5vbG9neSkKPiA+ICsgICAgICAgICovCj4gPiArCj4gPiArICAgICAgIHJldHVybiAwOwo+IAo+ IEltcGxlbWVudCBwZXIgdGhlIHNwZWMncyBkZXNjcmlwdGlvbiBkaXJlY3RseSwgbm90IGFzIHRo aXMgY29tbWVudCBzdGF0ZXM/CgpHb29kIHBvaW50IHRoYXQgdGhpcyBzaG91bGQgYWN0dWFsbHkg cGVyZm9ybSB0aGUgb3BlcmF0aW9uIHRvIHJlYWQgdGhlCnZhbHVlLCBldmVuIGlmIFFlbXUgaXMg anVzdCBzZXR0aW5nIHRoZSBpbnZhbGlkIGJpdCBhcyB0aGVyZSBpcyBubyByZWFsCnZhbHVlIGlt cGxlbWVudGVkIGluIFFlbXUuCgo+ID4gKy8qCj4gPiArICogTm90ZTogZm9yIHRoZSBwdXJwb3Nl cyBvZiB0aGUgQ0JRUkkgcHJvb2Ytb2YtY29uY2VwdCwgZGVidWcgbG9nZ2luZwo+ID4gKyAqIGhh cyBiZWVuIGxlZnQgaW4gdGhpcyBmdW5jdGlvbiB0aGF0IGRldGVjdHMgdGhlIHByb3BlcnRpZXMg b2YgQ0JRUkkKPiA+ICsgKiBjYXBhYmxlIGNvbnRyb2xsZXJzIGluIHRoZSBzeXN0ZW0uIHByX2lu Zm8gY2FsbHMgd291bGQgYmUgcmVtb3ZlZAo+ID4gKyAqIGJlZm9yZSBzdWJtaXR0aW5nIG5vbi1S RkMgcGF0Y2hlcy4KPiA+ICsgKi8KPiA+ICtzdGF0aWMgaW50IGNicXJpX3Byb2JlX2NvbnRyb2xs ZXIoc3RydWN0IGNicXJpX2NvbnRyb2xsZXJfaW5mbyAqY3RybF9pbmZvLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjYnFyaV9jb250cm9sbGVyICpjdHJsKQo+ ID4gK3sKPiA+ICsgICAgICAgaW50IGVyciA9IDAsIHN0YXR1czsKPiA+ICsgICAgICAgdTY0IHJl ZzsKPiA+ICsKPiA+ICsgICAgICAgcHJfaW5mbygiY29udHJvbGxlciBpbmZvOiB0eXBlPSVkIGFk ZHI9MHglbHggc2l6ZT0lbHUgbWF4LXJjaWQ9JXUgbWF4LW1jaWQ9JXUiLAo+ID4gKyAgICAgICAg ICAgICAgIGN0cmxfaW5mby0+dHlwZSwgY3RybF9pbmZvLT5hZGRyLCBjdHJsX2luZm8tPnNpemUs Cj4gPiArICAgICAgICAgICAgICAgY3RybF9pbmZvLT5yY2lkX2NvdW50LCBjdHJsX2luZm8tPm1j aWRfY291bnQpOwo+ID4gKwo+ID4gKyAgICAgICAvKiBtYXhfcm1pZCBpcyB1c2VkIGJ5IHJlc2N0 cmxfYXJjaF9zeXN0ZW1fbnVtX3JtaWRfaWR4KCkgKi8KPiA+ICsgICAgICAgbWF4X3JtaWQgPSBj dHJsX2luZm8tPm1jaWRfY291bnQ7Cj4gCj4gR2V0IHRoZSBtaW4gb2YgYWxsIGNvbnRyb2xsZXJz PwoKWWVzLCBJIHdpbGwgY2hhbmdlIHRoZSBsb2dpYyB0byBkbyB0aGF0LgoKPiA+ICtzdGF0aWMg aW50IHFvc19pbml0X2RvbWFpbl9jdHJsdmFsKHN0cnVjdCByZHRfcmVzb3VyY2UgKnIsIHN0cnVj dCByZHRfY3RybF9kb21haW4gKmQpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgY2JxcmlfcmVz Y3RybF9yZXMgKmh3X3JlczsKPiA+ICsgICAgICAgc3RydWN0IGNicXJpX3Jlc2N0cmxfZG9tICpo d19kb207Cj4gPiArICAgICAgIHU2NCAqZGM7Cj4gPiArICAgICAgIGludCBlcnIgPSAwOwo+ID4g KyAgICAgICBpbnQgaTsKPiA+ICsKPiA+ICsgICAgICAgaHdfcmVzID0gY29udGFpbmVyX29mKHIs IHN0cnVjdCBjYnFyaV9yZXNjdHJsX3JlcywgcmVzY3RybF9yZXMpOwo+ID4gKyAgICAgICBpZiAo IWh3X3JlcykKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKPiA+ICsKPiA+ICsg ICAgICAgaHdfZG9tID0gY29udGFpbmVyX29mKGQsIHN0cnVjdCBjYnFyaV9yZXNjdHJsX2RvbSwg cmVzY3RybF9jdHJsX2RvbSk7Cj4gPiArICAgICAgIGlmICghaHdfZG9tKQo+ID4gKyAgICAgICAg ICAgICAgIHJldHVybiAtRU5PTUVNOwo+ID4gKwo+ID4gKyAgICAgICBkYyA9IGttYWxsb2NfYXJy YXkoaHdfcmVzLT5tYXhfcmNpZCwgc2l6ZW9mKCpod19kb20tPmN0cmxfdmFsKSwKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwo+ID4gKyAgICAgICBpZiAoIWRjKQo+ ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ID4gKwo+ID4gKyAgICAgICBod19k b20tPmN0cmxfdmFsID0gZGM7Cj4gPiArCj4gPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCBod19y ZXMtPm1heF9yY2lkOyBpKyssIGRjKyspIHsKPiA+ICsgICAgICAgICAgICAgICBlcnIgPSByZXNj dHJsX2FyY2hfdXBkYXRlX29uZShyLCBkLCBpLCAwLCByZXNjdHJsX2dldF9kZWZhdWx0X2N0cmwo cikpOwo+ID4gKyAgICAgICAgICAgICAgIGlmIChlcnIpCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gMDsKPiAKPiByZXR1cm4gMCA/CgpBaCwgeWVzLCBJIHdpbGwgdXBkYXRlIHRv IHJldHVybiBlcnJvciBpbnN0ZWFkIG9mIHNpbGVuY2luZyBpdC4KCj4gPiArc3RhdGljIGludCBx b3NfcmVzY3RybF9hZGRfY29udHJvbGxlcl9kb21haW4oc3RydWN0IGNicXJpX2NvbnRyb2xsZXIg KmN0cmwsIGludCAqaWQpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgcmR0X2N0cmxfZG9tYWlu ICpkb21haW4gPSBOVUxMOwo+ID4gKyAgICAgICBzdHJ1Y3QgY2JxcmlfcmVzY3RybF9yZXMgKmNi cXJpX3JlcyA9IE5VTEw7Cj4gPiArICAgICAgIHN0cnVjdCByZHRfcmVzb3VyY2UgKnJlcyA9IE5V TEw7Cj4gPiArICAgICAgIGludCBpbnRlcm5hbF9pZCA9ICppZDsKPiA+ICsgICAgICAgaW50IGVy ciA9IDA7Cj4gPiArCj4gPiArICAgICAgIGRvbWFpbiA9IHFvc19uZXdfZG9tYWluKGN0cmwpOwo+ ID4gKyAgICAgICBpZiAoIWRvbWFpbikKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVOT1NQ QzsKPiA+ICsgICAgICAgaWYgKGN0cmwtPmN0cmxfaW5mby0+dHlwZSA9PSBDQlFSSV9DT05UUk9M TEVSX1RZUEVfQ0FQQUNJVFkpIHsKPiA+ICsgICAgICAgICAgICAgICBjcHVtYXNrX2NvcHkoJmRv bWFpbi0+aGRyLmNwdV9tYXNrLCAmY3RybC0+Y3RybF9pbmZvLT5jYWNoZS5jcHVfbWFzayk7Cj4g PiArICAgICAgICAgICAgICAgaWYgKGN0cmwtPmN0cmxfaW5mby0+Y2FjaGUuY2FjaGVfbGV2ZWwg PT0gMikgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY2JxcmlfcmVzID0gJmNicXJpX3Jl c2N0cmxfcmVzb3VyY2VzW1JEVF9SRVNPVVJDRV9MMl07Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICBjYnFyaV9yZXMtPm1heF9yY2lkID0gY3RybC0+Y3RybF9pbmZvLT5yY2lkX2NvdW50Owo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY2JxcmlfcmVzLT5tYXhfbWNpZCA9IGN0cmwtPmN0 cmxfaW5mby0+bWNpZF9jb3VudDsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9ICZj YnFyaV9yZXMtPnJlc2N0cmxfcmVzOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5t b24ubnVtX3JtaWQgPSBjdHJsLT5jdHJsX2luZm8tPm1jaWRfY291bnQ7Cj4gPiArICAgICAgICAg ICAgICAgICAgICAgICByZXMtPnJpZCA9IFJEVF9SRVNPVVJDRV9MMjsKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIHJlcy0+bmFtZSA9ICJMMiI7Cj4gPiArICAgICAgICAgICAgICAgICAgICAg ICByZXMtPmFsbG9jX2NhcGFibGUgPSBjdHJsLT5hbGxvY19jYXBhYmxlOwo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgcmVzLT5tb25fY2FwYWJsZSA9IGN0cmwtPm1vbl9jYXBhYmxlOwo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5zY2hlbWFfZm10ID0gUkVTQ1RSTF9TQ0hFTUFf QklUTUFQOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5jdHJsX3Njb3BlID0gUkVT Q1RSTF9MMl9DQUNIRTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+Y2FjaGUuYXJj aF9oYXNfc3BhcnNlX2JpdG1hc2tzID0gZmFsc2U7Cj4gPiArICAgICAgICAgICAgICAgICAgICAg ICByZXMtPmNhY2hlLmFyY2hfaGFzX3Blcl9jcHVfY2ZnID0gZmFsc2U7Cj4gPiArICAgICAgICAg ICAgICAgICAgICAgICByZXMtPmNhY2hlLmNibV9sZW4gPSBjdHJsLT5jYy5uY2Jsa3M7Cj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICByZXMtPmNhY2hlLnNoYXJlYWJsZV9iaXRzID0gcmVzY3Ry bF9nZXRfZGVmYXVsdF9jdHJsKHJlcyk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXMt PmNhY2hlLm1pbl9jYm1fYml0cyA9IDE7Cj4gPiArICAgICAgICAgICAgICAgfSBlbHNlIGlmIChj dHJsLT5jdHJsX2luZm8tPmNhY2hlLmNhY2hlX2xldmVsID09IDMpIHsKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIGNicXJpX3JlcyA9ICZjYnFyaV9yZXNjdHJsX3Jlc291cmNlc1tSRFRfUkVT T1VSQ0VfTDNdOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY2JxcmlfcmVzLT5tYXhfcmNp ZCA9IGN0cmwtPmN0cmxfaW5mby0+cmNpZF9jb3VudDsKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgIGNicXJpX3Jlcy0+bWF4X21jaWQgPSBjdHJsLT5jdHJsX2luZm8tPm1jaWRfY291bnQ7Cj4g PiArICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAmY2JxcmlfcmVzLT5yZXNjdHJsX3JlczsK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+bW9uLm51bV9ybWlkID0gY3RybC0+Y3Ry bF9pbmZvLT5tY2lkX2NvdW50Owo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5yaWQg PSBSRFRfUkVTT1VSQ0VfTDM7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXMtPm5hbWUg PSAiTDMiOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5zY2hlbWFfZm10ID0gUkVT Q1RSTF9TQ0hFTUFfQklUTUFQOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5jdHJs X3Njb3BlID0gUkVTQ1RSTF9MM19DQUNIRTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJl cy0+YWxsb2NfY2FwYWJsZSA9IGN0cmwtPmFsbG9jX2NhcGFibGU7Cj4gPiArICAgICAgICAgICAg ICAgICAgICAgICByZXMtPm1vbl9jYXBhYmxlID0gY3RybC0+bW9uX2NhcGFibGU7Cj4gPiArICAg ICAgICAgICAgICAgICAgICAgICByZXMtPmNhY2hlLmFyY2hfaGFzX3NwYXJzZV9iaXRtYXNrcyA9 IGZhbHNlOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5jYWNoZS5hcmNoX2hhc19w ZXJfY3B1X2NmZyA9IGZhbHNlOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5jYWNo ZS5jYm1fbGVuID0gY3RybC0+Y2MubmNibGtzOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg cmVzLT5jYWNoZS5zaGFyZWFibGVfYml0cyA9IHJlc2N0cmxfZ2V0X2RlZmF1bHRfY3RybChyZXMp Owo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5jYWNoZS5taW5fY2JtX2JpdHMgPSAx Owo+ID4gKyAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAg ICBwcl93YXJuKCIlcygpOiB1bmtub3duIGNhY2hlIGxldmVsICVkIiwgX19mdW5jX18sCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwtPmN0cmxfaW5mby0+Y2FjaGUuY2Fj aGVfbGV2ZWwpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVOT0RFVjsKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyX2ZyZWVfZG9tYWluOwo+ID4gKyAgICAg ICAgICAgICAgIH0KPiA+ICsgICAgICAgfSBlbHNlIGlmIChjdHJsLT5jdHJsX2luZm8tPnR5cGUg PT0gQ0JRUklfQ09OVFJPTExFUl9UWVBFX0JBTkRXSURUSCkgewo+ID4gKyAgICAgICAgICAgICAg IGlmIChjdHJsLT5hbGxvY19jYXBhYmxlKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBj YnFyaV9yZXMgPSAmY2JxcmlfcmVzY3RybF9yZXNvdXJjZXNbUkRUX1JFU09VUkNFX01CQV07Cj4g PiArICAgICAgICAgICAgICAgICAgICAgICBjYnFyaV9yZXMtPm1heF9yY2lkID0gY3RybC0+Y3Ry bF9pbmZvLT5yY2lkX2NvdW50Owo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY2JxcmlfcmVz LT5tYXhfbWNpZCA9IGN0cmwtPmN0cmxfaW5mby0+bWNpZF9jb3VudDsKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIHJlcyA9ICZjYnFyaV9yZXMtPnJlc2N0cmxfcmVzOwo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgcmVzLT5tb24ubnVtX3JtaWQgPSBjdHJsLT5jdHJsX2luZm8tPm1jaWRf Y291bnQ7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXMtPnJpZCA9IFJEVF9SRVNPVVJD RV9NQkE7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXMtPm5hbWUgPSAiTUIiOwo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5zY2hlbWFfZm10ID0gUkVTQ1RSTF9TQ0hFTUFf UkFOR0U7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXMtPmN0cmxfc2NvcGUgPSBSRVND VFJMX0wzX0NBQ0hFOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5hbGxvY19jYXBh YmxlID0gY3RybC0+YWxsb2NfY2FwYWJsZTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJl cy0+bW9uX2NhcGFibGUgPSBmYWxzZTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+ bWVtYncuZGVsYXlfbGluZWFyID0gdHJ1ZTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJl cy0+bWVtYncuYXJjaF9uZWVkc19saW5lYXIgPSB0cnVlOwo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgcmVzLT5tZW1idy50aHJvdHRsZV9tb2RlID0gVEhSRUFEX1RIUk9UVExFX1VOREVGSU5F RDsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVtIHBlcmNlbnRhZ2Ug YWxsb3dlZCBieSB0aGUgQ0JRUkkgc3BlYwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVz LT5tZW1idy5taW5fYncgPSAxOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1h eGltdW0gcGVyY2VudGFnZSBhbGxvd2VkIGJ5IHRoZSBDQlFSSSBzcGVjCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICByZXMtPm1lbWJ3Lm1heF9idyA9IDgwOwo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgcmVzLT5tZW1idy5id19ncmFuID0gMTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4g Cj4gV3JhcCBhIGZ1bmN0aW9uLgoKSSBhbSBndWVzc2luZyB5b3UgbWVhbiB0byBicmVhayB1cCB0 aGlzIGxvbmcgZnVuY3Rpb24gaW50byBhIGNvdXBsZSBvZgpzbWFsbGVyIGZ1bmN0aW9ucz8gSSB3 aWxsIGdpdmUgdGhhdCBhIHRyeSBmb3IgdGhlIG5leHQgcmV2LgoKPiA+ICsgICAgICAgfSBlbHNl IHsKPiA+ICsgICAgICAgICAgICAgICBwcl93YXJuKCIlcygpOiB1bmtub3duIHJlc291cmNlICVk IiwgX19mdW5jX18sIGN0cmwtPmN0cmxfaW5mby0+dHlwZSk7Cj4gPiArICAgICAgICAgICAgICAg ZXJyID0gLUVOT0RFVjsKPiA+ICsgICAgICAgICAgICAgICBnb3RvIGVycl9mcmVlX2RvbWFpbjsK PiA+ICsgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICBkb21haW4tPmhkci5pZCA9IGludGVybmFs X2lkOwo+ID4gKyAgICAgICBlcnIgPSBxb3NfaW5pdF9kb21haW5fY3RybHZhbChyZXMsIGRvbWFp bik7Cj4gPiArICAgICAgIGlmIChlcnIpCj4gPiArICAgICAgICAgICAgICAgZ290byBlcnJfZnJl ZV9kb21haW47Cj4gPiArCj4gPiArICAgICAgIGlmIChjYnFyaV9yZXMpIHsKPiA+ICsgICAgICAg ICAgICAgICBsaXN0X2FkZF90YWlsKCZkb21haW4tPmhkci5saXN0LCAmY2JxcmlfcmVzLT5yZXNj dHJsX3Jlcy5jdHJsX2RvbWFpbnMpOwo+ID4gKyAgICAgICAgICAgICAgICppZCA9IGludGVybmFs X2lkOwo+ID4gKyAgICAgICAgICAgICAgIGVyciA9IHJlc2N0cmxfb25saW5lX2N0cmxfZG9tYWlu KHJlcywgZG9tYWluKTsKPiA+ICsgICAgICAgICAgICAgICBpZiAoZXJyKSB7Cj4gPiArICAgICAg ICAgICAgICAgICAgICAgICBwcl93YXJuKCIlcygpOiBmYWlsZWQgdG8gb25saW5lIGNicXJpX3Jl cyBkb21haW4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVy cl9mcmVlX2RvbWFpbjsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiArICAgICAgIH0KPiA+ICsK PiA+ICsgICAgICAgcmV0dXJuIDA7Cj4gPiArCj4gPiArZXJyX2ZyZWVfZG9tYWluOgo+ID4gKyAg ICAgICBwcl93YXJuKCIlcygpOiBlcnJfZnJlZV9kb21haW4iLCBfX2Z1bmNfXyk7Cj4gPiArICAg ICAgIGtmcmVlKGNvbnRhaW5lcl9vZihkb21haW4sIHN0cnVjdCBjYnFyaV9yZXNjdHJsX2RvbSwg cmVzY3RybF9jdHJsX2RvbSkpOwo+IAo+IGZyZWUgaHdfZG9tLT5jdHJsX3ZhbCDvvJ8KCkknbGwg dGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBlcnJvciBjbGVhbnVwIHBhdGggYW5kIGZpeCBpbiB0 aGUgbmV4dApyZXYuCgpUaGFua3MsCkRyZXcKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtcmlzY3YK