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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 24692C433F5 for ; Tue, 9 Nov 2021 09:50:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0FC086128B for ; Tue, 9 Nov 2021 09:50:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242477AbhKIJxC (ORCPT ); Tue, 9 Nov 2021 04:53:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49410 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244158AbhKIJwA (ORCPT ); Tue, 9 Nov 2021 04:52:00 -0500 Received: from mail-qk1-x736.google.com (mail-qk1-x736.google.com [IPv6:2607:f8b0:4864:20::736]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E5912C061767 for ; Tue, 9 Nov 2021 01:49:14 -0800 (PST) Received: by mail-qk1-x736.google.com with SMTP id az8so18228468qkb.2 for ; Tue, 09 Nov 2021 01:49:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :content-transfer-encoding; bh=l8Z1G1vgAJ4FlBEuXVbtpeANxRL+3TLXVnzSevERL00=; b=J16utjHFp0h2FDDj1wVFCYQkFdYuHbXKTHJIUnKkt7e9KVrg5TovfFTMWwm/8of0ZY S4CLw570Ns6xStx447TpKt3o/bIqrf7mC6S+54AaNFLj/z/hCUxjNzGktdgdl7ISw6Aw W2v/atz7PFQ9WBfWsKDWFgsTMzZklnYsLJ5H2LW4d+kSFefJlzKgvbPU3VdAvZeDoc41 sfTBXuR3cu9pAR5iNQEeYm35p7h6ufUkSYcMeh/VjKtoi3ePRCgd2GNtq3VFPgoAshx6 J1NZlSrfahpSbHocMqKxMV38wJpvg8zKWOHdZCIs0FUbjIEDsziJXLf54oPIXdhtknof X2Rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:content-transfer-encoding; bh=l8Z1G1vgAJ4FlBEuXVbtpeANxRL+3TLXVnzSevERL00=; b=VhwGWn7riyanC3NJK74CMQ59mBAnCmU7AuMwliwoJBVNknLYk3OKd8Lsvg8nHm3w4a QGseN0Mb4GvTlLd8T2sgqaobtaoWzgjvjmzp6/KwCslIo7TXaIeuiUABUjt5H1kVWHbq R1jDyYQ/hiDMV0ssHyFkmP73hNqec4vAyw5SaUffpoPHmrzLUMNeMSq+VwHicaFDQFpc IK4fm8VlqDTQY4Wmjf51qeGAEfmVeAxqJVas68norj4WD/y1lN/P/JhTKzVPNU4RIpnR nYHecNLqughOdAyKjUJOnLvjd62W+9uyfFiXbzkIpKii4k+uZwIuEyzUAzAVKj8JHOtR 1S+A== X-Gm-Message-State: AOAM531uoR2bcAl0nPZIUHyxTulVxPHJJ/lgB8LKK0STNMLILAyDc1nR dDlVqGIZ+m6nfqP2s5QWq4oQ1TA82GngjxuSm8wFLw== X-Google-Smtp-Source: ABdhPJxcjexBhZUI/gO3khiCDQFwF+FMQ5tmnXDl96oc05Q8PbinYu4z3jzE7RXsiq7H6A/er9QQdOOyja4FmEApzIs= X-Received: by 2002:ae9:ef11:: with SMTP id d17mr4428863qkg.347.1636451353958; Tue, 09 Nov 2021 01:49:13 -0800 (PST) MIME-Version: 1.0 References: <3c9797f6-2fd3-5530-ba34-6e4c4deec984@sifive.com> In-Reply-To: From: Greentime Hu Date: Tue, 9 Nov 2021 17:49:03 +0800 Message-ID: Subject: Re: [RFC PATCH v8 09/21] riscv: Add task switch support for vector To: Greentime Hu , Vincent Chen , Paul Walmsley , linux-riscv , Linux Kernel Mailing List , Albert Ou , Palmer Dabbelt Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Darius Rad =E6=96=BC 2021=E5=B9=B410=E6=9C=8827=E6=97= =A5 =E9=80=B1=E4=B8=89 =E4=B8=8B=E5=8D=888:58=E5=AF=AB=E9=81=93=EF=BC=9A > > On Tue, Oct 26, 2021 at 12:44:31PM +0800, Greentime Hu wrote: > > Darius Rad =E6=96=BC 2021=E5=B9=B410=E6=9C=8826= =E6=97=A5 =E9=80=B1=E4=BA=8C =E4=B8=8A=E5=8D=8812:22=E5=AF=AB=E9=81=93=EF= =BC=9A > > > > > > On Mon, Oct 25, 2021 at 12:47:49PM +0800, Greentime Hu wrote: > > > > Darius Rad =E6=96=BC 2021=E5=B9=B410=E6=9C=88= 22=E6=97=A5 =E9=80=B1=E4=BA=94 =E4=B8=8B=E5=8D=886:40=E5=AF=AB=E9=81=93=EF= =BC=9A > > > > > > > > > > On Fri, Oct 22, 2021 at 11:52:01AM +0800, Vincent Chen wrote: > > > > > > On Thu, Oct 21, 2021 at 6:50 PM Darius Rad wrote: > > > > > > > > > > > > > > On Wed, Oct 20, 2021 at 06:01:31PM -0700, Paul Walmsley wrote= : > > > > > > > > Hello Darius, > > > > > > > > > > > > > > > > On Tue, 5 Oct 2021, Darius Rad wrote: > > > > > > > > > > > > > > > > > On Mon, Oct 04, 2021 at 08:36:30PM +0800, Greentime Hu wr= ote: > > > > > > > > > > Darius Rad =E6=96=BC 2021=E5=B9= =B49=E6=9C=8829=E6=97=A5 =E9=80=B1=E4=B8=89 =E4=B8=8B=E5=8D=889:28=E5=AF=AB= =E9=81=93=EF=BC=9A > > > > > > > > > > > > > > > > > > > > > > On Tue, Sep 28, 2021 at 10:56:52PM +0800, Greentime H= u wrote: > > > > > > > > > > > > Darius Rad =E6=96=BC 2021=E5= =B9=B49=E6=9C=8813=E6=97=A5 =E9=80=B1=E4=B8=80 =E4=B8=8B=E5=8D=888:21=E5=AF= =AB=E9=81=93=EF=BC=9A > > > > > > > > > > > > > > > > > > > > > > > > > > On 9/8/21 1:45 PM, Greentime Hu wrote: > > > > > > > > > > > > > > This patch adds task switch support for vector.= It supports partial lazy > > > > > > > > > > > > > > save and restore mechanism. It also supports al= l lengths of vlen. > > > > > > > > > > > > > > > > [ ... ] > > > > > > > > > > > > > > > > > > > > > So this will unconditionally enable vector instru= ctions, and allocate > > > > > > > > > > > > > memory for vector state, for all processes, regar= dless of whether vector > > > > > > > > > > > > > instructions are used? > > > > > > > > > > > > > > > > > > > > > > > > Yes, it will enable vector if has_vector() is true.= The reason that we > > > > > > > > > > > > choose to enable and allocate memory for user space= program is because > > > > > > > > > > > > we also implement some common functions in the glib= c such as memcpy > > > > > > > > > > > > vector version and it is called very often by every= process. So that > > > > > > > > > > > > we assume if the user program is running in a CPU w= ith vector ISA > > > > > > > > > > > > would like to use vector by default. If we disable = it by default and > > > > > > > > > > > > make it trigger the illegal instruction, that might= be a burden since > > > > > > > > > > > > almost every process will use vector glibc memcpy o= r something like > > > > > > > > > > > > that. > > > > > > > > > > > > > > > > > > > > > > Do you have any evidence to support the assertion tha= t almost every process > > > > > > > > > > > would use vector operations? One could easily argue = that the converse is > > > > > > > > > > > true: no existing software uses the vector extension = now, so most likely a > > > > > > > > > > > process will not be using it. > > > > > > > > > > > > > > > > > > > > Glibc ustreaming is just starting so you didn't see sof= tware using the > > > > > > > > > > vector extension now and this patchset is testing based= on those > > > > > > > > > > optimized glibc too. Vincent Chen is working on the gli= bc vector > > > > > > > > > > support upstreaming and we will also upstream the vecto= r version glibc > > > > > > > > > > memcpy, memcmp, memchr, memmove, memset, strcmp, strlen= . Then we will > > > > > > > > > > see platform with vector support can use vector version= mem* and str* > > > > > > > > > > functions automatically based on ifunc and platform wit= hout vector > > > > > > > > > > will use the original one automatically. These could be= done to select > > > > > > > > > > the correct optimized glibc functions by ifunc mechanis= m. > > > > > > > > > > > > > > > > In your reply, I noticed that you didn't address Greentime'= s response > > > > > > > > here. But this looks like the key issue. If common librar= y functions are > > > > > > > > vector-accelerated, wouldn't it make sense that almost ever= y process would > > > > > > > > wind up using vector instructions? And thus there wouldn't= be much point > > > > > > > > to skipping the vector context memory allocation? > > > > > > > > > > > > > > > > > > > > > > This issue was addressed in the thread regarding Intel AMX I = linked to in a > > > > > > > previous message. I don't agree that this is the key issue; = it is one of a > > > > > > > number of issues. What if I don't want to take the potential > > > > > > > power/frequency hit for the vector unit for a workload that, = at best, uses > > > > > > > it for the occasional memcpy? What if the allocation fails, = how will that > > > > > > > > > > > > Hi Darius, > > > > > > The memcpy function seems not to be occasionally used in the pr= ograms > > > > > > because many functions in Glibc use memcpy() to complete the me= mory > > > > > > copy. I use the following simple case as an example. > > > > > > test.c > > > > > > void main(void) { > > > > > > return; > > > > > > } > > > > > > Then, we compile it by "gcc test.c -o a.out" and execute it. In= the > > > > > > execution, the memcpy() has been called unexpectedly. It is bec= ause > > > > > > many libc initialized functions will be executed before enterin= g the > > > > > > user-defined main function. One of the example is __libc_setup_= tls(), > > > > > > which is called by __libc_start_main(). The __libc_setup_tls() = will > > > > > > use memcpy() during the process of creating the Dynamic Thread = Vector > > > > > > (DTV). > > > > > > > > > > > > Therefore, I think the memcpy() is widely used in most programs= . > > > > > > > > > > > > > > > > You're missing my point. Not every (any?) program spends a major= ity of the > > > > > time doing memcpy(), and even if a program did, all of my points = are still > > > > > valid. > > > > > > > > > > Please read the discussion in the thread I referenced and the que= stions in > > > > > my prior message. > > > > > > > > > > > > > Hi Darius, > > > > > > > > As I mentioned before, we want to treat vector ISA like a general I= SA > > > > instead of a specific IP. User program should be able to use it > > > > transparently just like FPU. > > > > It seems that the use case you want is asking user to use vector li= ke > > > > a specific IP, user program should ask kernel before they use it an= d > > > > that is not what we want to do in this patchset. > > > > > > > > > > Hi Greentime, > > > > > > Right. > > > > > > But beyond what I want to do or what you want to do, is what *should*= Linux > > > do? I have attempted to provide evidence to support my position. Yo= u have > > > not responded to or addressed the majority of my questions, which is > > > concerning to me. > > > > Hi Darius, > > > > What is your majority questions? > > > > 1. How will memory allocation failures for context state memory be report= ed > to user space? it will return -ENOMEM for some cases or show the warning messages for some cases. We know it's not perfect, we should enhance that in the future, but let's take an example: 256 bits vector length system. 256 bits * 32 registers /8 =3D 1KB. > 2. How will a system administrator (i.e., the user) be able to effectivel= y > manage a system where the vector unit, which could have a considerable ar= ea > and/or power impact to the system, has one or more of the following > properties: As I mentioned before, We would like to let user use vector transparently just like FPU or other extensions. If user knows that this system supports vector and user uses intrinsic functions or assembly codes or compiler generating vector codes, user can just use it just like FPU. If user doesn't know that whether this system support vector or not, user can just use the glibc or ifunc in his own libraries to detect vector support dynamically. > a. A single vector unit shared among two or more harts, > > b. Additional power consumption when the vector unit is enabled and idl= e > versus not being enabled at all, > > c. For a system which supports variable operating frequency, a reductio= n > in the maximum frequency when the vector unit is enabled, and/or > > d. The inability to enter low power states and/or delays to low power > states transitions when the vector unit is enabled. We also don't support this kind of system(a single vector unit shared among 2 or more harts) in this implementation. I'll add more assumptions in the next version patches. For the frequency or power issues, I'll also not treat them as a special case since we want to treat vector like an normal extension of ISA instead of a specific IP. > 3. You contend that the RISC-V V-extension resembles ARM SVE/SVE2, at lea= st > more than Intel AMX. I do not agree, but nevertheless, why then does thi= s > patchset not behave similar to SVE? On arm64, SVE is only enabled and > memory is only allocated on first use, *not* unconditionally for all task= s. As we mentioned before, almost every user space program will use glibc ld.so/libc.so and these libraries will use the vector version optimization porting in a system with vector support. That's why we don't let it trigger the first illegal instruction exception because vector registers will be used at very beginning of the program and the illegal instruction exception handling is also heavier because we need to go to M-mode first than S-mode which means we will need to save context and restore context twice in both M-mode and S-mode. Since the vstate will be allocated eventually, why not save these 2 context save/restore overhead in both M-mode and S-mode for handling this illegal instruction exception. And if the system doesn't support vector, glibc won't use the vector porting and the Linux kernel won't allocate vstate for every process too. 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7983CC433EF for ; Tue, 9 Nov 2021 09:59:13 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 47B4F61130 for ; Tue, 9 Nov 2021 09:59:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 47B4F61130 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org 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:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Cc:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=EQieL/UWHGbE8PPLYInnbHkF4k8hbQMF4UvjuId1nc8=; b=V4dwfOmlmnTBMpc/3kLOO2fjFz XWUzu3rKWyI53saUy61o1uWkq6JsBsHZC7HRLtke1P9hfedMExgz6D32IJIePJQqkoJ9oFj39lXJE rBGPKwXdkRGRA9rV+E5TNwQkD8rNXBKEUyIruqkksUxeFOSmWA0KS+wownhW847A6JR9eCoTVqX5e t+3/rdTRZ4nH5tsgPzhLn2B7t9dbwz7biwgRNQuCckAc9IkAVs2Oa5+t3IQN07FrdKYM6RY2qLpXs jMA8FxT/WxBaOmRHXuCSDzsaHQNYnCP3QG4GEzjRw4SSeEL/l6H1nKSdFOvTnPvXkk3dDlEtQMUuK C08gp4cQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mkNuD-001NKV-Ev; Tue, 09 Nov 2021 09:59:05 +0000 Received: from mail-qk1-x735.google.com ([2607:f8b0:4864:20::735]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mkNkh-001Jhc-LO for linux-riscv@lists.infradead.org; Tue, 09 Nov 2021 09:49:18 +0000 Received: by mail-qk1-x735.google.com with SMTP id bq14so18244000qkb.1 for ; Tue, 09 Nov 2021 01:49:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :content-transfer-encoding; bh=l8Z1G1vgAJ4FlBEuXVbtpeANxRL+3TLXVnzSevERL00=; b=J16utjHFp0h2FDDj1wVFCYQkFdYuHbXKTHJIUnKkt7e9KVrg5TovfFTMWwm/8of0ZY S4CLw570Ns6xStx447TpKt3o/bIqrf7mC6S+54AaNFLj/z/hCUxjNzGktdgdl7ISw6Aw W2v/atz7PFQ9WBfWsKDWFgsTMzZklnYsLJ5H2LW4d+kSFefJlzKgvbPU3VdAvZeDoc41 sfTBXuR3cu9pAR5iNQEeYm35p7h6ufUkSYcMeh/VjKtoi3ePRCgd2GNtq3VFPgoAshx6 J1NZlSrfahpSbHocMqKxMV38wJpvg8zKWOHdZCIs0FUbjIEDsziJXLf54oPIXdhtknof X2Rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:content-transfer-encoding; bh=l8Z1G1vgAJ4FlBEuXVbtpeANxRL+3TLXVnzSevERL00=; b=lZvNKMMkBPOOALYFuHnZH0eJAZlmWJCnmSzOKPjeowO/HQPag3PotM0G7y6NTNRKf3 P2vhuOrk6Am45xNnRnyQxkZYjej15V4inpRGP0NZSWoyCtviv8u7hQiPqPlzqLjF7MVm JtqIISeMwZQYD9WjquxzbLfVX6CaA8IwNWVu659dUgDr0EwebhC3SplytnYyeXZ35X4v Okj1Tf3TF/QuBr52WN0TB9M0Y3wE8iEEjcR7yDvov3i0nIHh92u98pjaM/gvvQEd63Qk 2eocW9PthGQrlsdtwqYadaCASSQELy8Dv8lJMXz3sxgB4A9KcMHsS+xEWAAjTG4Dsi7P YEoA== X-Gm-Message-State: AOAM533lBB4KO6sNPTv4PQjmcLCBGnOscF16pfYRYDHpwomGzbEKXw1T P2JlYlhSkIAU/LMvU43h/2ZRcXVTp1xiv1VfPq87WQ== X-Google-Smtp-Source: ABdhPJxcjexBhZUI/gO3khiCDQFwF+FMQ5tmnXDl96oc05Q8PbinYu4z3jzE7RXsiq7H6A/er9QQdOOyja4FmEApzIs= X-Received: by 2002:ae9:ef11:: with SMTP id d17mr4428863qkg.347.1636451353958; Tue, 09 Nov 2021 01:49:13 -0800 (PST) MIME-Version: 1.0 References: <3c9797f6-2fd3-5530-ba34-6e4c4deec984@sifive.com> In-Reply-To: From: Greentime Hu Date: Tue, 9 Nov 2021 17:49:03 +0800 Message-ID: Subject: Re: [RFC PATCH v8 09/21] riscv: Add task switch support for vector To: Greentime Hu , Vincent Chen , Paul Walmsley , linux-riscv , Linux Kernel Mailing List , Albert Ou , Palmer Dabbelt X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211109_014915_789147_B50C8B5D X-CRM114-Status: GOOD ( 66.14 ) 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: , 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 RGFyaXVzIFJhZCA8ZGFyaXVzQGJsdWVzcGVjLmNvbT4g5pa8IDIwMjHlubQxMOaciDI35pelIOmA seS4iSDkuIvljYg4OjU45a+r6YGT77yaCj4KPiBPbiBUdWUsIE9jdCAyNiwgMjAyMSBhdCAxMjo0 NDozMVBNICswODAwLCBHcmVlbnRpbWUgSHUgd3JvdGU6Cj4gPiBEYXJpdXMgUmFkIDxkYXJpdXNA Ymx1ZXNwZWMuY29tPiDmlrwgMjAyMeW5tDEw5pyIMjbml6Ug6YCx5LqMIOS4iuWNiDEyOjIy5a+r 6YGT77yaCj4gPiA+Cj4gPiA+IE9uIE1vbiwgT2N0IDI1LCAyMDIxIGF0IDEyOjQ3OjQ5UE0gKzA4 MDAsIEdyZWVudGltZSBIdSB3cm90ZToKPiA+ID4gPiBEYXJpdXMgUmFkIDxkYXJpdXNAYmx1ZXNw ZWMuY29tPiDmlrwgMjAyMeW5tDEw5pyIMjLml6Ug6YCx5LqUIOS4i+WNiDY6NDDlr6vpgZPvvJoK PiA+ID4gPiA+Cj4gPiA+ID4gPiBPbiBGcmksIE9jdCAyMiwgMjAyMSBhdCAxMTo1MjowMUFNICsw ODAwLCBWaW5jZW50IENoZW4gd3JvdGU6Cj4gPiA+ID4gPiA+IE9uIFRodSwgT2N0IDIxLCAyMDIx IGF0IDY6NTAgUE0gRGFyaXVzIFJhZCA8ZGFyaXVzQGJsdWVzcGVjLmNvbT4gd3JvdGU6Cj4gPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBPbiBXZWQsIE9jdCAyMCwgMjAyMSBhdCAwNjowMTozMVBN IC0wNzAwLCBQYXVsIFdhbG1zbGV5IHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4gSGVsbG8gRGFyaXVz LAo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+IE9uIFR1ZSwgNSBPY3QgMjAyMSwgRGFy aXVzIFJhZCB3cm90ZToKPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+IE9uIE1vbiwg T2N0IDA0LCAyMDIxIGF0IDA4OjM2OjMwUE0gKzA4MDAsIEdyZWVudGltZSBIdSB3cm90ZToKPiA+ ID4gPiA+ID4gPiA+ID4gPiBEYXJpdXMgUmFkIDxkYXJpdXNAYmx1ZXNwZWMuY29tPiDmlrwgMjAy MeW5tDnmnIgyOeaXpSDpgLHkuIkg5LiL5Y2IOToyOOWvq+mBk++8mgo+ID4gPiA+ID4gPiA+ID4g PiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+IE9uIFR1ZSwgU2VwIDI4LCAyMDIxIGF0IDEwOjU2 OjUyUE0gKzA4MDAsIEdyZWVudGltZSBIdSB3cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g RGFyaXVzIFJhZCA8ZGFyaXVzQGJsdWVzcGVjLmNvbT4g5pa8IDIwMjHlubQ55pyIMTPml6Ug6YCx 5LiAIOS4i+WNiDg6MjHlr6vpgZPvvJoKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IE9uIDkvOC8yMSAxOjQ1IFBNLCBHcmVlbnRpbWUgSHUgd3JvdGU6 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBUaGlzIHBhdGNoIGFkZHMgdGFzayBzd2l0Y2gg c3VwcG9ydCBmb3IgdmVjdG9yLiBJdCBzdXBwb3J0cyBwYXJ0aWFsIGxhenkKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+IHNhdmUgYW5kIHJlc3RvcmUgbWVjaGFuaXNtLiBJdCBhbHNvIHN1cHBv cnRzIGFsbCBsZW5ndGhzIG9mIHZsZW4uCj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4g WyAuLi4gXQo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBTbyB0aGlz IHdpbGwgdW5jb25kaXRpb25hbGx5IGVuYWJsZSB2ZWN0b3IgaW5zdHJ1Y3Rpb25zLCBhbmQgYWxs b2NhdGUKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBtZW1vcnkgZm9yIHZlY3RvciBzdGF0ZSwg Zm9yIGFsbCBwcm9jZXNzZXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB2ZWN0b3IKPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiBpbnN0cnVjdGlvbnMgYXJlIHVzZWQ/Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFllcywgaXQgd2lsbCBlbmFibGUgdmVjdG9y IGlmIGhhc192ZWN0b3IoKSBpcyB0cnVlLiBUaGUgcmVhc29uIHRoYXQgd2UKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gY2hvb3NlIHRvIGVuYWJsZSBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciB1c2Vy IHNwYWNlIHByb2dyYW0gaXMgYmVjYXVzZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiB3ZSBhbHNv IGltcGxlbWVudCBzb21lIGNvbW1vbiBmdW5jdGlvbnMgaW4gdGhlIGdsaWJjIHN1Y2ggYXMgbWVt Y3B5Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHZlY3RvciB2ZXJzaW9uIGFuZCBpdCBpcyBjYWxs ZWQgdmVyeSBvZnRlbiBieSBldmVyeSBwcm9jZXNzLiBTbyB0aGF0Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IHdlIGFzc3VtZSBpZiB0aGUgdXNlciBwcm9ncmFtIGlzIHJ1bm5pbmcgaW4gYSBDUFUg d2l0aCB2ZWN0b3IgSVNBCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHdvdWxkIGxpa2UgdG8gdXNl IHZlY3RvciBieSBkZWZhdWx0LiBJZiB3ZSBkaXNhYmxlIGl0IGJ5IGRlZmF1bHQgYW5kCj4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IG1ha2UgaXQgdHJpZ2dlciB0aGUgaWxsZWdhbCBpbnN0cnVjdGlv biwgdGhhdCBtaWdodCBiZSBhIGJ1cmRlbiBzaW5jZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBh bG1vc3QgZXZlcnkgcHJvY2VzcyB3aWxsIHVzZSB2ZWN0b3IgZ2xpYmMgbWVtY3B5IG9yIHNvbWV0 aGluZyBsaWtlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHRoYXQuCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gRG8geW91IGhhdmUgYW55IGV2aWRlbmNlIHRvIHN1 cHBvcnQgdGhlIGFzc2VydGlvbiB0aGF0IGFsbW9zdCBldmVyeSBwcm9jZXNzCj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiB3b3VsZCB1c2UgdmVjdG9yIG9wZXJhdGlvbnM/ICBPbmUgY291bGQgZWFzaWx5 IGFyZ3VlIHRoYXQgdGhlIGNvbnZlcnNlIGlzCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiB0cnVlOiBu byBleGlzdGluZyBzb2Z0d2FyZSB1c2VzIHRoZSB2ZWN0b3IgZXh0ZW5zaW9uIG5vdywgc28gbW9z dCBsaWtlbHkgYQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gcHJvY2VzcyB3aWxsIG5vdCBiZSB1c2lu ZyBpdC4KPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+IEdsaWJjIHVzdHJl YW1pbmcgaXMganVzdCBzdGFydGluZyBzbyB5b3UgZGlkbid0IHNlZSBzb2Z0d2FyZSB1c2luZyB0 aGUKPiA+ID4gPiA+ID4gPiA+ID4gPiB2ZWN0b3IgZXh0ZW5zaW9uIG5vdyBhbmQgdGhpcyBwYXRj aHNldCBpcyB0ZXN0aW5nIGJhc2VkIG9uIHRob3NlCj4gPiA+ID4gPiA+ID4gPiA+ID4gb3B0aW1p emVkIGdsaWJjIHRvby4gVmluY2VudCBDaGVuIGlzIHdvcmtpbmcgb24gdGhlIGdsaWJjIHZlY3Rv cgo+ID4gPiA+ID4gPiA+ID4gPiA+IHN1cHBvcnQgdXBzdHJlYW1pbmcgYW5kIHdlIHdpbGwgYWxz byB1cHN0cmVhbSB0aGUgdmVjdG9yIHZlcnNpb24gZ2xpYmMKPiA+ID4gPiA+ID4gPiA+ID4gPiBt ZW1jcHksIG1lbWNtcCwgbWVtY2hyLCBtZW1tb3ZlLCBtZW1zZXQsIHN0cmNtcCwgc3RybGVuLiBU aGVuIHdlIHdpbGwKPiA+ID4gPiA+ID4gPiA+ID4gPiBzZWUgcGxhdGZvcm0gd2l0aCB2ZWN0b3Ig c3VwcG9ydCBjYW4gdXNlIHZlY3RvciB2ZXJzaW9uIG1lbSogYW5kIHN0cioKPiA+ID4gPiA+ID4g PiA+ID4gPiBmdW5jdGlvbnMgYXV0b21hdGljYWxseSBiYXNlZCBvbiBpZnVuYyBhbmQgcGxhdGZv cm0gd2l0aG91dCB2ZWN0b3IKPiA+ID4gPiA+ID4gPiA+ID4gPiB3aWxsIHVzZSB0aGUgb3JpZ2lu YWwgb25lIGF1dG9tYXRpY2FsbHkuIFRoZXNlIGNvdWxkIGJlIGRvbmUgdG8gc2VsZWN0Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gdGhlIGNvcnJlY3Qgb3B0aW1pemVkIGdsaWJjIGZ1bmN0aW9ucyBieSBp ZnVuYyBtZWNoYW5pc20uCj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gSW4geW91ciBy ZXBseSwgSSBub3RpY2VkIHRoYXQgeW91IGRpZG4ndCBhZGRyZXNzIEdyZWVudGltZSdzIHJlc3Bv bnNlCj4gPiA+ID4gPiA+ID4gPiBoZXJlLiAgQnV0IHRoaXMgbG9va3MgbGlrZSB0aGUga2V5IGlz c3VlLiAgSWYgY29tbW9uIGxpYnJhcnkgZnVuY3Rpb25zIGFyZQo+ID4gPiA+ID4gPiA+ID4gdmVj dG9yLWFjY2VsZXJhdGVkLCB3b3VsZG4ndCBpdCBtYWtlIHNlbnNlIHRoYXQgYWxtb3N0IGV2ZXJ5 IHByb2Nlc3Mgd291bGQKPiA+ID4gPiA+ID4gPiA+IHdpbmQgdXAgdXNpbmcgdmVjdG9yIGluc3Ry dWN0aW9ucz8gIEFuZCB0aHVzIHRoZXJlIHdvdWxkbid0IGJlIG11Y2ggcG9pbnQKPiA+ID4gPiA+ ID4gPiA+IHRvIHNraXBwaW5nIHRoZSB2ZWN0b3IgY29udGV4dCBtZW1vcnkgYWxsb2NhdGlvbj8K PiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBUaGlzIGlzc3VlIHdh cyBhZGRyZXNzZWQgaW4gdGhlIHRocmVhZCByZWdhcmRpbmcgSW50ZWwgQU1YIEkgbGlua2VkIHRv IGluIGEKPiA+ID4gPiA+ID4gPiBwcmV2aW91cyBtZXNzYWdlLiAgSSBkb24ndCBhZ3JlZSB0aGF0 IHRoaXMgaXMgdGhlIGtleSBpc3N1ZTsgaXQgaXMgb25lIG9mIGEKPiA+ID4gPiA+ID4gPiBudW1i ZXIgb2YgaXNzdWVzLiAgV2hhdCBpZiBJIGRvbid0IHdhbnQgdG8gdGFrZSB0aGUgcG90ZW50aWFs Cj4gPiA+ID4gPiA+ID4gcG93ZXIvZnJlcXVlbmN5IGhpdCBmb3IgdGhlIHZlY3RvciB1bml0IGZv ciBhIHdvcmtsb2FkIHRoYXQsIGF0IGJlc3QsIHVzZXMKPiA+ID4gPiA+ID4gPiBpdCBmb3IgdGhl IG9jY2FzaW9uYWwgbWVtY3B5PyAgV2hhdCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlscywgaG93IHdp bGwgdGhhdAo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBIaSBEYXJpdXMsCj4gPiA+ID4gPiA+IFRo ZSBtZW1jcHkgZnVuY3Rpb24gc2VlbXMgbm90IHRvIGJlIG9jY2FzaW9uYWxseSB1c2VkIGluIHRo ZSBwcm9ncmFtcwo+ID4gPiA+ID4gPiBiZWNhdXNlIG1hbnkgZnVuY3Rpb25zIGluIEdsaWJjIHVz ZSBtZW1jcHkoKSB0byBjb21wbGV0ZSB0aGUgbWVtb3J5Cj4gPiA+ID4gPiA+IGNvcHkuIEkgdXNl IHRoZSBmb2xsb3dpbmcgc2ltcGxlIGNhc2UgYXMgYW4gZXhhbXBsZS4KPiA+ID4gPiA+ID4gdGVz dC5jCj4gPiA+ID4gPiA+IHZvaWQgbWFpbih2b2lkKSB7Cj4gPiA+ID4gPiA+ICAgICByZXR1cm47 Cj4gPiA+ID4gPiA+IH0KPiA+ID4gPiA+ID4gVGhlbiwgd2UgY29tcGlsZSBpdCBieSAiZ2NjIHRl c3QuYyAtbyBhLm91dCIgYW5kIGV4ZWN1dGUgaXQuIEluIHRoZQo+ID4gPiA+ID4gPiBleGVjdXRp b24sIHRoZSBtZW1jcHkoKSBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LiBJdCBpcyBiZWNh dXNlCj4gPiA+ID4gPiA+IG1hbnkgbGliYyBpbml0aWFsaXplZCBmdW5jdGlvbnMgd2lsbCBiZSBl eGVjdXRlZCBiZWZvcmUgZW50ZXJpbmcgdGhlCj4gPiA+ID4gPiA+IHVzZXItZGVmaW5lZCBtYWlu IGZ1bmN0aW9uLiBPbmUgb2YgdGhlIGV4YW1wbGUgaXMgX19saWJjX3NldHVwX3RscygpLAo+ID4g PiA+ID4gPiB3aGljaCBpcyBjYWxsZWQgYnkgX19saWJjX3N0YXJ0X21haW4oKS4gVGhlIF9fbGli Y19zZXR1cF90bHMoKSB3aWxsCj4gPiA+ID4gPiA+IHVzZSBtZW1jcHkoKSBkdXJpbmcgdGhlIHBy b2Nlc3Mgb2YgY3JlYXRpbmcgdGhlIER5bmFtaWMgVGhyZWFkIFZlY3Rvcgo+ID4gPiA+ID4gPiAo RFRWKS4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gVGhlcmVmb3JlLCBJIHRoaW5rIHRoZSBtZW1j cHkoKSBpcyB3aWRlbHkgdXNlZCBpbiBtb3N0IHByb2dyYW1zLgo+ID4gPiA+ID4gPgo+ID4gPiA+ ID4KPiA+ID4gPiA+IFlvdSdyZSBtaXNzaW5nIG15IHBvaW50LiAgTm90IGV2ZXJ5IChhbnk/KSBw cm9ncmFtIHNwZW5kcyBhIG1ham9yaXR5IG9mIHRoZQo+ID4gPiA+ID4gdGltZSBkb2luZyBtZW1j cHkoKSwgYW5kIGV2ZW4gaWYgYSBwcm9ncmFtIGRpZCwgYWxsIG9mIG15IHBvaW50cyBhcmUgc3Rp bGwKPiA+ID4gPiA+IHZhbGlkLgo+ID4gPiA+ID4KPiA+ID4gPiA+IFBsZWFzZSByZWFkIHRoZSBk aXNjdXNzaW9uIGluIHRoZSB0aHJlYWQgSSByZWZlcmVuY2VkIGFuZCB0aGUgcXVlc3Rpb25zIGlu Cj4gPiA+ID4gPiBteSBwcmlvciBtZXNzYWdlLgo+ID4gPiA+ID4KPiA+ID4gPgo+ID4gPiA+IEhp IERhcml1cywKPiA+ID4gPgo+ID4gPiA+IEFzIEkgbWVudGlvbmVkIGJlZm9yZSwgd2Ugd2FudCB0 byB0cmVhdCB2ZWN0b3IgSVNBIGxpa2UgYSBnZW5lcmFsIElTQQo+ID4gPiA+IGluc3RlYWQgb2Yg YSBzcGVjaWZpYyBJUC4gVXNlciBwcm9ncmFtIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBpdAo+ID4g PiA+IHRyYW5zcGFyZW50bHkganVzdCBsaWtlIEZQVS4KPiA+ID4gPiBJdCBzZWVtcyB0aGF0IHRo ZSB1c2UgY2FzZSB5b3Ugd2FudCBpcyBhc2tpbmcgdXNlciB0byB1c2UgdmVjdG9yIGxpa2UKPiA+ ID4gPiBhIHNwZWNpZmljIElQLCB1c2VyIHByb2dyYW0gc2hvdWxkIGFzayBrZXJuZWwgYmVmb3Jl IHRoZXkgdXNlIGl0IGFuZAo+ID4gPiA+IHRoYXQgaXMgbm90IHdoYXQgd2Ugd2FudCB0byBkbyBp biB0aGlzIHBhdGNoc2V0Lgo+ID4gPiA+Cj4gPiA+Cj4gPiA+IEhpIEdyZWVudGltZSwKPiA+ID4K PiA+ID4gUmlnaHQuCj4gPiA+Cj4gPiA+IEJ1dCBiZXlvbmQgd2hhdCBJIHdhbnQgdG8gZG8gb3Ig d2hhdCB5b3Ugd2FudCB0byBkbywgaXMgd2hhdCAqc2hvdWxkKiBMaW51eAo+ID4gPiBkbz8gIEkg aGF2ZSBhdHRlbXB0ZWQgdG8gcHJvdmlkZSBldmlkZW5jZSB0byBzdXBwb3J0IG15IHBvc2l0aW9u LiAgWW91IGhhdmUKPiA+ID4gbm90IHJlc3BvbmRlZCB0byBvciBhZGRyZXNzZWQgdGhlIG1ham9y aXR5IG9mIG15IHF1ZXN0aW9ucywgd2hpY2ggaXMKPiA+ID4gY29uY2VybmluZyB0byBtZS4KPiA+ Cj4gPiBIaSBEYXJpdXMsCj4gPgo+ID4gV2hhdCBpcyB5b3VyIG1ham9yaXR5IHF1ZXN0aW9ucz8K PiA+Cj4KPiAxLiBIb3cgd2lsbCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcyBmb3IgY29udGV4 dCBzdGF0ZSBtZW1vcnkgYmUgcmVwb3J0ZWQKPiB0byB1c2VyIHNwYWNlPwoKaXQgd2lsbCByZXR1 cm4gLUVOT01FTSBmb3Igc29tZSBjYXNlcyBvciBzaG93IHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGZv cgpzb21lIGNhc2VzLgpXZSBrbm93IGl0J3Mgbm90IHBlcmZlY3QsIHdlIHNob3VsZCBlbmhhbmNl IHRoYXQgaW4gdGhlIGZ1dHVyZSwgYnV0CmxldCdzIHRha2UgYW4gZXhhbXBsZTogMjU2IGJpdHMg dmVjdG9yIGxlbmd0aCBzeXN0ZW0uIDI1NiBiaXRzICogMzIKcmVnaXN0ZXJzIC84ID0gMUtCLgoK PiAyLiBIb3cgd2lsbCBhIHN5c3RlbSBhZG1pbmlzdHJhdG9yIChpLmUuLCB0aGUgdXNlcikgYmUg YWJsZSB0byBlZmZlY3RpdmVseQo+IG1hbmFnZSBhIHN5c3RlbSB3aGVyZSB0aGUgdmVjdG9yIHVu aXQsIHdoaWNoIGNvdWxkIGhhdmUgYSBjb25zaWRlcmFibGUgYXJlYQo+IGFuZC9vciBwb3dlciBp bXBhY3QgdG8gdGhlIHN5c3RlbSwgaGFzIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcKPiBw cm9wZXJ0aWVzOgoKQXMgSSBtZW50aW9uZWQgYmVmb3JlLApXZSB3b3VsZCBsaWtlIHRvIGxldCB1 c2VyIHVzZSB2ZWN0b3IgdHJhbnNwYXJlbnRseSBqdXN0IGxpa2UgRlBVIG9yCm90aGVyIGV4dGVu c2lvbnMuCklmIHVzZXIga25vd3MgdGhhdCB0aGlzIHN5c3RlbSBzdXBwb3J0cyB2ZWN0b3IgYW5k IHVzZXIgdXNlcyBpbnRyaW5zaWMKZnVuY3Rpb25zIG9yIGFzc2VtYmx5IGNvZGVzIG9yIGNvbXBp bGVyIGdlbmVyYXRpbmcgdmVjdG9yIGNvZGVzLCB1c2VyCmNhbiBqdXN0IHVzZSBpdCBqdXN0IGxp a2UgRlBVLgpJZiB1c2VyIGRvZXNuJ3Qga25vdyB0aGF0IHdoZXRoZXIgdGhpcyBzeXN0ZW0gc3Vw cG9ydCB2ZWN0b3Igb3Igbm90LAp1c2VyIGNhbiBqdXN0IHVzZSB0aGUgZ2xpYmMgb3IgaWZ1bmMg aW4gaGlzIG93biBsaWJyYXJpZXMgdG8gZGV0ZWN0CnZlY3RvciBzdXBwb3J0IGR5bmFtaWNhbGx5 LgoKPiAgIGEuIEEgc2luZ2xlIHZlY3RvciB1bml0IHNoYXJlZCBhbW9uZyB0d28gb3IgbW9yZSBo YXJ0cywKPgo+ICAgYi4gQWRkaXRpb25hbCBwb3dlciBjb25zdW1wdGlvbiB3aGVuIHRoZSB2ZWN0 b3IgdW5pdCBpcyBlbmFibGVkIGFuZCBpZGxlCj4gdmVyc3VzIG5vdCBiZWluZyBlbmFibGVkIGF0 IGFsbCwKPgo+ICAgYy4gRm9yIGEgc3lzdGVtIHdoaWNoIHN1cHBvcnRzIHZhcmlhYmxlIG9wZXJh dGluZyBmcmVxdWVuY3ksIGEgcmVkdWN0aW9uCj4gaW4gdGhlIG1heGltdW0gZnJlcXVlbmN5IHdo ZW4gdGhlIHZlY3RvciB1bml0IGlzIGVuYWJsZWQsIGFuZC9vcgo+Cj4gICBkLiBUaGUgaW5hYmls aXR5IHRvIGVudGVyIGxvdyBwb3dlciBzdGF0ZXMgYW5kL29yIGRlbGF5cyB0byBsb3cgcG93ZXIK PiBzdGF0ZXMgdHJhbnNpdGlvbnMgd2hlbiB0aGUgdmVjdG9yIHVuaXQgaXMgZW5hYmxlZC4KCldl IGFsc28gZG9uJ3Qgc3VwcG9ydCB0aGlzIGtpbmQgb2Ygc3lzdGVtKGEgc2luZ2xlIHZlY3RvciB1 bml0IHNoYXJlZAphbW9uZyAyIG9yIG1vcmUgaGFydHMpIGluIHRoaXMgaW1wbGVtZW50YXRpb24u IEknbGwgYWRkIG1vcmUKYXNzdW1wdGlvbnMgaW4gdGhlIG5leHQgdmVyc2lvbiBwYXRjaGVzLgpG b3IgdGhlIGZyZXF1ZW5jeSBvciBwb3dlciBpc3N1ZXMsIEknbGwgYWxzbyBub3QgdHJlYXQgdGhl bSBhcyBhCnNwZWNpYWwgY2FzZSBzaW5jZSB3ZSB3YW50IHRvIHRyZWF0IHZlY3RvciBsaWtlIGFu IG5vcm1hbCBleHRlbnNpb24gb2YKSVNBIGluc3RlYWQgb2YgYSBzcGVjaWZpYyBJUC4KCj4gMy4g WW91IGNvbnRlbmQgdGhhdCB0aGUgUklTQy1WIFYtZXh0ZW5zaW9uIHJlc2VtYmxlcyBBUk0gU1ZF L1NWRTIsIGF0IGxlYXN0Cj4gbW9yZSB0aGFuIEludGVsIEFNWC4gIEkgZG8gbm90IGFncmVlLCBi dXQgbmV2ZXJ0aGVsZXNzLCB3aHkgdGhlbiBkb2VzIHRoaXMKPiBwYXRjaHNldCBub3QgYmVoYXZl IHNpbWlsYXIgdG8gU1ZFPyAgT24gYXJtNjQsIFNWRSBpcyBvbmx5IGVuYWJsZWQgYW5kCj4gbWVt b3J5IGlzIG9ubHkgYWxsb2NhdGVkIG9uIGZpcnN0IHVzZSwgKm5vdCogdW5jb25kaXRpb25hbGx5 IGZvciBhbGwgdGFza3MuCgpBcyB3ZSBtZW50aW9uZWQgYmVmb3JlLCBhbG1vc3QgZXZlcnkgdXNl ciBzcGFjZSBwcm9ncmFtIHdpbGwgdXNlIGdsaWJjCmxkLnNvL2xpYmMuc28gYW5kIHRoZXNlIGxp YnJhcmllcyB3aWxsIHVzZSB0aGUgdmVjdG9yIHZlcnNpb24Kb3B0aW1pemF0aW9uIHBvcnRpbmcg aW4gYSBzeXN0ZW0gd2l0aCB2ZWN0b3Igc3VwcG9ydC4KVGhhdCdzIHdoeSB3ZSBkb24ndCBsZXQg aXQgdHJpZ2dlciB0aGUgZmlyc3QgaWxsZWdhbCBpbnN0cnVjdGlvbgpleGNlcHRpb24gYmVjYXVz ZSB2ZWN0b3IgcmVnaXN0ZXJzIHdpbGwgYmUgdXNlZCBhdCB2ZXJ5IGJlZ2lubmluZyBvZgp0aGUg cHJvZ3JhbSBhbmQgdGhlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZXhjZXB0aW9uIGhhbmRsaW5nIGlz IGFsc28KaGVhdmllciBiZWNhdXNlIHdlIG5lZWQgdG8gZ28gdG8gTS1tb2RlIGZpcnN0IHRoYW4g Uy1tb2RlIHdoaWNoIG1lYW5zCndlIHdpbGwgbmVlZCB0byBzYXZlIGNvbnRleHQgYW5kIHJlc3Rv cmUgY29udGV4dCB0d2ljZSBpbiBib3RoIE0tbW9kZQphbmQgUy1tb2RlLiBTaW5jZSB0aGUgdnN0 YXRlIHdpbGwgYmUgYWxsb2NhdGVkIGV2ZW50dWFsbHksIHdoeSBub3QKc2F2ZSB0aGVzZSAyIGNv bnRleHQgc2F2ZS9yZXN0b3JlIG92ZXJoZWFkIGluIGJvdGggTS1tb2RlIGFuZCBTLW1vZGUKZm9y IGhhbmRsaW5nIHRoaXMgaWxsZWdhbCBpbnN0cnVjdGlvbiBleGNlcHRpb24uIEFuZCBpZiB0aGUg c3lzdGVtCmRvZXNuJ3Qgc3VwcG9ydCB2ZWN0b3IsIGdsaWJjIHdvbid0IHVzZSB0aGUgdmVjdG9y IHBvcnRpbmcgYW5kIHRoZQpMaW51eCBrZXJuZWwgd29uJ3QgYWxsb2NhdGUgdnN0YXRlIGZvciBl dmVyeSBwcm9jZXNzIHRvby4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZy YWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGlu dXgtcmlzY3YK