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 1uAvSi-0043zW-9C for pgsql-hackers@arkaria.postgresql.org; Fri, 02 May 2025 18:50:17 +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 1uAvSg-00AxED-5P for pgsql-hackers@arkaria.postgresql.org; Fri, 02 May 2025 18:50:15 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from <3danissimo@gmail.com>) id 1uAvSf-00AxE4-KW for pgsql-hackers@lists.postgresql.org; Fri, 02 May 2025 18:50:14 +0000 Received: from mail-yb1-xb2c.google.com ([2607:f8b0:4864:20::b2c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from <3danissimo@gmail.com>) id 1uAvSe-000kRc-0J for pgsql-hackers@lists.postgresql.org; Fri, 02 May 2025 18:50:14 +0000 Received: by mail-yb1-xb2c.google.com with SMTP id 3f1490d57ef6-e755cd8c333so1637160276.0 for ; Fri, 02 May 2025 11:50:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746211810; x=1746816610; darn=lists.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=K8rpjr/X1G5DQhXgjIB3XmtuOr28Gmedu37H4ohCK9Y=; b=MgOR3KD0WbA4aO+zHsWP7vTSHbNMDAlAnd+3pIWxXZxLMy5hD5e146AakkSKVvZwCo 0KWthiTw+SqV3kRZbez760Qu9BfQ2nxHfZyvaRcHL4po3RMaNFGwsCv7s7F3IcbLjiTm nva7C0qBowdZHtRW/3MfPy9fBxDTH0NQZquQ57/AxSf7TQWAaca9Wqm8rxvjoER1nO27 lQhZsOvyyL9b8JxW/MARTuBZ+oLZJAKluQVroV+24C3C1a9IYmpvcKX46spzVfsMNJIz sIyAES5p/sIzzrvT4OE9EH0kuUBkVG244c5BF1RgXu/aDTdkCMger4+IrxsCSDhucyYv ua0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746211810; x=1746816610; 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=K8rpjr/X1G5DQhXgjIB3XmtuOr28Gmedu37H4ohCK9Y=; b=FsF5AarbBeDXBvxZj9mmaqjTSP6JeEC17KaRTTOG3jCMP8XzSCnv/vQEYdxpBD+zxs ri3qzDOTjSxTjt3DTz4kjyL7I6538fTXFJRw9Q/KkLYJ8kJb7C+xj+yoBmO7Sa1hTqY9 0UqTTIZtFtgK8qWuleEEDeSNvHvheGVPXRr0tXqVkKjReyy695d+9x7hvkSHVvMWNuYW UFv9yvvtzAXtZBbzLwWW7WQyHcwtIiLiRlaBkuJ0afCF3R8ZETd8ZBJEIb5lpMmNn6ii A2Wih2MpG39GUFzP2KCOEawmZaPr/UICC09cygcfy8xOrerOwtL4veBBUiJPCOO4a3iE T4KQ== X-Forwarded-Encrypted: i=1; AJvYcCW9zD1HzbWb5AeKJ5LYC6CyZmTRG1aV+r+SgW2DZWhPmaG41jwkd8+lL1CT090Qr6rA9CpG+1598VMhN1FL@lists.postgresql.org X-Gm-Message-State: AOJu0Yz91KNfkBoeCN+DddwvxZjTAPnlTZo27i4BVwhuKxwbe4gSqtE2 oUXzsZB4vF67rFBss6ervEXtblcX0lTA7mIHDNdc3jCXb9vEv4vHrpgtXMd8fhGNWsJX9amL7Kr 7aPmewM2nRXjBxvaw9HtjQ/P7t2k= X-Gm-Gg: ASbGncs7VC+DANjnmhypkqHrvzpMIvKUCMBjaRyfLksSrBiFjtd08WXzcqoCrwRlIM+ FHUad1t4gdJaYRzzr8O83znsV2bYvzhMw5H4bBezl9fMBD7EwMUD/PKqoXsXtXtbtbvlR6IlicH qclFhBK08zCcTOXcHEGPB8N1pROzQ/P9cbQQ== X-Google-Smtp-Source: AGHT+IFzFz0Z8sIcfu5J+xrapGMDVBbj1AlMYnSG6TfDY0uV+FlJQkCpSSbA/ngbh3k2huUX5Bacltqq3y0GrKxQnlQ= X-Received: by 2002:a05:6902:2207:b0:e75:6229:1354 with SMTP id 3f1490d57ef6-e75655f3bb3mr5199442276.35.1746211810232; Fri, 02 May 2025 11:50:10 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Daniil Davydov <3danissimo@gmail.com> Date: Sat, 3 May 2025 01:49:58 +0700 X-Gm-Features: ATxdqUF7ZLKYwv_4QcnJhSqjlfY2lJX6JydMFHA5rY5JW96lGivCYJjh1Dydbx0 Message-ID: Subject: Re: POC: Parallel processing of indexes in autovacuum To: Sami Imseih Cc: Masahiko Sawada , Maxim Orlov , Postgres hackers Content-Type: multipart/mixed; boundary="000000000000a7182806342b9e82" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a7182806342b9e82 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, May 2, 2025 at 11:58=E2=80=AFPM Sami Imseih w= rote: > > I am generally -1 on the idea of autovacuum performing parallel > index vacuum, because I always felt that the parallel option should > be employed in a targeted manner for a specific table. if you have a bunc= h > of large tables, some more important than others, a/c may end > up using parallel resources on the least important tables and you > will have to adjust a/v settings per table, etc to get the right table > to be parallel index vacuumed by a/v. Hm, this is a good point. I think I should clarify one moment - in practice, there is a common situation when users have one huge table among all databases (with 80+ indexes created on it). But, of course, in general there may be few such tables. But we can still adjust the autovac_idx_parallel_min_rows parameter. If a table has a lot of dead tuples =3D> it is actively used =3D> table is important (?). Also, if the user can really determine the "importance" of each of the tables - we can provide an appropriate table option. Tables with this option set will be processed in parallel in priority order. What do you think about such an idea? > > Also, with the TIDStore improvements for index cleanup, and the practical > elimination of multi-pass index vacuums, I see this being even less > convincing as something to add to a/v. If I understood correctly, then we are talking about the fact that TIDStore can store so many tuples that in fact a second pass is never needed. But the number of passes does not affect the presented optimization in any way. We must think about a large number of indexes that must be processed. Even within a single pass we can have a 40% increase in speed. > > Now, If I am going to allocate extra workers to run vacuum in parallel, w= hy > not just provide more autovacuum workers instead so I can get more tables > vacuumed within a span of time? For now, only one process can clean up indexes, so I don't see how increasing the number of a/v workers will help in the situation that I mentioned above. Also, we don't consume additional resources during autovacuum in this patch - total number of a/v workers always <=3D autovacuum_max_workers. BTW, see v2 patch, attached to this letter (bug fixes) :-) -- Best regards, Daniil Davydov --000000000000a7182806342b9e82 Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-WIP-Allow-autovacuum-to-process-indexes-of-single.patch" Content-Disposition: attachment; filename="v2-0001-WIP-Allow-autovacuum-to-process-indexes-of-single.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ma75afu30 RnJvbSAxYzkzYTcyOWI4NDRhMWRmZTEwOWU4ZDllNTRkNWNjMGE5NDFkMDYxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5paWwgRGF2aWRvdiA8ZC5kYXZ5ZG92QHBvc3RncmVzcHJv LnJ1PgpEYXRlOiBTYXQsIDMgTWF5IDIwMjUgMDA6Mjc6NDUgKzA3MDAKU3ViamVjdDogW1BBVENI IHYyXSBXSVAgQWxsb3cgYXV0b3ZhY3V1bSB0byBwcm9jZXNzIGluZGV4ZXMgb2Ygc2luZ2xlIHRh YmxlIGluCiBwYXJhbGxlbAoKLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy92YWN1dW0uYyAgICAg ICAgICAgICAgICAgfCAgMjcgKwogc3JjL2JhY2tlbmQvY29tbWFuZHMvdmFjdXVtcGFyYWxsZWwu YyAgICAgICAgIHwgMjg5ICsrKysrLQogc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9hdXRvdmFjdXVt LmMgICAgICAgICAgIHwgOTA2ICsrKysrKysrKysrKysrKysrLQogc3JjL2JhY2tlbmQvdXRpbHMv bWlzYy9ndWNfdGFibGVzLmMgICAgICAgICAgIHwgIDMwICsKIHNyYy9iYWNrZW5kL3V0aWxzL21p c2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZSB8ICAgNiArCiBzcmMvaW5jbHVkZS9wb3N0bWFzdGVy L2F1dG92YWN1dW0uaCAgICAgICAgICAgfCAgMjMgKwogc3JjL3Rlc3QvbW9kdWxlcy9hdXRvdmFj dXVtLy5naXRpZ25vcmUgICAgICAgIHwgICAxICsKIHNyYy90ZXN0L21vZHVsZXMvYXV0b3ZhY3V1 bS9NYWtlZmlsZSAgICAgICAgICB8ICAxNCArCiAuLi4vYXV0b3ZhY3V1bS90LzAwMV9hdXRvdmFj X3BhcmFsbGVsLnBsICAgICAgfCAxMzcgKysrCiA5IGZpbGVzIGNoYW5nZWQsIDEzODcgaW5zZXJ0 aW9ucygrKSwgNDYgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9k dWxlcy9hdXRvdmFjdXVtLy5naXRpZ25vcmUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9t b2R1bGVzL2F1dG92YWN1dW0vTWFrZWZpbGUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9t b2R1bGVzL2F1dG92YWN1dW0vdC8wMDFfYXV0b3ZhY19wYXJhbGxlbC5wbAoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL2NvbW1hbmRzL3ZhY3V1bS5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdmFj dXVtLmMKaW5kZXggMzNhMzNiZjZiMWMuLmE1ZWY1MzE5Y2NjIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9jb21tYW5kcy92YWN1dW0uYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy92YWN1dW0u YwpAQCAtMjIzNCw2ICsyMjM0LDMzIEBAIHZhY3V1bV9yZWwoT2lkIHJlbGlkLCBSYW5nZVZhciAq cmVsYXRpb24sIFZhY3V1bVBhcmFtcyAqcGFyYW1zLAogCWVsc2UKIAkJdG9hc3RfcmVsaWQgPSBJ bnZhbGlkT2lkOwogCisJLyoKKwkgKiBEZWNpZGUgd2hldGhlciB3ZSBuZWVkIHRvIHByb2Nlc3Mg dGFibGUgd2l0aCBnaXZlbiBvaWQgaW4gcGFyYWxsZWwgbW9kZQorCSAqIGR1cmluZyBhdXRvdmFj dXVtLgorCSAqLworCWlmIChBbUF1dG9WYWN1dW1Xb3JrZXJQcm9jZXNzKCkgJiYKKwkJcGFyYW1z LT5pbmRleF9jbGVhbnVwICE9IFZBQ09QVFZBTFVFX0RJU0FCTEVEKQorCXsKKwkJUGdTdGF0X1N0 YXRUYWJFbnRyeSAqdGFiZW50cnk7CisKKwkJLyogZmV0Y2ggdGhlIHBnc3RhdCB0YWJsZSBlbnRy eSAqLworCQl0YWJlbnRyeSA9IHBnc3RhdF9mZXRjaF9zdGF0X3RhYmVudHJ5X2V4dChyZWwtPnJk X3JlbC0+cmVsaXNzaGFyZWQsCisJCQkJCQkJCQkJCQkgIHJlbC0+cmRfaWQpOworCQlpZiAodGFi ZW50cnkgJiYgdGFiZW50cnktPmRlYWRfdHVwbGVzID49IGF1dG92YWNfaWR4X3BhcmFsbGVsX21p bl9yb3dzKQorCQl7CisJCQlMaXN0ICAgKmluZGV4ZXMgPSBSZWxhdGlvbkdldEluZGV4TGlzdChy ZWwpOworCQkJaW50CQludW1faW5kZXhlcyA9IGxpc3RfbGVuZ3RoKGluZGV4ZXMpOworCisJCQls aXN0X2ZyZWUoaW5kZXhlcyk7CisKKwkJCWlmIChudW1faW5kZXhlcyA+PSBhdXRvdmFjX2lkeF9w YXJhbGxlbF9taW5faW5kZXhlcyAmJgorCQkJCW1heF9wYXJhbGxlbF9pbmRleF9hdXRvdmFjX3dv cmtlcnMgPiAwKQorCQkJeworCQkJCXBhcmFtcy0+bndvcmtlcnMgPSBtYXhfcGFyYWxsZWxfaW5k ZXhfYXV0b3ZhY193b3JrZXJzOworCQkJfQorCQl9CisJfQorCiAJLyoKIAkgKiBTd2l0Y2ggdG8g dGhlIHRhYmxlIG93bmVyJ3MgdXNlcmlkLCBzbyB0aGF0IGFueSBpbmRleCBmdW5jdGlvbnMgYXJl IHJ1bgogCSAqIGFzIHRoYXQgdXNlci4gIEFsc28gbG9jayBkb3duIHNlY3VyaXR5LXJlc3RyaWN0 ZWQgb3BlcmF0aW9ucyBhbmQKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3ZhY3V1 bXBhcmFsbGVsLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy92YWN1dW1wYXJhbGxlbC5jCmluZGV4 IDJiOWQ1NDhjZGViLi5jYjRiN2MyMzAxMCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFu ZHMvdmFjdXVtcGFyYWxsZWwuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy92YWN1dW1wYXJh bGxlbC5jCkBAIC0xLDIwICsxLDIzIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCiAgKiB2YWN1 dW1wYXJhbGxlbC5jCi0gKgkgIFN1cHBvcnQgcm91dGluZXMgZm9yIHBhcmFsbGVsIHZhY3V1bSBl eGVjdXRpb24uCisgKgkgIFN1cHBvcnQgcm91dGluZXMgZm9yIHBhcmFsbGVsIFthdXRvXXZhY3V1 bSBleGVjdXRpb24uCiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRoYXQgYXJl IGludGVuZGVkIHRvIHN1cHBvcnQgc2V0dGluZyB1cCwgdXNpbmcsCiAgKiBhbmQgdGVhcmluZyBk b3duIGEgUGFyYWxsZWxWYWN1dW1TdGF0ZS4KICAqCi0gKiBJbiBhIHBhcmFsbGVsIHZhY3V1bSwg d2UgcGVyZm9ybSBib3RoIGluZGV4IGJ1bGsgZGVsZXRpb24gYW5kIGluZGV4IGNsZWFudXAKLSAq IHdpdGggcGFyYWxsZWwgd29ya2VyIHByb2Nlc3Nlcy4gIEluZGl2aWR1YWwgaW5kZXhlcyBhcmUg cHJvY2Vzc2VkIGJ5IG9uZQotICogdmFjdXVtIHByb2Nlc3MuICBQYXJhbGxlbFZhY3V1bVN0YXRl IGNvbnRhaW5zIHNoYXJlZCBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzCi0gKiB0aGUgbWVtb3J5IHNw YWNlIGZvciBzdG9yaW5nIGRlYWQgaXRlbXMgYWxsb2NhdGVkIGluIHRoZSBEU0EgYXJlYS4gIFdl CisgKiBJbiBhIHBhcmFsbGVsIFthdXRvXXZhY3V1bSwgd2UgcGVyZm9ybSBib3RoIGluZGV4IGJ1 bGsgZGVsZXRpb24gYW5kIGluZGV4CisgKiBjbGVhbnVwIHdpdGggcGFyYWxsZWwgd29ya2VyIHBy b2Nlc3Nlcy4gIEluZGl2aWR1YWwgaW5kZXhlcyBhcmUgcHJvY2Vzc2VkIGJ5CisgKiBvbmUgdmFj dXVtIHByb2Nlc3MuICBQYXJhbGxlbFZhY3V1bVN0YXRlIGNvbnRhaW5zIHNoYXJlZCBpbmZvcm1h dGlvbiBhcyB3ZWxsCisgKiBhcyB0aGUgbWVtb3J5IHNwYWNlIGZvciBzdG9yaW5nIGRlYWQgaXRl bXMgYWxsb2NhdGVkIGluIHRoZSBEU0EgYXJlYS4gIFdlCiAgKiBsYXVuY2ggcGFyYWxsZWwgd29y a2VyIHByb2Nlc3NlcyBhdCB0aGUgc3RhcnQgb2YgcGFyYWxsZWwgaW5kZXgKICAqIGJ1bGstZGVs ZXRpb24gYW5kIGluZGV4IGNsZWFudXAgYW5kIG9uY2UgYWxsIGluZGV4ZXMgYXJlIHByb2Nlc3Nl ZCwgdGhlCiAgKiBwYXJhbGxlbCB3b3JrZXIgcHJvY2Vzc2VzIGV4aXQuICBFYWNoIHRpbWUgd2Ug cHJvY2VzcyBpbmRleGVzIGluIHBhcmFsbGVsLAogICogdGhlIHBhcmFsbGVsIGNvbnRleHQgaXMg cmUtaW5pdGlhbGl6ZWQgc28gdGhhdCB0aGUgc2FtZSBEU00gY2FuIGJlIHVzZWQgZm9yCi0gKiBt dWx0aXBsZSBwYXNzZXMgb2YgaW5kZXggYnVsay1kZWxldGlvbiBhbmQgaW5kZXggY2xlYW51cC4K KyAqIG11bHRpcGxlIHBhc3NlcyBvZiBpbmRleCBidWxrLWRlbGV0aW9uIGFuZCBpbmRleCBjbGVh bnVwLiBGb3IgbWFpbnRlbmFuY2UKKyAqIHZhY3V1bSwgd2UgbGF1bmNoIHdvcmtlcnMgbWFudWFs bHkgKHVzaW5nIGR5bmFtaWMgYmd3b3JrZXJzIG1hY2hpbmVyeSksIGFuZAorICogZm9yIGF1dG92 YWN1dW0gd2Ugc2VuZCBzaWduYWxzIHRvIHRoZSBhdXRvdmFjdXVtIGxhdW5jaGVyIChhbGwgbG9n aWMgZm9yCisgKiBjb21tdW5pY2F0aW9uIGFtb25nIHBhcmFsbGVsIGF1dG92YWN1dW0gcHJvY2Vz c2VzIGlzIGluIGF1dG92YWN1dW0uYykuCiAgKgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAx OTk2LTIwMjUsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCiAgKiBQb3J0aW9u cyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZv cm5pYQpAQCAtMzQsOSArMzcsMTEgQEAKICNpbmNsdWRlICJleGVjdXRvci9pbnN0cnVtZW50Lmgi CiAjaW5jbHVkZSAib3B0aW1pemVyL3BhdGhzLmgiCiAjaW5jbHVkZSAicGdzdGF0LmgiCisjaW5j bHVkZSAicG9zdG1hc3Rlci9hdXRvdmFjdXVtLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3Iu aCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hl LmgiCisjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9yZWwuaCIK IAogLyoKQEAgLTE1NywxMSArMTYyLDIwIEBAIHR5cGVkZWYgc3RydWN0IFBWSW5kU3RhdHMKIH0g UFZJbmRTdGF0czsKIAogLyoKLSAqIFN0cnVjdCBmb3IgbWFpbnRhaW5pbmcgYSBwYXJhbGxlbCB2 YWN1dW0gc3RhdGUuIHR5cGVkZWYgYXBwZWFycyBpbiB2YWN1dW0uaC4KKyAqIFN0cnVjdCBmb3Ig bWFpbnRhaW5pbmcgYSBwYXJhbGxlbCBbYXV0b112YWN1dW0gc3RhdGUuIHR5cGVkZWYgYXBwZWFy cyBpbgorICogdmFjdXVtLmguCiAgKi8KIHN0cnVjdCBQYXJhbGxlbFZhY3V1bVN0YXRlCiB7Ci0J LyogTlVMTCBmb3Igd29ya2VyIHByb2Nlc3NlcyAqLworCS8qIElzIHRoaXMgc3RydWN0dXJlIHVz ZWQgZm9yIG1haW50ZW5hbmNlIHZhY3V1bSBvciBhdXRvdmFjdXVtICovCisJYm9vbCBpc19hdXRv dmFjdXVtOworCisJLyoKKwkgKiBOVUxMIGZvciB3b3JrZXIgcHJvY2Vzc2VzLgorCSAqCisJICog Tk9URTogUGFyYWxsZWwgYXV0b3ZhY3V1bSBvbmx5IG5lZWRzIGEgc3Vic2V0IG9mIHRoZSBtYWlu dGVuYW5jZSB2YWN1dW0KKwkgKgkJIGZ1bmN0aW9uYWxpdHkuCisJICovCiAJUGFyYWxsZWxDb250 ZXh0ICpwY3h0OwogCiAJLyogUGFyZW50IEhlYXAgUmVsYXRpb24gKi8KQEAgLTIyMSw2ICsyMzUs MTAgQEAgc3RydWN0IFBhcmFsbGVsVmFjdXVtU3RhdGUKIAlQVkluZFZhY1N0YXR1cyBzdGF0dXM7 CiB9OwogCitzdGF0aWMgUGFyYWxsZWxDb250ZXh0ICpDcmVhdGVQYXJhbGxlbEF1dG9WYWNDb250 ZXh0KGludCBud29ya2Vycyk7CitzdGF0aWMgdm9pZCBJbml0aWFsaXplUGFyYWxsZWxBdXRvVmFj RFNNKFBhcmFsbGVsQ29udGV4dCAqcGN4dCk7CitzdGF0aWMgdm9pZCBEZXN0cm95UGFyYWxsZWxB dXRvVmFjQ29udGV4dChQYXJhbGxlbENvbnRleHQgKnBjeHQpOworCiBzdGF0aWMgaW50CXBhcmFs bGVsX3ZhY3V1bV9jb21wdXRlX3dvcmtlcnMoUmVsYXRpb24gKmluZHJlbHMsIGludCBuaW5kZXhl cywgaW50IG5yZXF1ZXN0ZWQsCiAJCQkJCQkJCQkJCWJvb2wgKndpbGxfcGFyYWxsZWxfdmFjdXVt KTsKIHN0YXRpYyB2b2lkIHBhcmFsbGVsX3ZhY3V1bV9wcm9jZXNzX2FsbF9pbmRleGVzKFBhcmFs bGVsVmFjdXVtU3RhdGUgKnB2cywgaW50IG51bV9pbmRleF9zY2FucywKQEAgLTI4MCwxNSArMjk4 LDIxIEBAIHBhcmFsbGVsX3ZhY3V1bV9pbml0KFJlbGF0aW9uIHJlbCwgUmVsYXRpb24gKmluZHJl bHMsIGludCBuaW5kZXhlcywKIAl9CiAKIAlwdnMgPSAoUGFyYWxsZWxWYWN1dW1TdGF0ZSAqKSBw YWxsb2MwKHNpemVvZihQYXJhbGxlbFZhY3V1bVN0YXRlKSk7CisJcHZzLT5pc19hdXRvdmFjdXVt ID0gQW1BdXRvVmFjdXVtV29ya2VyUHJvY2VzcygpOwogCXB2cy0+aW5kcmVscyA9IGluZHJlbHM7 CiAJcHZzLT5uaW5kZXhlcyA9IG5pbmRleGVzOwogCXB2cy0+d2lsbF9wYXJhbGxlbF92YWN1dW0g PSB3aWxsX3BhcmFsbGVsX3ZhY3V1bTsKIAlwdnMtPmJzdHJhdGVneSA9IGJzdHJhdGVneTsKIAlw dnMtPmhlYXByZWwgPSByZWw7CiAKLQlFbnRlclBhcmFsbGVsTW9kZSgpOwotCXBjeHQgPSBDcmVh dGVQYXJhbGxlbENvbnRleHQoInBvc3RncmVzIiwgInBhcmFsbGVsX3ZhY3V1bV9tYWluIiwKLQkJ CQkJCQkJIHBhcmFsbGVsX3dvcmtlcnMpOworCWlmIChwdnMtPmlzX2F1dG92YWN1dW0pCisJCXBj eHQgPSBDcmVhdGVQYXJhbGxlbEF1dG9WYWNDb250ZXh0KHBhcmFsbGVsX3dvcmtlcnMpOworCWVs c2UKKwl7CisJCUVudGVyUGFyYWxsZWxNb2RlKCk7CisJCXBjeHQgPSBDcmVhdGVQYXJhbGxlbENv bnRleHQoInBvc3RncmVzIiwgInBhcmFsbGVsX3ZhY3V1bV9tYWluIiwKKwkJCQkJCQkJCSBwYXJh bGxlbF93b3JrZXJzKTsKKwl9CiAJQXNzZXJ0KHBjeHQtPm53b3JrZXJzID4gMCk7CiAJcHZzLT5w Y3h0ID0gcGN4dDsKIApAQCAtMzI3LDcgKzM1MSwxMCBAQCBwYXJhbGxlbF92YWN1dW1faW5pdChS ZWxhdGlvbiByZWwsIFJlbGF0aW9uICppbmRyZWxzLCBpbnQgbmluZGV4ZXMsCiAJZWxzZQogCQlx dWVyeWxlbiA9IDA7CQkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLwogCi0JSW5pdGlhbGl6ZVBh cmFsbGVsRFNNKHBjeHQpOworCWlmIChwdnMtPmlzX2F1dG92YWN1dW0pCisJCUluaXRpYWxpemVQ YXJhbGxlbEF1dG9WYWNEU00ocHZzLT5wY3h0KTsKKwllbHNlCisJCUluaXRpYWxpemVQYXJhbGxl bERTTShwY3h0KTsKIAogCS8qIFByZXBhcmUgaW5kZXggdmFjdXVtIHN0YXRzICovCiAJaW5kc3Rh dHMgPSAoUFZJbmRTdGF0cyAqKSBzaG1fdG9jX2FsbG9jYXRlKHBjeHQtPnRvYywgZXN0X2luZHN0 YXRzX2xlbik7CkBAIC0zNzEsMTEgKzM5OCwxOCBAQCBwYXJhbGxlbF92YWN1dW1faW5pdChSZWxh dGlvbiByZWwsIFJlbGF0aW9uICppbmRyZWxzLCBpbnQgbmluZGV4ZXMsCiAJc2hhcmVkLT5yZWxp ZCA9IFJlbGF0aW9uR2V0UmVsaWQocmVsKTsKIAlzaGFyZWQtPmVsZXZlbCA9IGVsZXZlbDsKIAlz aGFyZWQtPnF1ZXJ5aWQgPSBwZ3N0YXRfZ2V0X215X3F1ZXJ5X2lkKCk7Ci0Jc2hhcmVkLT5tYWlu dGVuYW5jZV93b3JrX21lbV93b3JrZXIgPQotCQkobmluZGV4ZXNfbXdtID4gMCkgPwotCQltYWlu dGVuYW5jZV93b3JrX21lbSAvIE1pbihwYXJhbGxlbF93b3JrZXJzLCBuaW5kZXhlc19td20pIDoK LQkJbWFpbnRlbmFuY2Vfd29ya19tZW07Ci0Jc2hhcmVkLT5kZWFkX2l0ZW1zX2luZm8ubWF4X2J5 dGVzID0gdmFjX3dvcmtfbWVtICogKHNpemVfdCkgMTAyNDsKKworCWlmIChwdnMtPmlzX2F1dG92 YWN1dW0pCisJCXNoYXJlZC0+bWFpbnRlbmFuY2Vfd29ya19tZW1fd29ya2VyID0KKwkJCShuaW5k ZXhlc19td20gPiAwKSA/CisJCQlhdXRvdmFjdXVtX3dvcmtfbWVtIC8gTWluKHBhcmFsbGVsX3dv cmtlcnMsIG5pbmRleGVzX213bSkgOgorCQkJYXV0b3ZhY3V1bV93b3JrX21lbTsKKwllbHNlCisJ CXNoYXJlZC0+bWFpbnRlbmFuY2Vfd29ya19tZW1fd29ya2VyID0KKwkJCShuaW5kZXhlc19td20g PiAwKSA/CisJCQltYWludGVuYW5jZV93b3JrX21lbSAvIE1pbihwYXJhbGxlbF93b3JrZXJzLCBu aW5kZXhlc19td20pIDoKKwkJCW1haW50ZW5hbmNlX3dvcmtfbWVtOworCXNoYXJlZC0+ZGVhZF9p dGVtc19pbmZvLm1heF9ieXRlcyA9IHZhY193b3JrX21lbSAqIDEwMjRMOwogCiAJLyogUHJlcGFy ZSBEU0Egc3BhY2UgZm9yIGRlYWQgaXRlbXMgKi8KIAlkZWFkX2l0ZW1zID0gVGlkU3RvcmVDcmVh dGVTaGFyZWQoc2hhcmVkLT5kZWFkX2l0ZW1zX2luZm8ubWF4X2J5dGVzLApAQCAtNDUzLDggKzQ4 NywxMyBAQCBwYXJhbGxlbF92YWN1dW1fZW5kKFBhcmFsbGVsVmFjdXVtU3RhdGUgKnB2cywgSW5k ZXhCdWxrRGVsZXRlUmVzdWx0ICoqaXN0YXRzKQogCiAJVGlkU3RvcmVEZXN0cm95KHB2cy0+ZGVh ZF9pdGVtcyk7CiAKLQlEZXN0cm95UGFyYWxsZWxDb250ZXh0KHB2cy0+cGN4dCk7Ci0JRXhpdFBh cmFsbGVsTW9kZSgpOworCWlmIChwdnMtPmlzX2F1dG92YWN1dW0pCisJCURlc3Ryb3lQYXJhbGxl bEF1dG9WYWNDb250ZXh0KHB2cy0+cGN4dCk7CisJZWxzZQorCXsKKwkJRGVzdHJveVBhcmFsbGVs Q29udGV4dCgoUGFyYWxsZWxDb250ZXh0ICopIHB2cy0+cGN4dCk7CisJCUV4aXRQYXJhbGxlbE1v ZGUoKTsKKwl9CiAKIAlwZnJlZShwdnMtPndpbGxfcGFyYWxsZWxfdmFjdXVtKTsKIAlwZnJlZShw dnMpOwpAQCAtNTMyLDYgKzU3MSwxNDQgQEAgcGFyYWxsZWxfdmFjdXVtX2NsZWFudXBfYWxsX2lu ZGV4ZXMoUGFyYWxsZWxWYWN1dW1TdGF0ZSAqcHZzLCBsb25nIG51bV90YWJsZV90dXAKIAlwYXJh bGxlbF92YWN1dW1fcHJvY2Vzc19hbGxfaW5kZXhlcyhwdnMsIG51bV9pbmRleF9zY2FucywgZmFs c2UpOwogfQogCisvKgorICogU2hvcnQgdmVyc2lvbiBvZiBDcmVhdGVQYXJhbGxlbENvbnRleHQg KHBhcmFsbGVsLmMpLiBIZXJlIHdlIGluaXQgb25seSB0aG9zZQorICogZmllbGRzIHRoYXQgYXJl IG5lZWRlZCBmb3IgcGFyYWxsZWwgaW5kZXggcHJvY2Vzc2luZyBkdXJpbmcgYXV0b3ZhY3V1bS4K KyAqLworc3RhdGljIFBhcmFsbGVsQ29udGV4dCAqCitDcmVhdGVQYXJhbGxlbEF1dG9WYWNDb250 ZXh0KGludCBud29ya2VycykKK3sKKwlQYXJhbGxlbENvbnRleHQgKnBjeHQ7CisJTWVtb3J5Q29u dGV4dCBvbGRjb250ZXh0OworCisJQXNzZXJ0KEFtQXV0b1ZhY3V1bVdvcmtlclByb2Nlc3MoKSk7 CisKKwkvKiBOdW1iZXIgb2Ygd29ya2VycyBzaG91bGQgYmUgbm9uLW5lZ2F0aXZlLiAqLworCUFz c2VydChud29ya2VycyA+PSAwKTsKKworCS8qIFdlIG1pZ2h0IGJlIHJ1bm5pbmcgaW4gYSBzaG9y dC1saXZlZCBtZW1vcnkgY29udGV4dC4gKi8KKwlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3 aXRjaFRvKFRvcFRyYW5zYWN0aW9uQ29udGV4dCk7CisKKwkvKiBJbml0aWFsaXplIGEgbmV3IFBh cmFsbGVsQ29udGV4dC4gKi8KKwlwY3h0ID0gcGFsbG9jMChzaXplb2YoUGFyYWxsZWxDb250ZXh0 KSk7CisJcGN4dC0+bndvcmtlcnMgPSBud29ya2VyczsKKwlwY3h0LT5ud29ya2Vyc190b19sYXVu Y2ggPSBud29ya2VyczsKKwlzaG1fdG9jX2luaXRpYWxpemVfZXN0aW1hdG9yKCZwY3h0LT5lc3Rp bWF0b3IpOworCisJLyogUmVzdG9yZSBwcmV2aW91cyBtZW1vcnkgY29udGV4dC4gKi8KKwlNZW1v cnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CisKKwlyZXR1cm4gcGN4dDsKK30KKworLyoK KyAqIFNob3J0IHZlcnNpb24gb2YgSW5pdGlhbGl6ZVBhcmFsbGVsRFNNIChwYXJhbGxlbC5jKS4g SGVyZSB3ZSBwdXQgaW50byBkc20KKyAqIG9ubHkgdGhvc2UgZGF0YSB0aGF0IGFyZSBuZWVkZWQg Zm9yIHBhcmFsbGVsIGluZGV4IHByb2Nlc3NpbmcgZHVyaW5nCisgKiBhdXRvdmFjdXVtLgorICov CitzdGF0aWMgdm9pZAorSW5pdGlhbGl6ZVBhcmFsbGVsQXV0b1ZhY0RTTShQYXJhbGxlbENvbnRl eHQgKnBjeHQpCit7CisJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0OworCVNpemUJCXRzbmFwbGVu ID0gMDsKKwlTaXplCQlhc25hcGxlbiA9IDA7CisJU2l6ZQkJc2Vnc2l6ZSA9IDA7CisJY2hhcgkg ICAqdHNuYXBzcGFjZTsKKwljaGFyCSAgICphc25hcHNwYWNlOworCVNuYXBzaG90CXRyYW5zYWN0 aW9uX3NuYXBzaG90ID0gR2V0VHJhbnNhY3Rpb25TbmFwc2hvdCgpOworCVNuYXBzaG90CWFjdGl2 ZV9zbmFwc2hvdCA9IEdldEFjdGl2ZVNuYXBzaG90KCk7CisKKwlBc3NlcnQocGN4dC0+bndvcmtl cnMgPj0gMSk7CisKKwkvKiBXZSBtaWdodCBiZSBydW5uaW5nIGluIGEgdmVyeSBzaG9ydC1saXZl ZCBtZW1vcnkgY29udGV4dC4gKi8KKwlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRv KFRvcFRyYW5zYWN0aW9uQ29udGV4dCk7CisKKwlpZiAoSXNvbGF0aW9uVXNlc1hhY3RTbmFwc2hv dCgpKQorCXsKKwkJdHNuYXBsZW4gPSBFc3RpbWF0ZVNuYXBzaG90U3BhY2UodHJhbnNhY3Rpb25f c25hcHNob3QpOworCQlzaG1fdG9jX2VzdGltYXRlX2NodW5rKCZwY3h0LT5lc3RpbWF0b3IsIHRz bmFwbGVuKTsKKwkJc2htX3RvY19lc3RpbWF0ZV9rZXlzKCZwY3h0LT5lc3RpbWF0b3IsIDEpOwor CX0KKwlhc25hcGxlbiA9IEVzdGltYXRlU25hcHNob3RTcGFjZShhY3RpdmVfc25hcHNob3QpOwor CXNobV90b2NfZXN0aW1hdGVfY2h1bmsoJnBjeHQtPmVzdGltYXRvciwgYXNuYXBsZW4pOworCXNo bV90b2NfZXN0aW1hdGVfa2V5cygmcGN4dC0+ZXN0aW1hdG9yLCAxKTsKKworCisJLyogQ3JlYXRl IERTTSBhbmQgaW5pdGlhbGl6ZSB3aXRoIG5ldyB0YWJsZSBvZiBjb250ZW50cy4gKi8KKwlzZWdz aXplID0gc2htX3RvY19lc3RpbWF0ZSgmcGN4dC0+ZXN0aW1hdG9yKTsKKwlwY3h0LT5zZWcgPSBk c21fY3JlYXRlKHNlZ3NpemUsIERTTV9DUkVBVEVfTlVMTF9JRl9NQVhTRUdNRU5UUyk7CisKKwlp ZiAocGN4dC0+c2VnID09IE5VTEwpCisJeworCQlwY3h0LT5ud29ya2VycyA9IDA7CisJCXBjeHQt PnByaXZhdGVfbWVtb3J5ID0gTWVtb3J5Q29udGV4dEFsbG9jKFRvcE1lbW9yeUNvbnRleHQsIHNl Z3NpemUpOworCX0KKworCXBjeHQtPnRvYyA9IHNobV90b2NfY3JlYXRlKEFWX1BBUkFMTEVMX01B R0lDLAorCQkJCQkJCSAgIHBjeHQtPnNlZyA9PSBOVUxMID8gcGN4dC0+cHJpdmF0ZV9tZW1vcnkg OgorCQkJCQkJCQkJCQkJICAgZHNtX3NlZ21lbnRfYWRkcmVzcyhwY3h0LT5zZWcpLAorCQkJCQkJ CSAgIHNlZ3NpemUpOworCisJLyogV2UgY2FuIHNraXAgdGhlIHJlc3Qgb2YgdGhpcyBpZiB3ZSdy ZSBub3QgYnVkZ2V0aW5nIGZvciBhbnkgd29ya2Vycy4gKi8KKwlpZiAocGN4dC0+bndvcmtlcnMg PiAwKQorCXsKKwkJLyoKKwkJICogU2VyaWFsaXplIHRoZSB0cmFuc2FjdGlvbiBzbmFwc2hvdCBp ZiB0aGUgdHJhbnNhY3Rpb24gaXNvbGF0aW9uCisJCSAqIGxldmVsIHVzZXMgYSB0cmFuc2FjdGlv biBzbmFwc2hvdC4KKwkJICovCisJCWlmIChJc29sYXRpb25Vc2VzWGFjdFNuYXBzaG90KCkpCisJ CXsKKwkJCXRzbmFwc3BhY2UgPSBzaG1fdG9jX2FsbG9jYXRlKHBjeHQtPnRvYywgdHNuYXBsZW4p OworCQkJU2VyaWFsaXplU25hcHNob3QodHJhbnNhY3Rpb25fc25hcHNob3QsIHRzbmFwc3BhY2Up OworCQkJc2htX3RvY19pbnNlcnQocGN4dC0+dG9jLCBBVl9QQVJBTExFTF9LRVlfVFJBTlNBQ1RJ T05fU05BUFNIT1QsCisJCQkJCQkgICB0c25hcHNwYWNlKTsKKwkJfQorCisJCS8qIFNlcmlhbGl6 ZSB0aGUgYWN0aXZlIHNuYXBzaG90LiAqLworCQlhc25hcHNwYWNlID0gc2htX3RvY19hbGxvY2F0 ZShwY3h0LT50b2MsIGFzbmFwbGVuKTsKKwkJU2VyaWFsaXplU25hcHNob3QoYWN0aXZlX3NuYXBz aG90LCBhc25hcHNwYWNlKTsKKwkJc2htX3RvY19pbnNlcnQocGN4dC0+dG9jLCBBVl9QQVJBTExF TF9LRVlfQUNUSVZFX1NOQVBTSE9ULCBhc25hcHNwYWNlKTsKKwl9CisKKwkvKiBVcGRhdGUgbndv cmtlcnNfdG9fbGF1bmNoLCBpbiBjYXNlIHdlIGNoYW5nZWQgbndvcmtlcnMgYWJvdmUuICovCisJ cGN4dC0+bndvcmtlcnNfdG9fbGF1bmNoID0gcGN4dC0+bndvcmtlcnM7CisKKwkvKiBSZXN0b3Jl IHByZXZpb3VzIG1lbW9yeSBjb250ZXh0LiAqLworCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRj b250ZXh0KTsKK30KKworLyoKKyAqIFNob3J0IHZlcnNpb24gb2YgRGVzdHJveVBhcmFsbGVsQ29u dGV4dCAocGFyYWxsZWwuYykuIEhlcmUgd2UgY2xlYW4gdXAgb25seQorICogdGhvc2UgZGF0YSB0 aGF0IHdlcmUgdXNlZCBkdXJpbmcgcGFyYWxsZWwgaW5kZXggcHJvY2Vzc2luZyBkdXJpbmcgYXV0 b3ZhY3V1bS4KKyAqLworc3RhdGljIHZvaWQKK0Rlc3Ryb3lQYXJhbGxlbEF1dG9WYWNDb250ZXh0 KFBhcmFsbGVsQ29udGV4dCAqcGN4dCkKK3sKKwkvKgorCSAqIElmIHdlIGhhdmUgYWxsb2NhdGVk IGEgc2hhcmVkIG1lbW9yeSBzZWdtZW50LCBkZXRhY2ggaXQuICBUaGlzIHdpbGwKKwkgKiBpbXBs aWNpdGx5IGRldGFjaCB0aGUgZXJyb3IgcXVldWVzLCBhbmQgYW55IG90aGVyIHNoYXJlZCBtZW1v cnkgcXVldWVzLAorCSAqIHN0b3JlZCB0aGVyZS4KKwkgKi8KKwlpZiAocGN4dC0+c2VnICE9IE5V TEwpCisJeworCQlkc21fZGV0YWNoKHBjeHQtPnNlZyk7CisJCXBjeHQtPnNlZyA9IE5VTEw7CisJ fQorCisJLyoKKwkgKiBJZiB0aGlzIHBhcmFsbGVsIGNvbnRleHQgaXMgYWN0dWFsbHkgaW4gYmFj a2VuZC1wcml2YXRlIG1lbW9yeSByYXRoZXIKKwkgKiB0aGFuIHNoYXJlZCBtZW1vcnksIGZyZWUg dGhhdCBtZW1vcnkgaW5zdGVhZC4KKwkgKi8KKwlpZiAocGN4dC0+cHJpdmF0ZV9tZW1vcnkgIT0g TlVMTCkKKwl7CisJCXBmcmVlKHBjeHQtPnByaXZhdGVfbWVtb3J5KTsKKwkJcGN4dC0+cHJpdmF0 ZV9tZW1vcnkgPSBOVUxMOworCX0KKworCUF1dG9WYWN1dW1SZWxlYXNlUGFyYWxsZWxXb3JrKGZh bHNlKTsKKwlwZnJlZShwY3h0KTsKK30KKwogLyoKICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBw YXJhbGxlbCB3b3JrZXIgcHJvY2Vzc2VzIHRvIHJlcXVlc3QuICBCb3RoIGluZGV4CiAgKiB2YWN1 dW0gYW5kIGluZGV4IGNsZWFudXAgY2FuIGJlIGV4ZWN1dGVkIHdpdGggcGFyYWxsZWwgd29ya2Vy cy4KQEAgLTU1OCw3ICs3MzUsOSBAQCBwYXJhbGxlbF92YWN1dW1fY29tcHV0ZV93b3JrZXJzKFJl bGF0aW9uICppbmRyZWxzLCBpbnQgbmluZGV4ZXMsIGludCBucmVxdWVzdGVkLAogCSAqIFdlIGRv bid0IGFsbG93IHBlcmZvcm1pbmcgcGFyYWxsZWwgb3BlcmF0aW9uIGluIHN0YW5kYWxvbmUgYmFj a2VuZCBvcgogCSAqIHdoZW4gcGFyYWxsZWxpc20gaXMgZGlzYWJsZWQuCiAJICovCi0JaWYgKCFJ c1VuZGVyUG9zdG1hc3RlciB8fCBtYXhfcGFyYWxsZWxfbWFpbnRlbmFuY2Vfd29ya2VycyA9PSAw KQorCWlmICghSXNVbmRlclBvc3RtYXN0ZXIgfHwKKwkJKG1heF9wYXJhbGxlbF9tYWludGVuYW5j ZV93b3JrZXJzID09IDAgJiYgIUFtQXV0b1ZhY3V1bVdvcmtlclByb2Nlc3MoKSkgfHwKKwkJKG1h eF9wYXJhbGxlbF9pbmRleF9hdXRvdmFjX3dvcmtlcnMgPT0gMCAmJiBBbUF1dG9WYWN1dW1Xb3Jr ZXJQcm9jZXNzKCkpKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC01OTcsMTUgKzc3NiwxNyBAQCBw YXJhbGxlbF92YWN1dW1fY29tcHV0ZV93b3JrZXJzKFJlbGF0aW9uICppbmRyZWxzLCBpbnQgbmlu ZGV4ZXMsIGludCBucmVxdWVzdGVkLAogCXBhcmFsbGVsX3dvcmtlcnMgPSAobnJlcXVlc3RlZCA+ IDApID8KIAkJTWluKG5yZXF1ZXN0ZWQsIG5pbmRleGVzX3BhcmFsbGVsKSA6IG5pbmRleGVzX3Bh cmFsbGVsOwogCi0JLyogQ2FwIGJ5IG1heF9wYXJhbGxlbF9tYWludGVuYW5jZV93b3JrZXJzICov Ci0JcGFyYWxsZWxfd29ya2VycyA9IE1pbihwYXJhbGxlbF93b3JrZXJzLCBtYXhfcGFyYWxsZWxf bWFpbnRlbmFuY2Vfd29ya2Vycyk7CisJLyogQ2FwIGJ5IEdVQyB2YXJpYWJsZSAqLworCXBhcmFs bGVsX3dvcmtlcnMgPSBBbUF1dG9WYWN1dW1Xb3JrZXJQcm9jZXNzKCkgPworCQlNaW4ocGFyYWxs ZWxfd29ya2VycywgbWF4X3BhcmFsbGVsX2luZGV4X2F1dG92YWNfd29ya2VycykgOgorCQlNaW4o cGFyYWxsZWxfd29ya2VycywgbWF4X3BhcmFsbGVsX21haW50ZW5hbmNlX3dvcmtlcnMpOwogCiAJ cmV0dXJuIHBhcmFsbGVsX3dvcmtlcnM7CiB9CiAKIC8qCiAgKiBQZXJmb3JtIGluZGV4IHZhY3V1 bSBvciBpbmRleCBjbGVhbnVwIHdpdGggcGFyYWxsZWwgd29ya2Vycy4gIFRoaXMgZnVuY3Rpb24K LSAqIG11c3QgYmUgdXNlZCBieSB0aGUgcGFyYWxsZWwgdmFjdXVtIGxlYWRlciBwcm9jZXNzLgor ICogbXVzdCBiZSB1c2VkIGJ5IHRoZSBwYXJhbGxlbCBbYXV0b112YWN1dW0gbGVhZGVyIHByb2Nl c3MuCiAgKi8KIHN0YXRpYyB2b2lkCiBwYXJhbGxlbF92YWN1dW1fcHJvY2Vzc19hbGxfaW5kZXhl cyhQYXJhbGxlbFZhY3V1bVN0YXRlICpwdnMsIGludCBudW1faW5kZXhfc2NhbnMsCkBAIC02NzAs NyArODUxLDcgQEAgcGFyYWxsZWxfdmFjdXVtX3Byb2Nlc3NfYWxsX2luZGV4ZXMoUGFyYWxsZWxW YWN1dW1TdGF0ZSAqcHZzLCBpbnQgbnVtX2luZGV4X3NjYW4KIAlpZiAobndvcmtlcnMgPiAwKQog CXsKIAkJLyogUmVpbml0aWFsaXplIHBhcmFsbGVsIGNvbnRleHQgdG8gcmVsYXVuY2ggcGFyYWxs ZWwgd29ya2VycyAqLwotCQlpZiAobnVtX2luZGV4X3NjYW5zID4gMCkKKwkJaWYgKG51bV9pbmRl eF9zY2FucyA+IDAgJiYgIXB2cy0+aXNfYXV0b3ZhY3V1bSkKIAkJCVJlaW5pdGlhbGl6ZVBhcmFs bGVsRFNNKHB2cy0+cGN4dCk7CiAKIAkJLyoKQEAgLTY4Niw5ICs4NjcsMjIgQEAgcGFyYWxsZWxf dmFjdXVtX3Byb2Nlc3NfYWxsX2luZGV4ZXMoUGFyYWxsZWxWYWN1dW1TdGF0ZSAqcHZzLCBpbnQg bnVtX2luZGV4X3NjYW4KIAkJICogVGhlIG51bWJlciBvZiB3b3JrZXJzIGNhbiB2YXJ5IGJldHdl ZW4gYnVsa2RlbGV0ZSBhbmQgY2xlYW51cAogCQkgKiBwaGFzZS4KIAkJICovCi0JCVJlaW5pdGlh bGl6ZVBhcmFsbGVsV29ya2VycyhwdnMtPnBjeHQsIG53b3JrZXJzKTsKLQotCQlMYXVuY2hQYXJh bGxlbFdvcmtlcnMocHZzLT5wY3h0KTsKKwkJaWYgKHB2cy0+aXNfYXV0b3ZhY3V1bSkKKwkJewor CQkJcHZzLT5wY3h0LT5ud29ya2Vyc190b19sYXVuY2ggPSBNaW4ocHZzLT5wY3h0LT5ud29ya2Vy cywgbndvcmtlcnMpOworCQkJaWYgKHB2cy0+cGN4dC0+bndvcmtlcnMgPiAwICYmIHB2cy0+cGN4 dC0+bndvcmtlcnNfdG9fbGF1bmNoID4gMCkKKwkJCXsKKwkJCQlwdnMtPnBjeHQtPm53b3JrZXJz X2xhdW5jaGVkID0KKwkJCQkJTGF1bmNoUGFyYWxsZWxBdXRvdmFjdXVtV29ya2VycyhwdnMtPmhl YXByZWwtPnJkX2lkLAorCQkJCQkJCQkJCQkJCXB2cy0+cGN4dC0+bndvcmtlcnNfdG9fbGF1bmNo LAorCQkJCQkJCQkJCQkJCWRzbV9zZWdtZW50X2hhbmRsZShwdnMtPnBjeHQtPnNlZykpOworCQkJ fQorCQl9CisJCWVsc2UKKwkJeworCQkJUmVpbml0aWFsaXplUGFyYWxsZWxXb3JrZXJzKHB2cy0+ cGN4dCwgbndvcmtlcnMpOworCQkJTGF1bmNoUGFyYWxsZWxXb3JrZXJzKHB2cy0+cGN4dCk7CisJ CX0KIAogCQlpZiAocHZzLT5wY3h0LT5ud29ya2Vyc19sYXVuY2hlZCA+IDApCiAJCXsKQEAgLTcz Myw4ICs5MjcsMTQgQEAgcGFyYWxsZWxfdmFjdXVtX3Byb2Nlc3NfYWxsX2luZGV4ZXMoUGFyYWxs ZWxWYWN1dW1TdGF0ZSAqcHZzLCBpbnQgbnVtX2luZGV4X3NjYW4KIAkgKi8KIAlpZiAobndvcmtl cnMgPiAwKQogCXsKLQkJLyogV2FpdCBmb3IgYWxsIHZhY3V1bSB3b3JrZXJzIHRvIGZpbmlzaCAq LwotCQlXYWl0Rm9yUGFyYWxsZWxXb3JrZXJzVG9GaW5pc2gocHZzLT5wY3h0KTsKKwkJLyoKKwkJ ICogV2FpdCBmb3IgYWxsIFthdXRvXXZhY3V1bSB3b3JrZXJzIGludm9sdmVkIGluIHBhcmFsbGVs IGluZGV4CisJCSAqIHByb2Nlc3NpbmcgKGlmIGFueSkgdG8gZmluaXNoIGFuZCBhZHZhbmNlIHN0 YXRlIG1hY2hpbmUuCisJCSAqLworCQlpZiAocHZzLT5pc19hdXRvdmFjdXVtICYmIHB2cy0+cGN4 dC0+bndvcmtlcnNfbGF1bmNoZWQgPj0gMCkKKwkJCVBhcmFsbGVsQXV0b3ZhY3V1bUVuZFN5bmNQ b2ludChmYWxzZSk7CisJCWVsc2UgaWYgKCFwdnMtPmlzX2F1dG92YWN1dW0pCisJCQlXYWl0Rm9y UGFyYWxsZWxXb3JrZXJzVG9GaW5pc2gocHZzLT5wY3h0KTsKIAogCQlmb3IgKGludCBpID0gMDsg aSA8IHB2cy0+cGN4dC0+bndvcmtlcnNfbGF1bmNoZWQ7IGkrKykKIAkJCUluc3RyQWNjdW1QYXJh bGxlbFF1ZXJ5KCZwdnMtPmJ1ZmZlcl91c2FnZVtpXSwgJnB2cy0+d2FsX3VzYWdlW2ldKTsKQEAg LTk4Miw4ICsxMTgyLDggQEAgcGFyYWxsZWxfdmFjdXVtX2luZGV4X2lzX3BhcmFsbGVsX3NhZmUo UmVsYXRpb24gaW5kcmVsLCBpbnQgbnVtX2luZGV4X3NjYW5zLAogLyoKICAqIFBlcmZvcm0gd29y ayB3aXRoaW4gYSBsYXVuY2hlZCBwYXJhbGxlbCBwcm9jZXNzLgogICoKLSAqIFNpbmNlIHBhcmFs bGVsIHZhY3V1bSB3b3JrZXJzIHBlcmZvcm0gb25seSBpbmRleCB2YWN1dW0gb3IgaW5kZXggY2xl YW51cCwKLSAqIHdlIGRvbid0IG5lZWQgdG8gcmVwb3J0IHByb2dyZXNzIGluZm9ybWF0aW9uLgor ICogU2luY2UgcGFyYWxsZWwgW2F1dG9ddmFjdXVtIHdvcmtlcnMgcGVyZm9ybSBvbmx5IGluZGV4 IHZhY3V1bSBvciBpbmRleAorICogY2xlYW51cCwgd2UgZG9uJ3QgbmVlZCB0byByZXBvcnQgcHJv Z3Jlc3MgaW5mb3JtYXRpb24uCiAgKi8KIHZvaWQKIHBhcmFsbGVsX3ZhY3V1bV9tYWluKGRzbV9z ZWdtZW50ICpzZWcsIHNobV90b2MgKnRvYykKQEAgLTk5NywyMyArMTE5NywyMiBAQCBwYXJhbGxl bF92YWN1dW1fbWFpbihkc21fc2VnbWVudCAqc2VnLCBzaG1fdG9jICp0b2MpCiAJQnVmZmVyVXNh Z2UgKmJ1ZmZlcl91c2FnZTsKIAlXYWxVc2FnZSAgICp3YWxfdXNhZ2U7CiAJaW50CQkJbmluZGV4 ZXM7CisJaW50CQkJd29ya2VyX251bWJlcjsKIAljaGFyCSAgICpzaGFyZWRxdWVyeTsKIAlFcnJv ckNvbnRleHRDYWxsYmFjayBlcnJjYWxsYmFjazsKIAotCS8qCi0JICogQSBwYXJhbGxlbCB2YWN1 dW0gd29ya2VyIG11c3QgaGF2ZSBvbmx5IFBST0NfSU5fVkFDVVVNIGZsYWcgc2luY2Ugd2UKLQkg KiBkb24ndCBzdXBwb3J0IHBhcmFsbGVsIHZhY3V1bSBmb3IgYXV0b3ZhY3V1bSBhcyBvZiBub3cu Ci0JICovCi0JQXNzZXJ0KE15UHJvYy0+c3RhdHVzRmxhZ3MgPT0gUFJPQ19JTl9WQUNVVU0pOwot Ci0JZWxvZyhERUJVRzEsICJzdGFydGluZyBwYXJhbGxlbCB2YWN1dW0gd29ya2VyIik7CisJQXNz ZXJ0KE15UHJvYy0+c3RhdHVzRmxhZ3MgPT0gUFJPQ19JTl9WQUNVVU0gfHwgQW1BdXRvVmFjdXVt V29ya2VyUHJvY2VzcygpKTsKKwllbG9nKERFQlVHMSwgInN0YXJ0aW5nIHBhcmFsbGVsIFthdXRv XXZhY3V1bSB3b3JrZXIiKTsKIAogCXNoYXJlZCA9IChQVlNoYXJlZCAqKSBzaG1fdG9jX2xvb2t1 cCh0b2MsIFBBUkFMTEVMX1ZBQ1VVTV9LRVlfU0hBUkVELCBmYWxzZSk7CiAKIAkvKiBTZXQgZGVi dWdfcXVlcnlfc3RyaW5nIGZvciBpbmRpdmlkdWFsIHdvcmtlcnMgKi8KLQlzaGFyZWRxdWVyeSA9 IHNobV90b2NfbG9va3VwKHRvYywgUEFSQUxMRUxfVkFDVVVNX0tFWV9RVUVSWV9URVhULCB0cnVl KTsKLQlkZWJ1Z19xdWVyeV9zdHJpbmcgPSBzaGFyZWRxdWVyeTsKLQlwZ3N0YXRfcmVwb3J0X2Fj dGl2aXR5KFNUQVRFX1JVTk5JTkcsIGRlYnVnX3F1ZXJ5X3N0cmluZyk7CisJaWYgKCFBbUF1dG9W YWN1dW1Xb3JrZXJQcm9jZXNzKCkpCisJeworCQlzaGFyZWRxdWVyeSA9IHNobV90b2NfbG9va3Vw KHRvYywgUEFSQUxMRUxfVkFDVVVNX0tFWV9RVUVSWV9URVhULCB0cnVlKTsKKwkJZGVidWdfcXVl cnlfc3RyaW5nID0gc2hhcmVkcXVlcnk7CisJCXBnc3RhdF9yZXBvcnRfYWN0aXZpdHkoU1RBVEVf UlVOTklORywgZGVidWdfcXVlcnlfc3RyaW5nKTsKKwl9CiAKIAkvKiBUcmFjayBxdWVyeSBJRCAq LwogCXBnc3RhdF9yZXBvcnRfcXVlcnlfaWQoc2hhcmVkLT5xdWVyeWlkLCBmYWxzZSk7CkBAIC0x MDkxLDggKzEyOTAsMTIgQEAgcGFyYWxsZWxfdmFjdXVtX21haW4oZHNtX3NlZ21lbnQgKnNlZywg c2htX3RvYyAqdG9jKQogCS8qIFJlcG9ydCBidWZmZXIvV0FMIHVzYWdlIGR1cmluZyBwYXJhbGxl bCBleGVjdXRpb24gKi8KIAlidWZmZXJfdXNhZ2UgPSBzaG1fdG9jX2xvb2t1cCh0b2MsIFBBUkFM TEVMX1ZBQ1VVTV9LRVlfQlVGRkVSX1VTQUdFLCBmYWxzZSk7CiAJd2FsX3VzYWdlID0gc2htX3Rv Y19sb29rdXAodG9jLCBQQVJBTExFTF9WQUNVVU1fS0VZX1dBTF9VU0FHRSwgZmFsc2UpOwotCUlu c3RyRW5kUGFyYWxsZWxRdWVyeSgmYnVmZmVyX3VzYWdlW1BhcmFsbGVsV29ya2VyTnVtYmVyXSwK LQkJCQkJCSAgJndhbF91c2FnZVtQYXJhbGxlbFdvcmtlck51bWJlcl0pOworCisJd29ya2VyX251 bWJlciA9IEFtQXV0b1ZhY3V1bVdvcmtlclByb2Nlc3MoKSA/CisJCUdldEF1dG9WYWN1dW1QYXJh bGxlbFdvcmtlck51bWJlcigpIDogUGFyYWxsZWxXb3JrZXJOdW1iZXI7CisKKwlJbnN0ckVuZFBh cmFsbGVsUXVlcnkoJmJ1ZmZlcl91c2FnZVt3b3JrZXJfbnVtYmVyXSwKKwkJCQkJCSAgJndhbF91 c2FnZVt3b3JrZXJfbnVtYmVyXSk7CiAKIAkvKiBSZXBvcnQgYW55IHJlbWFpbmluZyBjb3N0LWJh c2VkIHZhY3V1bSBkZWxheSB0aW1lICovCiAJaWYgKHRyYWNrX2Nvc3RfZGVsYXlfdGltaW5nKQpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9hdXRvdmFjdXVtLmMgYi9zcmMvYmFj a2VuZC9wb3N0bWFzdGVyL2F1dG92YWN1dW0uYwppbmRleCAxNjc1NjE1MmI3MS4uY2I5YzlmMzc0 YmIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5jCisrKyBi L3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5jCkBAIC05MCw2ICs5MCw3IEBACiAj aW5jbHVkZSAicG9zdG1hc3Rlci9wb3N0bWFzdGVyLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9haW9f c3Vic3lzLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKKyNpbmNsdWRlICJzdG9yYWdl L2NvbmRpdGlvbl92YXJpYWJsZS5oIgogI2luY2x1ZGUgInN0b3JhZ2UvaXBjLmgiCiAjaW5jbHVk ZSAic3RvcmFnZS9sYXRjaC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvbG1nci5oIgpAQCAtMTAyLDYg KzEwMyw3IEBACiAjaW5jbHVkZSAidXRpbHMvZm1ncnByb3Rvcy5oIgogI2luY2x1ZGUgInV0aWxz L2d1Y19ob29rcy5oIgogI2luY2x1ZGUgInV0aWxzL2luamVjdGlvbl9wb2ludC5oIgorI2luY2x1 ZGUgInV0aWxzL2ludmFsLmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAjaW5jbHVk ZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9wc19zdGF0dXMuaCIKQEAgLTEy OSw2ICsxMzEsOSBAQCBpbnQJCQlhdXRvdmFjdXVtX2FubF90aHJlc2g7CiBkb3VibGUJCWF1dG92 YWN1dW1fYW5sX3NjYWxlOwogaW50CQkJYXV0b3ZhY3V1bV9mcmVlemVfbWF4X2FnZTsKIGludAkJ CWF1dG92YWN1dW1fbXVsdGl4YWN0X2ZyZWV6ZV9tYXhfYWdlOworaW50CQkJbWF4X3BhcmFsbGVs X2luZGV4X2F1dG92YWNfd29ya2VyczsKK2ludAkJCWF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9y b3dzOworaW50CQkJYXV0b3ZhY19pZHhfcGFyYWxsZWxfbWluX2luZGV4ZXM7CiAKIGRvdWJsZQkJ YXV0b3ZhY3V1bV92YWNfY29zdF9kZWxheTsKIGludAkJCWF1dG92YWN1dW1fdmFjX2Nvc3RfbGlt aXQ7CkBAIC0xNjQsNiArMTY5LDE0IEBAIHN0YXRpYyBpbnQJZGVmYXVsdF9mcmVlemVfdGFibGVf YWdlOwogc3RhdGljIGludAlkZWZhdWx0X211bHRpeGFjdF9mcmVlemVfbWluX2FnZTsKIHN0YXRp YyBpbnQJZGVmYXVsdF9tdWx0aXhhY3RfZnJlZXplX3RhYmxlX2FnZTsKIAorLyoKKyAqIE51bWJl ciBvZiBhZGRpdGlvbmFsIHdvcmtlcnMgdGhhdCB3YXMgcmVxdWVzdGVkIGZvciBwYXJhbGxlbCBp bmRleCBwcm9jZXNzaW5nCisgKiBkdXJpbmcgYXV0b3ZhY3V1bS4KKyAqLworc3RhdGljIGludAlu d29ya2Vyc19mb3JfaWR4X2F1dG92YWMgPSAwOworCitzdGF0aWMgaW50IG53b3JrZXJzX2xhdW5j aGVkID0gMDsKKwogLyogTWVtb3J5IGNvbnRleHQgZm9yIGxvbmctbGl2ZWQgZGF0YSAqLwogc3Rh dGljIE1lbW9yeUNvbnRleHQgQXV0b3ZhY01lbUN4dDsKIApAQCAtMjIyLDYgKzIzNSw4IEBAIHR5 cGVkZWYgc3RydWN0IGF1dG92YWNfdGFibGUKICAqIHdpX3Byb2MJCXBvaW50ZXIgdG8gUEdQUk9D IG9mIHRoZSBydW5uaW5nIHdvcmtlciwgTlVMTCBpZiBub3Qgc3RhcnRlZAogICogd2lfbGF1bmNo dGltZSBUaW1lIGF0IHdoaWNoIHRoaXMgd29ya2VyIHdhcyBsYXVuY2hlZAogICogd2lfZG9iYWxh bmNlIFdoZXRoZXIgdGhpcyB3b3JrZXIgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGJhbGFuY2UgY2Fs Y3VsYXRpb25zCisgKiB3aV9wY2xlYW51cCBpZiAoPiAwKSA9PiB0aGlzIHdvcmtlciBtdXN0IHBh cnRpY2lwYXRlIGluIHBhcmFsbGVsIGluZGV4CisgKiAJCQkgICB2YWN1dW1pbmcgYXMgc3VwcG9y dGl2ZSAuIE11c3QgYmUgKD09IDApIGZvciBsZWFkZXIgd29ya2VyLgogICoKICAqIEFsbCBmaWVs ZHMgYXJlIHByb3RlY3RlZCBieSBBdXRvdmFjdXVtTG9jaywgZXhjZXB0IGZvciB3aV90YWJsZW9p ZCBhbmQKICAqIHdpX3NoYXJlZHJlbCB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IEF1dG92YWN1dW1T Y2hlZHVsZUxvY2sgKG5vdGUgdGhlc2UKQEAgLTIzNywxMCArMjUyLDE3IEBAIHR5cGVkZWYgc3Ry dWN0IFdvcmtlckluZm9EYXRhCiAJVGltZXN0YW1wVHogd2lfbGF1bmNodGltZTsKIAlwZ19hdG9t aWNfZmxhZyB3aV9kb2JhbGFuY2U7CiAJYm9vbAkJd2lfc2hhcmVkcmVsOworCWludAkJCXdpX3Bj bGVhbnVwOwogfSBXb3JrZXJJbmZvRGF0YTsKIAogdHlwZWRlZiBzdHJ1Y3QgV29ya2VySW5mb0Rh dGEgKldvcmtlckluZm87CiAKKyNkZWZpbmUgQW1QYXJhbGxlbElkeEF1dG9WYWNTdXBwb3J0aXZl KCkgXAorCShNeVdvcmtlckluZm8gIT0gTlVMTCAmJiBNeVdvcmtlckluZm8tPndpX3BjbGVhbnVw ID4gMCkKKworI2RlZmluZSBBbVBhcmFsbGVsSWR4QXV0b1ZhY0xlYWRlcigpIFwKKwkoTXlXb3Jr ZXJJbmZvICE9IE5VTEwgJiYgTXlXb3JrZXJJbmZvLT53aV9wY2xlYW51cCA9PSAwKQorCiAvKgog ICogUG9zc2libGUgc2lnbmFscyByZWNlaXZlZCBieSB0aGUgbGF1bmNoZXIgZnJvbSByZW1vdGUg cHJvY2Vzc2VzLiAgVGhlc2UgYXJlCiAgKiBzdG9yZWQgYXRvbWljYWxseSBpbiBzaGFyZWQgbWVt b3J5IHNvIHRoYXQgb3RoZXIgcHJvY2Vzc2VzIGNhbiBzZXQgdGhlbQpAQCAtMjUwLDkgKzI3Miwx MSBAQCB0eXBlZGVmIGVudW0KIHsKIAlBdXRvVmFjRm9ya0ZhaWxlZCwJCQkvKiBmYWlsZWQgdHJ5 aW5nIHRvIHN0YXJ0IGEgd29ya2VyICovCiAJQXV0b1ZhY1JlYmFsYW5jZSwJCQkvKiByZWJhbGFu Y2UgdGhlIGNvc3QgbGltaXRzICovCisJQXV0b1ZhY1BhcmFsbGVsUmVxLAkJCS8qIHJlcXVlc3Qg Zm9yIHBhcmFsbGVsIGluZGV4IHZhY3V1bSAqLworCUF1dG9WYWNOdW1TaWduYWxzLAkJCS8qIG11 c3QgYmUgbGFzdCAqLwogfQkJCUF1dG9WYWN1dW1TaWduYWw7CiAKLSNkZWZpbmUgQXV0b1ZhY051 bVNpZ25hbHMgKEF1dG9WYWNSZWJhbGFuY2UgKyAxKQorI2RlZmluZSBBdXRvVmFjTnVtU2lnbmFs cyAoQXV0b1ZhY1BhcmFsbGVsUmVxICsgMSkKIAogLyoKICAqIEF1dG92YWN1dW0gd29ya2l0ZW0g YXJyYXksIHN0b3JlZCBpbiBBdXRvVmFjdXVtU2htZW0tPmF2X3dvcmtJdGVtcy4gIFRoaXMKQEAg LTI3Miw2ICsyOTYsNTAgQEAgdHlwZWRlZiBzdHJ1Y3QgQXV0b1ZhY3V1bVdvcmtJdGVtCiAKICNk ZWZpbmUgTlVNX1dPUktJVEVNUwkyNTYKIAordHlwZWRlZiBlbnVtCit7CisJTEFVTkNIRVIgPSAw LAkvKiBhdXRvdmFjdXVtIGxhdW5jaGVyIG11c3Qgd2FrZSBldmVyeW9uZSB1cCAqLworCUxFQURF UiwJCQkvKiBsZWFkZXIgbXVzdCB3YWtlIGV2ZXJ5b25lIHVwICovCisJTEFTVF9XT1JLRVIsCS8q IHRoZSBsYXN0IGluaXRlZCBzdXBwb3J0aXZlIHdvcmtlciBtdXN0IHdha2UgZXZlcnlvbmUKKwkJ CQkJICAgdXAgKi8KK30gU3luY1R5cGU7CisKK3R5cGVkZWYgZW51bQoreworCVNUQVJUVVAgPSAw LAkJCQkvKiBpbml0aWFsIHZhbHVlIC0gbm8gc3luYyBwb2ludHMgd2VyZSBwYXNzZWQgKi8KKwlT VEFSVF9TWU5DX1BPSU5UX1BBU1NFRCwJLyogc3RhcnRfc3luY19wb2ludCB3YXMgcGFzc2VkICov CisJRU5EX1NZTkNfUE9JTlRfUEFTU0VELAkJLyogZW5kX3N5bmNfcG9pbnQgd2FzIHBhc3NlZCAq LworCVNIVVRET1dOLAkJCQkJLyogbGVhZGVyIHdhbnRzIHRvIHNodXQgZG93biBwYXJhbGxlbCBp bmRleAorCQkJCQkJCQkJdmFjdXVtIGR1ZSB0byBvY2N1cmVkIGVycm9yICovCit9IFN0YXR1czsK KworLyoKKyAqIFN0cnVjdHVyZSwgc3RvcmVkIGluIEF1dG9WYWN1dW1TaG1lbS0+cGF2X3dvcmtJ dGVtLiBUaGlzIGlzIHVzZWQgZm9yIG1hbmFnaW5nCisgKiBwYXJhbGxlbCBpbmRleCBwcm9jZXNz aW5nICh3aGl0aGluIHNpbmdsZSB0YWJsZSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IFBhcmFsbGVs QXV0b1ZhY3V1bVdvcmtJdGVtCit7CisJT2lkCQkJYXZ3X2RhdGFiYXNlOworCU9pZAkJCWF2d19y ZWxhdGlvbjsKKwlpbnQJCQlud29ya2Vyc19wYXJ0aWNpcGF0aW5nOworCWludAkJCW53b3JrZXJz X3RvX2xhdW5jaDsKKwlpbnQgCQlud29ya2Vyc19zbGVlcGluZzsgLyogbGVhZGVyIGRvZXNuJ3Qg Y291bnQgKi8KKwlpbnQJCQluZmluaXNoZWQ7IC8qICMgb2Ygd29ya2VycywgdGhhdCBhbHJlYWR5 IGZpbmlzaGVkIHBhcmFsbGVsCisJCQkJCQkJICBpbmRleCBwcm9jZXNzaW5nIChhbmQgcHJvYmFi bHkgYWxyZWFkeSBkZWFkKSAqLworCisJZHNtX2hhbmRsZQloYW5kbDsKKwlpbnQJCQlsZWFkZXJf cHJvY19waWQ7CisKKwlQR1BST0MgCQkJCSpsZWFkZXJfcHJvYzsKKwlDb25kaXRpb25WYXJpYWJs ZQljdjsKKworCWJvb2wJCWFjdGl2ZTsJCS8qIGJlaW5nIHByb2Nlc3NlZCAqLworCWJvb2wJCWxl YWRlcl9zbGVlcGluZ19vbl9zc3A7IC8qIHNsZWVwaW5nIG9uIHN0YXJ0IHN5bmMgcG9pbnQgKi8K Kwlib29sCQlsZWFkZXJfc2xlZXBpbmdfb25fZXNwOyAvKiBzbGVlcGluZyBvbiBlbmQgc3luYyBw b2ludCAqLworCVN5bmNUeXBlIAlzeW5jX3R5cGU7CisJU3RhdHVzCQlzdGF0dXM7Cit9CQlQYXJh bGxlbEF1dG9WYWN1dW1Xb3JrSXRlbTsKKwogLyotLS0tLS0tLS0tLS0tCiAgKiBUaGUgbWFpbiBh dXRvdmFjdXVtIHNobWVtIHN0cnVjdC4gIE9uIHNoYXJlZCBtZW1vcnkgd2Ugc3RvcmUgdGhpcyBt YWluCiAgKiBzdHJ1Y3QgYW5kIHRoZSBhcnJheSBvZiBXb3JrZXJJbmZvIHN0cnVjdHMuICBUaGlz IHN0cnVjdCBrZWVwczoKQEAgLTI4Myw2ICszNTEsOCBAQCB0eXBlZGVmIHN0cnVjdCBBdXRvVmFj dXVtV29ya0l0ZW0KICAqIGF2X3N0YXJ0aW5nV29ya2VyIHBvaW50ZXIgdG8gV29ya2VySW5mbyBj dXJyZW50bHkgYmVpbmcgc3RhcnRlZCAoY2xlYXJlZCBieQogICoJCQkJCXRoZSB3b3JrZXIgaXRz ZWxmIGFzIHNvb24gYXMgaXQncyB1cCBhbmQgcnVubmluZykKICAqIGF2X3dvcmtJdGVtcwkJd29y ayBpdGVtIGFycmF5CisgKiBwYXZfd29ya0l0ZW0JCWluZm9ybWF0aW9uIG5lZWRlZCBmb3IgcGFy YWxsZWwgaW5kZXggcHJvY2Vzc2luZyB3aGl0aGluZworICogCQkJCQlzaW5nbGUgdGFibGUKICAq IGF2X253b3JrZXJzRm9yQmFsYW5jZSB0aGUgbnVtYmVyIG9mIGF1dG92YWN1dW0gd29ya2VycyB0 byB1c2Ugd2hlbgogICogCQkJCQljYWxjdWxhdGluZyB0aGUgcGVyIHdvcmtlciBjb3N0IGxpbWl0 CiAgKgpAQCAtMjk4LDYgKzM2OCw3IEBAIHR5cGVkZWYgc3RydWN0CiAJZGxpc3RfaGVhZAlhdl9y dW5uaW5nV29ya2VyczsKIAlXb3JrZXJJbmZvCWF2X3N0YXJ0aW5nV29ya2VyOwogCUF1dG9WYWN1 dW1Xb3JrSXRlbSBhdl93b3JrSXRlbXNbTlVNX1dPUktJVEVNU107CisJUGFyYWxsZWxBdXRvVmFj dXVtV29ya0l0ZW0gcGF2X3dvcmtJdGVtOwogCXBnX2F0b21pY191aW50MzIgYXZfbndvcmtlcnNG b3JCYWxhbmNlOwogfSBBdXRvVmFjdXVtU2htZW1TdHJ1Y3Q7CiAKQEAgLTMyMiwxMSArMzkzLDE3 IEBAIHBnX25vcmV0dXJuIHN0YXRpYyB2b2lkIEF1dG9WYWNMYXVuY2hlclNodXRkb3duKHZvaWQp Owogc3RhdGljIHZvaWQgbGF1bmNoZXJfZGV0ZXJtaW5lX3NsZWVwKGJvb2wgY2FubGF1bmNoLCBi b29sIHJlY3Vyc2luZywKIAkJCQkJCQkJCSBzdHJ1Y3QgdGltZXZhbCAqbmFwKTsKIHN0YXRpYyB2 b2lkIGxhdW5jaF93b3JrZXIoVGltZXN0YW1wVHogbm93KTsKK3N0YXRpYyB2b2lkIGxhdW5jaF93 b3JrZXJfZm9yX3BjbGVhbnVwKFRpbWVzdGFtcFR6IG5vdyk7CitzdGF0aWMgdm9pZCBlbGltaW5h dGVfbG9ja19jb25mbGljdHMoUGFyYWxsZWxBdXRvVmFjdXVtV29ya0l0ZW0gKml0ZW0sCisJCQkJ CQkJCQkgYm9vbCBhbGxfbGF1bmNoZWQpOwogc3RhdGljIExpc3QgKmdldF9kYXRhYmFzZV9saXN0 KHZvaWQpOwogc3RhdGljIHZvaWQgcmVidWlsZF9kYXRhYmFzZV9saXN0KE9pZCBuZXdkYik7CiBz dGF0aWMgaW50CWRiX2NvbXBhcmF0b3IoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CiBz dGF0aWMgdm9pZCBhdXRvdmFjX3JlY2FsY3VsYXRlX3dvcmtlcnNfZm9yX2JhbGFuY2Uodm9pZCk7 CiAKK3N0YXRpYyBpbnQgcGFyYWxsZWxfYXV0b3ZhY3V1bV9zdGFydF9zeW5jX3BvaW50KGJvb2wg a2VlcF9sb2NrKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9wYXJhbGxlbF9pZHhfYXV0b3ZhY19lcnJv cnModm9pZCk7CisKIHN0YXRpYyB2b2lkIGRvX2F1dG92YWN1dW0odm9pZCk7CiBzdGF0aWMgdm9p ZCBGcmVlV29ya2VySW5mbyhpbnQgY29kZSwgRGF0dW0gYXJnKTsKIApAQCAtMzU1LDYgKzQzMiwx MCBAQCBzdGF0aWMgdm9pZCBhdmxfc2lndXNyMl9oYW5kbGVyKFNJR05BTF9BUkdTKTsKIHN0YXRp YyBib29sIGF2X3dvcmtlcl9hdmFpbGFibGUodm9pZCk7CiBzdGF0aWMgdm9pZCBjaGVja19hdl93 b3JrZXJfZ3Vjcyh2b2lkKTsKIAordHlwZWRlZiBib29sICgqd2FrZXVwX2NvbmRpdGlvbikgKFBh cmFsbGVsQXV0b1ZhY3V1bVdvcmtJdGVtICppdGVtKTsKK3N0YXRpYyBib29sIHN0YXJ0X3N5bmNf cG9pbnRfd2FrZXVwX2NvbmQoUGFyYWxsZWxBdXRvVmFjdXVtV29ya0l0ZW0gKml0ZW0pOworc3Rh dGljIGJvb2wgZW5kX3N5bmNfcG9pbnRfd2FrZXVwX2NvbmQoUGFyYWxsZWxBdXRvVmFjdXVtV29y a0l0ZW0gKml0ZW0pOworc3RhdGljIHZvaWQgQ1ZTbGVlcChQYXJhbGxlbEF1dG9WYWN1dW1Xb3Jr SXRlbSAqaXRlbSwgd2FrZXVwX2NvbmRpdGlvbiB3YWtldXBfY29uZCk7CiAKIAogLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCkBAIC01ODMsNyArNjY0LDE0IEBAIEF1dG9WYWNMYXVuY2hlck1haW4oY29uc3Qgdm9pZCAq c3RhcnR1cF9kYXRhLCBzaXplX3Qgc3RhcnR1cF9kYXRhX2xlbikKIAkJICogd2FrZW5pbmcgY29u ZGl0aW9ucy4KIAkJICovCiAKLQkJbGF1bmNoZXJfZGV0ZXJtaW5lX3NsZWVwKGF2X3dvcmtlcl9h dmFpbGFibGUoKSwgZmFsc2UsICZuYXApOworCQlpZiAobndvcmtlcnNfbGF1bmNoZWQgPCBud29y a2Vyc19mb3JfaWR4X2F1dG92YWMpCisJCXsKKwkJCS8qIFRha2UgdGhlIHNtYWxsZXN0IHBvc3Np YmxlIHNsZWVwIGludGVydmFsLiAqLworCQkJbmFwLnR2X3NlYyA9IDA7CisJCQluYXAudHZfdXNl YyA9IE1JTl9BVVRPVkFDX1NMRUVQVElNRSAqIDEwMDA7CisJCX0KKwkJZWxzZQorCQkJbGF1bmNo ZXJfZGV0ZXJtaW5lX3NsZWVwKGF2X3dvcmtlcl9hdmFpbGFibGUoKSwgZmFsc2UsICZuYXApOwog CiAJCS8qCiAJCSAqIFdhaXQgdW50aWwgbmFwdGltZSBleHBpcmVzIG9yIHdlIGdldCBzb21lIHR5 cGUgb2Ygc2lnbmFsIChhbGwgdGhlCkBAIC02MTQsNiArNzAyLDE5IEBAIEF1dG9WYWNMYXVuY2hl ck1haW4oY29uc3Qgdm9pZCAqc3RhcnR1cF9kYXRhLCBzaXplX3Qgc3RhcnR1cF9kYXRhX2xlbikK IAkJCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKIAkJCX0KIAorCQkJTFdMb2NrQWNx dWlyZShBdXRvdmFjdXVtTG9jaywgTFdfRVhDTFVTSVZFKTsKKwkJCWlmIChBdXRvVmFjdXVtU2ht ZW0tPmF2X3NpZ25hbFtBdXRvVmFjUGFyYWxsZWxSZXFdKQorCQkJeworCQkJCVBhcmFsbGVsQXV0 b1ZhY3V1bVdvcmtJdGVtICppdGVtOworCisJCQkJQXV0b1ZhY3V1bVNobWVtLT5hdl9zaWduYWxb QXV0b1ZhY1BhcmFsbGVsUmVxXSA9IGZhbHNlOworCisJCQkJaXRlbSA9ICZBdXRvVmFjdXVtU2ht ZW0tPnBhdl93b3JrSXRlbTsKKwkJCQlud29ya2Vyc19mb3JfaWR4X2F1dG92YWMgPSBpdGVtLT5u d29ya2Vyc190b19sYXVuY2g7CisJCQkJbndvcmtlcnNfbGF1bmNoZWQgPSAwOworCQkJfQorCQkJ TFdMb2NrUmVsZWFzZShBdXRvdmFjdXVtTG9jayk7CisKIAkJCWlmIChBdXRvVmFjdXVtU2htZW0t PmF2X3NpZ25hbFtBdXRvVmFjRm9ya0ZhaWxlZF0pCiAJCQl7CiAJCQkJLyoKQEAgLTY4Niw2ICs3 ODcsNyBAQCBBdXRvVmFjTGF1bmNoZXJNYWluKGNvbnN0IHZvaWQgKnN0YXJ0dXBfZGF0YSwgc2l6 ZV90IHN0YXJ0dXBfZGF0YV9sZW4pCiAJCQkJCXdvcmtlci0+d2lfc2hhcmVkcmVsID0gZmFsc2U7 CiAJCQkJCXdvcmtlci0+d2lfcHJvYyA9IE5VTEw7CiAJCQkJCXdvcmtlci0+d2lfbGF1bmNodGlt ZSA9IDA7CisJCQkJCXdvcmtlci0+d2lfcGNsZWFudXAgPSAtMTsKIAkJCQkJZGNsaXN0X3B1c2hf aGVhZCgmQXV0b1ZhY3V1bVNobWVtLT5hdl9mcmVlV29ya2VycywKIAkJCQkJCQkJCSAmd29ya2Vy LT53aV9saW5rcyk7CiAJCQkJCUF1dG9WYWN1dW1TaG1lbS0+YXZfc3RhcnRpbmdXb3JrZXIgPSBO VUxMOwpAQCAtNjk4LDkgKzgwMCwyOSBAQCBBdXRvVmFjTGF1bmNoZXJNYWluKGNvbnN0IHZvaWQg KnN0YXJ0dXBfZGF0YSwgc2l6ZV90IHN0YXJ0dXBfZGF0YV9sZW4pCiAJCX0KIAkJTFdMb2NrUmVs ZWFzZShBdXRvdmFjdXVtTG9jayk7CS8qIGVpdGhlciBzaGFyZWQgb3IgZXhjbHVzaXZlICovCiAK LQkJLyogaWYgd2UgY2FuJ3QgZG8gYW55dGhpbmcsIGp1c3QgZ28gYmFjayB0byBzbGVlcCAqLwog CQlpZiAoIWNhbl9sYXVuY2gpCisJCXsKKwkJCS8qCisJCQkgKiBJZiBsYXVuY2hlciBjYW5ub3Qg bGF1bmNoIGFsbCByZXF1ZXN0ZWQgZm9yIHBhcmFsbGVsIGluZGV4CisJCQkgKiB2YWN1dW0gd29y a2VycywgaXQgbXVzdCBoYW5kbGUgYWxsIHBvc3NpYmxlIGxvY2sgY29uZmxpY3RzIGFuZAorCQkJ ICogdGVsbCBldmVyeW9uZSwgdGhhdCB0aGVyZSB3aWxsIG5vIG5ldyBzdXBwb3J0aXZlIHdvcmtl cnMuCisJCQkgKi8KKwkJCWlmIChud29ya2Vyc19sYXVuY2hlZCA8IG53b3JrZXJzX2Zvcl9pZHhf YXV0b3ZhYykKKwkJCXsKKwkJCQlQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqaXRlbTsKKwor CQkJCUxXTG9ja0FjcXVpcmUoQXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xVU0lWRSk7CisJCQkJaXRl bSA9ICZBdXRvVmFjdXVtU2htZW0tPnBhdl93b3JrSXRlbTsKKwkJCQlBc3NlcnQoaXRlbS0+YWN0 aXZlKTsKKworCQkJCWVsaW1pbmF0ZV9sb2NrX2NvbmZsaWN0cyhpdGVtLCBmYWxzZSk7CisJCQkJ bndvcmtlcnNfbGF1bmNoZWQgPSBud29ya2Vyc19mb3JfaWR4X2F1dG92YWMgPSAwOworCQkJCUxX TG9ja1JlbGVhc2UoQXV0b3ZhY3V1bUxvY2spOworCQkJfQorCisJCQkvKiBpZiB3ZSBjYW4ndCBk byBhbnl0aGluZyBlbHNlLCBqdXN0IGdvIGJhY2sgdG8gc2xlZXAgKi8KIAkJCWNvbnRpbnVlOwor CQl9CiAKIAkJLyogV2UncmUgT0sgdG8gc3RhcnQgYSBuZXcgd29ya2VyICovCiAKQEAgLTcxNiw2 ICs4MzgsMTUgQEAgQXV0b1ZhY0xhdW5jaGVyTWFpbihjb25zdCB2b2lkICpzdGFydHVwX2RhdGEs IHNpemVfdCBzdGFydHVwX2RhdGFfbGVuKQogCQkJICovCiAJCQlsYXVuY2hfd29ya2VyKGN1cnJl bnRfdGltZSk7CiAJCX0KKwkJZWxzZSBpZiAobndvcmtlcnNfbGF1bmNoZWQgPCBud29ya2Vyc19m b3JfaWR4X2F1dG92YWMpCisJCXsKKwkJCS8qCisJCQkgKiBPbmUgb2YgYWN0aXZlIGF1dG92YWN1 dW0gd29ya2VycyBzZW50IHVzIHJlcXVlc3QgdG8gbGF1Y2gKKwkJCSAqIHBhcnRpY2lwYW50cyBm b3IgcGFyYWxsZWwgaW5kZXggdmFjdXVtLiBXZSBjaGVjayB0aGlzIGNhc2UgZmlyc3QKKwkJCSAq IGJlY2F1c2Ugd2UgbmVlZCB0byBzdGFydCBwYXJ0aWNpcGFudHMgYXMgc29vbiBhcyBwb3NzaWJs ZS4KKwkJCSAqLworCQkJbGF1bmNoX3dvcmtlcl9mb3JfcGNsZWFudXAoY3VycmVudF90aW1lKTsK KwkJfQogCQllbHNlCiAJCXsKIAkJCS8qCkBAIC0xMjY3LDYgKzEzOTgsNyBAQCBkb19zdGFydF93 b3JrZXIodm9pZCkKIAkJd29ya2VyLT53aV9kYm9pZCA9IGF2ZGItPmFkd19kYXRpZDsKIAkJd29y a2VyLT53aV9wcm9jID0gTlVMTDsKIAkJd29ya2VyLT53aV9sYXVuY2h0aW1lID0gR2V0Q3VycmVu dFRpbWVzdGFtcCgpOworCQl3b3JrZXItPndpX3BjbGVhbnVwID0gLTE7CiAKIAkJQXV0b1ZhY3V1 bVNobWVtLT5hdl9zdGFydGluZ1dvcmtlciA9IHdvcmtlcjsKIApAQCAtMTM0OSw2ICsxNDgxLDEz NiBAQCBsYXVuY2hfd29ya2VyKFRpbWVzdGFtcFR6IG5vdykKIAl9CiB9CiAKKy8qCisgKiBsYXVu Y2hfd29ya2VyX2Zvcl9wY2xlYW51cAorICoKKyAqIFdyYXBwZXIgZm9yIHN0YXJ0aW5nIGEgd29y a2VyIChyZXF1ZXN0ZWQgYnkgbGVhZGVyIG9mIHBhcmFsbGVsIGluZGV4CisgKiB2YWN1dW1pbmcp IGZyb20gdGhlIGxhdW5jaGVyLgorICovCitzdGF0aWMgdm9pZAorbGF1bmNoX3dvcmtlcl9mb3Jf cGNsZWFudXAoVGltZXN0YW1wVHogbm93KQoreworCVBhcmFsbGVsQXV0b1ZhY3V1bVdvcmtJdGVt ICppdGVtOworCVdvcmtlckluZm8JCQkJCXdvcmtlcjsKKwlkbGlzdF9ub2RlCQkJCSAgICp3cHRy OworCisJQXNzZXJ0KG53b3JrZXJzX2xhdW5jaGVkIDwgbndvcmtlcnNfZm9yX2lkeF9hdXRvdmFj KTsKKworCUxXTG9ja0FjcXVpcmUoQXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwkv KgorCSAqIEdldCBhIHdvcmtlciBlbnRyeSBmcm9tIHRoZSBmcmVlbGlzdC4gIFdlIGNoZWNrZWQg YWJvdmUsIHNvIHRoZXJlCisJICogcmVhbGx5IHNob3VsZCBiZSBhIGZyZWUgc2xvdC4KKwkgKi8K Kwl3cHRyID0gZGNsaXN0X3BvcF9oZWFkX25vZGUoJkF1dG9WYWN1dW1TaG1lbS0+YXZfZnJlZVdv cmtlcnMpOworCisJd29ya2VyID0gZGxpc3RfY29udGFpbmVyKFdvcmtlckluZm9EYXRhLCB3aV9s aW5rcywgd3B0cik7CisJd29ya2VyLT53aV9kYm9pZCA9IEludmFsaWRPaWQ7CisJd29ya2VyLT53 aV9wcm9jID0gTlVMTDsKKwl3b3JrZXItPndpX2xhdW5jaHRpbWUgPSBHZXRDdXJyZW50VGltZXN0 YW1wKCk7CisKKwkvKgorCSAqIFNldCBpbmRpY2F0b3IsIHRoYXQgdGhpcyB3b3JrZXJzIG11c3Qg am9pbiB0byBwYXJhbGxlbCBpbmRleCB2YWN1dW0uCisJICogVGhpcyB2YXJpYWJsZSBhbHNvIHBs YXlzIHRoZSByb2xlIG9mIGFuIHVuaXF1ZSBpZCBhbW9uZyBwYXJhbGxlbCBpbmRleAorCSAqIHZh Y3V1bSB3b3JrZXJzLiBGaXJzdCBpZCBpcyAnMScsIGJlY2F1c2UgJzAnIGlzIHJlc2VydmVkIGZv ciBsZWFkZXIuCisJICovCisJd29ya2VyLT53aV9wY2xlYW51cCA9IChud29ya2Vyc19sYXVuY2hl ZCArIDEpOworCisJQXV0b1ZhY3V1bVNobWVtLT5hdl9zdGFydGluZ1dvcmtlciA9IHdvcmtlcjsK KworCVNlbmRQb3N0bWFzdGVyU2lnbmFsKFBNU0lHTkFMX1NUQVJUX0FVVE9WQUNfV09SS0VSKTsK KworCWl0ZW0gPSAmQXV0b1ZhY3V1bVNobWVtLT5wYXZfd29ya0l0ZW07CisJQXNzZXJ0KGl0ZW0t PmFjdGl2ZSk7CisKKwlud29ya2Vyc19sYXVuY2hlZCArPSAxOworCisJaWYgKG53b3JrZXJzX2xh dW5jaGVkIDwgbndvcmtlcnNfZm9yX2lkeF9hdXRvdmFjKQorCXsKKwkJTFdMb2NrUmVsZWFzZShB dXRvdmFjdXVtTG9jayk7CisJCXJldHVybjsKKwl9CisKKwlBc3NlcnQoaXRlbS0+c3luY190eXBl ID09IExBVU5DSEVSICYmCisJCSAgIG53b3JrZXJzX2xhdW5jaGVkID09IG53b3JrZXJzX2Zvcl9p ZHhfYXV0b3ZhYyk7CisKKwkvKgorCSAqIElmIGxhdW5jaGVyIG1hbmFnZWQgdG8gbGF1bmNoIGFs bCByZXF1ZXN0ZWQgZm9yIHBhcmFsbGVsIGluZGV4CisJICogdmFjdXVtIHdvcmtlcnMsIGl0IG11 c3QgaGFuZGxlIGFsbCBwb3NzaWJsZSBsb2NrIGNvbmZsaWN0cy4KKwkgKi8KKwllbGltaW5hdGVf bG9ja19jb25mbGljdHMoaXRlbSwgdHJ1ZSk7CisJTFdMb2NrUmVsZWFzZShBdXRvdmFjdXVtTG9j ayk7Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIGF1dG92YWN1dW0gbGF1bmNoZXIg d2hlbiBpdCBsYXVuY2hlZCBhbGwgcmVxdWVzdGVkCisgKiB3b3JrZXJzIGZvciBwYXJhbGxlbCBp bmRleCB2YWN1dW0sIG9yIHdoZW4gaXQgcmVhbGl6ZWQsIHRoYXQgbm8gbW9yZQorICogcHJvY2Vz c2VzIGNhbiBiZSBsYXVuY2hlZC4KKyAqCisgKiBJbiB0aGlzIGZ1bmN0aW9uIGxhdW5jaGVyIHdp bGwgYXNzaWduIHJvbGVzIGluIHN1Y2ggYSB3YXkgYXMgdG8gYXZvaWQgbG9jaworICogY29uZmxp Y3RzIGJldHdlZW4gbGVhZGVyIGFuZCBzdXBwb3J0aXZlIHdvcmtlcnMuCisgKgorICogQXV0b3Zh Y3V1bUxvY2sgbXVzdCBiZSBoZWxkIGluIGV4Y2x1c2l2ZSBtb2RlIGJlZm9yZSBjYWxsaW5nIHRo aXMgZnVuY3Rpb24hCisgKi8KK3N0YXRpYyB2b2lkCitlbGltaW5hdGVfbG9ja19jb25mbGljdHMo UGFyYWxsZWxBdXRvVmFjdXVtV29ya0l0ZW0gKml0ZW0sIGJvb2wgYWxsX2xhdW5jaGVkKQorewor CUFzc2VydChBbUF1dG9WYWN1dW1MYXVuY2hlclByb2Nlc3MoKSk7CisJQXNzZXJ0KExXTG9ja0hl bGRCeU1lKEF1dG92YWN1dW1Mb2NrKSk7CisKKwkvKiBTbywgbGV0J3Mgc3RhcnQuLi4gKi8KKwor CWlmIChpdGVtLT5sZWFkZXJfc2xlZXBpbmdfb25fc3NwICYmCisJCWl0ZW0tPm53b3JrZXJzX3Ns ZWVwaW5nID09IG53b3JrZXJzX2xhdW5jaGVkKQorCXsKKwkJLyoKKwkJICogSWYgYm90aCBsZWFk ZXIgYW5kIGFsbCBsYXVuY2hlZCBzdXBwb3J0aXZlIHdvcmtlcnMgYXJlIHNsZWVwaW5nLCB0aGVu CisJCSAqIG9ubHkgd2UgY2FuIHdha2UgZXZlcnlvbmUgdXAuCisJCSAqLworCQlDb25kaXRpb25W YXJpYWJsZUJyb2FkY2FzdCgmaXRlbS0+Y3YpOworCisJCS8qIEFkdmFuY2Ugc3RhdHVzLiAqLwor CQlpdGVtLT5zdGF0dXMgPSBTVEFSVF9TWU5DX1BPSU5UX1BBU1NFRDsKKwl9CisJZWxzZSBpZiAo aXRlbS0+bGVhZGVyX3NsZWVwaW5nX29uX3NzcCAmJgorCQkJIGl0ZW0tPm53b3JrZXJzX3NsZWVw aW5nIDwgbndvcmtlcnNfbGF1bmNoZWQpCisJeworCQkvKgorCQkgKiBJZiBsZWFkZXIgYWxyZWFk eSBzbGVlcGluZywgYnV0IHNldmVyYWwgc3VwcG9ydGl2ZSB3b3JrZXJzIGFyZQorCQkgKiBpbml0 aW5nLCB3ZSBzaGlmdCB0aGUgcmVzcG9uc2liaWxpdHkgZm9yIGF3YWtlbmluZyBldmVyeW9uZSBp bnRvIHRoZQorCQkgKiB3b3JrZXIgd2hvIGNvbXBsZXRlcyBpbml0aWFsaXphdGlvbiBsYXN0CisJ CSAqLworCQlpdGVtLT5zeW5jX3R5cGUgPSBMQVNUX1dPUktFUjsKKwl9CisJZWxzZSBpZiAoIWl0 ZW0tPmxlYWRlcl9zbGVlcGluZ19vbl9zc3AgJiYKKwkJCSBpdGVtLT5ud29ya2Vyc19zbGVlcGlu ZyA9PSBud29ya2Vyc19sYXVuY2hlZCkKKwl7CisJCS8qCisJCSAqIElmIG9ubHkgbGVhZGVyIGlz IG5vdCBzbGVlcGluZyAtIGl0IG11c3Qgd2FrZSB1cCBhbGwgd29ya2VycyB3aGVuIGl0CisJCSAq IGZpbmlzaGVzIGFsbCBwcmVwYXJhdGlvbnMuCisJCSAqLworCQlpdGVtLT5zeW5jX3R5cGUgPSBM RUFERVI7CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIElmIG5vYm9keSBpcyBzbGVlcGluZywg d2UgYXNzdW1lIHRoYXQgbGVhZGVyIGhhcyBoaWdoZXIgY2hhbnNlcyB0bworCQkgKiBhc2xlZXAg Zmlyc3QsIHNvIHNldCBzeW5jIHR5cGUgdG8gTEFTVF9XT1JLRVIsIGJ1dCBpZiB0aGUgbGFzdCB3 b3JrZXIKKwkJICogd2lsbCBzZWUgdGhhdCBsZWFkZXIgc3RpbGwgbm90IHNsZWVwaW5nLCBpdCB3 aWxsIGNoYW5nZSBzeW5jIHR5cGUgdG8KKwkJICogTEVBREVSIGFuZCBhc2xlZXAuCisJCSAqLwor CQlpdGVtLT5zeW5jX3R5cGUgPSBMQVNUX1dPUktFUjsKKwl9CisKKwkvKgorCSAqIElmIHdlIGNh bm5vdCBsYXVuY2ggYWxsIHJlcXVlc3RlZCB3b3JrZXJzLCByZWZyZXNoCisJICogbndvcmtlcnNf dG9fbGF1bmNoIHZhbHVlLCBzbyB0aGF0IHRoZSBsYXN0IHdvcmtlciBjYW4gZmluZCBvdXQKKwkg KiB0aGF0IGhlIGlzIHJlYWxseSB0aGUgbGFzdC4KKwkgKi8KKwlpZiAoIWFsbF9sYXVuY2hlZCAm JiBpdGVtLT5zeW5jX3R5cGUgPT0gTEFTVF9XT1JLRVIpCisJCWl0ZW0tPm53b3JrZXJzX3RvX2xh dW5jaCA9IG53b3JrZXJzX2xhdW5jaGVkOworfQorCiAvKgogICogQ2FsbGVkIGZyb20gcG9zdG1h c3RlciB0byBzaWduYWwgYSBmYWlsdXJlIHRvIGZvcmsgYSBwcm9jZXNzIHRvIGJlY29tZQogICog d29ya2VyLiAgVGhlIHBvc3RtYXN0ZXIgc2hvdWxkIGtpbGwoU0lHVVNSMikgdGhlIGxhdW5jaGVy IHNob3J0bHkKQEAgLTEzNjAsNiArMTYyMiwzNyBAQCBBdXRvVmFjV29ya2VyRmFpbGVkKHZvaWQp CiAJQXV0b1ZhY3V1bVNobWVtLT5hdl9zaWduYWxbQXV0b1ZhY0ZvcmtGYWlsZWRdID0gdHJ1ZTsK IH0KIAorLyoKKyAqIENhbGxlZCBmcm9tIGF1dG92YWN1dW0gd29ya2VyIHRvIHNpZ25hbCB0aGF0 IGhlIG5lZWRzIHBhcnRpY2lwYW50cyBpbgorICogcGFyYWxsZWwgaW5kZXggdmFjdXVtLiBGdW5j dGlvbiBzZW5kcyBTSUdVU1IyIHRvIHRoZSBsYXVuY2hlciBhbmQgcmV0dXJucworICogJ3RydWUn IGlmZiBzaWduYWwgd2FzIHNlbnQgc3VjY2Vzc2Z1bGx5LgorICovCitib29sCitBdXRvVmFjUGFy YWxsZWxXb3JrUmVxdWVzdCh2b2lkKQoreworCWlmIChBdXRvVmFjdXVtU2htZW0tPmF2X2xhdW5j aGVycGlkID09IDApCisJeworCQllcmVwb3J0KFdBUk5JTkcsCisJCQkJKGVycmNvZGUoRVJSQ09E RV9JTlRFUk5BTF9FUlJPUiksCisJCQkJIGVycm1zZygiYXV0b3ZhY3V1bSBsYXVuY2hlciBpcyBk ZWFkIikpKTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGtpbGwoQXV0b1ZhY3V1bVNo bWVtLT5hdl9sYXVuY2hlcnBpZCwgU0lHVVNSMikgPCAwKQorCXsKKwkJZXJlcG9ydChXQVJOSU5H LAorCQkJCShlcnJjb2RlKEVSUkNPREVfU1lTVEVNX0VSUk9SKSwKKwkJCQkgZXJybXNnKCJmYWls ZWQgdG8gc2VuZCBzaWduYWwgdG8gYXV0b3ZhYyBsYXVuY2hlciAocGlkICVkKTogJW0iLAorCQkJ CQkJQXV0b1ZhY3V1bVNobWVtLT5hdl9sYXVuY2hlcnBpZCkpKTsKKworCQlyZXR1cm4gZmFsc2U7 CisJfQorCisJQXV0b1ZhY3V1bVNobWVtLT5hdl9zaWduYWxbQXV0b1ZhY1BhcmFsbGVsUmVxXSA9 IHRydWU7CisJcmV0dXJuIHRydWU7Cit9CisKIC8qIFNJR1VTUjI6IGEgd29ya2VyIGlzIHVwIGFu ZCBydW5uaW5nLCBvciBqdXN0IGZpbmlzaGVkLCBvciBmYWlsZWQgdG8gZm9yayAqLwogc3RhdGlj IHZvaWQKIGF2bF9zaWd1c3IyX2hhbmRsZXIoU0lHTkFMX0FSR1MpCkBAIC0xNTU5LDYgKzE4NTIs OCBAQCBBdXRvVmFjV29ya2VyTWFpbihjb25zdCB2b2lkICpzdGFydHVwX2RhdGEsIHNpemVfdCBz dGFydHVwX2RhdGFfbGVuKQogCXsKIAkJY2hhcgkJZGJuYW1lW05BTUVEQVRBTEVOXTsKIAorCQlB c3NlcnQoTXlXb3JrZXJJbmZvLT53aV9wY2xlYW51cCA8IDApOworCiAJCS8qCiAJCSAqIFJlcG9y dCBhdXRvdmFjIHN0YXJ0dXAgdG8gdGhlIGN1bXVsYXRpdmUgc3RhdHMgc3lzdGVtLiAgV2UKIAkJ ICogZGVsaWJlcmF0ZWx5IGRvIHRoaXMgYmVmb3JlIEluaXRQb3N0Z3Jlcywgc28gdGhhdCB0aGUK QEAgLTE1OTMsMTIgKzE4ODgsMTEzIEBAIEF1dG9WYWNXb3JrZXJNYWluKGNvbnN0IHZvaWQgKnN0 YXJ0dXBfZGF0YSwgc2l6ZV90IHN0YXJ0dXBfZGF0YV9sZW4pCiAJCXJlY2VudE11bHRpID0gUmVh ZE5leHRNdWx0aVhhY3RJZCgpOwogCQlkb19hdXRvdmFjdXVtKCk7CiAJfQorCWVsc2UgaWYgKEFt UGFyYWxsZWxJZHhBdXRvVmFjU3VwcG9ydGl2ZSgpKQorCXsKKwkJUGFyYWxsZWxBdXRvVmFjdXVt V29ya0l0ZW0gKml0ZW07CisJCWRzbV9oYW5kbGUJCWhhbmRsZTsKKwkJUEdQUk9DCQkgICAqbGVh ZGVyX3Byb2M7CisJCWludAkJCQlsZWFkZXJfcHJvY19waWQ7CisJCWRzbV9zZWdtZW50CSAgICpz ZWc7CisJCXNobV90b2MJCSAgICp0b2M7CisJCWNoYXIJCSAgICphc25hcHNwYWNlOworCQljaGFy CQkgICAqdHNuYXBzcGFjZTsKKwkJY2hhcgkJCWRibmFtZVtOQU1FREFUQUxFTl07CisJCVNuYXBz aG90CQl0c25hcHNob3Q7CisJCVNuYXBzaG90CQlhc25hcHNob3Q7CisKKwkJLyoKKwkJICogV2Ug d2lsbCBhYm9ydCBwYXJhbGxlbCBpbmRleCB2YWN1dW1pbmcgd2hpdGhpbiBjdXJyZW50IHByb2Nl c3MgaWYKKwkJICogc29tZXRoaW5nIGVycm9ycyBvdXQKKwkJICovCisJCVBHX1RSWSgpOworCQl7 CisJCQlMV0xvY2tBY3F1aXJlKEF1dG92YWN1dW1Mb2NrLCBMV19FWENMVVNJVkUpOworCQkJaXRl bSA9ICZBdXRvVmFjdXVtU2htZW0tPnBhdl93b3JrSXRlbTsKKwkJCWRiaWQgPSBpdGVtLT5hdndf ZGF0YWJhc2U7CisJCQloYW5kbGUgPSBpdGVtLT5oYW5kbDsKKwkJCWxlYWRlcl9wcm9jID0gaXRl bS0+bGVhZGVyX3Byb2M7CisJCQlsZWFkZXJfcHJvY19waWQgPSBpdGVtLT5sZWFkZXJfcHJvY19w aWQ7CisJCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKKworCQkJSW5pdFBvc3RncmVz KE5VTEwsIGRiaWQsIE5VTEwsIEludmFsaWRPaWQsCisJCQkJCQkgSU5JVF9QR19PVkVSUklERV9B TExPV19DT05OUywKKwkJCQkJCSBkYm5hbWUpOworCisJCQlzZXRfcHNfZGlzcGxheShkYm5hbWUp OworCQkJaWYgKFBvc3RBdXRoRGVsYXkpCisJCQkJcGdfdXNsZWVwKFBvc3RBdXRoRGVsYXkgKiAx MDAwMDAwTCk7CisKKwkJCS8qIEFuZCBkbyBhbiBhcHByb3ByaWF0ZSBhbW91bnQgb2Ygd29yayAq LworCQkJcmVjZW50WGlkID0gUmVhZE5leHRUcmFuc2FjdGlvbklkKCk7CisJCQlyZWNlbnRNdWx0 aSA9IFJlYWROZXh0TXVsdGlYYWN0SWQoKTsKKworCQkJaWYgKHBhcmFsbGVsX2F1dG92YWN1dW1f c3RhcnRfc3luY19wb2ludChmYWxzZSkgPT0gLTEpCisJCQl7CisJCQkJLyogV2UgYXJlIG5vdCBw YXJ0aWNpcGF0aW5nIGFueW1vcmUgKi8KKwkJCQlNeVdvcmtlckluZm8tPndpX3BjbGVhbnVwID0g LTE7CisJCQkJZ290byBleGl0OworCQkJfQorCisJCQlzZWcgPSBkc21fYXR0YWNoKGhhbmRsZSk7 CisJCQlpZiAoc2VnID09IE5VTEwpCisJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2Rl KEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCQkJIGVycm1z ZygiY291bGQgbm90IG1hcCBkeW5hbWljIHNoYXJlZCBtZW1vcnkgc2VnbWVudCIpKSk7CisKKwkJ CXRvYyA9IHNobV90b2NfYXR0YWNoKEFWX1BBUkFMTEVMX01BR0lDLCBkc21fc2VnbWVudF9hZGRy ZXNzKHNlZykpOworCQkJaWYgKHRvYyA9PSBOVUxMKQorCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJ CQkoZXJyY29kZShFUlJDT0RFX09CSkVDVF9OT1RfSU5fUFJFUkVRVUlTSVRFX1NUQVRFKSwKKwkJ CQkJCSBlcnJtc2coImludmFsaWQgbWFnaWMgbnVtYmVyIGluIGR5bmFtaWMgc2hhcmVkIG1lbW9y eSBzZWdtZW50IikpKTsKKworCQkJaWYgKCFCZWNvbWVMb2NrR3JvdXBNZW1iZXIobGVhZGVyX3By b2MsIGxlYWRlcl9wcm9jX3BpZCkpCisJCQl7CisJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCShl cnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCQkJ IGVycm1zZygiY291bGQgbm90IGJlY29tZSBsb2NrIGdyb3VwIG1lbWJlciIpKSk7CisJCQl9CisK KwkJCVN0YXJ0VHJhbnNhY3Rpb25Db21tYW5kKCk7CisKKwkJCWFzbmFwc3BhY2UgPQorCQkJCXNo bV90b2NfbG9va3VwKHRvYywgQVZfUEFSQUxMRUxfS0VZX0FDVElWRV9TTkFQU0hPVCwgZmFsc2Up OworCQkJdHNuYXBzcGFjZSA9CisJCQkJc2htX3RvY19sb29rdXAodG9jLCBBVl9QQVJBTExFTF9L RVlfVFJBTlNBQ1RJT05fU05BUFNIT1QsIHRydWUpOworCQkJYXNuYXBzaG90ID0gUmVzdG9yZVNu YXBzaG90KGFzbmFwc3BhY2UpOworCQkJdHNuYXBzaG90ID0gdHNuYXBzcGFjZSA/IFJlc3RvcmVT bmFwc2hvdCh0c25hcHNwYWNlKSA6IGFzbmFwc2hvdDsKKwkJCVJlc3RvcmVUcmFuc2FjdGlvblNu YXBzaG90KHRzbmFwc2hvdCwgbGVhZGVyX3Byb2MpOworCQkJUHVzaEFjdGl2ZVNuYXBzaG90KGFz bmFwc2hvdCk7CisKKwkJCS8qCisJCQkgKiBXZSd2ZSBjaGFuZ2VkIHdoaWNoIHR1cGxlcyB3ZSBj YW4gc2VlLCBhbmQgbXVzdCB0aGVyZWZvcmUKKwkJCSAqIGludmFsaWRhdGUgc3lzdGVtIGNhY2hl cy4KKwkJCSAqLworCQkJSW52YWxpZGF0ZVN5c3RlbUNhY2hlcygpOworCisJCQlwYXJhbGxlbF92 YWN1dW1fbWFpbihzZWcsIHRvYyk7CisKKwkJCS8qIE11c3QgcG9wIGFjdGl2ZSBzbmFwc2hvdCBz byBzbmFwbWdyLmMgZG9lc24ndCBjb21wbGFpbi4gKi8KKwkJCVBvcEFjdGl2ZVNuYXBzaG90KCk7 CisKKwkJCWRzbV9kZXRhY2goc2VnKTsKKwkJCUNvbW1pdFRyYW5zYWN0aW9uQ29tbWFuZCgpOwor CQkJUGFyYWxsZWxBdXRvdmFjdXVtRW5kU3luY1BvaW50KGZhbHNlKTsKKwkJfQorCQlQR19DQVRD SCgpOworCQl7CisJCQlFbWl0RXJyb3JSZXBvcnQoKTsKKwkJCWlmIChBbVBhcmFsbGVsSWR4QXV0 b1ZhY1N1cHBvcnRpdmUoKSkKKwkJCQloYW5kbGVfcGFyYWxsZWxfaWR4X2F1dG92YWNfZXJyb3Jz KCk7CisJCX0KKwkJUEdfRU5EX1RSWSgpOworCX0KIAogCS8qCiAJICogVGhlIGxhdW5jaGVyIHdp bGwgYmUgbm90aWZpZWQgb2YgbXkgZGVhdGggaW4gUHJvY0tpbGwsICppZiogd2UgbWFuYWdlZAog CSAqIHRvIGdldCBhIHdvcmtlciBzbG90IGF0IGFsbAogCSAqLwogCitleGl0OgogCS8qIEFsbCBk b25lLCBnbyBhd2F5ICovCiAJcHJvY19leGl0KDApOwogfQpAQCAtMjQ2MSw2ICsyODU3LDEwIEBA IGRvX2F1dG92YWN1dW0odm9pZCkKIAkJCQkJCSAgIHRhYi0+YXRfZGF0bmFtZSwgdGFiLT5hdF9u c3BuYW1lLCB0YWItPmF0X3JlbG5hbWUpOwogCQkJRW1pdEVycm9yUmVwb3J0KCk7CiAKKwkJCS8q IGlmIHdlIGFyZSBwYXJhbGxlbCBpbmRleCB2YWN1dW1pbmcgbGVhZGVyLCB3ZSBtdXN0IHNodXQg aXQgZG93biAqLworCQkJaWYgKEFtUGFyYWxsZWxJZHhBdXRvVmFjTGVhZGVyKCkpCisJCQkJaGFu ZGxlX3BhcmFsbGVsX2lkeF9hdXRvdmFjX2Vycm9ycygpOworCiAJCQkvKiB0aGlzIHJlc2V0cyBQ cm9jR2xvYmFsLT5zdGF0dXNGbGFnc1tpXSB0b28gKi8KIAkJCUFib3J0T3V0T2ZBbnlUcmFuc2Fj dGlvbigpOwogCQkJRmx1c2hFcnJvclN0YXRlKCk7CkBAIC0zMjk2LDYgKzM2OTYsNTAzIEBAIEF1 dG9WYWN1dW1SZXF1ZXN0V29yayhBdXRvVmFjdXVtV29ya0l0ZW1UeXBlIHR5cGUsIE9pZCByZWxh dGlvbklkLAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qCisgKiBSZWxlYXNlIHdvcmsgaXRlbSwg dXNlZCBmb3IgbWFuYWdpbmcgcGFyYWxsZWwgaW5kZXggdmFjdXVtLiBNdXN0IGJlIGNhbGxlZAor ICogb25jZSBhbmQgb25seSBmcm9tIGxlYWRlciB3b3JrZXIuCisgKgorICogSWYgJ2tlZXBfbG9j aycgaXMgdHJ1ZSwgdGhlbiBBdXRvdmFjdXVtTG9jayB3aWxsIG5vdCBiZSByZWxlYXNlZCBpbiB0 aGUgZW5kCisgKiBvZiBmdW5jdGlvbiBleGVjdXRpb24uCisgKi8KK3ZvaWQKK0F1dG9WYWN1dW1S ZWxlYXNlUGFyYWxsZWxXb3JrKGJvb2wga2VlcF9sb2NrKQoreworCVBhcmFsbGVsQXV0b1ZhY3V1 bVdvcmtJdGVtICp3b3JraXRlbTsKKworCS8qCisJICogV2UgbWlnaHQgbm90IGdldCB0aGUgd29y a2l0ZW0gZnJvbSBsYXVuY2hlciAod2UgbXVzdCBub3QgYmUgY29uc2lkZXJlZAorCSAqIGFzIGxl YWRlciBpbiB0aGlzIGNhc2UpLCBzbyBqdXN0IGxlYXZlLgorCSAqLworCWlmICghQW1QYXJhbGxl bElkeEF1dG9WYWNMZWFkZXIoKSkKKwkJcmV0dXJuOworCisJaWYgKCFMV0xvY2tIZWxkQnlNZShB dXRvdmFjdXVtTG9jaykpCisJCUxXTG9ja0FjcXVpcmUoQXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xV U0lWRSk7CisKKwl3b3JraXRlbSA9ICZBdXRvVmFjdXVtU2htZW0tPnBhdl93b3JrSXRlbTsKKwor CUFzc2VydChBbVBhcmFsbGVsSWR4QXV0b1ZhY0xlYWRlcigpICYmCisJCSAgIHdvcmtpdGVtLT5s ZWFkZXJfcHJvY19waWQgPT0gTXlQcm9jUGlkKTsKKworCXdvcmtpdGVtLT5sZWFkZXJfcHJvYyA9 IE5VTEw7CisJd29ya2l0ZW0tPmxlYWRlcl9wcm9jX3BpZCA9IDA7CisJd29ya2l0ZW0tPmFjdGl2 ZSA9IGZhbHNlOworCisJLyogV2UgYXJlIG5vdCBsZWFkZXIgYW55bW9yZS4gKi8KKwlNeVdvcmtl ckluZm8tPndpX3BjbGVhbnVwID0gLTE7CisKKwlpZiAoIWtlZXBfbG9jaykKKwkJTFdMb2NrUmVs ZWFzZShBdXRvdmFjdXVtTG9jayk7Cit9CisKK3N0YXRpYyBib29sCitzdGFydF9zeW5jX3BvaW50 X3dha2V1cF9jb25kKFBhcmFsbGVsQXV0b1ZhY3V1bVdvcmtJdGVtICppdGVtKQoreworCWJvb2wg bmVlZF93YWtldXAgPSBmYWxzZTsKKworCUxXTG9ja0FjcXVpcmUoQXV0b3ZhY3V1bUxvY2ssIExX X0VYQ0xVU0lWRSk7CisKKwlpZiAoQW1QYXJhbGxlbElkeEF1dG9WYWNMZWFkZXIoKSkKKwl7CisJ CS8qCisJCSAqIEluIG5vcm1hbCBjYXNlIHdlIHNob3VsZCBleGl0IHNsZWVwIGxvb3AgYWZ0ZXIg bGFzdCBsYXVuY2hlZAorCQkgKiBzdXBwb3J0aXZlIHdvcmtlciBwYXNzZWQgc3luYyBwb2ludCAo c3RhdHVzID09IFNUQVJUX1NZTkNfUE9JTlRfUEFTU0VEKS4KKwkJICogQnV0IGlmIHdlIGFyZSBp biBTSFVURE9XTiBtb2RlLCBhbGwgbGF1bmNoZWQgd29ya2VycyB3aWxsIGp1c3QgZXhpdAorCQkg KiBzeW5jIHBvaW50IHdoaXRob3V0IHN0YXR1cyBhZHZhbmNpbmcuIFdlIGNhbiBoYW5kbGUgc3Vj aCBjYXNlIGlmIHdlCisJCSAqIGNoZWNrIHRoYXQgbl9wYXJ0aWNpcGF0aW5nID09IG5fdG9fbGF1 bmNoLgorCQkgKi8KKwkJaWYgKGl0ZW0tPnN0YXR1cyA9PSBTSFVURE9XTikKKwkJCW5lZWRfd2Fr ZXVwID0gKGl0ZW0tPm53b3JrZXJzX3BhcnRpY2lwYXRpbmcgPT0gaXRlbS0+bndvcmtlcnNfdG9f bGF1bmNoKTsKKwkJZWxzZQorCQkJbmVlZF93YWtldXAgPSBpdGVtLT5zdGF0dXMgPT0gU1RBUlRf U1lOQ19QT0lOVF9QQVNTRUQ7CisJfQorCWVsc2UKKwkJbmVlZF93YWtldXAgPSAoaXRlbS0+c3Rh dHVzID09IFNUQVJUX1NZTkNfUE9JTlRfUEFTU0VEIHx8CisJCQkJCSAgIGl0ZW0tPnN0YXR1cyA9 PSBTSFVURE9XTik7CisKKwlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKKwlyZXR1cm4g bmVlZF93YWtldXA7Cit9CisKK3N0YXRpYyBib29sCitlbmRfc3luY19wb2ludF93YWtldXBfY29u ZChQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqaXRlbSkKK3sKKwlib29sIG5lZWRfd2FrZXVw ID0gZmFsc2U7CisKKwlBc3NlcnQoQW1QYXJhbGxlbElkeEF1dG9WYWNMZWFkZXIoKSk7CisKKwlM V0xvY2tBY3F1aXJlKEF1dG92YWN1dW1Mb2NrLCBMV19FWENMVVNJVkUpOworCW5lZWRfd2FrZXVw ID0gaXRlbS0+c3RhdHVzID09IEVORF9TWU5DX1BPSU5UX1BBU1NFRDsKKwlMV0xvY2tSZWxlYXNl KEF1dG92YWN1dW1Mb2NrKTsKKwlyZXR1cm4gbmVlZF93YWtldXA7Cit9CisKKy8qCisgKiBXYWl0 aW5nIG9uIGNvbmRpdGlvbiB2YXJpYWJsZSBpcyBmcmVxdWVudCBvcGVyYXRpb24sIHNvIGl0IGhh cyBiZWVkIHRha2VuCisgKiBvdXQgd2l0aCBhIHNlcGFyYXRlIGZ1bmN0aW9uLiBDYWxsZXIgbXVz dCBhY3F1aXJlIGhvbGQgQXV0b3ZhY3V1bUxvY2sgYmVmb3JlCisgKiBjYWxsaW5nIGl0LgorICov CitzdGF0aWMgdm9pZAorQ1ZTbGVlcChQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqaXRlbSwg d2FrZXVwX2NvbmRpdGlvbiB3YWtldXBfY29uZCkKK3sKKwlDb25kaXRpb25WYXJpYWJsZVByZXBh cmVUb1NsZWVwKCZpdGVtLT5jdik7CisKKwlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsK KwlQR19UUlkoKTsKKwl7CisJCWRvCisJCXsKKwkJCUNvbmRpdGlvblZhcmlhYmxlU2xlZXAoJml0 ZW0tPmN2LCBQR19XQUlUX0lQQyk7CisJCX0gd2hpbGUgKCF3YWtldXBfY29uZChpdGVtKSk7CisJ fQorCVBHX0NBVENIKCk7CisJeworCQlDb25kaXRpb25WYXJpYWJsZUNhbmNlbFNsZWVwKCk7CisJ CVBHX1JFX1RIUk9XKCk7CisJfQorCVBHX0VORF9UUlkoKTsKKworCUNvbmRpdGlvblZhcmlhYmxl Q2FuY2VsU2xlZXAoKTsKKwlMV0xvY2tBY3F1aXJlKEF1dG92YWN1dW1Mb2NrLCBMV19FWENMVVNJ VkUpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB1c2VkIHRvIHN5bmNocm9uaXplIGxlYWRl ciB3aXRoIHN1cHBvcnRpdmUgd29ya2VycyBkdXJpbmcKKyAqIHBhcmFsbGVsIGluZGV4IHZhY3V1 bWluZy4gRWFjaCBwcm9jZXNzIHdpbGwgZXhpdCBpZmY6CisgKgkJTGVhZGVyIHdvcmtlciBpcyBy ZWFkeSB0byBwZXJmb3JtIHBhcmFsbGVsIHZhY3V1bSAmJgorICogCQlBbGwgbGF1bmNoZWQgc3Vw cG9ydGl2ZSB3b3JrZXJzIGFyZSByZWFkeSB0byBwZXJmb3JtIHBhcmFsbGVsIHZhY3V1bSAmJgor ICogCQkoQXV0b3ZhY3V1bSBsYXVuY2hlciBhbHJlYWR5IGxhdW5jaGVkIGFsbCByZXF1ZXN0ZWQg d29ya2VycyB8fAorICogCQkgQXV0b3ZhY3V1bSBsYXVuY2hlciBjYW5ub3QgbGF1bmNoIG1vcmUg d29ya2VycykKKyAqCisgKiBJZiAna2VlcF9sb2NrJyBpcyB0cnVlLCB0aGVuIEF1dG92YWN1dW1M b2NrIHdpbGwgbm90IGJlIHJlbGVhc2VkIGluIHRoZSBlbmQKKyAqIG9mIGZ1bmN0aW9uIGV4ZWN1 dGlvbi4KKyAqCisgKiBOT1RFOiBTb21lIHdvcmtlcnMgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbiB3 aGVuIGxlYWRlciB3b3JrZXIgZGVjaWRlZCB0byBzaHV0CisgKiAJCSBkb3duIHBhcmFsbGVsIHZh Y3V1bWluZy4gSW4gdGhpcyBjYXNlICctMScgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KKyAqLwor c3RhdGljIGludAorcGFyYWxsZWxfYXV0b3ZhY3V1bV9zdGFydF9zeW5jX3BvaW50KGJvb2wga2Vl cF9sb2NrKQoreworCVBhcmFsbGVsQXV0b1ZhY3V1bVdvcmtJdGVtICp3b3JraXRlbTsKKwlTeW5j VHlwZSBzeW5jX3R5cGU7CisJaW50IG51bV9wYXJ0aWNpcGFudHM7CisKKwlpZiAoIUxXTG9ja0hl bGRCeU1lKEF1dG92YWN1dW1Mb2NrKSkKKwkJTFdMb2NrQWNxdWlyZShBdXRvdmFjdXVtTG9jaywg TFdfRVhDTFVTSVZFKTsKKworCXdvcmtpdGVtID0gJkF1dG9WYWN1dW1TaG1lbS0+cGF2X3dvcmtJ dGVtOworCUFzc2VydCh3b3JraXRlbS0+YWN0aXZlKTsKKwlzeW5jX3R5cGUgPSB3b3JraXRlbS0+ c3luY190eXBlOworCisJaWYgKEFtUGFyYWxsZWxJZHhBdXRvVmFjTGVhZGVyKCkpCisJeworCQlB c3NlcnQod29ya2l0ZW0tPmxlYWRlcl9wcm9jX3BpZCA9PSBNeVByb2NQaWQpOworCisJCS8qIFdh a2UgdXAgYWxsIHNsZWVwaW5nIHN1cHBvcnRpdmUgd29ya2VycywgaWYgcmVxdWlyZWQgLi4uICov CisJCWlmIChzeW5jX3R5cGUgPT0gTEVBREVSKQorCQl7CisJCQlDb25kaXRpb25WYXJpYWJsZUJy b2FkY2FzdCgmd29ya2l0ZW0tPmN2KTsKKworCQkJLyoKKwkJCSAqIEFkdmFuY2Ugc3RhdHVzLCBi ZWNhdXNlIHdlIGFyZSBndWFyYW50ZWVkIHRvIHBhc3MgdGhpcworCQkJICogc3luYyBwb2ludC4K KwkJCSAqIERvbid0IGFkdmFuY2UgaWYgd2UgY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gZXJyb3Ig aGFuZGxlIGZ1bmN0aW9uCisJCQkgKiAoc3RhdHVzID09IFNIVVRET1dOKS4KKwkJCSAqLworCQkJ aWYgKHdvcmtpdGVtLT5zdGF0dXMgIT0gU0hVVERPV04pCisJCQkJd29ya2l0ZW0tPnN0YXR1cyA9 IFNUQVJUX1NZTkNfUE9JTlRfUEFTU0VEOworCQl9CisJCS8qIC4uLiBvdGhlcndpc2UsIHdhaXQg Zm9yIHNvbWVib2R5IHRvIHdha2UgdXMgdXAgKi8KKwkJZWxzZQorCQl7CisJCQl3b3JraXRlbS0+ bGVhZGVyX3NsZWVwaW5nX29uX3NzcCA9IHRydWU7CisJCQlDVlNsZWVwKHdvcmtpdGVtLCBzdGFy dF9zeW5jX3BvaW50X3dha2V1cF9jb25kKTsKKwkJCXdvcmtpdGVtLT5sZWFkZXJfc2xlZXBpbmdf b25fc3NwID0gZmFsc2U7CisKKwkJCS8qCisJCQkgKiBBIHByaW9yaSwgd2UgYmVsaWV2ZSB0aGF0 IGluIHRoZSBlbmQgZXZlcnlvbmUgc2hvdWxkIGJlIGF3YWtlbmVkCisJCQkgKiBieSB0aGUgbGVh ZGVyLgorCQkJICovCisJCQl3b3JraXRlbS0+c3luY190eXBlID0gTEVBREVSOworCQl9CisJfQor CWVsc2UKKwl7CisJCXdvcmtpdGVtLT5ud29ya2Vyc19wYXJ0aWNpcGF0aW5nICs9IDE7CisKKwkJ LyoKKwkJICogSWYgd2Uga25vdywgdGhhdCBsYXVuY2hlciB3aWxsIG5vIGxvbmdlciBhdHRlbXB0 IHRvIGxhdW5jaCBtb3JlCisJCSAqIHN1cHBvcnRpdmUgd29ya2VycyBmb3IgdGhpcyBpdGVtID0+ IHdlIGFyZSBMQVNUX1dPUktFUiBmb3Igc3VyZS4KKwkJICoKKwkJICogTm90ZSwgdGhhdCBsYXVu Y2hlciBzZXQgTEFTVF9XT1JLRVIgc3luYyB0eXBlIHdpdGhvdXQga25vd2luZworCQkgKiBjdXJy ZW50IHN0YXR1cyBvZiBsZWFkZXIuIFNvIHdlIGFsc28gY2hlY2sgdGhhdCBsZWFkZXIgaXMgc2xl ZXBpbmcKKwkJICogYmVmb3JlIHdha2UgYWxsIHVwLiBPdGhlcndpc2UsIHdlIG11c3Qgd2FpdCBm b3IgbGVhZGVyIChhbmQgYXNrIGhpbQorCQkgKiB0byB3YWtlIGFsbCB1cCkuCisJCSAqLworCQlp ZiAod29ya2l0ZW0tPm53b3JrZXJzX3BhcnRpY2lwYXRpbmcgPT0gd29ya2l0ZW0tPm53b3JrZXJz X3RvX2xhdW5jaCAmJgorCQkJc3luY190eXBlID09IExBU1RfV09SS0VSICYmIHdvcmtpdGVtLT5s ZWFkZXJfc2xlZXBpbmdfb25fc3NwKQorCQl7CisJCQlDb25kaXRpb25WYXJpYWJsZUJyb2FkY2Fz dCgmd29ya2l0ZW0tPmN2KTsKKworCQkJLyoKKwkJCSAqIFdlIG11c3Qgbm90IGFkdmFuY2Ugc3Rh dHVzIGlmIGxlYWRlciB3YW50cyB0byBzaHV0IGRvd24gcGFyYWxsZWwKKwkJCSAqIGV4ZWN1dGlv biAoc2VlIGNoZWNrcyBiZWxvdykuCisJCQkgKi8KKwkJCWlmICh3b3JraXRlbS0+c3RhdHVzICE9 IFNIVVRET1dOKQorCQkJCXdvcmtpdGVtLT5zdGF0dXMgPSBTVEFSVF9TWU5DX1BPSU5UX1BBU1NF RDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICh3b3JraXRlbS0+bndvcmtlcnNfcGFydGljaXBh dGluZyA9PSB3b3JraXRlbS0+bndvcmtlcnNfdG9fbGF1bmNoICYmCisJCQkJc3luY190eXBlID09 IExBU1RfV09SS0VSKQorCQkJeworCQkJCXdvcmtpdGVtLT5zeW5jX3R5cGUgPSBMRUFERVI7CisJ CQl9CisKKwkJCXdvcmtpdGVtLT5ud29ya2Vyc19zbGVlcGluZyArPSAxOworCQkJQ1ZTbGVlcCh3 b3JraXRlbSwgc3RhcnRfc3luY19wb2ludF93YWtldXBfY29uZCk7CisJCQl3b3JraXRlbS0+bndv cmtlcnNfc2xlZXBpbmcgLT0gMTsKKwkJfQorCX0KKworCS8qIFRlbGwgY2FsbGVyIHRoYXQgaXQg bXVzdCBub3QgcGFydGljaXBhdGUgaW4gcGFyYWxsZWwgaW5kZXggY2xlYW51cC4gKi8KKwlpZiAo d29ya2l0ZW0tPnN0YXR1cyA9PSBTSFVURE9XTikKKwkJbnVtX3BhcnRpY2lwYW50cyA9IC0xOwor CWVsc2UKKwkJbnVtX3BhcnRpY2lwYW50cyA9IHdvcmtpdGVtLT5ud29ya2Vyc19wYXJ0aWNpcGF0 aW5nOworCisJaWYgKCFrZWVwX2xvY2spCisJCUxXTG9ja1JlbGVhc2UoQXV0b3ZhY3V1bUxvY2sp OworCisJcmV0dXJuIG51bV9wYXJ0aWNpcGFudHM7Cit9CisKKy8qCisgKiBMaWtlIGZ1bmN0aW9u IGFib3ZlLCBidXQgbXVzdCBiZSBjYWxsZWQgYnkgbGVhZGVyIGFuZCBzdXBwb3J0aXZlIHdvcmtl cnMKKyAqIHdoZW4gdGhleSBmaW5pc2hlZCBwYXJhbGxlbCBpbmRleCB2YWN1dW0uCisgKgorICog SWYgJ2tlZXBfbG9jaycgaXMgdHJ1ZSwgdGhlbiBBdXRvdmFjdXVtTG9jayB3aWxsIG5vdCBiZSBy ZWxlYXNlZCBpbiB0aGUgZW5kCisgKiBvZiBmdW5jdGlvbiBleGVjdXRpb24uCisgKi8KK3ZvaWQK K1BhcmFsbGVsQXV0b3ZhY3V1bUVuZFN5bmNQb2ludChib29sIGtlZXBfbG9jaykKK3sKKwlQYXJh bGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqd29ya2l0ZW07CisKKwlpZiAoIUxXTG9ja0hlbGRCeU1l KEF1dG92YWN1dW1Mb2NrKSkKKwkJTFdMb2NrQWNxdWlyZShBdXRvdmFjdXVtTG9jaywgTFdfRVhD TFVTSVZFKTsKKworCXdvcmtpdGVtID0gJkF1dG9WYWN1dW1TaG1lbS0+cGF2X3dvcmtJdGVtOwor CUFzc2VydCh3b3JraXRlbS0+YWN0aXZlKTsKKworCWlmICh3b3JraXRlbS0+bndvcmtlcnNfcGFy dGljaXBhdGluZyA9PSAwKQorCXsKKwkJQXNzZXJ0KCFBbVBhcmFsbGVsSWR4QXV0b1ZhY1N1cHBv cnRpdmUoKSk7CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0d28gY2FzZXMgd2hlbiBubyBzdXBwb3J0 aXZlIHdvcmtlcnMgd2VyZSBsYXVuY2hlZDoKKwkJICogMSkgTGVhZGVyIGdvdCB3b3JraXRlbSwg YnV0IGxhdW5jaGVyIGRpZG4ndCBsYXVuY2ggYW55CisJCSAqCSAgd29ya2VycyA9PiBqdXN0IGFk dmFuY2Ugc3RhdHVzLCBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdG8gd2FpdAorCQkgKgkgIGZvciBh bnlib2R5LgorCQkgKiAyKSBMZWFkZXIgZGlkbid0IGdldCB3b3JraXRlbSwgYmVjYXVzZSBpdCB3 YXMgYWxyZWFkeSBpbiB1c2UgPT4KKwkJICoJICB3ZSBtdXN0IG5vdCB0b3VjaCBpdC4gSnVzdCBs ZWF2ZS4KKwkJICovCisJCWlmIChBbVBhcmFsbGVsSWR4QXV0b1ZhY0xlYWRlcigpKQorCQl7CisJ CQlBc3NlcnQod29ya2l0ZW0tPmxlYWRlcl9wcm9jX3BpZCA9PSBNeVByb2NQaWQpOworCQkJd29y a2l0ZW0tPnN0YXR1cyA9IEVORF9TWU5DX1BPSU5UX1BBU1NFRDsKKwkJfQorCQllbHNlCisJCQlB c3NlcnQod29ya2l0ZW0tPmxlYWRlcl9wcm9jX3BpZCAhPSBNeVByb2NQaWQpOworCisJCWlmICgh a2VlcF9sb2NrKQorCQkJTFdMb2NrUmVsZWFzZShBdXRvdmFjdXVtTG9jayk7CisKKwkJcmV0dXJu OworCX0KKworCWlmIChBbVBhcmFsbGVsSWR4QXV0b1ZhY0xlYWRlcigpKQorCXsKKwkJQXNzZXJ0 KHdvcmtpdGVtLT5sZWFkZXJfcHJvY19waWQgPT0gTXlQcm9jUGlkKTsKKwkJQXNzZXJ0KHdvcmtp dGVtLT5zeW5jX3R5cGUgPT0gTEVBREVSKTsKKworCQkvKiBXYWl0IGZvciBhbGwgd29ya2VycyB0 byBmaW5pc2ggKG9ubHkgbGFzdCB3b3JrZXIgd2lsbCB3YWtlIHVzIHVwKSAqLworCQlpZiAod29y a2l0ZW0tPm5maW5pc2hlZCAhPSB3b3JraXRlbS0+bndvcmtlcnNfcGFydGljaXBhdGluZykKKwkJ eworCQkJd29ya2l0ZW0tPnN5bmNfdHlwZSA9IExBU1RfV09SS0VSOworCQkJd29ya2l0ZW0tPmxl YWRlcl9zbGVlcGluZ19vbl9lc3AgPSB0cnVlOworCQkJQ1ZTbGVlcCh3b3JraXRlbSwgZW5kX3N5 bmNfcG9pbnRfd2FrZXVwX2NvbmQpOworCQkJd29ya2l0ZW0tPmxlYWRlcl9zbGVlcGluZ19vbl9l c3AgPSBmYWxzZTsKKworCQkJQXNzZXJ0KHdvcmtpdGVtLT5uZmluaXNoZWQgPT0gd29ya2l0ZW0t Pm53b3JrZXJzX3BhcnRpY2lwYXRpbmcpOworCisJCQkvKgorCQkJICogQWR2YW5jZSBzdGF0dXMs IGJlY2F1c2Ugd2UgYXJlIGd1YXJhbnRlZWQgdG8gcGFzcyB0aGlzCisJCQkgKiBzeW5jIHBvaW50 LgorCQkJICovCisJCQl3b3JraXRlbS0+c3RhdHVzID0gRU5EX1NZTkNfUE9JTlRfUEFTU0VEOwor CQl9CisJfQorCWVsc2UKKwl7CisJCXdvcmtpdGVtLT5uZmluaXNoZWQgKz0gMTsKKworCQkvKiBJ ZiB3ZSBhcmUgbGFzdCBmaW5pc2hlZCB3b3JrZXIgLSB3YWtlIHVwIHRoZSBsZWFkZXIuCisJCSAq CisJCSAqIElmIG5vdCAtIGp1c3QgbGVhdmUsIGJlY2F1c2Ugc3VwcG9ydGl2ZSB3b3JrZXIgYWxy ZWFkeSBmaW5pc2hlZCBhbGwKKwkJICogd29yayBhbmQgbXVzdCBkaWUuCisJCSAqLworCQlpZiAo d29ya2l0ZW0tPnN5bmNfdHlwZSA9PSBMQVNUX1dPUktFUiAmJgorCQkJd29ya2l0ZW0tPm5maW5p c2hlZCA9PSB3b3JraXRlbS0+bndvcmtlcnNfcGFydGljaXBhdGluZyAmJgorCQkJd29ya2l0ZW0t PmxlYWRlcl9zbGVlcGluZ19vbl9lc3ApCisJCXsKKwkJCUNvbmRpdGlvblZhcmlhYmxlQnJvYWRj YXN0KCZ3b3JraXRlbS0+Y3YpOworCisJCQkvKgorCQkJICogRG9uJ3QgbmVlZCB0byBjaGVjayBT SFVURE9XTiBzdGF0dXMgaGVyZSAtIGFsbCBzdXBwb3J0aXZlIHdvcmtlcnMKKwkJCSAqIGFyZSBh Ym91dCB0byBmaW5pc2ggYW55d2F5LgorCQkJICovCisJCQl3b3JraXRlbS0+c3RhdHVzID0gRU5E X1NZTkNfUE9JTlRfUEFTU0VEOworCQl9CisKKwkJLyogV2UgYXJlIG5vdCBwYXJ0aWNpcGF0ZSBh bnltb3JlICovCisJCU15V29ya2VySW5mby0+d2lfcGNsZWFudXAgPSAtMTsKKwl9CisKKwlpZiAo IWtlZXBfbG9jaykKKwkJTFdMb2NrUmVsZWFzZShBdXRvdmFjdXVtTG9jayk7CisKKwlyZXR1cm47 Cit9CisKKy8qCisgKiBHZXQgaWQgb2YgcGFyYWxsZWwgaW5kZXggdmFjdXVtIHdvcmtlciAoY291 bnRpbmcgZnJvbSAwKS4KKyAqLworaW50CitHZXRBdXRvVmFjdXVtUGFyYWxsZWxXb3JrZXJOdW1i ZXIodm9pZCkKK3sKKwlBc3NlcnQoQW1BdXRvVmFjdXVtV29ya2VyUHJvY2VzcygpICYmIE15V29y a2VySW5mby0+d2lfcGNsZWFudXAgPiAwKTsKKwlyZXR1cm4gKE15V29ya2VySW5mby0+d2lfcGNs ZWFudXAgLSAxKTsKK30KKworLyoKKyAqIExlYWRlciBhdXRvdmFjdXVtIHByb2Nlc3MgY2FuIGRl Y2lkZSwgdGhhdCBoZSBuZWVkcyBzZXZlcmFsIGhlbHBlciB3b3JrZXJzCisgKiB0byBwcm9jZXNz IHRhYmxlIGluIHBhcmFsbGVsIG1vZGUuIEhlIG11c3Qgc2V0IHVwIHBhcmFsbGVsIGNvbnRleHQg YW5kIGNhbGwKKyAqIExhdW5jaFBhcmFsbGVsQXV0b3ZhY3V1bVdvcmtlcnMuCisgKgorICogSW4g dGhpcyBmdW5jdGlvbiB3ZSBkbyBmb2xsb3dpbmcgOgorICogMSkgU2VuZCBzaWduYWwgdG8gYXV0 b3ZhY3V1bSBsYW5jaGVyIHRoYXQgY3JlYXRlcyAnc3VwcG9ydGl2ZSB3b3JrZXJzJworICoJICBk dXJpbmcgbGF1bmNoZXIncyBzdGFuZGFyZCB3b3JrIGxvb3AuCisgKiAyKSBXYWl0IGZvciBzdXBw b3J0aXZlIHdvcmtlcnMgdG8gc3RhcnQuCisgKgorICogRnVuY2l0aW9uIHJldHVybiBudW1iZXIg b2Ygd29ya2VycyB0aGF0IGxhdW5jaGVyIHdhcyBhYmxlIHRvIGxhdW5jaCAobWF5IGJlCisgKiBs ZXNzIHRoZW4gJ253b3JrZXJzX3RvX2xhdW5jaCcpLgorICovCitpbnQKK0xhdW5jaFBhcmFsbGVs QXV0b3ZhY3V1bVdvcmtlcnMoT2lkIHJlbF9pZCwgaW50IG53b3JrZXJzX3RvX2xhdW5jaCwKKwkJ CQkJCQkJZHNtX2hhbmRsZSBoYW5kbGUpCit7CisJaW50IG53b3JrZXJzX2xhdW5jaGVkID0gMDsK KwlQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqd29ya2l0ZW07CisKKwlMV0xvY2tBY3F1aXJl KEF1dG92YWN1dW1Mb2NrLCBMV19FWENMVVNJVkUpOworCisJd29ya2l0ZW0gPSAmQXV0b1ZhY3V1 bVNobWVtLT5wYXZfd29ya0l0ZW07CisKKwkvKgorCSAqIEZvciBub3csIHRoZXJlIGNhbiBiZSBv bmx5IG9uZSBsZWFkZXIgYWNyb3NzIGFsbCBjbHVzdGVyLgorCSAqIFRPRE86IGZpeCBpdCBpbiBu ZXh0IHZlcnNpb25zCisJICovCisJaWYgKHdvcmtpdGVtLT5hY3RpdmUgJiYgd29ya2l0ZW0tPmxl YWRlcl9wcm9jX3BpZCAhPSBNeVByb2NQaWQpCisJeworCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1 dW1Mb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE5vdGlmeSBhdXRvdmFjdXVtIGxhdW5j aGVyIHRoYXQgd2UgbmVlZCBzdXBwb3J0aXZlIHdvcmtlcnMgKi8KKwlpZiAoQXV0b1ZhY1BhcmFs bGVsV29ya1JlcXVlc3QoKSkKKwl7CisJCS8qIE9LLCB3ZSBjYW4gdXNlIHRoaXMgd29ya2l0ZW0g ZW50cnkuIEluaXQgaXQuICovCisJCXdvcmtpdGVtLT5hdndfZGF0YWJhc2UgPSBNeURhdGFiYXNl SWQ7CisJCXdvcmtpdGVtLT5hdndfcmVsYXRpb24gPSByZWxfaWQ7CisJCXdvcmtpdGVtLT5oYW5k bCA9IGhhbmRsZTsKKwkJd29ya2l0ZW0tPmxlYWRlcl9wcm9jID0gTXlQcm9jOworCQl3b3JraXRl bS0+bGVhZGVyX3Byb2NfcGlkID0gTXlQcm9jUGlkOworCQl3b3JraXRlbS0+bndvcmtlcnNfcGFy dGljaXBhdGluZyA9IDA7CisJCXdvcmtpdGVtLT5ud29ya2Vyc190b19sYXVuY2ggPSBud29ya2Vy c190b19sYXVuY2g7CisJCXdvcmtpdGVtLT5sZWFkZXJfc2xlZXBpbmdfb25fc3NwID0gZmFsc2U7 CisJCXdvcmtpdGVtLT5sZWFkZXJfc2xlZXBpbmdfb25fZXNwID0gZmFsc2U7CisJCXdvcmtpdGVt LT5ud29ya2Vyc19zbGVlcGluZyA9IDA7CisJCXdvcmtpdGVtLT5uZmluaXNoZWQgPSAwOworCQl3 b3JraXRlbS0+c3luY190eXBlID0gTEFVTkNIRVI7CisJCXdvcmtpdGVtLT5zdGF0dXMgPSBTVEFS VFVQOworCisJCXdvcmtpdGVtLT5hY3RpdmUgPSB0cnVlOworCQlMV0xvY2tSZWxlYXNlKEF1dG92 YWN1dW1Mb2NrKTsKKworCQkvKiBCZWNvbWUgdGhlIGxlYWRlciAqLworCQlNeVdvcmtlckluZm8t PndpX3BjbGVhbnVwID0gMDsKKworCQkvKiBBbGwgY3JlYXRlZCB3b3JrZXJzIG11c3QgZ2V0IHNh bWUgbG9ja3MgYXMgbGVhZGVyIHByb2Nlc3MgKi8KKwkJQmVjb21lTG9ja0dyb3VwTGVhZGVyKCk7 CisKKwkJLyoKKwkJICogV2FpdCB1bnRpbCBhbGwgc3VwcHJvdGl2ZSB3b3JrZXJzIGFyZSBsYXVu Y2hlZC4gQWxzbyByZXRyaWV2ZSBhY3R1YWwKKwkJICogbnVtYmVyIG9mIHBhcnRpY2lwYW50cwor CQkgKi8KKworCQlud29ya2Vyc19sYXVuY2hlZCA9IHBhcmFsbGVsX2F1dG92YWN1dW1fc3RhcnRf c3luY19wb2ludChmYWxzZSk7CisJCUFzc2VydChud29ya2Vyc19sYXVuY2hlZCA+PSAwKTsKKwl9 CisJZWxzZQorCXsKKwkJLyoKKwkJICogSWYgd2UgKGZvciBhbnkgcmVhc29uKSBjYW5ub3Qgc2Vu ZCBzaWduYWwgdG8gdGhlIGxhdW5jaGVyLCBkb24ndCB0cnkKKwkJICogdG8gZG8gaW5kZXggdmFj dXVtaW5nIGluIHBhcmFsbGVsCisJCSAqLworCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2Nr KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIG53b3JrZXJzX2xhdW5jaGVkOworfQorCisv KgorICogRHVyaW5nIHBhcmFsbGVsIGluZGV4IHZhY3V1bWluZyBhbnkgd29ya2VyIChib3RoIHN1 cHBvcnRpdmVzIGFuZCBsZWFkZXIpIGNhbgorICogY2F0Y2ggYW4gZXJyb3IuCisgKiBJbiBvcmRl ciB0byBoYW5kbGUgaXQgaW4gdGhlIHJpZ2h0IHdheSB3ZSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlv bi4KKyAqLworc3RhdGljIHZvaWQKK2hhbmRsZV9wYXJhbGxlbF9pZHhfYXV0b3ZhY19lcnJvcnMo dm9pZCkKK3sKKwlQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqaXRlbTsKKworCUxXTG9ja0Fj cXVpcmUoQXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xVU0lWRSk7CisJaXRlbSA9ICZBdXRvVmFjdXVt U2htZW0tPnBhdl93b3JrSXRlbTsKKworCWlmIChBbVBhcmFsbGVsSWR4QXV0b1ZhY0xlYWRlcigp KQorCXsKKwkJaWYgKGl0ZW0tPnN0YXR1cyA9PSBTVEFSVF9TWU5DX1BPSU5UX1BBU1NFRCkKKwkJ eworCQkJLyoKKwkJCSAqIElmIHN0YXJ0IHN5bmMgcG9pbnQgYWxyZWFkeSBwYXNzZWQgLSBqdXN0 IHdhaXQgZm9yIGFsbCBzdXBwb3J0aXZlCisJCQkgKiB3b3JrZXJzIHRvIGZpbmlzaCBhbmQgZXhp dC4KKwkJCSAqLworCQkJUGFyYWxsZWxBdXRvdmFjdXVtRW5kU3luY1BvaW50KHRydWUpOworCQl9 CisJCWVsc2UgaWYgKGl0ZW0tPnN0YXR1cyA9PSBTVEFSVFVQKQorCQl7CisJCQkvKgorCQkJICog SWYgbm8gc3luYyBwb2ludCBhcmUgcGFzc2VkIHdlIGNhbiBwcmV2ZW50IHN1cHBvcnRpdmUgd29y a2VycworCQkJICogZnJvbSBwZXJmb3JtaW5nIHRoZWlyIHdvcmsgLSBzZXQgU0hVVERPV04gc3Rh dHVzIGFuZCB3YWl0IHdoaWxlCisJCQkgKiBhbGwgd29ya2VycyB3aWxsIHNlZSBpdC4KKwkJCSAq LworCQkJaXRlbS0+c3RhdHVzID0gU0hVVERPV047CisJCQlwYXJhbGxlbF9hdXRvdmFjdXVtX3N0 YXJ0X3N5bmNfcG9pbnQodHJ1ZSk7CisJCX0KKworCQlBdXRvVmFjdXVtUmVsZWFzZVBhcmFsbGVs V29yayh0cnVlKTsKKwl9CisJZWxzZQorCXsKKwkJQXNzZXJ0KEFtUGFyYWxsZWxJZHhBdXRvVmFj U3VwcG9ydGl2ZSgpKTsKKworCQlpZiAoaXRlbS0+c3RhdHVzID09IFNUQVJUVVAgfHwgaXRlbS0+ c3RhdHVzID09IFNIVVRET1dOKQorCQl7CisJCQkvKgorCQkJICogSWYgbm8gc3luYyBwb2ludCBh cmUgcGFzc2VkIC0ganVzdCBleGNsdWRlIG91cnNlbHZlcyBmcm9tCisJCQkgKiBwYXJ0aWNpcGFu dHMuIEZ1cnRoZXIgcGFyYWxsZWwgaW5kZXggdmFjdXVtaW5nIHdpbGwgdGFrZSBwbGFjZQorCQkJ ICogYXMgdXN1YWwuCisJCQkgKi8KKwkJCWl0ZW0tPm53b3JrZXJzX3RvX2xhdW5jaCAtPSAxOwor CisJCQlpZiAoaXRlbS0+bndvcmtlcnNfcGFydGljaXBhdGluZyA9PSBpdGVtLT5ud29ya2Vyc190 b19sYXVuY2ggJiYKKwkJCQlpdGVtLT5zeW5jX3R5cGUgPT0gTEFTVF9XT1JLRVIgJiYgaXRlbS0+ bGVhZGVyX3NsZWVwaW5nX29uX3NzcCkKKwkJCXsKKwkJCQlDb25kaXRpb25WYXJpYWJsZUJyb2Fk Y2FzdCgmaXRlbS0+Y3YpOworCisJCQkJaWYgKGl0ZW0tPnN0YXR1cyAhPSBTSFVURE9XTikKKwkJ CQkJaXRlbS0+c3RhdHVzID0gU1RBUlRfU1lOQ19QT0lOVF9QQVNTRUQ7CisJCQl9CisJCX0KKwkJ ZWxzZSBpZiAoaXRlbS0+c3RhdHVzID09IFNUQVJUX1NZTkNfUE9JTlRfUEFTU0VEKQorCQl7CisJ CQkvKgorCQkJICogSWYgc3RhcnQgc3luYyBwb2ludCBhbHJlYWR5IHBhc3NlZCB3ZSB3aWxsIHNp bXVsYXRlIHRoZSB1c3VhbAorCQkJICogZW5kIG9mIHdvcmsgKHNlZSBQYXJhbGxlbEF1dG92YWN1 dW1FbmRTeW5jUG9pbnQpLgorCQkJICovCisJCQlpdGVtLT5uZmluaXNoZWQgKz0gMTsKKworCQkJ LyoKKwkJCSAqIFdlIGNoZWNrICIhaXRlbS0+bGVhZGVyX3NsZWVwaW5nX29uX3NzcCIgaW4gb3Jk ZXIgdG8gaGFuZGxlIGFuCisJCQkgKiBhbG1vc3QgaW1wb3NzaWJsZSBzaXR1YXRpb24sIHdoZW4g bGVhZGVyIGRpZG4ndCBoYXZlIHRpbWUgdG8gd2FrZQorCQkJICogdXAgYWZ0ZXIgc3RhcnQgc3lu YyBwb2ludCAoYnV0IGxhc3Qgd29ya2VyIGFscmVhZHkgYWR2ZW5jZWQKKwkJCSAqIHN0YXR1cyB0 byBTVEFSVF9TWU5DX1BPSU5UX1BBU1NFRCkuIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgbm90CisJ CQkgKiBhZHZhbmNlIHN0YXR1cyB0byBFTkRfU1lOQ19QT0lOVF9QQVNTRUQsIHNvIGxlYWRlciBj YW4gY29udGludWUKKwkJCSAqIHByb2Nlc3NpbmcuCisJCQkgKi8KKwkJCWlmIChpdGVtLT5zeW5j X3R5cGUgPT0gTEFTVF9XT1JLRVIgJiYKKwkJCQlpdGVtLT5uZmluaXNoZWQgPT0gaXRlbS0+bndv cmtlcnNfcGFydGljaXBhdGluZyAmJgorCQkJCSFpdGVtLT5sZWFkZXJfc2xlZXBpbmdfb25fc3Nw KQorCQkJeworCQkJCUNvbmRpdGlvblZhcmlhYmxlQnJvYWRjYXN0KCZpdGVtLT5jdik7CisJCQkJ aXRlbS0+c3RhdHVzID0gRU5EX1NZTkNfUE9JTlRfUEFTU0VEOworCQkJfQorCQl9CisJfQorCisJ TFdMb2NrUmVsZWFzZShBdXRvdmFjdXVtTG9jayk7Cit9CisKIC8qCiAgKiBhdXRvdmFjX2luaXQK ICAqCQlUaGlzIGlzIGNhbGxlZCBhdCBwb3N0bWFzdGVyIGluaXRpYWxpemF0aW9uLgpAQCAtMzM2 MSw2ICs0MjU4LDkgQEAgQXV0b1ZhY3V1bVNobWVtSW5pdCh2b2lkKQogCQlBdXRvVmFjdXVtU2ht ZW0tPmF2X3N0YXJ0aW5nV29ya2VyID0gTlVMTDsKIAkJbWVtc2V0KEF1dG9WYWN1dW1TaG1lbS0+ YXZfd29ya0l0ZW1zLCAwLAogCQkJICAgc2l6ZW9mKEF1dG9WYWN1dW1Xb3JrSXRlbSkgKiBOVU1f V09SS0lURU1TKTsKKwkJbWVtc2V0KCZBdXRvVmFjdXVtU2htZW0tPnBhdl93b3JrSXRlbSwgMCwK KwkJCSAgIHNpemVvZihQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSkpOworCQlDb25kaXRpb25W YXJpYWJsZUluaXQoJkF1dG9WYWN1dW1TaG1lbS0+cGF2X3dvcmtJdGVtLmN2KTsKIAogCQl3b3Jr ZXIgPSAoV29ya2VySW5mbykgKChjaGFyICopIEF1dG9WYWN1dW1TaG1lbSArCiAJCQkJCQkJICAg TUFYQUxJR04oc2l6ZW9mKEF1dG9WYWN1dW1TaG1lbVN0cnVjdCkpKTsKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9ndWNfdGFibGVzLmMKaW5kZXggMmY4Y2JkODY3NTkuLjJlMzY5MjEwOTdhIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYworKysgYi9zcmMvYmFja2VuZC91 dGlscy9taXNjL2d1Y190YWJsZXMuYwpAQCAtMzY0Nyw2ICszNjQ3LDM2IEBAIHN0cnVjdCBjb25m aWdfaW50IENvbmZpZ3VyZU5hbWVzSW50W10gPQogCQljaGVja19hdXRvdmFjdXVtX3dvcmtfbWVt LCBOVUxMLCBOVUxMCiAJfSwKIAorCXsKKwkJeyJtYXhfcGFyYWxsZWxfaW5kZXhfYXV0b3ZhY193 b3JrZXJzIiwgUEdDX1BPU1RNQVNURVIsIFZBQ1VVTV9BVVRPVkFDVVVNLAorCQkJZ2V0dGV4dF9u b29wKCJTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXJhbGxlbCBhdXRvdmFjdXVtIHdvcmtl ciBwcm9jZXNzZXMgZHVyaW5nIHBhcmFsbGVsIGluZGV4IHZhY3V1bWluZyBvZiBzaW5nbGUgdGFi bGUuIiksCisJCQlOVUxMCisJCX0sCisJCSZtYXhfcGFyYWxsZWxfaW5kZXhfYXV0b3ZhY193b3Jr ZXJzLAorCQkwLCAwLCBNQVhfUEFSQUxMRUxfV09SS0VSX0xJTUlULAorCQlOVUxMLCBOVUxMLCBO VUxMCisJfSwKKworCXsKKwkJeyJhdXRvdmFjX2lkeF9wYXJhbGxlbF9taW5fcm93cyIsIFBHQ19Q T1NUTUFTVEVSLCBWQUNVVU1fQVVUT1ZBQ1VVTSwKKwkJCWdldHRleHRfbm9vcCgiU2V0cyB0aGUg bWluaW11bSBudW1iZXIgb2YgZGVhZCB0dXBsZXMgaW4gc2luZ2xlIHRhYmxlIHRoYXQgcmVxdWly ZXMgcGFyYWxsZWwgaW5kZXggcHJvY2Vzc2luZyBkdXJpbmcgYXV0b3ZhY3V1bS4iKSwKKwkJCU5V TEwKKwkJfSwKKwkJJmF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9yb3dzLAorCQkwLCAwLCBJTlQz Ml9NQVgsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAorCisJeworCQl7ImF1dG92YWNfaWR4X3Bh cmFsbGVsX21pbl9pbmRleGVzIiwgUEdDX1BPU1RNQVNURVIsIFZBQ1VVTV9BVVRPVkFDVVVNLAor CQkJZ2V0dGV4dF9ub29wKCJTZXRzIHRoZSBtaW5pbXVtIG51bWJlciBpbmRleGVzIGNyZWF0ZWQg b24gc2luZ2xlIHRhYmxlIHRoYXQgcmVxdWlyZXMgcGFyYWxsZWwgaW5kZXggcHJvY2Vzc2luZyBk dXJpbmcgYXV0b3ZhY3V1bS4iKSwKKwkJCU5VTEwKKwkJfSwKKwkJJmF1dG92YWNfaWR4X3BhcmFs bGVsX21pbl9pbmRleGVzLAorCQkyLCAyLCBJTlQzMl9NQVgsCisJCU5VTEwsIE5VTEwsIE5VTEwK Kwl9LAorCiAJewogCQl7InRjcF9rZWVwYWxpdmVzX2lkbGUiLCBQR0NfVVNFUlNFVCwgQ09OTl9B VVRIX1RDUCwKIAkJCWdldHRleHRfbm9vcCgiVGltZSBiZXR3ZWVuIGlzc3VpbmcgVENQIGtlZXBh bGl2ZXMuIiksCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwu Y29uZi5zYW1wbGUgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1w bGUKaW5kZXggMzQ4MjZkMDEzODAuLjA4ODY5Mzk4MDM5IDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKKysrIGIvc3JjL2JhY2tlbmQvdXRp bHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlCkBAIC0xNDYsNiArMTQ2LDEyIEBACiAjaGFz aF9tZW1fbXVsdGlwbGllciA9IDIuMAkJIyAxLTEwMDAuMCBtdWx0aXBsaWVyIG9uIGhhc2ggdGFi bGUgd29ya19tZW0KICNtYWludGVuYW5jZV93b3JrX21lbSA9IDY0TUIJCSMgbWluIDY0a0IKICNh dXRvdmFjdXVtX3dvcmtfbWVtID0gLTEJCSMgbWluIDY0a0IsIG9yIC0xIHRvIHVzZSBtYWludGVu YW5jZV93b3JrX21lbQorI21heF9wYXJhbGxlbF9pbmRleF9hdXRvdmFjX3dvcmtlcnMgPSAwICMg dGhpcyBmZWF0dXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKKwkJCQkJIyAoY2hhbmdlIHJlcXVpcmVz IHJlc3RhcnQpCisjYXV0b3ZhY19pZHhfcGFyYWxsZWxfbWluX3Jvd3MgPSAwCisJCQkJCSMgKGNo YW5nZSByZXF1aXJlcyByZXN0YXJ0KQorI2F1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9pbmRleGVz ID0gMgorCQkJCQkjIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKICNsb2dpY2FsX2RlY29kaW5n X3dvcmtfbWVtID0gNjRNQgkjIG1pbiA2NGtCCiAjbWF4X3N0YWNrX2RlcHRoID0gMk1CCQkJIyBt aW4gMTAwa0IKICNzaGFyZWRfbWVtb3J5X3R5cGUgPSBtbWFwCQkjIHRoZSBkZWZhdWx0IGlzIHRo ZSBmaXJzdCBvcHRpb24KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3Bvc3RtYXN0ZXIvYXV0b3Zh Y3V1bS5oIGIvc3JjL2luY2x1ZGUvcG9zdG1hc3Rlci9hdXRvdmFjdXVtLmgKaW5kZXggZTgxMzVm NDFhMWMuLjg2NDcxNTQ0MzdiIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9wb3N0bWFzdGVyL2F1 dG92YWN1dW0uaAorKysgYi9zcmMvaW5jbHVkZS9wb3N0bWFzdGVyL2F1dG92YWN1dW0uaApAQCAt MTUsNiArMTUsOCBAQAogI2RlZmluZSBBVVRPVkFDVVVNX0gKIAogI2luY2x1ZGUgInN0b3JhZ2Uv YmxvY2suaCIKKyNpbmNsdWRlICJzdG9yYWdlL2RzbV9pbXBsLmgiCisjaW5jbHVkZSAic3RvcmFn ZS9sb2NrLmgiCiAKIC8qCiAgKiBPdGhlciBwcm9jZXNzZXMgY2FuIHJlcXVlc3Qgc3BlY2lmaWMg d29yayBmcm9tIGF1dG92YWN1dW0sIGlkZW50aWZpZWQgYnkKQEAgLTI1LDEyICsyNywyNSBAQCB0 eXBlZGVmIGVudW0KIAlBVldfQlJJTlN1bW1hcml6ZVJhbmdlLAogfSBBdXRvVmFjdXVtV29ya0l0 ZW1UeXBlOwogCisvKgorICogTWFnaWMgbnVtYmVyIGZvciBwYXJhbGxlbCBjb250ZXh0IFRPQy4g VXNlZCBmb3IgcGFyYWxsZWwgaW5kZXggcHJvY2Vzc2luZworICogZHVyaW5nIGF1dG92YWN1dW0u CisgKi8KKyNkZWZpbmUgQVZfUEFSQUxMRUxfTUFHSUMJCQkJCQkweGFhYWFhYWFhCisKKy8qIE1h Z2ljIG51bWJlcnMgZm9yIHBlci1jb250ZXh0IHBhcmFsbGVsIGluZGV4IHByb2Nlc3Npbmcgc3Rh dGUgc2hhcmluZy4gKi8KKyNkZWZpbmUgQVZfUEFSQUxMRUxfS0VZX1RSQU5TQUNUSU9OX1NOQVBT SE9UCVVJTlQ2NENPTlNUKDB4RkZGMDAwMDAwMDAwMDAwMSkKKyNkZWZpbmUgQVZfUEFSQUxMRUxf S0VZX0FDVElWRV9TTkFQU0hPVAkJCVVJTlQ2NENPTlNUKDB4RkZGMDAwMDAwMDAwMDAwMikKKwog CiAvKiBHVUMgdmFyaWFibGVzICovCiBleHRlcm4gUEdETExJTVBPUlQgYm9vbCBhdXRvdmFjdXVt X3N0YXJ0X2RhZW1vbjsKIGV4dGVybiBQR0RMTElNUE9SVCBpbnQgYXV0b3ZhY3V1bV93b3JrZXJf c2xvdHM7CiBleHRlcm4gUEdETExJTVBPUlQgaW50IGF1dG92YWN1dW1fbWF4X3dvcmtlcnM7CiBl eHRlcm4gUEdETExJTVBPUlQgaW50IGF1dG92YWN1dW1fd29ya19tZW07CitleHRlcm4gUEdETExJ TVBPUlQgaW50IG1heF9wYXJhbGxlbF9pbmRleF9hdXRvdmFjX3dvcmtlcnM7CitleHRlcm4gUEdE TExJTVBPUlQgaW50IGF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9yb3dzOworZXh0ZXJuIFBHRExM SU1QT1JUIGludCBhdXRvdmFjX2lkeF9wYXJhbGxlbF9taW5faW5kZXhlczsKIGV4dGVybiBQR0RM TElNUE9SVCBpbnQgYXV0b3ZhY3V1bV9uYXB0aW1lOwogZXh0ZXJuIFBHRExMSU1QT1JUIGludCBh dXRvdmFjdXVtX3ZhY190aHJlc2g7CiBleHRlcm4gUEdETExJTVBPUlQgaW50IGF1dG92YWN1dW1f dmFjX21heF90aHJlc2g7CkBAIC02MCwxMCArNzUsMTggQEAgZXh0ZXJuIHZvaWQgQXV0b1ZhY1dv cmtlckZhaWxlZCh2b2lkKTsKIAogcGdfbm9yZXR1cm4gZXh0ZXJuIHZvaWQgQXV0b1ZhY0xhdW5j aGVyTWFpbihjb25zdCB2b2lkICpzdGFydHVwX2RhdGEsIHNpemVfdCBzdGFydHVwX2RhdGFfbGVu KTsKIHBnX25vcmV0dXJuIGV4dGVybiB2b2lkIEF1dG9WYWNXb3JrZXJNYWluKGNvbnN0IHZvaWQg KnN0YXJ0dXBfZGF0YSwgc2l6ZV90IHN0YXJ0dXBfZGF0YV9sZW4pOworLyogY2FsbGVkIGZyb20g YXV0b3ZhYyB3b3JrZXIgd2hlbiBpdCBuZWVkcyBwYXJ0aWNpcGFudHMgaW4gcGFyYWxsZWwgaW5k ZXggY2xlYW51cCAqLworZXh0ZXJuIGJvb2wgQXV0b1ZhY1BhcmFsbGVsV29ya1JlcXVlc3Qodm9p ZCk7CiAKIGV4dGVybiBib29sIEF1dG9WYWN1dW1SZXF1ZXN0V29yayhBdXRvVmFjdXVtV29ya0l0 ZW1UeXBlIHR5cGUsCiAJCQkJCQkJCSAgT2lkIHJlbGF0aW9uSWQsIEJsb2NrTnVtYmVyIGJsa25v KTsKIAorZXh0ZXJuIHZvaWQgQXV0b1ZhY3V1bVJlbGVhc2VQYXJhbGxlbFdvcmsoYm9vbCBrZWVw X2xvY2spOworZXh0ZXJuIGludCBBdXRvVmFjdXVtUGFyYWxsZWxXb3JrV2FpdEZvclN0YXJ0KHZv aWQpOworZXh0ZXJuIHZvaWQgUGFyYWxsZWxBdXRvdmFjdXVtRW5kU3luY1BvaW50KCBib29sIGtl ZXBfbG9jayk7CitleHRlcm4gaW50IEdldEF1dG9WYWN1dW1QYXJhbGxlbFdvcmtlck51bWJlcih2 b2lkKTsKK2V4dGVybiBpbnQgTGF1bmNoUGFyYWxsZWxBdXRvdmFjdXVtV29ya2VycyhPaWQgcmVs X2lkLCBpbnQgbndvcmtlcnNfdG9fbGF1bmNoLAorCQkJCQkJCQkJCSAgIGRzbV9oYW5kbGUgaGFu ZGxlKTsKIC8qIHNoYXJlZCBtZW1vcnkgc3R1ZmYgKi8KIGV4dGVybiBTaXplIEF1dG9WYWN1dW1T aG1lbVNpemUodm9pZCk7CiBleHRlcm4gdm9pZCBBdXRvVmFjdXVtU2htZW1Jbml0KHZvaWQpOwpk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9hdXRvdmFjdXVtLy5naXRpZ25vcmUgYi9zcmMv dGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uMGI1NDY0MWJjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVz dC9tb2R1bGVzL2F1dG92YWN1dW0vLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisvdG1wX2NoZWNr LwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVs ZXMvYXV0b3ZhY3V1bS9NYWtlZmlsZSBiL3NyYy90ZXN0L21vZHVsZXMvYXV0b3ZhY3V1bS9NYWtl ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOTBjMDBmZjM1MGIK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vTWFrZWZpbGUK QEAgLTAsMCArMSwxNCBAQAorIyBzcmMvdGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vTWFrZWZpbGUK KworVEFQX1RFU1RTID0gMQorCitpZmRlZiBVU0VfUEdYUworUEdfQ09ORklHID0gcGdfY29uZmln CitQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcpIC0tcGd4cykKK2luY2x1ZGUgJChQR1hTKQor ZWxzZQorc3ViZGlyID0gc3JjL3Rlc3QvbW9kdWxlcy9hdXRvdmFjdXVtCit0b3BfYnVpbGRkaXIg PSAuLi8uLi8uLi8uLgoraW5jbHVkZSAkKHRvcF9idWlsZGRpcikvc3JjL01ha2VmaWxlLmdsb2Jh bAoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbnRyaWIvY29udHJpYi1nbG9iYWwubWsKK2VuZGlm ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxl cy9hdXRvdmFjdXVtL3QvMDAxX2F1dG92YWNfcGFyYWxsZWwucGwgYi9zcmMvdGVzdC9tb2R1bGVz L2F1dG92YWN1dW0vdC8wMDFfYXV0b3ZhY19wYXJhbGxlbC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMC4uZmYwN2MzM2Q4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMv dGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vdC8wMDFfYXV0b3ZhY19wYXJhbGxlbC5wbApAQCAtMCww ICsxLDEzNyBAQAordXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOwordXNlIFBvc3RncmVTUUw6 OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6 TW9yZTsKKworbXkgJHBzcWxfb3V0OworCitteSAkbm9kZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNs dXN0ZXItPm5ldygnbm9kZTEnKTsKKyRub2RlLT5pbml0OworJG5vZGUtPmFwcGVuZF9jb25mKCdw b3N0Z3Jlc3FsLmNvbmYnLCBxcXsKKwlhdXRvdmFjdXVtID0gb2ZmCisJbWF4X3dhbF9zaXplID0g NDA5NgorfSk7Ciskbm9kZS0+c3RhcnQ7CisKK215ICRpbmRleGVzX251bSA9IDgwOworbXkgJGlu aXRpYWxfcm93c19udW0gPSAxXzAwMF8wMDA7CisKKyMgQ3JlYXRlIGJpZyB0YWJsZSBhbmQgY3Jl YXRlIHNwZWNpZmllZCBudW1iZXIgb2YgYi10cmVlIGluZGV4ZXMgb24gaXQKKyRub2RlLT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywgcXF7CisJQ1JFQVRFIFRBQkxFIHRlc3RfYXV0b3ZhYyAoCisJCWlk IFNFUklBTCBQUklNQVJZIEtFWSwKKwkJY29sXzEgSU5URUdFUiwgIGNvbF8yIElOVEVHRVIsICBj b2xfMyBJTlRFR0VSLCAgY29sXzQgSU5URUdFUiwgIGNvbF81IElOVEVHRVIsCisJCWNvbF82IElO VEVHRVIsICBjb2xfNyBJTlRFR0VSLCAgY29sXzggSU5URUdFUiwgIGNvbF85IElOVEVHRVIsICBj b2xfMTAgSU5URUdFUiwKKwkJY29sXzExIElOVEVHRVIsIGNvbF8xMiBJTlRFR0VSLCBjb2xfMTMg SU5URUdFUiwgY29sXzE0IElOVEVHRVIsIGNvbF8xNSBJTlRFR0VSLAorCQljb2xfMTYgSU5URUdF UiwgY29sXzE3IElOVEVHRVIsIGNvbF8xOCBJTlRFR0VSLCBjb2xfMTkgSU5URUdFUiwgY29sXzIw IElOVEVHRVIsCisJCWNvbF8yMSBJTlRFR0VSLCBjb2xfMjIgSU5URUdFUiwgY29sXzIzIElOVEVH RVIsIGNvbF8yNCBJTlRFR0VSLCBjb2xfMjUgSU5URUdFUiwKKwkJY29sXzI2IElOVEVHRVIsIGNv bF8yNyBJTlRFR0VSLCBjb2xfMjggSU5URUdFUiwgY29sXzI5IElOVEVHRVIsIGNvbF8zMCBJTlRF R0VSLAorCQljb2xfMzEgSU5URUdFUiwgY29sXzMyIElOVEVHRVIsIGNvbF8zMyBJTlRFR0VSLCBj b2xfMzQgSU5URUdFUiwgY29sXzM1IElOVEVHRVIsCisJCWNvbF8zNiBJTlRFR0VSLCBjb2xfMzcg SU5URUdFUiwgY29sXzM4IElOVEVHRVIsIGNvbF8zOSBJTlRFR0VSLCBjb2xfNDAgSU5URUdFUiwK KwkJY29sXzQxIElOVEVHRVIsIGNvbF80MiBJTlRFR0VSLCBjb2xfNDMgSU5URUdFUiwgY29sXzQ0 IElOVEVHRVIsIGNvbF80NSBJTlRFR0VSLAorCQljb2xfNDYgSU5URUdFUiwgY29sXzQ3IElOVEVH RVIsIGNvbF80OCBJTlRFR0VSLCBjb2xfNDkgSU5URUdFUiwgY29sXzUwIElOVEVHRVIsCisJCWNv bF81MSBJTlRFR0VSLCBjb2xfNTIgSU5URUdFUiwgY29sXzUzIElOVEVHRVIsIGNvbF81NCBJTlRF R0VSLCBjb2xfNTUgSU5URUdFUiwKKwkJY29sXzU2IElOVEVHRVIsIGNvbF81NyBJTlRFR0VSLCBj b2xfNTggSU5URUdFUiwgY29sXzU5IElOVEVHRVIsIGNvbF82MCBJTlRFR0VSLAorCQljb2xfNjEg SU5URUdFUiwgY29sXzYyIElOVEVHRVIsIGNvbF82MyBJTlRFR0VSLCBjb2xfNjQgSU5URUdFUiwg Y29sXzY1IElOVEVHRVIsCisJCWNvbF82NiBJTlRFR0VSLCBjb2xfNjcgSU5URUdFUiwgY29sXzY4 IElOVEVHRVIsIGNvbF82OSBJTlRFR0VSLCBjb2xfNzAgSU5URUdFUiwKKwkJY29sXzcxIElOVEVH RVIsIGNvbF83MiBJTlRFR0VSLCBjb2xfNzMgSU5URUdFUiwgY29sXzc0IElOVEVHRVIsIGNvbF83 NSBJTlRFR0VSLAorCQljb2xfNzYgSU5URUdFUiwgY29sXzc3IElOVEVHRVIsIGNvbF83OCBJTlRF R0VSLCBjb2xfNzkgSU5URUdFUiwgY29sXzgwIElOVEVHRVIsCisJCWNvbF84MSBJTlRFR0VSLCBj b2xfODIgSU5URUdFUiwgY29sXzgzIElOVEVHRVIsIGNvbF84NCBJTlRFR0VSLCBjb2xfODUgSU5U RUdFUiwKKwkJY29sXzg2IElOVEVHRVIsIGNvbF84NyBJTlRFR0VSLCBjb2xfODggSU5URUdFUiwg Y29sXzg5IElOVEVHRVIsIGNvbF85MCBJTlRFR0VSLAorCQljb2xfOTEgSU5URUdFUiwgY29sXzky IElOVEVHRVIsIGNvbF85MyBJTlRFR0VSLCBjb2xfOTQgSU5URUdFUiwgY29sXzk1IElOVEVHRVIs CisJCWNvbF85NiBJTlRFR0VSLCBjb2xfOTcgSU5URUdFUiwgY29sXzk4IElOVEVHRVIsIGNvbF85 OSBJTlRFR0VSLCBjb2xfMTAwIElOVEVHRVIKKwkpOworCisJRE8gXCRcJAorCURFQ0xBUkUKKwkJ aSBJTlRFR0VSOworCUJFR0lOCisJCUZPUiBpIElOIDEuLiRpbmRleGVzX251bSBMT09QCisJCQlF WEVDVVRFIGZvcm1hdCgnQ1JFQVRFIElOREVYIGlkeF9jb2xfXCVzIE9OIHRlc3RfYXV0b3ZhYyAo Y29sX1wlcyk7JywgaSwgaSk7CisJCUVORCBMT09QOworCUVORCBcJFwkOworfSk7CisKKyRub2Rl LT5wc3FsKCdwb3N0Z3JlcycsCisJIlNFTEVDVCBDT1VOVCgqKSBGUk9NIHBnX2luZGV4IGkKKwkg ICBKT0lOIHBnX2NsYXNzIGMgT04gYy5vaWQgPSBpLmluZHJlbGlkCisJICBXSEVSRSBjLnJlbG5h bWUgPSAndGVzdF9hdXRvdmFjJzsiLAorCXN0ZG91dCA9PiBcJHBzcWxfb3V0CispOworaXMoJHBz cWxfb3V0LCAkaW5kZXhlc19udW0gKyAxLCAiQWxsIGluZGV4ZXMgY3JlYXRlZCBzdWNjZXNzZnVs bHkiKTsKKworJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxcXsKKwlETyBcJFwkCisJREVD TEFSRQorCSAgICBpIElOVEVHRVI7CisJQkVHSU4KKwkgICAgRk9SIGkgSU4gMS4uJGluaXRpYWxf cm93c19udW0gTE9PUAorCSAgICAgICAgSU5TRVJUIElOVE8gdGVzdF9hdXRvdmFjICgKKwkgICAg ICAgICAgICBjb2xfMSwgY29sXzIsIGNvbF8zLCBjb2xfNCwgY29sXzUsIGNvbF82LCBjb2xfNywg Y29sXzgsIGNvbF85LCBjb2xfMTAsCisJICAgICAgICAgICAgY29sXzExLCBjb2xfMTIsIGNvbF8x MywgY29sXzE0LCBjb2xfMTUsIGNvbF8xNiwgY29sXzE3LCBjb2xfMTgsIGNvbF8xOSwgY29sXzIw LAorCSAgICAgICAgICAgIGNvbF8yMSwgY29sXzIyLCBjb2xfMjMsIGNvbF8yNCwgY29sXzI1LCBj b2xfMjYsIGNvbF8yNywgY29sXzI4LCBjb2xfMjksIGNvbF8zMCwKKwkgICAgICAgICAgICBjb2xf MzEsIGNvbF8zMiwgY29sXzMzLCBjb2xfMzQsIGNvbF8zNSwgY29sXzM2LCBjb2xfMzcsIGNvbF8z OCwgY29sXzM5LCBjb2xfNDAsCisJICAgICAgICAgICAgY29sXzQxLCBjb2xfNDIsIGNvbF80Mywg Y29sXzQ0LCBjb2xfNDUsIGNvbF80NiwgY29sXzQ3LCBjb2xfNDgsIGNvbF80OSwgY29sXzUwLAor CSAgICAgICAgICAgIGNvbF81MSwgY29sXzUyLCBjb2xfNTMsIGNvbF81NCwgY29sXzU1LCBjb2xf NTYsIGNvbF81NywgY29sXzU4LCBjb2xfNTksIGNvbF82MCwKKwkgICAgICAgICAgICBjb2xfNjEs IGNvbF82MiwgY29sXzYzLCBjb2xfNjQsIGNvbF82NSwgY29sXzY2LCBjb2xfNjcsIGNvbF82OCwg Y29sXzY5LCBjb2xfNzAsCisJICAgICAgICAgICAgY29sXzcxLCBjb2xfNzIsIGNvbF83MywgY29s Xzc0LCBjb2xfNzUsIGNvbF83NiwgY29sXzc3LCBjb2xfNzgsIGNvbF83OSwgY29sXzgwLAorCSAg ICAgICAgICAgIGNvbF84MSwgY29sXzgyLCBjb2xfODMsIGNvbF84NCwgY29sXzg1LCBjb2xfODYs IGNvbF84NywgY29sXzg4LCBjb2xfODksIGNvbF85MCwKKwkgICAgICAgICAgICBjb2xfOTEsIGNv bF85MiwgY29sXzkzLCBjb2xfOTQsIGNvbF85NSwgY29sXzk2LCBjb2xfOTcsIGNvbF85OCwgY29s Xzk5LCBjb2xfMTAwCisJICAgICAgICApIFZBTFVFUyAoCisJICAgICAgICAgICAgaSwgaSArIDEs IGkgKyAyLCBpICsgMywgaSArIDQsIGkgKyA1LCBpICsgNiwgaSArIDcsIGkgKyA4LCBpICsgOSwK KwkgICAgICAgICAgICBpICsgMTAsIGkgKyAxMSwgaSArIDEyLCBpICsgMTMsIGkgKyAxNCwgaSAr IDE1LCBpICsgMTYsIGkgKyAxNywgaSArIDE4LCBpICsgMTksCisJICAgICAgICAgICAgaSArIDIw LCBpICsgMjEsIGkgKyAyMiwgaSArIDIzLCBpICsgMjQsIGkgKyAyNSwgaSArIDI2LCBpICsgMjcs IGkgKyAyOCwgaSArIDI5LAorCSAgICAgICAgICAgIGkgKyAzMCwgaSArIDMxLCBpICsgMzIsIGkg KyAzMywgaSArIDM0LCBpICsgMzUsIGkgKyAzNiwgaSArIDM3LCBpICsgMzgsIGkgKyAzOSwKKwkg ICAgICAgICAgICBpICsgNDAsIGkgKyA0MSwgaSArIDQyLCBpICsgNDMsIGkgKyA0NCwgaSArIDQ1 LCBpICsgNDYsIGkgKyA0NywgaSArIDQ4LCBpICsgNDksCisJICAgICAgICAgICAgaSArIDUwLCBp ICsgNTEsIGkgKyA1MiwgaSArIDUzLCBpICsgNTQsIGkgKyA1NSwgaSArIDU2LCBpICsgNTcsIGkg KyA1OCwgaSArIDU5LAorCSAgICAgICAgICAgIGkgKyA2MCwgaSArIDYxLCBpICsgNjIsIGkgKyA2 MywgaSArIDY0LCBpICsgNjUsIGkgKyA2NiwgaSArIDY3LCBpICsgNjgsIGkgKyA2OSwKKwkgICAg ICAgICAgICBpICsgNzAsIGkgKyA3MSwgaSArIDcyLCBpICsgNzMsIGkgKyA3NCwgaSArIDc1LCBp ICsgNzYsIGkgKyA3NywgaSArIDc4LCBpICsgNzksCisJICAgICAgICAgICAgaSArIDgwLCBpICsg ODEsIGkgKyA4MiwgaSArIDgzLCBpICsgODQsIGkgKyA4NSwgaSArIDg2LCBpICsgODcsIGkgKyA4 OCwgaSArIDg5LAorCSAgICAgICAgICAgIGkgKyA5MCwgaSArIDkxLCBpICsgOTIsIGkgKyA5Mywg aSArIDk0LCBpICsgOTUsIGkgKyA5NiwgaSArIDk3LCBpICsgOTgsIGkgKyA5OQorCSAgICAgICAg KTsKKwkgICAgRU5EIExPT1A7CisJRU5EIFwkXCQ7Cit9KTsKKworJG5vZGUtPnBzcWwoJ3Bvc3Rn cmVzJywKKwkiU0VMRUNUIENPVU5UKCopIEZST00gdGVzdF9hdXRvdmFjOyIsCisJc3Rkb3V0ID0+ IFwkcHNxbF9vdXQKKyk7CitpcygkcHNxbF9vdXQsICRpbml0aWFsX3Jvd3NfbnVtLCAiQWxsIGRh dGEgaW5zZXJ0ZWQgaW50byB0YWJsZSBzdWNjZXNzZnVsbHkiKTsKKworJG5vZGUtPnNhZmVfcHNx bCgncG9zdGdyZXMnLCBxcXsKKwlVUERBVEUgdGVzdF9hdXRvdmFjIFNFVCBjb2xfMSA9IDAgV0hF UkUgKGNvbF8xICUgMykgPSAwOworCUFOQUxZWkUgdGVzdF9hdXRvdmFjOworfSk7CisKK215ICRk ZWFkX3R1cGxlc190aHJlc2ggPSAkaW5pdGlhbF9yb3dzX251bSAvIDQ7CitteSAkaW5kZXhlc19u dW1fdGhyZXNoID0gJGluZGV4ZXNfbnVtIC8gMjsKK215ICRudW1fd29ya2VycyA9IDM7CisKKyMg UmVkdWNlIGF1dG92YWN1dW1fd29ya19tZW0sIHNvIGxlYWRlciBwcm9jZXNzIHdpbGwgcGVyZm9y bSBwYXJhbGxlbCBpbmRleGkKKyMgdmFjdXVtIHBoYXNlIHNldmVyYWwgdGltZXMKKyRub2RlLT5h cHBlbmRfY29uZigncG9zdGdyZXNxbC5jb25mJywgcXF7CisJYXV0b3ZhY3V1bV9uYXB0aW1lID0g JzFzJworCWF1dG92YWN1dW1fd29ya19tZW0gPSAyMDQ4CisJYXV0b3ZhY3V1bV92YWN1dW1fdGhy ZXNob2xkID0gMQorCWF1dG92YWN1dW1fYW5hbHl6ZV90aHJlc2hvbGQgPSAxCisJYXV0b3ZhY3V1 bV92YWN1dW1fc2NhbGVfZmFjdG9yID0gMC4xCisJYXV0b3ZhY3V1bV9hbmFseXplX3NjYWxlX2Zh Y3RvciA9IDAuMQorCWF1dG92YWN1dW1fbWF4X3dvcmtlcnMgPSAxMAorCWF1dG92YWN1dW0gPSBv bgorCWF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9yb3dzID0gJGRlYWRfdHVwbGVzX3RocmVzaAor CWF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9pbmRleGVzID0gJGluZGV4ZXNfbnVtX3RocmVzaAor CW1heF9wYXJhbGxlbF9pbmRleF9hdXRvdmFjX3dvcmtlcnMgPSAkbnVtX3dvcmtlcnMKK30pOwor Ciskbm9kZS0+cmVzdGFydDsKKworIyB3YWl0IGZvciBhdXRvdmFjdXVtIHRvIHJlc2V0IGRhdGZy b3plbnhpZCBhZ2UgdG8gMAorJG5vZGUtPnBvbGxfcXVlcnlfdW50aWwoJ3Bvc3RncmVzJywgcXsK KwlTRUxFQ1QgY291bnQoKikgPSAwIEZST00gcGdfZGF0YWJhc2UgV0hFUkUgbXhpZF9hZ2UoZGF0 ZnJvemVueGlkKSA+IDAKK30pIG9yIGRpZSAiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGF1 dG92YWN1dW0iOworCitvaygxLCAiVGhlcmUgYXJlIG5vIHNlZ2ZhdWx0cyIpOworCiskbm9kZS0+ c3RvcDsKK2RvbmVfdGVzdGluZygpOwotLSAKMi40My4wCgo= --000000000000a7182806342b9e82--