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.96) (envelope-from ) id 1wDYXE-0036KH-2e for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 02:02:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wDYXD-007Y0x-0c for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 02:02:19 +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.96) (envelope-from ) id 1wDYXC-007Xzm-2G for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 02:02:18 +0000 Received: from mail-lf1-x135.google.com ([2a00:1450:4864:20::135]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wDYXA-00000001X3O-0SiS for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 02:02:18 +0000 Received: by mail-lf1-x135.google.com with SMTP id 2adb3069b0e04-5a2c9c5ff87so200360e87.0 for ; Thu, 16 Apr 2026 19:02:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776391335; cv=none; d=google.com; s=arc-20240605; b=MH7HKOGLjgnXcilZotzAIytzPmNTCN8cw+GDUi72jrwDFYv0sEkILTJRco+UTq74/G 34mzfLRnsUqq0Rdd4WOp63RT51RTpWLnG68osqzaPw7LKznEVl5HuY0y4OzK0PwNRjob mCqzPBxRrMRMFr6IKLe0zEjY91ngsdztCFjRhQ8u5U2fn/7eX6tzp39qbNSztk6TEmXV FZzDkGUYpqnwehnqwMMfp5YIhO4TOD8BtZ7ykshlSIFbqCl+IlNvSGzqukKwTzmGj31A xl/U8Mv2Vas0Cr8KQ3AJdxbpbtKE0do/ozXX0OH5Y+lZJajhbrbFyCCQU3SwLZ0daK3P 56Uw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=PVSyemsD7xcjm1+hgbVtOdsA4fRUNt9s9b26/jcQz2g=; fh=YSFWSBCECC1PHsRx3wgoOXPoi5xPiND8VSEsN+gRmOc=; b=ZTiqXbSmtiXGU8B6F3Wny6DcVZu52rX6Cn/hT6qLg//R2Ipqly49rUBAjy76zFYKzH 6CnH3a91gWmAxkap6vx2op1wkN8xH5eCjEM5Z6WJWHFTYNOUszi6CWHfBrPlErri0H/r O+xVJb+CrvprKhneS4hBhIaUlKfxWzE/q6R67ls8LfyGlWu9oPucvFGklm0RIVIyacCn +ZtVH5LahIozye+aLdLZLHXC3aFs2BbsOdnNfZJ4seMxljteUPzcOUZvDASm78p9KTEm k2cw8tpq9bMSunQPUomoOgAi3hQLqAUXTu5Eea/olzYUHH5EJ1b0CV7ott+RX+SNe2xT z5HA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776391335; x=1776996135; 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=PVSyemsD7xcjm1+hgbVtOdsA4fRUNt9s9b26/jcQz2g=; b=qo2yre9Rs0d7UKfk0v0N54Xmr9rUqbCc25t/FlmVfyRtM/3i7lB8MxHYNExyPDaAQp 1G+ElAH0HqhtcC+YXaxXyzE3ODZIO3txa1MOdbm7YCbVSyZd6kR8c7pOZJfnTUjEc+Et JYjwtrysvGU88glewZ3SGo2hGoIWmUaXQ5aaCjIjLyp9+GR+7boqQ2rzotbQCKLiaV8L PigIOKC4p6mr99jrnX1SBoB4gIw3lmr7ao+wViG50S2HHqr3wA5wgULH7nS/SNu8kbRf FZs8Z0OsEks695ecpgqNk3DM2TYr3EItQNb+T6Caq4AudnQXph4Kd6F1Nj+u9jUL8QtO cuSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776391335; x=1776996135; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=PVSyemsD7xcjm1+hgbVtOdsA4fRUNt9s9b26/jcQz2g=; b=kK+pHENfE+w+Rt1CTMez40HG67JdpxxgdP8WvXmtI48ryvruVr5t7mCbOb3+t5RQ4A DYt0PysD2LN8lB3ZzBAIEgUaP3VguuFhCNuA/e74o3y5XXahNOE9BgzdnoBtqbBvvEqE FeZWE9Bu8NK2x6fiRiELtb48yqGWo7zNUIKxJZVW9T55jDTXJBvqvCpGrMGPp0e0DR4c G/yWror9RgbW75ACdbpR8IHiAA6Q5okSXwgyPq7m4HILciMFQokotyTJWONnWNKwem4R KFbFlEI5biW1xhMmdY4zaf23wcoLciRpaXbNNq+EUb+FiYckModiNiMAs08dn4B1U9qL ubPQ== X-Forwarded-Encrypted: i=1; AFNElJ/RAIQoGzwrJp0cMc3MjXGm1pa46wrowoPJBG/KvFb8QSrrx7I2u1hCaefMwWTAc4LBdQ58og4XMkIWiiuF@lists.postgresql.org X-Gm-Message-State: AOJu0YwuHhwEj07JJgu1lSiOVxdkUNAl1HNuiVZo410igk4zj69tXStp jOuX3up2nDi+6op66gz3a2tec5a8rtic5XLW9Ykpr6OKCwPG/qjQ4imz0noKti09/AMB6vdENPn /q8wiolCeesLlUUOQR+9ShQCBrS9XWyg= X-Gm-Gg: AeBDieuJwWRv+TbTVy+/ETEGsBSouosDqvwSFXGFtztyKO5Wv/rLJ0ScmeLPwPzBXOP 5BiI0Iv/rx0bVulu+m16KEO6kwWx5ALk/el8nKHrXCwN+Nclt8KhMXBGgXcE4v/nuzlQ0ZLSW1h QHJs5qaUy3UpPcuZX8LLN1MNuibAZLVuXv7xbFBYfEeojXFbF6c/NPgPSBUA/qNX6ki0XitBvcw EWyPS6f31P24jidR3yiXv/fYxasdIrg9l0hCUHXyJcnEX6rVe8NKAcLhO2HNpdEw4zWxe5kk3iW Ck1dKUki5wsclK4/Vd7QWVX6Q2pXsTpIWauHynMpuwPHikMk6+w0L6oyIBhWw5wRaVKNv7QLg42 zm9yH7lRJmXqSYQ== X-Received: by 2002:a05:6512:12c6:b0:5a2:ad98:3685 with SMTP id 2adb3069b0e04-5a4172e7b68mr185100e87.35.1776391334304; Thu, 16 Apr 2026 19:02:14 -0700 (PDT) MIME-Version: 1.0 References: <9539.1775724194@localhost> <112208.1776173876@localhost> <25514.1776264611@localhost> <38385.1776277704@localhost> In-Reply-To: From: Mihail Nikalayeu Date: Fri, 17 Apr 2026 04:01:00 +0200 X-Gm-Features: AQROBzAI93tockE_jJK4vgD7b9OMq9aFa2vMi-8h-YZr7MsVJUwg-zqbIalyJLE Message-ID: Subject: Re: Adding REPACK [concurrently] To: Antonin Houska Cc: Andres Freund , Amit Kapila , Alvaro Herrera , Srinath Reddy Sadipiralla , Matthias van de Meent , Pg Hackers , Robert Treat Content-Type: multipart/mixed; boundary="00000000000076b1a7064f9e565b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000076b1a7064f9e565b Content-Type: text/plain; charset="UTF-8" Hello! I think I got working POC for deadlock-detector enhancements for REPACK (and potentially other). Each PGPROC gets one FutureWaitLock slot: a (locktag, mode) pair, which is empty when locktag_lockmethodid == 0. A backend calls LockDeclareFutureWait() to publish its intent. Only REPACK (CONCURRENTLY) uses it today, declaring its future AccessExclusiveLock. Only the owning backend writes its slot; it does so under the partition lock covering the declared tag. Remote readers (the deadlock detector) must hold that partition lock to observe it. The detector holds all partition locks during its graph walk, so it can read any slot safely. The slot clears in LockAcquireExtended() at the exact point the backend attaches its waitLink for the same tag and mode. It is also cleared on abort, backend exit, and end of transaction. FindLockCycleRecurseFuture() treats the declared future lock as a hard edge to (a) current holders whose mode conflicts and (b) already-queued waiters that JoinWaitQueue() would place ahead of the future request. Weak relation locks are kept in per-backend fast-path arrays and remain invisible to the detector's graph walk. Normally LockAcquireExtended() migrates them to the main lock table when a conflicting strong lock is requested. This action is gated by FastPathStrongRelationLocks->count to prevent new fast-path lock processing. A future-wait declaration does not trigger that migration due to performance considerations. Instead CheckDeadLock() now snapshots currently declared fast-path-incompatible future waits and increments FastPathStrongRelationLocks->count for those tags (blocking new fast-path acquisitions). It then calls FastPathTransferRelationLocks() for each such tag to move existing holders into the main table, making everything visible to the deadlock walker. Once the deadlock checker finishes, FastPathStrongRelationLocks->count is decremented enabling fast-path processing again. Performance degradation occurs only during deadlock processing and only if REPACK is active. If a deadlock contains a "future" edge it is reported as "future deadlock detected". Repack first declares future AE and only then proceeds to actually get SUE. Added test cases for different scenarios, including SUE from another backend and a 3-backend deadlock. --00000000000076b1a7064f9e565b Content-Type: application/octet-stream; name="nocfbot-v2-0001-Detect-deadlocks-involving-declared-future-lock-r.patch" Content-Disposition: attachment; filename="nocfbot-v2-0001-Detect-deadlocks-involving-declared-future-lock-r.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo27cjyw0 RnJvbSA3ZTA1MmE1ZjNhYWZhM2E5Y2ExZDdmYzg2NmM1OTcwMDEyNTFiY2MyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNaWtoYWlsIE5pa2FsYXlldSA8bWloYWlsbmlrYWxheWV1QGdt YWlsLmNvbT4KRGF0ZTogRnJpLCAxNyBBcHIgMjAyNiAwMjowOTo0MCArMDIwMApTdWJqZWN0OiBb UEFUQ0ggdjJdIERldGVjdCBkZWFkbG9ja3MgaW52b2x2aW5nIGRlY2xhcmVkIGZ1dHVyZSBsb2Nr IHJlcXVlc3RzCgpJbnRyb2R1Y2UgYSBtZWNoYW5pc20gZm9yIGEgYmFja2VuZCB0byBkZWNsYXJl IGl0cyBpbnRlbnQgdG8gYWNxdWlyZSBhCmxvY2sgYXQgYSBmdXR1cmUgcG9pbnQsIGJlZm9yZSBh Y3R1YWxseSBjYWxsaW5nIExvY2tBY3F1aXJlKCkuICBUaGUKZGVhZGxvY2sgZGV0ZWN0b3IgdHJl YXRzIGVhY2ggZGVjbGFyYXRpb24gYXMgYSBoYXJkIHdhaXRzLWZvciBlZGdlIGZyb20KdGhlIGRl Y2xhcmVyIHRvIGN1cnJlbnQgaG9sZGVycyB3aG9zZSBtb2RlIGNvbmZsaWN0cywgYW5kIHRvIGFs cmVhZHktCnF1ZXVlZCB3YWl0ZXJzIHdob3NlIHJlcXVlc3RzIHdvdWxkIGJlIG9yZGVyZWQgYmVm b3JlIHRoZSBmdXR1cmUKcmVxdWVzdC4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gZGV0ZWN0 IGN5Y2xlcyB0aGF0IHRoZSBleGlzdGluZwpkZXRlY3RvciBjYW5ub3Qgc2VlLCBiZWNhdXNlIHRo ZSBkZWNsYXJlciBoYXMgbm90IHlldCBxdWV1ZWQgZm9yIGl0cwpzdHJvbmdlciBsb2NrLgoKVGhl IG1vdGl2YXRpbmcgY2FsbGVyIGlzIFJFUEFDSyAoQ09OQ1VSUkVOVExZKSwgd2hpY2ggaG9sZHMg YQpTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2sgdGhyb3VnaG91dCBhbmQgbGF0ZXIgbmVlZHMgQWNj ZXNzRXhjbHVzaXZlTG9jawp0byBzd2FwIHJlbGZpbGVub2Rlcy4gIEEgY29uY3VycmVudCBiYWNr ZW5kIHRoYXQgdGFrZXMgYW4gaW50ZXJtZWRpYXRlCmxvY2sgYW5kIHdhaXRzIGZvciBSRVBBQ0sg dG8gZmluaXNoIGNhbiBmb3JtIGEgY3ljbGUgdGhhdCB0b2RheSBpcwppbnZpc2libGUgdW50aWwg UkVQQUNLIGZpbmFsbHkgcmVxdWVzdHMgaXRzIHN0cm9uZyBsb2NrLiAgRGVjbGFyaW5nIHRoZQpm dXR1cmUgQWNjZXNzRXhjbHVzaXZlTG9jayBmcm9tIFJhbmdlVmFyQ2FsbGJhY2tGb3JSZXBhY2sg c3VyZmFjZXMgdGhlCmVkZ2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGluaXRpYWwgbG9va3VwLgoK SW1wbGVtZW50YXRpb24gbm90ZXM6CgoqIFBHUFJPQyBnYWlucyBhIHNpbmdsZSBGdXR1cmVXYWl0 TG9jayBzbG90IChsb2NrdGFnICsgbW9kZSkuICBPbmx5IHRoZQpvd25pbmcgcHJvYyB3cml0ZXMg aXQ7IHJlbW90ZSByZWFkZXJzIG11c3QgaG9sZCB0aGUgcGFydGl0aW9uIGxvY2sKY292ZXJpbmcg dGhlIHRhZy4gIFRoZSBpbnZhcmlhbnQgInNsb3Qgc2V0IGltcGxpZXMgbm90IHlldCByZWFsbHkK d2FpdGluZyBmb3IgdGhhdCAodGFnLCBtb2RlKSIgaXMgbWFpbnRhaW5lZCBieSBjbGVhcmluZyB0 aGUgc2xvdAppbnNpZGUgTG9ja0FjcXVpcmVFeHRlbmRlZCgpIGF0IHRoZSBwb2ludCB0aGUgcHJv YyBhdHRhY2hlcyBpdHMKd2FpdExpbmsgZm9yIHRoYXQgc2FtZSByZXF1ZXN0LiAgSW5pdFByb2Nl c3MsIFByb2NLaWxsLApMb2NrRXJyb3JDbGVhbnVwLCBhbmQgTG9ja1JlbGVhc2VBbGwgYWxzbyBj bGVhciB0aGUgc2xvdC4KCiogRmFzdC1wYXRoIGhvbGRlcnMgb2YgcmVsYXRpb24gbG9ja3MgYXJl IGludmlzaWJsZSB0byB0aGUgZGVhZGxvY2sKZGV0ZWN0b3IsIHNvIENoZWNrRGVhZExvY2soKSBu b3cgc25hcHNob3RzIHRoZSBjdXJyZW50bHkgZGVjbGFyZWQKZmFzdC1wYXRoLXJlbGV2YW50IGZ1 dHVyZSB3YWl0cywgYnVtcHMgRmFzdFBhdGhTdHJvbmdSZWxhdGlvbkxvY2tzCmNvdW50ZXJzIGZv ciB0aG9zZSB0YWdzLCBhbmQgdHJhbnNmZXJzIGV4aXN0aW5nIGZhc3QtcGF0aCBob2xkZXJzCmlu dG8gdGhlIG1haW4gbG9jayB0YWJsZSBiZWZvcmUgd2Fsa2luZyB0aGUgd2FpdHMtZm9yIGdyYXBo LiAgQQpzaGFyZWQgYXRvbWljIGNvdW50IGxldHMgdGhlIGNvbW1vbiBjYXNlIChubyBhY3RpdmUg ZGVjbGFyYXRpb25zKQpza2lwIHRoaXMgd29yayBlbnRpcmVseS4gIElmIGEgbmV3IGZhc3QtcGF0 aC1yZWxldmFudCBkZWNsYXJhdGlvbgphcHBlYXJzIGJldHdlZW4gdGhlIHNuYXBzaG90IGFuZCB0 aGUgcGFydGl0aW9uLWxvY2tlZCB3YWxrLCB0aGUKY2hlY2sgcmVzdGFydHMgd2l0aCBhIGZyZXNo IHNuYXBzaG90LgoKKiBGaW5kTG9ja0N5Y2xlUmVjdXJzZUZ1dHVyZSgpIGZvbGxvd3MgdGhlIGRl Y2xhcmVkIGVkZ2UgdG8gY3VycmVudApob2xkZXJzIGFuZCB0byBlYXJsaWVyIHF1ZXVlZCB3YWl0 ZXJzIHRoYXQgSm9pbldhaXRRdWV1ZSgpIHdvdWxkCnBsYWNlIGFoZWFkIG9mIHRoZSBmdXR1cmUg cmVxdWVzdC4gIFRoZXNlIGVkZ2VzIGFyZSBub3QgcmVjb3JkZWQgYXMKc29mdCBlZGdlczogdGhl IGRlY2xhcmVyIGlzIG5vdCBpbiB0aGUgd2FpdCBxdWV1ZSwgc28gcmVvcmRlcmluZwpjYW5ub3Qg YnJlYWsgc3VjaCBhIGN5Y2xlLgoKKiBEZWFkTG9ja1JlcG9ydCgpIGVtaXRzICJmdXR1cmUgZGVh ZGxvY2sgZGV0ZWN0ZWQiIGFuZCBhCiJ3aWxsIHJlcXVlc3QgLi4uIChkZWNsYXJlZCBmdXR1cmUg aW50ZW50KSIgZGV0YWlsIGxpbmUgd2hlbiB0aGUKY3ljbGUgaW52b2x2ZXMgYSBkZWNsYXJlZCBl ZGdlLiAgU1FMU1RBVEUgcmVtYWlucwpFUlJDT0RFX1RfUl9ERUFETE9DS19ERVRFQ1RFRC4KCk5l dyBpc29sYXRpb24gcGVybXV0YXRpb25zIHVuZGVyIHNyYy90ZXN0L21vZHVsZXMvaW5qZWN0aW9u X3BvaW50cwpjb3ZlciB0aGUgbm8tZGVhZGxvY2sgY2FzZSAod2FpdGVyIHdpdGggbm8gY29uZmxp Y3RpbmcgaGVsZCBsb2NrKSwKdHdvIHR3by1iYWNrZW5kIGZ1dHVyZS1kZWFkbG9jayBjeWNsZXMg KGhlbGQgQWNjZXNzU2hhcmUgKyBmdXR1cmUKQWNjZXNzRXhjbHVzaXZlIC8gU2hhcmVVcGRhdGVF eGNsdXNpdmUpLCBhbmQgYSB0aHJlZS1iYWNrZW5kIGN5Y2xlCnRocm91Z2ggYW4gdW5yZWxhdGVk IHRhYmxlLgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL3JlcGFjay5jICAgICAgICAgICAgICAg ICB8ICAgNCArLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMgICAgICAgICAgICAg IHwgIDMzICsrCiBzcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvZGVhZGxvY2suYyAgICAgICAgICAg fCAxOTUgKysrKysrKystCiBzcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvbG9jay5jICAgICAgICAg ICAgICAgfCA0MTAgKysrKysrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3Iv cHJvYy5jICAgICAgICAgICAgICAgfCAgMzYgKysKIHNyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxl Y21kcy5oICAgICAgICAgICAgICB8ICAgMyArCiBzcmMvaW5jbHVkZS9zdG9yYWdlL2xtZ3IuaCAg ICAgICAgICAgICAgICAgICAgfCAgIDIgKwogc3JjL2luY2x1ZGUvc3RvcmFnZS9sb2NrLmggICAg ICAgICAgICAgICAgICAgIHwgIDMzICsrCiBzcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2MuaCAgICAg ICAgICAgICAgICAgICAgfCAgIDkgKwogLi4uL2luamVjdGlvbl9wb2ludHMvZXhwZWN0ZWQvcmVw YWNrLm91dCAgICAgIHwgMTgxICsrKysrKystCiAuLi4vaW5qZWN0aW9uX3BvaW50cy9zcGVjcy9y ZXBhY2suc3BlYyAgICAgICAgfCAxMTggKysrKysKIDExIGZpbGVzIGNoYW5nZWQsIDEwMTggaW5z ZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21t YW5kcy9yZXBhY2suYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3JlcGFjay5jCmluZGV4IDU4ZTM4 NjcyNDZmLi44MjYxYzU4ZGFjYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvcmVw YWNrLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvcmVwYWNrLmMKQEAgLTIzMjYsOCArMjMy Niw4IEBAIHByb2Nlc3Nfc2luZ2xlX3JlbGF0aW9uKFJlcGFja1N0bXQgKnN0bXQsIExPQ0tNT0RF IGxvY2ttb2RlLCBib29sIGlzVG9wTGV2ZWwsCiAJdGFibGVPaWQgPSBSYW5nZVZhckdldFJlbGlk RXh0ZW5kZWQoc3RtdC0+cmVsYXRpb24tPnJlbGF0aW9uLAogCQkJCQkJCQkJCWxvY2ttb2RlLAog CQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJUmFuZ2VWYXJDYWxsYmFja01haW50YWluc1RhYmxlLAot CQkJCQkJCQkJCU5VTEwpOworCQkJCQkJCQkJCVJhbmdlVmFyQ2FsbGJhY2tGb3JSZXBhY2ssCisJ CQkJCQkJCQkJcGFyYW1zKTsKIAlyZWwgPSB0YWJsZV9vcGVuKHRhYmxlT2lkLCBOb0xvY2spOwog CiAJLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jIGIvc3Jj L2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKaW5kZXggZWVjMDliYTFkZWQuLmIwOGY1NzAx N2UzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYworKysgYi9z cmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwpAQCAtMTk3NjEsNiArMTk3NjEsMzkgQEAg UmFuZ2VWYXJDYWxsYmFja01haW50YWluc1RhYmxlKGNvbnN0IFJhbmdlVmFyICpyZWxhdGlvbiwK IAkJCQkJICAgcmVsYXRpb24tPnJlbG5hbWUpOwogfQogCisvKgorICogQ2FsbGJhY2sgdG8gUmFu Z2VWYXJHZXRSZWxpZEV4dGVuZGVkKCkgZm9yIFJFUEFDSy4gIEZvciBjb25jdXJyZW50IHJlcGFj aywKKyAqIGRlY2xhcmUgdGhlIGZ1dHVyZSBBY2Nlc3NFeGNsdXNpdmVMb2NrIGJlZm9yZSB0aGUg Y2FsbGVyIGxvY2tzIHRoZSB0YWJsZQorICogd2l0aCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2ss IHNvIGRlYWRsb2NrIGNoZWNrcyBjYW4gc2VlIHRoZSBwZW5kaW5nCisgKiByZXF1ZXN0IHdoaWxl IHRoZSB3ZWFrZXIgbG9jayBpcyBoZWxkIG9yIGF3YWl0ZWQuCisgKi8KK3ZvaWQKK1JhbmdlVmFy Q2FsbGJhY2tGb3JSZXBhY2soY29uc3QgUmFuZ2VWYXIgKnJlbGF0aW9uLAorCQkJCQkJICBPaWQg cmVsSWQsIE9pZCBvbGRSZWxJZCwgdm9pZCAqYXJnKQoreworCUNsdXN0ZXJQYXJhbXMgKnBhcmFt cyA9IGFyZzsKKwlMT0NLVEFHCQlsb2NrdGFnOworCU9pZAkJCWRiaWQ7CisKKwlSYW5nZVZhckNh bGxiYWNrTWFpbnRhaW5zVGFibGUocmVsYXRpb24sIHJlbElkLCBvbGRSZWxJZCwgTlVMTCk7CisK KwlpZiAoKHBhcmFtcy0+b3B0aW9ucyAmIENMVU9QVF9DT05DVVJSRU5UKSA9PSAwKQorCQlyZXR1 cm47CisKKwlpZiAocmVsSWQgPT0gb2xkUmVsSWQpCisJCXJldHVybjsKKworCWlmIChPaWRJc1Zh bGlkKG9sZFJlbElkKSkKKwkJTG9ja0NsZWFyRnV0dXJlV2FpdFNsb3QoZmFsc2UpOworCisJaWYg KCFPaWRJc1ZhbGlkKHJlbElkKSkKKwkJcmV0dXJuOworCisJZGJpZCA9IElzU2hhcmVkUmVsYXRp b24ocmVsSWQpID8gSW52YWxpZE9pZCA6IE15RGF0YWJhc2VJZDsKKwlTRVRfTE9DS1RBR19SRUxB VElPTihsb2NrdGFnLCBkYmlkLCByZWxJZCk7CisJTG9ja0RlY2xhcmVGdXR1cmVXYWl0KCZsb2Nr dGFnLCBBY2Nlc3NFeGNsdXNpdmVMb2NrKTsKK30KKwogLyoKICAqIENhbGxiYWNrIHRvIFJhbmdl VmFyR2V0UmVsaWRFeHRlbmRlZCgpIGZvciBUUlVOQ0FURSBwcm9jZXNzaW5nLgogICovCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvZGVhZGxvY2suYyBiL3NyYy9iYWNrZW5k L3N0b3JhZ2UvbG1nci9kZWFkbG9jay5jCmluZGV4IGI4OTYyZDg3NWI2Li5hOGVhOTMzN2U4ZCAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL2RlYWRsb2NrLmMKKysrIGIvc3Jj L2JhY2tlbmQvc3RvcmFnZS9sbWdyL2RlYWRsb2NrLmMKQEAgLTc0LDYgKzc0LDcgQEAgdHlwZWRl ZiBzdHJ1Y3QKIAlMT0NLVEFHCQlsb2NrdGFnOwkJLyogSUQgb2YgYXdhaXRlZCBsb2NrIG9iamVj dCAqLwogCUxPQ0tNT0RFCWxvY2ttb2RlOwkJLyogdHlwZSBvZiBsb2NrIHdlJ3JlIHdhaXRpbmcg Zm9yICovCiAJaW50CQkJcGlkOwkJCS8qIFBJRCBvZiBibG9ja2VkIGJhY2tlbmQgKi8KKwlib29s CQlpc19mdXR1cmU7CQkvKiB3YXMgdGhpcyBhIGRlY2xhcmVkIGZ1dHVyZS13YWl0IGVkZ2U/ICov CiB9IERFQURMT0NLX0lORk87CiAKIApAQCAtODYsNiArODcsMTEgQEAgc3RhdGljIGJvb2wgRmlu ZExvY2tDeWNsZVJlY3Vyc2UoUEdQUk9DICpjaGVja1Byb2MsIGludCBkZXB0aCwKIHN0YXRpYyBi b29sIEZpbmRMb2NrQ3ljbGVSZWN1cnNlTWVtYmVyKFBHUFJPQyAqY2hlY2tQcm9jLAogCQkJCQkJ CQkJICAgUEdQUk9DICpjaGVja1Byb2NMZWFkZXIsCiAJCQkJCQkJCQkgICBpbnQgZGVwdGgsIEVE R0UgKnNvZnRFZGdlcywgaW50ICpuU29mdEVkZ2VzKTsKK3N0YXRpYyBib29sIEZpbmRMb2NrQ3lj bGVSZWN1cnNlV2FpdChQR1BST0MgKmNoZWNrUHJvYywKKwkJCQkJCQkJCSBQR1BST0MgKmNoZWNr UHJvY0xlYWRlciwKKwkJCQkJCQkJCSBpbnQgZGVwdGgsIEVER0UgKnNvZnRFZGdlcywgaW50ICpu U29mdEVkZ2VzKTsKK3N0YXRpYyBib29sIEZpbmRMb2NrQ3ljbGVSZWN1cnNlRnV0dXJlKFBHUFJP QyAqY2hlY2tQcm9jLAorCQkJCQkJCQkJICAgaW50IGRlcHRoLCBFREdFICpzb2Z0RWRnZXMsIGlu dCAqblNvZnRFZGdlcyk7CiBzdGF0aWMgYm9vbCBFeHBhbmRDb25zdHJhaW50cyhFREdFICpjb25z dHJhaW50cywgaW50IG5Db25zdHJhaW50cyk7CiBzdGF0aWMgYm9vbCBUb3BvU29ydChMT0NLICps b2NrLCBFREdFICpjb25zdHJhaW50cywgaW50IG5Db25zdHJhaW50cywKIAkJCQkJIFBHUFJPQyAq Km9yZGVyaW5nKTsKQEAgLTUwNCw3ICs1MTAsOCBAQCBGaW5kTG9ja0N5Y2xlUmVjdXJzZShQR1BS T0MgKmNoZWNrUHJvYywKIAkgKiBJZiB0aGUgcHJvY2VzcyBpcyB3YWl0aW5nLCB0aGVyZSBpcyBh biBvdXRnb2luZyB3YWl0cy1mb3IgZWRnZSB0byBlYWNoCiAJICogcHJvY2VzcyB0aGF0IGJsb2Nr cyBpdC4KIAkgKi8KLQlpZiAoIWRsaXN0X25vZGVfaXNfZGV0YWNoZWQoJmNoZWNrUHJvYy0+d2Fp dExpbmspICYmCisJaWYgKCghZGxpc3Rfbm9kZV9pc19kZXRhY2hlZCgmY2hlY2tQcm9jLT53YWl0 TGluaykgfHwKKwkJIEZ1dHVyZVdhaXRMb2NrSXNTZXQoJmNoZWNrUHJvYy0+ZnV0dXJlV2FpdExv Y2spKSAmJgogCQlGaW5kTG9ja0N5Y2xlUmVjdXJzZU1lbWJlcihjaGVja1Byb2MsIGNoZWNrUHJv YywgZGVwdGgsIHNvZnRFZGdlcywKIAkJCQkJCQkJICAgblNvZnRFZGdlcykpCiAJCXJldHVybiB0 cnVlOwpAQCAtNTM4LDYgKzU0NSwzNCBAQCBGaW5kTG9ja0N5Y2xlUmVjdXJzZU1lbWJlcihQR1BS T0MgKmNoZWNrUHJvYywKIAkJCQkJCSAgIGludCBkZXB0aCwKIAkJCQkJCSAgIEVER0UgKnNvZnRF ZGdlcywgLyogb3V0cHV0IGFyZ3VtZW50ICovCiAJCQkJCQkgICBpbnQgKm5Tb2Z0RWRnZXMpIC8q IG91dHB1dCBhcmd1bWVudCAqLworeworCS8qIEZvbGxvdyBvdXRnb2luZyBlZGdlcyBmcm9tIGEg cmVhbCBsb2NrIHdhaXQsIGlmIGFueS4gKi8KKwlpZiAoIWRsaXN0X25vZGVfaXNfZGV0YWNoZWQo JmNoZWNrUHJvYy0+d2FpdExpbmspICYmCisJCUZpbmRMb2NrQ3ljbGVSZWN1cnNlV2FpdChjaGVj a1Byb2MsIGNoZWNrUHJvY0xlYWRlciwgZGVwdGgsCisJCQkJCQkJCSBzb2Z0RWRnZXMsIG5Tb2Z0 RWRnZXMpKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qCisJICogQSBmdXR1cmUtd2FpdCBzbG90IGlz IG9ubHkgdXNlZnVsIHdoZW4gYW5vdGhlciBiYWNrZW5kIGlzIGFscmVhZHkKKwkgKiB3YWl0aW5n IGFuZCByZWFjaGVzIHRoaXMgcHJvYyB0aHJvdWdoIHRoZSB3YWl0cy1mb3IgZ3JhcGguICBEbyBu b3Qgc3RhcnQKKwkgKiBmcm9tIG91ciBvd24gZnV0dXJlIHNsb3Q6IHVudGlsIHdlIGFjdHVhbGx5 IHJlcXVlc3QgdGhhdCBsb2NrLCB0aGVyZSBpcworCSAqIG5vIGN1cnJlbnQgd2FpdCB0byBicmVh ay4KKwkgKi8KKwlpZiAoY2hlY2tQcm9jICE9IE15UHJvYyAmJgorCQljaGVja1Byb2MgPT0gY2hl Y2tQcm9jTGVhZGVyICYmCisJCUZ1dHVyZVdhaXRMb2NrSXNTZXQoJmNoZWNrUHJvYy0+ZnV0dXJl V2FpdExvY2spICYmCisJCUZpbmRMb2NrQ3ljbGVSZWN1cnNlRnV0dXJlKGNoZWNrUHJvYywgZGVw dGgsIHNvZnRFZGdlcywgblNvZnRFZGdlcykpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZh bHNlOworfQorCitzdGF0aWMgYm9vbAorRmluZExvY2tDeWNsZVJlY3Vyc2VXYWl0KFBHUFJPQyAq Y2hlY2tQcm9jLAorCQkJCQkJIFBHUFJPQyAqY2hlY2tQcm9jTGVhZGVyLAorCQkJCQkJIGludCBk ZXB0aCwKKwkJCQkJCSBFREdFICpzb2Z0RWRnZXMsIC8qIG91dHB1dCBhcmd1bWVudCAqLworCQkJ CQkJIGludCAqblNvZnRFZGdlcykgLyogb3V0cHV0IGFyZ3VtZW50ICovCiB7CiAJUEdQUk9DCSAg ICpwcm9jOwogCUxPQ0sJICAgKmxvY2sgPSBjaGVja1Byb2MtPndhaXRMb2NrOwpAQCAtNTkwLDYg KzYyNSw3IEBAIEZpbmRMb2NrQ3ljbGVSZWN1cnNlTWVtYmVyKFBHUFJPQyAqY2hlY2tQcm9jLAog CQkJCQkJaW5mby0+bG9ja3RhZyA9IGxvY2stPnRhZzsKIAkJCQkJCWluZm8tPmxvY2ttb2RlID0g Y2hlY2tQcm9jLT53YWl0TG9ja01vZGU7CiAJCQkJCQlpbmZvLT5waWQgPSBjaGVja1Byb2MtPnBp ZDsKKwkJCQkJCWluZm8tPmlzX2Z1dHVyZSA9IGZhbHNlOwogCiAJCQkJCQlyZXR1cm4gdHJ1ZTsK IAkJCQkJfQpAQCAtNjc5LDYgKzcxNSw3IEBAIEZpbmRMb2NrQ3ljbGVSZWN1cnNlTWVtYmVyKFBH UFJPQyAqY2hlY2tQcm9jLAogCQkJCQlpbmZvLT5sb2NrdGFnID0gbG9jay0+dGFnOwogCQkJCQlp bmZvLT5sb2NrbW9kZSA9IGNoZWNrUHJvYy0+d2FpdExvY2tNb2RlOwogCQkJCQlpbmZvLT5waWQg PSBjaGVja1Byb2MtPnBpZDsKKwkJCQkJaW5mby0+aXNfZnV0dXJlID0gZmFsc2U7CiAKIAkJCQkJ LyoKIAkJCQkJICogQWRkIHRoaXMgZWRnZSB0byB0aGUgbGlzdCBvZiBzb2Z0IGVkZ2VzIGluIHRo ZSBjeWNsZQpAQCAtNzUzLDYgKzc5MCw3IEBAIEZpbmRMb2NrQ3ljbGVSZWN1cnNlTWVtYmVyKFBH UFJPQyAqY2hlY2tQcm9jLAogCQkJCQlpbmZvLT5sb2NrdGFnID0gbG9jay0+dGFnOwogCQkJCQlp bmZvLT5sb2NrbW9kZSA9IGNoZWNrUHJvYy0+d2FpdExvY2tNb2RlOwogCQkJCQlpbmZvLT5waWQg PSBjaGVja1Byb2MtPnBpZDsKKwkJCQkJaW5mby0+aXNfZnV0dXJlID0gZmFsc2U7CiAKIAkJCQkJ LyoKIAkJCQkJICogQWRkIHRoaXMgZWRnZSB0byB0aGUgbGlzdCBvZiBzb2Z0IGVkZ2VzIGluIHRo ZSBjeWNsZQpAQCAtNzc0LDYgKzgxMiwxNDkgQEAgRmluZExvY2tDeWNsZVJlY3Vyc2VNZW1iZXIo UEdQUk9DICpjaGVja1Byb2MsCiAJcmV0dXJuIGZhbHNlOwogfQogCisvKgorICogRm9sbG93IGEg ZGVjbGFyZWQgZnV0dXJlLXdhaXQgZWRnZSBhcyBhIGhhcmQgZWRnZS4KKyAqLworc3RhdGljIGJv b2wKK0ZpbmRMb2NrQ3ljbGVSZWN1cnNlRnV0dXJlKFBHUFJPQyAqY2hlY2tQcm9jLAorCQkJCQkJ ICAgaW50IGRlcHRoLAorCQkJCQkJICAgRURHRSAqc29mdEVkZ2VzLCAvKiBvdXRwdXQgYXJndW1l bnQgKi8KKwkJCQkJCSAgIGludCAqblNvZnRFZGdlcykgLyogb3V0cHV0IGFyZ3VtZW50ICovCit7 CisJRnV0dXJlV2FpdExvY2sgKmZ1dHVyZVdhaXRMb2NrID0gJmNoZWNrUHJvYy0+ZnV0dXJlV2Fp dExvY2s7CisJTE9DSwkgICAqbG9jazsKKwlMb2NrTWV0aG9kCWxvY2tNZXRob2RUYWJsZTsKKwl1 aW50MzIJCWhhc2hjb2RlOworCWludAkJCWNvbmZsaWN0TWFzazsKKwlMT0NLTUFTSwlteUhlbGRM b2NrcyA9IDA7CisJZGxpc3RfaXRlcglwcm9jbG9ja19pdGVyOworCWRsaXN0X2l0ZXIJcHJvY19p dGVyOworCisJQXNzZXJ0KEZ1dHVyZVdhaXRMb2NrSXNTZXQoZnV0dXJlV2FpdExvY2spKTsKKwlB c3NlcnQoY2hlY2tQcm9jICE9IE15UHJvYyk7CisKKwkvKgorCSAqIEludmFyaWFudCBtYWludGFp bmVkIGJ5IExvY2tBY3F1aXJlRXh0ZW5kZWQoKTogaWYgYSBwcm9jIGlzIHJlYWxseQorCSAqIHdh aXRpbmcgb24gYSBsb2NrLCBpdHMgZnV0dXJlLXdhaXQgc2xvdCAoaWYgYW55KSBtdXN0IG5vdCBk ZXNjcmliZSB0aGUKKwkgKiBzYW1lIChsb2NrdGFnLCBsb2NrbW9kZSkuICBUaGUgc2xvdCBpcyBj bGVhcmVkIGF0IHRoZSBwb2ludCB3ZSBhdHRhY2gKKwkgKiBvdXIgd2FpdExpbmsgZm9yIHRoYXQg ZXhhY3QgbG9jayBhbmQgbW9kZSwgc28gdGhlIHdhaXQgd2Fsa2VyJ3MKKwkgKiBwcm9jTG9ja3Mg c2NhbiBhbHJlYWR5IHN1YnN1bWVzIGFueXRoaW5nIHRoaXMgd2Fsa2VyIHdvdWxkIGZpbmQuCisJ ICovCisJQXNzZXJ0KGRsaXN0X25vZGVfaXNfZGV0YWNoZWQoJmNoZWNrUHJvYy0+d2FpdExpbmsp IHx8CisJCSAgIGNoZWNrUHJvYy0+d2FpdExvY2tNb2RlICE9IGZ1dHVyZVdhaXRMb2NrLT5tb2Rl IHx8CisJCSAgIG1lbWNtcCgmY2hlY2tQcm9jLT53YWl0TG9jay0+dGFnLCAmZnV0dXJlV2FpdExv Y2stPmxvY2t0YWcsCisJCQkJICBzaXplb2YoTE9DS1RBRykpICE9IDApOworCisJLyoKKwkgKiBM b29rIHVwIHRoZSBzaGFyZWQgTE9DSyBvYmplY3QgZm9yIHRoZSBkZWNsYXJlZCB0YWcuICBJdCBp cyBsZWdhbCBmb3IKKwkgKiB0aGUgZW50cnkgbm90IHRvIGV4aXN0OiB0aGUgaGFzaCB0YWJsZSBv bmx5IGNvbnRhaW5zIExPQ0sgb2JqZWN0cyB0aGF0CisJICogY3VycmVudGx5IGhhdmUgYXQgbGVh c3Qgb25lIGhvbGRlciBvciByZXF1ZXN0ZXIsIGFuZCBhIGZ1dHVyZS13YWl0CisJICogZGVjbGFy YXRpb24gY2FuIGJlIG1hZGUgYmVmb3JlIGFueSBwcm9jbG9jayBmb3IgdGhhdCB0YWcgaXMgY3Jl YXRlZAorCSAqIChlLmcuIFJhbmdlVmFyQ2FsbGJhY2tGb3JSZXBhY2sgcnVucyBpbnNpZGUgUmFu Z2VWYXJHZXRSZWxpZEV4dGVuZGVkCisJICogKmJlZm9yZSogdGhlIGNhbGxlciBoYXMgYWN0dWFs bHkgdGFrZW4gdGhlIGluaXRpYWwgU1VFIGxvY2sgb24gdGhlCisJICogcmVsYXRpb24sIGFuZCBu byBvdGhlciBiYWNrZW5kIG1heSBoYXZlIGFueSBsb2NrIG9uIGl0IGVpdGhlcikuICBXaXRoCisJ ICogbm8gTE9DSyBvYmplY3QgdGhlcmUgYXJlIG5vIGN1cnJlbnQgaG9sZGVycywgaGVuY2Ugbm8g b3V0Z29pbmcgZWRnZXMKKwkgKiBmcm9tIHRoaXMgZnV0dXJlLXdhaXQgc2xvdCwgc28gc2ltcGx5 IHJldHVybi4KKwkgKi8KKwloYXNoY29kZSA9IExvY2tUYWdIYXNoQ29kZSgmZnV0dXJlV2FpdExv Y2stPmxvY2t0YWcpOworCWxvY2sgPSBMb2NrSGFzaExvb2t1cCgmZnV0dXJlV2FpdExvY2stPmxv Y2t0YWcsIGhhc2hjb2RlKTsKKwlpZiAobG9jayA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisK Kwlsb2NrTWV0aG9kVGFibGUgPSBHZXRMb2Nrc01ldGhvZFRhYmxlKGxvY2spOworCUFzc2VydChm dXR1cmVXYWl0TG9jay0+bW9kZSA+IDAgJiYKKwkJICAgZnV0dXJlV2FpdExvY2stPm1vZGUgPD0g bG9ja01ldGhvZFRhYmxlLT5udW1Mb2NrTW9kZXMpOworCWNvbmZsaWN0TWFzayA9IGxvY2tNZXRo b2RUYWJsZS0+Y29uZmxpY3RUYWJbZnV0dXJlV2FpdExvY2stPm1vZGVdOworCisJLyoKKwkgKiBG aXJzdCwgZm9sbG93IGVkZ2VzIHRvIGN1cnJlbnQgaG9sZGVycyBvZiBjb25mbGljdGluZyBtb2Rl cy4gIFRoZXNlCisJICogZWRnZXMgYXJlIHRoZSBmdXR1cmUtd2FpdCBlcXVpdmFsZW50IG9mIHRo ZSBub3JtYWwgaGFyZCBlZGdlcyBmcm9tIGEKKwkgKiByZWFsIHdhaXRlciB0byBjdXJyZW50IGhv bGRlcnMuCisJICovCisJZGxpc3RfZm9yZWFjaChwcm9jbG9ja19pdGVyLCAmbG9jay0+cHJvY0xv Y2tzKQorCXsKKwkJUFJPQ0xPQ0sgICAqcHJvY2xvY2sgPSBkbGlzdF9jb250YWluZXIoUFJPQ0xP Q0ssIGxvY2tMaW5rLCBwcm9jbG9ja19pdGVyLmN1cik7CisJCVBHUFJPQwkgICAqcHJvYyA9IHBy b2Nsb2NrLT50YWcubXlQcm9jOworCQlQR1BST0MJICAgKmxlYWRlcjsKKworCQlsZWFkZXIgPSBw cm9jLT5sb2NrR3JvdXBMZWFkZXIgPT0gTlVMTCA/IHByb2MgOiBwcm9jLT5sb2NrR3JvdXBMZWFk ZXI7CisKKwkJLyogQSBwcm9jIG5ldmVyIGJsb2NrcyBpdHNlbGYgb3IgYW55IG90aGVyIGxvY2sg Z3JvdXAgbWVtYmVyLiAqLworCQlpZiAobGVhZGVyID09IGNoZWNrUHJvYykKKwkJeworCQkJbXlI ZWxkTG9ja3MgfD0gcHJvY2xvY2stPmhvbGRNYXNrOworCQkJY29udGludWU7CisJCX0KKworCQlp ZiAoKHByb2Nsb2NrLT5ob2xkTWFzayAmIGNvbmZsaWN0TWFzaykgIT0gMCkKKwkJeworCQkJaWYg KEZpbmRMb2NrQ3ljbGVSZWN1cnNlKHByb2MsIGRlcHRoICsgMSwKKwkJCQkJCQkJCSBzb2Z0RWRn ZXMsIG5Tb2Z0RWRnZXMpKQorCQkJeworCQkJCURFQURMT0NLX0lORk8gKmluZm8gPSAmZGVhZGxv Y2tEZXRhaWxzW2RlcHRoXTsKKworCQkJCWluZm8tPmxvY2t0YWcgPSBmdXR1cmVXYWl0TG9jay0+ bG9ja3RhZzsKKwkJCQlpbmZvLT5sb2NrbW9kZSA9IGZ1dHVyZVdhaXRMb2NrLT5tb2RlOworCQkJ CWluZm8tPnBpZCA9IGNoZWNrUHJvYy0+cGlkOworCQkJCWluZm8tPmlzX2Z1dHVyZSA9IHRydWU7 CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogRXhpc3Rpbmcg d2FpdGVycyBjYW4gYWxzbyBiZWNvbWUgYmxvY2tlcnMgZm9yIHRoZSBmdXR1cmUgcmVxdWVzdC4g IEEKKwkgKiByZWFsIExvY2tBY3F1aXJlRXh0ZW5kZWQoKSBmaXJzdCBjaGVja3MgbG9jay0+d2Fp dE1hc2ssIGFuZCBpZiB0aGVyZQorCSAqIGFyZSBjb25mbGljdGluZyB3YWl0ZXJzIGl0IGNhbGxz IEpvaW5XYWl0UXVldWUoKS4gIE1vZGVsIHRoZSBxdWV1ZQorCSAqIHBvc2l0aW9uIEpvaW5XYWl0 UXVldWUoKSB3b3VsZCBjaG9vc2UgdG9kYXksIGFuZCBmb2xsb3cgb25seSBxdWV1ZWQKKwkgKiBy ZXF1ZXN0cyB0aGF0IHdvdWxkIGJlIGFoZWFkIG9mIHRoYXQgcG9zaXRpb24uCisJICoKKwkgKiBE byBub3QgcmVjb3JkIHRoZXNlIGFzIHNvZnQgZWRnZXMuICBUaGUgZnV0dXJlIHJlcXVlc3RlciBp cyBub3QgcHJlc2VudAorCSAqIGluIGxvY2stPndhaXRQcm9jcywgc28gdGhlIGRlYWRsb2NrIGRl dGVjdG9yIGNhbm5vdCByZXBhaXIgc3VjaCBhbiBlZGdlCisJICogYnkgcmVvcmRlcmluZyB0aGUg Y3VycmVudCB3YWl0IHF1ZXVlLgorCSAqLworCWRjbGlzdF9mb3JlYWNoKHByb2NfaXRlciwgJmxv Y2stPndhaXRQcm9jcykKKwl7CisJCVBHUFJPQwkgICAqcHJvYyA9IGRsaXN0X2NvbnRhaW5lcihQ R1BST0MsIHdhaXRMaW5rLCBwcm9jX2l0ZXIuY3VyKTsKKwkJUEdQUk9DCSAgICpsZWFkZXI7CisJ CUxPQ0tNT0RFCXdhaXRMb2NrTW9kZSA9IHByb2MtPndhaXRMb2NrTW9kZTsKKworCQlsZWFkZXIg PSBwcm9jLT5sb2NrR3JvdXBMZWFkZXIgPT0gTlVMTCA/IHByb2MgOiBwcm9jLT5sb2NrR3JvdXBM ZWFkZXI7CisKKwkJaWYgKGxlYWRlciA9PSBjaGVja1Byb2MpCisJCQljb250aW51ZTsKKworCQkv KgorCQkgKiBJZiBjaGVja1Byb2MgYWxyZWFkeSBob2xkcyBsb2NrcyB0aGF0IGNvbmZsaWN0IHdp dGggdGhpcyB3YWl0ZXIncworCQkgKiByZXF1ZXN0LCBKb2luV2FpdFF1ZXVlKCkgd291bGQgaW5z ZXJ0IHRoZSBmdXR1cmUgcmVxdWVzdCBiZWZvcmUKKwkJICogdGhpcyB3YWl0ZXIuICBXZSBhcmUg ZG9uZSBzY2FubmluZyB0aGUgcXVldWUgYWZ0ZXIgY29uc2lkZXJpbmcKKwkJICogZWFybGllciB3 YWl0ZXJzLgorCQkgKi8KKwkJaWYgKG15SGVsZExvY2tzICE9IDAgJiYKKwkJCShsb2NrTWV0aG9k VGFibGUtPmNvbmZsaWN0VGFiW3dhaXRMb2NrTW9kZV0gJiBteUhlbGRMb2NrcykgIT0gMCkKKwkJ CWJyZWFrOworCisJCWlmICgoTE9DS0JJVF9PTih3YWl0TG9ja01vZGUpICYgY29uZmxpY3RNYXNr KSAhPSAwKQorCQl7CisJCQlpZiAoRmluZExvY2tDeWNsZVJlY3Vyc2UocHJvYywgZGVwdGggKyAx LAorCQkJCQkJCQkJIHNvZnRFZGdlcywgblNvZnRFZGdlcykpCisJCQl7CisJCQkJREVBRExPQ0tf SU5GTyAqaW5mbyA9ICZkZWFkbG9ja0RldGFpbHNbZGVwdGhdOworCisJCQkJaW5mby0+bG9ja3Rh ZyA9IGZ1dHVyZVdhaXRMb2NrLT5sb2NrdGFnOworCQkJCWluZm8tPmxvY2ttb2RlID0gZnV0dXJl V2FpdExvY2stPm1vZGU7CisJCQkJaW5mby0+cGlkID0gY2hlY2tQcm9jLT5waWQ7CisJCQkJaW5m by0+aXNfZnV0dXJlID0gdHJ1ZTsKKworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQor CisJcmV0dXJuIGZhbHNlOworfQorCiAKIC8qCiAgKiBFeHBhbmRDb25zdHJhaW50cyAtLSBleHBh bmQgYSBsaXN0IG9mIGNvbnN0cmFpbnRzIGludG8gYSBzZXQgb2YKQEAgLTEwNzgsNiArMTI1OSw3 IEBAIERlYWRMb2NrUmVwb3J0KHZvaWQpCiAJU3RyaW5nSW5mb0RhdGEgbG9nYnVmOwkJLyogZXJy ZGV0YWlsIGZvciBzZXJ2ZXIgbG9nICovCiAJU3RyaW5nSW5mb0RhdGEgbG9ja3RhZ2J1ZjsKIAlp bnQJCQlpOworCWJvb2wJCWFueV9mdXR1cmUgPSBmYWxzZTsKIAogCWluaXRTdHJpbmdJbmZvKCZj bGllbnRidWYpOwogCWluaXRTdHJpbmdJbmZvKCZsb2didWYpOwpAQCAtMTA5OSwxMiArMTI4MSwx NSBAQCBEZWFkTG9ja1JlcG9ydCh2b2lkKQogCQlyZXNldFN0cmluZ0luZm8oJmxvY2t0YWdidWYp OwogCiAJCURlc2NyaWJlTG9ja1RhZygmbG9ja3RhZ2J1ZiwgJmluZm8tPmxvY2t0YWcpOworCQlh bnlfZnV0dXJlIHw9IGluZm8tPmlzX2Z1dHVyZTsKIAogCQlpZiAoaSA+IDApCiAJCQlhcHBlbmRT dHJpbmdJbmZvQ2hhcigmY2xpZW50YnVmLCAnXG4nKTsKIAogCQlhcHBlbmRTdHJpbmdJbmZvKCZj bGllbnRidWYsCi0JCQkJCQkgXygiUHJvY2VzcyAlZCB3YWl0cyBmb3IgJXMgb24gJXM7IGJsb2Nr ZWQgYnkgcHJvY2VzcyAlZC4iKSwKKwkJCQkJCSBpbmZvLT5pc19mdXR1cmUKKwkJCQkJCSA/IF8o IlByb2Nlc3MgJWQgd2lsbCByZXF1ZXN0ICVzIG9uICVzIChkZWNsYXJlZCBmdXR1cmUgaW50ZW50 KTsgYmxvY2tlZCBieSBwcm9jZXNzICVkLiIpCisJCQkJCQkgOiBfKCJQcm9jZXNzICVkIHdhaXRz IGZvciAlcyBvbiAlczsgYmxvY2tlZCBieSBwcm9jZXNzICVkLiIpLAogCQkJCQkJIGluZm8tPnBp ZCwKIAkJCQkJCSBHZXRMb2NrbW9kZU5hbWUoaW5mby0+bG9ja3RhZy5sb2NrdGFnX2xvY2ttZXRo b2RpZCwKIAkJCQkJCQkJCQkgaW5mby0+bG9ja21vZGUpLApAQCAtMTEzMiw3ICsxMzE3LDkgQEAg RGVhZExvY2tSZXBvcnQodm9pZCkKIAogCWVyZXBvcnQoRVJST1IsCiAJCQkoZXJyY29kZShFUlJD T0RFX1RfUl9ERUFETE9DS19ERVRFQ1RFRCksCi0JCQkgZXJybXNnKCJkZWFkbG9jayBkZXRlY3Rl ZCIpLAorCQkJIGVycm1zZyhhbnlfZnV0dXJlCisJCQkJCT8gImZ1dHVyZSBkZWFkbG9jayBkZXRl Y3RlZCIKKwkJCQkJOiAiZGVhZGxvY2sgZGV0ZWN0ZWQiKSwKIAkJCSBlcnJkZXRhaWxfaW50ZXJu YWwoIiVzIiwgY2xpZW50YnVmLmRhdGEpLAogCQkJIGVycmRldGFpbF9sb2coIiVzIiwgbG9nYnVm LmRhdGEpLAogCQkJIGVycmhpbnQoIlNlZSBzZXJ2ZXIgbG9nIGZvciBxdWVyeSBkZXRhaWxzLiIp KSk7CkBAIC0xMTU0LDkgKzEzNDEsMTEgQEAgUmVtZW1iZXJTaW1wbGVEZWFkTG9jayhQR1BST0Mg KnByb2MxLAogCWluZm8tPmxvY2t0YWcgPSBsb2NrLT50YWc7CiAJaW5mby0+bG9ja21vZGUgPSBs b2NrbW9kZTsKIAlpbmZvLT5waWQgPSBwcm9jMS0+cGlkOworCWluZm8tPmlzX2Z1dHVyZSA9IGZh bHNlOwogCWluZm8rKzsKIAlpbmZvLT5sb2NrdGFnID0gcHJvYzItPndhaXRMb2NrLT50YWc7CiAJ aW5mby0+bG9ja21vZGUgPSBwcm9jMi0+d2FpdExvY2tNb2RlOwogCWluZm8tPnBpZCA9IHByb2My LT5waWQ7CisJaW5mby0+aXNfZnV0dXJlID0gZmFsc2U7CiAJbkRlYWRsb2NrRGV0YWlscyA9IDI7 CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvbG9jay5jIGIvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9sbWdyL2xvY2suYwppbmRleCBjMjIxZmU5Njg4OS4uMTIxMDdlMDdiZWMg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sb2NrLmMKKysrIGIvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9sbWdyL2xvY2suYwpAQCAtMzE0LDYgKzMxNCwxOSBAQCB0eXBlZGVmIHN0 cnVjdAogCiBzdGF0aWMgdm9sYXRpbGUgRmFzdFBhdGhTdHJvbmdSZWxhdGlvbkxvY2tEYXRhICpG YXN0UGF0aFN0cm9uZ1JlbGF0aW9uTG9ja3M7CiAKKy8qCisgKiBDb3VudCBvZiBhY3RpdmUgZnV0 dXJlLXdhaXQgZGVjbGFyYXRpb25zIHRoYXQgY291bGQgY29uZmxpY3Qgd2l0aCByZWxhdGlvbgor ICogZmFzdC1wYXRoIGxvY2tzLiAgVGhpcyBpcyBvbmx5IGEgc2tpcCBoaW50IGZvciBDaGVja0Rl YWRMb2NrKCk7IHRoZSBhY3R1YWwKKyAqIGZ1dHVyZS13YWl0IGxvY2t0YWdzIGFyZSByZWFkIGZy b20gUEdQUk9DLmZ1dHVyZVdhaXRMb2NrIHdoaWxlIGFsbCBsb2NrCisgKiBwYXJ0aXRpb25zIGFy ZSBoZWxkLgorICovCit0eXBlZGVmIHN0cnVjdCBGdXR1cmVXYWl0RmFzdFBhdGhDdGxEYXRhCit7 CisJcGdfYXRvbWljX3VpbnQzMiBjb3VudDsKK30gRnV0dXJlV2FpdEZhc3RQYXRoQ3RsRGF0YTsK Kworc3RhdGljIEZ1dHVyZVdhaXRGYXN0UGF0aEN0bERhdGEgKkZ1dHVyZVdhaXRGYXN0UGF0aEN0 bCA9IE5VTEw7CisKIHN0YXRpYyB2b2lkIExvY2tNYW5hZ2VyU2htZW1SZXF1ZXN0KHZvaWQgKmFy Zyk7CiBzdGF0aWMgdm9pZCBMb2NrTWFuYWdlclNobWVtSW5pdCh2b2lkICphcmcpOwogCkBAIC00 ODgsMTIgKzUwMSwxOCBAQCBMb2NrTWFuYWdlclNobWVtUmVxdWVzdCh2b2lkICphcmcpCiAJCQkJ CSAgIC5zaXplID0gc2l6ZW9mKEZhc3RQYXRoU3Ryb25nUmVsYXRpb25Mb2NrRGF0YSksCiAJCQkJ CSAgIC5wdHIgPSAodm9pZCAqKikgKHZvaWQgKikgJkZhc3RQYXRoU3Ryb25nUmVsYXRpb25Mb2Nr cywKIAkJKTsKKworCVNobWVtUmVxdWVzdFN0cnVjdCgubmFtZSA9ICJGdXR1cmUgV2FpdCBGYXN0 IFBhdGggQ29udHJvbCIsCisJCQkJCSAgIC5zaXplID0gc2l6ZW9mKEZ1dHVyZVdhaXRGYXN0UGF0 aEN0bERhdGEpLAorCQkJCQkgICAucHRyID0gKHZvaWQgKiopICZGdXR1cmVXYWl0RmFzdFBhdGhD dGwsCisJCSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBMb2NrTWFuYWdlclNobWVtSW5pdCh2b2lkICph cmcpCiB7CiAJU3BpbkxvY2tJbml0KCZGYXN0UGF0aFN0cm9uZ1JlbGF0aW9uTG9ja3MtPm11dGV4 KTsKKwlwZ19hdG9taWNfaW5pdF91MzIoJkZ1dHVyZVdhaXRGYXN0UGF0aEN0bC0+Y291bnQsIDAp OwogfQogCiAvKgpAQCAtNjI4LDYgKzY0NywzNzQgQEAgRG9Mb2NrTW9kZXNDb25mbGljdChMT0NL TU9ERSBtb2RlMSwgTE9DS01PREUgbW9kZTIpCiAJcmV0dXJuIGZhbHNlOwogfQogCisvKgorICog TG9ja0hhc2hMb29rdXAgLS0gbG9vayB1cCBhIExPQ0sgYnkgbG9ja3RhZyBhbmQgcHJlY29tcHV0 ZWQgaGFzaGNvZGUuCisgKgorICogUmV0dXJucyBOVUxMIGlmIG5vIExPQ0sgZXhpc3RzIGZvciB0 aGlzIHRhZy4KKyAqCisgKiBDYWxsZXJzIE1VU1QgaG9sZCB0aGUgcGFydGl0aW9uIGxvY2sgY292 ZXJpbmcgaGFzaGNvZGUgaW4gTFdfRVhDTFVTSVZFCisgKiBtb2RlLCBhbmQgTVVTVCB0cmVhdCB0 aGUgcmV0dXJuZWQgcG9pbnRlciBhcyB2YWxpZCBvbmx5IHdoaWxlIHRoYXQKKyAqIHBhcnRpdGlv biBsb2NrIHJlbWFpbnMgaGVsZDogdGhlIExPQ0sgZW50cnkgY2FuIGJlIHJlbW92ZWQgZnJvbSB0 aGUgaGFzaAorICogdGFibGUgYnkgTG9ja1JlbGVhc2UoKSB1bmRlciB0aGUgc2FtZSBwYXJ0aXRp b24gbG9jaywgc28gZHJvcHBpbmcgdGhlCisgKiBsb2NrIGludmFsaWRhdGVzIHRoZSBwb2ludGVy LgorICoKKyAqIFRvZGF5IHRoZSBvbmx5IGNhbGxlciBpcyB0aGUgZGVhZGxvY2sgZGV0ZWN0b3Is IHdoaWNoIHNhdGlzZmllcyBib3RoCisgKiByZXF1aXJlbWVudHMgYnkgYWNxdWlyaW5nIGV2ZXJ5 IGxvY2stbWFuYWdlciBwYXJ0aXRpb24gbG9jayBleGNsdXNpdmVseQorICogYmVmb3JlIHdhbGtp bmcgdGhlIHdhaXQtZm9yIGdyYXBoLCBhbmQgdXNlcyB0aGUgcmVzdWx0IHRvIHJlc29sdmUgYQor ICogZGVjbGFyZWQgZnV0dXJlLXdhaXQgZWRnZSdzIGxvY2t0YWcgaW50byBhIGxpdmUgTE9DSyAq LiAgTmV3IGNhbGxlcnMKKyAqIGZyb20gb3V0c2lkZSB0aGF0IGNvbnRleHQgc2hvdWxkIGJlIHJl dmlld2VkIGNhcmVmdWxseS4KKyAqLworTE9DSyAqCitMb2NrSGFzaExvb2t1cChjb25zdCBMT0NL VEFHICpsb2NrdGFnLCB1aW50MzIgaGFzaGNvZGUpCit7CisJQXNzZXJ0KExXTG9ja0hlbGRCeU1l SW5Nb2RlKExvY2tIYXNoUGFydGl0aW9uTG9jayhoYXNoY29kZSksCisJCQkJCQkJCUxXX0VYQ0xV U0lWRSkpOworCisJcmV0dXJuIChMT0NLICopIGhhc2hfc2VhcmNoX3dpdGhfaGFzaF92YWx1ZShM b2NrTWV0aG9kTG9ja0hhc2gsCisJCQkJCQkJCQkJCQlsb2NrdGFnLAorCQkJCQkJCQkJCQkJaGFz aGNvZGUsCisJCQkJCQkJCQkJCQlIQVNIX0ZJTkQsCisJCQkJCQkJCQkJCQlOVUxMKTsKK30KKwor c3RhdGljIGlubGluZSBib29sCitGdXR1cmVXYWl0TG9ja01hdGNoZXMoY29uc3QgRnV0dXJlV2Fp dExvY2sgKmZ1dHVyZVdhaXRMb2NrLAorCQkJCQkgIGNvbnN0IExPQ0tUQUcgKmxvY2t0YWcsIExP Q0tNT0RFIGxvY2ttb2RlKQoreworCXJldHVybiBGdXR1cmVXYWl0TG9ja0lzU2V0KGZ1dHVyZVdh aXRMb2NrKSAmJgorCQlmdXR1cmVXYWl0TG9jay0+bW9kZSA9PSBsb2NrbW9kZSAmJgorCQltZW1j bXAoJmZ1dHVyZVdhaXRMb2NrLT5sb2NrdGFnLCBsb2NrdGFnLCBzaXplb2YoTE9DS1RBRykpID09 IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorRnV0dXJlV2FpdE5lZWRzRmFzdFBhdGhNaWdy YXRpb24oY29uc3QgRnV0dXJlV2FpdExvY2sgKmZ1dHVyZVdhaXRMb2NrKQoreworCXJldHVybiBG dXR1cmVXYWl0TG9ja0lzU2V0KGZ1dHVyZVdhaXRMb2NrKSAmJgorCQlDb25mbGljdHNXaXRoUmVs YXRpb25GYXN0UGF0aCgmZnV0dXJlV2FpdExvY2stPmxvY2t0YWcsCisJCQkJCQkJCQkgIGZ1dHVy ZVdhaXRMb2NrLT5tb2RlKTsKK30KKworLyoKKyAqIExvY2tDbGVhckZ1dHVyZVdhaXRTbG90SWZN YXRjaCAtLSBjbGVhciBvdXIgZnV0dXJlLXdhaXQgc2xvdCBpZiBpdCBtYXRjaGVzCisgKiBhIGxv Y2sgdGhhdCB3ZSBoYXZlIG5vdyBhY3F1aXJlZCBvciBzdGFydGVkIHdhaXRpbmcgZm9yLgorICov CitzdGF0aWMgdm9pZAorTG9ja0NsZWFyRnV0dXJlV2FpdFNsb3RJZk1hdGNoKGNvbnN0IExPQ0tU QUcgKmxvY2t0YWcsIExPQ0tNT0RFIGxvY2ttb2RlLAorCQkJCQkJCSAgIGJvb2wgcGFydGl0aW9u TG9ja0hlbGQpCit7CisJaWYgKCFGdXR1cmVXYWl0TG9ja01hdGNoZXMoJk15UHJvYy0+ZnV0dXJl V2FpdExvY2ssIGxvY2t0YWcsIGxvY2ttb2RlKSkKKwkJcmV0dXJuOworCisJTG9ja0NsZWFyRnV0 dXJlV2FpdFNsb3QocGFydGl0aW9uTG9ja0hlbGQpOworfQorCisvKgorICogTG9ja0RlY2xhcmVG dXR1cmVXYWl0IC0tIHB1Ymxpc2ggYSBoYXJkIGZ1dHVyZSB3YWl0cy1mb3IgZWRnZS4KKyAqCisg KiBUaGUgY2FsbGVyIGRlY2xhcmVzIHRoYXQgdGhpcyBiYWNrZW5kIGludGVuZHMgdG8gcmVxdWVz dCBsb2NrbW9kZSBvbgorICogbG9ja3RhZyBsYXRlci4gIFRoZSBkZWNsYXJhdGlvbiBiZWNvbWVz IHZpc2libGUgdG8gZGVhZGxvY2sgZGV0ZWN0aW9uCisgKiBiZWZvcmUgdGhlIHJlYWwgbG9jayBh Y3F1aXNpdGlvbiBoYXBwZW5zLgorICoKKyAqIE9ubHkgb25lIGZ1dHVyZS13YWl0IHNsb3QgaXMg c3VwcG9ydGVkIHBlciBiYWNrZW5kLCBhbmQgcGFyYWxsZWwgd29ya2VycworICogKG5vbi1sZWFk ZXIgbG9jay1ncm91cCBtZW1iZXJzKSBjYW5ub3QgZGVjbGFyZSBhIGZ1dHVyZSB3YWl0LiAgUkVQ QUNLCisgKiBDT05DVVJSRU5UTFkgaXMgdGhlIG9ubHkgY3VycmVudCBjYWxsZXIgYW5kIHNhdGlz ZmllcyBib3RoIGNvbnN0cmFpbnRzLgorICovCit2b2lkCitMb2NrRGVjbGFyZUZ1dHVyZVdhaXQo Y29uc3QgTE9DS1RBRyAqbG9ja3RhZywgTE9DS01PREUgbG9ja21vZGUpCit7CisJdWludDMyCQlo YXNoY29kZTsKKwlMV0xvY2sJICAgKnBhcnRpdGlvbkxvY2s7CisKKwlBc3NlcnQoTXlQcm9jICE9 IE5VTEwpOworCUFzc2VydChNeVByb2MtPmxvY2tHcm91cExlYWRlciA9PSBOVUxMIHx8CisJCSAg IE15UHJvYy0+bG9ja0dyb3VwTGVhZGVyID09IE15UHJvYyk7CisJQXNzZXJ0KCFMb2NrSGVsZEJ5 TWUobG9ja3RhZywgbG9ja21vZGUsIHRydWUpKTsKKwlBc3NlcnQoRnV0dXJlV2FpdExvY2tJc0Vt cHR5KCZNeVByb2MtPmZ1dHVyZVdhaXRMb2NrKSk7CisKKwloYXNoY29kZSA9IExvY2tUYWdIYXNo Q29kZShsb2NrdGFnKTsKKwlwYXJ0aXRpb25Mb2NrID0gTG9ja0hhc2hQYXJ0aXRpb25Mb2NrKGhh c2hjb2RlKTsKKworCS8qCisJICogQnVtcCB0aGUgZmFzdC1wYXRoIG1pZ3JhdGlvbiBoaW50IGJl Zm9yZSBwdWJsaXNoaW5nIHRoZSBzbG90LiAgQQorCSAqIGNvbmN1cnJlbnQgQ2hlY2tEZWFkTG9j aygpIG1heSBzZWUgdGhlIGhpbnQgYmVmb3JlIHRoZSBzbG90IGlzIHZpc2libGUsCisJICogd2hp Y2ggaXMgaGFybWxlc3M7IHRoZSByZXZlcnNlIG9yZGVyaW5nIHdvdWxkIGFsbG93IGl0IHRvIG9i c2VydmUgYQorCSAqIGZ1dHVyZSBlZGdlIHdpdGhvdXQgbWlncmF0aW5nIGZhc3QtcGF0aCBob2xk ZXJzIGZvciB0aGF0IHJlbGF0aW9uLgorCSAqLworCWlmIChDb25mbGljdHNXaXRoUmVsYXRpb25G YXN0UGF0aChsb2NrdGFnLCBsb2NrbW9kZSkpCisJCXBnX2F0b21pY19mZXRjaF9hZGRfdTMyKCZG dXR1cmVXYWl0RmFzdFBhdGhDdGwtPmNvdW50LCAxKTsKKworCUxXTG9ja0FjcXVpcmUocGFydGl0 aW9uTG9jaywgTFdfRVhDTFVTSVZFKTsKKworCU15UHJvYy0+ZnV0dXJlV2FpdExvY2subG9ja3Rh ZyA9ICpsb2NrdGFnOworCU15UHJvYy0+ZnV0dXJlV2FpdExvY2subW9kZSA9IGxvY2ttb2RlOwor CisJTFdMb2NrUmVsZWFzZShwYXJ0aXRpb25Mb2NrKTsKK30KKworLyoKKyAqIExvY2tDbGVhckZ1 dHVyZVdhaXRTbG90IC0tIGNsZWFyIHRoaXMgYmFja2VuZCdzIGRlY2xhcmVkIGZ1dHVyZSB3YWl0 LCBpZiBhbnkuCisgKi8KK3ZvaWQKK0xvY2tDbGVhckZ1dHVyZVdhaXRTbG90KGJvb2wgcGFydGl0 aW9uTG9ja0hlbGQpCit7CisJTFdMb2NrCSAgICpwYXJ0aXRpb25Mb2NrOworCUxPQ0tUQUcJCWNs ZWFyZWRUYWc7CisJTE9DS01PREUJY2xlYXJlZE1vZGU7CisJYm9vbAkJY2xlYXJlZCA9IGZhbHNl OworCisJaWYgKE15UHJvYyA9PSBOVUxMIHx8IEZ1dHVyZVdhaXRMb2NrSXNFbXB0eSgmTXlQcm9j LT5mdXR1cmVXYWl0TG9jaykpCisJCXJldHVybjsKKworCXBhcnRpdGlvbkxvY2sgPQorCQlMb2Nr SGFzaFBhcnRpdGlvbkxvY2soTG9ja1RhZ0hhc2hDb2RlKCZNeVByb2MtPmZ1dHVyZVdhaXRMb2Nr LmxvY2t0YWcpKTsKKwlpZiAoIXBhcnRpdGlvbkxvY2tIZWxkKQorCQlMV0xvY2tBY3F1aXJlKHBh cnRpdGlvbkxvY2ssIExXX0VYQ0xVU0lWRSk7CisJZWxzZQorCQlBc3NlcnQoTFdMb2NrSGVsZEJ5 TWVJbk1vZGUocGFydGl0aW9uTG9jaywgTFdfRVhDTFVTSVZFKSk7CisKKwlpZiAoRnV0dXJlV2Fp dExvY2tJc1NldCgmTXlQcm9jLT5mdXR1cmVXYWl0TG9jaykpCisJeworCQljbGVhcmVkVGFnID0g TXlQcm9jLT5mdXR1cmVXYWl0TG9jay5sb2NrdGFnOworCQljbGVhcmVkTW9kZSA9IE15UHJvYy0+ ZnV0dXJlV2FpdExvY2subW9kZTsKKwkJTWVtU2V0KCZNeVByb2MtPmZ1dHVyZVdhaXRMb2NrLCAw LCBzaXplb2YoRnV0dXJlV2FpdExvY2spKTsKKwkJY2xlYXJlZCA9IHRydWU7CisJfQorCisJaWYg KCFwYXJ0aXRpb25Mb2NrSGVsZCkKKwkJTFdMb2NrUmVsZWFzZShwYXJ0aXRpb25Mb2NrKTsKKwor CWlmIChjbGVhcmVkICYmIENvbmZsaWN0c1dpdGhSZWxhdGlvbkZhc3RQYXRoKCZjbGVhcmVkVGFn LCBjbGVhcmVkTW9kZSkpCisJeworCQlBc3NlcnQocGdfYXRvbWljX3JlYWRfdTMyKCZGdXR1cmVX YWl0RmFzdFBhdGhDdGwtPmNvdW50KSA+IDApOworCQlwZ19hdG9taWNfZmV0Y2hfc3ViX3UzMigm RnV0dXJlV2FpdEZhc3RQYXRoQ3RsLT5jb3VudCwgMSk7CisJfQorfQorCisvKgorICogRnV0dXJl V2FpdExvY2t0YWdTbmFwc2hvdENvbnRhaW5zIC0tIGxpbmVhciBtZW1iZXJzaGlwIHRlc3Qgb3Zl ciBhCisgKiBsb2NrdGFnIHNuYXBzaG90LgorICoKKyAqIG4gaXMgYm91bmRlZCBieSB0aGUgbnVt YmVyIG9mIGRlY2xhcmVkIGZ1dHVyZSB3YWl0cyAoZWZmZWN0aXZlbHkgdGhlCisgKiBudW1iZXIg b2YgY29uY3VycmVudCBSRVBBQ0sgQ09OQ1VSUkVOVExZIGNvbW1hbmRzKSwgd2hpY2ggaW4gcHJh Y3RpY2UKKyAqIGlzIDAgb3IgMSwgc28gYSBsaW5lYXIgc2NhbiBpcyBjaGVhcGVyIHRoYW4gYnVp bGRpbmcgYSBoYXNoIG9yIGtlZXBpbmcKKyAqIHRoZSBhcnJheSBzb3J0ZWQuCisgKi8KK3N0YXRp YyBib29sCitGdXR1cmVXYWl0TG9ja3RhZ1NuYXBzaG90Q29udGFpbnMoTE9DS1RBRyAqbG9ja3Rh Z3MsIGludCBuLAorCQkJCQkJCQkgIGNvbnN0IExPQ0tUQUcgKmxvY2t0YWcpCit7CisJZm9yIChp bnQgaSA9IDA7IGkgPCBuOyBpKyspCisJeworCQlpZiAobWVtY21wKCZsb2NrdGFnc1tpXSwgbG9j a3RhZywgc2l6ZW9mKExPQ0tUQUcpKSA9PSAwKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0 dXJuIGZhbHNlOworfQorCisvKgorICogU25hcHNob3RGdXR1cmVXYWl0RmFzdFBhdGhMb2NrcyAt LSBjb3B5IHRoZSBjdXJyZW50IGZhc3QtcGF0aC1yZWxldmFudAorICogZnV0dXJlLXdhaXQgdGFn cyB3aGlsZSBhbGwgbG9jayBwYXJ0aXRpb25zIGFyZSBoZWxkLgorICoKKyAqIFRoZSBjYWxsZXIg aG9sZHMgZXZlcnkgbG9jay1tYW5hZ2VyIHBhcnRpdGlvbiBsb2NrIGV4Y2x1c2l2ZWx5LCBzbyB0 aGlzCisgKiBmdW5jdGlvbiBtdXN0IG5vdCB0YWtlIGFueSBMV0xvY2suICBwYWxsb2MgaXMgc2Fm ZSBoZXJlIGJlY2F1c2UgdGhlCisgKiBtZW1vcnkgY29udGV4dCBtYWNoaW5lcnkgZG9lcyBub3Qg dGFrZSBMV0xvY2tzOyBhIHBhbGxvYyBmYWlsdXJlIHdvdWxkCisgKiBlcmVwb3J0IG91dCBvZiB0 aGUgZGVhZGxvY2sgY2hlY2sgYnV0IG5vdCBkZWFkbG9jayBhZ2FpbnN0IGl0c2VsZi4KKyAqLwor c3RhdGljIExPQ0tUQUcgKgorU25hcHNob3RGdXR1cmVXYWl0RmFzdFBhdGhMb2NrcyhpbnQgKm91 dF9jb3VudCkKK3sKKwlMT0NLVEFHCSAgICpsb2NrdGFnczsKKwlpbnQJCQluID0gMDsKKworCSpv dXRfY291bnQgPSAwOworCisJbG9ja3RhZ3MgPSBwYWxsb2NfYXJyYXkoTE9DS1RBRywgUHJvY0ds b2JhbC0+YWxsUHJvY0NvdW50KTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgUHJvY0dsb2JhbC0+ YWxsUHJvY0NvdW50OyBpKyspCisJeworCQlQR1BST0MJICAgKnByb2MgPSBHZXRQR1Byb2NCeU51 bWJlcihpKTsKKwkJRnV0dXJlV2FpdExvY2sgKmZ1dHVyZVdhaXRMb2NrID0gJnByb2MtPmZ1dHVy ZVdhaXRMb2NrOworCisJCWlmICghRnV0dXJlV2FpdE5lZWRzRmFzdFBhdGhNaWdyYXRpb24oZnV0 dXJlV2FpdExvY2spKQorCQkJY29udGludWU7CisKKwkJQXNzZXJ0KExXTG9ja0hlbGRCeU1lSW5N b2RlKExvY2tIYXNoUGFydGl0aW9uTG9jaygKKwkJCQkJCQkJCQlMb2NrVGFnSGFzaENvZGUoJmZ1 dHVyZVdhaXRMb2NrLT5sb2NrdGFnKSksCisJCQkJCQkJCQlMV19FWENMVVNJVkUpKTsKKworCQlp ZiAoIUZ1dHVyZVdhaXRMb2NrdGFnU25hcHNob3RDb250YWlucyhsb2NrdGFncywgbiwKKwkJCQkJ CQkJCQkJICAgJmZ1dHVyZVdhaXRMb2NrLT5sb2NrdGFnKSkKKwkJeworCQkJQXNzZXJ0KG4gPCBQ cm9jR2xvYmFsLT5hbGxQcm9jQ291bnQpOworCQkJbG9ja3RhZ3NbbisrXSA9IGZ1dHVyZVdhaXRM b2NrLT5sb2NrdGFnOworCQl9CisJfQorCisJaWYgKG4gPT0gMCkKKwl7CisJCXBmcmVlKGxvY2t0 YWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKm91dF9jb3VudCA9IG47CisJcmV0dXJuIGxv Y2t0YWdzOworfQorCisvKgorICogTWlncmF0ZUZ1dHVyZVdhaXRGYXN0UGF0aExvY2tzIC0tIG1h a2UgZmFzdC1wYXRoIGhvbGRlcnMgdmlzaWJsZSB0byB0aGUKKyAqIGRlYWRsb2NrIGRldGVjdG9y IGZvciBjdXJyZW50bHkgZGVjbGFyZWQgZnV0dXJlIHdhaXRzLgorICoKKyAqIEZ1dHVyZS13YWl0 IGRlY2xhcmF0aW9ucyBkbyBub3QgdGFrZSBhIHJlYWwgc3Ryb25nIGxvY2sgeWV0LCBzbyB0aGV5 IGRvIG5vdAorICogdHJpZ2dlciB0aGUgbm9ybWFsIGZhc3QtcGF0aCB0cmFuc2ZlciBwZXJmb3Jt ZWQgYnkgTG9ja0FjcXVpcmVFeHRlbmRlZCgpLgorICogVGhpcyBoZWxwZXIgdGFrZXMgYSBzbmFw c2hvdCBvZiBjdXJyZW50IGZhc3QtcGF0aC1yZWxldmFudCBmdXR1cmUgd2FpdHMsCisgKiBpbnN0 YWxscyB0ZW1wb3Jhcnkgc3Ryb25nLWxvY2sgY291bnRlciBidW1wcyBmb3IgdGhvc2UgcmVsYXRp b24gaGFzaAorICogcGFydGl0aW9ucywgYW5kIHRyYW5zZmVycyBleGlzdGluZyBmYXN0LXBhdGgg aG9sZGVycyBvZiB0aG9zZSByZWxhdGlvbnMKKyAqIGludG8gdGhlIG1haW4gbG9jayB0YWJsZS4K KyAqCisgKiBUaGUgcmV0dXJuZWQgc25hcHNob3QgbXVzdCByZW1haW4gYWN0aXZlIHVudGlsIENo ZWNrRGVhZExvY2soKSBoYXMgZmluaXNoZWQKKyAqIGl0cyBwYXJ0aXRpb24tbG9ja2VkIGdyYXBo IHdhbGsuICBOZXcgZmFzdC1wYXRoIGhvbGRlcnMgY2Fubm90IGFwcGVhciBmb3IKKyAqIG1pZ3Jh dGVkIHRhZ3Mgd2hpbGUgdGhlIHRlbXBvcmFyeSBzdHJvbmctbG9jayBjb3VudGVyIGJ1bXBzIGFy ZSBhY3RpdmUuICBJZgorICogYSBuZXcgZnV0dXJlLXdhaXQgdGFnIGFwcGVhcnMgYWZ0ZXIgdGhp cyBzbmFwc2hvdCwgQ2hlY2tEZWFkTG9jaygpIGRldGVjdHMKKyAqIHRoYXQgd2l0aCBGdXR1cmVX YWl0RmFzdFBhdGhTbmFwc2hvdENvdmVyc0N1cnJlbnRMb2NrcygpIGFuZCByZXRyaWVzLgorICov CitMT0NLVEFHICoKK01pZ3JhdGVGdXR1cmVXYWl0RmFzdFBhdGhMb2NrcyhpbnQgKm91dF9jb3Vu dCkKK3sKKwlMb2NrTWV0aG9kCWxvY2tNZXRob2RUYWJsZSA9IExvY2tNZXRob2RzW0RFRkFVTFRf TE9DS01FVEhPRF07CisJTE9DS1RBRwkgICAqbG9ja3RhZ3M7CisJaW50CQkJbjsKKworCSpvdXRf Y291bnQgPSAwOworCisJLyogQ2hlYXAgcGF0aDogbm8gYWN0aXZlIGRlY2xhcmF0aW9uIGNhbiBp bnZvbHZlIGZhc3QtcGF0aCBob2xkZXJzLiAqLworCWlmIChwZ19hdG9taWNfcmVhZF91MzIoJkZ1 dHVyZVdhaXRGYXN0UGF0aEN0bC0+Y291bnQpID09IDApCisJCXJldHVybiBOVUxMOworCisJZm9y IChpbnQgaSA9IDA7IGkgPCBOVU1fTE9DS19QQVJUSVRJT05TOyBpKyspCisJCUxXTG9ja0FjcXVp cmUoTG9ja0hhc2hQYXJ0aXRpb25Mb2NrQnlJbmRleChpKSwgTFdfRVhDTFVTSVZFKTsKKworCWxv Y2t0YWdzID0gU25hcHNob3RGdXR1cmVXYWl0RmFzdFBhdGhMb2Nrcygmbik7CisKKwlmb3IgKGlu dCBpID0gTlVNX0xPQ0tfUEFSVElUSU9OUzsgLS1pID49IDA7KQorCQlMV0xvY2tSZWxlYXNlKExv Y2tIYXNoUGFydGl0aW9uTG9ja0J5SW5kZXgoaSkpOworCisJaWYgKGxvY2t0YWdzID09IE5VTEwp CisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBCbG9jayBuZXcgZmFzdC1wYXRoIGFjcXVpc2l0 aW9ucyBmb3IgdGhpcyBzbmFwc2hvdCBiZWZvcmUgdHJhbnNmZXJyaW5nCisJICogZXhpc3Rpbmcg aG9sZGVycyB0byB0aGUgbWFpbiB0YWJsZS4KKwkgKi8KKwlTcGluTG9ja0FjcXVpcmUoJkZhc3RQ YXRoU3Ryb25nUmVsYXRpb25Mb2Nrcy0+bXV0ZXgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbjsg aSsrKQorCXsKKwkJdWludDMyCQloYXNoY29kZSA9IExvY2tUYWdIYXNoQ29kZSgmbG9ja3RhZ3Nb aV0pOworCQl1aW50MzIJCWZhc3RoYXNoY29kZSA9IEZhc3RQYXRoU3Ryb25nTG9ja0hhc2hQYXJ0 aXRpb24oaGFzaGNvZGUpOworCisJCUZhc3RQYXRoU3Ryb25nUmVsYXRpb25Mb2Nrcy0+Y291bnRb ZmFzdGhhc2hjb2RlXSsrOworCX0KKwlTcGluTG9ja1JlbGVhc2UoJkZhc3RQYXRoU3Ryb25nUmVs YXRpb25Mb2Nrcy0+bXV0ZXgpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJewor CQl1aW50MzIJCWhhc2hjb2RlID0gTG9ja1RhZ0hhc2hDb2RlKCZsb2NrdGFnc1tpXSk7CisKKwkJ aWYgKCFGYXN0UGF0aFRyYW5zZmVyUmVsYXRpb25Mb2Nrcyhsb2NrTWV0aG9kVGFibGUsICZsb2Nr dGFnc1tpXSwKKwkJCQkJCQkJCQkgICBoYXNoY29kZSkpCisJCXsKKwkJCVNwaW5Mb2NrQWNxdWly ZSgmRmFzdFBhdGhTdHJvbmdSZWxhdGlvbkxvY2tzLT5tdXRleCk7CisJCQlmb3IgKGludCBqID0g MDsgaiA8IG47IGorKykKKwkJCXsKKwkJCQl1aW50MzIJCXJlc3RvcmVoYXNoY29kZSA9IExvY2tU YWdIYXNoQ29kZSgmbG9ja3RhZ3Nbal0pOworCQkJCXVpbnQzMgkJcmVzdG9yZWZhc3RoYXNoY29k ZSA9CisJCQkJCUZhc3RQYXRoU3Ryb25nTG9ja0hhc2hQYXJ0aXRpb24ocmVzdG9yZWhhc2hjb2Rl KTsKKworCQkJCUFzc2VydChGYXN0UGF0aFN0cm9uZ1JlbGF0aW9uTG9ja3MtPmNvdW50W3Jlc3Rv cmVmYXN0aGFzaGNvZGVdCisJCQkJCSAgID4gMCk7CisJCQkJRmFzdFBhdGhTdHJvbmdSZWxhdGlv bkxvY2tzLT5jb3VudFtyZXN0b3JlZmFzdGhhc2hjb2RlXS0tOworCQkJfQorCQkJU3BpbkxvY2tS ZWxlYXNlKCZGYXN0UGF0aFN0cm9uZ1JlbGF0aW9uTG9ja3MtPm11dGV4KTsKKwkJCXBmcmVlKGxv Y2t0YWdzKTsKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfT1VUX09G X01FTU9SWSksCisJCQkJCSBlcnJtc2coIm91dCBvZiBzaGFyZWQgbWVtb3J5IiksCisJCQkJCSBl cnJoaW50KCJZb3UgbWlnaHQgbmVlZCB0byBpbmNyZWFzZSBcIiVzXCIuIiwgIm1heF9sb2Nrc19w ZXJfdHJhbnNhY3Rpb24iKSkpOworCQl9CisJfQorCisJKm91dF9jb3VudCA9IG47CisJcmV0dXJu IGxvY2t0YWdzOworfQorCisvKgorICogRnV0dXJlV2FpdEZhc3RQYXRoU25hcHNob3RDb3ZlcnND dXJyZW50TG9ja3MgLS0gZG9lcyB0aGUgYWN0aXZlIHNuYXBzaG90CisgKiBjb3ZlciBhbGwgZmFz dC1wYXRoLXJlbGV2YW50IGZ1dHVyZSB3YWl0cyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgZGVh ZGxvY2sKKyAqIGRldGVjdG9yPworICoKKyAqIENhbGxlciBtdXN0IGhvbGQgYWxsIGxvY2sgcGFy dGl0aW9ucy4gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgYSBkZWNsYXJhdGlvbgorICogcmFjZWQg d2l0aCB0aGUgcHJldmlvdXMgc25hcHNob3QgYW5kIENoZWNrRGVhZExvY2soKSBtdXN0IHJldHJ5 IG1pZ3JhdGlvbgorICogYmVmb3JlIHdhbGtpbmcgdGhlIHdhaXRzLWZvciBncmFwaC4KKyAqLwor Ym9vbAorRnV0dXJlV2FpdEZhc3RQYXRoU25hcHNob3RDb3ZlcnNDdXJyZW50TG9ja3MoTE9DS1RB RyAqbG9ja3RhZ3MsIGludCBuKQoreworCS8qCisJICogV2l0aCBubyBzbmFwc2hvdCBhbmQgbm8g aW4tcHJvZ3Jlc3MgZmFzdC1wYXRoLXJlbGV2YW50IGRlY2xhcmF0aW9uLAorCSAqIHRoZXJlIGNh bm5vdCBiZSBhbnl0aGluZyB0byB2YWxpZGF0ZS4gIElmIHRoZSBjb3VudGVyIGlzIG5vbnplcm8s IHN0aWxsCisJICogc2NhbjogYSBkZWNsYXJhdGlvbiBtYXkgaGF2ZSBpbmNyZW1lbnRlZCB0aGUg Y291bnRlciBiZWZvcmUgcHVibGlzaGluZworCSAqIGl0cyBzbG90LCBjYXVzaW5nIHRoZSBzbmFw c2hvdCB0byBiZSBlbXB0eS4KKwkgKi8KKwlpZiAobG9ja3RhZ3MgPT0gTlVMTCAmJgorCQlwZ19h dG9taWNfcmVhZF91MzIoJkZ1dHVyZVdhaXRGYXN0UGF0aEN0bC0+Y291bnQpID09IDApCisJCXJl dHVybiB0cnVlOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCBQcm9jR2xvYmFsLT5hbGxQcm9jQ291 bnQ7IGkrKykKKwl7CisJCVBHUFJPQwkgICAqcHJvYyA9IEdldFBHUHJvY0J5TnVtYmVyKGkpOwor CQlGdXR1cmVXYWl0TG9jayAqZnV0dXJlV2FpdExvY2sgPSAmcHJvYy0+ZnV0dXJlV2FpdExvY2s7 CisKKwkJaWYgKCFGdXR1cmVXYWl0TmVlZHNGYXN0UGF0aE1pZ3JhdGlvbihmdXR1cmVXYWl0TG9j aykpCisJCQljb250aW51ZTsKKworCQlBc3NlcnQoTFdMb2NrSGVsZEJ5TWVJbk1vZGUoTG9ja0hh c2hQYXJ0aXRpb25Mb2NrKAorCQkJCQkJCQkJCUxvY2tUYWdIYXNoQ29kZSgmZnV0dXJlV2FpdExv Y2stPmxvY2t0YWcpKSwKKwkJCQkJCQkJCUxXX0VYQ0xVU0lWRSkpOworCisJCWlmICghRnV0dXJl V2FpdExvY2t0YWdTbmFwc2hvdENvbnRhaW5zKGxvY2t0YWdzLCBuLAorCQkJCQkJCQkJCQkgICAm ZnV0dXJlV2FpdExvY2stPmxvY2t0YWcpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVy biB0cnVlOworfQorCisvKgorICogUmVzdG9yZUZ1dHVyZVdhaXRGYXN0UGF0aFNuYXBzaG90IC0t IHVuZG8gdGhlIGZhc3QtcGF0aCBzdHJvbmctbG9jayBjb3VudGVyCisgKiBidW1wcyBmb3IgYSBz bmFwc2hvdCByZXR1cm5lZCBieSBNaWdyYXRlRnV0dXJlV2FpdEZhc3RQYXRoTG9ja3MoKS4KKyAq CisgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBDaGVja0RlYWRMb2NrKCkgaGFzIHJlbGVhc2VkIGFs bCBwYXJ0aXRpb24gbG9ja3MuCisgKi8KK3ZvaWQKK1Jlc3RvcmVGdXR1cmVXYWl0RmFzdFBhdGhT bmFwc2hvdChMT0NLVEFHICpsb2NrdGFncywgaW50IG4pCit7CisJaWYgKGxvY2t0YWdzID09IE5V TEwpCisJCXJldHVybjsKKworCVNwaW5Mb2NrQWNxdWlyZSgmRmFzdFBhdGhTdHJvbmdSZWxhdGlv bkxvY2tzLT5tdXRleCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJeworCQl1aW50 MzIJCWhhc2hjb2RlID0gTG9ja1RhZ0hhc2hDb2RlKCZsb2NrdGFnc1tpXSk7CisJCXVpbnQzMgkJ ZmFzdGhhc2hjb2RlID0gRmFzdFBhdGhTdHJvbmdMb2NrSGFzaFBhcnRpdGlvbihoYXNoY29kZSk7 CisKKwkJQXNzZXJ0KEZhc3RQYXRoU3Ryb25nUmVsYXRpb25Mb2Nrcy0+Y291bnRbZmFzdGhhc2hj b2RlXSA+IDApOworCQlGYXN0UGF0aFN0cm9uZ1JlbGF0aW9uTG9ja3MtPmNvdW50W2Zhc3RoYXNo Y29kZV0tLTsKKwl9CisJU3BpbkxvY2tSZWxlYXNlKCZGYXN0UGF0aFN0cm9uZ1JlbGF0aW9uTG9j a3MtPm11dGV4KTsKKworCXBmcmVlKGxvY2t0YWdzKTsKK30KKwogLyoKICAqIExvY2tIZWxkQnlN ZSAtLSB0ZXN0IHdoZXRoZXIgbG9jayAnbG9ja3RhZycgaXMgaGVsZCBieSB0aGUgY3VycmVudAog ICoJCXRyYW5zYWN0aW9uCkBAIC05MzcsNiArMTMyNCw4IEBAIExvY2tBY3F1aXJlRXh0ZW5kZWQo Y29uc3QgTE9DS1RBRyAqbG9ja3RhZywKIAkgKi8KIAlpZiAobG9jYWxsb2NrLT5uTG9ja3MgPiAw KQogCXsKKwkJQXNzZXJ0KCFGdXR1cmVXYWl0TG9ja01hdGNoZXMoJk15UHJvYy0+ZnV0dXJlV2Fp dExvY2ssIGxvY2t0YWcsCisJCQkJCQkJCQkgIGxvY2ttb2RlKSk7CiAJCUdyYW50TG9ja0xvY2Fs KGxvY2FsbG9jaywgb3duZXIpOwogCQlpZiAobG9jYWxsb2NrLT5sb2NrQ2xlYXJlZCkKIAkJCXJl dHVybiBMT0NLQUNRVUlSRV9BTFJFQURZX0NMRUFSOwpAQCAtMTAxMiw2ICsxNDAxLDcgQEAgTG9j a0FjcXVpcmVFeHRlbmRlZChjb25zdCBMT0NLVEFHICpsb2NrdGFnLAogCQkJCSAqLwogCQkJCWxv Y2FsbG9jay0+bG9jayA9IE5VTEw7CiAJCQkJbG9jYWxsb2NrLT5wcm9jbG9jayA9IE5VTEw7CisJ CQkJTG9ja0NsZWFyRnV0dXJlV2FpdFNsb3RJZk1hdGNoKGxvY2t0YWcsIGxvY2ttb2RlLCBmYWxz ZSk7CiAJCQkJR3JhbnRMb2NrTG9jYWwobG9jYWxsb2NrLCBvd25lcik7CiAJCQkJcmV0dXJuIExP Q0tBQ1FVSVJFX09LOwogCQkJfQpAQCAtMTIyNSw2ICsxNjE1LDIwIEBAIExvY2tBY3F1aXJlRXh0 ZW5kZWQoY29uc3QgTE9DS1RBRyAqbG9ja3RhZywKIAkJQXNzZXJ0KCFkb250V2FpdCk7CiAJCVBS T0NMT0NLX1BSSU5UKCJMb2NrQWNxdWlyZTogc2xlZXBpbmcgb24gbG9jayIsIHByb2Nsb2NrKTsK IAkJTE9DS19QUklOVCgiTG9ja0FjcXVpcmU6IHNsZWVwaW5nIG9uIGxvY2siLCBsb2NrLCBsb2Nr bW9kZSk7CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhdHRhY2hlZCB3YWl0TGluayBhbmQgYXJlIGFi b3V0IHRvIHNsZWVwIG9uIGV4YWN0bHkgdGhlCisJCSAqIChsb2NrdGFnLCBsb2NrbW9kZSkgd2Ug aGFkIGRlY2xhcmVkIGFzIGEgZnV0dXJlIHdhaXQuICBSZW1vdGUKKwkJICogd2Fsa2VycyB3aWxs IG5vdyBzZWUgdXMgYXMgYSByZWFsIHdhaXRlciBvbiB0aGlzIGxvY2ssIGFuZAorCQkgKiBGaW5k TG9ja0N5Y2xlUmVjdXJzZVdhaXQoKSB3aWxsIHNjYW4gbG9jay0+cHJvY0xvY2tzIHdpdGggdGhl IHNhbWUKKwkJICogY29uZmxpY3RNYXNrIHRoZSBmdXR1cmUgd2Fsa2VyIHdvdWxkIGhhdmUgdXNl ZC4gIENsZWFyaW5nIHRoZQorCQkgKiBmdXR1cmUgc2xvdCBub3csIHdoaWxlIHdlIHN0aWxsIGhv bGQgdGhlIHBhcnRpdGlvbiBsb2NrLCBrZWVwcworCQkgKiB0aGUgaW52YXJpYW50ICJmdXR1cmUg c2xvdCBzZXQgbWVhbnMgbm90IHlldCByZWFsbHkgd2FpdGluZyBmb3IgdGhlCisJCSAqIHNhbWUg bG9jayBhbmQgbW9kZSIgYW5kIHJlbW92ZXMgZHVwbGljYXRlIHdvcmsgZnJvbSB0aGUgZGVhZGxv Y2sKKwkJICogZGV0ZWN0b3IuCisJCSAqLworCQlMb2NrQ2xlYXJGdXR1cmVXYWl0U2xvdElmTWF0 Y2gobG9ja3RhZywgbG9ja21vZGUsIHRydWUpOworCiAJCUxXTG9ja1JlbGVhc2UocGFydGl0aW9u TG9jayk7CiAKIAkJd2FpdFJlc3VsdCA9IFdhaXRPbkxvY2sobG9jYWxsb2NrLCBvd25lcik7CkBA IC0xMjQ3LDcgKzE2NTEsMTAgQEAgTG9ja0FjcXVpcmVFeHRlbmRlZChjb25zdCBMT0NLVEFHICps b2NrdGFnLAogCQl9CiAJfQogCWVsc2UKKwl7CisJCUxvY2tDbGVhckZ1dHVyZVdhaXRTbG90SWZN YXRjaChsb2NrdGFnLCBsb2NrbW9kZSwgdHJ1ZSk7CiAJCUxXTG9ja1JlbGVhc2UocGFydGl0aW9u TG9jayk7CisJfQogCUFzc2VydCh3YWl0UmVzdWx0ID09IFBST0NfV0FJVF9TVEFUVVNfT0spOwog CiAJLyogVGhlIGxvY2sgd2FzIGdyYW50ZWQgdG8gdXMuICBVcGRhdGUgdGhlIGxvY2FsIGxvY2sg ZW50cnkgYWNjb3JkaW5nbHkgKi8KQEAgLTIzMjgsNiArMjczNSw5IEBAIExvY2tSZWxlYXNlQWxs KExPQ0tNRVRIT0RJRCBsb2NrbWV0aG9kaWQsIGJvb2wgYWxsTG9ja3MpCiAJCWVsb2coRVJST1Is ICJ1bnJlY29nbml6ZWQgbG9jayBtZXRob2Q6ICVkIiwgbG9ja21ldGhvZGlkKTsKIAlsb2NrTWV0 aG9kVGFibGUgPSBMb2NrTWV0aG9kc1tsb2NrbWV0aG9kaWRdOwogCisJaWYgKGxvY2ttZXRob2Rp ZCA9PSBERUZBVUxUX0xPQ0tNRVRIT0QpCisJCUxvY2tDbGVhckZ1dHVyZVdhaXRTbG90KGZhbHNl KTsKKwogI2lmZGVmIExPQ0tfREVCVUcKIAlpZiAoKihsb2NrTWV0aG9kVGFibGUtPnRyYWNlX2Zs YWcpKQogCQllbG9nKExPRywgIkxvY2tSZWxlYXNlQWxsOiBsb2NrbWV0aG9kPSVkIiwgbG9ja21l dGhvZGlkKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcm9jLmMgYi9z cmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5jCmluZGV4IDFhYzI1MDY4ZDYyLi5iNmI5ZGUy ZDUxYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL3Byb2MuYworKysgYi9z cmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5jCkBAIC00OTQsNiArNDk0LDcgQEAgSW5pdFBy b2Nlc3Modm9pZCkKIAlNeVByb2MtPndhaXRMb2NrID0gTlVMTDsKIAlkbGlzdF9ub2RlX2luaXQo Jk15UHJvYy0+d2FpdExpbmspOwogCU15UHJvYy0+d2FpdFByb2NMb2NrID0gTlVMTDsKKwlNZW1T ZXQoJk15UHJvYy0+ZnV0dXJlV2FpdExvY2ssIDAsIHNpemVvZihGdXR1cmVXYWl0TG9jaykpOwog CXBnX2F0b21pY193cml0ZV91NjQoJk15UHJvYy0+d2FpdFN0YXJ0LCAwKTsKICNpZmRlZiBVU0Vf QVNTRVJUX0NIRUNLSU5HCiAJewpAQCAtNjkxLDYgKzY5Miw3IEBAIEluaXRBdXhpbGlhcnlQcm9j ZXNzKHZvaWQpCiAJTXlQcm9jLT53YWl0TG9jayA9IE5VTEw7CiAJZGxpc3Rfbm9kZV9pbml0KCZN eVByb2MtPndhaXRMaW5rKTsKIAlNeVByb2MtPndhaXRQcm9jTG9jayA9IE5VTEw7CisJTWVtU2V0 KCZNeVByb2MtPmZ1dHVyZVdhaXRMb2NrLCAwLCBzaXplb2YoRnV0dXJlV2FpdExvY2spKTsKIAlw Z19hdG9taWNfd3JpdGVfdTY0KCZNeVByb2MtPndhaXRTdGFydCwgMCk7CiAjaWZkZWYgVVNFX0FT U0VSVF9DSEVDS0lORwogCXsKQEAgLTgyNCw2ICs4MjYsNyBAQCBMb2NrRXJyb3JDbGVhbnVwKHZv aWQpCiAJSE9MRF9JTlRFUlJVUFRTKCk7CiAKIAlBYm9ydFN0cm9uZ0xvY2tBY3F1aXJlKCk7CisJ TG9ja0NsZWFyRnV0dXJlV2FpdFNsb3QoZmFsc2UpOwogCiAJLyogTm90aGluZyB0byBkbyBpZiB3 ZSB3ZXJlbid0IHdhaXRpbmcgZm9yIGEgbG9jayAqLwogCWxvY2tBd2FpdGVkID0gR2V0QXdhaXRl ZExvY2soKTsKQEAgLTkzNCw2ICs5MzcsNyBAQCBQcm9jS2lsbChpbnQgY29kZSwgRGF0dW0gYXJn KQogCiAJLyogTWFrZSBzdXJlIHdlJ3JlIG91dCBvZiB0aGUgc3luYyByZXAgbGlzdHMgKi8KIAlT eW5jUmVwQ2xlYW51cEF0UHJvY0V4aXQoKTsKKwlMb2NrQ2xlYXJGdXR1cmVXYWl0U2xvdChmYWxz ZSk7CiAKICNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCiAJewpAQCAtMTgyNCw2ICsxODI4LDE3 IEBAIENoZWNrRGVhZExvY2sodm9pZCkKIHsKIAlpbnQJCQlpOwogCURlYWRMb2NrU3RhdGUgcmVz dWx0OworCUxPQ0tUQUcJICAgKmZ1dHVyZUxvY2tzOworCWludAkJCWZ1dHVyZUxvY2tDb3VudCA9 IDA7CisKK3JldHJ5OgorCS8qCisJICogTWlncmF0ZSBmYXN0LXBhdGggaG9sZGVycyBmb3IgcmVs YXRpb24gbG9ja3MgbmFtZWQgYnkgZGVjbGFyZWQKKwkgKiBmdXR1cmUtd2FpdCBkZWNsYXJhdGlv bnMuICBUaGUgaGVscGVyIHRha2VzIGFuZCByZWxlYXNlcyBsb2NrCisJICogcGFydGl0aW9ucyBp bnRlcm5hbGx5IHdoaWxlIHRha2luZyBpdHMgc25hcHNob3QsIHNvIGl0IG11c3QgcnVuIGJlZm9y ZQorCSAqIHRoaXMgcm91dGluZSBmcmVlemVzIHRoZSBsb2NrIHRhYmxlIGZvciB0aGUgcmVhbCBk ZWFkbG9jayBjaGVjay4KKwkgKi8KKwlmdXR1cmVMb2NrcyA9IE1pZ3JhdGVGdXR1cmVXYWl0RmFz dFBhdGhMb2NrcygmZnV0dXJlTG9ja0NvdW50KTsKIAogCS8qCiAJICogQWNxdWlyZSBleGNsdXNp dmUgbG9jayBvbiB0aGUgZW50aXJlIHNoYXJlZCBsb2NrIGRhdGEgc3RydWN0dXJlcy4gTXVzdApA QCAtMTgzOCw2ICsxODUzLDI1IEBAIENoZWNrRGVhZExvY2sodm9pZCkKIAlmb3IgKGkgPSAwOyBp IDwgTlVNX0xPQ0tfUEFSVElUSU9OUzsgaSsrKQogCQlMV0xvY2tBY3F1aXJlKExvY2tIYXNoUGFy dGl0aW9uTG9ja0J5SW5kZXgoaSksIExXX0VYQ0xVU0lWRSk7CiAKKwkvKgorCSAqIEEgZnV0dXJl LXdhaXQgZGVjbGFyYXRpb24gY2FuIGFwcGVhciBhZnRlciB0aGUgbWlncmF0aW9uIHNuYXBzaG90 IGJ1dAorCSAqIGJlZm9yZSB0aGlzIHBhcnRpdGlvbi1sb2NrZWQgZ3JhcGggd2Fsay4gIElmIHNv LCByZWxlYXNlIHRoZSB0ZW1wb3JhcnkKKwkgKiBzdHJvbmctbG9jayBjb3VudHMgYW5kIHJldHJ5 LCBzbyB0aGUgbmV3bHkgdmlzaWJsZSBmdXR1cmUgZWRnZSBjYW5ub3QKKwkgKiBtaXNzIGhvbGRl cnMgdGhhdCBhcmUgc3RpbGwgaW4gZmFzdC1wYXRoIGFycmF5cy4KKwkgKgorCSAqIEluIHRoZW9y eSBhIHN0cmVhbSBvZiBjb25jdXJyZW50IGRlY2xhcmF0aW9ucyBjb3VsZCBmb3JjZSByZXBlYXRl ZAorCSAqIHJldHJpZXMsIGJ1dCBpbiBwcmFjdGljZSBmdXR1cmUtd2FpdCBkZWNsYXJhdGlvbnMg YXJlIGlzc3VlZCBvbmx5IGJ5CisJICogUkVQQUNLIENPTkNVUlJFTlRMWSBhbmQgYXJlIHJhcmUs IHNvIHRoZSBsb29wIHRlcm1pbmF0ZXMgcXVpY2tseS4KKwkgKi8KKwlpZiAoIUZ1dHVyZVdhaXRG YXN0UGF0aFNuYXBzaG90Q292ZXJzQ3VycmVudExvY2tzKGZ1dHVyZUxvY2tzLAorCQkJCQkJCQkJ CQkJCSAgZnV0dXJlTG9ja0NvdW50KSkKKwl7CisJCWZvciAoaSA9IE5VTV9MT0NLX1BBUlRJVElP TlM7IC0taSA+PSAwOykKKwkJCUxXTG9ja1JlbGVhc2UoTG9ja0hhc2hQYXJ0aXRpb25Mb2NrQnlJ bmRleChpKSk7CisJCVJlc3RvcmVGdXR1cmVXYWl0RmFzdFBhdGhTbmFwc2hvdChmdXR1cmVMb2Nr cywgZnV0dXJlTG9ja0NvdW50KTsKKwkJZ290byByZXRyeTsKKwl9CisKIAkvKgogCSAqIENoZWNr IHRvIHNlZSBpZiB3ZSd2ZSBiZWVuIGF3b2tlbiBieSBhbnlvbmUgaW4gdGhlIGludGVyaW0uCiAJ ICoKQEAgLTE5MDIsNiArMTkzNiw4IEBAIGNoZWNrX2RvbmU6CiAJZm9yIChpID0gTlVNX0xPQ0tf UEFSVElUSU9OUzsgLS1pID49IDA7KQogCQlMV0xvY2tSZWxlYXNlKExvY2tIYXNoUGFydGl0aW9u TG9ja0J5SW5kZXgoaSkpOwogCisJUmVzdG9yZUZ1dHVyZVdhaXRGYXN0UGF0aFNuYXBzaG90KGZ1 dHVyZUxvY2tzLCBmdXR1cmVMb2NrQ291bnQpOworCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvdGFibGVjbWRzLmggYi9zcmMvaW5jbHVkZS9j b21tYW5kcy90YWJsZWNtZHMuaAppbmRleCBjM2Q4NTE4Y2I2Mi4uNjQ4NDM1ZWI2MTggMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oCisrKyBiL3NyYy9pbmNsdWRl L2NvbW1hbmRzL3RhYmxlY21kcy5oCkBAIC0xMDIsNiArMTAyLDkgQEAgZXh0ZXJuIHZvaWQgQXRF T1N1YlhhY3Rfb25fY29tbWl0X2FjdGlvbnMoYm9vbCBpc0NvbW1pdCwKIGV4dGVybiB2b2lkIFJh bmdlVmFyQ2FsbGJhY2tNYWludGFpbnNUYWJsZShjb25zdCBSYW5nZVZhciAqcmVsYXRpb24sCiAJ CQkJCQkJCQkJICAgT2lkIHJlbElkLCBPaWQgb2xkUmVsSWQsCiAJCQkJCQkJCQkJICAgdm9pZCAq YXJnKTsKK2V4dGVybiB2b2lkIFJhbmdlVmFyQ2FsbGJhY2tGb3JSZXBhY2soY29uc3QgUmFuZ2VW YXIgKnJlbGF0aW9uLAorCQkJCQkJCQkJICBPaWQgcmVsSWQsIE9pZCBvbGRSZWxJZCwKKwkJCQkJ CQkJCSAgdm9pZCAqYXJnKTsKIAogZXh0ZXJuIHZvaWQgUmFuZ2VWYXJDYWxsYmFja093bnNSZWxh dGlvbihjb25zdCBSYW5nZVZhciAqcmVsYXRpb24sCiAJCQkJCQkJCQkJIE9pZCByZWxJZCwgT2lk IG9sZFJlbElkLCB2b2lkICphcmcpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9s bWdyLmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2xtZ3IuaAppbmRleCAyYTk4NWNlNWUxNS4uYjMw MWVkYWZiMzEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbG1nci5oCisrKyBiL3Ny Yy9pbmNsdWRlL3N0b3JhZ2UvbG1nci5oCkBAIC01MSw2ICs1MSw4IEBAIGV4dGVybiBib29sIENo ZWNrUmVsYXRpb25Mb2NrZWRCeU1lKFJlbGF0aW9uIHJlbGF0aW9uLCBMT0NLTU9ERSBsb2NrbW9k ZSwKIGV4dGVybiBib29sIENoZWNrUmVsYXRpb25PaWRMb2NrZWRCeU1lKE9pZCByZWxpZCwgTE9D S01PREUgbG9ja21vZGUsCiAJCQkJCQkJCQkgICBib29sIG9yc3Ryb25nZXIpOwogZXh0ZXJuIGJv b2wgTG9ja0hhc1dhaXRlcnNSZWxhdGlvbihSZWxhdGlvbiByZWxhdGlvbiwgTE9DS01PREUgbG9j a21vZGUpOworZXh0ZXJuIHZvaWQgTG9ja0RlY2xhcmVGdXR1cmVXYWl0KGNvbnN0IExPQ0tUQUcg KmxvY2t0YWcsIExPQ0tNT0RFIGxvY2ttb2RlKTsKK2V4dGVybiB2b2lkIExvY2tDbGVhckZ1dHVy ZVdhaXRTbG90KGJvb2wgcGFydGl0aW9uTG9ja0hlbGQpOwogCiBleHRlcm4gdm9pZCBMb2NrUmVs YXRpb25JZEZvclNlc3Npb24oTG9ja1JlbElkICpyZWxpZCwgTE9DS01PREUgbG9ja21vZGUpOwog ZXh0ZXJuIHZvaWQgVW5sb2NrUmVsYXRpb25JZEZvclNlc3Npb24oTG9ja1JlbElkICpyZWxpZCwg TE9DS01PREUgbG9ja21vZGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9sb2Nr LmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2xvY2suaAppbmRleCBlZTNjYjFkYzIwMy4uZGNhNWEz ZDMzZDYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbG9jay5oCisrKyBiL3NyYy9p bmNsdWRlL3N0b3JhZ2UvbG9jay5oCkBAIC0yNzUsNiArMjc1LDMwIEBAIHR5cGVkZWYgc3RydWN0 IExPQ0FMTE9DSwogI2RlZmluZSBMT0NBTExPQ0tfTE9DS1RBRyhsbG9jaykgKChMb2NrVGFnVHlw ZSkgKGxsb2NrKS50YWcubG9jay5sb2NrdGFnX3R5cGUpCiAKIAorLyoKKyAqIERlY2xhcmVkICJm dXR1cmUgd2FpdCIgZm9yIGEgbG9jayB0aGUgYmFja2VuZCBpbnRlbmRzIHRvIGFjcXVpcmUgbGF0 ZXIuCisgKgorICogQSBwcm9jZXNzIG1heSBwdWJsaXNoIGl0cyBpbnRlbnQgdG8gYWNxdWlyZSBh IHBhcnRpY3VsYXIgbG9jayBtb2RlIG9uIGEKKyAqIHBhcnRpY3VsYXIgbG9ja3RhZyBiZWZvcmUg YWN0dWFsbHkgY2FsbGluZyBMb2NrQWNxdWlyZSgpLiAgVGhlIGRlYWRsb2NrCisgKiBkZXRlY3Rv ciB0cmVhdHMgYSBwb3B1bGF0ZWQgc2xvdCBhcyBhIGhhcmQgd2FpdHMtZm9yIGVkZ2UgZnJvbSB0 aGUKKyAqIGRlY2xhcmVyIHRvIGV2ZXJ5IGN1cnJlbnQgaG9sZGVyIHdob3NlIG1vZGUgY29uZmxp Y3RzIHdpdGggLm1vZGUuICBUaGUKKyAqIHNsb3QgaXMgZW1wdHkgd2hlbiBsb2NrdGFnLmxvY2t0 YWdfbG9ja21ldGhvZGlkID09IDAuCisgKgorICogR3JvdXBlZCBpbiBhIHN0cnVjdCBzbyBhIGZ1 dHVyZSBjaGFuZ2UgY2FuIHR1cm4gdGhlIHNsb3QgaW50byBhIHNob3J0CisgKiBsaXN0IHdpdGhv dXQgdG91Y2hpbmcgZXZlcnkgcmVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBGdXR1cmVXYWl0 TG9jaworeworCUxPQ0tUQUcJCWxvY2t0YWc7CQkvKiBsb2NrdGFnX2xvY2ttZXRob2RpZCA9PSAw IHdoZW4gZW1wdHkgKi8KKwlMT0NLTU9ERQltb2RlOwkJCS8qIG1vZGUgdGhlIHByb2Mgd2lsbCBl dmVudHVhbGx5IHJlcXVlc3QgKi8KK30gRnV0dXJlV2FpdExvY2s7CisKKyNkZWZpbmUgRnV0dXJl V2FpdExvY2tJc1NldChmdXR1cmVXYWl0TG9jaykgXAorCSgoZnV0dXJlV2FpdExvY2spLT5sb2Nr dGFnLmxvY2t0YWdfbG9ja21ldGhvZGlkICE9IDApCisjZGVmaW5lIEZ1dHVyZVdhaXRMb2NrSXNF bXB0eShmdXR1cmVXYWl0TG9jaykgXAorCSghRnV0dXJlV2FpdExvY2tJc1NldChmdXR1cmVXYWl0 TG9jaykpCisKKwogLyoKICAqIFRoZXNlIHN0cnVjdHVyZXMgaG9sZCBpbmZvcm1hdGlvbiBwYXNz ZWQgZnJvbSBsbWdyIGludGVybmFscyB0byB0aGUgbG9jawogICogbGlzdGluZyB1c2VyLWxldmVs IGZ1bmN0aW9ucyAoaW4gbG9ja2Z1bmNzLmMpLgpAQCAtNDE5LDYgKzQ0MywxNSBAQCBleHRlcm4g TE9DQUxMT0NLICpHZXRBd2FpdGVkTG9jayh2b2lkKTsKIGV4dGVybiB2b2lkIFJlc2V0QXdhaXRl ZExvY2sodm9pZCk7CiAKIGV4dGVybiB2b2lkIFJlbW92ZUZyb21XYWl0UXVldWUoUEdQUk9DICpw cm9jLCB1aW50MzIgaGFzaGNvZGUpOworCitleHRlcm4gTE9DSyAqTG9ja0hhc2hMb29rdXAoY29u c3QgTE9DS1RBRyAqbG9ja3RhZywgdWludDMyIGhhc2hjb2RlKTsKKworLyogRnV0dXJlLXdhaXQg ZmFzdC1wYXRoIG1pZ3JhdGlvbiwgY2FsbGVkIGJ5IENoZWNrRGVhZExvY2soKS4gKi8KK2V4dGVy biBMT0NLVEFHICpNaWdyYXRlRnV0dXJlV2FpdEZhc3RQYXRoTG9ja3MoaW50ICpvdXRfY291bnQp OworZXh0ZXJuIGJvb2wgRnV0dXJlV2FpdEZhc3RQYXRoU25hcHNob3RDb3ZlcnNDdXJyZW50TG9j a3MoTE9DS1RBRyAqbG9ja3RhZ3MsCisJCQkJCQkJCQkJCQkJCSBpbnQgbik7CitleHRlcm4gdm9p ZCBSZXN0b3JlRnV0dXJlV2FpdEZhc3RQYXRoU25hcHNob3QoTE9DS1RBRyAqbG9ja3RhZ3MsIGlu dCBuKTsKKwogZXh0ZXJuIExvY2tEYXRhICpHZXRMb2NrU3RhdHVzRGF0YSh2b2lkKTsKIGV4dGVy biBCbG9ja2VkUHJvY3NEYXRhICpHZXRCbG9ja2VyU3RhdHVzRGF0YShpbnQgYmxvY2tlZF9waWQp OwogCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2MuaCBiL3NyYy9pbmNsdWRl L3N0b3JhZ2UvcHJvYy5oCmluZGV4IDNlMWQxZmFkNWY5Li42NmJmY2U2ZjhiNCAxMDA2NDQKLS0t IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9w cm9jLmgKQEAgLTMxNCw2ICszMTQsMTUgQEAgdHlwZWRlZiBzdHJ1Y3QgUEdQUk9DCiAJTE9DS01B U0sJaGVsZExvY2tzOwkJLyogYml0bWFzayBmb3IgbG9jayB0eXBlcyBhbHJlYWR5IGhlbGQgb24g dGhpcwogCQkJCQkJCQkgKiBsb2NrIG9iamVjdCBieSB0aGlzIGJhY2tlbmQgKi8KIAorCS8qCisJ ICogRGVjbGFyZWQgZnV0dXJlLXdhaXQgc2xvdDogYSBsb2NrIHRoaXMgcHJvYyBpbnRlbmRzIHRv IGFjcXVpcmUgbGF0ZXIuCisJICogRW1wdHkgd2hlbiAubG9ja3RhZy5sb2NrdGFnX2xvY2ttZXRo b2RpZCA9PSAwLiAgUHVibGlzaGluZywgY2xlYXJpbmcsCisJICogYW5kIHJlbW90ZSByZWFkcyBh cmUgcHJvdGVjdGVkIGJ5IHRoZSBwYXJ0aXRpb24gbG9jayBvZiAubG9ja3RhZworCSAqIChkZWFk bG9jayB3YWxrZXJzIGhvbGQgYWxsIHBhcnRpdGlvbiBsb2NrcyBhbmQgY2FuIHNhZmVseSBpbnNw ZWN0IHRoZQorCSAqIHNsb3QpLiAgVGhlIG93bmluZyBiYWNrZW5kIG1heSBpbnNwZWN0IGl0cyBv d24gc2xvdCBsb2NrbGVzc2x5LgorCSAqLworCUZ1dHVyZVdhaXRMb2NrIGZ1dHVyZVdhaXRMb2Nr OworCiAJcGdfYXRvbWljX3VpbnQ2NCB3YWl0U3RhcnQ7IC8qIHRpbWUgYXQgd2hpY2ggd2FpdCBm b3IgbG9jayBhY3F1aXNpdGlvbgogCQkJCQkJCQkgKiBzdGFydGVkICovCiAKZGlmZiAtLWdpdCBh L3NyYy90ZXN0L21vZHVsZXMvaW5qZWN0aW9uX3BvaW50cy9leHBlY3RlZC9yZXBhY2sub3V0IGIv c3JjL3Rlc3QvbW9kdWxlcy9pbmplY3Rpb25fcG9pbnRzL2V4cGVjdGVkL3JlcGFjay5vdXQKaW5k ZXggYjU3NWU5MDUyZWUuLjIyYzA1MWY3MDJlIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVz L2luamVjdGlvbl9wb2ludHMvZXhwZWN0ZWQvcmVwYWNrLm91dAorKysgYi9zcmMvdGVzdC9tb2R1 bGVzL2luamVjdGlvbl9wb2ludHMvZXhwZWN0ZWQvcmVwYWNrLm91dApAQCAtMSw0ICsxLDQgQEAK LVBhcnNlZCB0ZXN0IHNwZWMgd2l0aCAyIHNlc3Npb25zCitQYXJzZWQgdGVzdCBzcGVjIHdpdGgg NCBzZXNzaW9ucwogCiBzdGFydGluZyBwZXJtdXRhdGlvbjogd2FpdF9iZWZvcmVfbG9jayBjaGFu Z2VfZXhpc3RpbmcgY2hhbmdlX25ldyBjaGFuZ2Vfc3VieGFjdDEgY2hhbmdlX3N1YnhhY3QyIGNo ZWNrMiB3YWtldXBfYmVmb3JlX2xvY2sgY2hlY2sxCiBpbmplY3Rpb25fcG9pbnRzX2F0dGFjaApA QCAtMTExLDMgKzExMSwxODIgQEAgaW5qZWN0aW9uX3BvaW50c19kZXRhY2gKICAgICAgICAgICAg ICAgICAgICAgICAgCiAoMSByb3cpCiAKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHdhaXRfYmVm b3JlX2xvY2sgYmVnaW5fdHhuIGxvY2tfdGFibGVfYWUgczNfd2FrZXVwIGVuZF90eG4KK2luamVj dGlvbl9wb2ludHNfYXR0YWNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAg ICAgICAgICAgICAKKygxIHJvdykKKworc3RlcCB3YWl0X2JlZm9yZV9sb2NrOiAKKwlSRVBBQ0sg KENPTkNVUlJFTlRMWSkgcmVwYWNrX3Rlc3QgVVNJTkcgSU5ERVggcmVwYWNrX3Rlc3RfcGtleTsK KyA8d2FpdGluZyAuLi4+CitzdGVwIGJlZ2luX3R4bjogCisJQkVHSU47CisKK3N0ZXAgbG9ja190 YWJsZV9hZTogCisJTE9DSyBUQUJMRSByZXBhY2tfdGVzdCBJTiBBQ0NFU1MgRVhDTFVTSVZFIE1P REU7CisgPHdhaXRpbmcgLi4uPgorc3RlcCBzM193YWtldXA6IAorCVNFTEVDVCBpbmplY3Rpb25f cG9pbnRzX3dha2V1cCgncmVwYWNrLWNvbmN1cnJlbnRseS1iZWZvcmUtbG9jaycpOworCitpbmpl Y3Rpb25fcG9pbnRzX3dha2V1cAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAg ICAgICAgICAgICAgCisoMSByb3cpCisKK3N0ZXAgd2FpdF9iZWZvcmVfbG9jazogPC4uLiBjb21w bGV0ZWQ+CitzdGVwIGxvY2tfdGFibGVfYWU6IDwuLi4gY29tcGxldGVkPgorc3RlcCBlbmRfdHhu OiAKKwlDT01NSVQ7CisKK2luamVjdGlvbl9wb2ludHNfZGV0YWNoCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAKKygxIHJvdykKKworCitzdGFydGluZyBw ZXJtdXRhdGlvbjogczJfdGltZW91dF9mYXN0IHdhaXRfYmVmb3JlX2xvY2sgYmVnaW5fYW5kX3Jl YWQgbG9ja190YWJsZV9hZSBlbmRfdHhuIHMzX3dha2V1cAoraW5qZWN0aW9uX3BvaW50c19hdHRh Y2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgIAorKDEg cm93KQorCitzdGVwIHMyX3RpbWVvdXRfZmFzdDogCisJU0VUIGRlYWRsb2NrX3RpbWVvdXQgPSAn MTBtcyc7CisKK3N0ZXAgd2FpdF9iZWZvcmVfbG9jazogCisJUkVQQUNLIChDT05DVVJSRU5UTFkp IHJlcGFja190ZXN0IFVTSU5HIElOREVYIHJlcGFja190ZXN0X3BrZXk7CisgPHdhaXRpbmcgLi4u Pgorc3RlcCBiZWdpbl9hbmRfcmVhZDogCisJQkVHSU47CisJU0VMRUNUIDEgRlJPTSByZXBhY2tf dGVzdCBMSU1JVCAxOworCis/Y29sdW1uPworLS0tLS0tLS0KKyAgICAgICAxCisoMSByb3cpCisK K3N0ZXAgbG9ja190YWJsZV9hZTogCisJTE9DSyBUQUJMRSByZXBhY2tfdGVzdCBJTiBBQ0NFU1Mg RVhDTFVTSVZFIE1PREU7CisgPHdhaXRpbmcgLi4uPgorc3RlcCBsb2NrX3RhYmxlX2FlOiA8Li4u IGNvbXBsZXRlZD4KK0VSUk9SOiAgZnV0dXJlIGRlYWRsb2NrIGRldGVjdGVkCitzdGVwIGVuZF90 eG46IAorCUNPTU1JVDsKKworc3RlcCBzM193YWtldXA6IAorCVNFTEVDVCBpbmplY3Rpb25fcG9p bnRzX3dha2V1cCgncmVwYWNrLWNvbmN1cnJlbnRseS1iZWZvcmUtbG9jaycpOworCitpbmplY3Rp b25fcG9pbnRzX3dha2V1cAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAg ICAgICAgICAgCisoMSByb3cpCisKK3N0ZXAgd2FpdF9iZWZvcmVfbG9jazogPC4uLiBjb21wbGV0 ZWQ+CitpbmplY3Rpb25fcG9pbnRzX2RldGFjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAg ICAgICAgICAgICAgICAgICAgICAgCisoMSByb3cpCisKKworc3RhcnRpbmcgcGVybXV0YXRpb246 IHMyX3RpbWVvdXRfZmFzdCB3YWl0X2JlZm9yZV9sb2NrIGJlZ2luX2FuZF9yZWFkIGxvY2tfdGFi bGVfc3VlIGVuZF90eG4gczNfd2FrZXVwCitpbmplY3Rpb25fcG9pbnRzX2F0dGFjaAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgCisoMSByb3cpCisKK3N0 ZXAgczJfdGltZW91dF9mYXN0OiAKKwlTRVQgZGVhZGxvY2tfdGltZW91dCA9ICcxMG1zJzsKKwor c3RlcCB3YWl0X2JlZm9yZV9sb2NrOiAKKwlSRVBBQ0sgKENPTkNVUlJFTlRMWSkgcmVwYWNrX3Rl c3QgVVNJTkcgSU5ERVggcmVwYWNrX3Rlc3RfcGtleTsKKyA8d2FpdGluZyAuLi4+CitzdGVwIGJl Z2luX2FuZF9yZWFkOiAKKwlCRUdJTjsKKwlTRUxFQ1QgMSBGUk9NIHJlcGFja190ZXN0IExJTUlU IDE7CisKKz9jb2x1bW4/CistLS0tLS0tLQorICAgICAgIDEKKygxIHJvdykKKworc3RlcCBsb2Nr X3RhYmxlX3N1ZTogCisJTE9DSyBUQUJMRSByZXBhY2tfdGVzdCBJTiBTSEFSRSBVUERBVEUgRVhD TFVTSVZFIE1PREU7CisgPHdhaXRpbmcgLi4uPgorc3RlcCBsb2NrX3RhYmxlX3N1ZTogPC4uLiBj b21wbGV0ZWQ+CitFUlJPUjogIGZ1dHVyZSBkZWFkbG9jayBkZXRlY3RlZAorc3RlcCBlbmRfdHhu OiAKKwlDT01NSVQ7CisKK3N0ZXAgczNfd2FrZXVwOiAKKwlTRUxFQ1QgaW5qZWN0aW9uX3BvaW50 c193YWtldXAoJ3JlcGFjay1jb25jdXJyZW50bHktYmVmb3JlLWxvY2snKTsKKworaW5qZWN0aW9u X3BvaW50c193YWtldXAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAg ICAgICAgIAorKDEgcm93KQorCitzdGVwIHdhaXRfYmVmb3JlX2xvY2s6IDwuLi4gY29tcGxldGVk PgoraW5qZWN0aW9uX3BvaW50c19kZXRhY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAg ICAgICAgICAgICAgICAgICAgIAorKDEgcm93KQorCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBz Ml90aW1lb3V0X2Zhc3Qgd2FpdF9iZWZvcmVfbG9jayBiZWdpbl9hbmRfcmVhZCBzM19iZWdpbl90 eG4gczNfbG9ja190YWJsZV95X3N1ZSBzM19sb2NrX3RhYmxlX3N1ZSBsb2NrX3RhYmxlX3lfc3Vl IGVuZF90eG4gczRfd2FrZXVwIHMzX2VuZF90eG4KK2luamVjdGlvbl9wb2ludHNfYXR0YWNoCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAKKygxIHJvdykK Kworc3RlcCBzMl90aW1lb3V0X2Zhc3Q6IAorCVNFVCBkZWFkbG9ja190aW1lb3V0ID0gJzEwbXMn OworCitzdGVwIHdhaXRfYmVmb3JlX2xvY2s6IAorCVJFUEFDSyAoQ09OQ1VSUkVOVExZKSByZXBh Y2tfdGVzdCBVU0lORyBJTkRFWCByZXBhY2tfdGVzdF9wa2V5OworIDx3YWl0aW5nIC4uLj4KK3N0 ZXAgYmVnaW5fYW5kX3JlYWQ6IAorCUJFR0lOOworCVNFTEVDVCAxIEZST00gcmVwYWNrX3Rlc3Qg TElNSVQgMTsKKworP2NvbHVtbj8KKy0tLS0tLS0tCisgICAgICAgMQorKDEgcm93KQorCitzdGVw IHMzX2JlZ2luX3R4bjogCisJQkVHSU47CisKK3N0ZXAgczNfbG9ja190YWJsZV95X3N1ZTogCisJ TE9DSyBUQUJMRSByZXBhY2tfdGVzdF95IElOIFNIQVJFIFVQREFURSBFWENMVVNJVkUgTU9ERTsK Kworc3RlcCBzM19sb2NrX3RhYmxlX3N1ZTogCisJTE9DSyBUQUJMRSByZXBhY2tfdGVzdCBJTiBT SEFSRSBVUERBVEUgRVhDTFVTSVZFIE1PREU7CisgPHdhaXRpbmcgLi4uPgorc3RlcCBsb2NrX3Rh YmxlX3lfc3VlOiAKKwlMT0NLIFRBQkxFIHJlcGFja190ZXN0X3kgSU4gU0hBUkUgVVBEQVRFIEVY Q0xVU0lWRSBNT0RFOworIDx3YWl0aW5nIC4uLj4KK3N0ZXAgbG9ja190YWJsZV95X3N1ZTogPC4u LiBjb21wbGV0ZWQ+CitFUlJPUjogIGZ1dHVyZSBkZWFkbG9jayBkZXRlY3RlZAorc3RlcCBlbmRf dHhuOiAKKwlDT01NSVQ7CisKK3N0ZXAgczRfd2FrZXVwOiAKKwlTRUxFQ1QgaW5qZWN0aW9uX3Bv aW50c193YWtldXAoJ3JlcGFjay1jb25jdXJyZW50bHktYmVmb3JlLWxvY2snKTsKKworaW5qZWN0 aW9uX3BvaW50c193YWtldXAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAg ICAgICAgICAgIAorKDEgcm93KQorCitzdGVwIHdhaXRfYmVmb3JlX2xvY2s6IDwuLi4gY29tcGxl dGVkPgorc3RlcCBzM19sb2NrX3RhYmxlX3N1ZTogPC4uLiBjb21wbGV0ZWQ+CitzdGVwIHMzX2Vu ZF90eG46IAorCUNPTU1JVDsKKworaW5qZWN0aW9uX3BvaW50c19kZXRhY2gKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgIAorKDEgcm93KQorCmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9tb2R1bGVzL2luamVjdGlvbl9wb2ludHMvc3BlY3MvcmVwYWNrLnNwZWMg Yi9zcmMvdGVzdC9tb2R1bGVzL2luamVjdGlvbl9wb2ludHMvc3BlY3MvcmVwYWNrLnNwZWMKaW5k ZXggZDcyN2E5YjA1NmIuLmQyMTQ4MjFhMmRhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVz L2luamVjdGlvbl9wb2ludHMvc3BlY3MvcmVwYWNrLnNwZWMKKysrIGIvc3JjL3Rlc3QvbW9kdWxl cy9pbmplY3Rpb25fcG9pbnRzL3NwZWNzL3JlcGFjay5zcGVjCkBAIC01LDYgKzUsNyBAQCBzZXR1 cAogCiAJQ1JFQVRFIFRBQkxFIHJlcGFja190ZXN0KGkgaW50IFBSSU1BUlkgS0VZLCBqIGludCk7 CiAJSU5TRVJUIElOVE8gcmVwYWNrX3Rlc3QoaSwgaikgVkFMVUVTICgxLCAxKSwgKDIsIDIpLCAo MywgMyksICg0LCA0KTsKKwlDUkVBVEUgVEFCTEUgcmVwYWNrX3Rlc3RfeShpIGludCk7CiAKIAlD UkVBVEUgVEFCTEUgcmVsZmlsZW5vZGVzKG5vZGUgb2lkKTsKIApAQCAtMTUsNiArMTYsNyBAQCBz ZXR1cAogdGVhcmRvd24KIHsKIAlEUk9QIFRBQkxFIHJlcGFja190ZXN0OworCURST1AgVEFCTEUg cmVwYWNrX3Rlc3RfeTsKIAlEUk9QIEVYVEVOU0lPTiBpbmplY3Rpb25fcG9pbnRzOwogCiAJRFJP UCBUQUJMRSByZWxmaWxlbm9kZXM7CkBAIC02MSw2ICs2MywxMCBAQCB0ZWFyZG93bgogfQogCiBz ZXNzaW9uIHMyCitzdGVwIHMyX3RpbWVvdXRfZmFzdAoreworCVNFVCBkZWFkbG9ja190aW1lb3V0 ID0gJzEwbXMnOworfQogIyBDaGFuZ2UgdGhlIGV4aXN0aW5nIGRhdGEuIFVQREFURSBjaGFuZ2Vz IGJvdGgga2V5IGFuZCBub24ta2V5IGNvbHVtbnMuIEFsc28KICMgdXBkYXRlIG9uZSByb3cgdHdp Y2UgdG8gdGVzdCB3aGV0aGVyIHR1cGxlIHZlcnNpb24gZ2VuZXJhdGVkIGJ5IHRoaXMgc2Vzc2lv bgogIyBjYW4gYmUgZm91bmQuCkBAIC0xMjgsNiArMTM0LDYwIEBAIHN0ZXAgd2FrZXVwX2JlZm9y ZV9sb2NrCiB7CiAJU0VMRUNUIGluamVjdGlvbl9wb2ludHNfd2FrZXVwKCdyZXBhY2stY29uY3Vy cmVudGx5LWJlZm9yZS1sb2NrJyk7CiB9CisjIFN0ZXBzIHVzZWQgaW4gbG9jayBjb250ZW50aW9u IHRlc3RzLgorc3RlcCBiZWdpbl90eG4KK3sKKwlCRUdJTjsKK30KK3N0ZXAgYmVnaW5fYW5kX3Jl YWQKK3sKKwlCRUdJTjsKKwlTRUxFQ1QgMSBGUk9NIHJlcGFja190ZXN0IExJTUlUIDE7Cit9Citz dGVwIGxvY2tfdGFibGVfYWUKK3sKKwlMT0NLIFRBQkxFIHJlcGFja190ZXN0IElOIEFDQ0VTUyBF WENMVVNJVkUgTU9ERTsKK30KK3N0ZXAgbG9ja190YWJsZV9zdWUKK3sKKwlMT0NLIFRBQkxFIHJl cGFja190ZXN0IElOIFNIQVJFIFVQREFURSBFWENMVVNJVkUgTU9ERTsKK30KK3N0ZXAgbG9ja190 YWJsZV95X3N1ZQoreworCUxPQ0sgVEFCTEUgcmVwYWNrX3Rlc3RfeSBJTiBTSEFSRSBVUERBVEUg RVhDTFVTSVZFIE1PREU7Cit9CitzdGVwIGVuZF90eG4KK3sKKwlDT01NSVQ7Cit9CisKK3Nlc3Np b24gczMKK3N0ZXAgczNfYmVnaW5fdHhuCit7CisJQkVHSU47Cit9CitzdGVwIHMzX2xvY2tfdGFi bGVfeV9zdWUKK3sKKwlMT0NLIFRBQkxFIHJlcGFja190ZXN0X3kgSU4gU0hBUkUgVVBEQVRFIEVY Q0xVU0lWRSBNT0RFOworfQorc3RlcCBzM19sb2NrX3RhYmxlX3N1ZQoreworCUxPQ0sgVEFCTEUg cmVwYWNrX3Rlc3QgSU4gU0hBUkUgVVBEQVRFIEVYQ0xVU0lWRSBNT0RFOworfQorc3RlcCBzM193 YWtldXAKK3sKKwlTRUxFQ1QgaW5qZWN0aW9uX3BvaW50c193YWtldXAoJ3JlcGFjay1jb25jdXJy ZW50bHktYmVmb3JlLWxvY2snKTsKK30KK3N0ZXAgczNfZW5kX3R4bgoreworCUNPTU1JVDsKK30K Kworc2Vzc2lvbiBzNAorc3RlcCBzNF93YWtldXAKK3sKKwlTRUxFQ1QgaW5qZWN0aW9uX3BvaW50 c193YWtldXAoJ3JlcGFjay1jb25jdXJyZW50bHktYmVmb3JlLWxvY2snKTsKK30KIAogIyBUZXN0 IGlmIGRhdGEgY2hhbmdlcyBpbnRyb2R1Y2VkIHdoaWxlIG9uZSBzZXNzaW9uIGlzIHBlcmZvcm1p bmcgUkVQQUNLCiAjIENPTkNVUlJFTlRMWSBmaW5kIHRoZWlyIHdheSBpbnRvIHRoZSB0YWJsZS4K QEAgLTE0MCwzICsyMDAsNjEgQEAgcGVybXV0YXRpb24KIAljaGVjazIKIAl3YWtldXBfYmVmb3Jl X2xvY2sKIAljaGVjazEKKworIyBBIHdhaXRlciB0aGF0IGRvZXMgbm90IGFscmVhZHkgaG9sZCBh IGNvbmZsaWN0aW5nIGxvY2sgb24gdGhlIHRhYmxlIGlzIG5vdCBhCisjIGZ1dHVyZSBkZWFkbG9j ay4gIEl0IHdhaXRzIHVudGlsIFJFUEFDSyBmaW5pc2hlcyBhbmQgdGhlbiBhY3F1aXJlcyBpdHMg bG9jay4KK3Blcm11dGF0aW9uCisJd2FpdF9iZWZvcmVfbG9jaworCWJlZ2luX3R4bgorCWxvY2tf dGFibGVfYWUKKwlzM193YWtldXAKKwllbmRfdHhuCisKKyMgSW4gdGhlIGRlYWRsb2NrLWV4cGVj dGluZyBwZXJtdXRhdGlvbnMgYmVsb3csIGFsbCBkZWFkbG9jayBkZXRlY3Rpb25zIG11c3QKKyMg cnVuIHdoaWxlIHMxIGlzIHN0aWxsIHBhcmtlZCBhdCB0aGUgaW5qZWN0aW9uIHBvaW50LCBpLmUu IGJlZm9yZSBzMSB3YWtlcworIyB1cCBhbmQgYXR0ZW1wdHMgQWNjZXNzRXhjbHVzaXZlTG9jay4g IE9uY2UgczEgYXR0YWNoZXMgd2FpdExpbmsgZm9yIEFFTCwKKyMgaXQgY2xlYXJzIGl0cyBmdXR1 cmUtd2FpdCBzbG90LCBhbmQgYW55IGN5Y2xlIGZyb20gdGhhdCBwb2ludCBvbiB3b3VsZCBiZQor IyByZXBvcnRlZCBhcyBhIHBsYWluICJkZWFkbG9jayBkZXRlY3RlZCIgcmF0aGVyIHRoYW4gImZ1 dHVyZSBkZWFkbG9jaworIyBkZXRlY3RlZCIuICBUbyBmb3JjZSB0aGlzIG9yZGVyaW5nLCBldmVy eSB3YWtldXAgc3RlcCBpcyBwbGFjZWQgYWZ0ZXIgdGhlCisjIENPTU1JVCBmcm9tIHRoZSBzZXNz aW9uIHdob3NlIDEwIG1zIGRlYWRsb2NrX3RpbWVvdXQgd2UgcmVseSBvbjogdGhlCisjIGZyYW1l d29yayBjYW5ub3QgcnVuIHRoYXQgQ09NTUlUIHVudGlsIHRoZSBibG9ja2VkIHNlc3Npb24gaGFz IHVuYmxvY2tlZAorIyAodmlhIGl0cyBkZWFkbG9jayBjaGVjayksIHNvIHRoZSB3YWtldXAgbmVj ZXNzYXJpbHkgZm9sbG93cy4KKworIyBBIHdhaXRlciB0aGF0IGFscmVhZHkgaG9sZHMgQWNjZXNz U2hhcmVMb2NrIHRoZW4gd2FpdHMgZm9yIEFjY2Vzc0V4Y2x1c2l2ZUxvY2sKKyMgYmVoaW5kIFJF UEFDSydzIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jay4KK3Blcm11dGF0aW9uCisJczJfdGltZW91 dF9mYXN0CisJd2FpdF9iZWZvcmVfbG9jaworCWJlZ2luX2FuZF9yZWFkCisJbG9ja190YWJsZV9h ZSgqKQorCWVuZF90eG4KKwlzM193YWtldXAKKworIyBTYW1lIHNoYXBlIGFzIGFib3ZlLCBidXQg dGhlIHdhaXRlciByZXF1ZXN0cyBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2suCitwZXJtdXRhdGlv bgorCXMyX3RpbWVvdXRfZmFzdAorCXdhaXRfYmVmb3JlX2xvY2sKKwliZWdpbl9hbmRfcmVhZAor CWxvY2tfdGFibGVfc3VlKCopCisJZW5kX3R4bgorCXMzX3dha2V1cAorCisjIFRocmVlLWJhY2tl bmQgZnV0dXJlIGRlYWRsb2NrOgorIworIyAtIHMxIGhvbGRzIFNoYXJlVXBkYXRlRXhjbHVzaXZl TG9jayBvbiByZXBhY2tfdGVzdCBhbmQgaGFzIGRlY2xhcmVkIGEgZnV0dXJlCisjICAgQWNjZXNz RXhjbHVzaXZlTG9jayBvbiBpdC4KKyMgLSBzMiBob2xkcyBBY2Nlc3NTaGFyZUxvY2sgb24gcmVw YWNrX3Rlc3QuCisjIC0gczMgaG9sZHMgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrIG9uIHJlcGFj a190ZXN0X3ksIHRoZW4gd2FpdHMgZm9yCisjICAgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrIG9u IHJlcGFja190ZXN0IGJlaGluZCBzMS4KKyMgLSBzMiB3YWl0cyBmb3IgU2hhcmVVcGRhdGVFeGNs dXNpdmVMb2NrIG9uIHJlcGFja190ZXN0X3kgYmVoaW5kIHMzLgorcGVybXV0YXRpb24KKwlzMl90 aW1lb3V0X2Zhc3QKKwl3YWl0X2JlZm9yZV9sb2NrCisJYmVnaW5fYW5kX3JlYWQKKwlzM19iZWdp bl90eG4KKwlzM19sb2NrX3RhYmxlX3lfc3VlCisJczNfbG9ja190YWJsZV9zdWUKKwlsb2NrX3Rh YmxlX3lfc3VlKCopCisJZW5kX3R4bgorCXM0X3dha2V1cAorCXMzX2VuZF90eG4KLS0gCjIuNDMu MAoK --00000000000076b1a7064f9e565b--