From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A01152F97; Wed, 3 Apr 2024 08:45:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712133906; cv=none; b=qWd1FFmaj8M+KRWXbBZPswznBdANFnOBa5wvdfxiNaveNSS6nlp38cYFO0s798w8X0Y10l5ag9wlthMFBLGpr55CAJOOeB5XXR5skXoPfx/YxXWjKYuANzgLezi2lAu6Usd8Xt+3mOjbMheK5s8+T/7xcgyHdN+dInXduiqcvyU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712133906; c=relaxed/simple; bh=LiuEPSBbBZhjq99c5gnSda0jGuZJeU5oKE7nApE5nEw=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=V7dUr26NCzAmO7bzPUpJ/Y7Mpfj3GSBU8tXfs2VmbzXuhL0hf++4gMS4RwnfD/EbpxbnCKdPCy2JSnFo5ypM+N1pb2Ws3sxYK+rltj8wNUpI5nwqs9viSCxZFsF68pHt8JMuiu3mBaL5SpzX9PGnADic5+L0RVPWrFOlto2KbsI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KTZgiFVj; arc=none smtp.client-ip=209.85.167.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KTZgiFVj" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-513e6777af4so10052304e87.2; Wed, 03 Apr 2024 01:45:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712133902; x=1712738702; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=MWLSu4uzQTB9M/BAwKHtnLRv6ngDwtAIdk7qUH2kq2s=; b=KTZgiFVjVBCF+eGULCqT6XK0c5AqWnclgqmfEV7VjtgBmacpR5cOkvobdhp3QVzHS4 qiqjKHOtyHwydROEjhBRMaQr1cow35H1y1T+EqRwgkIKdhY5tZ8P3Lhj8I7OCxx6h4+J nSSLx3xLN9Dztd91xb5pbbgaGnYozL/INukgzGyMp4A3LzlMo/WU19heDn4i0Zuxfmai iYTHA3OW8b11kTt0C/QIyWPgCoQ5tVPHeY0WWc1yPPpTaeZQ/vFZ2Pgdo82+Dk3o/EVZ WLIjxGrptcUew81UZTpZaQ2roJj412FwPr3qtrqRXsV8psq7vD+qYhQE91ZNRlxtvsWV 8SDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712133902; x=1712738702; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MWLSu4uzQTB9M/BAwKHtnLRv6ngDwtAIdk7qUH2kq2s=; b=Uox4n1wx300wLsnyYB7hPQcLcKPvuLuBF0eUTlDl+s42BLOWZTbiNq6+BEx7cfWaPv 2utOS2kcxqaJQ57yxqorOibqchjrBgL/uZQUYnmrgLD020aGMQ8HpYgawQ3D4uz3b7yA GVo7YSbPKEsxC1imQ4vGQvhVzoS1HKIU7rKS3iemxhAMDVXutiLtxSw3ANWxzdDQcZKP 0ZGgFMece3WJBUML/yjxgwqE3e1kI1+u1B+kwhcLbHYWPfp3C32zTRQPNRgwZUM3plhO Ppo06vPETWdBTVH/DnE5RpmL8sV/aPM3N5LQ4+Xw9LV4GcJyCL/cfvwGG3OkYW7O/0yV pfuw== X-Forwarded-Encrypted: i=1; AJvYcCXUQ76iLaFdiUTgRHAhdJM1GmBsJGSvYwjBWqQDA3jpCjPRn15EWI8U36LxqW8WL7z7kWb/Rd3r1o7qGThkJMoUhMKl4wMeEl8lQa/EgTyMqLKwDBm5YbVec8iRDqIWs3IX7Gsp2JbYP1BrgFhlU04tq4V6gsHZubgViCsYUinoNsiYdgo= X-Gm-Message-State: AOJu0YySkK5Y0LfX1M31d0rnXb0z8giq5dS3A71WB9kttSwZE1BuwV3x qITPhJw3w6vYzpTulC409ar/DL7ovYdBuOiqMUqiRNneyv9oCpJkv1TvfuSVyIfXSxmggsEUfte A8cnKk2NugL/xgmgjRPZzQqjtIpY= X-Google-Smtp-Source: AGHT+IFNFO+nOI8dNHsuG86TF8WKE282yu42b7vwXfmpSN4OtD3CKeAs1VM/dGBrbeOlOWtKoWF2x/h7W3HUWkzTwvk= X-Received: by 2002:a05:6512:2813:b0:515:9c73:e29a with SMTP id cf19-20020a056512281300b005159c73e29amr4278680lfb.66.1712133902030; Wed, 03 Apr 2024 01:45:02 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-gpio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240323-pinctrl-scmi-v6-0-a895243257c0@nxp.com> <20240323-pinctrl-scmi-v6-3-a895243257c0@nxp.com> In-Reply-To: From: Andy Shevchenko Date: Wed, 3 Apr 2024 11:44:25 +0300 Message-ID: Subject: Re: [PATCH v6 3/4] firmware: arm_scmi: Add SCMI v3.2 pincontrol protocol basic support To: Cristian Marussi Cc: Peng Fan , "Peng Fan (OSS)" , Sudeep Holla , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Dan Carpenter , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-gpio@vger.kernel.org" , Oleksii Moisieiev Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Apr 3, 2024 at 11:06=E2=80=AFAM Cristian Marussi wrote: > On Tue, Apr 02, 2024 at 07:39:44PM +0300, Andy Shevchenko wrote: > > On Tue, Apr 2, 2024 at 6:58=E2=80=AFPM Cristian Marussi > > wrote: > > > On Tue, Apr 02, 2024 at 04:06:06PM +0300, Andy Shevchenko wrote: > > > > On Tue, Apr 2, 2024 at 10:48=E2=80=AFAM Cristian Marussi > > > > wrote: > > > > > On Sun, Mar 31, 2024 at 01:44:28PM +0000, Peng Fan wrote: > > > > > > > Sat, Mar 23, 2024 at 08:15:16PM +0800, Peng Fan (OSS) kirjoit= ti: ... > > > > > > > > +#include > > > > > > > > +#include > > > > > > > > +#include > > > > > > > > > > > > > > This is semi-random list of headers. Please, follow IWYU prin= ciple (include > > > > > > > what you use). There are a lot of inclusions I see missing (j= ust in the context of > > > > > > > this page I see bits.h, types.h, and asm/byteorder.h). > > > > > > > > > > > > Is there any documentation about this requirement? > > > > > > Some headers are already included by others. > > > > > > > > The documentation here is called "a common sense". > > > > The C language is built like this and we expect that nobody will > > > > invest into the dependency hell that we have already, that's why IW= YU > > > > principle, please follow it. > > > > > > Yes, but given that we have a growing number of SCMI protocols there = is a > > > common local protocols.h header to group all includes needed by any > > > protocols: the idea behind this (and the devm_ saga down below) was t= o ease > > > development of protocols, since there are lots of them and growing, g= iven > > > the SCMI spec is extensible. > > > > Yes, and what you are effectively suggesting is: "Technical debt? Oh, > > fine, we do not care!" This is not good. I'm in a long term of > > cleaning up the dependency hell in the kernel (my main focus is > > kernel.h for now) and I am talking from my experience. I do not like > > what people are doing in 95% of the code, that's why I really want to > > stop the bad practices as soon as possible. > > Not at all, the aim was exactly the opposite, avoiding that some protocol > could have been written without all the needed includes: since a basic se= t > of headers is definitely common to any protocol you may think to write, > grouping all there was meant to avoid this...I thought that by moving the > problem away in one single internal common header was easier to monitor. Which may or may not be okay. It plays too smart, so the end developer won't care about real headers they need as they are the only ones who know the source code in the best possible way. > I certainly maybe wrong, but I dont see how you can deduce I dont care... See above, the protocols.h it's a reincarnation (much less twisted and ugly, though) of something like kernel.h. Do you know why we have a split to headers instead of having everything in one? It speeds up a build, it separates namespace (to the extent of what we call "namespace" in C language), it makes the modularization (of the source code) better (easier to avoid considering what's not needed), and so on. I don't think making a "common" header is a good idea. > ...and maybe, only maybe, what that 95% of people is trying to do in thei= r > horrible code is to deliver the best reasonably possible thing within the= ir > timeline while you are barking at them in chase of never to be released u= tter > perfection. Yeah. That's why it's good to teach people about many aspects of the C language (which is not popular, in particular due to these nuances, nowadays and we are starving for good developers). > > Last to add, but not least is that your code may be used as an example > > for others, hence we really have to do our best in order to avoid bad > > design, practices, and cargo cults. If this requires more refactoring > > of the existing code, then do it sooner than later. ... > > > > > Andy made (mostly) the same remarks on this same patch ~1-year ag= o on > > > > > this same patch while it was posted by Oleksii. > > > > > > > > > > And I told that time that most of the remarks around devm_ usage = were > > > > > wrong due to how the SCMI core handles protocol initialization (u= sing a > > > > > devres group transparently). > > > > > > > > > > This is what I answered that time. > > > > > > > > > > https://lore.kernel.org/linux-arm-kernel/ZJ78hBcjAhiU+ZBO@e120937= -lin/#t > > > > > > > > > > I wont repeat myself, but, in a nutshell the memory allocation li= ke it > > > > > is now is fine: a bit happens via devm_ at protocol initializatio= n, the > > > > > other is doe via explicit kmalloc at runtime and freed via kfree = at > > > > > remove time (if needed...i.e. checking the present flag of some s= tructs) > > > > > > > > This sounds like a mess. devm_ is expected to be used only for the > > > > ->probe() stage, otherwise you may consider cleanup.h (__free() mac= ro) > > > > to have automatic free at the paths where memory is not needed. > > > > > > Indeed, this protocol_init code is called by the SCMI core once for a= ll when > > > an SCMI driver tries at first to use this specific protocol by 'getti= ng' its > > > protocol_ops, so it is indeed called inside the probe chain of the dr= iver: > > > at this point you *can* decide to use devres to allocate memory and b= e assured > > > that if the init fails, or when the driver cease to use this protocol= (calling > > > its remove()) and no other driver is using it, all the stuff that hav= e been > > > allocated related to this protocol will be released by the core for y= ou. > > > (using an internal devres group) > > > > > > Without this you should handle manually all the deallocation manually= on > > > the init error-paths AND also provide all the cleanup explicitly when > > > the protocol is no more used by any driver (multiple users of the sam= e > > > protocol instance are possible)...for all protocols. > > > > Yes. Is it a problem? > > Well, no, but is it not a repetitive and error-prone process ? Yes. That's why we now have cleanup.h. Please, consider using it instead. > Is it not the exact reason why devres management exist in first place, to= avoid > repetitive manual alloc/free of resources and related pitfalls ? (even th= ough > certainly it is normally used in a more conventional and straightforward = way) No. Its scope is to clean the probe-remove parts, one should not spread it otherwise and one definitely should know its limitations and corner cases (I even gave some examples back in ca. 2017 in one of my presentation WRT typical mistakes the developers make > The idea was to give some sort of aid in the SCMI stack for writing proto= cols, > so regarding mem_mgmt, I just built on top of devres facilities, not inve= nted > anything, to try to avoid repetitions and let the core handle mem allocs/= free > during the probe phases as much as possible: in pinctrl case would be > particularly trivial to instead manually allocate stuff at init (due to m= any > lazy delayed allocations) but other protocols need a lot more to be done = at init, > frequently in a loop to allocate multiple resources descriptors, and manu= ally > undoing all of that on each error-path and on cleanup is definitely error= -prone > and a pain. I understand the motivation, but again, devm is a beast in the corner cases. I believe Laurent Pinchart gave a presentation about how bad devm can hit you if you don't know what you are doing (OTOH it's hard to know with devm). > Last but not least, this whole thing was designed to address the needs of= the > protocols that existed at that time....it is only now with pinctrl lazy-a= llocations > at runtime that the ugly cohexistence of devm_ and non-devm allocations b= ecame a > thing....so clearly the thing needs to be improved/rethinked...even dropp= ed if no > more fitting... > > ... or alternatively since devres allocations are anyway optional, you co= uld just > use regular kmalloc/kfree for this protocol and avoid this dual handling.= .. Probably, just have a look at cleanup.h. > ...this was just to put things in context...and I'll happily let Sudeep d= ecide > what he prefers in the immediate for pinctrl or more in general about all= the > scmi devres, that I've got enough of these pleasant interactions for now.= .. As I said, it's your call, I'm not preventing you from applying whatever is going on in the SCMI subsystem. Just tried to point out the problem(s). --=20 With Best Regards, Andy Shevchenko 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 9A946CD1288 for ; Wed, 3 Apr 2024 08:45:24 +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:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=e4p1cD3g6ZpbcpN6SZDFuxcCUmk7SC2pPcsMwWpxB+A=; b=3U1AjgT3bbsHEV M4bCm4KzOcErkdVNG216smIKOHvUOH1lrcTxWnRYX6+3wdNqJXPlEB+tbsKngbF/s5GeKTwY4uAKB mDodIzABoHFPXmgVCDbvZZU4X8iUoLC4ZwlYIknifvEbSBaB6f9ZlsJKHdSE7+MaOfN7/tVyf00+8 MkEHxnn0rLsHT8KQ8SV0nNfPi8m5G/r2e204aFixGa189VhBP5XW1qIwm/T3l1zuhjGtn7MBU1Uh0 JY/iG0XIEwkvjUc4fQG5pSD+7Pi/wPN5klrJ3bnDsKa9p7aHA8ypXNmO1LqHW0CgQlDuJnslziv2R wBTxp+fqS4FHyxCyb2fA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rrwF6-0000000F0C0-1iz7; Wed, 03 Apr 2024 08:45:12 +0000 Received: from mail-lf1-x12d.google.com ([2a00:1450:4864:20::12d]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rrwF0-0000000F06c-1Fu9 for linux-arm-kernel@lists.infradead.org; Wed, 03 Apr 2024 08:45:09 +0000 Received: by mail-lf1-x12d.google.com with SMTP id 2adb3069b0e04-513ccc70a6dso10401084e87.1 for ; Wed, 03 Apr 2024 01:45:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712133902; x=1712738702; darn=lists.infradead.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=MWLSu4uzQTB9M/BAwKHtnLRv6ngDwtAIdk7qUH2kq2s=; b=QI/6mpVQMS1ncJdhlPGqMIY+VcMyCXy8pfEH2eohqRGHkFVwPOKsBBNWu8YpmZPRKP WdBHMz9mMZvMF/+gyDuzyGzWtxwF5w7DexiTcyAF3+yThXTLMnscaXnbihF47lbX62nY peqg950D2YZ/Y0ZZhTptPlGmx6nPQyvG9ldyv2ihmhOvCe0mQuhdcTqNiJy264NORjZ4 U/JjHnJsc5T85zYtZE5DzJWMLvSrBsvIBnJa4EXWHLcz755AxYu7/CqXE058Y0veln24 jkzhy+pLjBL31iwh504brDB64ECbE0ct8newHUNdVWWE134PxlZ4mNcOpN+ZygaAey3q y9JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712133902; x=1712738702; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MWLSu4uzQTB9M/BAwKHtnLRv6ngDwtAIdk7qUH2kq2s=; b=oIHNFetC82DdAsvKG6y0AcyVPda7rVjO8SkApNBpWcJrQJi6C61fP290Lz4AwDijCW 4CGCyrHp2rjYQkHh9O2XSxeceTrX7db19uSm8hFlKmZUMUr+gfoUPtqJhy/vl7UeC1l8 T82N59RdjtGzqIWr+JB+G3Sp9OH9BNZf1kLuxEWMW+1uCR7hxHFe+/lIhEd1JnClLyB6 4a2l/384Cl0Q1Ve6HA5v7BoLip7pZ1z5xB0+TZ/+CgPULlSgbZjSVltGga8vkSiOb5Kb L7qOPFNqnX/m98mZQ8mJCiTHkeEnptJ9Qm4TF9s/nMXzSGp4TxJ3a5UunNP1qXIlA48q uvLg== X-Forwarded-Encrypted: i=1; AJvYcCV4ubg8zlVpSxzy5plyxWAv7fMduklqHlGDiYRiBxDyi5EStuDcGbz0phyjdI6IUSQRTFT7eL+8f3rlQSHNS/mc8kmRVS4aWCbESFkdpqwgq8RpGlg= X-Gm-Message-State: AOJu0YwV2QRKScmaje2NRcxxp5LGPGJuN1SP/YEIU8W9qhJCtHvHGuj6 bVZucbkR5Tb+epFDjPvI6UW39ZU5zzo4cCH6kPzS0coeeq+xdl6b7aNAV1y6GYYU1n4VaJOCnxB nHrQ7EX5TpaYlHGg09ID+/S/SD38= X-Google-Smtp-Source: AGHT+IFNFO+nOI8dNHsuG86TF8WKE282yu42b7vwXfmpSN4OtD3CKeAs1VM/dGBrbeOlOWtKoWF2x/h7W3HUWkzTwvk= X-Received: by 2002:a05:6512:2813:b0:515:9c73:e29a with SMTP id cf19-20020a056512281300b005159c73e29amr4278680lfb.66.1712133902030; Wed, 03 Apr 2024 01:45:02 -0700 (PDT) MIME-Version: 1.0 References: <20240323-pinctrl-scmi-v6-0-a895243257c0@nxp.com> <20240323-pinctrl-scmi-v6-3-a895243257c0@nxp.com> In-Reply-To: From: Andy Shevchenko Date: Wed, 3 Apr 2024 11:44:25 +0300 Message-ID: Subject: Re: [PATCH v6 3/4] firmware: arm_scmi: Add SCMI v3.2 pincontrol protocol basic support To: Cristian Marussi Cc: Peng Fan , "Peng Fan (OSS)" , Sudeep Holla , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Dan Carpenter , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-gpio@vger.kernel.org" , Oleksii Moisieiev X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240403_014507_143679_878E5E13 X-CRM114-Status: GOOD ( 62.02 ) 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: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCBBcHIgMywgMjAyNCBhdCAxMTowNuKAr0FNIENyaXN0aWFuIE1hcnVzc2kKPGNyaXN0 aWFuLm1hcnVzc2lAYXJtLmNvbT4gd3JvdGU6Cj4gT24gVHVlLCBBcHIgMDIsIDIwMjQgYXQgMDc6 Mzk6NDRQTSArMDMwMCwgQW5keSBTaGV2Y2hlbmtvIHdyb3RlOgo+ID4gT24gVHVlLCBBcHIgMiwg MjAyNCBhdCA2OjU44oCvUE0gQ3Jpc3RpYW4gTWFydXNzaQo+ID4gPGNyaXN0aWFuLm1hcnVzc2lA YXJtLmNvbT4gd3JvdGU6Cj4gPiA+IE9uIFR1ZSwgQXByIDAyLCAyMDI0IGF0IDA0OjA2OjA2UE0g KzAzMDAsIEFuZHkgU2hldmNoZW5rbyB3cm90ZToKPiA+ID4gPiBPbiBUdWUsIEFwciAyLCAyMDI0 IGF0IDEwOjQ44oCvQU0gQ3Jpc3RpYW4gTWFydXNzaQo+ID4gPiA+IDxjcmlzdGlhbi5tYXJ1c3Np QGFybS5jb20+IHdyb3RlOgo+ID4gPiA+ID4gT24gU3VuLCBNYXIgMzEsIDIwMjQgYXQgMDE6NDQ6 MjhQTSArMDAwMCwgUGVuZyBGYW4gd3JvdGU6Cj4gPiA+ID4gPiA+ID4gU2F0LCBNYXIgMjMsIDIw MjQgYXQgMDg6MTU6MTZQTSArMDgwMCwgUGVuZyBGYW4gKE9TUykga2lyam9pdHRpOgoKLi4uCgo+ ID4gPiA+ID4gPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ID4gPiA+ID4gPiA+ ICsjaW5jbHVkZSA8bGludXgvc2NtaV9wcm90b2NvbC5oPgo+ID4gPiA+ID4gPiA+ID4gKyNpbmNs dWRlIDxsaW51eC9zbGFiLmg+Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBUaGlzIGlzIHNl bWktcmFuZG9tIGxpc3Qgb2YgaGVhZGVycy4gUGxlYXNlLCBmb2xsb3cgSVdZVSBwcmluY2lwbGUg KGluY2x1ZGUKPiA+ID4gPiA+ID4gPiB3aGF0IHlvdSB1c2UpLiBUaGVyZSBhcmUgYSBsb3Qgb2Yg aW5jbHVzaW9ucyBJIHNlZSBtaXNzaW5nIChqdXN0IGluIHRoZSBjb250ZXh0IG9mCj4gPiA+ID4g PiA+ID4gdGhpcyBwYWdlIEkgc2VlIGJpdHMuaCwgdHlwZXMuaCwgYW5kICBhc20vYnl0ZW9yZGVy LmgpLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBJcyB0aGVyZSBhbnkgZG9jdW1lbnRhdGlvbiBh Ym91dCB0aGlzIHJlcXVpcmVtZW50Pwo+ID4gPiA+ID4gPiBTb21lIGhlYWRlcnMgYXJlIGFscmVh ZHkgaW5jbHVkZWQgYnkgb3RoZXJzLgo+ID4gPiA+Cj4gPiA+ID4gVGhlIGRvY3VtZW50YXRpb24g aGVyZSBpcyBjYWxsZWQgImEgY29tbW9uIHNlbnNlIi4KPiA+ID4gPiBUaGUgQyBsYW5ndWFnZSBp cyBidWlsdCBsaWtlIHRoaXMgYW5kIHdlIGV4cGVjdCB0aGF0IG5vYm9keSB3aWxsCj4gPiA+ID4g aW52ZXN0IGludG8gdGhlIGRlcGVuZGVuY3kgaGVsbCB0aGF0IHdlIGhhdmUgYWxyZWFkeSwgdGhh dCdzIHdoeSBJV1lVCj4gPiA+ID4gcHJpbmNpcGxlLCBwbGVhc2UgZm9sbG93IGl0Lgo+ID4gPgo+ ID4gPiBZZXMsIGJ1dCBnaXZlbiB0aGF0IHdlIGhhdmUgYSBncm93aW5nIG51bWJlciBvZiBTQ01J IHByb3RvY29scyB0aGVyZSBpcyBhCj4gPiA+IGNvbW1vbiBsb2NhbCBwcm90b2NvbHMuaCBoZWFk ZXIgdG8gZ3JvdXAgYWxsIGluY2x1ZGVzIG5lZWRlZCBieSBhbnkKPiA+ID4gcHJvdG9jb2xzOiB0 aGUgaWRlYSBiZWhpbmQgdGhpcyAoYW5kIHRoZSBkZXZtXyBzYWdhIGRvd24gYmVsb3cpIHdhcyB0 byBlYXNlCj4gPiA+IGRldmVsb3BtZW50IG9mIHByb3RvY29scywgc2luY2UgdGhlcmUgYXJlIGxv dHMgb2YgdGhlbSBhbmQgZ3Jvd2luZywgZ2l2ZW4KPiA+ID4gdGhlIFNDTUkgc3BlYyBpcyBleHRl bnNpYmxlLgo+ID4KPiA+IFllcywgYW5kIHdoYXQgeW91IGFyZSBlZmZlY3RpdmVseSBzdWdnZXN0 aW5nIGlzOiAiVGVjaG5pY2FsIGRlYnQ/IE9oLAo+ID4gZmluZSwgd2UgZG8gbm90IGNhcmUhIiBU aGlzIGlzIG5vdCBnb29kLiBJJ20gaW4gYSBsb25nIHRlcm0gb2YKPiA+IGNsZWFuaW5nIHVwIHRo ZSBkZXBlbmRlbmN5IGhlbGwgaW4gdGhlIGtlcm5lbCAobXkgbWFpbiBmb2N1cyBpcwo+ID4ga2Vy bmVsLmggZm9yIG5vdykgYW5kIEkgYW0gdGFsa2luZyBmcm9tIG15IGV4cGVyaWVuY2UuIEkgZG8g bm90IGxpa2UKPiA+IHdoYXQgcGVvcGxlIGFyZSBkb2luZyBpbiA5NSUgb2YgdGhlIGNvZGUsIHRo YXQncyB3aHkgSSByZWFsbHkgd2FudCB0bwo+ID4gc3RvcCB0aGUgYmFkIHByYWN0aWNlcyBhcyBz b29uIGFzIHBvc3NpYmxlLgo+Cj4gTm90IGF0IGFsbCwgdGhlIGFpbSB3YXMgZXhhY3RseSB0aGUg b3Bwb3NpdGUsIGF2b2lkaW5nIHRoYXQgc29tZSBwcm90b2NvbAo+IGNvdWxkIGhhdmUgYmVlbiB3 cml0dGVuIHdpdGhvdXQgYWxsIHRoZSBuZWVkZWQgaW5jbHVkZXM6IHNpbmNlIGEgYmFzaWMgc2V0 Cj4gb2YgaGVhZGVycyBpcyBkZWZpbml0ZWx5IGNvbW1vbiB0byBhbnkgcHJvdG9jb2wgeW91IG1h eSB0aGluayB0byB3cml0ZSwKPiBncm91cGluZyBhbGwgdGhlcmUgd2FzIG1lYW50IHRvIGF2b2lk IHRoaXMuLi5JIHRob3VnaHQgdGhhdCBieSBtb3ZpbmcgdGhlCj4gcHJvYmxlbSBhd2F5IGluIG9u ZSBzaW5nbGUgaW50ZXJuYWwgY29tbW9uIGhlYWRlciB3YXMgZWFzaWVyIHRvIG1vbml0b3IuCgpX aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBva2F5LiBJdCBwbGF5cyB0b28gc21hcnQsIHNvIHRoZSBl bmQgZGV2ZWxvcGVyCndvbid0IGNhcmUgYWJvdXQgcmVhbCBoZWFkZXJzIHRoZXkgbmVlZCBhcyB0 aGV5IGFyZSB0aGUgb25seSBvbmVzIHdobwprbm93IHRoZSBzb3VyY2UgY29kZSBpbiB0aGUgYmVz dCBwb3NzaWJsZSB3YXkuCgo+IEkgY2VydGFpbmx5IG1heWJlIHdyb25nLCBidXQgSSBkb250IHNl ZSBob3cgeW91IGNhbiBkZWR1Y2UgSSBkb250IGNhcmUuLi4KClNlZSBhYm92ZSwgdGhlIHByb3Rv Y29scy5oIGl0J3MgYSByZWluY2FybmF0aW9uIChtdWNoIGxlc3MgdHdpc3RlZCBhbmQKdWdseSwg dGhvdWdoKSBvZiBzb21ldGhpbmcgbGlrZSBrZXJuZWwuaC4gRG8geW91IGtub3cgd2h5IHdlIGhh dmUgYQpzcGxpdCB0byBoZWFkZXJzIGluc3RlYWQgb2YgaGF2aW5nIGV2ZXJ5dGhpbmcgaW4gb25l PyBJdCBzcGVlZHMgdXAgYQpidWlsZCwgaXQgc2VwYXJhdGVzIG5hbWVzcGFjZSAodG8gdGhlIGV4 dGVudCBvZiB3aGF0IHdlIGNhbGwKIm5hbWVzcGFjZSIgaW4gQyBsYW5ndWFnZSksIGl0IG1ha2Vz IHRoZSBtb2R1bGFyaXphdGlvbiAob2YgdGhlIHNvdXJjZQpjb2RlKSBiZXR0ZXIgKGVhc2llciB0 byBhdm9pZCBjb25zaWRlcmluZyB3aGF0J3Mgbm90IG5lZWRlZCksIGFuZCBzbwpvbi4gSSBkb24n dCB0aGluayBtYWtpbmcgYSAiY29tbW9uIiBoZWFkZXIgaXMgYSBnb29kIGlkZWEuCgo+IC4uLmFu ZCBtYXliZSwgb25seSBtYXliZSwgd2hhdCB0aGF0IDk1JSBvZiBwZW9wbGUgaXMgdHJ5aW5nIHRv IGRvIGluIHRoZWlyCj4gaG9ycmlibGUgY29kZSBpcyB0byBkZWxpdmVyIHRoZSBiZXN0IHJlYXNv bmFibHkgcG9zc2libGUgdGhpbmcgd2l0aGluIHRoZWlyCj4gdGltZWxpbmUgd2hpbGUgeW91IGFy ZSBiYXJraW5nIGF0IHRoZW0gaW4gY2hhc2Ugb2YgbmV2ZXIgdG8gYmUgcmVsZWFzZWQgdXR0ZXIK PiBwZXJmZWN0aW9uLgoKWWVhaC4gVGhhdCdzIHdoeSBpdCdzIGdvb2QgdG8gdGVhY2ggcGVvcGxl IGFib3V0IG1hbnkgYXNwZWN0cyBvZiB0aGUgQwpsYW5ndWFnZSAod2hpY2ggaXMgbm90IHBvcHVs YXIsIGluIHBhcnRpY3VsYXIgZHVlIHRvIHRoZXNlIG51YW5jZXMsCm5vd2FkYXlzIGFuZCB3ZSBh cmUgc3RhcnZpbmcgZm9yIGdvb2QgZGV2ZWxvcGVycykuCgo+ID4gTGFzdCB0byBhZGQsIGJ1dCBu b3QgbGVhc3QgaXMgdGhhdCB5b3VyIGNvZGUgbWF5IGJlIHVzZWQgYXMgYW4gZXhhbXBsZQo+ID4g Zm9yIG90aGVycywgaGVuY2Ugd2UgcmVhbGx5IGhhdmUgdG8gZG8gb3VyIGJlc3QgaW4gb3JkZXIg dG8gYXZvaWQgYmFkCj4gPiBkZXNpZ24sIHByYWN0aWNlcywgYW5kIGNhcmdvIGN1bHRzLiBJZiB0 aGlzIHJlcXVpcmVzIG1vcmUgcmVmYWN0b3JpbmcKPiA+IG9mIHRoZSBleGlzdGluZyBjb2RlLCB0 aGVuIGRvIGl0IHNvb25lciB0aGFuIGxhdGVyLgoKLi4uCgo+ID4gPiA+ID4gQW5keSBtYWRlICht b3N0bHkpIHRoZSBzYW1lIHJlbWFya3Mgb24gdGhpcyBzYW1lIHBhdGNoIH4xLXllYXIgYWdvIG9u Cj4gPiA+ID4gPiB0aGlzIHNhbWUgcGF0Y2ggd2hpbGUgaXQgd2FzIHBvc3RlZCBieSBPbGVrc2lp Lgo+ID4gPiA+ID4KPiA+ID4gPiA+IEFuZCBJIHRvbGQgdGhhdCB0aW1lIHRoYXQgbW9zdCBvZiB0 aGUgcmVtYXJrcyBhcm91bmQgZGV2bV8gdXNhZ2Ugd2VyZQo+ID4gPiA+ID4gd3JvbmcgZHVlIHRv IGhvdyB0aGUgU0NNSSBjb3JlIGhhbmRsZXMgcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24gKHVzaW5n IGEKPiA+ID4gPiA+IGRldnJlcyBncm91cCB0cmFuc3BhcmVudGx5KS4KPiA+ID4gPiA+Cj4gPiA+ ID4gPiBUaGlzIGlzIHdoYXQgSSBhbnN3ZXJlZCB0aGF0IHRpbWUuCj4gPiA+ID4gPgo+ID4gPiA+ ID4gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGludXgtYXJtLWtlcm5lbC9aSjc4aEJjakFoaVUr WkJPQGUxMjA5MzctbGluLyN0Cj4gPiA+ID4gPgo+ID4gPiA+ID4gSSB3b250IHJlcGVhdCBteXNl bGYsIGJ1dCwgaW4gYSBudXRzaGVsbCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gbGlrZSBpdAo+ID4g PiA+ID4gaXMgbm93IGlzIGZpbmU6IGEgYml0IGhhcHBlbnMgdmlhIGRldm1fIGF0IHByb3RvY29s IGluaXRpYWxpemF0aW9uLCB0aGUKPiA+ID4gPiA+IG90aGVyIGlzIGRvZSB2aWEgZXhwbGljaXQg a21hbGxvYyBhdCBydW50aW1lIGFuZCBmcmVlZCB2aWEga2ZyZWUgYXQKPiA+ID4gPiA+IHJlbW92 ZSB0aW1lIChpZiBuZWVkZWQuLi5pLmUuIGNoZWNraW5nIHRoZSBwcmVzZW50IGZsYWcgb2Ygc29t ZSBzdHJ1Y3RzKQo+ID4gPiA+Cj4gPiA+ID4gVGhpcyBzb3VuZHMgbGlrZSBhIG1lc3MuIGRldm1f IGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgb25seSBmb3IgdGhlCj4gPiA+ID4gLT5wcm9iZSgpIHN0 YWdlLCBvdGhlcndpc2UgeW91IG1heSBjb25zaWRlciBjbGVhbnVwLmggKF9fZnJlZSgpIG1hY3Jv KQo+ID4gPiA+IHRvIGhhdmUgYXV0b21hdGljIGZyZWUgYXQgdGhlIHBhdGhzIHdoZXJlIG1lbW9y eSBpcyBub3QgbmVlZGVkLgo+ID4gPgo+ID4gPiBJbmRlZWQsIHRoaXMgcHJvdG9jb2xfaW5pdCBj b2RlIGlzIGNhbGxlZCBieSB0aGUgU0NNSSBjb3JlIG9uY2UgZm9yIGFsbCB3aGVuCj4gPiA+IGFu IFNDTUkgZHJpdmVyIHRyaWVzIGF0IGZpcnN0IHRvIHVzZSB0aGlzIHNwZWNpZmljIHByb3RvY29s IGJ5ICdnZXR0aW5nJyBpdHMKPiA+ID4gcHJvdG9jb2xfb3BzLCBzbyBpdCBpcyBpbmRlZWQgY2Fs bGVkIGluc2lkZSB0aGUgcHJvYmUgY2hhaW4gb2YgdGhlIGRyaXZlcjoKPiA+ID4gYXQgdGhpcyBw b2ludCB5b3UgKmNhbiogZGVjaWRlIHRvIHVzZSBkZXZyZXMgdG8gYWxsb2NhdGUgbWVtb3J5IGFu ZCBiZSBhc3N1cmVkCj4gPiA+IHRoYXQgaWYgdGhlIGluaXQgZmFpbHMsIG9yIHdoZW4gdGhlIGRy aXZlciBjZWFzZSB0byB1c2UgdGhpcyBwcm90b2NvbCAoY2FsbGluZwo+ID4gPiBpdHMgcmVtb3Zl KCkpIGFuZCBubyBvdGhlciBkcml2ZXIgaXMgdXNpbmcgaXQsIGFsbCB0aGUgc3R1ZmYgdGhhdCBo YXZlIGJlZW4KPiA+ID4gYWxsb2NhdGVkIHJlbGF0ZWQgdG8gdGhpcyBwcm90b2NvbCB3aWxsIGJl IHJlbGVhc2VkIGJ5IHRoZSBjb3JlIGZvciB5b3UuCj4gPiA+ICh1c2luZyBhbiBpbnRlcm5hbCBk ZXZyZXMgZ3JvdXApCj4gPiA+Cj4gPiA+IFdpdGhvdXQgdGhpcyB5b3Ugc2hvdWxkIGhhbmRsZSBt YW51YWxseSBhbGwgdGhlIGRlYWxsb2NhdGlvbiBtYW51YWxseSBvbgo+ID4gPiB0aGUgaW5pdCBl cnJvci1wYXRocyBBTkQgYWxzbyBwcm92aWRlIGFsbCB0aGUgY2xlYW51cCBleHBsaWNpdGx5IHdo ZW4KPiA+ID4gdGhlIHByb3RvY29sIGlzIG5vIG1vcmUgdXNlZCBieSBhbnkgZHJpdmVyIChtdWx0 aXBsZSB1c2VycyBvZiB0aGUgc2FtZQo+ID4gPiBwcm90b2NvbCBpbnN0YW5jZSBhcmUgcG9zc2li bGUpLi4uZm9yIGFsbCBwcm90b2NvbHMuCj4gPgo+ID4gWWVzLiBJcyBpdCBhIHByb2JsZW0/Cj4K PiBXZWxsLCBubywgYnV0IGlzIGl0IG5vdCBhIHJlcGV0aXRpdmUgYW5kIGVycm9yLXByb25lIHBy b2Nlc3MgPwoKWWVzLiBUaGF0J3Mgd2h5IHdlIG5vdyBoYXZlIGNsZWFudXAuaC4gUGxlYXNlLCBj b25zaWRlciB1c2luZyBpdCBpbnN0ZWFkLgoKPiBJcyBpdCBub3QgdGhlIGV4YWN0IHJlYXNvbiB3 aHkgZGV2cmVzIG1hbmFnZW1lbnQgZXhpc3QgaW4gZmlyc3QgcGxhY2UsIHRvIGF2b2lkCj4gcmVw ZXRpdGl2ZSBtYW51YWwgYWxsb2MvZnJlZSBvZiByZXNvdXJjZXMgYW5kIHJlbGF0ZWQgcGl0ZmFs bHMgPyAoZXZlbiB0aG91Z2gKPiBjZXJ0YWlubHkgaXQgaXMgbm9ybWFsbHkgdXNlZCBpbiBhIG1v cmUgY29udmVudGlvbmFsIGFuZCBzdHJhaWdodGZvcndhcmQgd2F5KQoKTm8uIEl0cyBzY29wZSBp cyB0byBjbGVhbiB0aGUgcHJvYmUtcmVtb3ZlIHBhcnRzLCBvbmUgc2hvdWxkIG5vdApzcHJlYWQg aXQgb3RoZXJ3aXNlIGFuZCBvbmUgZGVmaW5pdGVseSBzaG91bGQga25vdyBpdHMgbGltaXRhdGlv bnMgYW5kCmNvcm5lciBjYXNlcyAoSSBldmVuIGdhdmUgc29tZSBleGFtcGxlcyBiYWNrIGluIGNh LiAyMDE3IGluIG9uZSBvZiBteQpwcmVzZW50YXRpb24gV1JUIHR5cGljYWwgbWlzdGFrZXMgdGhl IGRldmVsb3BlcnMgbWFrZQoKPiBUaGUgaWRlYSB3YXMgdG8gZ2l2ZSBzb21lIHNvcnQgb2YgYWlk IGluIHRoZSBTQ01JIHN0YWNrIGZvciB3cml0aW5nIHByb3RvY29scywKPiBzbyByZWdhcmRpbmcg bWVtX21nbXQsIEkganVzdCBidWlsdCBvbiB0b3Agb2YgZGV2cmVzIGZhY2lsaXRpZXMsIG5vdCBp bnZlbnRlZAo+IGFueXRoaW5nLCB0byB0cnkgdG8gYXZvaWQgcmVwZXRpdGlvbnMgYW5kIGxldCB0 aGUgY29yZSBoYW5kbGUgbWVtIGFsbG9jcy9mcmVlCj4gZHVyaW5nIHRoZSBwcm9iZSBwaGFzZXMg YXMgbXVjaCBhcyBwb3NzaWJsZTogaW4gcGluY3RybCBjYXNlIHdvdWxkIGJlCj4gcGFydGljdWxh cmx5IHRyaXZpYWwgdG8gaW5zdGVhZCBtYW51YWxseSBhbGxvY2F0ZSBzdHVmZiBhdCBpbml0IChk dWUgdG8gbWFueQo+IGxhenkgZGVsYXllZCBhbGxvY2F0aW9ucykgYnV0IG90aGVyIHByb3RvY29s cyBuZWVkIGEgbG90IG1vcmUgdG8gYmUgZG9uZSBhdCBpbml0LAo+IGZyZXF1ZW50bHkgaW4gYSBs b29wIHRvIGFsbG9jYXRlIG11bHRpcGxlIHJlc291cmNlcyBkZXNjcmlwdG9ycywgYW5kIG1hbnVh bGx5Cj4gdW5kb2luZyBhbGwgb2YgdGhhdCBvbiBlYWNoIGVycm9yLXBhdGggYW5kIG9uIGNsZWFu dXAgaXMgZGVmaW5pdGVseSBlcnJvci1wcm9uZQo+IGFuZCBhIHBhaW4uCgpJIHVuZGVyc3RhbmQg dGhlIG1vdGl2YXRpb24sIGJ1dCBhZ2FpbiwgZGV2bSBpcyBhIGJlYXN0IGluIHRoZSBjb3JuZXIK Y2FzZXMuIEkgYmVsaWV2ZSBMYXVyZW50IFBpbmNoYXJ0IGdhdmUgYSBwcmVzZW50YXRpb24gYWJv dXQgaG93IGJhZApkZXZtIGNhbiBoaXQgeW91IGlmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91IGFy ZSBkb2luZyAoT1RPSCBpdCdzIGhhcmQKdG8ga25vdyB3aXRoIGRldm0pLgoKPiBMYXN0IGJ1dCBu b3QgbGVhc3QsIHRoaXMgd2hvbGUgdGhpbmcgd2FzIGRlc2lnbmVkIHRvIGFkZHJlc3MgdGhlIG5l ZWRzIG9mIHRoZQo+IHByb3RvY29scyB0aGF0IGV4aXN0ZWQgYXQgdGhhdCB0aW1lLi4uLml0IGlz IG9ubHkgbm93IHdpdGggcGluY3RybCBsYXp5LWFsbG9jYXRpb25zCj4gYXQgcnVudGltZSB0aGF0 IHRoZSB1Z2x5IGNvaGV4aXN0ZW5jZSBvZiBkZXZtXyBhbmQgbm9uLWRldm0gYWxsb2NhdGlvbnMg YmVjYW1lIGEKPiB0aGluZy4uLi5zbyBjbGVhcmx5IHRoZSB0aGluZyBuZWVkcyB0byBiZSBpbXBy b3ZlZC9yZXRoaW5rZWQuLi5ldmVuIGRyb3BwZWQgaWYgbm8KPiBtb3JlIGZpdHRpbmcuLi4KPgo+ IC4uLiBvciBhbHRlcm5hdGl2ZWx5IHNpbmNlIGRldnJlcyBhbGxvY2F0aW9ucyBhcmUgYW55d2F5 IG9wdGlvbmFsLCB5b3UgY291bGQganVzdAo+IHVzZSByZWd1bGFyIGttYWxsb2Mva2ZyZWUgZm9y IHRoaXMgcHJvdG9jb2wgYW5kIGF2b2lkIHRoaXMgZHVhbCBoYW5kbGluZy4uLgoKUHJvYmFibHks IGp1c3QgaGF2ZSBhIGxvb2sgYXQgY2xlYW51cC5oLgoKPiAuLi50aGlzIHdhcyBqdXN0IHRvIHB1 dCB0aGluZ3MgaW4gY29udGV4dC4uLmFuZCBJJ2xsIGhhcHBpbHkgbGV0IFN1ZGVlcCBkZWNpZGUK PiB3aGF0IGhlIHByZWZlcnMgaW4gdGhlIGltbWVkaWF0ZSBmb3IgcGluY3RybCBvciBtb3JlIGlu IGdlbmVyYWwgYWJvdXQgYWxsIHRoZQo+IHNjbWkgZGV2cmVzLCB0aGF0IEkndmUgZ290IGVub3Vn aCBvZiB0aGVzZSBwbGVhc2FudCBpbnRlcmFjdGlvbnMgZm9yIG5vdy4uLgoKQXMgSSBzYWlkLCBp dCdzIHlvdXIgY2FsbCwgSSdtIG5vdCBwcmV2ZW50aW5nIHlvdSBmcm9tIGFwcGx5aW5nCndoYXRl dmVyIGlzIGdvaW5nIG9uIGluIHRoZSBTQ01JIHN1YnN5c3RlbS4gSnVzdCB0cmllZCB0byBwb2lu dCBvdXQKdGhlIHByb2JsZW0ocykuCgotLSAKV2l0aCBCZXN0IFJlZ2FyZHMsCkFuZHkgU2hldmNo ZW5rbwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGlu dXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl YWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgt YXJtLWtlcm5lbAo=