Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tT5RE-003IFY-Ab for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Jan 2025 20:35:33 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tT5RD-00A3Pl-CS for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Jan 2025 20:35:31 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tT5RC-00A3Pc-Je for pgsql-hackers@lists.postgresql.org; Wed, 01 Jan 2025 20:35:30 +0000 Received: from mail-wm1-x335.google.com ([2a00:1450:4864:20::335]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tT5R9-001bkB-2L for pgsql-hackers@postgresql.org; Wed, 01 Jan 2025 20:35:29 +0000 Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-43635796b48so65754035e9.0 for ; Wed, 01 Jan 2025 12:35:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735763725; x=1736368525; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=eSl72sJodkHoCEOJOpfAGo3aZdAXXcz4FRr/sZfQpts=; b=PGZWaJJOW9+LRrdum7nA8VXpMaF5SfexKc7YeE3O4TdwgdmQ8zbK1iBBNx2S6PDYxc inu90Ojfl0eUu68cYFO3Y/PendTXbRfc0tPjqS1YS5OtTQmJ3bQKpXzKKuuWUTLTEiJ2 5dg8FbpmvVETvjvOL+/HNFDKfqdqQTJi+yVT5CSoiQJKtKG2yAkaa+1zBcebjmcvQKdu E+hNmBB/2BdRgfDZ3q1BVsXZtihotiLmxB/C/IEM9E8WLW4Gm8DjrT0NHVbbEYohtocI fmIV4U9QTfM+EbZ5rx3SZS2ATGI8pqznHh/0Yo0gJshjk+BJkGVkwpwSdXGYLXU+mVOk aR9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735763725; x=1736368525; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=eSl72sJodkHoCEOJOpfAGo3aZdAXXcz4FRr/sZfQpts=; b=dmvGHqzn/WN9Kdx+mCtDcl+14u4KyGSipKSt4hlJ1C05KlfZf1My2+WSEoP99ALgYc VYAIkHW4ynu7hk9qhuggvlGTlGmbQBPYlYGK4CO5R7rn4Ae6pvQTJlVIzab23lQFaoJH TC7cmv+ZtfH40XVPdMog5tWzpYQ23yVbLUYIQvGx88rP7zvF6EEUlEjiNoQ/teAUGlQw R9Zag5mNffqc1g1BbK23rqACavoGmNsqqZ8V8H0iveLrTWWCrHWmzUsjZFyTzhcIqxUq akpZUJOpdYP0zQIPhj4788R6PrXgtrc3N4cbLtomvFq+qNgjh+71dz4n/1WxNqMH038H omXA== X-Forwarded-Encrypted: i=1; AJvYcCXyeY1/7/2de0tYVoy0opyiNtAftweGbVRHT1XW6uPVmsXYCdZ+jzYOtd4Ts4F7q+oZd+W1HGY7+psuh4xs@postgresql.org X-Gm-Message-State: AOJu0YyjsGJrE2u9MceaCzxVwgfAJS8ot/lDv3w6EFlUn33JqrDWInm0 KFJ9aHsUqf5kvbFQrlf81R5vCyyJU0RtUW3JNK4c6ctMSkwrfjTdooU8+L8LEx+4azxIBnZkYwY p3lE1NwPCq9rTawGK85TRady4GUg= X-Gm-Gg: ASbGncs3o42yxA89X0g43f13xeVdrDeCjTZiijxvDvOMV2zXD/WRpGBUkyjbF5zJ4a/ Etu4Rf8GviZdWJDjfueFNwZ3YHK2+fQtrnTDD8RU= X-Google-Smtp-Source: AGHT+IF+bPZbqYNDF6CfUO6vCzmA/uDeKiAP3eBK5qqQILI6G6JVPugQTfRxkQMy+R9C195duexlB1KqwX7fv5dPbLM= X-Received: by 2002:a05:600c:a0a:b0:434:9e17:190c with SMTP id 5b1f17b1804b1-436693f7cc4mr342621395e9.0.1735763724943; Wed, 01 Jan 2025 12:35:24 -0800 (PST) MIME-Version: 1.0 References: <740696.1718036463@sss.pgh.pa.us> In-Reply-To: From: Mahendra Singh Thalor Date: Thu, 2 Jan 2025 02:05:13 +0530 Message-ID: Subject: Re: Non-text mode for pg_dumpall To: Magnus Hagander Cc: Tom Lane , Nathan Bossart , Andrew Dunstan , PostgreSQL-development , Dilip Kumar Content-Type: multipart/mixed; boundary="0000000000003d6733062aaafc8c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000003d6733062aaafc8c Content-Type: multipart/alternative; boundary="0000000000003d6732062aaafc8a" --0000000000003d6732062aaafc8a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Here, I am attaching an updated patch. I fixed some bugs of v01 patch and did some code cleanup also. TODO WIP 1: after excluding databases, we have paths of all the databases that are needed to restore so we can launch parallel workers for each database. I am studying for this part. TODO WIP 2: exclude-database=3DNAME, for pg_restore, I am using NAME as of now, I will try to make it PATTERN. PATTERN should be matched from map.dat file. Please have a look over the patch and let me know feedback. On Tue, 31 Dec 2024 at 23:53, Mahendra Singh Thalor wrote: > Hi all, > With the help of Andrew and Dilip Kumar, I made a poc patch to dump all > the databases in archive format and then restore them using pg_restore. > > Brief about the patch: > new option to pg_dumpall: > -F, --format=3Dd|p (directory|plain) output file format (directory, plain > text (default)) > > Ex: ./pg_dumpall --format=3Ddirectory --file=3DdumpDirName > > dumps are as: > global.dat ::: global sql commands in simple plain format > map.dat. ::: dboid dbname ---entries for all databases in simple text > form > databases. ::: > subdir dboid1 -> toc.dat and data files in archive format > subdir dboid2. -> toc.dat and data files in archive format > etc > -------------------------------------------------------------------------= -- > > new options to pg_restore: > -g, --globals-only restore only global objects, no databases > --exclude-database=3DPATTERN exclude databases whose name matches PATTE= RN > > When we give -g/--globals-only option, then only restore globals, no db > restoring. > > *Design*: > When --format=3Ddirectory is specified and there is no toc.dat file in th= e > main directory, then check > for global.dat and map.dat to restore all databases. If both files exist > in a directory, > then first restore all globals from global.dat and then restore all > databases one by one > from map.dat list. > While restoring, skip the databases that are given with exclude-database. > > -------------------------------------------------------------------------= -- > NOTE: > if needed, restore single db by particular subdir > > Ex: ./pg_restore --format=3Ddirectory -d postgres dumpDirName/databases/5 > -- here, 5 is the dboid of postgres db > -- to get dboid, refer dbname in map.file > -------------------------------------------------------------------------= - > > Please let me know feedback for the attached patch. > > On Tue, 11 Jun 2024 at 01:06, Magnus Hagander wrote= : > >> On Mon, Jun 10, 2024 at 6:21=E2=80=AFPM Tom Lane wro= te: >> >>> Magnus Hagander writes: >>> > On Mon, Jun 10, 2024 at 5:03=E2=80=AFPM Nathan Bossart < >>> nathandbossart@gmail.com> >>> > wrote: >>> >> Is there a particular advantage to that approach as opposed to just >>> using >>> >> "directory" mode for everything? >>> >>> > A gazillion files to deal with? Much easier to work with individual >>> custom >>> > files if you're moving databases around and things like that. >>> > Much easier to monitor eg sizes/dates if you're using it for backups. >>> >>> You can always tar up the directory tree after-the-fact if you want >>> one file. Sure, that step's not parallelized, but I think we'd need >>> some non-parallelized copying to create such a file anyway. >>> >> >> That would require double the disk space. >> >> But you can also just run pg_dump manually on each database and a >> pg_dumpall -g like people are doing today -- I thought this whole thing = was >> about making it more convenient :) >> >> -- >> Magnus Hagander >> Me: https://www.hagander.net/ >> Work: https://www.redpill-linpro.com/ >> > > > -- > Thanks and Regards > Mahendra Singh Thalor > EnterpriseDB: http://www.enterprisedb.com > --=20 Thanks and Regards Mahendra Singh Thalor EnterpriseDB: http://www.enterprisedb.com --0000000000003d6732062aaafc8a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Here, I am attaching an updated patch. I fixed some bugs o= f v01 patch and did some code cleanup also.

TODO WIP 1: after excluding databases, we have path= s of all the databases that are needed to
restore so we can launch parallel workers for each datab= ase. I am studying for this part.

<= span aria-label=3D"" class=3D"gmail-c-mrkdwn__br" style=3D"box-sizing:inher= it;height:8px;display:block;color:rgb(29,28,29);font-family:Slack-Lato,Slac= k-Fractions,appleLogo,sans-serif;font-size:15px;font-variant-ligatures:comm= on-ligatures;background-color:rgb(248,248,248)">TODO WIP 2:=C2=A0e= xclude-database=3DNAME, for pg_restore, I am using NAME as of now, I will t= ry to make it PATTERN. PATTERN
should be matched from map.dat file.

Please have a look over the patch and=C2=A0let me know feedback.


On Tue, 31 Dec 2024 at 23:53, = Mahendra Singh Thalor <mahi6run@gm= ail.com> wrote:
Hi all,
With the help of Andre= w and Dilip Kumar, I made a poc patch to dump all the databases in archive = format and then restore=C2=A0them using pg_restore.

Brief about the patch:
new option to pg_dumpall:
-F, --forma= t=3Dd|p (directory|plain) output file format (directory, plain text (defaul= t))

Ex: ./pg_dumpall --format=3Ddirectory --file=3DdumpDirName
dumps are as:
global.dat ::: global sql commands in simple plain forma= t
map.dat. =C2=A0 ::: dboid dbname ---entries for all databases in simpl= e text form
databases. :::
=C2=A0 =C2=A0 =C2=A0 subdir =C2=A0 =C2=A0 = dboid1 =C2=A0-> toc.dat and data files in archive format
=C2=A0 =C2= =A0 =C2=A0 subdir =C2=A0 =C2=A0 dboid2. -> toc.dat and data files in arc= hive format
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 etc
----= -----------------------------------------------------------------------
=
new options to pg_restore:
-g, --globals-only =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 restore only global objects, no databases
--exclude-databa= se=3DPATTERN =C2=A0 exclude databases whose name matches PATTERN

Whe= n we give -g/--globals-only option, then only restore globals, no db restor= ing.

Design:
When --format=3Ddirectory i= s specified and there is no toc.dat file in the main directory, then check<= br>for global.dat and map.dat to restore all databases. If both files exist= in a directory,
then first restore all globals from global.dat and then= restore all databases one by one
from map.dat list.
While res= toring, skip the databases=C2=A0that are given=C2=A0with exclude-database.<= /div>

--------------------------------------------------= -------------------------
NOTE:
if needed, restore single db by parti= cular subdir

Ex: ./pg_restore --format=3Ddirectory -d postgres dumpD= irName/databases/5
=C2=A0 =C2=A0-- here, 5 is the dboid of postgres db=C2=A0 =C2=A0-- to get dboid, refer dbname in map.file
---------------= -----------------------------------------------------------

<= /div>
Please let me know feedback for the attached=C2=A0patch.

On = Tue, 11 Jun 2024 at 01:06, Magnus Hagander <magnus@hagander.net> wrote:
On Mon, Jun 10, 2024 at 6:21=E2=80=AFPM Tom Lane <tgl@sss.pgh.pa.us> wrote:<= br>
Magnus Hagander <magnus@hagander.net> writes:
> On Mon, Jun 10, 2024 at 5:03=E2=80=AFPM Nathan Bossart <nathandbossart@gmail.com= >
> wrote:
>> Is there a particular advantage to that approach as opposed to jus= t using
>> "directory" mode for everything?

> A gazillion files to deal with? Much easier to work with individual cu= stom
> files if you're moving databases around and things like that.
> Much easier to monitor eg sizes/dates if you're using it for backu= ps.

You can always tar up the directory tree after-the-fact if you want
one file.=C2=A0 Sure, that step's not parallelized, but I think we'= d need
some non-parallelized copying to create such a file anyway.

That would require double the disk space.
But you can also just run pg_dump manually on each database an= d a pg_dumpall -g like people are doing today -- I thought this whole thing= was about making it more convenient :)
=C2=A0
--
=C2=A0Magnus Hagander
=C2=A0Me: https://www.hagander.net= /
=C2=A0Work: https://www.redpill-linpro.com/


--
Thanks and Regards
Mahendra Singh Thalor
EnterpriseDB: http://www.enterprise= db.com


--
Thanks and Regards
Mahendra Singh Thalor
EnterpriseDB: http://www.enterprise= db.com
--0000000000003d6732062aaafc8a-- --0000000000003d6733062aaafc8c Content-Type: application/octet-stream; name="v02_poc_pg_dumpall_with_directory_2nd_jan.patch" Content-Disposition: attachment; filename="v02_poc_pg_dumpall_with_directory_2nd_jan.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m5eculil0 RnJvbSA4ZGU3NGZkYTc4MjUzMDFlM2YxMGIxMGNlMTMyNzUxMzg2ZWE1ZmI3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYWhlbmRyYSBTaW5naCBUaGFsb3IgPG1haGk2cnVuQGdtYWls LmNvbT4KRGF0ZTogV2VkLCAxIEphbiAyMDI1IDEyOjE5OjA4IC0wODAwClN1YmplY3Q6IFtQQVRD SF0gcGdfZHVtcGFsbCB3aXRoIGRpcmVjdG9yeSBmb3JtYXQgYW5kIHJlc3RvcmUgaXQgYnkgcGdf cmVzdG9yZQoKbmV3IG9wdGlvbiB0byBwZ19kdW1wYWxsOgotRiwgLS1mb3JtYXQ9ZHxwfGRpcmVj dG9yeXxwbGFpbiBvdXRwdXQgZmlsZSBmb3JtYXQgKGRpcmVjdG9yeSwgcGxhaW4gdGV4dCAoZGVm YXVsdCkpCgpFeDogLi9wZ19kdW1wYWxsIC0tZm9ybWF0PWRpcmVjdG9yeSAtLWZpbGU9ZHVtcERp ck5hbWUKCmR1bXBzIGFyZSBhczoKZ2xvYmFsLmRhdCA6OjogZ2xvYmFsIHNxbCBjb21tYW5kcyBp biBzaW1wbGUgcGxhaW4gZm9ybWF0Cm1hcC5kYXQuICAgOjo6IGRib2lkIGRibmFtZSAtLS1lbnRy aWVzIGZvciBhbGwgZGF0YWJhc2VzIGluIHNpbXBsZSB0ZXh0IGZvcm0KZGF0YWJhc2VzLiA6OjoK ICAgICAgc3ViZGlyICAgICBkYm9pZDEgIC0+IHRvYy5kYXQgYW5kIGRhdGEgZmlsZXMgaW4gYXJj aGl2ZSBmb3JtYXQKICAgICAgc3ViZGlyICAgICBkYm9pZDIuIC0+IHRvYy5kYXQgYW5kIGRhdGEg ZmlsZXMgaW4gYXJjaGl2ZSBmb3JtYXQKICAgICAgICAgICAgICBldGMKLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCk5PVEU6CmlmIG5lZWRlZCwgcmVzdG9yZSBzaW5nbGUgZGIgYnkgcGFydGljdWxhciBzdWJk aXIKCkV4OiAuL3BnX3Jlc3RvcmUgLS1mb3JtYXQ9ZGlyZWN0b3J5IC1kIHBvc3RncmVzIGR1bXBE aXJOYW1lL2RhdGFiYXNlcy81CiAgIC0tIGhlcmUsIDUgaXMgdGhlIGRib2lkIG9mIHBvc3RncmVz IGRiCiAgIC0tIHRvIGdldCBkYm9pZCwgcmVmZXIgZGJuYW1lIGluIG1hcC5maWxlCgotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQpuZXcgb3B0aW9ucyB0byBwZ19yZXN0b3JlOgotZywgLS1nbG9iYWxzLW9ubHkg ICAgICAgICAgIHJlc3RvcmUgb25seSBnbG9iYWwgb2JqZWN0cywgbm8gZGF0YWJhc2VzCi0tZXhj bHVkZS1kYXRhYmFzZT1OQU1FICAgZXhjbHVkZSBkYXRhYmFzZSB3aG9zZSBuYW1lIG1hdGNoZXMg bmFtZQoKV2hlbiB3ZSBnaXZlIC1nLy0tZ2xvYmFscy1vbmx5IG9wdGlvbiwgdGhlbiBvbmx5IHJl c3RvcmUgZ2xvYmFscywgbm8gZGIgcmVzdG9yaW5nLgoKRGVzaWduOgpXaGVuIC0tZm9ybWF0PWRp cmVjdG9yeSBpcyBzcGVjaWZpZWQgYW5kIHRoZXJlIGlzIG5vIHRvYy5kYXQgaW4gbWFpbiBkaXJl Y3RvcnksIHRoZW4gY2hlY2sKZm9yIGdsb2JhbC5kYXQgYW5kIG1hcC5kYXQgdG8gcmVzdG9yZSBh bGwgZGF0YWJhc2VzLiBJZiBib3RoIGZpbGVzIGFyZSBleGlzdHMgaW4gZGlyZWN0b3J5LAp0aGVu IGZpcnN0IHJlc3RvcmUgYWxsIGdsb2JhbHMgZnJvbSBnbG9iYWwuZGF0IGFuZCB0aGVuIHJlc3Rv cmUgYWxsIGRhdGFiYXNlcyBvbmUgYnkgb25lCmZyb20gbWFwLmRhdCBsaXN0LgoKVE9ETzogV2Ug Y2FuIHJlc3RvcmUgZGF0YWJhc2VzIGluIHBhcmFsbGVsIG1vZGUuCi0tLQogZG9jL3NyYy9zZ21s L3JlZi9wZ19kdW1wYWxsLnNnbWwgfCAgMzAgKysKIGRvYy9zcmMvc2dtbC9yZWYvcGdfcmVzdG9y ZS5zZ21sIHwgIDMwICsrCiBzcmMvYmluL3BnX2R1bXAvcGdfZHVtcGFsbC5jICAgICB8IDEzOCAr KysrKystLQogc3JjL2Jpbi9wZ19kdW1wL3BnX3Jlc3RvcmUuYyAgICAgfCA2NjEgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiA0IGZpbGVzIGNoYW5nZWQsIDgyOSBpbnNl cnRpb25zKCspLCAzMCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcmVm L3BnX2R1bXBhbGwuc2dtbCBiL2RvYy9zcmMvc2dtbC9yZWYvcGdfZHVtcGFsbC5zZ21sCmluZGV4 IDAxNGYyNzkuLmI2YzlmZWIgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9yZWYvcGdfZHVtcGFs bC5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9yZWYvcGdfZHVtcGFsbC5zZ21sCkBAIC01ODIsNiAr NTgyLDM2IEBAIGV4Y2x1ZGUgZGF0YWJhc2UgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIi PlBBVFRFUk48L3JlcGxhY2VhYmxlPgogICAgICAgPC9saXN0aXRlbT4KICAgICAgPC92YXJsaXN0 ZW50cnk+CiAKKyAgICA8dmFybGlzdGVudHJ5PgorICAgICAgPHRlcm0+PG9wdGlvbj4tRiA8cmVw bGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+Zm9ybWF0PC9yZXBsYWNlYWJsZT48L29wdGlvbj48 L3Rlcm0+CisgICAgICA8dGVybT48b3B0aW9uPi0tZm9ybWF0PTxyZXBsYWNlYWJsZSBjbGFzcz0i cGFyYW1ldGVyIj5mb3JtYXQ8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDxs aXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgU3BlY2lmeSBmb3JtYXQgb2YgZHVtcCBm aWxlcy4gIElmIHdlIHdhbnQgdG8gZHVtcCBhbGwgdGhlIGRhdGFiYXNlcywgdGhlbiBwYXNzIHRo aXMgYXMgZGlyZWN0b3J5IHNvIHRoYXQgZHVtcCBvZiBhbGwgZGF0YWJhc2VzIGNhbiBiZSB0YWtl biBpbiBzZXBhcmF0ZSBzdWJkaXJlY3RvcnkgaW4gYXJjaGl2ZSBmb3JtYXQuCitieSBkZWZhdWx0 LCB0aGlzIGlzIHBsYWluLgorCisgICAgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgICAgPHZhcmxp c3RlbnRyeT4KKyAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPmQ8L2xpdGVyYWw+PC90ZXJtPgorICAg ICAgICAgPHRlcm0+PGxpdGVyYWw+ZGlyZWN0b3J5PC9saXRlcmFsPjwvdGVybT4KKyAgICAgICAg IDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgVGhlIGFyY2hpdmUgaXMg YSBkaXJlY3RvcnkgYXJjaGl2ZS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgICA8L2xpc3Rp dGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgIDx2YXJpYWJsZWxpc3Q+Cisg ICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICA8dGVybT48bGl0ZXJhbD5wPC9saXRlcmFs PjwvdGVybT4KKyAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPnBsYWluPC9saXRlcmFsPjwvdGVybT4K KyAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgVGhlIGFy Y2hpdmUgaXMgYSBwbGFpbiBhcmNoaXZlLihieSBkZWZhdWx0IGFsc28pCisgICAgICAgICAgPC9w YXJhPgorICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKICAg ICAgPHZhcmxpc3RlbnRyeT4KICAgICAgICA8dGVybT48b3B0aW9uPi0/PC9vcHRpb24+PC90ZXJt PgogICAgICAgIDx0ZXJtPjxvcHRpb24+LS1oZWxwPC9vcHRpb24+PC90ZXJtPgpkaWZmIC0tZ2l0 IGEvZG9jL3NyYy9zZ21sL3JlZi9wZ19yZXN0b3JlLnNnbWwgYi9kb2Mvc3JjL3NnbWwvcmVmL3Bn X3Jlc3RvcmUuc2dtbAppbmRleCBiOGIyN2UxLi5hYjJlMDM1IDEwMDY0NAotLS0gYS9kb2Mvc3Jj L3NnbWwvcmVmL3BnX3Jlc3RvcmUuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvcmVmL3BnX3Jlc3Rv cmUuc2dtbApAQCAtMzE2LDYgKzMxNiwxNiBAQCBQb3N0Z3JlU1FMIGRvY3VtZW50YXRpb24KICAg ICAgPC92YXJsaXN0ZW50cnk+CiAKICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgIDx0ZXJtPjxv cHRpb24+LWc8L29wdGlvbj48L3Rlcm0+CisgICAgICA8dGVybT48b3B0aW9uPi0tZ2xvYmFscy1v bmx5PC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAg ICAgICBSZXN0b3JlIG9ubHkgZ2xvYmFsIG9iamVjdHMgKHJvbGVzIGFuZCB0YWJsZXNwYWNlcyks IG5vIGRhdGFiYXNlcy4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8 L3Zhcmxpc3RlbnRyeT4KKworICAgICA8dmFybGlzdGVudHJ5PgogICAgICAgPHRlcm0+PG9wdGlv bj4tSSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+aW5kZXg8L3JlcGxhY2VhYmxlPjwv b3B0aW9uPjwvdGVybT4KICAgICAgIDx0ZXJtPjxvcHRpb24+LS1pbmRleD08cmVwbGFjZWFibGUg Y2xhc3M9InBhcmFtZXRlciI+aW5kZXg8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KICAg ICAgIDxsaXN0aXRlbT4KQEAgLTkzMiw2ICs5NDIsMjYgQEAgUG9zdGdyZVNRTCBkb2N1bWVudGF0 aW9uCiAgICAgICA8L2xpc3RpdGVtPgogICAgICA8L3Zhcmxpc3RlbnRyeT4KIAorICAgICA8dmFy bGlzdGVudHJ5PgorICAgICAgPHRlcm0+PG9wdGlvbj4tLWV4Y2x1ZGUtZGF0YWJhc2U9PHJlcGxh Y2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnBhdHRlcm48L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwv dGVybT4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgRG8gbm90IHJl c3RvcmUgZGF0YWJhc2VzIHdob3NlIG5hbWUgbWF0Y2hlcworICAgICAgICA8cmVwbGFjZWFibGUg Y2xhc3M9InBhcmFtZXRlciI+cGF0dGVybjwvcmVwbGFjZWFibGU+LgorICAgICAgICBNdWx0aXBs ZSBwYXR0ZXJucyBjYW4gYmUgZXhjbHVkZWQgYnkgd3JpdGluZyBtdWx0aXBsZQorICAgICAgICA8 b3B0aW9uPi0tZXhjbHVkZS1kYXRhYmFzZTwvb3B0aW9uPiBzd2l0Y2hlcy4gIFRoZQorICAgICAg ICA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+cGF0dGVybjwvcmVwbGFjZWFibGU+IHBh cmFtZXRlciBpcworICAgICAgICBpbnRlcnByZXRlZCBhcyBhIHBhdHRlcm4gYWNjb3JkaW5nIHRv IHRoZSBzYW1lIHJ1bGVzIHVzZWQgYnkKKyAgICAgICAgPGFwcGxpY2F0aW9uPnBzcWw8L2FwcGxp Y2F0aW9uPidzIDxsaXRlcmFsPlxkPC9saXRlcmFsPgorICAgICAgICBjb21tYW5kcyAoc2VlIDx4 cmVmIGxpbmtlbmQ9ImFwcC1wc3FsLXBhdHRlcm5zIi8+KSwKKyAgICAgICAgc28gbXVsdGlwbGUg ZGF0YWJhc2VzIGNhbiBhbHNvIGJlIGV4Y2x1ZGVkIGJ5IHdyaXRpbmcgd2lsZGNhcmQKKyAgICAg ICAgY2hhcmFjdGVycyBpbiB0aGUgcGF0dGVybi4gIFdoZW4gdXNpbmcgd2lsZGNhcmRzLCBiZSBj YXJlZnVsIHRvCisgICAgICAgIHF1b3RlIHRoZSBwYXR0ZXJuIGlmIG5lZWRlZCB0byBwcmV2ZW50 IHNoZWxsIHdpbGRjYXJkIGV4cGFuc2lvbi4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3Rp dGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworCiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgICA8 L3BhcmE+CiAgPC9yZWZzZWN0MT4KZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfZHVtcC9wZ19kdW1w YWxsLmMgYi9zcmMvYmluL3BnX2R1bXAvcGdfZHVtcGFsbC5jCmluZGV4IDM5NmY3OTcuLjA2NjE5 N2IgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfZHVtcC9wZ19kdW1wYWxsLmMKKysrIGIvc3JjL2Jp bi9wZ19kdW1wL3BnX2R1bXBhbGwuYwpAQCAtMTUsNiArMTUsNyBAQAogCiAjaW5jbHVkZSAicG9z dGdyZXNfZmUuaCIKIAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgog I2luY2x1ZGUgPHVuaXN0ZC5oPgogCkBAIC0yOSw2ICszMCw3IEBACiAjaW5jbHVkZSAiZmlsdGVy LmgiCiAjaW5jbHVkZSAiZ2V0b3B0X2xvbmcuaCIKICNpbmNsdWRlICJwZ19iYWNrdXAuaCIKKyNp bmNsdWRlICJwZ19iYWNrdXBfYXJjaGl2ZXIuaCIKIAogLyogdmVyc2lvbiBzdHJpbmcgd2UgZXhw ZWN0IGJhY2sgZnJvbSBwZ19kdW1wICovCiAjZGVmaW5lIFBHRFVNUF9WRVJTSU9OU1RSICJwZ19k dW1wIChQb3N0Z3JlU1FMKSAiIFBHX1ZFUlNJT04gIlxuIgpAQCAtNjQsOSArNjYsMTAgQEAgc3Rh dGljIHZvaWQgZHJvcFRhYmxlc3BhY2VzKFBHY29ubiAqY29ubik7CiBzdGF0aWMgdm9pZCBkdW1w VGFibGVzcGFjZXMoUEdjb25uICpjb25uKTsKIHN0YXRpYyB2b2lkIGRyb3BEQnMoUEdjb25uICpj b25uKTsKIHN0YXRpYyB2b2lkIGR1bXBVc2VyQ29uZmlnKFBHY29ubiAqY29ubiwgY29uc3QgY2hh ciAqdXNlcm5hbWUpOwotc3RhdGljIHZvaWQgZHVtcERhdGFiYXNlcyhQR2Nvbm4gKmNvbm4pOwor c3RhdGljIHZvaWQgZHVtcERhdGFiYXNlcyhQR2Nvbm4gKmNvbm4sIGJvb2wgZGlyZWN0b3J5X2Zv cm1hdCk7CiBzdGF0aWMgdm9pZCBkdW1wVGltZXN0YW1wKGNvbnN0IGNoYXIgKm1zZyk7Ci1zdGF0 aWMgaW50CXJ1blBnRHVtcChjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKmNyZWF0ZV9v cHRzKTsKK3N0YXRpYyBpbnQgcnVuUGdEdW1wKGNvbnN0IGNoYXIgKmRibmFtZSwgY29uc3QgY2hh ciAqY3JlYXRlX29wdHMsCisJCQkJCSBjaGFyICpkYmZpbGUpOwogc3RhdGljIHZvaWQgYnVpbGRT aFNlY0xhYmVscyhQR2Nvbm4gKmNvbm4sCiAJCQkJCQkJIGNvbnN0IGNoYXIgKmNhdGFsb2dfbmFt ZSwgT2lkIG9iamVjdElkLAogCQkJCQkJCSBjb25zdCBjaGFyICpvYmp0eXBlLCBjb25zdCBjaGFy ICpvYmpuYW1lLApAQCAtMTQ3LDYgKzE1MCw3IEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3Zb XSkKIAkJeyJwYXNzd29yZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVyd9LAogCQl7Im5vLXByaXZp bGVnZXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKIAkJeyJuby1hY2wiLCBub19hcmd1bWVu dCwgTlVMTCwgJ3gnfSwKKwkJeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0Yn fSwKIAogCQkvKgogCQkgKiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZG9uJ3QgaGF2ZSBhbiBlcXVp dmFsZW50IHNob3J0IG9wdGlvbiBsZXR0ZXIKQEAgLTE4OCwxMSArMTkyLDEzIEBAIG1haW4oaW50 IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIAljaGFyCSAgICpwZ2RiID0gTlVMTDsKIAljaGFyCSAgICp1 c2Vfcm9sZSA9IE5VTEw7CiAJY29uc3QgY2hhciAqZHVtcGVuY29kaW5nID0gTlVMTDsKKwljb25z dCBjaGFyICpmb3JtYXQ7CiAJdHJpdmFsdWUJcHJvbXB0X3Bhc3N3b3JkID0gVFJJX0RFRkFVTFQ7 CiAJYm9vbAkJZGF0YV9vbmx5ID0gZmFsc2U7CiAJYm9vbAkJZ2xvYmFsc19vbmx5ID0gZmFsc2U7 CiAJYm9vbAkJcm9sZXNfb25seSA9IGZhbHNlOwogCWJvb2wJCXRhYmxlc3BhY2VzX29ubHkgPSBm YWxzZTsKKwlib29sCQlkaXJlY3RvcnlfZm9ybWF0ID0gZmFsc2U7CiAJUEdjb25uCSAgICpjb25u OwogCWludAkJCWVuY29kaW5nOwogCWNvbnN0IGNoYXIgKnN0ZF9zdHJpbmdzOwpAQCAtMjM3LDcg KzI0Myw3IEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIAogCXBnZHVtcG9wdHMgPSBj cmVhdGVQUUV4cEJ1ZmZlcigpOwogCi0Jd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJn diwgImFjZDpFOmY6Z2g6bDpPcDpyc1M6dFU6dndXeCIsIGxvbmdfb3B0aW9ucywgJm9wdGluZGV4 KSkgIT0gLTEpCisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImFjZDpFOmY6 RjpnaDpsOk9wOnJzUzp0VTp2d1d4IiwgbG9uZ19vcHRpb25zLCAmb3B0aW5kZXgpKSAhPSAtMSkK IAl7CiAJCXN3aXRjaCAoYykKIAkJewpAQCAtMjY1LDcgKzI3MSwxNyBAQCBtYWluKGludCBhcmdj LCBjaGFyICphcmd2W10pCiAJCQkJYXBwZW5kUFFFeHBCdWZmZXJTdHIocGdkdW1wb3B0cywgIiAt ZiAiKTsKIAkJCQlhcHBlbmRTaGVsbFN0cmluZyhwZ2R1bXBvcHRzLCBmaWxlbmFtZSk7CiAJCQkJ YnJlYWs7Ci0KKwkJCWNhc2UgJ0YnOgorCQkJCWZvcm1hdCA9IG9wdGFyZzsKKwkJCQlpZiAoKHN0 cmNtcChmb3JtYXQsICJkaXJlY3RvcnkiKSA9PSAwIHx8IHN0cmNtcChmb3JtYXQsICJkIikgPT0g MCkpCisJCQkJCWRpcmVjdG9yeV9mb3JtYXQgPSB0cnVlOworCQkJCWVsc2UgaWYgKHN0cmNtcChm b3JtYXQsICJwbGFpbiIpICE9IDAgfHwgc3RyY21wKGZvcm1hdCwgInAiKSA9PSAwKQorCQkJCXsK KwkJCQkJcGdfbG9nX2Vycm9yKCJpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZWQ6ICVzIiwgZm9ybWF0 KTsKKwkJCQkJcGdfbG9nX2Vycm9yX2hpbnQoIlRyeSBcIiVzIC0taGVscFwiIGZvciBtb3JlIGlu Zm9ybWF0aW9uLiIsIHByb2duYW1lKTsKKwkJCQkJZXhpdF9uaWNlbHkoMSk7CisJCQkJfQorCQkJ CWJyZWFrOwogCQkJY2FzZSAnZyc6CiAJCQkJZ2xvYmFsc19vbmx5ID0gdHJ1ZTsKIAkJCQlicmVh azsKQEAgLTQ5Nyw5ICs1MTMsMzEgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogCQkJ CQkJICAgJmRhdGFiYXNlX2V4Y2x1ZGVfbmFtZXMpOwogCiAJLyoKLQkgKiBPcGVuIHRoZSBvdXRw dXQgZmlsZSBpZiByZXF1aXJlZCwgb3RoZXJ3aXNlIHVzZSBzdGRvdXQKKwkgKiBPcGVuIHRoZSBv dXRwdXQgZmlsZSBpZiByZXF1aXJlZCwgb3RoZXJ3aXNlIHVzZSBzdGRvdXQuCiAJICovCi0JaWYg KGZpbGVuYW1lKQorCWlmIChkaXJlY3RvcnlfZm9ybWF0KQorCXsKKwkJY2hhcgl0b2NfcGF0aFtN QVhQR1BBVEhdOworCisJCS8qCisJCSAqIElmIGRpcmVjdG9yeSBmb3JtYXQgaXMgc3BlY2lmaWVk IHRoZW4gd2UgbXVzdCBwcm92aWRlIHRoZSBkaXJlY3RvcnkKKwkJICogbmFtZS4KKwkJICovCisJ CWlmICghZmlsZW5hbWUgfHwgc3RyY21wKGZpbGVuYW1lLCAiIikgPT0gMCkKKwkJCXBnX2ZhdGFs KCJubyBvdXRwdXQgZGlyZWN0b3J5IHNwZWNpZmllZCIpOworCisJCS8qIFRPRE86IGFjY2VwdCB0 aGUgZW1wdHkgZXhpc3RpbmcgZGlyZWN0b3J5LiAqLworCQlpZiAobWtkaXIoZmlsZW5hbWUsIDA3 MDApIDwgMCkKKwkJCXBnX2ZhdGFsKCJjb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiVzXCI6 ICVtIiwKKwkJCQkJIGZpbGVuYW1lKTsKKworCQlzbnByaW50Zih0b2NfcGF0aCwgTUFYUEdQQVRI LCAiJXMvZ2xvYmFsLmRhdCIsIGZpbGVuYW1lKTsKKworCQlPUEYgPSBmb3Blbih0b2NfcGF0aCwg InciKTsKKwkJaWYgKCFPUEYpCisJCQlwZ19mYXRhbCgiY291bGQgbm90IG9wZW4gZ2xvYmFsLmRh dCBmaWxlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWVsc2UgaWYgKGZpbGVuYW1lKQog CXsKIAkJT1BGID0gZm9wZW4oZmlsZW5hbWUsIFBHX0JJTkFSWV9XKTsKIAkJaWYgKCFPUEYpCkBA IC02MDcsNyArNjQ1LDcgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogCX0KIAogCWlm ICghZ2xvYmFsc19vbmx5ICYmICFyb2xlc19vbmx5ICYmICF0YWJsZXNwYWNlc19vbmx5KQotCQlk dW1wRGF0YWJhc2VzKGNvbm4pOworCQlkdW1wRGF0YWJhc2VzKGNvbm4sIGRpcmVjdG9yeV9mb3Jt YXQpOwogCiAJUFFmaW5pc2goY29ubik7CiAKQEAgLTYyMCw3ICs2NTgsNyBAQCBtYWluKGludCBh cmdjLCBjaGFyICphcmd2W10pCiAJCWZjbG9zZShPUEYpOwogCiAJCS8qIHN5bmMgdGhlIHJlc3Vs dGluZyBmaWxlLCBlcnJvcnMgYXJlIG5vdCBmYXRhbCAqLwotCQlpZiAoZG9zeW5jKQorCQlpZiAo ZG9zeW5jICYmICFkaXJlY3RvcnlfZm9ybWF0KQogCQkJKHZvaWQpIGZzeW5jX2ZuYW1lKGZpbGVu YW1lLCBmYWxzZSk7CiAJfQogCkBAIC02MzcsNiArNjc1LDcgQEAgaGVscCh2b2lkKQogCiAJcHJp bnRmKF8oIlxuR2VuZXJhbCBvcHRpb25zOlxuIikpOwogCXByaW50ZihfKCIgIC1mLCAtLWZpbGU9 RklMRU5BTUUgICAgICAgICAgb3V0cHV0IGZpbGUgbmFtZVxuIikpOworCXByaW50ZihfKCIgIC1G LCAtLWZvcm1hdD1kfHAgICAgICAgICAgICAgb3V0cHV0IGZpbGUgZm9ybWF0IChkaXJlY3Rvcnks IHBsYWluIHRleHQgKGRlZmF1bHQpKVxuIikpOwogCXByaW50ZihfKCIgIC12LCAtLXZlcmJvc2Ug ICAgICAgICAgICAgICAgdmVyYm9zZSBtb2RlXG4iKSk7CiAJcHJpbnRmKF8oIiAgLVYsIC0tdmVy c2lvbiAgICAgICAgICAgICAgICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiwgdGhlbiBleGl0 XG4iKSk7CiAJcHJpbnRmKF8oIiAgLS1sb2NrLXdhaXQtdGltZW91dD1USU1FT1VUICBmYWlsIGFm dGVyIHdhaXRpbmcgVElNRU9VVCBmb3IgYSB0YWJsZSBsb2NrXG4iKSk7CkBAIC0xNDg3LDEwICsx NTI2LDEzIEBAIGV4cGFuZF9kYm5hbWVfcGF0dGVybnMoUEdjb25uICpjb25uLAogICogRHVtcCBj b250ZW50cyBvZiBkYXRhYmFzZXMuCiAgKi8KIHN0YXRpYyB2b2lkCi1kdW1wRGF0YWJhc2VzKFBH Y29ubiAqY29ubikKK2R1bXBEYXRhYmFzZXMoUEdjb25uICpjb25uLCBib29sIGRpcmVjdG9yeV9m b3JtYXQpCiB7CiAJUEdyZXN1bHQgICAqcmVzOwogCWludAkJCWk7CisJY2hhcgkJZGJfc3ViZGly W01BWFBHUEFUSF07CisJY2hhcgkJZGJmaWxlcGF0aFtNQVhQR1BBVEhdOworCUZJTEUgICAgICAg Km1hcF9maWxlOwogCiAJLyoKIAkgKiBTa2lwIGRhdGFiYXNlcyBtYXJrZWQgbm90IGRhdGFsbG93 Y29ubiwgc2luY2Ugd2UnZCBiZSB1bmFibGUgdG8gY29ubmVjdApAQCAtMTUwNCw3ICsxNTQ2LDcg QEAgZHVtcERhdGFiYXNlcyhQR2Nvbm4gKmNvbm4pCiAJICogZG9lc24ndCBoYXZlIHNvbWUgZmFp bHVyZSBtb2RlIHdpdGggLS1jbGVhbi4KIAkgKi8KIAlyZXMgPSBleGVjdXRlUXVlcnkoY29ubiwK LQkJCQkJICAgIlNFTEVDVCBkYXRuYW1lICIKKwkJCQkJICAgIlNFTEVDVCBkYXRuYW1lLCBvaWQg IgogCQkJCQkgICAiRlJPTSBwZ19kYXRhYmFzZSBkICIKIAkJCQkJICAgIldIRVJFIGRhdGFsbG93 Y29ubiBBTkQgZGF0Y29ubmxpbWl0ICE9IC0yICIKIAkJCQkJICAgIk9SREVSIEJZIChkYXRuYW1l IDw+ICd0ZW1wbGF0ZTEnKSwgZGF0bmFtZSIpOwpAQCAtMTUxMiw5ICsxNTU0LDMwIEBAIGR1bXBE YXRhYmFzZXMoUEdjb25uICpjb25uKQogCWlmIChQUW50dXBsZXMocmVzKSA+IDApCiAJCWZwcmlu dGYoT1BGLCAiLS1cbi0tIERhdGFiYXNlc1xuLS1cblxuIik7CiAKKwkvKgorCSAqIElmIGRpcmVj dG9yeSBmb3JtYXQgaXMgc3BlY2lmaWVkIHRoZW4gY3JlYXRlIGEgc3ViZGlyZWN0b3J5IHVuZGVy IHRoZQorCSAqIG1haW4gZGlyZWN0b3J5IGFuZCBlYWNoIGRhdGFiYXNlIGR1bXAgZmlsZSB3aWxs IGJlIGNyZWF0ZWQgdW5kZXIgdGhlCisJICogc3ViZGlyZWN0b3J5IGluIGFyY2hpdmUgbW9kZSBh cyBwZXIgc2luZ2xlIGRiIHBnX2R1bXAuCisJICovCisJaWYgKGRpcmVjdG9yeV9mb3JtYXQpCisJ eworCQljaGFyICAgIG1hcF9maWxlX3BhdGhbTUFYUEdQQVRIXTsKKworCQlzbnByaW50ZihkYl9z dWJkaXIsIE1BWFBHUEFUSCwgIiVzL2RhdGFiYXNlcyIsIGZpbGVuYW1lKTsKKwkJaWYgKG1rZGly KGRiX3N1YmRpciwgMDc1NSkgIT0gMCkKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGNyZWF0 ZSBzdWJkaXJlY3RvcnkgXCIlc1wiOiAlbSIsIGRiX3N1YmRpcik7CisKKwkJLyogQ3JlYXRlIGEg bWFwIGZpbGUgKHRvIHN0b3JlIGRib2lkIGFuZCBkYm5hbWUpICovCisJCXNucHJpbnRmKG1hcF9m aWxlX3BhdGgsIE1BWFBHUEFUSCwgIiVzL21hcC5kYXQiLCBmaWxlbmFtZSk7CisJCW1hcF9maWxl ID0gZm9wZW4obWFwX2ZpbGVfcGF0aCwgInciKTsKKwkJaWYgKCFtYXBfZmlsZSkKKwkJCXBnX2Zh dGFsKCJjb3VsZCBub3Qgb3BlbiBtYXAgZmlsZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0K KwogCWZvciAoaSA9IDA7IGkgPCBQUW50dXBsZXMocmVzKTsgaSsrKQogCXsKIAkJY2hhcgkgICAq ZGJuYW1lID0gUFFnZXR2YWx1ZShyZXMsIGksIDApOworCQljaGFyCSAgICpvaWQgPSBQUWdldHZh bHVlKHJlcywgaSwgMSk7CiAJCWNvbnN0IGNoYXIgKmNyZWF0ZV9vcHRzOwogCQlpbnQJCQlyZXQ7 CiAKQEAgLTE1MjIsNiArMTU4NSwxNCBAQCBkdW1wRGF0YWJhc2VzKFBHY29ubiAqY29ubikKIAkJ aWYgKHN0cmNtcChkYm5hbWUsICJ0ZW1wbGF0ZTAiKSA9PSAwKQogCQkJY29udGludWU7CiAKKwkJ aWYgKGRpcmVjdG9yeV9mb3JtYXQpCisJCXsKKwkJCXNucHJpbnRmKGRiZmlsZXBhdGgsIE1BWFBH UEFUSCwgIi1mICVzLyVzIiwgZGJfc3ViZGlyLCBvaWQpOworCisJCQkvKiBhcHBlbmQgZGJvaWQg YW5kIGRibmFtZSBpbiBtYXAgZmlsZS4gKi8KKwkJCWZwcmludGYobWFwX2ZpbGUsICIlcyAlc1xu Iiwgb2lkLCBkYm5hbWUpOworCQl9CisKIAkJLyogU2tpcCBhbnkgZXhwbGljaXRseSBleGNsdWRl ZCBkYXRhYmFzZSAqLwogCQlpZiAoc2ltcGxlX3N0cmluZ19saXN0X21lbWJlcigmZGF0YWJhc2Vf ZXhjbHVkZV9uYW1lcywgZGJuYW1lKSkKIAkJewpAQCAtMTUzMSw3ICsxNjAyLDggQEAgZHVtcERh dGFiYXNlcyhQR2Nvbm4gKmNvbm4pCiAKIAkJcGdfbG9nX2luZm8oImR1bXBpbmcgZGF0YWJhc2Ug XCIlc1wiIiwgZGJuYW1lKTsKIAotCQlmcHJpbnRmKE9QRiwgIi0tXG4tLSBEYXRhYmFzZSBcIiVz XCIgZHVtcFxuLS1cblxuIiwgZGJuYW1lKTsKKwkJaWYgKCFkaXJlY3RvcnlfZm9ybWF0KQorCQkJ ZnByaW50ZihPUEYsICItLVxuLS0gRGF0YWJhc2UgXCIlc1wiIGR1bXBcbi0tXG5cbiIsIGRibmFt ZSk7CiAKIAkJLyoKIAkJICogV2UgYXNzdW1lIHRoYXQgInRlbXBsYXRlMSIgYW5kICJwb3N0Z3Jl cyIgYWxyZWFkeSBleGlzdCBpbiB0aGUKQEAgLTE1NDksMjAgKzE2MjEsMjEgQEAgZHVtcERhdGFi YXNlcyhQR2Nvbm4gKmNvbm4pCiAJCQl7CiAJCQkJY3JlYXRlX29wdHMgPSAiIjsKIAkJCQkvKiBT aW5jZSBwZ19kdW1wIHdvbid0IGVtaXQgYSBcY29ubmVjdCBjb21tYW5kLCB3ZSBtdXN0ICovCi0J CQkJZnByaW50ZihPUEYsICJcXGNvbm5lY3QgJXNcblxuIiwgZGJuYW1lKTsKKwkJCQlpZiAoIWRp cmVjdG9yeV9mb3JtYXQpCisJCQkJCWZwcmludGYoT1BGLCAiXFxjb25uZWN0ICVzXG5cbiIsIGRi bmFtZSk7CiAJCQl9CiAJCX0KIAkJZWxzZQogCQkJY3JlYXRlX29wdHMgPSAiLS1jcmVhdGUiOwog Ci0JCWlmIChmaWxlbmFtZSkKKwkJaWYgKCFkaXJlY3RvcnlfZm9ybWF0ICYmIGZpbGVuYW1lKQog CQkJZmNsb3NlKE9QRik7CiAKLQkJcmV0ID0gcnVuUGdEdW1wKGRibmFtZSwgY3JlYXRlX29wdHMp OworCQlyZXQgPSBydW5QZ0R1bXAoZGJuYW1lLCBjcmVhdGVfb3B0cywgZGJmaWxlcGF0aCk7CiAJ CWlmIChyZXQgIT0gMCkKIAkJCXBnX2ZhdGFsKCJwZ19kdW1wIGZhaWxlZCBvbiBkYXRhYmFzZSBc IiVzXCIsIGV4aXRpbmciLCBkYm5hbWUpOwogCi0JCWlmIChmaWxlbmFtZSkKKwkJaWYgKCFkaXJl Y3RvcnlfZm9ybWF0ICYmIGZpbGVuYW1lKQogCQl7CiAJCQlPUEYgPSBmb3BlbihmaWxlbmFtZSwg UEdfQklOQVJZX0EpOwogCQkJaWYgKCFPUEYpCkBAIC0xNTcxLDYgKzE2NDQsMTAgQEAgZHVtcERh dGFiYXNlcyhQR2Nvbm4gKmNvbm4pCiAJCX0KIAl9CiAKKwkvKiBjbG9zZSBtYXAgZmlsZSAqLwor CWlmIChkaXJlY3RvcnlfZm9ybWF0KQorCQlmY2xvc2UobWFwX2ZpbGUpOworCiAJUFFjbGVhcihy ZXMpOwogfQogCkBAIC0xNTgwLDcgKzE2NTcsNyBAQCBkdW1wRGF0YWJhc2VzKFBHY29ubiAqY29u bikKICAqIFJ1biBwZ19kdW1wIG9uIGRibmFtZSwgd2l0aCBzcGVjaWZpZWQgb3B0aW9ucy4KICAq Lwogc3RhdGljIGludAotcnVuUGdEdW1wKGNvbnN0IGNoYXIgKmRibmFtZSwgY29uc3QgY2hhciAq Y3JlYXRlX29wdHMpCitydW5QZ0R1bXAoY29uc3QgY2hhciAqZGJuYW1lLCBjb25zdCBjaGFyICpj cmVhdGVfb3B0cywgY2hhciAqZGJmaWxlKQogewogCVBRRXhwQnVmZmVyRGF0YSBjb25uc3RyYnVm OwogCVBRRXhwQnVmZmVyRGF0YSBjbWQ7CkBAIC0xNTg5LDE3ICsxNjY2LDI2IEBAIHJ1blBnRHVt cChjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKmNyZWF0ZV9vcHRzKQogCWluaXRQUUV4 cEJ1ZmZlcigmY29ubnN0cmJ1Zik7CiAJaW5pdFBRRXhwQnVmZmVyKCZjbWQpOwogCi0JcHJpbnRm UFFFeHBCdWZmZXIoJmNtZCwgIlwiJXNcIiAlcyAlcyIsIHBnX2R1bXBfYmluLAotCQkJCQkgIHBn ZHVtcG9wdHMtPmRhdGEsIGNyZWF0ZV9vcHRzKTsKLQotCS8qCi0JICogSWYgd2UgaGF2ZSBhIGZp bGVuYW1lLCB1c2UgdGhlIHVuZG9jdW1lbnRlZCBwbGFpbi1hcHBlbmQgcGdfZHVtcAotCSAqIGZv cm1hdC4KLQkgKi8KLQlpZiAoZmlsZW5hbWUpCi0JCWFwcGVuZFBRRXhwQnVmZmVyU3RyKCZjbWQs ICIgLUZhICIpOworCWlmIChkYmZpbGUpCisJeworCQlwcmludGZQUUV4cEJ1ZmZlcigmY21kLCAi XCIlc1wiICVzICVzIiwgcGdfZHVtcF9iaW4sCisJCQkJCQkgIGRiZmlsZSwgY3JlYXRlX29wdHMp OworCQlhcHBlbmRQUUV4cEJ1ZmZlclN0cigmY21kLCAiIC1GIGQgIik7CisJfQogCWVsc2UKLQkJ YXBwZW5kUFFFeHBCdWZmZXJTdHIoJmNtZCwgIiAtRnAgIik7CisJeworCQlwcmludGZQUUV4cEJ1 ZmZlcigmY21kLCAiXCIlc1wiICVzICVzIiwgcGdfZHVtcF9iaW4sCisJCQkJCQlwZ2R1bXBvcHRz LT5kYXRhLCBjcmVhdGVfb3B0cyk7CisKKwkJLyoKKwkJKiBJZiB3ZSBoYXZlIGEgZmlsZW5hbWUs IHVzZSB0aGUgdW5kb2N1bWVudGVkIHBsYWluLWFwcGVuZCBwZ19kdW1wCisJCSogZm9ybWF0Lgor CQkqLworCQlpZiAoZmlsZW5hbWUpCisJCQlhcHBlbmRQUUV4cEJ1ZmZlclN0cigmY21kLCAiIC1G YSAiKTsKKwkJZWxzZQorCQkJYXBwZW5kUFFFeHBCdWZmZXJTdHIoJmNtZCwgIiAtRnAgIik7CisJ fQogCiAJLyoKIAkgKiBBcHBlbmQgdGhlIGRhdGFiYXNlIG5hbWUgdG8gdGhlIGFscmVhZHktY29u c3RydWN0ZWQgc3RlbSBvZiBjb25uZWN0aW9uCmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2R1bXAv cGdfcmVzdG9yZS5jIGIvc3JjL2Jpbi9wZ19kdW1wL3BnX3Jlc3RvcmUuYwppbmRleCA4OGFlMzlk Li41NWQxODYyIDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX2R1bXAvcGdfcmVzdG9yZS5jCisrKyBi L3NyYy9iaW4vcGdfZHVtcC9wZ19yZXN0b3JlLmMKQEAgLTQxLDI3ICs0MSw2NSBAQAogI2luY2x1 ZGUgInBvc3RncmVzX2ZlLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN5cy9z dGF0Lmg+CiAjaWZkZWYgSEFWRV9URVJNSU9TX0gKICNpbmNsdWRlIDx0ZXJtaW9zLmg+CiAjZW5k aWYKIAorI2luY2x1ZGUgImNvbW1vbi9jb25uZWN0LmgiCisjaW5jbHVkZSAiY29tcHJlc3NfaW8u aCIKKyNpbmNsdWRlICJjb21tb24vc3RyaW5nLmgiCiAjaW5jbHVkZSAiZmVfdXRpbHMvb3B0aW9u X3V0aWxzLmgiCisjaW5jbHVkZSAiZmVfdXRpbHMvc3RyaW5nX3V0aWxzLmgiCiAjaW5jbHVkZSAi ZmlsdGVyLmgiCiAjaW5jbHVkZSAiZ2V0b3B0X2xvbmcuaCIKICNpbmNsdWRlICJwYXJhbGxlbC5o IgorI2luY2x1ZGUgInBnX2JhY2t1cF9hcmNoaXZlci5oIgogI2luY2x1ZGUgInBnX2JhY2t1cF91 dGlscy5oIgogCit0eXBlZGVmIHN0cnVjdCBTaW1wbGVEQm9pZExpc3RDZWxsCit7CisJc3RydWN0 IFNpbXBsZURCb2lkTGlzdENlbGwgKm5leHQ7CisJT2lkICAgICAgICAgZGJvaWQ7CisJY29uc3Qg Y2hhciAgKmRibmFtZTsKK30gU2ltcGxlREJvaWRMaXN0Q2VsbDsKKwordHlwZWRlZiBzdHJ1Y3Qg U2ltcGxlQWN0aW9uTGlzdAoreworCVNpbXBsZURCb2lkTGlzdENlbGwgKmhlYWQ7CisJU2ltcGxl REJvaWRMaXN0Q2VsbCAqdGFpbDsKK30gU2ltcGxlREJvaWRMaXN0OworCitzdGF0aWMgdm9pZAor c2ltcGxlX2Rib2lkX2xpc3RfYXBwZW5kKFNpbXBsZURCb2lkTGlzdCAqbGlzdCwgT2lkIGRib2lk LCBjb25zdCBjaGFyICpkYm5hbWUpOworCiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpw cm9nbmFtZSk7CiBzdGF0aWMgdm9pZCByZWFkX3Jlc3RvcmVfZmlsdGVycyhjb25zdCBjaGFyICpm aWxlbmFtZSwgUmVzdG9yZU9wdGlvbnMgKm9wdHMpOworc3RhdGljIGJvb2wgX2ZpbGVFeGlzdHNJ bkRpcmVjdG9yeShjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3N0YXRp YyBib29sIHJlc3RvcmVPbmVEYXRhYmFzZShjb25zdCBjaGFyICppbnB1dEZpbGVTcGVjLAorCQlS ZXN0b3JlT3B0aW9ucyAqb3B0cywgaW50IG51bVdvcmtlcnMpOworc3RhdGljIFBHY29ubiAqY29u bmVjdERhdGFiYXNlKGNvbnN0IGNoYXIgKmRibmFtZSwgY29uc3QgY2hhciAqY29ubl9zdHJpbmcs CisJCWNvbnN0IGNoYXIgKnBnaG9zdCwgY29uc3QgY2hhciAqcGdwb3J0LCBjb25zdCBjaGFyICpw Z3VzZXIsCisJCXRyaXZhbHVlIHByb21wdF9wYXNzd29yZCwgYm9vbCBmYWlsX29uX2Vycm9yKTsK K3N0YXRpYyBQR3Jlc3VsdCAqZXhlY3V0ZVF1ZXJ5KFBHY29ubiAqY29ubiwgY29uc3QgY2hhciAq cXVlcnkpOworc3RhdGljIGludCBSZWFkT25lU3RhdGVtZW50KFN0cmluZ0luZm8gaW5CdWYsIEZJ TEUgKmZfZ2xvKTsKK3N0YXRpYyBpbnQgcmVzdG9yZUFsbERhdGFiYXNlcyhjb25zdCBjaGFyICpk dW1wZGlycGF0aCwKKwkJU2ltcGxlU3RyaW5nTGlzdCBkYXRhYmFzZV9leGNsdWRlX25hbWVzLCBS ZXN0b3JlT3B0aW9ucyAqb3B0cywKKwkJaW50IG51bVdvcmtlcnMpOworc3RhdGljIHZvaWQgZXhl Y3V0ZV9nbG9iYWxfc3FsX2NvbW1hbmRzKFBHY29ubiAqY29ubiwgY29uc3QgY2hhciAqZHVtcGRp cnBhdGgpOworc3RhdGljIGludCBmaWx0ZXJfZGJuYW1lc19mb3JfcmVzdG9yZShTaW1wbGVEQm9p ZExpc3QgKmRibmFtZV9vaWRfbGlzdCwKKwkJU2ltcGxlU3RyaW5nTGlzdCBkYXRhYmFzZV9leGNs dWRlX25hbWVzKTsKK3N0YXRpYyBpbnQgZ2V0X2RibmFtZV9vaWRfbGlzdF9mcm9tX21maWxlKGNv bnN0IGNoYXIgKmR1bXBkaXJwYXRoLAorCQlTaW1wbGVEQm9pZExpc3QgKmRibmFtZV9vaWRfbGlz dCk7CitzdGF0aWMgdm9pZCBzaW1wbGVfZGJvaWRfbGlzdF9hcHBlbmQoU2ltcGxlREJvaWRMaXN0 ICpsaXN0LCBPaWQgZGJvaWQsCisJCWNvbnN0IGNoYXIgKmRibmFtZSk7CiAKIGludAogbWFpbihp bnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJUmVzdG9yZU9wdGlvbnMgKm9wdHM7CiAJaW50CQkJ YzsKLQlpbnQJCQlleGl0X2NvZGU7CiAJaW50CQkJbnVtV29ya2VycyA9IDE7Ci0JQXJjaGl2ZSAg ICAqQUg7CiAJY2hhcgkgICAqaW5wdXRGaWxlU3BlYzsKIAlzdGF0aWMgaW50CWRpc2FibGVfdHJp Z2dlcnMgPSAwOwogCXN0YXRpYyBpbnQJZW5hYmxlX3Jvd19zZWN1cml0eSA9IDA7CkBAIC03Nywx MSArMTE1LDE0IEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCXN0YXRpYyBpbnQJc3Ry aWN0X25hbWVzID0gMDsKIAlib29sCQlkYXRhX29ubHkgPSBmYWxzZTsKIAlib29sCQlzY2hlbWFf b25seSA9IGZhbHNlOworCVNpbXBsZVN0cmluZ0xpc3QgICAgZGF0YWJhc2VfZXhjbHVkZV9uYW1l cyA9IHtOVUxMLCBOVUxMfTsKKwlib29sCQkJCWdsb2JhbHNfb25seSA9IGZhbHNlOwogCiAJc3Ry dWN0IG9wdGlvbiBjbWRvcHRzW10gPSB7CiAJCXsiY2xlYW4iLCAwLCBOVUxMLCAnYyd9LAogCQl7 ImNyZWF0ZSIsIDAsIE5VTEwsICdDJ30sCiAJCXsiZGF0YS1vbmx5IiwgMCwgTlVMTCwgJ2EnfSwK KwkJeyJnbG9iYWxzLW9ubHkiLCAwLCBOVUxMLCAnZyd9LAogCQl7ImRibmFtZSIsIDEsIE5VTEws ICdkJ30sCiAJCXsiZXhpdC1vbi1lcnJvciIsIDAsIE5VTEwsICdlJ30sCiAJCXsiZXhjbHVkZS1z Y2hlbWEiLCAxLCBOVUxMLCAnTid9LApAQCAtMTI4LDYgKzE2OSw3IEBAIG1haW4oaW50IGFyZ2Ms IGNoYXIgKiphcmd2KQogCQl7Im5vLXNlY3VyaXR5LWxhYmVscyIsIG5vX2FyZ3VtZW50LCAmbm9f c2VjdXJpdHlfbGFiZWxzLCAxfSwKIAkJeyJuby1zdWJzY3JpcHRpb25zIiwgbm9fYXJndW1lbnQs ICZub19zdWJzY3JpcHRpb25zLCAxfSwKIAkJeyJmaWx0ZXIiLCByZXF1aXJlZF9hcmd1bWVudCwg TlVMTCwgNH0sCisJCXsiZXhjbHVkZS1kYXRhYmFzZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxM LCA2fSwKIAogCQl7TlVMTCwgMCwgTlVMTCwgMH0KIAl9OwpAQCAtMTU2LDcgKzE5OCw3IEBAIG1h aW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQl9CiAJfQogCi0Jd2hpbGUgKChjID0gZ2V0b3B0 X2xvbmcoYXJnYywgYXJndiwgImFjQ2Q6ZWY6RjpoOkk6ajpsTDpuOk46T3A6UDpSc1M6dDpUOlU6 dndXeDEiLAorCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJhQWNDZDplZjpG OmdoOkk6ajpsTDpuOk46T3A6UDpSc1M6dDpUOlU6dndXeDEiLAogCQkJCQkJCWNtZG9wdHMsIE5V TEwpKSAhPSAtMSkKIAl7CiAJCXN3aXRjaCAoYykKQEAgLTE4MywxMSArMjI1LDE0IEBAIG1haW4o aW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkJCWlmIChzdHJsZW4ob3B0YXJnKSAhPSAwKQogCQkJ CQlvcHRzLT5mb3JtYXROYW1lID0gcGdfc3RyZHVwKG9wdGFyZyk7CiAJCQkJYnJlYWs7CisJCQlj YXNlICdnJzoKKwkJCQkvKiByZXN0b3JlIG9ubHkgZ2xvYmFsLmRhdCBmaWxlIGZyb20gZGlyZWN0 b3J5ICovCisJCQkJZ2xvYmFsc19vbmx5ID0gdHJ1ZTsKKwkJCQlicmVhazsKIAkJCWNhc2UgJ2gn OgogCQkJCWlmIChzdHJsZW4ob3B0YXJnKSAhPSAwKQogCQkJCQlvcHRzLT5jcGFyYW1zLnBnaG9z dCA9IHBnX3N0cmR1cChvcHRhcmcpOwogCQkJCWJyZWFrOwotCiAJCQljYXNlICdqJzoJCQkvKiBu dW1iZXIgb2YgcmVzdG9yZSBqb2JzICovCiAJCQkJaWYgKCFvcHRpb25fcGFyc2VfaW50KG9wdGFy ZywgIi1qLy0tam9icyIsIDEsCiAJCQkJCQkJCQkgIFBHX01BWF9KT0JTLApAQCAtMzAyLDYgKzM0 NywxNCBAQCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJCQkJZXhpdCgxKTsKIAkJCQlv cHRzLT5leGl0X29uX2Vycm9yID0gdHJ1ZTsKIAkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQkv KiBsaXN0IG9mIGRhdGFiYXNlcyB0aG9zZSBuZWVkcyB0byBza2lwIHdoaWxlIHJlc3RvcmluZyAq LworCQkJCXNpbXBsZV9zdHJpbmdfbGlzdF9hcHBlbmQoJmRhdGFiYXNlX2V4Y2x1ZGVfbmFtZXMs IG9wdGFyZyk7CisJCQkJLyoKKwkJCQkgKiBYWFg6IFRPRE8gYXMgb2Ygbm93LCBjb25zaWRlcmlu ZyBvbmx5IGRiIG5hbWVzIGJ1dCB3ZSBjYW4KKwkJCQkgKiBpbXBsZW1lbnQgZm9yIHBhdHRlcm5z IGFsc28uCisJCQkJICovCisJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6CiAJCQkJLyogZ2V0b3B0 X2xvbmcgYWxyZWFkeSBlbWl0dGVkIGEgY29tcGxhaW50ICovCkBAIC0zMjksNiArMzgyLDE2IEBA IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWlmICghb3B0cy0+Y3BhcmFtcy5kYm5hbWUg JiYgIW9wdHMtPmZpbGVuYW1lICYmICFvcHRzLT50b2NTdW1tYXJ5KQogCQlwZ19mYXRhbCgib25l IG9mIC1kLy0tZGJuYW1lIGFuZCAtZi8tLWZpbGUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKIAorCWlm IChkYXRhYmFzZV9leGNsdWRlX25hbWVzLmhlYWQgIT0gTlVMTCAmJiBnbG9iYWxzX29ubHkpCisJ eworCQlwZ19sb2dfZXJyb3IoIm9wdGlvbiAtLWV4Y2x1ZGUtZGF0YWJhc2UgY2Fubm90IGJlIHVz ZWQgdG9nZXRoZXIgd2l0aCAtZy8tLWdsb2JhbHMtb25seSIpOworCQlwZ19sb2dfZXJyb3JfaGlu dCgiVHJ5IFwiJXMgLS1oZWxwXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiwgcHJvZ25hbWUpOwor CQlleGl0X25pY2VseSgxKTsKKwl9CisKKwlpZiAoZ2xvYmFsc19vbmx5ICYmIG9wdHMtPmNwYXJh bXMuZGJuYW1lID09IE5VTEwpCisJCXBnX2ZhdGFsKCJvcHRpb24gLWcvLS1nbG9iYWxzLW9ubHkg cmVxdWlyZXMgb3B0aW9uIC1kLy0tZGJuYW1lIik7CisKIAkvKiBTaG91bGQgZ2V0IGF0IG1vc3Qg b25lIG9mIC1kIGFuZCAtZiwgZWxzZSB1c2VyIGlzIGNvbmZ1c2VkICovCiAJaWYgKG9wdHMtPmNw YXJhbXMuZGJuYW1lKQogCXsKQEAgLTQwNiw2ICs0NjksNjggQEAgbWFpbihpbnQgYXJnYywgY2hh ciAqKmFyZ3YpCiAJCX0KIAl9CiAKKwkvKgorCSAqIElmIGRpcmVjdG9yeSBmb3JtYXQsIHRoZW4g Zmlyc3QgY2hlY2sgdGhhdCB0b2MuZGF0IGZpbGUgZXhpc3Qgb3Igbm90PworCSAqCisJICogaWYg dG9jLmRhdCBleGlzdCwgdGhlbiBubyBuZWVkIHRvIGNoZWNrIGZvciBtYXAuZGF0IGFuZCBnbG9i YWwuZGF0CisJICoKKwkgKi8KKwlpZiAob3B0cy0+Zm9ybWF0ID09IGFyY2hEaXJlY3RvcnkgJiYK KwkJCWlucHV0RmlsZVNwZWMgIT0gTlVMTCAmJgorCQkJIV9maWxlRXhpc3RzSW5EaXJlY3Rvcnko aW5wdXRGaWxlU3BlYywgInRvYy5kYXQiKSkKKwl7CisJCS8qIGlmIGdsb2JhbC5kYXQgYW5kIG1h cC5kYXQgYXJlIGV4aXN0LCB0aGVuIG9wZW4gdGhlbSAqLworCQlpZiAoX2ZpbGVFeGlzdHNJbkRp cmVjdG9yeShwZ19zdHJkdXAoaW5wdXRGaWxlU3BlYyksICJnbG9iYWwuZGF0IikKKwkJCQkmJiBf ZmlsZUV4aXN0c0luRGlyZWN0b3J5KHBnX3N0cmR1cChpbnB1dEZpbGVTcGVjKSwgIm1hcC5kYXQi KSkKKwkJeworCQkJLyogRm91bmQgdGhlIGdsb2JhbC5kYXQgYW5kIG1hcC5kYXQgZmlsZSBzbyBw cm9jZXNzLiAqLworCQkJUEdjb25uCQkJCSpjb25uID0gTlVMTDsKKworCQkJaWYgKG9wdHMtPmNw YXJhbXMuZGJuYW1lID09IE5VTEwpCisJCQkJcGdfZmF0YWwoIiAtZC8tLWRiYW5tZSBzaG91bGQg YmUgZ2l2ZW4gaWYgdXNpbmcgZHVtcCBvZiBkdW1wYWxsIGFuZCBnbG9iYWwuZGF0Iik7CisKKwkJ CWlmIChvcHRzLT5jcmVhdGVEQiAhPSAxKQorCQkJCXBnX2ZhdGFsKCJvcHRpb24gLUMvLS1jcmVh dGUgc2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBkdW1wIG9mIGR1bXBhbGwgd2l0aCBnbG9i YWwuZGF0Iik7CisKKwkJCS8qIENvbm5lY3QgdG8gZGF0YWJhc2Ugc28gdGhhdCB3ZSBjYW4gZXhl Y3V0ZSBnbG9iYWwuZGF0ICovCisJCQljb25uID0gY29ubmVjdERhdGFiYXNlKG9wdHMtPmNwYXJh bXMuZGJuYW1lLCBOVUxMLAorCQkJCQlvcHRzLT5jcGFyYW1zLnBnaG9zdCwgb3B0cy0+Y3BhcmFt cy5wZ3BvcnQsIG9wdHMtPmNwYXJhbXMudXNlcm5hbWUsCisJCQkJCVRSSV9ERUZBVUxULCBmYWxz ZSk7CisKKwkJCWlmICghY29ubikKKwkJCQlwZ19mYXRhbCgiY291bGQgbm90IGNvbm5lY3QgdG8g ZGF0YWJhc2UgXCIlc1wiIiwgb3B0cy0+Y3BhcmFtcy5kYm5hbWUpOworCisJCQkvKiBPcGVuIGds b2JhbC5kYXQgZmlsZSBhbmQgZXhlY3V0ZSBhbGwgdGhlIHNxbCBjb21tYW5kcyAqLworCQkJZXhl Y3V0ZV9nbG9iYWxfc3FsX2NvbW1hbmRzKGNvbm4sIGlucHV0RmlsZVNwZWMpOworCisJCQkvKiBD bG9zZSB0aGUgZGIgY29ubmVjdGlvbiBhcyB3ZSBhcmUgZG9uZSB3aXRoIGdsb2JhbHMgKi8KKwkJ CVBRZmluaXNoKGNvbm4pOworCisJCQkvKiBpZiBnbG9iYWxzLW9ubHksIHRoZW4gcmV0dXJuIGZy b20gaGVyZSAqLworCQkJaWYgKGdsb2JhbHNfb25seSkKKwkJCQlyZXR1cm4gMDsKKworCQkJLyog Tm93IHJlc3RvcmUgYWxsIHRoZSBkYXRhYmFzZXMgZnJvbSBtYXAuZGF0IGZpbGUgKi8KKwkJCXJl dHVybiByZXN0b3JlQWxsRGF0YWJhc2VzKGlucHV0RmlsZVNwZWMsIGRhdGFiYXNlX2V4Y2x1ZGVf bmFtZXMsCisJCQkJCW9wdHMsIG51bVdvcmtlcnMpOworCQl9LyogZW5kIGlmICovCisJfS8qIGVu ZCBpZiAqLworCisJcmV0dXJuIHJlc3RvcmVPbmVEYXRhYmFzZShpbnB1dEZpbGVTcGVjLCBvcHRz LCBudW1Xb3JrZXJzKTsKK30KKworLyoKKyAqIHJlc3RvcmVPbmVEYXRhYmFzZQorICoKKyAqIFRo aXMgd2lsbCByZXN0b3JlIG9uZSBkYXRhYmFzZSB1c2luZyB0b2MuZGF0IGZpbGUuCisgKi8KK3N0 YXRpYyBib29sCityZXN0b3JlT25lRGF0YWJhc2UoY29uc3QgY2hhciAqaW5wdXRGaWxlU3BlYywg UmVzdG9yZU9wdGlvbnMgKm9wdHMsCisJCWludCBudW1Xb3JrZXJzKQoreworCUFyY2hpdmUJCSpB SDsKKwlib29sCQlleGl0X2NvZGU7CisKIAlBSCA9IE9wZW5BcmNoaXZlKGlucHV0RmlsZVNwZWMs IG9wdHMtPmZvcm1hdCk7CiAKIAlTZXRBcmNoaXZlT3B0aW9ucyhBSCwgTlVMTCwgb3B0cyk7CkBA IC00NzEsNiArNTk2LDcgQEAgdXNhZ2UoY29uc3QgY2hhciAqcHJvZ25hbWUpCiAJcHJpbnRmKF8o IiAgLWMsIC0tY2xlYW4gICAgICAgICAgICAgICAgICBjbGVhbiAoZHJvcCkgZGF0YWJhc2Ugb2Jq ZWN0cyBiZWZvcmUgcmVjcmVhdGluZ1xuIikpOwogCXByaW50ZihfKCIgIC1DLCAtLWNyZWF0ZSAg ICAgICAgICAgICAgICAgY3JlYXRlIHRoZSB0YXJnZXQgZGF0YWJhc2VcbiIpKTsKIAlwcmludGYo XygiICAtZSwgLS1leGl0LW9uLWVycm9yICAgICAgICAgIGV4aXQgb24gZXJyb3IsIGRlZmF1bHQg aXMgdG8gY29udGludWVcbiIpKTsKKwlwcmludGYoXygiICAtZywgLS1nbG9iYWxzLW9ubHkgICAg ICAgICAgIHJlc3RvcmUgb25seSBnbG9iYWwgb2JqZWN0cywgbm8gZGF0YWJhc2VzXG4iKSk7CiAJ cHJpbnRmKF8oIiAgLUksIC0taW5kZXg9TkFNRSAgICAgICAgICAgICByZXN0b3JlIG5hbWVkIGlu ZGV4XG4iKSk7CiAJcHJpbnRmKF8oIiAgLWosIC0tam9icz1OVU0gICAgICAgICAgICAgICB1c2Ug dGhpcyBtYW55IHBhcmFsbGVsIGpvYnMgdG8gcmVzdG9yZVxuIikpOwogCXByaW50ZihfKCIgIC1M LCAtLXVzZS1saXN0PUZJTEVOQU1FICAgICAgdXNlIHRhYmxlIG9mIGNvbnRlbnRzIGZyb20gdGhp cyBmaWxlIGZvclxuIgpAQCAtNDgzLDYgKzYwOSw3IEBAIHVzYWdlKGNvbnN0IGNoYXIgKnByb2du YW1lKQogCXByaW50ZihfKCIgIC1TLCAtLXN1cGVydXNlcj1OQU1FICAgICAgICAgc3VwZXJ1c2Vy IHVzZXIgbmFtZSB0byB1c2UgZm9yIGRpc2FibGluZyB0cmlnZ2Vyc1xuIikpOwogCXByaW50Zihf KCIgIC10LCAtLXRhYmxlPU5BTUUgICAgICAgICAgICAgcmVzdG9yZSBuYW1lZCByZWxhdGlvbiAo dGFibGUsIHZpZXcsIGV0Yy4pXG4iKSk7CiAJcHJpbnRmKF8oIiAgLVQsIC0tdHJpZ2dlcj1OQU1F ICAgICAgICAgICByZXN0b3JlIG5hbWVkIHRyaWdnZXJcbiIpKTsKKwlwcmludGYoXygiICAtLWV4 Y2x1ZGUtZGF0YWJhc2U9TkFNRSAgICAgIGV4Y2x1ZGUgZGF0YWJhc2VzIHdob3NlIG5hbWUgbWF0 Y2hlcyB3aXRoIG5hbWVcbiIpKTsKIAlwcmludGYoXygiICAteCwgLS1uby1wcml2aWxlZ2VzICAg ICAgICAgIHNraXAgcmVzdG9yYXRpb24gb2YgYWNjZXNzIHByaXZpbGVnZXMgKGdyYW50L3Jldm9r ZSlcbiIpKTsKIAlwcmludGYoXygiICAtMSwgLS1zaW5nbGUtdHJhbnNhY3Rpb24gICAgIHJlc3Rv cmUgYXMgYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiIpKTsKIAlwcmludGYoXygiICAtLWRpc2FibGUt dHJpZ2dlcnMgICAgICAgICAgIGRpc2FibGUgdHJpZ2dlcnMgZHVyaW5nIGRhdGEtb25seSByZXN0 b3JlXG4iKSk7CkBAIC02MjEsMyArNzQ4LDUyOSBAQCByZWFkX3Jlc3RvcmVfZmlsdGVycyhjb25z dCBjaGFyICpmaWxlbmFtZSwgUmVzdG9yZU9wdGlvbnMgKm9wdHMpCiAKIAlmaWx0ZXJfZnJlZSgm ZnN0YXRlKTsKIH0KKworc3RhdGljIGJvb2wKK19maWxlRXhpc3RzSW5EaXJlY3RvcnkoY29uc3Qg Y2hhciAqZGlyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdAkJc3Q7CisJ Y2hhcgkJCSBidWZbTUFYUEdQQVRIXTsKKworCWlmIChzbnByaW50ZihidWYsIE1BWFBHUEFUSCwg IiVzLyVzIiwgZGlyLCBmaWxlbmFtZSkgPj0gTUFYUEdQQVRIKQorCQlwZ19mYXRhbCgiZGlyZWN0 b3J5IG5hbWUgdG9vIGxvbmc6IFwiJXNcIiIsIGRpcik7CisKKwlyZXR1cm4gKHN0YXQoYnVmLCAm c3QpID09IDAgJiYgU19JU1JFRyhzdC5zdF9tb2RlKSk7Cit9CisKKy8qCisgKiBNYWtlIGEgZGF0 YWJhc2UgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiAgQW4KKyAqIGludGVy YWN0aXZlIHBhc3N3b3JkIHByb21wdCBpcyBhdXRvbWF0aWNhbGx5IGlzc3VlZCBpZiByZXF1aXJl ZC4KKyAqCisgKiBJZiBmYWlsX29uX2Vycm9yIGlzIGZhbHNlLCB3ZSByZXR1cm4gTlVMTCB3aXRo b3V0IHByaW50aW5nIGFueSBtZXNzYWdlCisgKiBvbiBmYWlsdXJlLCBidXQgcHJlc2VydmUgYW55 IHByb21wdGVkIHBhc3N3b3JkIGZvciB0aGUgbmV4dCB0cnkuCisgKgorICovCitzdGF0aWMgUEdj b25uICoKK2Nvbm5lY3REYXRhYmFzZShjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKmNv bm5lY3Rpb25fc3RyaW5nLAorCQkJCWNvbnN0IGNoYXIgKnBnaG9zdCwgY29uc3QgY2hhciAqcGdw b3J0LCBjb25zdCBjaGFyICpwZ3VzZXIsCisJCQkJdHJpdmFsdWUgcHJvbXB0X3Bhc3N3b3JkLCBi b29sIGZhaWxfb25fZXJyb3IpCit7CisJUEdjb25uCSAgICpjb25uOworCWJvb2wJCW5ld19wYXNz OworCWNvbnN0IGNoYXIgKnJlbW90ZXZlcnNpb25fc3RyOworCWludAkJCW15X3ZlcnNpb247CisJ Y29uc3QgY2hhciAqKmtleXdvcmRzID0gTlVMTDsKKwljb25zdCBjaGFyICoqdmFsdWVzID0gTlVM TDsKKwlQUWNvbm5pbmZvT3B0aW9uICpjb25uX29wdHMgPSBOVUxMOworCXN0YXRpYyBjaGFyICpw YXNzd29yZCA9IE5VTEw7CisJc3RhdGljIGludCAgc2VydmVyX3ZlcnNpb247CisKKwlpZiAocHJv bXB0X3Bhc3N3b3JkID09IFRSSV9ZRVMgJiYgIXBhc3N3b3JkKQorCQlwYXNzd29yZCA9IHNpbXBs ZV9wcm9tcHQoIlBhc3N3b3JkOiAiLCBmYWxzZSk7CisKKwkvKgorCSAqIFN0YXJ0IHRoZSBjb25u ZWN0aW9uLiAgTG9vcCB1bnRpbCB3ZSBoYXZlIGEgcGFzc3dvcmQgaWYgcmVxdWVzdGVkIGJ5CisJ ICogYmFja2VuZC4KKwkgKi8KKwlkbworCXsKKwkJaW50CQkJYXJnY291bnQgPSA2OworCQlQUWNv bm5pbmZvT3B0aW9uICpjb25uX29wdDsKKwkJY2hhcgkgICAqZXJyX21zZyA9IE5VTEw7CisJCWlu dAkJCWkgPSAwOworCisJCWZyZWUoa2V5d29yZHMpOworCQlmcmVlKHZhbHVlcyk7CisJCVBRY29u bmluZm9GcmVlKGNvbm5fb3B0cyk7CisKKwkJLyoKKwkJICogTWVyZ2UgdGhlIGNvbm5lY3Rpb24g aW5mbyBpbnB1dHMgZ2l2ZW4gaW4gZm9ybSBvZiBjb25uZWN0aW9uIHN0cmluZworCQkgKiBhbmQg b3RoZXIgb3B0aW9ucy4gIEV4cGxpY2l0bHkgZGlzY2FyZCBhbnkgZGJuYW1lIHZhbHVlIGluIHRo ZQorCQkgKiBjb25uZWN0aW9uIHN0cmluZzsgb3RoZXJ3aXNlLCBQUWNvbm5lY3RkYlBhcmFtcygp IHdvdWxkIGludGVycHJldAorCQkgKiB0aGF0IHZhbHVlIGFzIGJlaW5nIGl0c2VsZiBhIGNvbm5l Y3Rpb24gc3RyaW5nLgorCQkgKi8KKwkJaWYgKGNvbm5lY3Rpb25fc3RyaW5nKQorCQl7CisJCQlj b25uX29wdHMgPSBQUWNvbm5pbmZvUGFyc2UoY29ubmVjdGlvbl9zdHJpbmcsICZlcnJfbXNnKTsK KwkJCWlmIChjb25uX29wdHMgPT0gTlVMTCkKKwkJCQlwZ19mYXRhbCgiJXMiLCBlcnJfbXNnKTsK KworCQkJZm9yIChjb25uX29wdCA9IGNvbm5fb3B0czsgY29ubl9vcHQtPmtleXdvcmQgIT0gTlVM TDsgY29ubl9vcHQrKykKKwkJCXsKKwkJCQlpZiAoY29ubl9vcHQtPnZhbCAhPSBOVUxMICYmIGNv bm5fb3B0LT52YWxbMF0gIT0gJ1wwJyAmJgorCQkJCQlzdHJjbXAoY29ubl9vcHQtPmtleXdvcmQs ICJkYm5hbWUiKSAhPSAwKQorCQkJCQlhcmdjb3VudCsrOworCQkJfQorCisJCQlrZXl3b3JkcyA9 IHBnX21hbGxvYzAoKGFyZ2NvdW50ICsgMSkgKiBzaXplb2YoKmtleXdvcmRzKSk7CisJCQl2YWx1 ZXMgPSBwZ19tYWxsb2MwKChhcmdjb3VudCArIDEpICogc2l6ZW9mKCp2YWx1ZXMpKTsKKworCQkJ Zm9yIChjb25uX29wdCA9IGNvbm5fb3B0czsgY29ubl9vcHQtPmtleXdvcmQgIT0gTlVMTDsgY29u bl9vcHQrKykKKwkJCXsKKwkJCQlpZiAoY29ubl9vcHQtPnZhbCAhPSBOVUxMICYmIGNvbm5fb3B0 LT52YWxbMF0gIT0gJ1wwJyAmJgorCQkJCQlzdHJjbXAoY29ubl9vcHQtPmtleXdvcmQsICJkYm5h bWUiKSAhPSAwKQorCQkJCXsKKwkJCQkJa2V5d29yZHNbaV0gPSBjb25uX29wdC0+a2V5d29yZDsK KwkJCQkJdmFsdWVzW2ldID0gY29ubl9vcHQtPnZhbDsKKwkJCQkJaSsrOworCQkJCX0KKwkJCX0K KwkJfQorCQllbHNlCisJCXsKKwkJCWtleXdvcmRzID0gcGdfbWFsbG9jMCgoYXJnY291bnQgKyAx KSAqIHNpemVvZigqa2V5d29yZHMpKTsKKwkJCXZhbHVlcyA9IHBnX21hbGxvYzAoKGFyZ2NvdW50 ICsgMSkgKiBzaXplb2YoKnZhbHVlcykpOworCQl9CisKKwkJaWYgKHBnaG9zdCkKKwkJeworCQkJ a2V5d29yZHNbaV0gPSAiaG9zdCI7CisJCQl2YWx1ZXNbaV0gPSBwZ2hvc3Q7CisJCQlpKys7CisJ CX0KKwkJaWYgKHBncG9ydCkKKwkJeworCQkJa2V5d29yZHNbaV0gPSAicG9ydCI7CisJCQl2YWx1 ZXNbaV0gPSBwZ3BvcnQ7CisJCQlpKys7CisJCX0KKwkJaWYgKHBndXNlcikKKwkJeworCQkJa2V5 d29yZHNbaV0gPSAidXNlciI7CisJCQl2YWx1ZXNbaV0gPSBwZ3VzZXI7CisJCQlpKys7CisJCX0K KwkJaWYgKHBhc3N3b3JkKQorCQl7CisJCQlrZXl3b3Jkc1tpXSA9ICJwYXNzd29yZCI7CisJCQl2 YWx1ZXNbaV0gPSBwYXNzd29yZDsKKwkJCWkrKzsKKwkJfQorCQlpZiAoZGJuYW1lKQorCQl7CisJ CQlrZXl3b3Jkc1tpXSA9ICJkYm5hbWUiOworCQkJdmFsdWVzW2ldID0gZGJuYW1lOworCQkJaSsr OworCQl9CisJCWtleXdvcmRzW2ldID0gImZhbGxiYWNrX2FwcGxpY2F0aW9uX25hbWUiOworCQl2 YWx1ZXNbaV0gPSBwcm9nbmFtZTsKKwkJaSsrOworCisJCW5ld19wYXNzID0gZmFsc2U7CisJCWNv bm4gPSBQUWNvbm5lY3RkYlBhcmFtcyhrZXl3b3JkcywgdmFsdWVzLCB0cnVlKTsKKworCQlpZiAo IWNvbm4pCisJCQlwZ19mYXRhbCgiY291bGQgbm90IGNvbm5lY3QgdG8gZGF0YWJhc2UgXCIlc1wi IiwgZGJuYW1lKTsKKworCQlpZiAoUFFzdGF0dXMoY29ubikgPT0gQ09OTkVDVElPTl9CQUQgJiYK KwkJCVBRY29ubmVjdGlvbk5lZWRzUGFzc3dvcmQoY29ubikgJiYKKwkJCSFwYXNzd29yZCAmJgor CQkJcHJvbXB0X3Bhc3N3b3JkICE9IFRSSV9OTykKKwkJeworCQkJUFFmaW5pc2goY29ubik7CisJ CQlwYXNzd29yZCA9IHNpbXBsZV9wcm9tcHQoIlBhc3N3b3JkOiAiLCBmYWxzZSk7CisJCQluZXdf cGFzcyA9IHRydWU7CisJCX0KKwl9IHdoaWxlIChuZXdfcGFzcyk7CisKKwkvKiBjaGVjayB0byBz ZWUgdGhhdCB0aGUgYmFja2VuZCBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgbWFkZSAqLwor CWlmIChQUXN0YXR1cyhjb25uKSA9PSBDT05ORUNUSU9OX0JBRCkKKwl7CisJCWlmIChmYWlsX29u X2Vycm9yKQorCQkJcGdfZmF0YWwoIiVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCQllbHNl CisJCXsKKwkJCVBRZmluaXNoKGNvbm4pOworCisJCQlmcmVlKGtleXdvcmRzKTsKKwkJCWZyZWUo dmFsdWVzKTsKKwkJCVBRY29ubmluZm9GcmVlKGNvbm5fb3B0cyk7CisKKwkJCXJldHVybiBOVUxM OworCQl9CisJfQorCisJZnJlZShrZXl3b3Jkcyk7CisJZnJlZSh2YWx1ZXMpOworCVBRY29ubmlu Zm9GcmVlKGNvbm5fb3B0cyk7CisKKwkvKiBDaGVjayB2ZXJzaW9uICovCisJcmVtb3RldmVyc2lv bl9zdHIgPSBQUXBhcmFtZXRlclN0YXR1cyhjb25uLCAic2VydmVyX3ZlcnNpb24iKTsKKwlpZiAo IXJlbW90ZXZlcnNpb25fc3RyKQorCQlwZ19mYXRhbCgiY291bGQgbm90IGdldCBzZXJ2ZXIgdmVy c2lvbiIpOworCXNlcnZlcl92ZXJzaW9uID0gUFFzZXJ2ZXJWZXJzaW9uKGNvbm4pOworCWlmIChz ZXJ2ZXJfdmVyc2lvbiA9PSAwKQorCQlwZ19mYXRhbCgiY291bGQgbm90IHBhcnNlIHNlcnZlciB2 ZXJzaW9uIFwiJXNcIiIsCisJCQkJIHJlbW90ZXZlcnNpb25fc3RyKTsKKworCW15X3ZlcnNpb24g PSBQR19WRVJTSU9OX05VTTsKKworCS8qCisJICogV2UgYWxsb3cgdGhlIHNlcnZlciB0byBiZSBi YWNrIHRvIDkuMiwgYW5kIHVwIHRvIGFueSBtaW5vciByZWxlYXNlIG9mCisJICogb3VyIG93biBt YWpvciB2ZXJzaW9uLiAgKFNlZSBhbHNvIHZlcnNpb24gY2hlY2sgaW4gcGdfZHVtcC5jLikKKwkg Ki8KKwlpZiAobXlfdmVyc2lvbiAhPSBzZXJ2ZXJfdmVyc2lvbgorCQkmJiAoc2VydmVyX3ZlcnNp b24gPCA5MDIwMCB8fAorCQkJKHNlcnZlcl92ZXJzaW9uIC8gMTAwKSA+IChteV92ZXJzaW9uIC8g MTAwKSkpCisJeworCQlwZ19sb2dfZXJyb3IoImFib3J0aW5nIGJlY2F1c2Ugb2Ygc2VydmVyIHZl cnNpb24gbWlzbWF0Y2giKTsKKwkJcGdfbG9nX2Vycm9yX2RldGFpbCgic2VydmVyIHZlcnNpb246 ICVzOyAlcyB2ZXJzaW9uOiAlcyIsCisJCQkJCQkJcmVtb3RldmVyc2lvbl9zdHIsIHByb2duYW1l LCBQR19WRVJTSU9OKTsKKwkJZXhpdF9uaWNlbHkoMSk7CisJfQorCisJUFFjbGVhcihleGVjdXRl UXVlcnkoY29ubiwgQUxXQVlTX1NFQ1VSRV9TRUFSQ0hfUEFUSF9TUUwpKTsKKworCXJldHVybiBj b25uOworfQorCisvKgorICogUnVuIGEgcXVlcnksIHJldHVybiB0aGUgcmVzdWx0cywgZXhpdCBw cm9ncmFtIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBQR3Jlc3VsdCAqCitleGVjdXRlUXVlcnko UEdjb25uICpjb25uLCBjb25zdCBjaGFyICpxdWVyeSkKK3sKKwlQR3Jlc3VsdCAgICpyZXM7CisK KwlwZ19sb2dfaW5mbygiZXhlY3V0aW5nICVzIiwgcXVlcnkpOworCisJcmVzID0gUFFleGVjKGNv bm4sIHF1ZXJ5KTsKKwlpZiAoIXJlcyB8fCBQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RV UExFU19PSykKKwl7CisJCXBnX2xvZ19lcnJvcigicXVlcnkgZmFpbGVkOiAlcyIsIFBRZXJyb3JN ZXNzYWdlKGNvbm4pKTsKKwkJcGdfbG9nX2Vycm9yX2RldGFpbCgiUXVlcnkgd2FzOiAlcyIsIHF1 ZXJ5KTsKKwkJUFFmaW5pc2goY29ubik7CisJCWV4aXRfbmljZWx5KDEpOworCX0KKworCXJldHVy biByZXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0KKyAqCVJlYWRPbmVTdGF0ZW1lbnQoKQor ICoKKyAqIFRoaXMgd2lsbCBzdGFydCByZWFkaW5nIGZyb20gcGFzc2VkIGZpbGUgcG9pbnRlciB1 c2luZyBmZ2V0YyBhbmQgcmVhZCB0aWxsCisgKiBzZW1pY29sb24oc3FsIHN0YXRlbWVudCB0ZXJt aW5hdG9yIGZvciBnbG9iYWwuc3FsIGZpbGUpCisgKgorICoJRU9GIGlzIHJldHVybmVkIGlmIGVu ZC1vZi1maWxlIGlucHV0IGlzIHNlZW47IHRpbWUgdG8gc2h1dCBkb3duLgorICogLS0tLS0tLS0t LS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQKK1JlYWRPbmVTdGF0ZW1lbnQoU3RyaW5nSW5mbyBp bkJ1ZiwgRklMRSAqZl9nbG8pCit7CisJaW50CQkJYzsJCQkJLyogY2hhcmFjdGVyIHJlYWQgZnJv bSBnZXRjKCkgKi8KKworCXJlc2V0U3RyaW5nSW5mbyhpbkJ1Zik7CisKKwkvKgorCSAqIFJlYWQg Y2hhcmFjdGVycyB1bnRpbCBFT0Ygb3IgdGhlIGFwcHJvcHJpYXRlIGRlbGltaXRlciBpcyBzZWVu LgorCSAqLworCXdoaWxlICgoYyA9IGZnZXRjKGZfZ2xvKSkgIT0gRU9GKQorCXsKKwkJYXBwZW5k U3RyaW5nSW5mb0NoYXIoaW5CdWYsIChjaGFyKSBjKTsKKworCQlpZiAoYyA9PSAnXG4nKQorCQl7 CisJCQlpZihpbkJ1Zi0+bGVuID4gMSAmJgorCQkJCQlpbkJ1Zi0+ZGF0YVtpbkJ1Zi0+bGVuIC0g Ml0gPT0gJzsnKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQl9CisJfQor CisJLyogTm8gaW5wdXQgYmVmb3JlIEVPRiBzaWduYWwgbWVhbnMgdGltZSB0byBxdWl0LiAqLwor CWlmIChjID09IEVPRiAmJiBpbkJ1Zi0+bGVuID09IDApCisJCXJldHVybiBFT0Y7CisKKwkvKiBB ZGQgJ1wwJyB0byBtYWtlIGl0IGxvb2sgdGhlIHNhbWUgYXMgbWVzc2FnZSBjYXNlLiAqLworCWFw cGVuZFN0cmluZ0luZm9DaGFyKGluQnVmLCAoY2hhcikgJ1wwJyk7CisKKwlyZXR1cm4gJ1EnOwor fQorCisvKgorICogVGhpcyB3aWxsIHJlbW92ZSBuYW1lcyBmcm9tIGFsbCBkYmxpc3QgdGhhdCBh cmUgZ2l2ZW4gd2l0aCBleGNsdWRlLWRhdGFiYXNlCisgKiBvcHRpb24uCisgKgorICogcmV0dXJu cyBudW1iZXIgb2YgZGJuYW1lcyB0aG9zZSB3aWxsIGJlIHJlc3RvcmVkLgorICovCitzdGF0aWMg aW50CitmaWx0ZXJfZGJuYW1lc19mb3JfcmVzdG9yZShTaW1wbGVEQm9pZExpc3QgKmRibmFtZV9v aWRfbGlzdCwKKwkJU2ltcGxlU3RyaW5nTGlzdCBkYXRhYmFzZV9leGNsdWRlX25hbWVzKQorewor CWludAkJCQkJY291bnRkYiA9IDA7CisJU2ltcGxlREJvaWRMaXN0Q2VsbAkqY2VsbCA9IGRibmFt ZV9vaWRfbGlzdC0+aGVhZDsKKwlTaW1wbGVEQm9pZExpc3RDZWxsCSpwcmVjZWxsID0gTlVMTDsK KworCS8qIFJldHVybiAwIGlmIHRoZXJlIGlzIG5vIGRiIHRvIHJlc3RvcmUuICovCisJaWYgKGNl bGwgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoY2VsbCAhPSBOVUxMKQorCXsKKwkJ Ym9vbAlza2lwX2RiID0gZmFsc2U7CisKKwkJLyogTm93IG1hdGNoIHRoaXMgZGJuYW1lIHdpdGgg ZXhjbHVkZS1kYXRhYmFzZSBsaXN0LiAqLworCQlmb3IgKFNpbXBsZVN0cmluZ0xpc3RDZWxsICpj ZWxsZGIgPSBkYXRhYmFzZV9leGNsdWRlX25hbWVzLmhlYWQ7IGNlbGxkYjsgY2VsbGRiID0gY2Vs bGRiLT5uZXh0KQorCQl7CisJCQlpZiAoc3RyY21wKGNlbGxkYi0+dmFsLCBjZWxsLT5kYm5hbWUp ID09IDApCisJCQl7CisJCQkJLyoKKwkJCQkgKiBBcyB3ZSBuZWVkIHRvIHNraXAgdGhpcyBkYm5h bWUgc28gc2V0IGZsYWcgdG8gcmVtb3ZlIGl0IGZyb20KKwkJCQkgKiBsaXN0LgorCQkJCSAqLwor CQkJCXNraXBfZGIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogSW5jcmVt ZW50IGNvdW50IGlmIGRiIG5lZWRzIHRvIGJlIHJlc3RvcmVkLiAqLworCQlpZiAoIXNraXBfZGIp CisJCXsKKwkJCWNvdW50ZGIrKzsKKwkJCXByZWNlbGwgPSBjZWxsOworCQkJY2VsbCA9IGNlbGwt Pm5leHQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAocHJlY2VsbCAhPSBOVUxMKQorCQkJewor CQkJCXByZWNlbGwtPm5leHQgPSBjZWxsLT5uZXh0OworCQkJCXBmcmVlKGNlbGwpOworCQkJCWNl bGwgPSBwcmVjZWxsLT5uZXh0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWRibmFtZV9vaWRf bGlzdC0+aGVhZCA9IGNlbGwtPm5leHQ7CisJCQkJcGZyZWUoY2VsbCk7CisJCQkJY2VsbCA9IGRi bmFtZV9vaWRfbGlzdC0+aGVhZDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBjb3VudGRiOwor fQorCisvKgorICogT3BlbiBtYXAuZGF0IGZpbGUgYW5kIHJlYWQgbGluZSBieSBsaW5lIGFuZCB0 aGVuIHByZXBhcmUgYSBsaXN0IG9mIGRhdGFiYXNlCisgKiBuYW1lcyBhbmQgY29ycmVzcG9kaW5n IGRib2lkLgorICoKKyAqIFJldHVybnMsIHRvdGFsIG51bWJlciBvZiBkYXRhYmFzZSBuYW1lcyBp biBtYXAuZGF0IGZpbGUuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9kYm5hbWVfb2lkX2xpc3RfZnJv bV9tZmlsZShjb25zdCBjaGFyICpkdW1wZGlycGF0aCwgU2ltcGxlREJvaWRMaXN0ICpkYm5hbWVf b2lkX2xpc3QpCit7CisJRklMRSAgICAqcGZpbGU7CisJY2hhciAgICBtYXBfZmlsZV9wYXRoW01B WFBHUEFUSF07CisJY2hhciAgICBsaW5lW01BWFBHUEFUSF07CisJaW50ICAgICBjb3VudCA9IDA7 CisKKwlzbnByaW50ZihtYXBfZmlsZV9wYXRoLCBNQVhQR1BBVEgsICIlcy9tYXAuZGF0IiwgZHVt cGRpcnBhdGgpOworCisJLyogT3BlbiBtYXAuZGF0IGZpbGUuICovCisJcGZpbGUgPSBmb3Blbiht YXBfZmlsZV9wYXRoLCAiciIpOworCisJaWYgKHBmaWxlID09IE5VTEwpCisJCXBnX2ZhdGFsKCJj b3VsZCBub3Qgb3BlbiBtYXAuZGF0IGZpbGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8q IEFwcGVuZCBhbGwgdGhlIGRibmFtZSBhbmQgZGJvaWQgdG8gdGhlIGxpc3QuICovCisJd2hpbGUo KGZnZXRzKGxpbmUsIE1BWFBHUEFUSCwgcGZpbGUpKSAhPSBOVUxMKQorCXsKKwkJT2lkICAgICAg ICAgZGJvaWQ7CisJCWNoYXIgICAgICAgIGRibmFtZVtNQVhQR1BBVEggKyAxXTsKKworCQkvKiBF eHRyYWN0IGRibmFtZSBhbmQgZGJvaWQgZnJvbSBsaW5lICovCisJCXNzY2FuZihsaW5lLCAiJXUg JXMiICwgJmRib2lkLCBkYm5hbWUpOworCQlwZ19sb2dfaW5mbygiZm91bmQgZGJuYW1lIGFzIDol cyBhbmQgZGJvaWQ6JWQgaW4gbWFwLmRhdCBmaWxlIHdoaWxlIHJlc3RvcmluZyIsIGRibmFtZSwg ZGJvaWQpOworCisJCS8qIFJlcG9ydCBlcnJvciBpZiBmaWxlIGhhcyBhbnkgY29ycnVwdGVkIGRh dGEuICovCisJCWlmICghT2lkSXNWYWxpZChkYm9pZCkgfHwgc3RybGVuKGRibmFtZSkgPT0gMCkK KwkJCXBnX2ZhdGFsKCJpbnZhbGlkIGVudHJ5IGluIG1hcC5kYXQgZmlsZSBhdCBsaW5lIDogJWQi LCBjb3VudCArIDEpOworCisJCS8qCisJCSAqIFRPRE8gOiBiZWZvcmUgYWRkaW5nIGRiYW5tZSBp bnRvIGxpc3QsIHdlIGNhbiB2ZXJpZnkgdGhhdCB0aGlzIGRiCisJCSAqIG5lZWRzIHRvIHNraXBw ZWQgZm9yIHJlc3RvcmUgb3Igbm90LgorCQkgKi8KKwkJc2ltcGxlX2Rib2lkX2xpc3RfYXBwZW5k KGRibmFtZV9vaWRfbGlzdCwgZGJvaWQsIGRibmFtZSk7CisJCWNvdW50Kys7CisJfQorCisJLyog Q2xvc2UgbWFwLmRhdCBmaWxlLiAqLworCWZjbG9zZShwZmlsZSk7CisKKwlyZXR1cm4gY291bnQ7 Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgcmVzdG9yZSBkYXRhYmFzZXMgdGhvc2UgZHVtcHMgYXJl IHByZXNlbnQgaW4KKyAqIGRpcmVjdG9yeSBiYXNlZCBvbiBtYXAuZGF0IGZpbGUgbWFwcGluZy4K KyAqCisgKiBUaGlzIHdpbGwgc2tpcCByZXN0b3JpbmcgZm9yIGRhdGFiYXNlcyB0aGF0IGFyZSBz cGVjaWZpZWQgd2l0aAorICogZXhjbHVkZS1kYXRhYmFzZSBvcHRpb24uCisgKi8KK3N0YXRpYyBp bnQKK3Jlc3RvcmVBbGxEYXRhYmFzZXMoY29uc3QgY2hhciAqZHVtcGRpcnBhdGgsCisJCVNpbXBs ZVN0cmluZ0xpc3QgZGF0YWJhc2VfZXhjbHVkZV9uYW1lcywgUmVzdG9yZU9wdGlvbnMgKm9wdHMs CisJCWludCBudW1Xb3JrZXJzKQoreworCVNpbXBsZURCb2lkTGlzdAkJCWRibmFtZV9vaWRfbGlz dCA9IHtOVUxMLCBOVUxMfTsKKwlTaW1wbGVEQm9pZExpc3RDZWxsCQkqY2VsbDsKKwlpbnQJCQkJ CQlleGl0X2NvZGUgPSAwOworCWludAkJCQkJCW51bV9kYl9yZXN0b3JlOworCWludAkJCQkJCW51 bV90b3RhbF9kYjsKKworCW51bV90b3RhbF9kYiA9IGdldF9kYm5hbWVfb2lkX2xpc3RfZnJvbV9t ZmlsZShkdW1wZGlycGF0aCwgJmRibmFtZV9vaWRfbGlzdCk7CisKKwkvKiBJZiBtYXAuZGF0IGhh cyBubyBlbnRyeSwgcmV0dXJuIGZyb20gaGVyZS4gKi8KKwlpZiAoZGJuYW1lX29pZF9saXN0Lmhl YWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwZ19sb2dfaW5mbygiZm91bmQgdG90YWwgJWQg ZGF0YWJhc2UgbmFtZXMgaW4gbWFwLmRhdCBmaWxlIiwgbnVtX3RvdGFsX2RiKTsKKworCS8qIFNr aXAgYW55IGV4cGxpY2l0bHkgZXhjbHVkZWQgZGF0YWJhc2UuICovCisJbnVtX2RiX3Jlc3RvcmUg PSBmaWx0ZXJfZGJuYW1lc19mb3JfcmVzdG9yZSgmZGJuYW1lX29pZF9saXN0LCBkYXRhYmFzZV9l eGNsdWRlX25hbWVzKTsKKworCS8qIEV4aXQgaWYgbm8gZGIgbmVlZHMgdG8gYmUgcmVzdG9yZWQu ICovCisJaWYgKGRibmFtZV9vaWRfbGlzdC5oZWFkID09IE5VTEwpCisJCXJldHVybiAwOworCisJ cGdfbG9nX2luZm8oIm5lZWRzIHRvIHJlc3RvcmUgJWQgZGF0YWJhc2VzIG91dCBvZiAlZCBkYXRh YmFzZXMiLCBudW1fZGJfcmVzdG9yZSwgbnVtX3RvdGFsX2RiKTsKKworCS8qCisJICogWFhYOiBU T0RPIHRpbGwgbm93LCB3ZSBtYWRlIGEgbGlzdCBvZiBkYXRhYmFzZXMsIHRob3NlIG5lZWRzIHRv IGJlIHJlc3RvcmVkCisJICogYWZ0ZXIgc2tpcHBpbmcgbmFtZXMgb2YgZXhjbHVkZS1kYXRhYmFz ZS4gIE5vdyB3ZSBjYW4gbGF1bmNoIHBhcmFsbGVsCisJICogd29ya2VycyB0byByZXN0b3JlIHRo ZXNlIGRhdGFiYXNlcy4KKwkgKi8KKwljZWxsID0gZGJuYW1lX29pZF9saXN0LmhlYWQ7CisKKwl3 aGlsZShjZWxsICE9IE5VTEwpCisJeworCQljaGFyCQlzdWJkaXJwYXRoW01BWFBHUEFUSF07CisJ CWludAkJCWRiZXhpdF9jb2RlOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gcmVzZXQgb3ZlcnJp ZGVfZGJuYW1lIHNvIHRoYXQgb2JqZWN0cyBjYW4gYmUgcmVzdG9yZWQgaW50bworCQkgKiBhbHJl YWR5IGNyZWF0ZWQgZGF0YWJhc2UuICh1c2VkIHdpdGggLWQvLS1kYm5hbWUgb3B0aW9uKQorCQkg Ki8KKwkJaWYgKG9wdHMtPmNwYXJhbXMub3ZlcnJpZGVfZGJuYW1lKQorCQl7CisJCQlwZnJlZShv cHRzLT5jcGFyYW1zLm92ZXJyaWRlX2RibmFtZSk7CisJCQlvcHRzLT5jcGFyYW1zLm92ZXJyaWRl X2RibmFtZSA9IE5VTEw7CisJCX0KKworCQlzbnByaW50ZihzdWJkaXJwYXRoLCBNQVhQR1BBVEgs ICIlcy9kYXRhYmFzZXMvJXUiLCBkdW1wZGlycGF0aCwgY2VsbC0+ZGJvaWQpOworCisJCS8qCisJ CSAqIERhdGFiYXNlIC1kLy0tZGJuYW1lIGlzIGFscmVhZHkgY3JlYXRlZCBzbyByZXNldCBjcmVh dGVEQiB0byBpZ25vcmUKKwkJICogZGF0YWJhc2UgY3JlYXRpb24gZXJyb3IuCisJCSAqLworCQlp ZiAoc3RyY21wKGNlbGwtPmRibmFtZSwgb3B0cy0+Y3BhcmFtcy5kYm5hbWUpID09IDApCisJCQlv cHRzLT5jcmVhdGVEQiA9IDA7CisKKwkJcGdfbG9nX2luZm8oInJlc3RvcmluZyBkYXRhYmFzZSBc IiVzXCIiLCBjZWxsLT5kYm5hbWUpOworCisJCWRiZXhpdF9jb2RlID0gcmVzdG9yZU9uZURhdGFi YXNlKHN1YmRpcnBhdGgsIG9wdHMsIG51bVdvcmtlcnMpOworCisJCS8qIFN0b3JlIGV4aXRfY29k ZSB0byByZXBvcnQgaXQgYmFjay4gKi8KKwkJaWYgKGV4aXRfY29kZSA9PSAwICYmIGRiZXhpdF9j b2RlICE9IDApCisJCQlleGl0X2NvZGUgPSBkYmV4aXRfY29kZTsKKworCQkvKiBTZXQgY3JlYXRl REIgb3B0aW9uIHRvIGNyZWF0ZSBuZXcgZGF0YWJhc2UuICovCisJCWlmIChzdHJjbXAoY2VsbC0+ ZGJuYW1lLCBvcHRzLT5jcGFyYW1zLmRibmFtZSkgPT0gMCkKKwkJCW9wdHMtPmNyZWF0ZURCID0g MTsKKworCQljZWxsID0gY2VsbC0+bmV4dDsKKwl9IC8qIGVuZCB3aGlsZSAqLworCisJLyogTG9n IG51bWJlciBvZiBwcm9jZXNzZWQgZGF0YWJhc2VzLiovCisJcGdfbG9nX2luZm8oIm51bWJlciBv ZiByZXN0b3JlZCBkYXRhYmFzZXMgYXJlICVkIiwgbnVtX2RiX3Jlc3RvcmUpOworCisJcmV0dXJu IGV4aXRfY29kZTsKK30KKworLyoKKyAqIFRoaXMgd2lsbCBvcGVuIGdsb2JhbC5kYXQgZmlsZSBh bmQgd2lsbCBleGVjdXRlIGFsbCBnbG9iYWwgc3FsIGNvbW1hbmRzIG9uZQorICogYnkgb25lIHN0 YXRlbWVudC4KKyAqCisgKiBzZW1pY29sb24gaXMgY29uc2lkZXJlZCBhcyBzdGF0ZW1lbnQgdGVy bWluYXRvci4KKyAqLworc3RhdGljIHZvaWQKK2V4ZWN1dGVfZ2xvYmFsX3NxbF9jb21tYW5kcyhQ R2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKmR1bXBkaXJwYXRoKQoreworCWNoYXIgICAgICAgICAg ICBnbG9iYWxfZmlsZV9wYXRoW01BWFBHUEFUSF07CisJUEdyZXN1bHQJCSpyZXN1bHQ7CisJU3Ry aW5nSW5mb0RhdGEJc3Fsc3RhdGVtZW50OworCUZJTEUJCQkqcGZpbGU7CisKKwlzbnByaW50Zihn bG9iYWxfZmlsZV9wYXRoLCBNQVhQR1BBVEgsICIlcy9nbG9iYWwuZGF0IiwgZHVtcGRpcnBhdGgp OworCisJLyogbm93IG9wZW4gZ2xvYmFsLmRhdCBmaWxlICovCisJcGZpbGUgPSBmb3BlbihnbG9i YWxfZmlsZV9wYXRoLCAiciIpOworCisJaWYgKHBmaWxlID09IE5VTEwpCisJCXBnX2ZhdGFsKCJj b3VsZCBub3Qgb3BlbiBnbG9iYWwuZGF0IGZpbGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwor CS8qIEluaXQgc3Fsc3RhdGVtZW50IHRvIGFwcGVuZCBjb21tYW5kcyAqLworCWluaXRTdHJpbmdJ bmZvKCZzcWxzdGF0ZW1lbnQpOworCisJLyogUHJvY2VzcyBmaWxlIHRpbGwgRU9GIGFuZCBleGVj dXRlIHNxbCBzdGF0ZW1lbnRzICovCisJd2hpbGUgKFJlYWRPbmVTdGF0ZW1lbnQoJnNxbHN0YXRl bWVudCwgcGZpbGUpICE9IEVPRikKKwl7CisJCXJlc3VsdCA9IFBRZXhlYyhjb25uLCBzcWxzdGF0 ZW1lbnQuZGF0YSk7CisKKwkJc3dpdGNoIChQUXJlc3VsdFN0YXR1cyhyZXN1bHQpKQorCQl7CisJ CQljYXNlIFBHUkVTX0NPTU1BTkRfT0s6CisJCQljYXNlIFBHUkVTX1RVUExFU19PSzoKKwkJCWNh c2UgUEdSRVNfRU1QVFlfUVVFUlk6CisJCQljYXNlIFBHUkVTX0NPUFlfSU46CisJCQkJYnJlYWs7 CisJCQlkZWZhdWx0OgorCQkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGV4ZWN1dGUgcXVlcnk6 ICVzIFxuQ29tbWFuZCB3YXM6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubiksIHNxbHN0YXRlbWVu dC5kYXRhKTsKKwkJfQorCX0KKworCWZjbG9zZShwZmlsZSk7Cit9CisKKy8qCisgKiBhcHBlbmRz IGEgbm9kZSB0byB0aGUgbGlzdCBpbiB0aGUgZW5kLgorICovCitzdGF0aWMgdm9pZAorc2ltcGxl X2Rib2lkX2xpc3RfYXBwZW5kKFNpbXBsZURCb2lkTGlzdCAqbGlzdCwgT2lkIGRib2lkLCBjb25z dCBjaGFyICpkYm5hbWUpCit7CisJU2ltcGxlREJvaWRMaXN0Q2VsbCAqY2VsbDsKKworCWNlbGwg PSBwZ19tYWxsb2Nfb2JqZWN0KFNpbXBsZURCb2lkTGlzdENlbGwpOworCisJY2VsbC0+bmV4dCA9 IE5VTEw7CisJY2VsbC0+ZGJvaWQgPSBkYm9pZDsKKwljZWxsLT5kYm5hbWUgPSBwZ19zdHJkdXAo ZGJuYW1lKTsKKworCWlmIChsaXN0LT50YWlsKQorCQlsaXN0LT50YWlsLT5uZXh0ID0gY2VsbDsK KwllbHNlCisJCWxpc3QtPmhlYWQgPSBjZWxsOworCWxpc3QtPnRhaWwgPSBjZWxsOworfQotLSAK MS44LjMuMQoK --0000000000003d6733062aaafc8c--