From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sender4-pp-o91.zoho.com (sender4-pp-o91.zoho.com [136.143.188.91]) by sourceware.org (Postfix) with ESMTPS id 511303853801; Fri, 28 May 2021 01:51:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 511303853801 ARC-Seal: i=1; a=rsa-sha256; t=1622166680; cv=none; d=zohomail.com; s=zohoarc; b=e0H1BKnEDFrpLGdzviJavDXnGR8pI/tXiWuLH9QFTMKrl7WKOEP8JRZ9DN+I69rJgFDNFKlDGRhevbFKeDGwqRg79iqD3V2VBXFxb+VhIFWa6F8zUUOjC4r9xVDXQOjo2asH1pKqfIwVnaqgzK6O+inJmDEPCUojuLTViXbVriA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1622166680; h=Content-Type:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=8Zo4mNJBzCg9CaR8ce1Oe8MIxpLwNT35/oMc2rxBBfg=; b=AhZW7ez1Rlh2RcsumwlAFPMyvMvxWCm9uDwrXzZghLP6s9iy/QC251QJfFmoTA3VSkibclcqvmYLEcKB1kXrsg4tVoWkYiagvpX+vnHPqoVMoFJ7x9FdfRnIO20U/0zMbxracSL7wLyiE7VKlDfgWKYQs9RgchjgYreE8fHxyXo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=zoho.com; spf=pass smtp.mailfrom=bouanto@zoho.com; dmarc=pass header.from= Received: from [192.168.1.174] (38.87.11.6 [38.87.11.6]) by mx.zohomail.com with SMTPS id 1622166678855871.9089714010676; Thu, 27 May 2021 18:51:18 -0700 (PDT) Message-ID: Subject: Re: [PATCH] libgccjit: add some reflection functions in the jit C api From: Antoni Boucher To: David Malcolm Cc: Andrea Corallo , Antoni Boucher via Jit , gcc-patches@gcc.gnu.org Date: Thu, 27 May 2021 21:51:16 -0400 In-Reply-To: <534254132a841b75d555a52ce952f84418f168c2.camel@redhat.com> References: <20200902010120.crnx55ev635ceiey@bouanto-desktop.localdomain> <6fe2ea355403eb177c9632e076c11c792f23c791.camel@redhat.com> <9cd00fe5cb5c03184e3a5bd939447b30450a8ca7.camel@redhat.com> <20201015160226.cka4iq3w22jztopm@bouanto-desktop.localdomain> <20201015173952.ft7mu5ajbaxb3gke@bouanto-desktop.localdomain> <54ba5c58dbd2b8c7b1f3276c2b87cddf55e258bd.camel@redhat.com> <20201103221324.xw3jbvrw2uwdc4rz@bouanto-desktop.localdomain> <3388bb8c84e68cd7b0698dc154e7a5666c0d2cde.camel@redhat.com> <0e8b6450bcb23182b85342d8010c3bea0c297ba2.camel@zoho.com> <534254132a841b75d555a52ce952f84418f168c2.camel@redhat.com> Content-Type: multipart/mixed; boundary="=-HejcuDyx2YulzpLTEimN" User-Agent: Evolution 3.40.1 MIME-Version: 1.0 X-Zoho-Virus-Status: 1 X-ZohoMailClient: External X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: jit@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Jit mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 May 2021 01:51:30 -0000 --=-HejcuDyx2YulzpLTEimN Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I chose option A, so everything is a size_t, now. I also renamed the dyncast functions. Here's the new patch. Le jeudi 27 mai 2021 =C3=A0 18:19 -0400, David Malcolm a =C3=A9crit=C2=A0: > On Tue, 2021-05-25 at 20:19 -0400, Antoni Boucher wrote: > > @David: PING > >=20 > > As far as I know, the only remaining question is about using > > `ssize_t` > > for the return type of some functions. > > Here's why I use this type: > >=20 > > That seemed off to return NULL for the functions returning a=20 > > size_t to indicate an error. So I changed it to return -1 (and > > return > > type to ssize_t). Is that the proper way to indicate an error? > >=20 > > Once I know the answer for this error handling question, I'll fix > > the > > types. > >=20 > > Thanks! >=20 > I think the things that accept params for indexes should be size_t > (i.e. unsigned). >=20 > As for the error-handling, I've been going back and forth. >=20 > The various return of -1 in the patch all occur when NULL is passed > in > as the gcc_jit_foo*, for the various foo. Unfortunately this means > that > we can't get at a jit context to emit the error on, so jit_error is > called with a NULL context, and hence merely prints to stderr; it > can't > set state on any jit context. >=20 > Presumably if the code is passing in NULL for one of these things, > then > something's gone wrong already. >=20 > Option (A): returning a size_t (unsigned): > - No way to indicate error if the user passes in NULL, or a bogus > value, beyond output on stderr; we have to defensively return 0, > which > the user's code is likely to gracefully handle >=20 > Option (B): returning a ssize_t: > - Can return -1 if the user passes in NULL or a bogus value.=C2=A0 But if > the user doesn't check for -1 and blithely casts to unsigned (e.g. > allocating a buffer), their code is likely to explode with a very > large > allocation. >=20 > Consider e.g. gcc_jit_function_type_get_param_count.=C2=A0 If the user > uses=C2=A0 > gcc_jit_type_is_function_ptr_type to dynamically cast some type to > function_type and forgets to check, and passes in NULL, then... >=20 > ...with option (A), it returns 0, as if the function has no params; > eventually a type-checking error occurs. >=20 > ...with option (B), it returns -1, and the user who didn't check > before > has to check again >=20 > So I think I prefer option (A), but I'm willing to be convinced on > the > alternative. >=20 > I also now think that the dynamic cast functions (e.g. > gcc_jit_type_is_function_ptr_type) should be "_dyncast_" rather than > "_is_" (e.g. gcc_jit_type_dyncast_function_ptr_type) to make it clear > that this is a dynamic cast that can fail, and to contrast them with > the "_as_" functions which are static casts. >=20 > Hope this makes sense and is constructive. > Dave >=20 >=20 > >=20 > > Le jeudi 13 mai 2021 =C3=A0 17:30 -0400, David Malcolm a =C3=A9crit=C2= =A0: > > > On Tue, 2020-11-03 at 17:13 -0500, Antoni Boucher wrote: > > > > I was missing a check in gcc_jit_struct_get_field, I added it > > > > in > > > > this > > > > new patch. > > > >=20 > > >=20 > > > Sorry about the long delay in reviewing this patch. > > >=20 > > > The main high-level points are: > > > - currently the get_*_count functions return "ssize_t" - why?=C2=A0 > > > Only > > > unsigned values are meaningful; shouldn't they return "size_t" > > > instead? > > >=20 > > > - the various "lookup by index" functions take "int" i.e. signed, > > > but > > > only >=3D 0 is meaningful.=C2=A0 I think it makes sense to make them > > > take > > > size_t instead. > > >=20 > > > Sorry if we covered that before in the review, it's been a while. > > >=20 > > > Various nitpicks inline below... > > >=20 > > > [...snip...] > > > =C2=A0 > > > > diff --git a/gcc/jit/docs/topics/compatibility.rst > > > > b/gcc/jit/docs/topics/compatibility.rst > > > > index 6bfa101ed71..236e5c72d81 100644 > > > > --- a/gcc/jit/docs/topics/compatibility.rst > > > > +++ b/gcc/jit/docs/topics/compatibility.rst > > > > @@ -226,3 +226,44 @@ entrypoints: > > > > =C2=A0-------------------- > > > > =C2=A0``LIBGCCJIT_ABI_14`` covers the addition of > > > > =C2=A0:func:`gcc_jit_global_set_initializer` > > > > + > > > > +.. _LIBGCCJIT_ABI_15: > > > > + > > > > +``LIBGCCJIT_ABI_15`` > > > > +-------------------- > > > > +``LIBGCCJIT_ABI_15`` covers the addition of reflection > > > > functions > > > > via > > > > API > > > > +entrypoints: > > >=20 > > > This needs updating, as I used LIBGCCJIT_ABI_15 for inline asm. > > >=20 > > > [...snip...] > > >=20 > > > > diff --git a/gcc/jit/docs/topics/functions.rst > > > > b/gcc/jit/docs/topics/functions.rst > > > > index eb40d64010e..aa6de87282d 100644 > > > > --- a/gcc/jit/docs/topics/functions.rst > > > > +++ b/gcc/jit/docs/topics/functions.rst > > > > @@ -171,6 +171,16 @@ Functions > > > > =C2=A0=C2=A0=C2=A0 underlying string, so it is valid to pass in a p= ointer to > > > > an > > > > on- > > > > stack > > > > =C2=A0=C2=A0=C2=A0 buffer. > > > > =C2=A0 > > > > +.. function::=C2=A0 ssize_t \ > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 gcc_jit_function_get_param_count > > > > (gcc_jit_function > > > > *func) > > > > + > > > > +=C2=A0=C2=A0 Get the number of parameters of the function. > > > > + > > > > +.. function::=C2=A0 gcc_jit_type \* > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 gcc_jit_function_get_return_type > > > > (gcc_jit_function > > > > *func) > > > > + > > > > +=C2=A0=C2=A0 Get the return type of the function. > > >=20 > > > As noted before, this doesn't yet document all the new > > > entrypoints; I > > > think you wanted to hold off until all the details were thrashed > > > out, > > > but hopefully we're close. > > >=20 > > > The documentation for an entrypoint should specify which ABI it > > > was > > > added in. > > >=20 > > > [...snip...] > > >=20 > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::type::is_struct method, in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > + > > > > +gcc_jit_struct * > > > > +gcc_jit_type_is_struct (gcc_jit_type *type) > > > > +{ > > > > +=C2=A0 RETURN_NULL_IF_FAIL (type, NULL, NULL, "NULL type"); > > > > +=C2=A0 gcc::jit::recording::struct_ *struct_type =3D type->is_stru= ct > > > > (); > > > > +=C2=A0 return (gcc_jit_struct *)struct_type; > > > > +} > > > > + > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::vector_type::get_num_units metho= d, in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > + > > > > +ssize_t > > > > +gcc_jit_vector_type_get_num_units (gcc_jit_vector_type > > > > *vector_type) > > > > +{ > > > > +=C2=A0 RETURN_VAL_IF_FAIL (vector_type, -1, NULL, NULL, "NULL > > > > vector_type"); > > > > +=C2=A0 return vector_type->get_num_units (); > > > > +} > > > > + > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::vector_type::get_element_type me= thod, > > > > in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > + > > > > +gcc_jit_type * > > > > +gcc_jit_vector_type_get_element_type (gcc_jit_vector_type > > > > *vector_type) > > > > +{ > > > > +=C2=A0 RETURN_NULL_IF_FAIL (vector_type, NULL, NULL, "NULL > > > > vector_type"); > > > > +=C2=A0 return (gcc_jit_type *)vector_type->get_element_type (); > > > > +} > > > > + > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::type::unqualified method, in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > + > > > > +gcc_jit_type * > > > > +gcc_jit_type_unqualified (gcc_jit_type *type) > > > > +{ > > > > +=C2=A0 RETURN_NULL_IF_FAIL (type, NULL, NULL, "NULL type"); > > > > + > > > > +=C2=A0 return (gcc_jit_type *)type->unqualified (); > > > > +} > > > > + > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::type::dyn_cast_function_type met= hod, > > > > in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > + > > > > +gcc_jit_function_type * > > > > +gcc_jit_type_is_function_ptr_type (gcc_jit_type *type) > > > > +{ > > > > +=C2=A0 RETURN_NULL_IF_FAIL (type, NULL, NULL, "NULL type"); > > > > +=C2=A0 gcc::jit::recording::type *func_ptr_type =3D type->derefere= nce > > > > (); > > > > +=C2=A0 RETURN_NULL_IF_FAIL (func_ptr_type, NULL, NULL, "NULL > > > > type"); > > > > +=C2=A0 gcc::jit::recording::function_type *func_type =3D > > > > +=C2=A0=C2=A0=C2=A0 func_ptr_type->dyn_cast_function_type (); > > > > +=C2=A0 RETURN_NULL_IF_FAIL (func_type, NULL, NULL, "NULL type"); > > >=20 > > > I notice that the other new "*_is_*" functions don't fail if the > > > dyncast returns NULL, whereas this one does. > > >=20 > > > RETURN_NULL_IF_FAIL calls jit_error; do we really want that?=C2=A0 It > > > seems > > > more consistent to have it return NULL without an error for the > > > case > > > where "type" isn't a function ptr type. > > >=20 > > > > + > > > > +=C2=A0 return (gcc_jit_function_type *)func_type; > > > > +} > > > > + > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::function_type::get_return_type m= ethod, > > > > in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > + > > > > +gcc_jit_type * > > > > +gcc_jit_function_type_get_return_type (gcc_jit_function_type > > > > *function_type) > > > > +{ > > > > +=C2=A0 RETURN_NULL_IF_FAIL (function_type, NULL, NULL, "NULL > > > > struct_type"); > > >=20 > > > Wrong error message; should be "NULL function_type". > > >=20 > > >=20 > > > > +=C2=A0 return (gcc_jit_type *)function_type->get_return_type (); > > > > +} > > > > + > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::function_type::get_param_types m= ethod, > > > > in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > + > > > > +ssize_t > > > > +gcc_jit_function_type_get_param_count (gcc_jit_function_type > > > > *function_type) > > > > +{ > > > > +=C2=A0 RETURN_VAL_IF_FAIL (function_type, -1, NULL, NULL, "NULL > > > > struct_type"); > > >=20 > > > Wrong error message; should be "NULL function_type". > > >=20 > > > > +=C2=A0 return function_type->get_param_types ().length (); > > > > +} > > > > + > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::function_type::get_param_types m= ethod, > > > > in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > + > > > > +gcc_jit_type * > > > > +gcc_jit_function_type_get_param_type (gcc_jit_function_type > > > > *function_type, > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int index) > > > > +{ > > > > +=C2=A0 RETURN_NULL_IF_FAIL (function_type, NULL, NULL, "NULL > > > > struct_type"); > > >=20 > > > Wrong error message; should be "NULL function_type". > > >=20 > > >=20 > > > > +=C2=A0 int num_params =3D function_type->get_param_types ().length > > > > (); > > > > +=C2=A0 gcc::jit::recording::context *ctxt =3D function_type->m_ctx= t; > > >=20 > > > "index" should either be unsigned, or we need to check here for > > > >=3D 0. > > >=20 > > > > +=C2=A0 RETURN_NULL_IF_FAIL_PRINTF3 (index < num_params, > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ctxt, NULL, > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "index of %d is too large (%s > > > > has %d > > > > params)", > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 index, > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 function_type->get_debug_string > > > > (), > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 num_params); > > > > +=C2=A0 return (gcc_jit_type *)function_type->get_param_types > > > > ()[index]; > > > > +} > > > > + > > > > =C2=A0/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > =C2=A0 > > > > =C2=A0=C2=A0=C2=A0 After error-checking, the real work is done by t= he > > > > @@ -731,6 +930,36 @@ gcc_jit_struct_set_fields (gcc_jit_struct > > > > *struct_type, > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 (gcc::jit::recording::field > > > > **)fields); > > > > =C2=A0} > > > > =C2=A0 > > > > + > > > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > > > + > > > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > > > +=C2=A0=C2=A0 gcc::jit::recording::fields::get_field method in > > > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > > > +extern gcc_jit_field * > > > > +gcc_jit_struct_get_field (gcc_jit_struct *struct_type, > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 int index) > > > > +{ > > > > +=C2=A0 RETURN_NULL_IF_FAIL (struct_type, NULL, NULL, "NULL struct > > > > type"); > > > > +=C2=A0 RETURN_NULL_IF_FAIL (struct_type->get_fields (), NULL, NULL= , > > > > "NULL > > > > struct fields"); > > >=20 > > > "index" should either be unsigned, or we need to check here for > > > >=3D 0. > > >=20 > > > > +=C2=A0 RETURN_NULL_IF_FAIL (index < struct_type->get_fields ()- > > > > >length > > > > (), NULL, > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0NULL, "NULL struct type"); > > > > +=C2=A0 return (gcc_jit_field *)struct_type->get_fields ()- > > > > >get_field > > > > (index); > > > > +} > > >=20 > > > [...snip...] > > >=20 > > > > diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h > > > > index 7134841bb07..db4ccffb41c 100644 > > > > --- a/gcc/jit/libgccjit.h > > > > +++ b/gcc/jit/libgccjit.h > > > > @@ -96,6 +96,12 @@ typedef struct gcc_jit_field gcc_jit_field; > > > > =C2=A0=C2=A0=C2=A0 the layout for, or an opaque type.=C2=A0 */ > > > > =C2=A0typedef struct gcc_jit_struct gcc_jit_struct; > > > > =C2=A0 > > > > +/* A gcc_jit_function_type encapsulates a function type.=C2=A0 */ > > > > +typedef struct gcc_jit_function_type gcc_jit_function_type; > > > > + > > > > +/* A gcc_jit_vector_type encapsulates a vector type.=C2=A0 */ > > > > +typedef struct gcc_jit_vector_type gcc_jit_vector_type; > > > > + > > >=20 > > > Please add these to the ASCII art inheritance diagram immediately > > > above: > > > =C2=A0 typedef struct gcc_jit_object gcc_jit_object; > > >=20 > > > [...snip...] > > >=20 > > > > =C2=A0/* Unions work similarly to structs.=C2=A0 */ > > > > =C2=A0extern gcc_jit_type * > > > > =C2=A0gcc_jit_context_new_union_type (gcc_jit_context *ctxt, > > > > @@ -1518,6 +1533,78 @@ gcc_jit_version_minor (void); > > > > =C2=A0extern int > > > > =C2=A0gcc_jit_version_patchlevel (void); > > > > =C2=A0 > > > > +#define LIBGCCJIT_HAVE_REFLECTION > > > > + > > > > +/* Reflection functions to get the number of parameters, > > > > return > > > > type > > > > of > > > > +=C2=A0=C2=A0 a function and whether a type is a bool from the C AP= I. > > > > + > > > > +=C2=A0=C2=A0 This API entrypoint was added in LIBGCCJIT_ABI_15; yo= u can > > > > test > > > > for its > > > > +=C2=A0=C2=A0 presence using > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 #ifdef LIBGCCJIT_HAVE_REFLECTION > > > > +*/ > > > > +/* Get the return type of a function.=C2=A0 */ > > > > +extern gcc_jit_type * > > > > +gcc_jit_function_get_return_type (gcc_jit_function *func); > > > > + > > > > +/* Get the number of params of a function.=C2=A0 */ > > > > +extern ssize_t > > > > +gcc_jit_function_get_param_count (gcc_jit_function *func); > > >=20 > > > You're using ssize_t here, why?=C2=A0 Wouldn't size_t be better? > > > The count can't be negative. > > >=20 > > > Should we use size_t for indexes, rather than "int"? > > >=20 > > > (this happens in various places e.g. > > > gcc_jit_function_type_get_param_count and > > > gcc_jit_vector_type_get_num_units) > > >=20 > > > [...snip...] > > >=20 > > > > diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map > > > > index a6e67e781a4..720b6ca286f 100644 > > > > --- a/gcc/jit/libgccjit.map > > > > +++ b/gcc/jit/libgccjit.map > > > > @@ -192,3 +192,24 @@ LIBGCCJIT_ABI_14 { > > > > =C2=A0=C2=A0 global: > > > > =C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_global_set_initializer; > > > > =C2=A0} LIBGCCJIT_ABI_13; > > > > + > > > > +LIBGCCJIT_ABI_15 { > > > > +=C2=A0 global: > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_get_return_type; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_get_param_count; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_type_get_return_type; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_type_get_param_count; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_type_get_param_type; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_unqualified; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_array; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_bool; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_function_ptr_type; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_integral; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_pointer; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_vector; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_vector_type_get_element_type; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_vector_type_get_num_units; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_struct_get_field; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_struct; > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_struct_get_field_count; > > > > +} LIBGCCJIT_ABI_14; > > >=20 > > > As noted above, this will need to be LIBGCCJIT_ABI_16 as I used > > > LIBGCCJIT_ABI_15 for inline asm. > > >=20 > > > [...snip...] > > >=20 > > > > diff --git a/gcc/testsuite/jit.dg/test-reflection.c > > > > b/gcc/testsuite/jit.dg/test-reflection.c > > > > new file mode 100644 > > > > index 00000000000..b3cf2942f3a > > > > --- /dev/null > > > > +++ b/gcc/testsuite/jit.dg/test-reflection.c > > > > @@ -0,0 +1,89 @@ > > > > +#include > > > > +#include > > > > + > > > > +#include "libgccjit.h" > > > > + > > > > +#include "harness.h" > > > > + > > > > +void > > > > +create_code (gcc_jit_context *ctxt, void *user_data) > > > > +{ > > > > +=C2=A0 /* Do nothing.=C2=A0 */ > > > > +} > > > > + > > > > +void > > > > +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) > > > > +{ > > > > +=C2=A0 /* Get the built-in functions.=C2=A0 */ > > > > +=C2=A0 gcc_jit_function *builtin_sin =3D > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_builtin_function (ctxt, "si= n"); > > > > + > > > > +=C2=A0 CHECK_VALUE (gcc_jit_function_get_param_count(builtin_sin), > > > > 1); > > > > + > > > > +=C2=A0 gcc_jit_type *double_type =3D > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DO= UBLE); > > > > +=C2=A0 CHECK_VALUE (gcc_jit_function_get_return_type(builtin_sin), > > > > double_type); > > > > +=C2=A0 CHECK (!gcc_jit_type_is_integral(double_type)); > > > > + > > > > +=C2=A0 gcc_jit_type *bool_type =3D > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_BO= OL); > > > > +=C2=A0 CHECK (gcc_jit_type_is_bool(bool_type)); > > > > +=C2=A0 CHECK (!gcc_jit_type_is_integral(bool_type)); > > > > + > > > > +=C2=A0 gcc_jit_type *aligned_bool_type =3D > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_get_aligned(gcc_jit_context_get_ty= pe (ctxt, > > > > GCC_JIT_TYPE_BOOL), 8); > > > > +=C2=A0 CHECK (gcc_jit_type_is_bool(aligned_bool_type)); > > > > +=C2=A0 CHECK (bool_type !=3D aligned_bool_type); > > > > +=C2=A0 CHECK_VALUE (gcc_jit_type_unqualified(aligned_bool_type), > > > > bool_type); > > > > + > > > > +=C2=A0 CHECK_VALUE > > > > (gcc_jit_type_unqualified(gcc_jit_type_get_const(bool_type)), > > > > bool_type); > > > > +=C2=A0 CHECK_VALUE > > > > (gcc_jit_type_unqualified(gcc_jit_type_get_volatile(bool_type)) > > > > , > > > > bool_type); > > > > + > > > > +=C2=A0 gcc_jit_type *int64 =3D > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_int_type(ctxt, 8, 1); > > > > +=C2=A0 CHECK (gcc_jit_type_is_integral(int64)); > > > > +=C2=A0 gcc_jit_type *uint64 =3D > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_int_type(ctxt, 8, 0); > > > > +=C2=A0 CHECK (gcc_jit_type_is_integral(uint64)); > > > > +=C2=A0 gcc_jit_type *int8 =3D > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_int_type(ctxt, 1, 1); > > > > +=C2=A0 CHECK (gcc_jit_type_is_integral(int8)); > > > > +=C2=A0 gcc_jit_type *uint8 =3D > > > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_int_type(ctxt, 1, 0); > > > > +=C2=A0 CHECK (gcc_jit_type_is_integral(uint8)); > > > > + > > > > +=C2=A0 CHECK (!gcc_jit_type_is_vector(double_type)); > > > > +=C2=A0 gcc_jit_type *vec_type =3D gcc_jit_type_get_vector > > > > (double_type, > > > > 4); > > > > +=C2=A0 gcc_jit_vector_type *vector_type =3D > > > > gcc_jit_type_is_vector(vec_type); > > > > +=C2=A0 CHECK (vector_type); > > > > +=C2=A0 CHECK (vec_type !=3D double_type); > > > > +=C2=A0 CHECK_VALUE > > > > (gcc_jit_vector_type_get_element_type(vector_type), > > > > double_type); > > > > +=C2=A0 CHECK_VALUE (gcc_jit_vector_type_get_num_units(vector_type)= , > > > > 4); > > > > + > > > > +=C2=A0 CHECK (!gcc_jit_type_is_pointer(double_type)); > > > > +=C2=A0 CHECK_VALUE > > > > (gcc_jit_type_is_pointer(gcc_jit_type_get_pointer(double_type)) > > > > , > > > > double_type); > > > > + > > > > +=C2=A0 gcc_jit_type* params[2] =3D {int8, uint64}; > > > > +=C2=A0 gcc_jit_type *function_ptr_type =3D > > > > gcc_jit_context_new_function_ptr_type(ctxt, NULL, int64, 2, > > > > params, > > > > 0); > > > > +=C2=A0 gcc_jit_function_type *function_type =3D > > > > gcc_jit_type_is_function_ptr_type (function_ptr_type); > > > > +=C2=A0 CHECK (function_type); > > > > +=C2=A0 int param_count =3D > > > > gcc_jit_function_type_get_param_count(function_type); > > > > +=C2=A0 CHECK_VALUE (param_count, 2); > > > > +=C2=A0 gcc_jit_type *return_type =3D > > > > gcc_jit_function_type_get_return_type(function_type); > > > > +=C2=A0 CHECK_VALUE (return_type, int64); > > > > +=C2=A0 gcc_jit_type *param1 =3D > > > > gcc_jit_function_type_get_param_type(function_type, 0); > > > > +=C2=A0 CHECK_VALUE (param1, int8); > > > > +=C2=A0 gcc_jit_type *param2 =3D > > > > gcc_jit_function_type_get_param_type(function_type, 1); > > > > +=C2=A0 CHECK_VALUE (param2, uint64); > > > > + > > > > +=C2=A0 gcc_jit_field *field1 =3D gcc_jit_context_new_field (ctxt, > > > > NULL, > > > > uint64, "field1"); > > > > +=C2=A0 gcc_jit_field *field2 =3D gcc_jit_context_new_field (ctxt, > > > > NULL, > > > > double_type, "field2"); > > > > +=C2=A0 gcc_jit_field *fields[2] =3D { field1, field2 }; > > > > +=C2=A0 gcc_jit_struct *struct_type =3D > > > > gcc_jit_context_new_struct_type > > > > (ctxt, NULL, "testStruct", 2, fields); > > > > +=C2=A0 CHECK_VALUE (gcc_jit_struct_get_field_count(struct_type), > > > > 2); > > > > +=C2=A0 CHECK_VALUE (gcc_jit_struct_get_field(struct_type, 0), > > > > field1); > > > > +=C2=A0 CHECK_VALUE (gcc_jit_struct_get_field(struct_type, 1), > > > > field2); > > > > +=C2=A0 gcc_jit_struct *struct_ty =3D > > > > gcc_jit_type_is_struct(gcc_jit_struct_as_type(struct_type)); > > > > +=C2=A0 CHECK_VALUE (struct_ty, struct_type); > > >=20 > > >=20 > > > I think this is missing test coverage for the various > > > gcc_jit_type_is_* > > > entrypoints gracefully returning NULL when the type passed to > > > them is > > > wrong (e.g. a non-struct type passed to gcc_jit_type_is_struct, > > > etc) > > >=20 > > > Hope this is constructive; sorry again about the delay in > > > reviewing > > > it. > > > Dave > > >=20 > > >=20 > >=20 > >=20 >=20 >=20 --=-HejcuDyx2YulzpLTEimN Content-Disposition: attachment; filename*0=0001-This-patch-add-some-reflection-functions-in-the-jit-.pat; filename*1=ch Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name="0001-This-patch-add-some-reflection-functions-in-the-jit-.patch"; charset="UTF-8" RnJvbSBiZjBkNDc2YjY3OWFlN2NkYjIxYjdkZDAwMTk5NTM0NDU0Mzc2Njc4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbnRvbmkgQm91Y2hlciA8Ym91YW50b0B6b2hvLmNvbT4KRGF0 ZTogU2F0LCAxIEF1ZyAyMDIwIDE3OjUyOjE3IC0wNDAwClN1YmplY3Q6IFtQQVRDSF0gVGhpcyBw YXRjaCBhZGQgc29tZSByZWZsZWN0aW9uIGZ1bmN0aW9ucyBpbiB0aGUgaml0IEMgYXBpCiBbUFI5 Njg4OV0KCjIwMjAtMDktMSAgQW50b25pIEJvdWNoZXIgIDxib3VhbnRvQHpvaG8uY29tPgoKICAg IGdjYy9qaXQvCiAgICAgICAgICAgIFBSIHRhcmdldC85Njg4OQogICAgICAgICAgICAqIGRvY3Mv dG9waWNzL2NvbXBhdGliaWxpdHkucnN0IChMSUJHQ0NKSVRfQUJJXzE2KTogTmV3IEFCSSB0YWcu CiAgICAgICAgICAgICogZG9jcy90b3BpY3MvZnVuY3Rpb25zLnJzdDogQWRkIGRvY3VtZW50YXRp b24gZm9yIHRoZQogICAgICAgICAgICBmdW5jdGlvbnMgZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcmV0 dXJuX3R5cGUgYW5kCiAgICAgICAgICAgIGdjY19qaXRfZnVuY3Rpb25fZ2V0X3BhcmFtX2NvdW50 CiAgICAgICAgICAgICogZG9jcy90b3BpY3MvdHlwZXMucnN0OiBBZGQgZG9jdW1lbnRhdGlvbiBm b3IgdGhlIGZ1bmN0aW9ucwogICAgICAgICAgICBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3Jl dHVybl90eXBlLAogICAgICAgICAgICBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX2Nv dW50LAogICAgICAgICAgICBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX3R5cGUsCiAg ICAgICAgICAgIGdjY19qaXRfdHlwZV91bnF1YWxpZmllZCwgZ2NjX2ppdF90eXBlX2R5bmNhc3Rf YXJyYXksCiAgICAgICAgICAgIGdjY19qaXRfdHlwZV9pc19ib29sLAogICAgICAgICAgICBnY2Nf aml0X3R5cGVfZHluY2FzdF9mdW5jdGlvbl9wdHJfdHlwZSwKICAgICAgICAgICAgZ2NjX2ppdF90 eXBlX2lzX2ludGVncmFsLCBnY2Nfaml0X3R5cGVfaXNfcG9pbnRlciwKICAgICAgICAgICAgZ2Nj X2ppdF90eXBlX2R5bmNhc3RfdmVjdG9yLAogICAgICAgICAgICBnY2Nfaml0X3ZlY3Rvcl90eXBl X2dldF9lbGVtZW50X3R5cGUsCiAgICAgICAgICAgIGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X251 bV91bml0cywKICAgICAgICAgICAgZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkLCBnY2Nfaml0X3R5 cGVfaXNfc3RydWN0LAogICAgICAgICAgICBhbmQgZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkX2Nv dW50CiAgICAgICAgICAgICogbGliZ2Njaml0LmM6CiAgICAgICAgICAgIChnY2Nfaml0X2Z1bmN0 aW9uX2dldF9yZXR1cm5fdHlwZSwgZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcGFyYW1fY291bnQsCiAg ICAgICAgICAgIGdjY19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcmV0dXJuX3R5cGUsCiAgICAgICAg ICAgIGdjY19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcGFyYW1fY291bnQsCiAgICAgICAgICAgIGdj Y19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcGFyYW1fdHlwZSwgZ2NjX2ppdF90eXBlX3VucXVhbGlm aWVkLAogICAgICAgICAgICBnY2Nfaml0X3R5cGVfZHluY2FzdF9hcnJheSwgZ2NjX2ppdF90eXBl X2lzX2Jvb2wsCiAgICAgICAgICAgIGdjY19qaXRfdHlwZV9keW5jYXN0X2Z1bmN0aW9uX3B0cl90 eXBlLCBnY2Nfaml0X3R5cGVfaXNfaW50ZWdyYWwsCiAgICAgICAgICAgIGdjY19qaXRfdHlwZV9p c19wb2ludGVyLCBnY2Nfaml0X3R5cGVfZHluY2FzdF92ZWN0b3IsCiAgICAgICAgICAgIGdjY19q aXRfdmVjdG9yX3R5cGVfZ2V0X2VsZW1lbnRfdHlwZSwKICAgICAgICAgICAgZ2NjX2ppdF92ZWN0 b3JfdHlwZV9nZXRfbnVtX3VuaXRzLCBnY2Nfaml0X3N0cnVjdF9nZXRfZmllbGQsCiAgICAgICAg ICAgIGdjY19qaXRfdHlwZV9pc19zdHJ1Y3QsIGdjY19qaXRfc3RydWN0X2dldF9maWVsZF9jb3Vu dCk6IE5ldwogICAgICAgICAgICBmdW5jdGlvbnMuCiAgICAgICAgICAgIChzdHJ1Y3QgZ2NjX2pp dF9mdW5jdGlvbl90eXBlLCBzdHJ1Y3QgZ2NjX2ppdF92ZWN0b3JfdHlwZSk6CiAgICAgICAgICAg IE5ldyB0eXBlcy4KICAgICAgICAgICAgKiBsaWJnY2NqaXQuaDoKICAgICAgICAgICAgKGdjY19q aXRfZnVuY3Rpb25fZ2V0X3JldHVybl90eXBlLCBnY2Nfaml0X2Z1bmN0aW9uX2dldF9wYXJhbV9j b3VudCwKICAgICAgICAgICAgZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dldF9yZXR1cm5fdHlwZSwK ICAgICAgICAgICAgZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dldF9wYXJhbV9jb3VudCwKICAgICAg ICAgICAgZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dldF9wYXJhbV90eXBlLCBnY2Nfaml0X3R5cGVf dW5xdWFsaWZpZWQsCiAgICAgICAgICAgIGdjY19qaXRfdHlwZV9keW5jYXN0X2FycmF5LCBnY2Nf aml0X3R5cGVfaXNfYm9vbCwKICAgICAgICAgICAgZ2NjX2ppdF90eXBlX2R5bmNhc3RfZnVuY3Rp b25fcHRyX3R5cGUsIGdjY19qaXRfdHlwZV9pc19pbnRlZ3JhbCwKICAgICAgICAgICAgZ2NjX2pp dF90eXBlX2lzX3BvaW50ZXIsIGdjY19qaXRfdHlwZV9keW5jYXN0X3ZlY3RvciwKICAgICAgICAg ICAgZ2NjX2ppdF92ZWN0b3JfdHlwZV9nZXRfZWxlbWVudF90eXBlLAogICAgICAgICAgICBnY2Nf aml0X3ZlY3Rvcl90eXBlX2dldF9udW1fdW5pdHMsIGdjY19qaXRfc3RydWN0X2dldF9maWVsZCwK ICAgICAgICAgICAgZ2NjX2ppdF90eXBlX2lzX3N0cnVjdCwgZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2Zp ZWxkX2NvdW50KTogTmV3CiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KICAgICAg ICAgICAgKHN0cnVjdCBnY2Nfaml0X2Z1bmN0aW9uX3R5cGUsIHN0cnVjdCBnY2Nfaml0X3ZlY3Rv cl90eXBlKToKICAgICAgICAgICAgTmV3IHR5cGVzLgogICAgICAgICAgICAqIGppdC1yZWNvcmRp bmcuaDogTmV3IGZ1bmN0aW9ucyAoaXNfc3RydWN0IGFuZCBpc192ZWN0b3IpCiAgICAgICAgICAg ICogbGliZ2Njaml0Lm1hcCAoTElCR0NDSklUX0FCSV8xNik6IE5ldyBBQkkgdGFnLgoKICAgIGdj Yy90ZXN0c3VpdGUvCiAgICAgICAgICAgIFBSIHRhcmdldC85Njg4OQogICAgICAgICAgICAqIGpp dC5kZy9hbGwtbm9uLWZhaWxpbmctdGVzdHMuaDogQWRkIHRlc3QtcmVmbGVjdGlvbi5jLgogICAg ICAgICAgICAqIGppdC5kZy90ZXN0LXJlZmxlY3Rpb24uYzogTmV3IHRlc3QuCi0tLQogZ2NjL2pp dC9kb2NzL3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdCAgICAgICAgfCAgNDMgKysrLQogZ2NjL2pp dC9kb2NzL3RvcGljcy9mdW5jdGlvbnMucnN0ICAgICAgICAgICAgfCAgMjYgKysKIGdjYy9qaXQv ZG9jcy90b3BpY3MvdHlwZXMucnN0ICAgICAgICAgICAgICAgIHwgMTIyICsrKysrKysrKwogZ2Nj L2ppdC9qaXQtcmVjb3JkaW5nLmggICAgICAgICAgICAgICAgICAgICAgfCAgIDcgKwogZ2NjL2pp dC9saWJnY2NqaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNTYgKysrKysrKysrKysr KysrKysrKwogZ2NjL2ppdC9saWJnY2NqaXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ODkgKysrKysrKwogZ2NjL2ppdC9saWJnY2NqaXQubWFwICAgICAgICAgICAgICAgICAgICAgICAg fCAgMjEgKysKIGdjYy90ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oIHwg IDEwICsKIGdjYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3QtcmVmbGVjdGlvbi5jICAgICAgIHwgIDk1 ICsrKysrKysKIDkgZmlsZXMgY2hhbmdlZCwgNjY4IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24o LSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0LXJlZmxlY3Rp b24uYwoKZGlmZiAtLWdpdCBhL2djYy9qaXQvZG9jcy90b3BpY3MvY29tcGF0aWJpbGl0eS5yc3Qg Yi9nY2Mvaml0L2RvY3MvdG9waWNzL2NvbXBhdGliaWxpdHkucnN0CmluZGV4IDIzOWI2YWExYTky Li5jZWM0MGNhNTA4YyAxMDA2NDQKLS0tIGEvZ2NjL2ppdC9kb2NzL3RvcGljcy9jb21wYXRpYmls aXR5LnJzdAorKysgYi9nY2Mvaml0L2RvY3MvdG9waWNzL2NvbXBhdGliaWxpdHkucnN0CkBAIC0y MzAsNyArMjMwLDcgQEAgZW50cnlwb2ludHM6CiAuLiBfTElCR0NDSklUX0FCSV8xNToKIAogYGBM SUJHQ0NKSVRfQUJJXzE1YGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0t LS0tLS0tLQogYGBMSUJHQ0NKSVRfQUJJXzE1YGAgY292ZXJzIHRoZSBhZGRpdGlvbiBvZiBBUEkg ZW50cnlwb2ludHMgZm9yIGRpcmVjdGx5CiBlbWJlZGRpbmcgYXNzZW1ibGVyIGluc3RydWN0aW9u czoKIApAQCAtMjQzLDMgKzI0Myw0NCBAQCBlbWJlZGRpbmcgYXNzZW1ibGVyIGluc3RydWN0aW9u czoKICAgKiA6ZnVuYzpgZ2NjX2ppdF9leHRlbmRlZF9hc21fYWRkX2lucHV0X29wZXJhbmRgCiAg ICogOmZ1bmM6YGdjY19qaXRfZXh0ZW5kZWRfYXNtX2FkZF9jbG9iYmVyYAogICAqIDpmdW5jOmBn Y2Nfaml0X2NvbnRleHRfYWRkX3RvcF9sZXZlbF9hc21gCisKKy4uIF9MSUJHQ0NKSVRfQUJJXzE2 OgorCitgYExJQkdDQ0pJVF9BQklfMTZgYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2BgTElCR0ND SklUX0FCSV8xNmBgIGNvdmVycyB0aGUgYWRkaXRpb24gb2YgcmVmbGVjdGlvbiBmdW5jdGlvbnMg dmlhIEFQSQorZW50cnlwb2ludHM6CisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9mdW5jdGlvbl9nZXRf cmV0dXJuX3R5cGVgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcGFyYW1fY291 bnRgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF90eXBlX2lzX2FycmF5YAorCisgICogOmZ1bmM6YGdj Y19qaXRfdHlwZV9pc19ib29sYAorCisgICogOmZ1bmM6YGdjY19qaXRfdHlwZV9pc19pbnRlZ3Jh bGAKKworICAqIDpmdW5jOmBnY2Nfaml0X3R5cGVfaXNfcG9pbnRlcmAKKworICAqIDpmdW5jOmBn Y2Nfaml0X3R5cGVfaXNfc3RydWN0YAorCisgICogOmZ1bmM6YGdjY19qaXRfdHlwZV9pc192ZWN0 b3JgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF90eXBlX3VucXVhbGlmaWVkYAorCisgICogOmZ1bmM6 YGdjY19qaXRfdHlwZV9pc19mdW5jdGlvbl9wdHJfdHlwZWAKKworICAqIDpmdW5jOmBnY2Nfaml0 X2Z1bmN0aW9uX3R5cGVfZ2V0X3JldHVybl90eXBlYAorCisgICogOmZ1bmM6YGdjY19qaXRfZnVu Y3Rpb25fdHlwZV9nZXRfcGFyYW1fY291bnRgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9mdW5jdGlv bl90eXBlX2dldF9wYXJhbV90eXBlYAorCisgICogOmZ1bmM6YGdjY19qaXRfdmVjdG9yX3R5cGVf Z2V0X251bV91bml0c2AKKworICAqIDpmdW5jOmBnY2Nfaml0X3ZlY3Rvcl90eXBlX2dldF9lbGVt ZW50X3R5cGVgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkYAorCisgICog OmZ1bmM6YGdjY19qaXRfc3RydWN0X2dldF9maWVsZF9jb3VudGAKZGlmZiAtLWdpdCBhL2djYy9q aXQvZG9jcy90b3BpY3MvZnVuY3Rpb25zLnJzdCBiL2djYy9qaXQvZG9jcy90b3BpY3MvZnVuY3Rp b25zLnJzdAppbmRleCBiMmQ5MjM5YWEwYS4uMWQyMGUzMDQ1YTAgMTAwNjQ0Ci0tLSBhL2djYy9q aXQvZG9jcy90b3BpY3MvZnVuY3Rpb25zLnJzdAorKysgYi9nY2Mvaml0L2RvY3MvdG9waWNzL2Z1 bmN0aW9ucy5yc3QKQEAgLTE3MSw2ICsxNzEsMzIgQEAgRnVuY3Rpb25zCiAgICB1bmRlcmx5aW5n IHN0cmluZywgc28gaXQgaXMgdmFsaWQgdG8gcGFzcyBpbiBhIHBvaW50ZXIgdG8gYW4gb24tc3Rh Y2sKICAgIGJ1ZmZlci4KIAorLi4gZnVuY3Rpb246OiAgc2l6ZV90IFwKKyAgICAgICAgICAgICAg IGdjY19qaXRfZnVuY3Rpb25fZ2V0X3BhcmFtX2NvdW50IChnY2Nfaml0X2Z1bmN0aW9uICpmdW5j KQorCisgICBHZXQgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbi4KKwor Li4gZnVuY3Rpb246OiAgZ2NjX2ppdF90eXBlICpcCisgICAgICAgICAgICAgICBnY2Nfaml0X2Z1 bmN0aW9uX2dldF9yZXR1cm5fdHlwZSAoZ2NjX2ppdF9mdW5jdGlvbiAqZnVuYykKKworICAgR2V0 IHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24uCisKKyAgIFRoZSBBUEkgZW50cnlwb2lu dHMgcmVsYXRpbmcgdG8gZ2V0dGluZyBpbmZvIGFib3V0IHBhcmFtZXRlcnMgYW5kIHJldHVybgor ICAgdHlwZXM6CisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcmV0dXJu X3R5cGVgCisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcGFyYW1fY291 bnRgCisKKyAgIHdlcmUgYWRkZWQgaW4gOnJlZjpgTElCR0NDSklUX0FCSV8xNWA7IHlvdSBjYW4g dGVzdCBmb3IgdGhlaXIgcHJlc2VuY2UKKyAgIHVzaW5nCisKKyAgIC4uIGNvZGUtYmxvY2s6OiBj CisKKyAgICAgICNpZmRlZiBMSUJHQ0NKSVRfSEFWRV9SRUZMRUNUSU9OCisKKyAgIC4uIHR5cGU6 OiBnY2Nfaml0X2Nhc2UKKwogQmxvY2tzCiAtLS0tLS0KIC4uIHR5cGU6OiBnY2Nfaml0X2Jsb2Nr CmRpZmYgLS1naXQgYS9nY2Mvaml0L2RvY3MvdG9waWNzL3R5cGVzLnJzdCBiL2djYy9qaXQvZG9j cy90b3BpY3MvdHlwZXMucnN0CmluZGV4IDgzMWYxMWI2NzlhLi4xYzkzZDYzOGExMCAxMDA2NDQK LS0tIGEvZ2NjL2ppdC9kb2NzL3RvcGljcy90eXBlcy5yc3QKKysrIGIvZ2NjL2ppdC9kb2NzL3Rv cGljcy90eXBlcy5yc3QKQEAgLTM0NSwzICszNDUsMTI1IEBAIEZ1bmN0aW9uIHBvaW50ZXIgdHlw ZXMKIAogRnVuY3Rpb24gcG9pbnRlciB0eXBlcyBjYW4gYmUgY3JlYXRlZCB1c2luZwogOmM6ZnVu YzpgZ2NjX2ppdF9jb250ZXh0X25ld19mdW5jdGlvbl9wdHJfdHlwZWAuCisKK1JlZmxlY3Rpb24g QVBJCistLS0tLS0tLS0tLS0tLQorCisuLiBmdW5jdGlvbjo6ICBnY2Nfaml0X3R5cGUgKlwKKyAg ICAgICAgICAgICAgIGdjY19qaXRfdHlwZV9keW5jYXN0X2FycmF5IChnY2Nfaml0X3R5cGUgKnR5 cGUpCisKKyAgICAgR2V0IHRoZSBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXkgdHlwZSBvciBOVUxM IGlmIGl0J3Mgbm90IGFuIGFycmF5LgorCisuLiBmdW5jdGlvbjo6ICBpbnRcCisgICAgICAgICAg ICAgICBnY2Nfaml0X3R5cGVfaXNfYm9vbCAoZ2NjX2ppdF90eXBlICp0eXBlKQorCisgICAgIFJl dHVybiBub24temVybyBpZiB0aGUgdHlwZSBpcyBhIGJvb2wuCisKKy4uIGZ1bmN0aW9uOjogIGdj Y19qaXRfZnVuY3Rpb25fdHlwZSAqXAorICAgICAgICAgICAgICAgZ2NjX2ppdF90eXBlX2R5bmNh c3RfZnVuY3Rpb25fcHRyX3R5cGUgKGdjY19qaXRfdHlwZSAqdHlwZSkKKworICAgICBSZXR1cm4g dGhlIGZ1bmN0aW9uIHR5cGUgaWYgaXQgaXMgb25lIG9yIE5VTEwuCisKKy4uIGZ1bmN0aW9uOjog IGdjY19qaXRfdHlwZSAqXAorICAgICAgICAgICAgICAgZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dl dF9yZXR1cm5fdHlwZSAoZ2NjX2ppdF9mdW5jdGlvbl90eXBlICpmdW5jdGlvbl90eXBlKQorCisg ICAgIEdpdmVuIGEgZnVuY3Rpb24gdHlwZSwgcmV0dXJuIGl0cyByZXR1cm4gdHlwZS4KKworLi4g ZnVuY3Rpb246OiAgc2l6ZV90XAorICAgICAgICAgICAgICAgZ2NjX2ppdF9mdW5jdGlvbl90eXBl X2dldF9wYXJhbV9jb3VudCAoZ2NjX2ppdF9mdW5jdGlvbl90eXBlICpmdW5jdGlvbl90eXBlKQor CisgICAgIEdpdmVuIGEgZnVuY3Rpb24gdHlwZSwgcmV0dXJuIGl0cyBudW1iZXIgb2YgcGFyYW1l dGVycy4KKworLi4gZnVuY3Rpb246OiAgZ2NjX2ppdF90eXBlICpcCisgICAgICAgICAgICAgICBn Y2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX3R5cGUgKGdjY19qaXRfZnVuY3Rpb25fdHlw ZSAqZnVuY3Rpb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc2l6ZV90IGluZGV4KQorCisgICAgIEdpdmVuIGEgZnVuY3Rpb24gdHlw ZSwgcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyLgorCisuLiBmdW5j dGlvbjo6ICBpbnRcCisgICAgICAgICAgICAgICBnY2Nfaml0X3R5cGVfaXNfaW50ZWdyYWwgKGdj Y19qaXRfdHlwZSAqdHlwZSkKKworICAgICBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHR5cGUgaXMg YW4gaW50ZWdyYWwuCisKKy4uIGZ1bmN0aW9uOjogIGdjY19qaXRfdHlwZSAqXAorICAgICAgICAg ICAgICAgZ2NjX2ppdF90eXBlX2lzX3BvaW50ZXIgKGdjY19qaXRfdHlwZSAqdHlwZSkKKworICAg ICBSZXR1cm4gdGhlIHR5cGUgcG9pbnRlZCBieSB0aGUgcG9pbnRlciB0eXBlIG9yIE5VTEwgaWYg aXQncyBub3QgYSBwb2ludGVyLgorCisuLiBmdW5jdGlvbjo6ICBnY2Nfaml0X3ZlY3Rvcl90eXBl ICpcCisgICAgICAgICAgICAgICBnY2Nfaml0X3R5cGVfZHluY2FzdF92ZWN0b3IgKGdjY19qaXRf dHlwZSAqdHlwZSkKKworICAgICBHaXZlbiBhIHR5cGUsIHJldHVybiBhIGR5bmFtaWMgY2FzdCB0 byBhIHZlY3RvciB0eXBlIG9yIE5VTEwuCisKKy4uIGZ1bmN0aW9uOjogIGdjY19qaXRfc3RydWN0 ICpcCisgICAgICAgICAgICAgICBnY2Nfaml0X3R5cGVfaXNfc3RydWN0IChnY2Nfaml0X3R5cGUg KnR5cGUpCisKKyAgICAgR2l2ZW4gYSB0eXBlLCByZXR1cm4gYSBkeW5hbWljIGNhc3QgdG8gYSBz dHJ1Y3QgdHlwZSBvciBOVUxMLgorCisuLiBmdW5jdGlvbjo6ICBzaXplX3RcCisgICAgICAgICAg ICAgICBnY2Nfaml0X3ZlY3Rvcl90eXBlX2dldF9udW1fdW5pdHMgKGdjY19qaXRfdmVjdG9yX3R5 cGUgKnZlY3Rvcl90eXBlKQorCisgICAgIEdpdmVuIGEgdmVjdG9yIHR5cGUsIHJldHVybiB0aGUg bnVtYmVyIG9mIHVuaXRzIGl0IGNvbnRhaW5zLgorCisuLiBmdW5jdGlvbjo6ICBnY2Nfaml0X3R5 cGUgKlwKKyAgICAgICAgICAgICAgIGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X2VsZW1lbnRfdHlw ZSAoZ2NjX2ppdF92ZWN0b3JfdHlwZSAqIHZlY3Rvcl90eXBlKQorCisgICAgIEdpdmVuIGEgdmVj dG9yIHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZiBpdHMgZWxlbWVudHMuCisKKy4uIGZ1bmN0aW9u OjogIGdjY19qaXRfdHlwZSAqXAorICAgICAgICAgICAgICAgZ2NjX2ppdF90eXBlX3VucXVhbGlm aWVkIChnY2Nfaml0X3R5cGUgKnR5cGUpCisKKyAgICAgR2l2ZW4gYSB0eXBlLCByZXR1cm4gdGhl IHVucXVhbGlmaWVkIHR5cGUsIHJlbW92aW5nICJjb25zdCIsICJ2b2xhdGlsZSIgYW5kCisgICAg IGFsaWdubWVudCBxdWFsaWZpZXJzLgorCisuLiBmdW5jdGlvbjo6ICBnY2Nfaml0X2ZpZWxkICpc CisgICAgICAgICAgICAgICBnY2Nfaml0X3N0cnVjdF9nZXRfZmllbGQgKGdjY19qaXRfc3RydWN0 ICpzdHJ1Y3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c2l6ZV90IGluZGV4KQorCisgICAgIEdldCBhIHN0cnVjdCBmaWVsZCBieSBpbmRleC4KKworLi4g ZnVuY3Rpb246OiAgc2l6ZV90XAorICAgICAgICAgICAgICAgZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2Zp ZWxkX2NvdW50IChnY2Nfaml0X3N0cnVjdCAqc3RydWN0X3R5cGUpCisKKyAgICAgR2V0IHRoZSBu dW1iZXIgb2YgZmllbGRzIGluIHRoZSBzdHJ1Y3QuCisKKyAgIFRoZSBBUEkgZW50cnlwb2ludHMg cmVsYXRlZCB0byB0aGUgcmVmbGVjdGlvbiBBUEk6CisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2pp dF9mdW5jdGlvbl90eXBlX2dldF9yZXR1cm5fdHlwZWAKKworICAgICAgKiA6YzpmdW5jOmBnY2Nf aml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX2NvdW50YAorCisgICAgICAqIDpjOmZ1bmM6YGdj Y19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcGFyYW1fdHlwZWAKKworICAgICAgKiA6YzpmdW5jOmBn Y2Nfaml0X3R5cGVfdW5xdWFsaWZpZWRgCisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2ppdF90eXBl X2R5bmNhc3RfYXJyYXlgCisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2ppdF90eXBlX2lzX2Jvb2xg CisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2ppdF90eXBlX2R5bmNhc3RfZnVuY3Rpb25fcHRyX3R5 cGVgCisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2ppdF90eXBlX2lzX2ludGVncmFsYAorCisgICAg ICAqIDpjOmZ1bmM6YGdjY19qaXRfdHlwZV9pc19wb2ludGVyYAorCisgICAgICAqIDpjOmZ1bmM6 YGdjY19qaXRfdHlwZV9keW5jYXN0X3ZlY3RvcmAKKworICAgICAgKiA6YzpmdW5jOmBnY2Nfaml0 X3ZlY3Rvcl90eXBlX2dldF9lbGVtZW50X3R5cGVgCisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2pp dF92ZWN0b3JfdHlwZV9nZXRfbnVtX3VuaXRzYAorCisgICAgICAqIDpjOmZ1bmM6YGdjY19qaXRf c3RydWN0X2dldF9maWVsZGAKKworICAgICAgKiA6YzpmdW5jOmBnY2Nfaml0X3R5cGVfaXNfc3Ry dWN0YAorCisgICAgICAqIDpjOmZ1bmM6YGdjY19qaXRfc3RydWN0X2dldF9maWVsZF9jb3VudGAK KworICAgd2VyZSBhZGRlZCBpbiA6cmVmOmBMSUJHQ0NKSVRfQUJJXzE1YDsgeW91IGNhbiB0ZXN0 IGZvciB0aGVpciBwcmVzZW5jZQorICAgdXNpbmcKKworICAgLi4gY29kZS1ibG9jazo6IGMKKwor ICAgICAgI2lmZGVmIExJQkdDQ0pJVF9IQVZFX1JFRkxFQ1RJT04KKworICAgLi4gdHlwZTo6IGdj Y19qaXRfY2FzZQpkaWZmIC0tZ2l0IGEvZ2NjL2ppdC9qaXQtcmVjb3JkaW5nLmggYi9nY2Mvaml0 L2ppdC1yZWNvcmRpbmcuaAppbmRleCAwM2ZhMTE2MGNmMC4uNGE5OTRmZTcwOTQgMTAwNjQ0Ci0t LSBhL2djYy9qaXQvaml0LXJlY29yZGluZy5oCisrKyBiL2djYy9qaXQvaml0LXJlY29yZGluZy5o CkBAIC01NDYsNyArNTQ2LDkgQEAgcHVibGljOgogICB2aXJ0dWFsIGJvb2wgaXNfYm9vbCAoKSBj b25zdCA9IDA7CiAgIHZpcnR1YWwgdHlwZSAqaXNfcG9pbnRlciAoKSA9IDA7CiAgIHZpcnR1YWwg dHlwZSAqaXNfYXJyYXkgKCkgPSAwOworICB2aXJ0dWFsIHN0cnVjdF8gKmlzX3N0cnVjdCAoKSB7 IHJldHVybiBOVUxMOyB9CiAgIHZpcnR1YWwgYm9vbCBpc192b2lkICgpIGNvbnN0IHsgcmV0dXJu IGZhbHNlOyB9CisgIHZpcnR1YWwgdmVjdG9yX3R5cGUgKmlzX3ZlY3RvciAoKSB7IHJldHVybiBO VUxMOyB9CiAgIHZpcnR1YWwgYm9vbCBoYXNfa25vd25fc2l6ZSAoKSBjb25zdCB7IHJldHVybiB0 cnVlOyB9CiAKICAgYm9vbCBpc19udW1lcmljICgpIGNvbnN0CkBAIC02NjMsNiArNjY1LDcgQEAg cHVibGljOgogICBib29sIGlzX2Jvb2wgKCkgY29uc3QgRklOQUwgT1ZFUlJJREUgeyByZXR1cm4g bV9vdGhlcl90eXBlLT5pc19ib29sICgpOyB9CiAgIHR5cGUgKmlzX3BvaW50ZXIgKCkgRklOQUwg T1ZFUlJJREUgeyByZXR1cm4gbV9vdGhlcl90eXBlLT5pc19wb2ludGVyICgpOyB9CiAgIHR5cGUg KmlzX2FycmF5ICgpIEZJTkFMIE9WRVJSSURFIHsgcmV0dXJuIG1fb3RoZXJfdHlwZS0+aXNfYXJy YXkgKCk7IH0KKyAgc3RydWN0XyAqaXNfc3RydWN0ICgpIEZJTkFMIE9WRVJSSURFIHsgcmV0dXJu IG1fb3RoZXJfdHlwZS0+aXNfc3RydWN0ICgpOyB9CiAKIHByb3RlY3RlZDoKICAgdHlwZSAqbV9v dGhlcl90eXBlOwpAQCAtNzQ1LDYgKzc0OCw4IEBAIHB1YmxpYzoKIAogICB2b2lkIHJlcGxheV9p bnRvIChyZXBsYXllciAqKSBGSU5BTCBPVkVSUklERTsKIAorICB2ZWN0b3JfdHlwZSAqaXNfdmVj dG9yICgpIEZJTkFMIE9WRVJSSURFIHsgcmV0dXJuIHRoaXM7IH0KKwogcHJpdmF0ZToKICAgc3Ry aW5nICogbWFrZV9kZWJ1Z19zdHJpbmcgKCkgRklOQUwgT1ZFUlJJREU7CiAgIHZvaWQgd3JpdGVf cmVwcm9kdWNlciAocmVwcm9kdWNlciAmcikgRklOQUwgT1ZFUlJJREU7CkBAIC05NTEsNiArOTU2 LDggQEAgcHVibGljOgogCiAgIGNvbnN0IGNoYXIgKmFjY2Vzc19hc190eXBlIChyZXByb2R1Y2Vy ICZyKSBGSU5BTCBPVkVSUklERTsKIAorICBzdHJ1Y3RfICppc19zdHJ1Y3QgKCkgRklOQUwgT1ZF UlJJREUgeyByZXR1cm4gdGhpczsgfQorCiBwcml2YXRlOgogICBzdHJpbmcgKiBtYWtlX2RlYnVn X3N0cmluZyAoKSBGSU5BTCBPVkVSUklERTsKICAgdm9pZCB3cml0ZV9yZXByb2R1Y2VyIChyZXBy b2R1Y2VyICZyKSBGSU5BTCBPVkVSUklERTsKZGlmZiAtLWdpdCBhL2djYy9qaXQvbGliZ2Njaml0 LmMgYi9nY2Mvaml0L2xpYmdjY2ppdC5jCmluZGV4IDBjYzY1MGY5ODEwLi4xZWZjYWJkNDE0MSAx MDA2NDQKLS0tIGEvZ2NjL2ppdC9saWJnY2NqaXQuYworKysgYi9nY2Mvaml0L2xpYmdjY2ppdC5j CkBAIC02MCw2ICs2MCwxNCBAQCBzdHJ1Y3QgZ2NjX2ppdF9zdHJ1Y3QgOiBwdWJsaWMgZ2NjOjpq aXQ6OnJlY29yZGluZzo6c3RydWN0XwogewogfTsKIAorc3RydWN0IGdjY19qaXRfZnVuY3Rpb25f dHlwZSA6IHB1YmxpYyBnY2M6OmppdDo6cmVjb3JkaW5nOjpmdW5jdGlvbl90eXBlCit7Cit9Owor CitzdHJ1Y3QgZ2NjX2ppdF92ZWN0b3JfdHlwZSA6IHB1YmxpYyBnY2M6OmppdDo6cmVjb3JkaW5n Ojp2ZWN0b3JfdHlwZQoreworfTsKKwogc3RydWN0IGdjY19qaXRfZmllbGQgOiBwdWJsaWMgZ2Nj OjpqaXQ6OnJlY29yZGluZzo6ZmllbGQKIHsKIH07CkBAIC01MTUsNiArNTIzLDE5NCBAQCBnY2Nf aml0X3R5cGVfZ2V0X3ZvbGF0aWxlIChnY2Nfaml0X3R5cGUgKnR5cGUpCiAgIHJldHVybiAoZ2Nj X2ppdF90eXBlICopdHlwZS0+Z2V0X3ZvbGF0aWxlICgpOwogfQogCisvKiBQdWJsaWMgZW50cnlw b2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3It Y2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNv cmRpbmc6OnR5cGU6OmlzX2FycmF5IG1ldGhvZCwgaW4KKyAgIGppdC1yZWNvcmRpbmcuYy4gICov CisKK2djY19qaXRfdHlwZSAqCitnY2Nfaml0X3R5cGVfZHluY2FzdF9hcnJheSAoZ2NjX2ppdF90 eXBlICp0eXBlKQoreworICBSRVRVUk5fTlVMTF9JRl9GQUlMICh0eXBlLCBOVUxMLCBOVUxMLCAi TlVMTCB0eXBlIik7CisKKyAgcmV0dXJuIChnY2Nfaml0X3R5cGUgKil0eXBlLT5pc19hcnJheSAo KTsKK30KKworLyogUHVibGljIGVudHJ5cG9pbnQuICBTZWUgZGVzY3JpcHRpb24gaW4gbGliZ2Nj aml0LmguCisKKyAgIEFmdGVyIGVycm9yLWNoZWNraW5nLCB0aGUgcmVhbCB3b3JrIGlzIGRvbmUg YnkgdGhlCisgICBnY2M6OmppdDo6cmVjb3JkaW5nOjp0eXBlOjppc19ib29sIG1ldGhvZCwgaW4K KyAgIGppdC1yZWNvcmRpbmcuYy4gICovCisKK2ludAorZ2NjX2ppdF90eXBlX2lzX2Jvb2wgKGdj Y19qaXRfdHlwZSAqdHlwZSkKK3sKKyAgUkVUVVJOX1ZBTF9JRl9GQUlMICh0eXBlLCBGQUxTRSwg TlVMTCwgTlVMTCwgIk5VTEwgdHlwZSIpOworCisgIHJldHVybiB0eXBlLT5pc19ib29sICgpOwor fQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQu aC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0 aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OnR5cGU6OmlzX3BvaW50ZXIgbWV0aG9kLCBpbgor ICAgaml0LXJlY29yZGluZy5jLiAgKi8KKworZ2NjX2ppdF90eXBlICoKK2djY19qaXRfdHlwZV9p c19wb2ludGVyIChnY2Nfaml0X3R5cGUgKnR5cGUpCit7CisgIFJFVFVSTl9OVUxMX0lGX0ZBSUwg KHR5cGUsIE5VTEwsIE5VTEwsICJOVUxMIHR5cGUiKTsKKworICByZXR1cm4gKGdjY19qaXRfdHlw ZSAqKXR5cGUtPmlzX3BvaW50ZXIgKCk7Cit9CisKKy8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2Vl IGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisgICBBZnRlciBlcnJvci1jaGVja2luZywg dGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6dHlw ZTo6aXNfaW50IG1ldGhvZCwgaW4KKyAgIGppdC1yZWNvcmRpbmcuYy4gICovCisKK2ludAorZ2Nj X2ppdF90eXBlX2lzX2ludGVncmFsIChnY2Nfaml0X3R5cGUgKnR5cGUpCit7CisgIFJFVFVSTl9W QUxfSUZfRkFJTCAodHlwZSwgRkFMU0UsIE5VTEwsIE5VTEwsICJOVUxMIHR5cGUiKTsKKworICBy ZXR1cm4gdHlwZS0+aXNfaW50ICgpOworfQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBk ZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRo ZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OnR5cGU6 OmlzX3ZlY3RvciBtZXRob2QsIGluCisgICBqaXQtcmVjb3JkaW5nLmMuICAqLworCitnY2Nfaml0 X3ZlY3Rvcl90eXBlICoKK2djY19qaXRfdHlwZV9keW5jYXN0X3ZlY3RvciAoZ2NjX2ppdF90eXBl ICp0eXBlKQoreworICBSRVRVUk5fTlVMTF9JRl9GQUlMICh0eXBlLCBOVUxMLCBOVUxMLCAiTlVM TCB0eXBlIik7CisgIGdjYzo6aml0OjpyZWNvcmRpbmc6OnZlY3Rvcl90eXBlICp2ZWN0b3JfdHlw ZSA9IHR5cGUtPmlzX3ZlY3RvciAoKTsKKyAgcmV0dXJuIChnY2Nfaml0X3ZlY3Rvcl90eXBlICop dmVjdG9yX3R5cGU7Cit9CisKKy8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9u IGluIGxpYmdjY2ppdC5oLgorCisgICBBZnRlciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwgd29y ayBpcyBkb25lIGJ5IHRoZQorICAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6dHlwZTo6aXNfc3RydWN0 IG1ldGhvZCwgaW4KKyAgIGppdC1yZWNvcmRpbmcuYy4gICovCisKK2djY19qaXRfc3RydWN0ICoK K2djY19qaXRfdHlwZV9pc19zdHJ1Y3QgKGdjY19qaXRfdHlwZSAqdHlwZSkKK3sKKyAgUkVUVVJO X05VTExfSUZfRkFJTCAodHlwZSwgTlVMTCwgTlVMTCwgIk5VTEwgdHlwZSIpOworICBnY2M6Ompp dDo6cmVjb3JkaW5nOjpzdHJ1Y3RfICpzdHJ1Y3RfdHlwZSA9IHR5cGUtPmlzX3N0cnVjdCAoKTsK KyAgcmV0dXJuIChnY2Nfaml0X3N0cnVjdCAqKXN0cnVjdF90eXBlOworfQorCisvKiBQdWJsaWMg ZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIg ZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0 OjpyZWNvcmRpbmc6OnZlY3Rvcl90eXBlOjpnZXRfbnVtX3VuaXRzIG1ldGhvZCwgaW4KKyAgIGpp dC1yZWNvcmRpbmcuYy4gICovCisKK3NpemVfdAorZ2NjX2ppdF92ZWN0b3JfdHlwZV9nZXRfbnVt X3VuaXRzIChnY2Nfaml0X3ZlY3Rvcl90eXBlICp2ZWN0b3JfdHlwZSkKK3sKKyAgUkVUVVJOX1ZB TF9JRl9GQUlMICh2ZWN0b3JfdHlwZSwgMCwgTlVMTCwgTlVMTCwgIk5VTEwgdmVjdG9yX3R5cGUi KTsKKyAgcmV0dXJuIHZlY3Rvcl90eXBlLT5nZXRfbnVtX3VuaXRzICgpOworfQorCisvKiBQdWJs aWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0 ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6 aml0OjpyZWNvcmRpbmc6OnZlY3Rvcl90eXBlOjpnZXRfZWxlbWVudF90eXBlIG1ldGhvZCwgaW4K KyAgIGppdC1yZWNvcmRpbmcuYy4gICovCisKK2djY19qaXRfdHlwZSAqCitnY2Nfaml0X3ZlY3Rv cl90eXBlX2dldF9lbGVtZW50X3R5cGUgKGdjY19qaXRfdmVjdG9yX3R5cGUgKnZlY3Rvcl90eXBl KQoreworICBSRVRVUk5fTlVMTF9JRl9GQUlMICh2ZWN0b3JfdHlwZSwgTlVMTCwgTlVMTCwgIk5V TEwgdmVjdG9yX3R5cGUiKTsKKyAgcmV0dXJuIChnY2Nfaml0X3R5cGUgKil2ZWN0b3JfdHlwZS0+ Z2V0X2VsZW1lbnRfdHlwZSAoKTsKK30KKworLyogUHVibGljIGVudHJ5cG9pbnQuICBTZWUgZGVz Y3JpcHRpb24gaW4gbGliZ2Njaml0LmguCisKKyAgIEFmdGVyIGVycm9yLWNoZWNraW5nLCB0aGUg cmVhbCB3b3JrIGlzIGRvbmUgYnkgdGhlCisgICBnY2M6OmppdDo6cmVjb3JkaW5nOjp0eXBlOjp1 bnF1YWxpZmllZCBtZXRob2QsIGluCisgICBqaXQtcmVjb3JkaW5nLmMuICAqLworCitnY2Nfaml0 X3R5cGUgKgorZ2NjX2ppdF90eXBlX3VucXVhbGlmaWVkIChnY2Nfaml0X3R5cGUgKnR5cGUpCit7 CisgIFJFVFVSTl9OVUxMX0lGX0ZBSUwgKHR5cGUsIE5VTEwsIE5VTEwsICJOVUxMIHR5cGUiKTsK KworICByZXR1cm4gKGdjY19qaXRfdHlwZSAqKXR5cGUtPnVucXVhbGlmaWVkICgpOworfQorCisv KiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKwor ICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAg IGdjYzo6aml0OjpyZWNvcmRpbmc6OnR5cGU6OmR5bl9jYXN0X2Z1bmN0aW9uX3R5cGUgbWV0aG9k LCBpbgorICAgaml0LXJlY29yZGluZy5jLiAgKi8KKworZ2NjX2ppdF9mdW5jdGlvbl90eXBlICoK K2djY19qaXRfdHlwZV9keW5jYXN0X2Z1bmN0aW9uX3B0cl90eXBlIChnY2Nfaml0X3R5cGUgKnR5 cGUpCit7CisgIFJFVFVSTl9OVUxMX0lGX0ZBSUwgKHR5cGUsIE5VTEwsIE5VTEwsICJOVUxMIHR5 cGUiKTsKKyAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6dHlwZSAqZnVuY19wdHJfdHlwZSA9IHR5cGUt PmRlcmVmZXJlbmNlICgpOworICBSRVRVUk5fTlVMTF9JRl9GQUlMIChmdW5jX3B0cl90eXBlLCBO VUxMLCBOVUxMLCAiTlVMTCB0eXBlIik7CisKKyAgcmV0dXJuIChnY2Nfaml0X2Z1bmN0aW9uX3R5 cGUgKilmdW5jX3B0cl90eXBlLT5keW5fY2FzdF9mdW5jdGlvbl90eXBlICgpOworfQorCisvKiBQ dWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAg QWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdj Yzo6aml0OjpyZWNvcmRpbmc6OmZ1bmN0aW9uX3R5cGU6OmdldF9yZXR1cm5fdHlwZSBtZXRob2Qs IGluCisgICBqaXQtcmVjb3JkaW5nLmMuICAqLworCitnY2Nfaml0X3R5cGUgKgorZ2NjX2ppdF9m dW5jdGlvbl90eXBlX2dldF9yZXR1cm5fdHlwZSAoZ2NjX2ppdF9mdW5jdGlvbl90eXBlICpmdW5j dGlvbl90eXBlKQoreworICBSRVRVUk5fTlVMTF9JRl9GQUlMIChmdW5jdGlvbl90eXBlLCBOVUxM LCBOVUxMLCAiTlVMTCBmdW5jdGlvbl90eXBlIik7CisgIHJldHVybiAoZ2NjX2ppdF90eXBlICop ZnVuY3Rpb25fdHlwZS0+Z2V0X3JldHVybl90eXBlICgpOworfQorCisvKiBQdWJsaWMgZW50cnlw b2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3It Y2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNv cmRpbmc6OmZ1bmN0aW9uX3R5cGU6OmdldF9wYXJhbV90eXBlcyBtZXRob2QsIGluCisgICBqaXQt cmVjb3JkaW5nLmMuICAqLworCitzaXplX3QKK2djY19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcGFy YW1fY291bnQgKGdjY19qaXRfZnVuY3Rpb25fdHlwZSAqZnVuY3Rpb25fdHlwZSkKK3sKKyAgUkVU VVJOX1ZBTF9JRl9GQUlMIChmdW5jdGlvbl90eXBlLCAwLCBOVUxMLCBOVUxMLCAiTlVMTCBmdW5j dGlvbl90eXBlIik7CisgIHJldHVybiBmdW5jdGlvbl90eXBlLT5nZXRfcGFyYW1fdHlwZXMgKCku bGVuZ3RoICgpOworfQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBp biBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsg aXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OmZ1bmN0aW9uX3R5cGU6Omdl dF9wYXJhbV90eXBlcyBtZXRob2QsIGluCisgICBqaXQtcmVjb3JkaW5nLmMuICAqLworCitnY2Nf aml0X3R5cGUgKgorZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dldF9wYXJhbV90eXBlIChnY2Nfaml0 X2Z1bmN0aW9uX3R5cGUgKmZ1bmN0aW9uX3R5cGUsCisJCQkJc2l6ZV90IGluZGV4KQoreworICBS RVRVUk5fTlVMTF9JRl9GQUlMIChmdW5jdGlvbl90eXBlLCBOVUxMLCBOVUxMLCAiTlVMTCBmdW5j dGlvbl90eXBlIik7CisgIHNpemVfdCBudW1fcGFyYW1zID0gZnVuY3Rpb25fdHlwZS0+Z2V0X3Bh cmFtX3R5cGVzICgpLmxlbmd0aCAoKTsKKyAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6Y29udGV4dCAq Y3R4dCA9IGZ1bmN0aW9uX3R5cGUtPm1fY3R4dDsKKyAgUkVUVVJOX05VTExfSUZfRkFJTF9QUklO VEYzIChpbmRleCA8IG51bV9wYXJhbXMsCisJCQkgICAgICAgY3R4dCwgTlVMTCwKKwkJCSAgICAg ICAiaW5kZXggb2YgJWxkIGlzIHRvbyBsYXJnZSAoJXMgaGFzICVsZCBwYXJhbXMpIiwKKwkJCSAg ICAgICBpbmRleCwKKwkJCSAgICAgICBmdW5jdGlvbl90eXBlLT5nZXRfZGVidWdfc3RyaW5nICgp LAorCQkJICAgICAgIG51bV9wYXJhbXMpOworICByZXR1cm4gKGdjY19qaXRfdHlwZSAqKWZ1bmN0 aW9uX3R5cGUtPmdldF9wYXJhbV90eXBlcyAoKVtpbmRleF07Cit9CisKIC8qIFB1YmxpYyBlbnRy eXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgogCiAgICBBZnRlciBlcnJv ci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQpAQCAtNzM2LDYgKzkzMiwz NyBAQCBnY2Nfaml0X3N0cnVjdF9zZXRfZmllbGRzIChnY2Nfaml0X3N0cnVjdCAqc3RydWN0X3R5 cGUsCiAJCQkgICAoZ2NjOjpqaXQ6OnJlY29yZGluZzo6ZmllbGQgKiopZmllbGRzKTsKIH0KIAor CisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4K KworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUK KyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OmZpZWxkczo6Z2V0X2ZpZWxkIG1ldGhvZCBpbgorICAg aml0LXJlY29yZGluZy5jLiAgKi8KK2V4dGVybiBnY2Nfaml0X2ZpZWxkICoKK2djY19qaXRfc3Ry dWN0X2dldF9maWVsZCAoZ2NjX2ppdF9zdHJ1Y3QgKnN0cnVjdF90eXBlLAorCQkJICAgc2l6ZV90 IGluZGV4KQoreworICBSRVRVUk5fTlVMTF9JRl9GQUlMIChzdHJ1Y3RfdHlwZSwgTlVMTCwgTlVM TCwgIk5VTEwgc3RydWN0IHR5cGUiKTsKKyAgUkVUVVJOX05VTExfSUZfRkFJTCAoc3RydWN0X3R5 cGUtPmdldF9maWVsZHMgKCksIE5VTEwsIE5VTEwsCisJCQkJIk5VTEwgc3RydWN0IGZpZWxkcyIp OworICBSRVRVUk5fTlVMTF9JRl9GQUlMICgoaW50KSBpbmRleCA8IHN0cnVjdF90eXBlLT5nZXRf ZmllbGRzICgpLT5sZW5ndGggKCksCisJCQkJTlVMTCwgTlVMTCwgIk5VTEwgc3RydWN0IHR5cGUi KTsKKyAgcmV0dXJuIChnY2Nfaml0X2ZpZWxkICopc3RydWN0X3R5cGUtPmdldF9maWVsZHMgKCkt PmdldF9maWVsZCAoaW5kZXgpOworfQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNj cmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoaXMg Y2FsbHMgdGhlIHRyaXZpYWwKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OnN0cnVjdF86OmdldF9m aWVsZHMgbWV0aG9kIGluCisgICBqaXQtcmVjb3JkaW5nLmguICAqLworCitzaXplX3QKK2djY19q aXRfc3RydWN0X2dldF9maWVsZF9jb3VudCAoZ2NjX2ppdF9zdHJ1Y3QgKnN0cnVjdF90eXBlKQor eworICBSRVRVUk5fVkFMX0lGX0ZBSUwgKHN0cnVjdF90eXBlLCAwLCBOVUxMLCBOVUxMLCAiTlVM TCBzdHJ1Y3QgdHlwZSIpOworICByZXR1cm4gc3RydWN0X3R5cGUtPmdldF9maWVsZHMgKCktPmxl bmd0aCAoKTsKK30KKwogLyogUHVibGljIGVudHJ5cG9pbnQuICBTZWUgZGVzY3JpcHRpb24gaW4g bGliZ2Njaml0LmguCiAKICAgIEFmdGVyIGVycm9yLWNoZWNraW5nLCB0aGUgcmVhbCB3b3JrIGlz IGRvbmUgYnkgdGhlCkBAIC0xMDE3LDYgKzEyNDQsMzUgQEAgZ2NjX2ppdF9mdW5jdGlvbl9nZXRf cGFyYW0gKGdjY19qaXRfZnVuY3Rpb24gKmZ1bmMsIGludCBpbmRleCkKICAgcmV0dXJuIHN0YXRp Y19jYXN0IDxnY2Nfaml0X3BhcmFtICo+IChmdW5jLT5nZXRfcGFyYW0gKGluZGV4KSk7CiB9CiAK Ky8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgor CisgICBBZnRlciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQor ICAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6ZnVuY3Rpb246OmdldF9wYXJhbXMgbWV0aG9kLCBpbgor ICAgaml0LXJlY29yZGluZy5oLgorICAqLworCitzaXplX3QKK2djY19qaXRfZnVuY3Rpb25fZ2V0 X3BhcmFtX2NvdW50IChnY2Nfaml0X2Z1bmN0aW9uICpmdW5jKQoreworICBSRVRVUk5fVkFMX0lG X0ZBSUwgKGZ1bmMsIDAsIE5VTEwsIE5VTEwsICJOVUxMIGZ1bmN0aW9uIik7CisgIGdjYzo6aml0 OjpyZWNvcmRpbmc6OmNvbnRleHQgKmN0eHQgPSBmdW5jLT5tX2N0eHQ7CisgIEpJVF9MT0dfRlVO QyAoY3R4dC0+Z2V0X2xvZ2dlciAoKSk7CisgIHJldHVybiBmdW5jLT5nZXRfcGFyYW1zICgpLmxl bmd0aCAoKTsKK30KKworLyogUHVibGljIGVudHJ5cG9pbnQuICBTZWUgZGVzY3JpcHRpb24gaW4g bGliZ2Njaml0LmguCisKKyAgIEFmdGVyIGVycm9yLWNoZWNraW5nLCB0aGUgcmVhbCB3b3JrIGlz IGRvbmUgYnkgdGhlCisgICBnY2M6OmppdDo6cmVjb3JkaW5nOjpmdW5jdGlvbjo6Z2V0X3JldHVy bl90eXBlIG1ldGhvZCwgaW4KKyAgIGppdC1yZWNvcmRpbmcuaC4gICovCisKK2djY19qaXRfdHlw ZSAqCitnY2Nfaml0X2Z1bmN0aW9uX2dldF9yZXR1cm5fdHlwZSAoZ2NjX2ppdF9mdW5jdGlvbiAq ZnVuYykKK3sKKyAgICBSRVRVUk5fTlVMTF9JRl9GQUlMIChmdW5jLCBOVUxMLCBOVUxMLCAiTlVM TCBmdW5jdGlvbl90eXBlIik7CisgICAgcmV0dXJuIChnY2Nfaml0X3R5cGUgKilmdW5jLT5nZXRf cmV0dXJuX3R5cGUgKCk7Cit9CisKIC8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0 aW9uIGluIGxpYmdjY2ppdC5oLgogCiAgICBBZnRlciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwg d29yayBpcyBkb25lIGJ5IHRoZQpkaWZmIC0tZ2l0IGEvZ2NjL2ppdC9saWJnY2NqaXQuaCBiL2dj Yy9qaXQvbGliZ2Njaml0LmgKaW5kZXggNWM3MjJjMmM1N2YuLjUwMjVkOTE4MDJhIDEwMDY0NAot LS0gYS9nY2Mvaml0L2xpYmdjY2ppdC5oCisrKyBiL2djYy9qaXQvbGliZ2Njaml0LmgKQEAgLTYx LDYgKzYxLDggQEAgdHlwZWRlZiBzdHJ1Y3QgZ2NjX2ppdF9yZXN1bHQgZ2NjX2ppdF9yZXN1bHQ7 CiAJICstIGdjY19qaXRfbG9jYXRpb24KIAkgKy0gZ2NjX2ppdF90eXBlCiAJICAgICstIGdjY19q aXRfc3RydWN0CisJICAgICstIGdjY19qaXRfZnVuY3Rpb25fdHlwZQorCSAgICArLSBnY2Nfaml0 X3ZlY3Rvcl90eXBlCiAJICstIGdjY19qaXRfZmllbGQKIAkgKy0gZ2NjX2ppdF9mdW5jdGlvbgog CSArLSBnY2Nfaml0X2Jsb2NrCkBAIC05Nyw2ICs5OSwxMiBAQCB0eXBlZGVmIHN0cnVjdCBnY2Nf aml0X2ZpZWxkIGdjY19qaXRfZmllbGQ7CiAgICB0aGUgbGF5b3V0IGZvciwgb3IgYW4gb3BhcXVl IHR5cGUuICAqLwogdHlwZWRlZiBzdHJ1Y3QgZ2NjX2ppdF9zdHJ1Y3QgZ2NjX2ppdF9zdHJ1Y3Q7 CiAKKy8qIEEgZ2NjX2ppdF9mdW5jdGlvbl90eXBlIGVuY2Fwc3VsYXRlcyBhIGZ1bmN0aW9uIHR5 cGUuICAqLwordHlwZWRlZiBzdHJ1Y3QgZ2NjX2ppdF9mdW5jdGlvbl90eXBlIGdjY19qaXRfZnVu Y3Rpb25fdHlwZTsKKworLyogQSBnY2Nfaml0X3ZlY3Rvcl90eXBlIGVuY2Fwc3VsYXRlcyBhIHZl Y3RvciB0eXBlLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjY19qaXRfdmVjdG9yX3R5cGUgZ2NjX2pp dF92ZWN0b3JfdHlwZTsKKwogLyogQSBnY2Nfaml0X2Z1bmN0aW9uIGVuY2Fwc3VsYXRlcyBhIGZ1 bmN0aW9uOiBlaXRoZXIgb25lIHRoYXQgeW91J3JlCiAgICBjcmVhdGluZyB5b3Vyc2VsZiwgb3Ig YSByZWZlcmVuY2UgdG8gb25lIHRoYXQgeW91J3JlIGR5bmFtaWNhbGx5CiAgICBsaW5raW5nIHRv IHdpdGhpbiB0aGUgcmVzdCBvZiB0aGUgcHJvY2Vzcy4gICovCkBAIC02NTQsNiArNjYyLDE1IEBA IGdjY19qaXRfc3RydWN0X3NldF9maWVsZHMgKGdjY19qaXRfc3RydWN0ICpzdHJ1Y3RfdHlwZSwK IAkJCSAgIGludCBudW1fZmllbGRzLAogCQkJICAgZ2NjX2ppdF9maWVsZCAqKmZpZWxkcyk7CiAK Ky8qIEdldCBhIGZpZWxkIGJ5IGluZGV4LiAgKi8KK2V4dGVybiBnY2Nfaml0X2ZpZWxkICoKK2dj Y19qaXRfc3RydWN0X2dldF9maWVsZCAoZ2NjX2ppdF9zdHJ1Y3QgKnN0cnVjdF90eXBlLAorCQkJ ICAgc2l6ZV90IGluZGV4KTsKKworLyogR2V0IHRoZSBudW1iZXIgb2YgZmllbGRzLiAgKi8KK2V4 dGVybiBzaXplX3QKK2djY19qaXRfc3RydWN0X2dldF9maWVsZF9jb3VudCAoZ2NjX2ppdF9zdHJ1 Y3QgKnN0cnVjdF90eXBlKTsKKwogLyogVW5pb25zIHdvcmsgc2ltaWxhcmx5IHRvIHN0cnVjdHMu ICAqLwogZXh0ZXJuIGdjY19qaXRfdHlwZSAqCiBnY2Nfaml0X2NvbnRleHRfbmV3X3VuaW9uX3R5 cGUgKGdjY19qaXRfY29udGV4dCAqY3R4dCwKQEAgLTE2MjEsNiArMTYzOCw3OCBAQCBnY2Nfaml0 X2NvbnRleHRfYWRkX3RvcF9sZXZlbF9hc20gKGdjY19qaXRfY29udGV4dCAqY3R4dCwKIAkJCQkg ICBnY2Nfaml0X2xvY2F0aW9uICpsb2MsCiAJCQkJICAgY29uc3QgY2hhciAqYXNtX3N0bXRzKTsK IAorI2RlZmluZSBMSUJHQ0NKSVRfSEFWRV9SRUZMRUNUSU9OCisKKy8qIFJlZmxlY3Rpb24gZnVu Y3Rpb25zIHRvIGdldCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMsIHJldHVybiB0eXBlIG9mCisg ICBhIGZ1bmN0aW9uIGFuZCB3aGV0aGVyIGEgdHlwZSBpcyBhIGJvb2wgZnJvbSB0aGUgQyBBUEku CisKKyAgIFRoaXMgQVBJIGVudHJ5cG9pbnQgd2FzIGFkZGVkIGluIExJQkdDQ0pJVF9BQklfMTU7 IHlvdSBjYW4gdGVzdCBmb3IgaXRzCisgICBwcmVzZW5jZSB1c2luZworICAgICAjaWZkZWYgTElC R0NDSklUX0hBVkVfUkVGTEVDVElPTgorKi8KKy8qIEdldCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBm dW5jdGlvbi4gICovCitleHRlcm4gZ2NjX2ppdF90eXBlICoKK2djY19qaXRfZnVuY3Rpb25fZ2V0 X3JldHVybl90eXBlIChnY2Nfaml0X2Z1bmN0aW9uICpmdW5jKTsKKworLyogR2V0IHRoZSBudW1i ZXIgb2YgcGFyYW1zIG9mIGEgZnVuY3Rpb24uICAqLworZXh0ZXJuIHNpemVfdAorZ2NjX2ppdF9m dW5jdGlvbl9nZXRfcGFyYW1fY291bnQgKGdjY19qaXRfZnVuY3Rpb24gKmZ1bmMpOworCisvKiBH ZXQgdGhlIGVsZW1lbnQgdHlwZSBvZiBhbiBhcnJheSB0eXBlIG9yIE5VTEwgaWYgaXQncyBub3Qg YW4gYXJyYXkuICAqLworZXh0ZXJuIGdjY19qaXRfdHlwZSAqCitnY2Nfaml0X3R5cGVfZHluY2Fz dF9hcnJheSAoZ2NjX2ppdF90eXBlICp0eXBlKTsKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIHRo ZSB0eXBlIGlzIGEgYm9vbC4gICovCitleHRlcm4gaW50CitnY2Nfaml0X3R5cGVfaXNfYm9vbCAo Z2NjX2ppdF90eXBlICp0eXBlKTsKKworLyogUmV0dXJuIHRoZSBmdW5jdGlvbiB0eXBlIGlmIGl0 IGlzIG9uZSBvciBOVUxMLiAgKi8KK2V4dGVybiBnY2Nfaml0X2Z1bmN0aW9uX3R5cGUgKgorZ2Nj X2ppdF90eXBlX2R5bmNhc3RfZnVuY3Rpb25fcHRyX3R5cGUgKGdjY19qaXRfdHlwZSAqdHlwZSk7 CisKKy8qIEdpdmVuIGEgZnVuY3Rpb24gdHlwZSwgcmV0dXJuIGl0cyByZXR1cm4gdHlwZS4gICov CitleHRlcm4gZ2NjX2ppdF90eXBlICoKK2djY19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcmV0dXJu X3R5cGUgKGdjY19qaXRfZnVuY3Rpb25fdHlwZSAqZnVuY3Rpb25fdHlwZSk7CisKKy8qIEdpdmVu IGEgZnVuY3Rpb24gdHlwZSwgcmV0dXJuIGl0cyBudW1iZXIgb2YgcGFyYW1ldGVycy4gICovCitl eHRlcm4gc2l6ZV90CitnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX2NvdW50IChnY2Nf aml0X2Z1bmN0aW9uX3R5cGUgKmZ1bmN0aW9uX3R5cGUpOworCisvKiBHaXZlbiBhIGZ1bmN0aW9u IHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci4gICovCitl eHRlcm4gZ2NjX2ppdF90eXBlICoKK2djY19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcGFyYW1fdHlw ZSAoZ2NjX2ppdF9mdW5jdGlvbl90eXBlICpmdW5jdGlvbl90eXBlLAorCQkJCXNpemVfdCBpbmRl eCk7CisKKy8qIFJldHVybiBub24temVybyBpZiB0aGUgdHlwZSBpcyBhbiBpbnRlZ3JhbC4gICov CitleHRlcm4gaW50CitnY2Nfaml0X3R5cGVfaXNfaW50ZWdyYWwgKGdjY19qaXRfdHlwZSAqdHlw ZSk7CisKKy8qIFJldHVybiB0aGUgdHlwZSBwb2ludGVkIGJ5IHRoZSBwb2ludGVyIHR5cGUgb3Ig TlVMTCBpZiBpdCdzIG5vdCBhCisgKiBwb2ludGVyLiAgKi8KK2V4dGVybiBnY2Nfaml0X3R5cGUg KgorZ2NjX2ppdF90eXBlX2lzX3BvaW50ZXIgKGdjY19qaXRfdHlwZSAqdHlwZSk7CisKKy8qIEdp dmVuIGEgdHlwZSwgcmV0dXJuIGEgZHluYW1pYyBjYXN0IHRvIGEgdmVjdG9yIHR5cGUgb3IgTlVM TC4gICovCitleHRlcm4gZ2NjX2ppdF92ZWN0b3JfdHlwZSAqCitnY2Nfaml0X3R5cGVfZHluY2Fz dF92ZWN0b3IgKGdjY19qaXRfdHlwZSAqdHlwZSk7CisKKy8qIEdpdmVuIGEgdHlwZSwgcmV0dXJu IGEgZHluYW1pYyBjYXN0IHRvIGEgc3RydWN0IHR5cGUgb3IgTlVMTC4gICovCitleHRlcm4gZ2Nj X2ppdF9zdHJ1Y3QgKgorZ2NjX2ppdF90eXBlX2lzX3N0cnVjdCAoZ2NjX2ppdF90eXBlICp0eXBl KTsKKworLyogR2l2ZW4gYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSBudW1iZXIgb2YgdW5pdHMg aXQgY29udGFpbnMuICAqLworZXh0ZXJuIHNpemVfdAorZ2NjX2ppdF92ZWN0b3JfdHlwZV9nZXRf bnVtX3VuaXRzIChnY2Nfaml0X3ZlY3Rvcl90eXBlICp2ZWN0b3JfdHlwZSk7CisKKy8qIEdpdmVu IGEgdmVjdG9yIHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZiBpdHMgZWxlbWVudHMuICAqLworZXh0 ZXJuIGdjY19qaXRfdHlwZSAqCitnY2Nfaml0X3ZlY3Rvcl90eXBlX2dldF9lbGVtZW50X3R5cGUg KGdjY19qaXRfdmVjdG9yX3R5cGUgKnZlY3Rvcl90eXBlKTsKKworLyogR2l2ZW4gYSB0eXBlLCBy ZXR1cm4gdGhlIHVucXVhbGlmaWVkIHR5cGUsIHJlbW92aW5nICJjb25zdCIsICJ2b2xhdGlsZSIK KyAqIGFuZCBhbGlnbm1lbnQgcXVhbGlmaWVycy4gICovCitleHRlcm4gZ2NjX2ppdF90eXBlICoK K2djY19qaXRfdHlwZV91bnF1YWxpZmllZCAoZ2NjX2ppdF90eXBlICp0eXBlKTsKKwogI2lmZGVm IF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL2dj Yy9qaXQvbGliZ2Njaml0Lm1hcCBiL2djYy9qaXQvbGliZ2Njaml0Lm1hcAppbmRleCAzMzdlYTZj N2ZlNC4uNjRlNzkwOTQ5ZTggMTAwNjQ0Ci0tLSBhL2djYy9qaXQvbGliZ2Njaml0Lm1hcAorKysg Yi9nY2Mvaml0L2xpYmdjY2ppdC5tYXAKQEAgLTIwNSwzICsyMDUsMjQgQEAgTElCR0NDSklUX0FC SV8xNSB7CiAgICAgZ2NjX2ppdF9leHRlbmRlZF9hc21fYWRkX2Nsb2JiZXI7CiAgICAgZ2NjX2pp dF9jb250ZXh0X2FkZF90b3BfbGV2ZWxfYXNtOwogfSBMSUJHQ0NKSVRfQUJJXzE0OworCitMSUJH Q0NKSVRfQUJJXzE2IHsKKyAgZ2xvYmFsOgorICAgIGdjY19qaXRfZnVuY3Rpb25fZ2V0X3JldHVy bl90eXBlOworICAgIGdjY19qaXRfZnVuY3Rpb25fZ2V0X3BhcmFtX2NvdW50OworICAgIGdjY19q aXRfZnVuY3Rpb25fdHlwZV9nZXRfcmV0dXJuX3R5cGU7CisgICAgZ2NjX2ppdF9mdW5jdGlvbl90 eXBlX2dldF9wYXJhbV9jb3VudDsKKyAgICBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFt X3R5cGU7CisgICAgZ2NjX2ppdF90eXBlX3VucXVhbGlmaWVkOworICAgIGdjY19qaXRfdHlwZV9k eW5jYXN0X2FycmF5OworICAgIGdjY19qaXRfdHlwZV9pc19ib29sOworICAgIGdjY19qaXRfdHlw ZV9keW5jYXN0X2Z1bmN0aW9uX3B0cl90eXBlOworICAgIGdjY19qaXRfdHlwZV9pc19pbnRlZ3Jh bDsKKyAgICBnY2Nfaml0X3R5cGVfaXNfcG9pbnRlcjsKKyAgICBnY2Nfaml0X3R5cGVfZHluY2Fz dF92ZWN0b3I7CisgICAgZ2NjX2ppdF92ZWN0b3JfdHlwZV9nZXRfZWxlbWVudF90eXBlOworICAg IGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X251bV91bml0czsKKyAgICBnY2Nfaml0X3N0cnVjdF9n ZXRfZmllbGQ7CisgICAgZ2NjX2ppdF90eXBlX2lzX3N0cnVjdDsKKyAgICBnY2Nfaml0X3N0cnVj dF9nZXRfZmllbGRfY291bnQ7Cit9IExJQkdDQ0pJVF9BQklfMTU7CmRpZmYgLS1naXQgYS9nY2Mv dGVzdHN1aXRlL2ppdC5kZy9hbGwtbm9uLWZhaWxpbmctdGVzdHMuaCBiL2djYy90ZXN0c3VpdGUv aml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oCmluZGV4IDQyMDJlYjc3OThiLi5hMjY5MTQ0 ZDJkZiAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxsLW5vbi1mYWlsaW5nLXRl c3RzLmgKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxsLW5vbi1mYWlsaW5nLXRlc3RzLmgK QEAgLTI1OCw2ICsyNTgsMTMgQEAKICN1bmRlZiBjcmVhdGVfY29kZQogI3VuZGVmIHZlcmlmeV9j b2RlCiAKKy8qIHRlc3QtcmVmbGVjdGlvbi5jICovCisjZGVmaW5lIGNyZWF0ZV9jb2RlIGNyZWF0 ZV9jb2RlX3JlZmxlY3Rpb24KKyNkZWZpbmUgdmVyaWZ5X2NvZGUgdmVyaWZ5X2NvZGVfcmVmbGVj dGlvbgorI2luY2x1ZGUgInRlc3QtcmVmbGVjdGlvbi5jIgorI3VuZGVmIGNyZWF0ZV9jb2RlCisj dW5kZWYgdmVyaWZ5X2NvZGUKKwogLyogdGVzdC1zdHJpbmctbGl0ZXJhbC5jICovCiAjZGVmaW5l IGNyZWF0ZV9jb2RlIGNyZWF0ZV9jb2RlX3N0cmluZ19saXRlcmFsCiAjZGVmaW5lIHZlcmlmeV9j b2RlIHZlcmlmeV9jb2RlX3N0cmluZ19saXRlcmFsCkBAIC00MjQsNiArNDMxLDkgQEAgY29uc3Qg c3RydWN0IHRlc3RjYXNlIHRlc3RjYXNlc1tdID0gewogICB7InJlYWRpbmdfc3RydWN0ICIsCiAg ICBjcmVhdGVfY29kZV9yZWFkaW5nX3N0cnVjdCAsCiAgICB2ZXJpZnlfY29kZV9yZWFkaW5nX3N0 cnVjdCB9LAorICB7InJlZmxlY3Rpb24iLAorICAgY3JlYXRlX2NvZGVfcmVmbGVjdGlvbiAsCisg ICB2ZXJpZnlfY29kZV9yZWZsZWN0aW9uIH0sCiAgIHsic3RyaW5nX2xpdGVyYWwiLAogICAgY3Jl YXRlX2NvZGVfc3RyaW5nX2xpdGVyYWwsCiAgICB2ZXJpZnlfY29kZV9zdHJpbmdfbGl0ZXJhbH0s CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0LXJlZmxlY3Rpb24uYyBiL2dj Yy90ZXN0c3VpdGUvaml0LmRnL3Rlc3QtcmVmbGVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwLi4xMTJhMjQ1NWMwNwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90 ZXN0c3VpdGUvaml0LmRnL3Rlc3QtcmVmbGVjdGlvbi5jCkBAIC0wLDAgKzEsOTUgQEAKKyNpbmNs dWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliZ2Njaml0 LmgiCisKKyNpbmNsdWRlICJoYXJuZXNzLmgiCisKK3ZvaWQKK2NyZWF0ZV9jb2RlIChnY2Nfaml0 X2NvbnRleHQgKmN0eHQsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgLyogRG8gbm90aGluZy4gICov Cit9CisKK3ZvaWQKK3ZlcmlmeV9jb2RlIChnY2Nfaml0X2NvbnRleHQgKmN0eHQsIGdjY19qaXRf cmVzdWx0ICpyZXN1bHQpCit7CisgIC8qIEdldCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zLiAgKi8K KyAgZ2NjX2ppdF9mdW5jdGlvbiAqYnVpbHRpbl9zaW4gPQorICAgIGdjY19qaXRfY29udGV4dF9n ZXRfYnVpbHRpbl9mdW5jdGlvbiAoY3R4dCwgInNpbiIpOworCisgIENIRUNLX1ZBTFVFIChnY2Nf aml0X2Z1bmN0aW9uX2dldF9wYXJhbV9jb3VudChidWlsdGluX3NpbiksIDEpOworCisgIGdjY19q aXRfdHlwZSAqZG91YmxlX3R5cGUgPQorICAgIGdjY19qaXRfY29udGV4dF9nZXRfdHlwZSAoY3R4 dCwgR0NDX0pJVF9UWVBFX0RPVUJMRSk7CisgIENIRUNLX1ZBTFVFIChnY2Nfaml0X2Z1bmN0aW9u X2dldF9yZXR1cm5fdHlwZShidWlsdGluX3NpbiksIGRvdWJsZV90eXBlKTsKKyAgQ0hFQ0sgKCFn Y2Nfaml0X3R5cGVfaXNfaW50ZWdyYWwoZG91YmxlX3R5cGUpKTsKKworICBnY2Nfaml0X3R5cGUg KmJvb2xfdHlwZSA9CisgICAgZ2NjX2ppdF9jb250ZXh0X2dldF90eXBlIChjdHh0LCBHQ0NfSklU X1RZUEVfQk9PTCk7CisgIENIRUNLIChnY2Nfaml0X3R5cGVfaXNfYm9vbChib29sX3R5cGUpKTsK KyAgQ0hFQ0sgKCFnY2Nfaml0X3R5cGVfaXNfaW50ZWdyYWwoYm9vbF90eXBlKSk7CisKKyAgZ2Nj X2ppdF90eXBlICphbGlnbmVkX2Jvb2xfdHlwZSA9CisgICAgZ2NjX2ppdF90eXBlX2dldF9hbGln bmVkKGdjY19qaXRfY29udGV4dF9nZXRfdHlwZSAoY3R4dCwgR0NDX0pJVF9UWVBFX0JPT0wpLCA4 KTsKKyAgQ0hFQ0sgKGdjY19qaXRfdHlwZV9pc19ib29sKGFsaWduZWRfYm9vbF90eXBlKSk7Cisg IENIRUNLIChib29sX3R5cGUgIT0gYWxpZ25lZF9ib29sX3R5cGUpOworICBDSEVDS19WQUxVRSAo Z2NjX2ppdF90eXBlX3VucXVhbGlmaWVkKGFsaWduZWRfYm9vbF90eXBlKSwgYm9vbF90eXBlKTsK KworICBDSEVDS19WQUxVRSAoZ2NjX2ppdF90eXBlX3VucXVhbGlmaWVkKGdjY19qaXRfdHlwZV9n ZXRfY29uc3QoYm9vbF90eXBlKSksIGJvb2xfdHlwZSk7CisgIENIRUNLX1ZBTFVFIChnY2Nfaml0 X3R5cGVfdW5xdWFsaWZpZWQoZ2NjX2ppdF90eXBlX2dldF92b2xhdGlsZShib29sX3R5cGUpKSwg Ym9vbF90eXBlKTsKKworICBnY2Nfaml0X3R5cGUgKmludDY0ID0KKyAgICBnY2Nfaml0X2NvbnRl eHRfZ2V0X2ludF90eXBlKGN0eHQsIDgsIDEpOworICBDSEVDSyAoZ2NjX2ppdF90eXBlX2lzX2lu dGVncmFsKGludDY0KSk7CisgIGdjY19qaXRfdHlwZSAqdWludDY0ID0KKyAgICBnY2Nfaml0X2Nv bnRleHRfZ2V0X2ludF90eXBlKGN0eHQsIDgsIDApOworICBDSEVDSyAoZ2NjX2ppdF90eXBlX2lz X2ludGVncmFsKHVpbnQ2NCkpOworICBnY2Nfaml0X3R5cGUgKmludDggPQorICAgIGdjY19qaXRf Y29udGV4dF9nZXRfaW50X3R5cGUoY3R4dCwgMSwgMSk7CisgIENIRUNLIChnY2Nfaml0X3R5cGVf aXNfaW50ZWdyYWwoaW50OCkpOworICBnY2Nfaml0X3R5cGUgKnVpbnQ4ID0KKyAgICBnY2Nfaml0 X2NvbnRleHRfZ2V0X2ludF90eXBlKGN0eHQsIDEsIDApOworICBDSEVDSyAoZ2NjX2ppdF90eXBl X2lzX2ludGVncmFsKHVpbnQ4KSk7CisKKyAgQ0hFQ0sgKCFnY2Nfaml0X3R5cGVfZHluY2FzdF92 ZWN0b3IoZG91YmxlX3R5cGUpKTsKKyAgZ2NjX2ppdF90eXBlICp2ZWNfdHlwZSA9IGdjY19qaXRf dHlwZV9nZXRfdmVjdG9yIChkb3VibGVfdHlwZSwgNCk7CisgIGdjY19qaXRfdmVjdG9yX3R5cGUg KnZlY3Rvcl90eXBlID0gZ2NjX2ppdF90eXBlX2R5bmNhc3RfdmVjdG9yKHZlY190eXBlKTsKKyAg Q0hFQ0sgKHZlY3Rvcl90eXBlKTsKKyAgQ0hFQ0sgKHZlY190eXBlICE9IGRvdWJsZV90eXBlKTsK KyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X2VsZW1lbnRfdHlwZSh2ZWN0 b3JfdHlwZSksIGRvdWJsZV90eXBlKTsKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfdmVjdG9yX3R5 cGVfZ2V0X251bV91bml0cyh2ZWN0b3JfdHlwZSksIDQpOworCisgIENIRUNLICghZ2NjX2ppdF90 eXBlX2lzX3BvaW50ZXIoZG91YmxlX3R5cGUpKTsKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfdHlw ZV9pc19wb2ludGVyKGdjY19qaXRfdHlwZV9nZXRfcG9pbnRlcihkb3VibGVfdHlwZSkpLCBkb3Vi bGVfdHlwZSk7CisKKyAgZ2NjX2ppdF90eXBlKiBwYXJhbXNbMl0gPSB7aW50OCwgdWludDY0fTsK KyAgZ2NjX2ppdF90eXBlICpmdW5jdGlvbl9wdHJfdHlwZSA9IGdjY19qaXRfY29udGV4dF9uZXdf ZnVuY3Rpb25fcHRyX3R5cGUoY3R4dCwgTlVMTCwgaW50NjQsIDIsIHBhcmFtcywgMCk7CisgIENI RUNLICghZ2NjX2ppdF90eXBlX2R5bmNhc3RfZnVuY3Rpb25fcHRyX3R5cGUgKGludDY0KSk7Cisg IGdjY19qaXRfZnVuY3Rpb25fdHlwZSAqZnVuY3Rpb25fdHlwZSA9IGdjY19qaXRfdHlwZV9keW5j YXN0X2Z1bmN0aW9uX3B0cl90eXBlIChmdW5jdGlvbl9wdHJfdHlwZSk7CisgIENIRUNLIChmdW5j dGlvbl90eXBlKTsKKyAgaW50IHBhcmFtX2NvdW50ID0gZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dl dF9wYXJhbV9jb3VudChmdW5jdGlvbl90eXBlKTsKKyAgQ0hFQ0tfVkFMVUUgKHBhcmFtX2NvdW50 LCAyKTsKKyAgZ2NjX2ppdF90eXBlICpyZXR1cm5fdHlwZSA9IGdjY19qaXRfZnVuY3Rpb25fdHlw ZV9nZXRfcmV0dXJuX3R5cGUoZnVuY3Rpb25fdHlwZSk7CisgIENIRUNLX1ZBTFVFIChyZXR1cm5f dHlwZSwgaW50NjQpOworICBnY2Nfaml0X3R5cGUgKnBhcmFtMSA9IGdjY19qaXRfZnVuY3Rpb25f dHlwZV9nZXRfcGFyYW1fdHlwZShmdW5jdGlvbl90eXBlLCAwKTsKKyAgQ0hFQ0tfVkFMVUUgKHBh cmFtMSwgaW50OCk7CisgIGdjY19qaXRfdHlwZSAqcGFyYW0yID0gZ2NjX2ppdF9mdW5jdGlvbl90 eXBlX2dldF9wYXJhbV90eXBlKGZ1bmN0aW9uX3R5cGUsIDEpOworICBDSEVDS19WQUxVRSAocGFy YW0yLCB1aW50NjQpOworCisgIGdjY19qaXRfZmllbGQgKmZpZWxkMSA9IGdjY19qaXRfY29udGV4 dF9uZXdfZmllbGQgKGN0eHQsIE5VTEwsIHVpbnQ2NCwgImZpZWxkMSIpOworICBnY2Nfaml0X2Zp ZWxkICpmaWVsZDIgPSBnY2Nfaml0X2NvbnRleHRfbmV3X2ZpZWxkIChjdHh0LCBOVUxMLCBkb3Vi bGVfdHlwZSwgImZpZWxkMiIpOworICBnY2Nfaml0X2ZpZWxkICpmaWVsZHNbMl0gPSB7IGZpZWxk MSwgZmllbGQyIH07CisgIGdjY19qaXRfc3RydWN0ICpzdHJ1Y3RfdHlwZSA9IGdjY19qaXRfY29u dGV4dF9uZXdfc3RydWN0X3R5cGUgKGN0eHQsIE5VTEwsICJ0ZXN0U3RydWN0IiwgMiwgZmllbGRz KTsKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfc3RydWN0X2dldF9maWVsZF9jb3VudChzdHJ1Y3Rf dHlwZSksIDIpOworICBDSEVDS19WQUxVRSAoZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkKHN0cnVj dF90eXBlLCAwKSwgZmllbGQxKTsKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfc3RydWN0X2dldF9m aWVsZChzdHJ1Y3RfdHlwZSwgMSksIGZpZWxkMik7CisgIENIRUNLICghZ2NjX2ppdF90eXBlX2lz X3N0cnVjdChkb3VibGVfdHlwZSkpOworICBnY2Nfaml0X3N0cnVjdCAqc3RydWN0X3R5ID0gZ2Nj X2ppdF90eXBlX2lzX3N0cnVjdChnY2Nfaml0X3N0cnVjdF9hc190eXBlKHN0cnVjdF90eXBlKSk7 CisgIENIRUNLX1ZBTFVFIChzdHJ1Y3RfdHksIHN0cnVjdF90eXBlKTsKKworICBDSEVDSyAoIWdj Y19qaXRfdHlwZV9keW5jYXN0X2FycmF5KGRvdWJsZV90eXBlKSk7CisgIGdjY19qaXRfdHlwZSog YXJyYXlfdHlwZSA9IGdjY19qaXRfY29udGV4dF9uZXdfYXJyYXlfdHlwZShjdHh0LCBOVUxMLCBk b3VibGVfdHlwZSwgMSk7CisgIENIRUNLX1ZBTFVFIChnY2Nfaml0X3R5cGVfZHluY2FzdF9hcnJh eShhcnJheV90eXBlKSwgZG91YmxlX3R5cGUpOworfQorCi0tIAoyLjMxLjEKCg== --=-HejcuDyx2YulzpLTEimN--