From owner-freebsd-hackers@freebsd.org Mon Feb 5 08:16:36 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id EC480ED8AEC for ; Mon, 5 Feb 2018 08:16:35 +0000 (UTC) (envelope-from zareian.a.r@gmail.com) Received: from mail-yw0-x22c.google.com (mail-yw0-x22c.google.com [IPv6:2607:f8b0:4002:c05::22c]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 7BE6E681E3 for ; Mon, 5 Feb 2018 08:16:35 +0000 (UTC) (envelope-from zareian.a.r@gmail.com) Received: by mail-yw0-x22c.google.com with SMTP id b16so14973357ywh.12 for ; Mon, 05 Feb 2018 00:16:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=tkcrkbGWsDsZ7/dqvVaseFRLmpLdw6+0NQacZX1VkEw=; b=CIWpQvPmIIj+FqW47fY7lKrlq9UoZt3s0D7KMY/y0jCI2WXUibhQIxson4OuDj4Yp0 Erp9ak/nffA2o9/4Fcw7gNmSjnSoTKF0fR3zn/Sxtu9TbNxb9XeWYAJ9ZVmIXkhXyRhf IGgl4tEkNvY0Hwk1Ds7V7gRQ22Nls93W4NR0tYXFjXrJJo6TxCsSPIL1VKMrVEUaq+r+ A/y0fpl43dwWdSUGYrhjnmI5U/ZljajYBhcq9Fb8h96BhLDamRN+u5sft/A2zYmOJk/n qjHeju08wcxNS1Cs+AcxXlRIfQKrulnjv+64uarQIg6uiEXLmNa0aKnrYZVLwu146ZKL vdNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=tkcrkbGWsDsZ7/dqvVaseFRLmpLdw6+0NQacZX1VkEw=; b=OJkVHKDokx7GleI4XMBcT+r6pY+sCK/APmU0FrAij2t0KFx9aQ4HaY0Rv2uZAAU+WY Lv/8c6eGp73Q5hys4PS8/ySmQacTsyUNNMuVkX0uoMb1jz0yW5PpPgqNsBHhDttMVZ62 7/P/dzYw2cee3VfQjOTDJ9kHrDjvVAx0DyjTdGCwni6u0Hqx5RBUIRL+zExqXbPDfBsn 0w6Evv8PPa4SKXaH66SLvpvUsOtwIYTy3UoxnEjjro7KwJua0Cwi+XzuLYdD3wd97OUf FElPJewnUR7iomfU5lRQ66Z+dzRo1FVAnsnC4bAgdfhrDDcpwvg47ptqd66ytlda6gzF 8C1g== X-Gm-Message-State: AKwxytdOljftawG3DmJwo9zrt9tyhcwr6Zbgko7ko/HGlMq9CxFZOEml 8nS00BkHr96T/cgRXgCundLuWAvMszNIg1EcEeLkHw== X-Google-Smtp-Source: AH8x224a+mAXkNFFDUuIRvhYmaMlHxnQLwyJVLVNZWuDrqCTK5G7TbsVbeuMhajQMD00LZmMQ5Ny2zXjbFYmM3HIDnA= X-Received: by 10.13.242.131 with SMTP id b125mr25497965ywf.237.1517818594404; Mon, 05 Feb 2018 00:16:34 -0800 (PST) MIME-Version: 1.0 Received: by 10.37.16.212 with HTTP; Mon, 5 Feb 2018 00:16:34 -0800 (PST) From: ali reza zareian Date: Mon, 5 Feb 2018 11:46:34 +0330 Message-ID: Subject: dhcrelay does not work To: freebsd-hackers@freebsd.org X-Mailman-Approved-At: Mon, 05 Feb 2018 11:17:06 +0000 Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.25 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Feb 2018 08:16:36 -0000 hello dhcrelay does not work with this scenario A B --------------- ----------------- ----------- | dhcp server | | dhcrelay | |client | | FreeBSD 11.0 |<--------->| FreeBSD 11.0 |<-------------->|windows| -------------------- em7 em0-------------- em1 ----------- ----------------------- DHCP server configuration --- /usr/local/sbin/dhcpd -user dhcpd -group dhcpd -chroot /var/dhcpd -cf /etc/dhcpd.conf -pf /var/run/dhcpd.pid em7 dnsmasq is enable dhcpd.conf: option domain-name "localdomain"; option ldap-server code 95 = text; option domain-search-list code 119 = text; option arch code 93 = unsigned integer 16; # RFC4578 default-lease-time 7200; max-lease-time 86400; log-facility local7; one-lease-per-client true; deny duplicates; ping-check true; update-conflict-detection false; authoritative; subnet 100.100.10.0 netmask 255.255.255.0 { pool { range 100.100.10.1 100.100.10.50; } option routers 100.100.10.10; option domain-name-servers 100.100.10.10; } -------------------------------------------------------- on device B: dhcrelay -i em0 -i em1 100.100.10.10 em1:192.168.1.10/24 em0:100.100.10.100 -------------------------------------------------------- when i test this scenario DHCP packets arrive to DHCP server but they can not return to device B where my dhcrelay is running. if i connect device C to DHCP server directly ,It takes ip fast so i think my DHCP server config is working fine What caused the problem? What's wrong here?? From owner-freebsd-hackers@freebsd.org Fri Feb 9 06:15:33 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4DD70F07D68 for ; Fri, 9 Feb 2018 06:15:33 +0000 (UTC) (envelope-from sblachmann@gmail.com) Received: from mail-qt0-x232.google.com (mail-qt0-x232.google.com [IPv6:2607:f8b0:400d:c0d::232]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id DE38073C60 for ; Fri, 9 Feb 2018 06:15:32 +0000 (UTC) (envelope-from sblachmann@gmail.com) Received: by mail-qt0-x232.google.com with SMTP id s27so9293121qts.4 for ; Thu, 08 Feb 2018 22:15:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=Y8vsl0yHCeaxzwtwDxhoul5AAusKgbtdol2bnj8ziqk=; b=CjJOCIJKRNpvIPydVeDZXyZA6hcs7avhGyBdnTwyx2yj/aPB3vwyB20q69HDRkRcCh miVIQzHZVrsvnNKQK89DsHCdvlsdonzE/JG1A4W3i/1hJBHHevp7CvjWCX0HX6+YU2R6 UUTOLpTy9y1+HeDGFY3c1wZrBSZC3n7aMZmdMWiHwoqroSquEFicJolBqavWAAhx6YvI I7Py+uEECUPE9cXj7tETH/QosDQlM5ykpYcNUiRuXhevR2nN4R4KA5p+o/Meqpsx319v pvHkZ37SJBRH6/kX9G19y0EZCI+thWY//fRNxtkPNszvohLQbcKPR7+O8vQYzbrhS/C8 mPtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=Y8vsl0yHCeaxzwtwDxhoul5AAusKgbtdol2bnj8ziqk=; b=cKws5OrEfB4R854lvzB++dn6LESdyEy6KE7BZ1LHHkiBcHNcNnNzpIUZZCkYZcVQJA v4r8nBrV7HesGzpU9Zh2fkQZ745OwXXLYCt1Ji/+3JRYbs9iXF0dKXlWM6CsS4V3vFA2 FhhbZnAkZFIgcJ8/T7mOlQK2HX6vYgv1N4yfCJiKJGR/ZhqaRb42Vdg/EUmrByQVOw1N JhKdM90PMittO2untzSW1Kr7oV/wOxVJowcYexZRtQRn6O7IKSVVA0IQ8zYIzWjwFZh5 q6jmvw/tBUjnL7LOO3kBisy9ERT/EsrrSqIb3IobClKsO2MJkYHal07mxNFcXeNWWli5 CMXg== X-Gm-Message-State: APf1xPDop358WsP5RdUHwBWzu2xz1ge9OSDHVq+1i4DE7LKIJ1hhgwYp Gps1KXwFyHBkP6xpQejlbulANORVodlwTtu6qSpdZQ== X-Google-Smtp-Source: AH8x224Cb7jGq3KChd2CuRiH6KKli3wI+a0JzWi/8tBERqMHavn35hppU77oJks1BznSVNilCZe0UqA+G3UrOJyYhEA= X-Received: by 10.200.34.237 with SMTP id g42mr2569429qta.93.1518156932151; Thu, 08 Feb 2018 22:15:32 -0800 (PST) MIME-Version: 1.0 Received: by 10.140.28.36 with HTTP; Thu, 8 Feb 2018 22:15:31 -0800 (PST) From: Stefan Blachmann Date: Fri, 9 Feb 2018 07:15:31 +0100 Message-ID: Subject: New microcode updating tool for FreeBSD To: freebsd-hackers@freebsd.org Content-Type: text/plain; charset="UTF-8" X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Feb 2018 06:15:33 -0000 Hello, I would like to introduce you to my new microcode updater for FreeBSD. As the old devcpu-data port has serious bug and does not support the new multi-blobbed Intel microcode format, I have made this new tool. Please see the forums for a description and usage instructions, including the github download link: https://forums.freebsd.org/threads/64588/ Questions and suggestions welcome! Have a nice day! Stefan P.S.: I got a suggestion to post on freebsd-current instead. But I seem to be unable to register on that list: "The hidden token didn't match. Did your IP change?" The IP here is static... From owner-freebsd-hackers@freebsd.org Sat Feb 10 11:19:03 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A263FF137D0 for ; Sat, 10 Feb 2018 11:19:03 +0000 (UTC) (envelope-from kib@freebsd.org) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2820879D84; Sat, 10 Feb 2018 11:19:03 +0000 (UTC) (envelope-from kib@freebsd.org) Received: from tom.home (kib@localhost [127.0.0.1]) by kib.kiev.ua (8.15.2/8.15.2) with ESMTPS id w1ABImfJ030319 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 10 Feb 2018 13:18:52 +0200 (EET) (envelope-from kib@freebsd.org) DKIM-Filter: OpenDKIM Filter v2.10.3 kib.kiev.ua w1ABImfJ030319 Received: (from kostik@localhost) by tom.home (8.15.2/8.15.2/Submit) id w1ABImDX030318; Sat, 10 Feb 2018 13:18:48 +0200 (EET) (envelope-from kib@freebsd.org) X-Authentication-Warning: tom.home: kostik set sender to kib@freebsd.org using -f Date: Sat, 10 Feb 2018 13:18:48 +0200 From: Konstantin Belousov To: Elliott.Rabe@dell.com Cc: freebsd-hackers@freebsd.org, markj@FreeBSD.org, alc@FreeBSD.org, Eric.Van.Gyzen@dell.com Subject: Re: Stale memory during post fork cow pmap update Message-ID: <20180210111848.GL33564@kib.kiev.ua> References: <5A7E7F2B.80900@dell.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5A7E7F2B.80900@dell.com> User-Agent: Mutt/1.9.3 (2018-01-21) X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on tom.home X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 11:19:03 -0000 On Sat, Feb 10, 2018 at 05:12:11AM +0000, Elliott.Rabe@dell.com wrote: > Greetings- > > I've been hunting for the root cause of elusive, slight memory > corruptions in a large, complex process that manages many threads. All > failures and experimentation thus far has been on x86_64 architecture > machines, and pmap_pcid is not in use. > > I believe I have stumbled into a very unlikely race condition in the way > the vm code updates the pmap during write fault processing following a > fork of the process. In this situation, when the process is forked, > appropriate vm entries are marked copy-on-write. One such entry > allocated by static process initialization is frequently used by many > threads in the process. This makes it a prime candidate to write-fault > shortly after a fork system call is made. In this scenario, such a > fault normally burdens the faulting thread with the task of allocating a > new page, entering the page as part of managed memory, and updating the > pmap with the new physical address and the change to writeable status. > This action is followed with an invalidation of the TLB on the current > CPU, and in this case is also followed by IPI_INVLPG IPIs to do the same > on other CPUs (there are often many active threads in this process). > Before this remote TLB invalidation has completed, other CPUs are free > to act on either the old OR new page characteristics. If other threads > are alive and using contents of the faulting page on other CPUs, bad > things can occur. > > In one simplified and somewhat contrived example, one thread attempts to > write to a location on the faulting page under the protection of a lock > while another thread attempts to read from the same location twice in > succession under the protection of the same lock. If both the writing > thread and reading thread are running on different CPUs, and if the > write is directed to the new physical address, the reads may come from > different physical addresses if a TLB invalidation occurs between them. > This seemingly violates the guarantees provided by the locking > primitives and can result in subtle memory corruption symptoms. > > It took me quite a while to chase these symptoms from user-space down > into the operating system, and even longer to end up with a stand-alone > test fixture able to reproduce the situation described above on demand. > If I alter the kernel code to perform a two-stage update of the pmap > entry, the observed corruption symptoms disappear. This two-stage > mechanism updates and invalidates the new physical address in a > read-only state first, and then does a second pmap update and > invalidation to change the status to writeable. The intended effect was > to cause any other threads writing to the faulting page to become > obstructed until the earlier fault is complete, thus eliminating the > possibility of the physical pages having different contents until the > new physical address was fully visible. This is goofy, and from an > efficiency standpoint it is obviously undesirable, but it was the first > thing that came to mind, and it seems to be working fine. > > I am not terribly familliar with the higher level design here, so it is > unclear to me if this problem is simply a very unlikely race condition > that hasn't yet been diagnosed or if this is instead the breakdown of > some other mechanism of which I am not aware. I would appreciate the > insights of those of you who have more history and experience with this > area of the code. You are right describing the operation of the memory copy on fork. But I cannot understand what parts of it, exactly, are problematic, from your description. It is necessary for you to provide the test and provide some kind of the test trace or the output which illustrates the issue you found. Do you mean something like that: - after fork - thread A writes into the page, causing page fault and COW because the entry has write permissions removed - thread B reads from the page, and since invalidation IPI was not yet delivered, it reads from the need-copy page, effectively seeing the old content, before thread A write And you claim is that you can create a situation where both threads A and B owns the same lock around the write and read ? I do not understand this, since if thread A owns a (usermode) lock, it prevents thread B from taking the same lock until fault is fully handled, in particular, the IPI is delivered. From owner-freebsd-hackers@freebsd.org Sat Feb 10 05:13:24 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 93C34F1E1EB for ; Sat, 10 Feb 2018 05:13:24 +0000 (UTC) (envelope-from Elliott.Rabe@dell.com) Received: from esa6.dell-outbound.iphmx.com (esa6.dell-outbound.iphmx.com [68.232.149.229]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "*.dell-outbound.iphmx.com", Issuer "Go Daddy Secure Certificate Authority - G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id A1A286CF67; Sat, 10 Feb 2018 05:13:23 +0000 (UTC) (envelope-from Elliott.Rabe@dell.com) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=dell.com; i=@dell.com; q=dns/txt; s=smtpout; t=1518239603; x=1549775603; h=from:cc:to:subject:date:message-id:content-id: content-transfer-encoding:mime-version; bh=hn1pauUsj/NCHt0a4zD+5aQr8EhvyF/Xj6tE9efm2e0=; b=chjbBXYkmRwganJxtqC31UV3ZYLKoIcxqZrK9R4LTtIWLNwiy/zfL6qk ssJAcSdC2pXBOHtyOiXFeHOM+3t23iSG1fbG1FKi0u35Dxy9DJ/avqe/U 4kTJaHuYuq/wl79llaz6eeOgW9Qr6f2Lej6z7FxDFG+WgUEKGiy6r/2/g g=; X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A2GoBQBsfn5ah2Oa6ERdH4MzgQeBACgKg?= =?us-ascii?q?1uYSZEcEAWFO4UFCoU7HIIgVxUBAgEBAQEBAQIBAhABAQEKCwkIKC+COCKCdBF?= =?us-ascii?q?ABRIBGggCBSECBA0CNgIQBBOKNa9HgieIdoIFOoEPg22CFYY9AYhogmUFmiSKC?= =?us-ascii?q?AmCCY0FhnSCH4pCh2KLFI0AgTw1gXRwgxiCBQFfghJ4izqBFwEBAQ?= X-IPAS-Result: =?us-ascii?q?A2GoBQBsfn5ah2Oa6ERdH4MzgQeBACgKg1uYSZEcEAWFO4U?= =?us-ascii?q?FCoU7HIIgVxUBAgEBAQEBAQIBAhABAQEKCwkIKC+COCKCdBFABRIBGggCBSECB?= =?us-ascii?q?A0CNgIQBBOKNa9HgieIdoIFOoEPg22CFYY9AYhogmUFmiSKCAmCCY0FhnSCH4p?= =?us-ascii?q?Ch2KLFI0AgTw1gXRwgxiCBQFfghJ4izqBFwEBAQ?= Received: from esa6.dell-outbound2.iphmx.com ([68.232.154.99]) by esa6.dell-outbound.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Feb 2018 23:12:13 -0600 From: Cc: , , , Received: from ausxippc106.us.dell.com ([143.166.85.156]) by esa6.dell-outbound2.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Feb 2018 11:12:13 +0600 X-LoopCount0: from 10.166.135.95 X-IronPort-AV: E=Sophos;i="5.46,487,1511848800"; d="scan'208";a="212320119" X-DLP: DLP_GlobalPCIDSS To: Subject: Stale memory during post fork cow pmap update Thread-Topic: Stale memory during post fork cow pmap update Thread-Index: AQHToi21SiKzUGhAgUSuJnDChKhrew== Date: Sat, 10 Feb 2018 05:12:11 +0000 Message-ID: <5A7E7F2B.80900@dell.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.143.18.86] Content-Type: text/plain; charset="utf-8" Content-ID: <397F314847E7CF479215C8D9F8074175@dell.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Mailman-Approved-At: Sat, 10 Feb 2018 12:42:43 +0000 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 05:13:24 -0000 R3JlZXRpbmdzLQ0KDQpJJ3ZlIGJlZW4gaHVudGluZyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgZWx1 c2l2ZSwgc2xpZ2h0IG1lbW9yeSANCmNvcnJ1cHRpb25zIGluIGEgbGFyZ2UsIGNvbXBsZXggcHJv Y2VzcyB0aGF0IG1hbmFnZXMgbWFueSB0aHJlYWRzLiBBbGwgDQpmYWlsdXJlcyBhbmQgZXhwZXJp bWVudGF0aW9uIHRodXMgZmFyIGhhcyBiZWVuIG9uIHg4Nl82NCBhcmNoaXRlY3R1cmUgDQptYWNo aW5lcywgYW5kIHBtYXBfcGNpZCBpcyBub3QgaW4gdXNlLg0KDQpJIGJlbGlldmUgSSBoYXZlIHN0 dW1ibGVkIGludG8gYSB2ZXJ5IHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIGluIHRoZSB3YXkgDQp0 aGUgdm0gY29kZSB1cGRhdGVzIHRoZSBwbWFwIGR1cmluZyB3cml0ZSBmYXVsdCBwcm9jZXNzaW5n IGZvbGxvd2luZyBhIA0KZm9yayBvZiB0aGUgcHJvY2Vzcy4gIEluIHRoaXMgc2l0dWF0aW9uLCB3 aGVuIHRoZSBwcm9jZXNzIGlzIGZvcmtlZCwgDQphcHByb3ByaWF0ZSB2bSBlbnRyaWVzIGFyZSBt YXJrZWQgY29weS1vbi13cml0ZS4gT25lIHN1Y2ggZW50cnkgDQphbGxvY2F0ZWQgYnkgc3RhdGlj IHByb2Nlc3MgaW5pdGlhbGl6YXRpb24gaXMgZnJlcXVlbnRseSB1c2VkIGJ5IG1hbnkgDQp0aHJl YWRzIGluIHRoZSBwcm9jZXNzLiAgVGhpcyBtYWtlcyBpdCBhIHByaW1lIGNhbmRpZGF0ZSB0byB3 cml0ZS1mYXVsdCANCnNob3J0bHkgYWZ0ZXIgYSBmb3JrIHN5c3RlbSBjYWxsIGlzIG1hZGUuICBJ biB0aGlzIHNjZW5hcmlvLCBzdWNoIGEgDQpmYXVsdCBub3JtYWxseSBidXJkZW5zIHRoZSBmYXVs dGluZyB0aHJlYWQgd2l0aCB0aGUgdGFzayBvZiBhbGxvY2F0aW5nIGEgDQpuZXcgcGFnZSwgZW50 ZXJpbmcgdGhlIHBhZ2UgYXMgcGFydCBvZiBtYW5hZ2VkIG1lbW9yeSwgYW5kIHVwZGF0aW5nIHRo ZSANCnBtYXAgd2l0aCB0aGUgbmV3IHBoeXNpY2FsIGFkZHJlc3MgYW5kIHRoZSBjaGFuZ2UgdG8g d3JpdGVhYmxlIHN0YXR1cy4gIA0KVGhpcyBhY3Rpb24gaXMgZm9sbG93ZWQgd2l0aCBhbiBpbnZh bGlkYXRpb24gb2YgdGhlIFRMQiBvbiB0aGUgY3VycmVudCANCkNQVSwgYW5kIGluIHRoaXMgY2Fz ZSBpcyBhbHNvIGZvbGxvd2VkIGJ5IElQSV9JTlZMUEcgSVBJcyB0byBkbyB0aGUgc2FtZSANCm9u IG90aGVyIENQVXMgKHRoZXJlIGFyZSBvZnRlbiBtYW55IGFjdGl2ZSB0aHJlYWRzIGluIHRoaXMg cHJvY2VzcykuICANCkJlZm9yZSB0aGlzIHJlbW90ZSBUTEIgaW52YWxpZGF0aW9uIGhhcyBjb21w bGV0ZWQsIG90aGVyIENQVXMgYXJlIGZyZWUgDQp0byBhY3Qgb24gZWl0aGVyIHRoZSBvbGQgT1Ig bmV3IHBhZ2UgY2hhcmFjdGVyaXN0aWNzLiAgSWYgb3RoZXIgdGhyZWFkcyANCmFyZSBhbGl2ZSBh bmQgdXNpbmcgY29udGVudHMgb2YgdGhlIGZhdWx0aW5nIHBhZ2Ugb24gb3RoZXIgQ1BVcywgYmFk IA0KdGhpbmdzIGNhbiBvY2N1ci4NCg0KSW4gb25lIHNpbXBsaWZpZWQgYW5kIHNvbWV3aGF0IGNv bnRyaXZlZCBleGFtcGxlLCBvbmUgdGhyZWFkIGF0dGVtcHRzIHRvIA0Kd3JpdGUgdG8gYSBsb2Nh dGlvbiBvbiB0aGUgZmF1bHRpbmcgcGFnZSB1bmRlciB0aGUgcHJvdGVjdGlvbiBvZiBhIGxvY2sg DQp3aGlsZSBhbm90aGVyIHRocmVhZCBhdHRlbXB0cyB0byByZWFkIGZyb20gdGhlIHNhbWUgbG9j YXRpb24gdHdpY2UgaW4gDQpzdWNjZXNzaW9uIHVuZGVyIHRoZSBwcm90ZWN0aW9uIG9mIHRoZSBz YW1lIGxvY2suICBJZiBib3RoIHRoZSB3cml0aW5nIA0KdGhyZWFkIGFuZCByZWFkaW5nIHRocmVh ZCBhcmUgcnVubmluZyBvbiBkaWZmZXJlbnQgQ1BVcywgYW5kIGlmIHRoZSANCndyaXRlIGlzIGRp cmVjdGVkIHRvIHRoZSBuZXcgcGh5c2ljYWwgYWRkcmVzcywgdGhlIHJlYWRzIG1heSBjb21lIGZy b20gDQpkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVzc2VzIGlmIGEgVExCIGludmFsaWRhdGlvbiBv Y2N1cnMgYmV0d2VlbiB0aGVtLiAgDQpUaGlzIHNlZW1pbmdseSB2aW9sYXRlcyB0aGUgZ3VhcmFu dGVlcyBwcm92aWRlZCBieSB0aGUgbG9ja2luZyANCnByaW1pdGl2ZXMgYW5kIGNhbiByZXN1bHQg aW4gc3VidGxlIG1lbW9yeSBjb3JydXB0aW9uIHN5bXB0b21zLg0KDQpJdCB0b29rIG1lIHF1aXRl IGEgd2hpbGUgdG8gY2hhc2UgdGhlc2Ugc3ltcHRvbXMgZnJvbSB1c2VyLXNwYWNlIGRvd24gDQpp bnRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgZXZlbiBsb25nZXIgdG8gZW5kIHVwIHdpdGgg YSBzdGFuZC1hbG9uZSANCnRlc3QgZml4dHVyZSBhYmxlIHRvIHJlcHJvZHVjZSB0aGUgc2l0dWF0 aW9uIGRlc2NyaWJlZCBhYm92ZSBvbiBkZW1hbmQuICANCklmIEkgYWx0ZXIgdGhlIGtlcm5lbCBj b2RlIHRvIHBlcmZvcm0gYSB0d28tc3RhZ2UgdXBkYXRlIG9mIHRoZSBwbWFwIA0KZW50cnksIHRo ZSBvYnNlcnZlZCBjb3JydXB0aW9uIHN5bXB0b21zIGRpc2FwcGVhci4gIFRoaXMgdHdvLXN0YWdl IA0KbWVjaGFuaXNtIHVwZGF0ZXMgYW5kIGludmFsaWRhdGVzIHRoZSBuZXcgcGh5c2ljYWwgYWRk cmVzcyBpbiBhIA0KcmVhZC1vbmx5IHN0YXRlIGZpcnN0LCBhbmQgdGhlbiBkb2VzIGEgc2Vjb25k IHBtYXAgdXBkYXRlIGFuZCANCmludmFsaWRhdGlvbiB0byBjaGFuZ2UgdGhlIHN0YXR1cyB0byB3 cml0ZWFibGUuICBUaGUgaW50ZW5kZWQgZWZmZWN0IHdhcyANCnRvIGNhdXNlIGFueSBvdGhlciB0 aHJlYWRzIHdyaXRpbmcgdG8gdGhlIGZhdWx0aW5nIHBhZ2UgdG8gYmVjb21lIA0Kb2JzdHJ1Y3Rl ZCB1bnRpbCB0aGUgZWFybGllciBmYXVsdCBpcyBjb21wbGV0ZSwgdGh1cyBlbGltaW5hdGluZyB0 aGUgDQpwb3NzaWJpbGl0eSBvZiB0aGUgcGh5c2ljYWwgcGFnZXMgaGF2aW5nIGRpZmZlcmVudCBj b250ZW50cyB1bnRpbCB0aGUgDQpuZXcgcGh5c2ljYWwgYWRkcmVzcyB3YXMgZnVsbHkgdmlzaWJs ZS4gIFRoaXMgaXMgZ29vZnksIGFuZCBmcm9tIGFuIA0KZWZmaWNpZW5jeSBzdGFuZHBvaW50IGl0 IGlzIG9idmlvdXNseSB1bmRlc2lyYWJsZSwgYnV0IGl0IHdhcyB0aGUgZmlyc3QgDQp0aGluZyB0 aGF0IGNhbWUgdG8gbWluZCwgYW5kIGl0IHNlZW1zIHRvIGJlIHdvcmtpbmcgZmluZS4NCg0KSSBh bSBub3QgdGVycmlibHkgZmFtaWxsaWFyIHdpdGggdGhlIGhpZ2hlciBsZXZlbCBkZXNpZ24gaGVy ZSwgc28gaXQgaXMgDQp1bmNsZWFyIHRvIG1lIGlmIHRoaXMgcHJvYmxlbSBpcyBzaW1wbHkgYSB2 ZXJ5IHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIA0KdGhhdCBoYXNuJ3QgeWV0IGJlZW4gZGlhZ25v c2VkIG9yIGlmIHRoaXMgaXMgaW5zdGVhZCB0aGUgYnJlYWtkb3duIG9mIA0Kc29tZSBvdGhlciBt ZWNoYW5pc20gb2Ygd2hpY2ggSSBhbSBub3QgYXdhcmUuICBJIHdvdWxkIGFwcHJlY2lhdGUgdGhl IA0KaW5zaWdodHMgb2YgdGhvc2Ugb2YgeW91IHdobyBoYXZlIG1vcmUgaGlzdG9yeSBhbmQgZXhw ZXJpZW5jZSB3aXRoIHRoaXMgDQphcmVhIG9mIHRoZSBjb2RlLg0KDQpUaGFuayB5b3UgZm9yIHlv dXIgdGltZSENCg0KRWxsaW90dCBSYWJlDQplbGxpb3R0X3JhYmVAZGVsbC5jb20= From owner-freebsd-hackers@freebsd.org Sat Feb 10 19:36:30 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7733FF17673 for ; Sat, 10 Feb 2018 19:36:30 +0000 (UTC) (envelope-from bsd-lists@BSDforge.com) Received: from udns.ultimatedns.net (static-24-113-41-81.wavecable.com [24.113.41.81]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id F18D26DD69 for ; Sat, 10 Feb 2018 19:36:29 +0000 (UTC) (envelope-from bsd-lists@BSDforge.com) Received: from udns.ultimatedns.net (localhost [127.0.0.1]) by udns.ultimatedns.net (8.14.9/8.14.9) with ESMTP id w1AJbCh7018434; Sat, 10 Feb 2018 11:37:18 -0800 (PST) (envelope-from bsd-lists@BSDforge.com) X-Mailer: UDNSMS MIME-Version: 1.0 Cc: In-Reply-To: From: "Chris H" Reply-To: bsd-lists@BSDforge.com To: "Stefan Blachmann" Subject: Re: New microcode updating tool for FreeBSD Date: Sat, 10 Feb 2018 11:37:18 -0800 Message-Id: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 19:36:30 -0000 On Fri, 9 Feb 2018 07:15:31 +0100 "Stefan Blachmann" = said > Hello, >=20 > I would like to introduce you to my new microcode updater for FreeBSD=2E >=20 > As the old devcpu-data port has serious bug and does not support the > new multi-blobbed Intel microcode format, I have made this new tool=2E >=20 > Please see the forums for a description and usage instructions, > including the github download link: > https://forums=2Efreebsd=2Eorg/threads/64588/ >=20 > Questions and suggestions welcome! >=20 > Have a nice day! > Stefan Looks promising=2E Thanks! While almost everything I deal with is AMD based, I see you hope/intend to add that support=2E Have you created a port for the ports tree yet? Thanks again, Stefan! --Chris >=20 >=20 =2E=2E=2E From owner-freebsd-hackers@freebsd.org Sat Feb 10 19:30:16 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 56A11F16DF5 for ; Sat, 10 Feb 2018 19:30:15 +0000 (UTC) (envelope-from emss.mail@gmail.com) Received: from mail-wr0-x243.google.com (mail-wr0-x243.google.com [IPv6:2a00:1450:400c:c0c::243]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 557386D7EB for ; Sat, 10 Feb 2018 19:30:14 +0000 (UTC) (envelope-from emss.mail@gmail.com) Received: by mail-wr0-x243.google.com with SMTP id o76so8285088wrb.7 for ; Sat, 10 Feb 2018 11:30:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:user-agent:date:message-id:mime-version; bh=ADQclg93VISskv86oX5gil99WE4eXMoFb8199q3Vu5Y=; b=P4BvrRjMGWXYDFYvcZ+4xN2Enjk+YmhUqKhdryJ0sEdei2dZt9z78+od6vxO2ih1qk 5vc2XVGGahN1CVMXMlmHl1w5afGSWEGKVdpiEKu7NS0/YR1/gpW6dF9xAd15sQ3BlOkR K8nyuYAqf5DuhyJTk9VyoUH29E77WXSQhxZcqZ90IBE1RLXZh7QQEFOa36VqrOIHGXws 60VVXnJyj9P4+bGhv4hzhuZnDAUFs8B0x9vrEQ9IXuCVZGl5M/LSFGf173TvR4nxteYF 80+B8VPOCVN5A41UaWYbYhc/Ui7LizDqsRpnT/JHgTuo90XaHTIy4XujWi3g+yPJJq5s aF/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:user-agent:date :message-id:mime-version; bh=ADQclg93VISskv86oX5gil99WE4eXMoFb8199q3Vu5Y=; b=rga+XzJMWOodUI5+BOcDLRFaPmPihyciO1BrEaiA27/QUBArXgAkU+91CpaaGaJJ0b 6UjvuqUSUyCHeHpb56NoIk2Z/3yGHUmkWR0EtZhteoOTy8Ka8UpKSo8d1RFePznIUKlJ BSgn98RFXsJcUyTxutaztM3PMisscVwtPvTPa4wJ0DaJH/pZtmjjI1xP+iPgkyb8WyZa wZMU8fVeuGgSNIvq6nU+TPK6Rp3yLIeI6rXGuY7vWdBFMnEW4jk74P7+FmRllkS28KZu GGw+m2XcLwj+P2I0cj2IrMsKizT6aLcOn0eJo5C+na7TyHecSiKbttJUbpw9uVlioLiN Q0xQ== X-Gm-Message-State: APf1xPCc9i2sHMBk9T2OMhOTmJhIif3u4QqmGIwrUNUdXjIUhZAGV25m 43sXC1uS/Tn1kPcaBSxZ43WvSg== X-Google-Smtp-Source: AH8x226B5hB8WF/VwZT1XKqj+5jgLdtJe+qK+iwsCX+1e3UVdThqSsqlSE502D5f9A+FYx+n45wRIw== X-Received: by 10.223.150.116 with SMTP id c49mr5792232wra.225.1518291013056; Sat, 10 Feb 2018 11:30:13 -0800 (PST) Received: from srvbsdfenssv.interne.associated-bears.org (LStLambert-658-1-110-48.w217-128.abo.wanadoo.fr. [217.128.200.48]) by smtp.gmail.com with ESMTPSA id x91sm8540794wrb.77.2018.02.10.11.30.05 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 10 Feb 2018 11:30:11 -0800 (PST) Sender: Eric Masson Received: from newsrv.interne.associated-bears.org (localhost [127.0.0.1]) by srvbsdfenssv.interne.associated-bears.org (Postfix) with ESMTP id 664564D16 for ; Sat, 10 Feb 2018 20:30:04 +0100 (CET) X-Virus-Scanned: amavisd-new at interne.associated-bears.org Received: from srvbsdfenssv.interne.associated-bears.org ([127.0.0.1]) by newsrv.interne.associated-bears.org (newsrv.interne.associated-bears.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oS2NoD_lLxnJ for ; Sat, 10 Feb 2018 20:29:59 +0100 (CET) Received: by srvbsdfenssv.interne.associated-bears.org (Postfix, from userid 1001) id 1E4B94CFF; Sat, 10 Feb 2018 20:29:59 +0100 (CET) From: Eric Masson To: freebsd-hackers@FreeBSD.org Subject: Regression between 10 & 11, Freeswitch hangs when exiting User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (berkeley-unix) X-Operating-System: FreeBSD 11.1-STABLE amd64 Date: Sat, 10 Feb 2018 20:29:58 +0100 Message-ID: <86tvuor6bt.fsf@newsrv.interne.associated-bears.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Mailman-Approved-At: Sat, 10 Feb 2018 20:50:25 +0000 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 19:30:16 -0000 --=-=-= Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Hi, Freeswitch, a multiprotocol softswitch (http://freewitch.org) runs on FreeBSD and a port is available (net/freeswitch/) Freeswitch runs fine on any 10.x installation, issueing the shutdown command from cli makes the application exit cleanly. On any 11.x installation, issueing the shutdown command from cli makes the application hang. FreeBSD version is : FreeBSD newsrv.interne.associated-bears.org 11.1-STABLE FreeBSD 11.1-STABLE #0 r327876M: Sat Jan 13 16:19:26 CET 2018 emss@newsrv.interne.associated-bears.org:/usr/obj/usr/src/sys/SE7525GP2 amd64 Generic or custom kernel behave the same. On Freeswitch side, 1.6.19 (net/freeswitch) and also git branches master & v1.6 show the same issue. I've reproduced the issue on the latest v1.6, the backtrace of stuck process shows the following : #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 #1 0x00000008030e6f97 in join_common (pthread=0x807ed7700, thread_return=0x7fffffffb658, abstime=0x0) at /usr/src/lib/libthr/thread/thr_join.c:125 #2 0x0000000800f01421 in apr_thread_join (retval=0x7fffffffb68c, thd=0x8059e9658) at threadproc/unix/thread.c:234 #3 0x0000000800cd889e in do_shutdown (module=0x2, shutdown=, unload=SWITCH_TRUE, fail_if_busy=(unknown: 1523667750), err=) at src/switch_loadable_module.c:2031 #4 0x0000000800cdb84a in switch_loadable_module_shutdown () at src/switch_loadable_module.c:2083 #5 0x0000000800c9d92c in switch_core_destroy () at src/switch_core.c:2940 #6 0x0000000000403b2b in main (argc=, argv=0x7fffffffe988) at src/switch.c:1210 It seems the issue lies in thread handling. I've attached : - the output of a Freeswitch related script used to gather relevant information. - source files showing in bt Thank for help. Éric Masson -- Warning: file "/home/emss/misc/fortune/En_sig.dat" unreadable Warning: file "/home/emss/misc/fortune/Fr_sig.dat" unreadable Faut vraiment que je m'occupe de ce problème de signature :) --=-=-= Content-Type: text/plain Content-Disposition: inline; filename=20180210T185028Z-bt.txt GNU gdb (GDB) 8.0.1 [GDB v8.0.1 for FreeBSD] Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-portbld-freebsd11.1". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from /opt/freeswitch/bin/freeswitch...done. [New LWP 100834] [New LWP 101041] [New LWP 101042] [New LWP 101044] [New LWP 101045] [New LWP 101046] [New LWP 101047] [New LWP 101050] [New LWP 101051] [New LWP 101080] Core was generated by `/opt/freeswitch/bin/freeswitch -c'. #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 [Current thread is 1 (LWP 100834)] (gdb) ================================================================================ # GDB session generated by FS backtrace-from-core # FreeSWITCH version: 1.9.0+git~20180202T143051Z~38153a37ed~64bit # FreeSWITCH version (human): 1.9.0 git 38153a3 2018-02-02 14:30:51Z 64bit ================================================================================ ================================================================================ # info threads ================================================================================ Id Target Id Frame * 1 LWP 100834 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 2 LWP 101041 0x0000000803de665a in _select () from /lib/libc.so.7 3 LWP 101042 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 4 LWP 101044 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 5 LWP 101045 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 6 LWP 101046 0x0000000803de665a in _select () from /lib/libc.so.7 7 LWP 101047 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 8 LWP 101050 0x0000000803d7797a in _accept () from /lib/libc.so.7 9 LWP 101051 0x0000000803d7797a in _accept () from /lib/libc.so.7 10 LWP 101080 0x0000000803d7797a in _accept () from /lib/libc.so.7 ================================================================================ # bt ================================================================================ #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 #1 0x00000008030e6f97 in join_common (pthread=0x807ed7700, thread_return=0x7fffffffb658, abstime=0x0) at /usr/src/lib/libthr/thread/thr_join.c:125 #2 0x0000000800f01421 in apr_thread_join (retval=0x7fffffffb68c, thd=0x8059e9658) at threadproc/unix/thread.c:234 #3 0x0000000800cd889e in do_shutdown (module=0x2, shutdown=, unload=SWITCH_TRUE, fail_if_busy=(unknown: 1523667750), err=) at src/switch_loadable_module.c:2031 #4 0x0000000800cdb84a in switch_loadable_module_shutdown () at src/switch_loadable_module.c:2083 #5 0x0000000800c9d92c in switch_core_destroy () at src/switch_core.c:2940 #6 0x0000000000403b2b in main (argc=, argv=0x7fffffffe988) at src/switch.c:1210 ================================================================================ # bt full ================================================================================ #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 No symbol table info available. #1 0x00000008030e6f97 in join_common (pthread=0x807ed7700, thread_return=0x7fffffffb658, abstime=0x0) at /usr/src/lib/libthr/thread/thr_join.c:125 ret = tid = 101080 ts = {tv_sec = 34411006815, tv_nsec = 34514890792} tsp = 0x18ad8 #2 0x0000000800f01421 in apr_thread_join (retval=0x7fffffffb68c, thd=0x8059e9658) at threadproc/unix/thread.c:234 stat = #3 0x0000000800cd889e in do_shutdown (module=0x2, shutdown=, unload=SWITCH_TRUE, fail_if_busy=(unknown: 1523667750), err=) at src/switch_loadable_module.c:2031 st = SWITCH_STATUS_SUCCESS pool = flags = 12798607 #4 0x0000000800cdb84a in switch_loadable_module_shutdown () at src/switch_loadable_module.c:2083 i = hi = val = 0x805626460 module = 0x807ed7700 #5 0x0000000800c9d92c in switch_core_destroy () at src/switch_core.c:2940 event = 0x0 #6 0x0000000000403b2b in main (argc=, argv=0x7fffffffe988) at src/switch.c:1210 pid_path = "/opt/freeswitch/var/run/freeswitch/freeswitch.pid", '\000' pid_buffer = "45848", '\000' old_pid_buffer = "45690", '\000' opts_str = '\000' local_argv = {0x7fffffffec40 "/opt/freeswitch/bin/freeswitch", 0x7fffffffec5f "-c", 0x0 } arg_argv = {0x0 } local_argc = 2 reincarnate_reexec = reincarnate = do_wait = nf = pid = nc = ret = flags = 68225 priority = do_kill = 0 run_set = log_set = 0 alt_base = alt_dirs = 0 x = opts = i = runas_group = 0x0 pid_len = 5 pool = fd = old_pid_len = 5 err = 0x800f28b86 "Success" destroy_status = ================================================================================ # thread apply all bt ================================================================================ Thread 10 (LWP 101080): #0 0x0000000803d7797a in _accept () from /lib/libc.so.7 #1 0x00000008030df2c6 in __thr_accept (s=67, addr=0x8088f5238, addrlen=0x8088f5218) at /usr/src/lib/libthr/thread/thr_syscalls.c:106 #2 0x0000000800eff5e0 in apr_socket_accept (new=0x7fffdec1aed8, sock=0x8088f31b0, connection_context=0x8088f5028) at network_io/unix/sockets.c:191 #3 0x000000080766bbb6 in mod_event_socket_runtime () at mod_event_socket.c:2987 #4 0x0000000800cd8da9 in switch_loadable_module_exec (thread=0x8059e9658, obj=0x8059e9238) at src/switch_loadable_module.c:113 #5 0x0000000800f013a6 in dummy_worker (opaque=0x8059e9658) at threadproc/unix/thread.c:151 #6 0x00000008030dcc05 in thread_start (curthread=0x807ed7700) at /usr/src/lib/libthr/thread/thr_create.c:289 #7 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdec1b000 Thread 9 (LWP 101051): #0 0x0000000803d7797a in _accept () from /lib/libc.so.7 #1 0x00000008030df2c6 in __thr_accept (s=10, addr=0x806618238, addrlen=0x806618218) at /usr/src/lib/libthr/thread/thr_syscalls.c:106 #2 0x0000000800eff5e0 in apr_socket_accept (new=0x7fffdfa13f20, sock=0x8059de610, connection_context=0x806618028) at network_io/unix/sockets.c:191 #3 0x0000000800d5ae20 in msrp_listener (thread=, obj=0x8011be5e8 ) at src/switch_msrp.c:1379 #4 0x0000000800f013a6 in dummy_worker (opaque=0x8059de838) at threadproc/unix/thread.c:151 #5 0x00000008030dcc05 in thread_start (curthread=0x804e19200) at /usr/src/lib/libthr/thread/thr_create.c:289 #6 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdfa14000 Thread 8 (LWP 101050): #0 0x0000000803d7797a in _accept () from /lib/libc.so.7 #1 0x00000008030df2c6 in __thr_accept (s=8, addr=0x806018238, addrlen=0x806018218) at /usr/src/lib/libthr/thread/thr_syscalls.c:106 #2 0x0000000800eff5e0 in apr_socket_accept (new=0x7fffdfa50f20, sock=0x8059de1e8, connection_context=0x806018028) at network_io/unix/sockets.c:191 #3 0x0000000800d5ae20 in msrp_listener (thread=, obj=0x8011be5c8 ) at src/switch_msrp.c:1379 #4 0x0000000800f013a6 in dummy_worker (opaque=0x8059de510) at threadproc/unix/thread.c:151 #5 0x00000008030dcc05 in thread_start (curthread=0x804e18d00) at /usr/src/lib/libthr/thread/thr_create.c:289 #6 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdfa51000 Thread 7 (LWP 101047): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 #1 0x00000008030debb0 in _thr_umtx_timedwait_uint (mtx=0x80062e098, id=, clockid=, abstime=, shared=) at /usr/src/lib/libthr/thread/thr_umtx.c:234 #2 0x00000008030e8698 in cond_wait_user (abstime=, cancel=1, cvp=, mp=) at /usr/src/lib/libthr/thread/thr_cond.c:304 #3 cond_wait_common (cond=, mutex=, abstime=0x7fffdfe8fec8, cancel=1) at /usr/src/lib/libthr/thread/thr_cond.c:364 #4 0x0000000800efb3ef in apr_thread_cond_timedwait (cond=, mutex=, timeout=500000) at locks/unix/thread_cond.c:89 #5 0x0000000800ef16fb in apr_queue_pop_timeout (queue=0x8051dd158, data=0x7fffdfe8ff48, timeout=500000) at misc/apr_queue.c:339 #6 0x0000000800cd490b in switch_scheduler_task_thread (thread=, obj=) at src/switch_scheduler.c:188 #7 0x0000000800f013a6 in dummy_worker (opaque=0x805de85c8) at threadproc/unix/thread.c:151 #8 0x00000008030dcc05 in thread_start (curthread=0x804e18300) at /usr/src/lib/libthr/thread/thr_create.c:289 #9 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdfe90000 Thread 6 (LWP 101046): #0 0x0000000803de665a in _select () from /lib/libc.so.7 #1 0x00000008030df9a2 in __thr_select (numfds=0, readfds=0x0, writefds=0x0, exceptfds=0x0, timeout=0x7fffdfeccf00) at /usr/src/lib/libthr/thread/thr_syscalls.c:493 #2 0x0000000800f02749 in apr_sleep (t=) at time/unix/time.c:246 #3 0x0000000800d4ce25 in do_sleep (t=0) at src/switch_time.c:164 #4 switch_sleep (t=0) at src/switch_time.c:632 #5 0x0000000800c86b8d in switch_core_sql_db_thread (thread=, obj=) at src/switch_core_sqldb.c:1395 #6 0x0000000800f013a6 in dummy_worker (opaque=0x805371c48) at threadproc/unix/thread.c:151 #7 0x00000008030dcc05 in thread_start (curthread=0x804e18800) at /usr/src/lib/libthr/thread/thr_create.c:289 #8 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdfecd000 Thread 5 (LWP 101045): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 #1 0x00000008030debb0 in _thr_umtx_timedwait_uint (mtx=0x80062e068, id=, clockid=, abstime=, shared=) at /usr/src/lib/libthr/thread/thr_umtx.c:234 #2 0x00000008030e8698 in cond_wait_user (abstime=, cancel=1, cvp=, mp=) at /usr/src/lib/libthr/thread/thr_cond.c:304 #3 cond_wait_common (cond=, mutex=, abstime=0x0, cancel=1) at /usr/src/lib/libthr/thread/thr_cond.c:364 #4 0x0000000800c81e46 in switch_user_sql_thread (thread=, obj=0x8051fd0f0) at src/switch_core_sqldb.c:2135 #5 0x0000000800f013a6 in dummy_worker (opaque=0x805ad0880) at threadproc/unix/thread.c:151 #6 0x00000008030dcc05 in thread_start (curthread=0x804e17e00) at /usr/src/lib/libthr/thread/thr_create.c:289 #7 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdff0a000 Thread 4 (LWP 101044): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 #1 0x00000008030debb0 in _thr_umtx_timedwait_uint (mtx=0x80062e050, id=, clockid=, abstime=, shared=) at /usr/src/lib/libthr/thread/thr_umtx.c:234 #2 0x00000008030e8698 in cond_wait_user (abstime=, cancel=1, cvp=, mp=) at /usr/src/lib/libthr/thread/thr_cond.c:304 #3 cond_wait_common (cond=, mutex=, abstime=0x0, cancel=1) at /usr/src/lib/libthr/thread/thr_cond.c:364 #4 0x0000000800ef1608 in apr_queue_pop (queue=0x805140908, data=0x7fffdff46f50) at misc/apr_queue.c:276 #5 0x0000000800d40a57 in log_thread (t=, obj=) at src/switch_log.c:294 #6 0x0000000800f013a6 in dummy_worker (opaque=0x805371b38) at threadproc/unix/thread.c:151 #7 0x00000008030dcc05 in thread_start (curthread=0x804e17900) at /usr/src/lib/libthr/thread/thr_create.c:289 #8 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdff47000 Thread 3 (LWP 101042): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 #1 0x00000008030debb0 in _thr_umtx_timedwait_uint (mtx=0x80062e020, id=, clockid=, abstime=, shared=) at /usr/src/lib/libthr/thread/thr_umtx.c:234 #2 0x00000008030e8698 in cond_wait_user (abstime=, cancel=1, cvp=, mp=) at /usr/src/lib/libthr/thread/thr_cond.c:304 #3 cond_wait_common (cond=, mutex=, abstime=0x0, cancel=1) at /usr/src/lib/libthr/thread/thr_cond.c:364 #4 0x0000000800ef1608 in apr_queue_pop (queue=0x804e31d08, data=0x7fffdffc0f38) at misc/apr_queue.c:276 #5 0x0000000800ce578b in switch_event_dispatch_thread (thread=, obj=0x804e31d08) at src/switch_event.c:324 #6 0x0000000800f013a6 in dummy_worker (opaque=0x805140780) at threadproc/unix/thread.c:151 #7 0x00000008030dcc05 in thread_start (curthread=0x804e16a00) at /usr/src/lib/libthr/thread/thr_create.c:289 #8 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdffc1000 Thread 2 (LWP 101041): #0 0x0000000803de665a in _select () from /lib/libc.so.7 #1 0x00000008030df9a2 in __thr_select (numfds=0, readfds=0x0, writefds=0x0, exceptfds=0x0, timeout=0x7fffdfffdf10) at /usr/src/lib/libthr/thread/thr_syscalls.c:493 #2 0x0000000800f02749 in apr_sleep (t=) at time/unix/time.c:246 #3 0x0000000800d4ce25 in do_sleep (t=0) at src/switch_time.c:164 #4 switch_sleep (t=0) at src/switch_time.c:632 #5 0x0000000800c78e51 in pool_thread (thread=, obj=) at src/switch_core_memory.c:569 #6 0x0000000800f013a6 in dummy_worker (opaque=0x804f13740) at threadproc/unix/thread.c:151 #7 0x00000008030dcc05 in thread_start (curthread=0x804e16500) at /usr/src/lib/libthr/thread/thr_create.c:289 #8 0x0000000000000000 in ?? () Backtrace stopped: Cannot access memory at address 0x7fffdfffe000 Thread 1 (LWP 100834): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 #1 0x00000008030e6f97 in join_common (pthread=0x807ed7700, thread_return=0x7fffffffb658, abstime=0x0) at /usr/src/lib/libthr/thread/thr_join.c:125 #2 0x0000000800f01421 in apr_thread_join (retval=0x7fffffffb68c, thd=0x8059e9658) at threadproc/unix/thread.c:234 #3 0x0000000800cd889e in do_shutdown (module=0x2, shutdown=, unload=SWITCH_TRUE, fail_if_busy=(unknown: 1523667750), err=) at src/switch_loadable_module.c:2031 #4 0x0000000800cdb84a in switch_loadable_module_shutdown () at src/switch_loadable_module.c:2083 #5 0x0000000800c9d92c in switch_core_destroy () at src/switch_core.c:2940 #6 0x0000000000403b2b in main (argc=, argv=0x7fffffffe988) at src/switch.c:1210 ================================================================================ # thread apply all bt full ================================================================================ Thread 10 (LWP 101080): #0 0x0000000803d7797a in _accept () from /lib/libc.so.7 No symbol table info available. #1 0x00000008030df2c6 in __thr_accept (s=67, addr=0x8088f5238, addrlen=0x8088f5218) at /usr/src/lib/libthr/thread/thr_syscalls.c:106 curthread = 0x807ed7700 ret = #2 0x0000000800eff5e0 in apr_socket_accept (new=0x7fffdec1aed8, sock=0x8088f31b0, connection_context=0x8088f5028) at network_io/unix/sockets.c:191 No locals. #3 0x000000080766bbb6 in mod_event_socket_runtime () at mod_event_socket.c:2987 errs = x = pool = listener_pool = 0x8088f5218 sa = 0x8088f30e8 rv = inbound_socket = 0x8088f50e8 listener = #4 0x0000000800cd8da9 in switch_loadable_module_exec (thread=0x8059e9658, obj=0x8059e9238) at src/switch_loadable_module.c:113 ts = 0x8059e9238 status = module = 0x8056263c8 #5 0x0000000800f013a6 in dummy_worker (opaque=0x8059e9658) at threadproc/unix/thread.c:151 No locals. #6 0x00000008030dcc05 in thread_start (curthread=0x807ed7700) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #7 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdec1b000 Thread 9 (LWP 101051): #0 0x0000000803d7797a in _accept () from /lib/libc.so.7 No symbol table info available. #1 0x00000008030df2c6 in __thr_accept (s=10, addr=0x806618238, addrlen=0x806618218) at /usr/src/lib/libthr/thread/thr_syscalls.c:106 curthread = 0x804e19200 ret = #2 0x0000000800eff5e0 in apr_socket_accept (new=0x7fffdfa13f20, sock=0x8059de610, connection_context=0x806618028) at network_io/unix/sockets.c:191 No locals. #3 0x0000000800d5ae20 in msrp_listener (thread=, obj=0x8011be5e8 ) at src/switch_msrp.c:1379 msock = 0x8011be5e8 sock = 0x8066180e8 thd_attr = pool = 0x806618218 rv = #4 0x0000000800f013a6 in dummy_worker (opaque=0x8059de838) at threadproc/unix/thread.c:151 No locals. #5 0x00000008030dcc05 in thread_start (curthread=0x804e19200) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #6 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdfa14000 Thread 8 (LWP 101050): #0 0x0000000803d7797a in _accept () from /lib/libc.so.7 No symbol table info available. #1 0x00000008030df2c6 in __thr_accept (s=8, addr=0x806018238, addrlen=0x806018218) at /usr/src/lib/libthr/thread/thr_syscalls.c:106 curthread = 0x804e18d00 ret = #2 0x0000000800eff5e0 in apr_socket_accept (new=0x7fffdfa50f20, sock=0x8059de1e8, connection_context=0x806018028) at network_io/unix/sockets.c:191 No locals. #3 0x0000000800d5ae20 in msrp_listener (thread=, obj=0x8011be5c8 ) at src/switch_msrp.c:1379 msock = 0x8011be5c8 sock = 0x8060180e8 thd_attr = pool = 0x806018218 rv = #4 0x0000000800f013a6 in dummy_worker (opaque=0x8059de510) at threadproc/unix/thread.c:151 No locals. #5 0x00000008030dcc05 in thread_start (curthread=0x804e18d00) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #6 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdfa51000 Thread 7 (LWP 101047): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 No symbol table info available. #1 0x00000008030debb0 in _thr_umtx_timedwait_uint (mtx=0x80062e098, id=, clockid=, abstime=, shared=) at /usr/src/lib/libthr/thread/thr_umtx.c:234 tm_p = 0x5a7f38d8 tm_size = #2 0x00000008030e8698 in cond_wait_user (abstime=, cancel=1, cvp=, mp=) at /usr/src/lib/libthr/thread/thr_cond.c:304 curthread = 0x804e18300 deferred = recurse = 0 error = sq = error2 = #3 cond_wait_common (cond=, mutex=, abstime=0x7fffdfe8fec8, cancel=1) at /usr/src/lib/libthr/thread/thr_cond.c:364 cvp = 0x8053de1a0 mp = 0x8051df720 error = #4 0x0000000800efb3ef in apr_thread_cond_timedwait (cond=, mutex=, timeout=500000) at locks/unix/thread_cond.c:89 then = abstime = {tv_sec = 1518287064, tv_nsec = 389979000} rv = #5 0x0000000800ef16fb in apr_queue_pop_timeout (queue=0x8051dd158, data=0x7fffdfe8ff48, timeout=500000) at misc/apr_queue.c:339 rv = 0 #6 0x0000000800cd490b in switch_scheduler_task_thread (thread=, obj=) at src/switch_scheduler.c:188 pop = 0x805e262a0 #7 0x0000000800f013a6 in dummy_worker (opaque=0x805de85c8) at threadproc/unix/thread.c:151 No locals. #8 0x00000008030dcc05 in thread_start (curthread=0x804e18300) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #9 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdfe90000 Thread 6 (LWP 101046): #0 0x0000000803de665a in _select () from /lib/libc.so.7 No symbol table info available. #1 0x00000008030df9a2 in __thr_select (numfds=0, readfds=0x0, writefds=0x0, exceptfds=0x0, timeout=0x7fffdfeccf00) at /usr/src/lib/libthr/thread/thr_syscalls.c:493 curthread = 0x804e18800 ret = #2 0x0000000800f02749 in apr_sleep (t=) at time/unix/time.c:246 tv = {tv_sec = 1, tv_usec = 0} #3 0x0000000800d4ce25 in do_sleep (t=0) at src/switch_time.c:164 ts = {tv_sec = 34375559564, tv_nsec = 34378191880} #4 switch_sleep (t=0) at src/switch_time.c:632 No locals. #5 0x0000000800c86b8d in switch_core_sql_db_thread (thread=, obj=) at src/switch_core_sqldb.c:1395 sec = reg_sec = #6 0x0000000800f013a6 in dummy_worker (opaque=0x805371c48) at threadproc/unix/thread.c:151 No locals. #7 0x00000008030dcc05 in thread_start (curthread=0x804e18800) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #8 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdfecd000 Thread 5 (LWP 101045): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 No symbol table info available. #1 0x00000008030debb0 in _thr_umtx_timedwait_uint (mtx=0x80062e068, id=, clockid=, abstime=, shared=) at /usr/src/lib/libthr/thread/thr_umtx.c:234 tm_p = 0x8030e17bc <_thr_ast+44> tm_size = #2 0x00000008030e8698 in cond_wait_user (abstime=, cancel=1, cvp=, mp=) at /usr/src/lib/libthr/thread/thr_cond.c:304 curthread = 0x804e17e00 deferred = recurse = 0 error = sq = error2 = #3 cond_wait_common (cond=, mutex=, abstime=0x0, cancel=1) at /usr/src/lib/libthr/thread/thr_cond.c:364 cvp = 0x8053e7a00 mp = 0x8051df4e0 error = #4 0x0000000800c81e46 in switch_user_sql_thread (thread=, obj=0x8051fd0f0) at src/switch_core_sqldb.c:2135 iterations = 0 lc = i = i = #5 0x0000000800f013a6 in dummy_worker (opaque=0x805ad0880) at threadproc/unix/thread.c:151 No locals. #6 0x00000008030dcc05 in thread_start (curthread=0x804e17e00) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #7 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdff0a000 Thread 4 (LWP 101044): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 No symbol table info available. #1 0x00000008030debb0 in _thr_umtx_timedwait_uint (mtx=0x80062e050, id=, clockid=, abstime=, shared=) at /usr/src/lib/libthr/thread/thr_umtx.c:234 tm_p = 0x8030e17bc <_thr_ast+44> tm_size = #2 0x00000008030e8698 in cond_wait_user (abstime=, cancel=1, cvp=, mp=) at /usr/src/lib/libthr/thread/thr_cond.c:304 curthread = 0x804e17900 deferred = recurse = 0 error = sq = error2 = #3 cond_wait_common (cond=, mutex=, abstime=0x0, cancel=1) at /usr/src/lib/libthr/thread/thr_cond.c:364 cvp = 0x8051d1180 mp = 0x8051d2ea0 error = #4 0x0000000800ef1608 in apr_queue_pop (queue=0x805140908, data=0x7fffdff46f50) at misc/apr_queue.c:276 rv = 0 #5 0x0000000800d40a57 in log_thread (t=, obj=) at src/switch_log.c:294 pop = 0x0 node = binding = #6 0x0000000800f013a6 in dummy_worker (opaque=0x805371b38) at threadproc/unix/thread.c:151 No locals. #7 0x00000008030dcc05 in thread_start (curthread=0x804e17900) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #8 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdff47000 Thread 3 (LWP 101042): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 No symbol table info available. #1 0x00000008030debb0 in _thr_umtx_timedwait_uint (mtx=0x80062e020, id=, clockid=, abstime=, shared=) at /usr/src/lib/libthr/thread/thr_umtx.c:234 tm_p = 0x8030e17bc <_thr_ast+44> tm_size = #2 0x00000008030e8698 in cond_wait_user (abstime=, cancel=1, cvp=, mp=) at /usr/src/lib/libthr/thread/thr_cond.c:304 curthread = 0x804e16a00 deferred = recurse = 0 error = sq = error2 = #3 cond_wait_common (cond=, mutex=, abstime=0x0, cancel=1) at /usr/src/lib/libthr/thread/thr_cond.c:364 cvp = 0x804ff75c0 mp = 0x804e1da40 error = #4 0x0000000800ef1608 in apr_queue_pop (queue=0x804e31d08, data=0x7fffdffc0f38) at misc/apr_queue.c:276 rv = 0 #5 0x0000000800ce578b in switch_event_dispatch_thread (thread=, obj=0x804e31d08) at src/switch_event.c:324 pop = 0x0 event = #6 0x0000000800f013a6 in dummy_worker (opaque=0x805140780) at threadproc/unix/thread.c:151 No locals. #7 0x00000008030dcc05 in thread_start (curthread=0x804e16a00) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #8 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdffc1000 Thread 2 (LWP 101041): #0 0x0000000803de665a in _select () from /lib/libc.so.7 No symbol table info available. #1 0x00000008030df9a2 in __thr_select (numfds=0, readfds=0x0, writefds=0x0, exceptfds=0x0, timeout=0x7fffdfffdf10) at /usr/src/lib/libthr/thread/thr_syscalls.c:493 curthread = 0x804e16500 ret = #2 0x0000000800f02749 in apr_sleep (t=) at time/unix/time.c:246 tv = {tv_sec = 1, tv_usec = 0} #3 0x0000000800d4ce25 in do_sleep (t=0) at src/switch_time.c:164 ts = {tv_sec = 140736951476056, tv_nsec = 140736951476112} #4 switch_sleep (t=0) at src/switch_time.c:632 No locals. #5 0x0000000800c78e51 in pool_thread (thread=, obj=) at src/switch_core_memory.c:569 len = 0 #6 0x0000000800f013a6 in dummy_worker (opaque=0x804f13740) at threadproc/unix/thread.c:151 No locals. #7 0x00000008030dcc05 in thread_start (curthread=0x804e16500) at /usr/src/lib/libthr/thread/thr_create.c:289 set = {__bits = {0, 0, 0, 0}} #8 0x0000000000000000 in ?? () No symbol table info available. Backtrace stopped: Cannot access memory at address 0x7fffdfffe000 Thread 1 (LWP 100834): #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 No symbol table info available. #1 0x00000008030e6f97 in join_common (pthread=0x807ed7700, thread_return=0x7fffffffb658, abstime=0x0) at /usr/src/lib/libthr/thread/thr_join.c:125 ret = tid = 101080 ts = {tv_sec = 34411006815, tv_nsec = 34514890792} tsp = 0x18ad8 #2 0x0000000800f01421 in apr_thread_join (retval=0x7fffffffb68c, thd=0x8059e9658) at threadproc/unix/thread.c:234 stat = #3 0x0000000800cd889e in do_shutdown (module=0x2, shutdown=, unload=SWITCH_TRUE, fail_if_busy=(unknown: 1523667750), err=) at src/switch_loadable_module.c:2031 st = SWITCH_STATUS_SUCCESS pool = flags = 12798607 #4 0x0000000800cdb84a in switch_loadable_module_shutdown () at src/switch_loadable_module.c:2083 i = hi = val = 0x805626460 module = 0x807ed7700 #5 0x0000000800c9d92c in switch_core_destroy () at src/switch_core.c:2940 event = 0x0 #6 0x0000000000403b2b in main (argc=, argv=0x7fffffffe988) at src/switch.c:1210 pid_path = "/opt/freeswitch/var/run/freeswitch/freeswitch.pid", '\000' pid_buffer = "45848", '\000' old_pid_buffer = "45690", '\000' opts_str = '\000' local_argv = {0x7fffffffec40 "/opt/freeswitch/bin/freeswitch", 0x7fffffffec5f "-c", 0x0 } arg_argv = {0x0 } local_argc = 2 reincarnate_reexec = reincarnate = do_wait = nf = pid = nc = ret = flags = 68225 priority = do_kill = 0 run_set = log_set = 0 alt_base = alt_dirs = 0 x = opts = i = runas_group = 0x0 pid_len = 5 pool = fd = old_pid_len = 5 err = 0x800f28b86 "Success" destroy_status = --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=thread.c Content-Transfer-Encoding: base64 LyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVy IG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUg Tk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwg aW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGlj ZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24g Mi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQg aW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5 IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5z ZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUg TGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdB UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w bGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJu aW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICov CgojaW5jbHVkZSAiYXByLmgiCiNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKI2luY2x1ZGUgImFw cl9hcmNoX3RocmVhZHByb2MuaCIKCiNpZiBBUFJfSEFTX1RIUkVBRFMKCiNpZiBBUFJfSEFWRV9Q VEhSRUFEX0gKCi8qIERlc3Ryb3kgdGhlIHRocmVhZGF0dHIgb2JqZWN0ICovCnN0YXRpYyBhcHJf c3RhdHVzX3QgdGhyZWFkYXR0cl9jbGVhbnVwKHZvaWQgKmRhdGEpCnsKICAgIGFwcl90aHJlYWRh dHRyX3QgKmF0dHIgPSBkYXRhOwogICAgYXByX3N0YXR1c190IHJ2OwoKICAgIHJ2ID0gcHRocmVh ZF9hdHRyX2Rlc3Ryb3koJmF0dHItPmF0dHIpOwojaWZkZWYgUFRIUkVBRF9TRVRTX0VSUk5PCiAg ICBpZiAocnYpIHsKICAgICAgICBydiA9IGVycm5vOwogICAgfQojZW5kaWYKICAgIHJldHVybiBy djsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkYXR0cl9jcmVhdGUoYXBy X3RocmVhZGF0dHJfdCAqKm5ldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgYXByX3Bvb2xfdCAqcG9vbCkKewogICAgYXByX3N0YXR1c190IHN0YXQ7Cgog ICAgKCpuZXcpID0gYXByX3BhbGxvYyhwb29sLCBzaXplb2YoYXByX3RocmVhZGF0dHJfdCkpOwog ICAgKCpuZXcpLT5wb29sID0gcG9vbDsKICAgIHN0YXQgPSBwdGhyZWFkX2F0dHJfaW5pdCgmKCpu ZXcpLT5hdHRyKTsKCiAgICBpZiAoc3RhdCA9PSAwKSB7CiAgICAgICAgYXByX3Bvb2xfY2xlYW51 cF9yZWdpc3Rlcihwb29sLCAqbmV3LCB0aHJlYWRhdHRyX2NsZWFudXAsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBhcHJfcG9vbF9jbGVhbnVwX251bGwpOwogICAgICAgIHJldHVy biBBUFJfU1VDQ0VTUzsKICAgIH0KI2lmZGVmIFBUSFJFQURfU0VUU19FUlJOTwogICAgc3RhdCA9 IGVycm5vOwojZW5kaWYKCiAgICByZXR1cm4gc3RhdDsKfQoKI2RlZmluZSBERVRBQ0hfQVJHKHYp ICgodikgPyBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCA6IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxF KQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkYXR0cl9kZXRhY2hfc2V0KGFw cl90aHJlYWRhdHRyX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBhcHJfaW50MzJfdCBvbikKewogICAgYXByX3N0YXR1c190IHN0YXQ7 CiNpZmRlZiBQVEhSRUFEX0FUVFJfU0VUREVUQUNIU1RBVEVfQVJHMl9BRERSCiAgICBpbnQgYXJn ID0gREVUQUNIX0FSRyh2KTsKCiAgICBpZiAoKHN0YXQgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNo c3RhdGUoJmF0dHItPmF0dHIsICZhcmcpKSA9PSAwKSB7CiNlbHNlCiAgICBpZiAoKHN0YXQgPSBw dGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHItPmF0dHIsIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVEFDSF9BUkcob24pKSkgPT0gMCkgewojZW5k aWYKICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7CiAgICB9CiAgICBlbHNlIHsKI2lmZGVmIFBU SFJFQURfU0VUU19FUlJOTwogICAgICAgIHN0YXQgPSBlcnJubzsKI2VuZGlmCgogICAgICAgIHJl dHVybiBzdGF0OwogICAgfQp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwcl90aHJlYWRh dHRyX2RldGFjaF9nZXQoYXByX3RocmVhZGF0dHJfdCAqYXR0cikKewogICAgaW50IHN0YXRlOwoK I2lmZGVmIFBUSFJFQURfQVRUUl9HRVRERVRBQ0hTVEFURV9UQUtFU19PTkVfQVJHCiAgICBzdGF0 ZSA9IHB0aHJlYWRfYXR0cl9nZXRkZXRhY2hzdGF0ZSgmYXR0ci0+YXR0cik7CiNlbHNlCiAgICBw dGhyZWFkX2F0dHJfZ2V0ZGV0YWNoc3RhdGUoJmF0dHItPmF0dHIsICZzdGF0ZSk7CiNlbmRpZgog ICAgaWYgKHN0YXRlID09IDEpCiAgICAgICAgcmV0dXJuIEFQUl9ERVRBQ0g7CiAgICByZXR1cm4g QVBSX05PVERFVEFDSDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkYXR0 cl9zdGFja3NpemVfc2V0KGFwcl90aHJlYWRhdHRyX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfc2l6ZV90IHN0YWNrc2l6 ZSkKewogICAgaW50IHN0YXQ7CgogICAgc3RhdCA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUo JmF0dHItPmF0dHIsIHN0YWNrc2l6ZSk7CiAgICBpZiAoc3RhdCA9PSAwKSB7CiAgICAgICAgcmV0 dXJuIEFQUl9TVUNDRVNTOwogICAgfQojaWZkZWYgUFRIUkVBRF9TRVRTX0VSUk5PCiAgICBzdGF0 ID0gZXJybm87CiNlbmRpZgoKICAgIHJldHVybiBzdGF0Owp9CgpBUFJfREVDTEFSRShhcHJfc3Rh dHVzX3QpIGFwcl90aHJlYWRhdHRyX2d1YXJkc2l6ZV9zZXQoYXByX3RocmVhZGF0dHJfdCAqYXR0 ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGFwcl9zaXplX3Qgc2l6ZSkKewojaWZkZWYgSEFWRV9QVEhSRUFEX0FUVFJfU0VUR1VBUkRTSVpF CiAgICBhcHJfc3RhdHVzX3QgcnY7CgogICAgcnYgPSBwdGhyZWFkX2F0dHJfc2V0Z3VhcmRzaXpl KCZhdHRyLT5hdHRyLCBzaXplKTsKICAgIGlmIChydiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIEFQ Ul9TVUNDRVNTOwogICAgfQojaWZkZWYgUFRIUkVBRF9TRVRTX0VSUk5PCiAgICBydiA9IGVycm5v OwojZW5kaWYKICAgIHJldHVybiBydjsKI2Vsc2UKICAgIHJldHVybiBBUFJfRU5PVElNUEw7CiNl bmRpZgp9CgpzdGF0aWMgdm9pZCAqZHVtbXlfd29ya2VyKHZvaWQgKm9wYXF1ZSkKewogICAgYXBy X3RocmVhZF90ICp0aHJlYWQgPSAoYXByX3RocmVhZF90KilvcGFxdWU7CgojaWZkZWYgSEFWRV9Q VEhSRUFEX1NFVFNDSEVEUEFSQU0KCWlmICh0aHJlYWQtPnByaW9yaXR5KSB7CgkJaW50IHBvbGlj eTsKCQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IDAgfTsKCQlwdGhyZWFkX3QgdHQgPSBw dGhyZWFkX3NlbGYoKTsKCQoJCXB0aHJlYWRfZ2V0c2NoZWRwYXJhbSh0dCwgJnBvbGljeSwgJnBh cmFtKTsKCQlwYXJhbS5zY2hlZF9wcmlvcml0eSA9IHRocmVhZC0+cHJpb3JpdHk7CgkJcHRocmVh ZF9zZXRzY2hlZHBhcmFtKHR0LCBwb2xpY3ksICZwYXJhbSk7Cgl9CiNlbmRpZgoKICAgIHJldHVy biB0aHJlYWQtPmZ1bmModGhyZWFkLCB0aHJlYWQtPmRhdGEpOwp9CgpBUFJfREVDTEFSRShhcHJf c3RhdHVzX3QpIGFwcl90aHJlYWRfY3JlYXRlKGFwcl90aHJlYWRfdCAqKm5ldywKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfdGhyZWFkYXR0cl90ICphdHRy LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl90aHJlYWRf c3RhcnRfdCBmdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHZvaWQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg YXByX3Bvb2xfdCAqcG9vbCkKewogICAgYXByX3N0YXR1c190IHN0YXQ7CiAgICBwdGhyZWFkX2F0 dHJfdCAqdGVtcDsKCXB0aHJlYWRfdCB0dDsKCiAgICAoKm5ldykgPSAoYXByX3RocmVhZF90ICop YXByX3BjYWxsb2MocG9vbCwgc2l6ZW9mKGFwcl90aHJlYWRfdCkpOwoKICAgIGlmICgoKm5ldykg PT0gTlVMTCkgewogICAgICAgIHJldHVybiBBUFJfRU5PTUVNOwogICAgfQoKICAgICgqbmV3KS0+ dGQgPSAocHRocmVhZF90ICopYXByX3BjYWxsb2MocG9vbCwgc2l6ZW9mKHB0aHJlYWRfdCkpOwoK ICAgIGlmICgoKm5ldyktPnRkID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gQVBSX0VOT01FTTsK ICAgIH0KCiAgICAoKm5ldyktPnBvb2wgPSBwb29sOwogICAgKCpuZXcpLT5kYXRhID0gZGF0YTsK ICAgICgqbmV3KS0+ZnVuYyA9IGZ1bmM7CgogICAgaWYgKGF0dHIpCiAgICAgICAgdGVtcCA9ICZh dHRyLT5hdHRyOwogICAgZWxzZQogICAgICAgIHRlbXAgPSBOVUxMOwoKICAgIHN0YXQgPSBhcHJf cG9vbF9jcmVhdGUoJigqbmV3KS0+cG9vbCwgcG9vbCk7CiAgICBpZiAoc3RhdCAhPSBBUFJfU1VD Q0VTUykgewogICAgICAgIHJldHVybiBzdGF0OwogICAgfQoKCWlmIChhdHRyICYmIGF0dHItPnBy aW9yaXR5KSB7CgkJKCpuZXcpLT5wcmlvcml0eSA9IGF0dHItPnByaW9yaXR5OwoJfQoKICAgIGlm ICgoc3RhdCA9IHB0aHJlYWRfY3JlYXRlKCZ0dCwgdGVtcCwgZHVtbXlfd29ya2VyLCAoKm5ldykp KSA9PSAwKSB7CgkJKigqbmV3KS0+dGQgPSB0dDsKCiAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNT OwogICAgfQogICAgZWxzZSB7CiNpZmRlZiBQVEhSRUFEX1NFVFNfRVJSTk8KICAgICAgICBzdGF0 ID0gZXJybm87CiNlbmRpZgoKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KfQoKQVBSX0RFQ0xB UkUoYXByX29zX3RocmVhZF90KSBhcHJfb3NfdGhyZWFkX2N1cnJlbnQodm9pZCkKewogICAgcmV0 dXJuIHB0aHJlYWRfc2VsZigpOwp9CgpBUFJfREVDTEFSRShpbnQpIGFwcl9vc190aHJlYWRfZXF1 YWwoYXByX29zX3RocmVhZF90IHRpZDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBhcHJfb3NfdGhyZWFkX3QgdGlkMikKewogICAgcmV0dXJuIHB0aHJlYWRfZXF1YWwodGlk MSwgdGlkMik7Cn0KCkFQUl9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXByX3RocmVhZF9leGl0KGFw cl90aHJlYWRfdCAqdGhkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBhcHJfc3RhdHVzX3QgcmV0dmFsKQp7CiAgICB0aGQtPmV4aXR2YWwgPSByZXR2YWw7CiAgICBh cHJfcG9vbF9kZXN0cm95KHRoZC0+cG9vbCk7CiAgICBwdGhyZWFkX2V4aXQoTlVMTCk7CiAgICBy ZXR1cm4gQVBSX1NVQ0NFU1M7Cn0KCkFQUl9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXByX3RocmVh ZF9qb2luKGFwcl9zdGF0dXNfdCAqcmV0dmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBhcHJfdGhyZWFkX3QgKnRoZCkKewogICAgYXByX3N0YXR1c190IHN0YXQ7 CiAgICBhcHJfc3RhdHVzX3QgKnRocmVhZF9zdGF0OwoKICAgIGlmICgoc3RhdCA9IHB0aHJlYWRf am9pbigqdGhkLT50ZCwodm9pZCAqKSZ0aHJlYWRfc3RhdCkpID09IDApIHsKICAgICAgICAqcmV0 dmFsID0gdGhkLT5leGl0dmFsOwogICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKICAgIH0KICAg IGVsc2UgewojaWZkZWYgUFRIUkVBRF9TRVRTX0VSUk5PCiAgICAgICAgc3RhdCA9IGVycm5vOwoj ZW5kaWYKCiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9Cn0KCkFQUl9ERUNMQVJFKGFwcl9zdGF0 dXNfdCkgYXByX3RocmVhZF9kZXRhY2goYXByX3RocmVhZF90ICp0aGQpCnsKICAgIGFwcl9zdGF0 dXNfdCBzdGF0OwoKI2lmZGVmIFBUSFJFQURfREVUQUNIX0FSRzFfQUREUgogICAgaWYgKChzdGF0 ID0gcHRocmVhZF9kZXRhY2godGhkLT50ZCkpID09IDApIHsKI2Vsc2UKICAgIGlmICgoc3RhdCA9 IHB0aHJlYWRfZGV0YWNoKCp0aGQtPnRkKSkgPT0gMCkgewojZW5kaWYKCiAgICAgICAgcmV0dXJu IEFQUl9TVUNDRVNTOwogICAgfQogICAgZWxzZSB7CiNpZmRlZiBQVEhSRUFEX1NFVFNfRVJSTk8K ICAgICAgICBzdGF0ID0gZXJybm87CiNlbmRpZgoKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0K fQoKdm9pZCBhcHJfdGhyZWFkX3lpZWxkKCkKewp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3Qp IGFwcl90aHJlYWRfZGF0YV9nZXQodm9pZCAqKmRhdGEsIGNvbnN0IGNoYXIgKmtleSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl90aHJlYWRfdCAqdGhy ZWFkKQp7CiAgICByZXR1cm4gYXByX3Bvb2xfdXNlcmRhdGFfZ2V0KGRhdGEsIGtleSwgdGhyZWFk LT5wb29sKTsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkX2RhdGFfc2V0 KHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYXByX3N0YXR1c190ICgqY2xlYW51cCkodm9pZCAqKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYXByX3RocmVhZF90ICp0aHJlYWQpCnsKICAgIHJldHVybiBhcHJfcG9vbF91c2Vy ZGF0YV9zZXQoZGF0YSwga2V5LCBjbGVhbnVwLCB0aHJlYWQtPnBvb2wpOwp9CgpBUFJfREVDTEFS RShhcHJfc3RhdHVzX3QpIGFwcl9vc190aHJlYWRfZ2V0KGFwcl9vc190aHJlYWRfdCAqKnRoZXRo ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfdGhyZWFk X3QgKnRoZCkKewogICAgKnRoZXRoZCA9IHRoZC0+dGQ7CiAgICByZXR1cm4gQVBSX1NVQ0NFU1M7 Cn0KCkFQUl9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXByX29zX3RocmVhZF9wdXQoYXByX3RocmVh ZF90ICoqdGhkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFw cl9vc190aHJlYWRfdCAqdGhldGhkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGFwcl9wb29sX3QgKnBvb2wpCnsKICAgIGlmIChwb29sID09IE5VTEwpIHsKICAg ICAgICByZXR1cm4gQVBSX0VOT1BPT0w7CiAgICB9CgogICAgaWYgKCgqdGhkKSA9PSBOVUxMKSB7 CiAgICAgICAgKCp0aGQpID0gKGFwcl90aHJlYWRfdCAqKWFwcl9wY2FsbG9jKHBvb2wsIHNpemVv ZihhcHJfdGhyZWFkX3QpKTsKICAgICAgICAoKnRoZCktPnBvb2wgPSBwb29sOwogICAgfQoKICAg ICgqdGhkKS0+dGQgPSB0aGV0aGQ7CiAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Cn0KCkFQUl9ERUNM QVJFKGFwcl9zdGF0dXNfdCkgYXByX3RocmVhZF9vbmNlX2luaXQoYXByX3RocmVhZF9vbmNlX3Qg Kipjb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGFwcl9wb29sX3QgKnApCnsKICAgIHN0YXRpYyBjb25zdCBwdGhyZWFkX29uY2VfdCBvbmNlX2lu aXQgPSBQVEhSRUFEX09OQ0VfSU5JVDsKCiAgICAqY29udHJvbCA9IGFwcl9wYWxsb2MocCwgc2l6 ZW9mKCoqY29udHJvbCkpOwogICAgKCpjb250cm9sKS0+b25jZSA9IG9uY2VfaW5pdDsKICAgIHJl dHVybiBBUFJfU1VDQ0VTUzsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFk X29uY2UoYXByX3RocmVhZF9vbmNlX3QgKmNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmdW5jKSh2b2lkKSkKewogICAgcmV0dXJuIHB0aHJl YWRfb25jZSgmY29udHJvbC0+b25jZSwgZnVuYyk7Cn0KCkFQUl9QT09MX0lNUExFTUVOVF9BQ0NF U1NPUih0aHJlYWQpCgojZW5kaWYgIC8qIEhBVkVfUFRIUkVBRF9IICovCiNlbmRpZiAgLyogQVBS X0hBU19USFJFQURTICovCgojaWYgIUFQUl9IQVNfVEhSRUFEUwoKLyogYXZvaWQgd2FybmluZyBm b3Igbm8gcHJvdG90eXBlICovCkFQUl9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXByX29zX3RocmVh ZF9nZXQodm9pZCk7CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwcl9vc190aHJlYWRfZ2V0 KHZvaWQpCnsKICAgIHJldHVybiBBUFJfRU5PVElNUEw7Cn0KCiNlbmRpZgo= --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=switch_loadable_module.c Content-Transfer-Encoding: base64 LyoKICogRnJlZVNXSVRDSCBNb2R1bGFyIE1lZGlhIFN3aXRjaGluZyBTb2Z0d2FyZSBMaWJyYXJ5 IC8gU29mdC1Td2l0Y2ggQXBwbGljYXRpb24KICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTQsIEFu dGhvbnkgTWluZXNzYWxlIElJIDxhbnRobUBmcmVlc3dpdGNoLm9yZz4KICoKICogVmVyc2lvbjog TVBMIDEuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRo ZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsg eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRo ZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0 cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVy IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhP VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0 aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMg YW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwg Q29kZSBpcyBGcmVlU1dJVENIIE1vZHVsYXIgTWVkaWEgU3dpdGNoaW5nIFNvZnR3YXJlIExpYnJh cnkgLyBTb2Z0LVN3aXRjaCBBcHBsaWNhdGlvbgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIg b2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQW50aG9ueSBNaW5lc3NhbGUgSUkgPGFudGhtQGZy ZWVzd2l0Y2gub3JnPgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3Bl ciBhcmUgQ29weXJpZ2h0IChDKQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMg UmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKgogKiBBbnRob255IE1pbmVzc2FsZSBJ SSA8YW50aG1AZnJlZXN3aXRjaC5vcmc+CiAqIFNldmVuIER1IDxkdWppbmZhbmdAZ21haWwuY29t PgogKgogKiBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlLmMgLS0gTG9hZGFibGUgTW9kdWxlcwogKgog Ki8KCiNpbmNsdWRlIDxzd2l0Y2guaD4KCi8qIGZvciBhcHJfcHN0cmNhdCAqLwojaW5jbHVkZSA8 YXByX3N0cmluZ3MuaD4KCi8qIGZvciBhcHJfZW52X2dldCBhbmQgYXByX2Vudl9zZXQgKi8KI2lu Y2x1ZGUgPGFwcl9lbnYuaD4KCi8qIGZvciBhcHIgZmlsZSBhbmQgZGlyZWN0b3J5IGhhbmRsaW5n ICovCiNpbmNsdWRlIDxhcHJfZmlsZV9pby5oPgoKdHlwZWRlZiBzdHJ1Y3Qgc3dpdGNoX2ZpbGVf bm9kZV9zIHsKCWNvbnN0IHN3aXRjaF9maWxlX2ludGVyZmFjZV90ICpwdHI7Cgljb25zdCBjaGFy ICppbnRlcmZhY2VfbmFtZTsKCXN0cnVjdCBzd2l0Y2hfZmlsZV9ub2RlX3MgKm5leHQ7Cn0gc3dp dGNoX2ZpbGVfbm9kZV90OwoKdHlwZWRlZiBzdHJ1Y3Qgc3dpdGNoX2NvZGVjX25vZGVfcyB7Cglj b25zdCBzd2l0Y2hfY29kZWNfaW50ZXJmYWNlX3QgKnB0cjsKCWNvbnN0IGNoYXIgKmludGVyZmFj ZV9uYW1lOwoJc3RydWN0IHN3aXRjaF9jb2RlY19ub2RlX3MgKm5leHQ7Cn0gc3dpdGNoX2NvZGVj X25vZGVfdDsKCgpzdHJ1Y3Qgc3dpdGNoX2xvYWRhYmxlX21vZHVsZSB7CgljaGFyICprZXk7Cglj aGFyICpmaWxlbmFtZTsKCWludCBwZXJtOwoJc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9pbnRlcmZh Y2VfdCAqbW9kdWxlX2ludGVyZmFjZTsKCXN3aXRjaF9kc29fbGliX3QgbGliOwoJc3dpdGNoX21v ZHVsZV9sb2FkX3Qgc3dpdGNoX21vZHVsZV9sb2FkOwoJc3dpdGNoX21vZHVsZV9ydW50aW1lX3Qg c3dpdGNoX21vZHVsZV9ydW50aW1lOwoJc3dpdGNoX21vZHVsZV9zaHV0ZG93bl90IHN3aXRjaF9t b2R1bGVfc2h1dGRvd247Cglzd2l0Y2hfbWVtb3J5X3Bvb2xfdCAqcG9vbDsKCXN3aXRjaF9zdGF0 dXNfdCBzdGF0dXM7Cglzd2l0Y2hfdGhyZWFkX3QgKnRocmVhZDsKCXN3aXRjaF9ib29sX3Qgc2h1 dHRpbmdfZG93bjsKfTsKCnN0cnVjdCBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX2NvbnRhaW5lciB7 Cglzd2l0Y2hfaGFzaF90ICptb2R1bGVfaGFzaDsKCXN3aXRjaF9oYXNoX3QgKmVuZHBvaW50X2hh c2g7Cglzd2l0Y2hfaGFzaF90ICpjb2RlY19oYXNoOwoJc3dpdGNoX2hhc2hfdCAqZGlhbHBsYW5f aGFzaDsKCXN3aXRjaF9oYXNoX3QgKnRpbWVyX2hhc2g7Cglzd2l0Y2hfaGFzaF90ICphcHBsaWNh dGlvbl9oYXNoOwoJc3dpdGNoX2hhc2hfdCAqY2hhdF9hcHBsaWNhdGlvbl9oYXNoOwoJc3dpdGNo X2hhc2hfdCAqYXBpX2hhc2g7Cglzd2l0Y2hfaGFzaF90ICpqc29uX2FwaV9oYXNoOwoJc3dpdGNo X2hhc2hfdCAqZmlsZV9oYXNoOwoJc3dpdGNoX2hhc2hfdCAqc3BlZWNoX2hhc2g7Cglzd2l0Y2hf aGFzaF90ICphc3JfaGFzaDsKCXN3aXRjaF9oYXNoX3QgKmRpcmVjdG9yeV9oYXNoOwoJc3dpdGNo X2hhc2hfdCAqY2hhdF9oYXNoOwoJc3dpdGNoX2hhc2hfdCAqc2F5X2hhc2g7Cglzd2l0Y2hfaGFz aF90ICptYW5hZ2VtZW50X2hhc2g7Cglzd2l0Y2hfaGFzaF90ICpsaW1pdF9oYXNoOwoJc3dpdGNo X2hhc2hfdCAqc2Vjb25kYXJ5X3JlY292ZXJfaGFzaDsKCXN3aXRjaF9tdXRleF90ICptdXRleDsK CXN3aXRjaF9tZW1vcnlfcG9vbF90ICpwb29sOwp9OwoKc3RhdGljIHN0cnVjdCBzd2l0Y2hfbG9h ZGFibGVfbW9kdWxlX2NvbnRhaW5lciBsb2FkYWJsZV9tb2R1bGVzOwpzdGF0aWMgc3dpdGNoX3N0 YXR1c190IGRvX3NodXRkb3duKHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfdCAqbW9kdWxlLCBzd2l0 Y2hfYm9vbF90IHNodXRkb3duLCBzd2l0Y2hfYm9vbF90IHVubG9hZCwgc3dpdGNoX2Jvb2xfdCBm YWlsX2lmX2J1c3ksCgkJCQkJCQkJICAgY29uc3QgY2hhciAqKmVycik7CnN0YXRpYyBzd2l0Y2hf c3RhdHVzX3Qgc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9sb2FkX21vZHVsZV9leChjaGFyICpkaXIs IGNoYXIgKmZuYW1lLCBzd2l0Y2hfYm9vbF90IHJ1bnRpbWUsIHN3aXRjaF9ib29sX3QgZ2xvYmFs LCBjb25zdCBjaGFyICoqZXJyKTsKCnN0YXRpYyB2b2lkICpTV0lUQ0hfVEhSRUFEX0ZVTkMgc3dp dGNoX2xvYWRhYmxlX21vZHVsZV9leGVjKHN3aXRjaF90aHJlYWRfdCAqdGhyZWFkLCB2b2lkICpv YmopCnsKCgoJc3dpdGNoX3N0YXR1c190IHN0YXR1cyA9IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUzsK CXN3aXRjaF9jb3JlX3RocmVhZF9zZXNzaW9uX3QgKnRzID0gb2JqOwoJc3dpdGNoX2xvYWRhYmxl X21vZHVsZV90ICptb2R1bGUgPSB0cy0+b2Jqc1swXTsKCWludCByZXN0YXJ0czsKCglzd2l0Y2hf YXNzZXJ0KHRocmVhZCAhPSBOVUxMKTsKCXN3aXRjaF9hc3NlcnQobW9kdWxlICE9IE5VTEwpOwoK CWZvciAocmVzdGFydHMgPSAwOyBzdGF0dXMgIT0gU1dJVENIX1NUQVRVU19URVJNICYmICFtb2R1 bGUtPnNodXR0aW5nX2Rvd247IHJlc3RhcnRzKyspIHsKCQlzdGF0dXMgPSBtb2R1bGUtPnN3aXRj aF9tb2R1bGVfcnVudGltZSgpOwoJfQoJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxf TE9HLCBTV0lUQ0hfTE9HX05PVElDRSwgIlRocmVhZCBlbmRlZCBmb3IgJXNcbiIsIG1vZHVsZS0+ bW9kdWxlX2ludGVyZmFjZS0+bW9kdWxlX25hbWUpOwoKCWlmICh0cy0+cG9vbCkgewoJCXN3aXRj aF9tZW1vcnlfcG9vbF90ICpwb29sID0gdHMtPnBvb2w7CgkJc3dpdGNoX2xvZ19wcmludGYoU1dJ VENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0RFQlVHLCAiRGVzdHJveWluZyBQb29sIGZvciAl c1xuIiwgbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5tb2R1bGVfbmFtZSk7CgkJc3dpdGNoX2Nv cmVfZGVzdHJveV9tZW1vcnlfcG9vbCgmcG9vbCk7Cgl9Cglzd2l0Y2hfdGhyZWFkX2V4aXQodGhy ZWFkLCAwKTsKCXJldHVybiBOVUxMOwp9CgoKc3RhdGljIHZvaWQgc3dpdGNoX2xvYWRhYmxlX21v ZHVsZV9ydW50aW1lKHZvaWQpCnsKCXN3aXRjaF9oYXNoX2luZGV4X3QgKmhpOwoJdm9pZCAqdmFs OwoJc3dpdGNoX2xvYWRhYmxlX21vZHVsZV90ICptb2R1bGU7CgoJc3dpdGNoX211dGV4X2xvY2so bG9hZGFibGVfbW9kdWxlcy5tdXRleCk7Cglmb3IgKGhpID0gc3dpdGNoX2NvcmVfaGFzaF9maXJz dChsb2FkYWJsZV9tb2R1bGVzLm1vZHVsZV9oYXNoKTsgaGk7IGhpID0gc3dpdGNoX2NvcmVfaGFz aF9uZXh0KCZoaSkpIHsKCQlzd2l0Y2hfY29yZV9oYXNoX3RoaXMoaGksIE5VTEwsIE5VTEwsICZ2 YWwpOwoJCW1vZHVsZSA9IChzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3QgKikgdmFsOwoKCQlpZiAo bW9kdWxlLT5zd2l0Y2hfbW9kdWxlX3J1bnRpbWUpIHsKCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJ VENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NPTlNPTEUsICJTdGFydGluZyBydW50aW1lIHRo cmVhZCBmb3IgJXNcbiIsIG1vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+bW9kdWxlX25hbWUpOwoJ CQltb2R1bGUtPnRocmVhZCA9IHN3aXRjaF9jb3JlX2xhdW5jaF90aHJlYWQoc3dpdGNoX2xvYWRh YmxlX21vZHVsZV9leGVjLCBtb2R1bGUsIGxvYWRhYmxlX21vZHVsZXMucG9vbCk7CgkJfQoJfQoJ c3dpdGNoX211dGV4X3VubG9jayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKfQoKc3RhdGljIHN3 aXRjaF9zdGF0dXNfdCBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3Byb2Nlc3MoY2hhciAqa2V5LCBz d2l0Y2hfbG9hZGFibGVfbW9kdWxlX3QgKm5ld19tb2R1bGUpCnsKCXN3aXRjaF9ldmVudF90ICpl dmVudDsKCWludCBhZGRlZCA9IDA7CgoJbmV3X21vZHVsZS0+a2V5ID0gc3dpdGNoX2NvcmVfc3Ry ZHVwKG5ld19tb2R1bGUtPnBvb2wsIGtleSk7CgoJc3dpdGNoX211dGV4X2xvY2sobG9hZGFibGVf bW9kdWxlcy5tdXRleCk7Cglzd2l0Y2hfY29yZV9oYXNoX2luc2VydChsb2FkYWJsZV9tb2R1bGVz Lm1vZHVsZV9oYXNoLCBrZXksIG5ld19tb2R1bGUpOwoKCWlmIChuZXdfbW9kdWxlLT5tb2R1bGVf aW50ZXJmYWNlLT5lbmRwb2ludF9pbnRlcmZhY2UpIHsKCQljb25zdCBzd2l0Y2hfZW5kcG9pbnRf aW50ZXJmYWNlX3QgKnB0cjsKCQlmb3IgKHB0ciA9IG5ld19tb2R1bGUtPm1vZHVsZV9pbnRlcmZh Y2UtPmVuZHBvaW50X2ludGVyZmFjZTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKCQkJaWYgKCFw dHItPmludGVyZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5F TF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwgIkZhaWxlZCB0byBsb2FkIGVuZHBvaW50IGludGVyZmFj ZSBmcm9tICVzIGR1ZSB0byBubyBpbnRlcmZhY2UgbmFtZS5cbiIsIGtleSk7CgkJCX0gZWxzZSB7 CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9U SUNFLCAiQWRkaW5nIEVuZHBvaW50ICclcydcbiIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJ c3dpdGNoX2NvcmVfaGFzaF9pbnNlcnQobG9hZGFibGVfbW9kdWxlcy5lbmRwb2ludF9oYXNoLCBw dHItPmludGVyZmFjZV9uYW1lLCAoY29uc3Qgdm9pZCAqKSBwdHIpOwoJCQkJaWYgKHN3aXRjaF9l dmVudF9jcmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZFTlRfTU9EVUxFX0xPQUQpID09IFNXSVRDSF9T VEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVu dCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiZW5kcG9pbnQiKTsKCQkJCQlzd2l0Y2hf ZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuYW1l IiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3Ry aW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAia2V5IiwgbmV3X21vZHVsZS0+a2V5KTsK CQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19C T1RUT00sICJmaWxlbmFtZSIsIG5ld19tb2R1bGUtPmZpbGVuYW1lKTsKCQkJCQlzd2l0Y2hfZXZl bnRfZmlyZSgmZXZlbnQpOwoJCQkJCWFkZGVkKys7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYgKG5l d19tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmNvZGVjX2ludGVyZmFjZSkgewoJCWNvbnN0IHN3 aXRjaF9jb2RlY19pbXBsZW1lbnRhdGlvbl90ICppbXBsOwoJCWNvbnN0IHN3aXRjaF9jb2RlY19p bnRlcmZhY2VfdCAqcHRyOwoKCQlmb3IgKHB0ciA9IG5ld19tb2R1bGUtPm1vZHVsZV9pbnRlcmZh Y2UtPmNvZGVjX2ludGVyZmFjZTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKCQkJaWYgKCFwdHIt PmludGVyZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9M T0csIFNXSVRDSF9MT0dfQ1JJVCwgIkZhaWxlZCB0byBsb2FkIGNvZGVjIGludGVyZmFjZSBmcm9t ICVzIGR1ZSB0byBubyBpbnRlcmZhY2UgbmFtZS5cbiIsIGtleSk7CgkJCX0gZWxzZSB7CgkJCQl1 bnNpZ25lZCBsb2FkX2ludGVyZmFjZSA9IDE7CgkJCQlzd2l0Y2hfY29kZWNfbm9kZV90ICpub2Rl LCAqaGVhZDsKCgkJCQlmb3IgKGltcGwgPSBwdHItPmltcGxlbWVudGF0aW9uczsgaW1wbDsgaW1w bCA9IGltcGwtPm5leHQpIHsKCQkJCQlpZiAoIWltcGwtPmlhbmFuYW1lKSB7CgkJCQkJCWxvYWRf aW50ZXJmYWNlID0gMDsKCQkJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9H LCBTV0lUQ0hfTE9HX0NSSVQsCgkJCQkJCQkJCQkgICJGYWlsZWQgdG8gbG9hZCBjb2RlYyBpbnRl cmZhY2UgJXMgZnJvbSAlcyBkdWUgdG8gbm8gaWFuYSBuYW1lIGluIGFuIGltcGxlbWVudGF0aW9u LlxuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSwKCQkJCQkJCQkJCSAga2V5KTsKCQkJCQkJYnJlYWs7 CgkJCQkJfQoJCQkJCWlmIChpbXBsLT5kZWNvZGVkX2J5dGVzX3Blcl9wYWNrZXQgPiBTV0lUQ0hf UkVDT01NRU5ERURfQlVGRkVSX1NJWkUpIHsKCQkJCQkJbG9hZF9pbnRlcmZhY2UgPSAwOwoJCQkJ CQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwK CQkJCQkJCQkJCSAgIkZhaWxlZCB0byBsb2FkIGNvZGVjIGludGVyZmFjZSAlcyBmcm9tICVzIGR1 ZSB0byBieXRlcyBwZXIgZnJhbWUgJWQgZXhjZWVkaW5nIGJ1ZmZlciBzaXplICVkLlxuIiwKCQkJ CQkJCQkJCSAgcHRyLT5pbnRlcmZhY2VfbmFtZSwKCQkJCQkJCQkJCSAga2V5LCBpbXBsLT5kZWNv ZGVkX2J5dGVzX3Blcl9wYWNrZXQsIFNXSVRDSF9SRUNPTU1FTkRFRF9CVUZGRVJfU0laRSk7CgkJ CQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmIChsb2FkX2ludGVyZmFjZSkgewoJCQkJCWZv ciAoaW1wbCA9IHB0ci0+aW1wbGVtZW50YXRpb25zOyBpbXBsOyBpbXBsID0gaW1wbC0+bmV4dCkg ewoJCQkJCQlpZiAoaW1wbC0+Yml0c19wZXJfc2Vjb25kKSB7CgkJCQkJCQlzd2l0Y2hfbG9nX3By aW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLAoJCQkJCQkJCQkJCSAg IkFkZGluZyBDb2RlYyAlcyAlZCAlcyAlZGh6ICVkbXMgJWRjaCAlZGJwc1xuIiwKCQkJCQkJCQkJ CQkgIGltcGwtPmlhbmFuYW1lLCBpbXBsLT5pYW5hY29kZSwKCQkJCQkJCQkJCQkgIHB0ci0+aW50 ZXJmYWNlX25hbWUsIGltcGwtPmFjdHVhbF9zYW1wbGVzX3Blcl9zZWNvbmQsCgkJCQkJCQkJCQkJ ICBpbXBsLT5taWNyb3NlY29uZHNfcGVyX3BhY2tldCAvIDEwMDAsIGltcGwtPm51bWJlcl9vZl9j aGFubmVscywgaW1wbC0+Yml0c19wZXJfc2Vjb25kKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXN3 aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsCgkJ CQkJCQkJCQkJICAiQWRkaW5nIENvZGVjICVzICVkICVzICVkaHogJWRtcyAlZGNoIChWQlIpXG4i LAoJCQkJCQkJCQkJCSAgaW1wbC0+aWFuYW5hbWUsIGltcGwtPmlhbmFjb2RlLAoJCQkJCQkJCQkJ CSAgcHRyLT5pbnRlcmZhY2VfbmFtZSwgaW1wbC0+YWN0dWFsX3NhbXBsZXNfcGVyX3NlY29uZCwg aW1wbC0+bWljcm9zZWNvbmRzX3Blcl9wYWNrZXQgLyAxMDAwLCBpbXBsLT5udW1iZXJfb2ZfY2hh bm5lbHMpOwoJCQkJCQl9CgoJCQkJCQlub2RlID0gc3dpdGNoX2NvcmVfYWxsb2MobmV3X21vZHVs ZS0+cG9vbCwgc2l6ZW9mKCpub2RlKSk7CgkJCQkJCW5vZGUtPnB0ciA9IHB0cjsKCQkJCQkJbm9k ZS0+aW50ZXJmYWNlX25hbWUgPSBzd2l0Y2hfY29yZV9zdHJkdXAobmV3X21vZHVsZS0+cG9vbCwg bmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+bW9kdWxlX25hbWUpOwoJCQkJCQlpZiAoKGhl YWQgPSBzd2l0Y2hfY29yZV9oYXNoX2ZpbmQobG9hZGFibGVfbW9kdWxlcy5jb2RlY19oYXNoLCBp bXBsLT5pYW5hbmFtZSkpKSB7CgkJCQkJCQlub2RlLT5uZXh0ID0gaGVhZDsKCQkJCQkJfQoKCQkJ CQkJc3dpdGNoX2NvcmVfaGFzaF9pbnNlcnQobG9hZGFibGVfbW9kdWxlcy5jb2RlY19oYXNoLCBp bXBsLT5pYW5hbmFtZSwgKGNvbnN0IHZvaWQgKikgbm9kZSk7CgkJCQkJfQoKCQkJCQlpZiAoc3dp dGNoX2V2ZW50X2NyZWF0ZSgmZXZlbnQsIFNXSVRDSF9FVkVOVF9NT0RVTEVfTE9BRCkgPT0gU1dJ VENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmlu ZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiY29kZWMiKTsKCQkJCQkJc3dp dGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAi bmFtZSIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRl cl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJrZXkiLCBuZXdfbW9kdWxlLT5r ZXkpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9T VEFDS19CT1RUT00sICJmaWxlbmFtZSIsIG5ld19tb2R1bGUtPmZpbGVuYW1lKTsKCQkJCQkJc3dp dGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAi bW9kdWxlIiwgbmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+bW9kdWxlX25hbWUpOwoJCQkJ CQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQpOwoJCQkJCQlhZGRlZCsrOwoJCQkJCX0KCQkJCX0K CQkJfQoJCX0KCX0KCglpZiAobmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+ZGlhbHBsYW5f aW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dpdGNoX2RpYWxwbGFuX2ludGVyZmFjZV90ICpwdHI7CgoJ CWZvciAocHRyID0gbmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+ZGlhbHBsYW5faW50ZXJm YWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlpZiAoIXB0ci0+aW50ZXJmYWNlX25hbWUp IHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19D UklULCAiRmFpbGVkIHRvIGxvYWQgZGlhbHBsYW4gaW50ZXJmYWNlIGZyb20gJXMgZHVlIHRvIG5v IGludGVyZmFjZSBuYW1lLlxuIiwga2V5KTsKCQkJfSBlbHNlIHsKCQkJCXN3aXRjaF9sb2dfcHJp bnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsICJBZGRpbmcgRGlhbHBs YW4gJyVzJ1xuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQlpZiAoc3dpdGNoX2V2ZW50X2Ny ZWF0ZSgmZXZlbnQsIFNXSVRDSF9FVkVOVF9NT0RVTEVfTE9BRCkgPT0gU1dJVENIX1NUQVRVU19T VUNDRVNTKSB7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lU Q0hfU1RBQ0tfQk9UVE9NLCAidHlwZSIsICJkaWFscGxhbiIpOwoJCQkJCXN3aXRjaF9ldmVudF9h ZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIm5hbWUiLCBwdHIt PmludGVyZmFjZV9uYW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZl bnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJrZXkiLCBuZXdfbW9kdWxlLT5rZXkpOwoJCQkJCXN3 aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwg ImZpbGVuYW1lIiwgbmV3X21vZHVsZS0+ZmlsZW5hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJl KCZldmVudCk7CgkJCQkJYWRkZWQrKzsKCQkJCX0KCQkJCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0 KGxvYWRhYmxlX21vZHVsZXMuZGlhbHBsYW5faGFzaCwgcHRyLT5pbnRlcmZhY2VfbmFtZSwgKGNv bnN0IHZvaWQgKikgcHRyKTsKCQkJfQoJCX0KCX0KCglpZiAobmV3X21vZHVsZS0+bW9kdWxlX2lu dGVyZmFjZS0+dGltZXJfaW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dpdGNoX3RpbWVyX2ludGVyZmFj ZV90ICpwdHI7CgoJCWZvciAocHRyID0gbmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+dGlt ZXJfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlpZiAoIXB0ci0+aW50ZXJm YWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJ VENIX0xPR19DUklULCAiRmFpbGVkIHRvIGxvYWQgdGltZXIgaW50ZXJmYWNlIGZyb20gJXMgZHVl IHRvIG5vIGludGVyZmFjZSBuYW1lLlxuIiwga2V5KTsKCQkJfSBlbHNlIHsKCQkJCXN3aXRjaF9s b2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsICJBZGRpbmcg VGltZXIgJyVzJ1xuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQlpZiAoc3dpdGNoX2V2ZW50 X2NyZWF0ZSgmZXZlbnQsIFNXSVRDSF9FVkVOVF9NT0RVTEVfTE9BRCkgPT0gU1dJVENIX1NUQVRV U19TVUNDRVNTKSB7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBT V0lUQ0hfU1RBQ0tfQk9UVE9NLCAidHlwZSIsICJ0aW1lciIpOwoJCQkJCXN3aXRjaF9ldmVudF9h ZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIm5hbWUiLCBwdHIt PmludGVyZmFjZV9uYW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZl bnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJrZXkiLCBuZXdfbW9kdWxlLT5rZXkpOwoJCQkJCXN3 aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwg ImZpbGVuYW1lIiwgbmV3X21vZHVsZS0+ZmlsZW5hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJl KCZldmVudCk7CgkJCQkJYWRkZWQrKzsKCQkJCX0KCQkJCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0 KGxvYWRhYmxlX21vZHVsZXMudGltZXJfaGFzaCwgcHRyLT5pbnRlcmZhY2VfbmFtZSwgKGNvbnN0 IHZvaWQgKikgcHRyKTsKCQkJfQoJCX0KCX0KCglpZiAobmV3X21vZHVsZS0+bW9kdWxlX2ludGVy ZmFjZS0+YXBwbGljYXRpb25faW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dpdGNoX2FwcGxpY2F0aW9u X2ludGVyZmFjZV90ICpwdHI7CgoJCWZvciAocHRyID0gbmV3X21vZHVsZS0+bW9kdWxlX2ludGVy ZmFjZS0+YXBwbGljYXRpb25faW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlp ZiAoIXB0ci0+aW50ZXJmYWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9D SEFOTkVMX0xPRywgU1dJVENIX0xPR19DUklULCAiRmFpbGVkIHRvIGxvYWQgYXBwbGljYXRpb24g aW50ZXJmYWNlIGZyb20gJXMgZHVlIHRvIG5vIGludGVyZmFjZSBuYW1lLlxuIiwga2V5KTsKCQkJ fSBlbHNlIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENI X0xPR19OT1RJQ0UsICJBZGRpbmcgQXBwbGljYXRpb24gJyVzJ1xuIiwgcHRyLT5pbnRlcmZhY2Vf bmFtZSk7CgkJCQlpZiAoc3dpdGNoX2V2ZW50X2NyZWF0ZSgmZXZlbnQsIFNXSVRDSF9FVkVOVF9N T0RVTEVfTE9BRCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJc3dpdGNoX2V2ZW50 X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAidHlwZSIsICJh cHBsaWNhdGlvbiIpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwg U1dJVENIX1NUQUNLX0JPVFRPTSwgIm5hbWUiLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCQlz d2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00s ICJkZXNjcmlwdGlvbiIsIHN3aXRjaF9zdHJfbmlsKHB0ci0+c2hvcnRfZGVzYykpOwoJCQkJCXN3 aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwg InN5bnRheCIsIHN3aXRjaF9zdHJfbmlsKHB0ci0+c3ludGF4KSk7CgkJCQkJc3dpdGNoX2V2ZW50 X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAia2V5IiwgbmV3 X21vZHVsZS0+a2V5KTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQs IFNXSVRDSF9TVEFDS19CT1RUT00sICJmaWxlbmFtZSIsIG5ld19tb2R1bGUtPmZpbGVuYW1lKTsK CQkJCQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQpOwoJCQkJCWFkZGVkKys7CgkJCQl9CgkJCQlz d2l0Y2hfY29yZV9oYXNoX2luc2VydChsb2FkYWJsZV9tb2R1bGVzLmFwcGxpY2F0aW9uX2hhc2gs IHB0ci0+aW50ZXJmYWNlX25hbWUsIChjb25zdCB2b2lkICopIHB0cik7CgkJCX0KCQl9Cgl9CgoJ aWYgKG5ld19tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmNoYXRfYXBwbGljYXRpb25faW50ZXJm YWNlKSB7CgkJY29uc3Qgc3dpdGNoX2NoYXRfYXBwbGljYXRpb25faW50ZXJmYWNlX3QgKnB0cjsK CgkJZm9yIChwdHIgPSBuZXdfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5jaGF0X2FwcGxpY2F0 aW9uX2ludGVyZmFjZTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKCQkJaWYgKCFwdHItPmludGVy ZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNX SVRDSF9MT0dfQ1JJVCwgIkZhaWxlZCB0byBsb2FkIGFwcGxpY2F0aW9uIGludGVyZmFjZSBmcm9t ICVzIGR1ZSB0byBubyBpbnRlcmZhY2UgbmFtZS5cbiIsIGtleSk7CgkJCX0gZWxzZSB7CgkJCQlz d2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLCAi QWRkaW5nIENoYXQgQXBwbGljYXRpb24gJyVzJ1xuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJ CQlpZiAoc3dpdGNoX2V2ZW50X2NyZWF0ZSgmZXZlbnQsIFNXSVRDSF9FVkVOVF9NT0RVTEVfTE9B RCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFk ZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAidHlwZSIsICJhcHBsaWNhdGlv biIpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NU QUNLX0JPVFRPTSwgIm5hbWUiLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCQlzd2l0Y2hfZXZl bnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJkZXNjcmlw dGlvbiIsIHN3aXRjaF9zdHJfbmlsKHB0ci0+c2hvcnRfZGVzYykpOwoJCQkJCXN3aXRjaF9ldmVu dF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInN5bnRheCIs IHN3aXRjaF9zdHJfbmlsKHB0ci0+c3ludGF4KSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFk ZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAia2V5IiwgbmV3X21vZHVsZS0+ a2V5KTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9T VEFDS19CT1RUT00sICJmaWxlbmFtZSIsIG5ld19tb2R1bGUtPmZpbGVuYW1lKTsKCQkJCQlzd2l0 Y2hfZXZlbnRfZmlyZSgmZXZlbnQpOwoJCQkJCWFkZGVkKys7CgkJCQl9CgkJCQlzd2l0Y2hfY29y ZV9oYXNoX2luc2VydChsb2FkYWJsZV9tb2R1bGVzLmNoYXRfYXBwbGljYXRpb25faGFzaCwgcHRy LT5pbnRlcmZhY2VfbmFtZSwgKGNvbnN0IHZvaWQgKikgcHRyKTsKCQkJfQoJCX0KCX0KCglpZiAo bmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+YXBpX2ludGVyZmFjZSkgewoJCWNvbnN0IHN3 aXRjaF9hcGlfaW50ZXJmYWNlX3QgKnB0cjsKCgkJZm9yIChwdHIgPSBuZXdfbW9kdWxlLT5tb2R1 bGVfaW50ZXJmYWNlLT5hcGlfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlp ZiAoIXB0ci0+aW50ZXJmYWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9D SEFOTkVMX0xPRywgU1dJVENIX0xPR19DUklULCAiRmFpbGVkIHRvIGxvYWQgYXBpIGludGVyZmFj ZSBmcm9tICVzIGR1ZSB0byBubyBpbnRlcmZhY2UgbmFtZS5cbiIsIGtleSk7CgkJCX0gZWxzZSB7 CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9U SUNFLCAiQWRkaW5nIEFQSSBGdW5jdGlvbiAnJXMnXG4iLCBwdHItPmludGVyZmFjZV9uYW1lKTsK CQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9M T0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hl YWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJ0eXBlIiwgImFwaSIpOwoJ CQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JP VFRPTSwgIm5hbWUiLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRk X2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJkZXNjcmlwdGlvbiIs IHN3aXRjaF9zdHJfbmlsKHB0ci0+ZGVzYykpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVy X3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInN5bnRheCIsIHN3aXRjaF9zdHJf bmlsKHB0ci0+c3ludGF4KSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2 ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAia2V5IiwgbmV3X21vZHVsZS0+a2V5KTsKCQkJCQlz d2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00s ICJmaWxlbmFtZSIsIG5ld19tb2R1bGUtPmZpbGVuYW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRfZmly ZSgmZXZlbnQpOwoJCQkJCWFkZGVkKys7CgkJCQl9CgkJCQlzd2l0Y2hfY29yZV9oYXNoX2luc2Vy dChsb2FkYWJsZV9tb2R1bGVzLmFwaV9oYXNoLCBwdHItPmludGVyZmFjZV9uYW1lLCAoY29uc3Qg dm9pZCAqKSBwdHIpOwoJCQl9CgkJfQoJfQoKCWlmIChuZXdfbW9kdWxlLT5tb2R1bGVfaW50ZXJm YWNlLT5qc29uX2FwaV9pbnRlcmZhY2UpIHsKCQljb25zdCBzd2l0Y2hfanNvbl9hcGlfaW50ZXJm YWNlX3QgKnB0cjsKCgkJZm9yIChwdHIgPSBuZXdfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5q c29uX2FwaV9pbnRlcmZhY2U7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CgkJCWlmICghcHRyLT5p bnRlcmZhY2VfbmFtZSkgewoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9H LCBTV0lUQ0hfTE9HX0NSSVQsICJGYWlsZWQgdG8gbG9hZCBKU09OIGFwaSBpbnRlcmZhY2UgZnJv bSAlcyBkdWUgdG8gbm8gaW50ZXJmYWNlIG5hbWUuXG4iLCBrZXkpOwoJCQl9IGVsc2UgewoJCQkJ c3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX05PVElDRSwg IkFkZGluZyBKU09OIEFQSSBGdW5jdGlvbiAnJXMnXG4iLCBwdHItPmludGVyZmFjZV9uYW1lKTsK CQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9M T0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hl YWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJ0eXBlIiwgImpzb25fYXBp Iik7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RB Q0tfQk9UVE9NLCAibmFtZSIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJCXN3aXRjaF9ldmVu dF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImRlc2NyaXB0 aW9uIiwgc3dpdGNoX3N0cl9uaWwocHRyLT5kZXNjKSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9o ZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAic3ludGF4Iiwgc3dpdGNo X3N0cl9uaWwocHRyLT5zeW50YXgpKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJp bmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJrZXkiLCBuZXdfbW9kdWxlLT5rZXkpOwoJ CQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JP VFRPTSwgImZpbGVuYW1lIiwgbmV3X21vZHVsZS0+ZmlsZW5hbWUpOwoJCQkJCXN3aXRjaF9ldmVu dF9maXJlKCZldmVudCk7CgkJCQkJYWRkZWQrKzsKCQkJCX0KCQkJCXN3aXRjaF9jb3JlX2hhc2hf aW5zZXJ0KGxvYWRhYmxlX21vZHVsZXMuanNvbl9hcGlfaGFzaCwgcHRyLT5pbnRlcmZhY2VfbmFt ZSwgKGNvbnN0IHZvaWQgKikgcHRyKTsKCQkJfQoJCX0KCX0KCglpZiAobmV3X21vZHVsZS0+bW9k dWxlX2ludGVyZmFjZS0+ZmlsZV9pbnRlcmZhY2UpIHsKCQljb25zdCBzd2l0Y2hfZmlsZV9pbnRl cmZhY2VfdCAqcHRyOwoKCQlmb3IgKHB0ciA9IG5ld19tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2Ut PmZpbGVfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlpZiAoIXB0ci0+aW50 ZXJmYWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywg U1dJVENIX0xPR19DUklULCAiRmFpbGVkIHRvIGxvYWQgZmlsZSBpbnRlcmZhY2UgZnJvbSAlcyBk dWUgdG8gbm8gaW50ZXJmYWNlIG5hbWUuXG4iLCBrZXkpOwoJCQl9IGVsc2UgaWYgKCFwdHItPmV4 dGVucykgewoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hf TE9HX0NSSVQsICJGYWlsZWQgdG8gbG9hZCBmaWxlIGludGVyZmFjZSBmcm9tICVzIGR1ZSB0byBu byBmaWxlIGV4dGVuc2lvbnMuXG4iLCBrZXkpOwoJCQl9IGVsc2UgewoJCQkJaW50IGk7CgkJCQlz d2l0Y2hfZmlsZV9ub2RlX3QgKm5vZGUsICpoZWFkOwoKCQkJCWZvciAoaSA9IDA7IHB0ci0+ZXh0 ZW5zW2ldOyBpKyspIHsKCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0cs IFNXSVRDSF9MT0dfTk9USUNFLCAiQWRkaW5nIEZpbGUgRm9ybWF0ICclcydcbiIsIHB0ci0+ZXh0 ZW5zW2ldKTsKCQkJCQlpZiAoc3dpdGNoX2V2ZW50X2NyZWF0ZSgmZXZlbnQsIFNXSVRDSF9FVkVO VF9NT0RVTEVfTE9BRCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJCXN3aXRjaF9l dmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUi LCAiZmlsZSIpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNX SVRDSF9TVEFDS19CT1RUT00sICJuYW1lIiwgcHRyLT5leHRlbnNbaV0pOwoJCQkJCQlzd2l0Y2hf ZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJrZXki LCBuZXdfbW9kdWxlLT5rZXkpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmco ZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJmaWxlbmFtZSIsIG5ld19tb2R1bGUtPmZpbGVu YW1lKTsKCQkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hf U1RBQ0tfQk9UVE9NLCAibW9kdWxlIiwgbmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+bW9k dWxlX25hbWUpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQpOwoJCQkJCQlhZGRlZCsr OwoJCQkJCX0KCQkJCQlub2RlID0gc3dpdGNoX2NvcmVfYWxsb2MobmV3X21vZHVsZS0+cG9vbCwg c2l6ZW9mKCpub2RlKSk7CgkJCQkJbm9kZS0+cHRyID0gcHRyOwoJCQkJCW5vZGUtPmludGVyZmFj ZV9uYW1lID0gc3dpdGNoX2NvcmVfc3RyZHVwKG5ld19tb2R1bGUtPnBvb2wsIG5ld19tb2R1bGUt Pm1vZHVsZV9pbnRlcmZhY2UtPm1vZHVsZV9uYW1lKTsKCQkJCQlpZiAoKGhlYWQgPSBzd2l0Y2hf Y29yZV9oYXNoX2ZpbmQobG9hZGFibGVfbW9kdWxlcy5maWxlX2hhc2gsIHB0ci0+ZXh0ZW5zW2ld KSkpIHsKCQkJCQkJbm9kZS0+bmV4dCA9IGhlYWQ7CgkJCQkJfQoKCQkJCQlzd2l0Y2hfY29yZV9o YXNoX2luc2VydChsb2FkYWJsZV9tb2R1bGVzLmZpbGVfaGFzaCwgcHRyLT5leHRlbnNbaV0sIChj b25zdCB2b2lkICopIG5vZGUpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWlmIChuZXdfbW9kdWxlLT5t b2R1bGVfaW50ZXJmYWNlLT5zcGVlY2hfaW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dpdGNoX3NwZWVj aF9pbnRlcmZhY2VfdCAqcHRyOwoKCQlmb3IgKHB0ciA9IG5ld19tb2R1bGUtPm1vZHVsZV9pbnRl cmZhY2UtPnNwZWVjaF9pbnRlcmZhY2U7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CgkJCWlmICgh cHRyLT5pbnRlcmZhY2VfbmFtZSkgewoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5O RUxfTE9HLCBTV0lUQ0hfTE9HX0NSSVQsICJGYWlsZWQgdG8gbG9hZCBzcGVlY2ggaW50ZXJmYWNl IGZyb20gJXMgZHVlIHRvIG5vIGludGVyZmFjZSBuYW1lLlxuIiwga2V5KTsKCQkJfSBlbHNlIHsK CQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJ Q0UsICJBZGRpbmcgU3BlZWNoIGludGVyZmFjZSAnJXMnXG4iLCBwdHItPmludGVyZmFjZV9uYW1l KTsKCQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVM RV9MT0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRk X2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJ0eXBlIiwgInNwZWVj aCIpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NU QUNLX0JPVFRPTSwgIm5hbWUiLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCQlzd2l0Y2hfZXZl bnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJrZXkiLCBu ZXdfbW9kdWxlLT5rZXkpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVu dCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImZpbGVuYW1lIiwgbmV3X21vZHVsZS0+ZmlsZW5hbWUp OwoJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVudCk7CgkJCQkJYWRkZWQrKzsKCQkJCX0KCQkJ CXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KGxvYWRhYmxlX21vZHVsZXMuc3BlZWNoX2hhc2gsIHB0 ci0+aW50ZXJmYWNlX25hbWUsIChjb25zdCB2b2lkICopIHB0cik7CgkJCX0KCQl9Cgl9CgoJaWYg KG5ld19tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmFzcl9pbnRlcmZhY2UpIHsKCQljb25zdCBz d2l0Y2hfYXNyX2ludGVyZmFjZV90ICpwdHI7CgoJCWZvciAocHRyID0gbmV3X21vZHVsZS0+bW9k dWxlX2ludGVyZmFjZS0+YXNyX2ludGVyZmFjZTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKCQkJ aWYgKCFwdHItPmludGVyZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hf Q0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwgIkZhaWxlZCB0byBsb2FkIGFzciBpbnRlcmZh Y2UgZnJvbSAlcyBkdWUgdG8gbm8gaW50ZXJmYWNlIG5hbWUuXG4iLCBrZXkpOwoJCQl9IGVsc2Ug ewoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX05P VElDRSwgIkFkZGluZyBBU1IgaW50ZXJmYWNlICclcydcbiIsIHB0ci0+aW50ZXJmYWNlX25hbWUp OwoJCQkJaWYgKHN3aXRjaF9ldmVudF9jcmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZFTlRfTU9EVUxF X0xPQUQpID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVudF9hZGRf aGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiYXNyIik7 CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tf Qk9UVE9NLCAibmFtZSIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9h ZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImtleSIsIG5ld19t b2R1bGUtPmtleSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBT V0lUQ0hfU1RBQ0tfQk9UVE9NLCAiZmlsZW5hbWUiLCBuZXdfbW9kdWxlLT5maWxlbmFtZSk7CgkJ CQkJc3dpdGNoX2V2ZW50X2ZpcmUoJmV2ZW50KTsKCQkJCQlhZGRlZCsrOwoJCQkJfQoJCQkJc3dp dGNoX2NvcmVfaGFzaF9pbnNlcnQobG9hZGFibGVfbW9kdWxlcy5hc3JfaGFzaCwgcHRyLT5pbnRl cmZhY2VfbmFtZSwgKGNvbnN0IHZvaWQgKikgcHRyKTsKCQkJfQoJCX0KCX0KCglpZiAobmV3X21v ZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+ZGlyZWN0b3J5X2ludGVyZmFjZSkgewoJCWNvbnN0IHN3 aXRjaF9kaXJlY3RvcnlfaW50ZXJmYWNlX3QgKnB0cjsKCgkJZm9yIChwdHIgPSBuZXdfbW9kdWxl LT5tb2R1bGVfaW50ZXJmYWNlLT5kaXJlY3RvcnlfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+ bmV4dCkgewoJCQlpZiAoIXB0ci0+aW50ZXJmYWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2dfcHJp bnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19DUklULCAiRmFpbGVkIHRvIGxvYWQg ZGlyZWN0b3J5IGludGVyZmFjZSBmcm9tICVzIGR1ZSB0byBubyBpbnRlcmZhY2UgbmFtZS5cbiIs IGtleSk7CgkJCX0gZWxzZSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9M T0csIFNXSVRDSF9MT0dfTk9USUNFLCAiQWRkaW5nIERpcmVjdG9yeSBpbnRlcmZhY2UgJyVzJ1xu IiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQlpZiAoc3dpdGNoX2V2ZW50X2NyZWF0ZSgmZXZl bnQsIFNXSVRDSF9FVkVOVF9NT0RVTEVfTE9BRCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7 CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tf Qk9UVE9NLCAidHlwZSIsICJkaXJlY3RvcnkiKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRl cl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuYW1lIiwgcHRyLT5pbnRlcmZh Y2VfbmFtZSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lU Q0hfU1RBQ0tfQk9UVE9NLCAia2V5IiwgbmV3X21vZHVsZS0+a2V5KTsKCQkJCQlzd2l0Y2hfZXZl bnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJmaWxlbmFt ZSIsIG5ld19tb2R1bGUtPmZpbGVuYW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQp OwoJCQkJCWFkZGVkKys7CgkJCQl9CgkJCQlzd2l0Y2hfY29yZV9oYXNoX2luc2VydChsb2FkYWJs ZV9tb2R1bGVzLmRpcmVjdG9yeV9oYXNoLCBwdHItPmludGVyZmFjZV9uYW1lLCAoY29uc3Qgdm9p ZCAqKSBwdHIpOwoJCQl9CgkJfQoJfQoKCWlmIChuZXdfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNl LT5jaGF0X2ludGVyZmFjZSkgewoJCWNvbnN0IHN3aXRjaF9jaGF0X2ludGVyZmFjZV90ICpwdHI7 CgoJCWZvciAocHRyID0gbmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+Y2hhdF9pbnRlcmZh Y2U7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CgkJCWlmICghcHRyLT5pbnRlcmZhY2VfbmFtZSkg ewoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NS SVQsICJGYWlsZWQgdG8gbG9hZCBjaGF0IGludGVyZmFjZSBmcm9tICVzIGR1ZSB0byBubyBpbnRl cmZhY2UgbmFtZS5cbiIsIGtleSk7CgkJCX0gZWxzZSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihT V0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLCAiQWRkaW5nIENoYXQgaW50ZXJm YWNlICclcydcbiIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJaWYgKHN3aXRjaF9ldmVudF9j cmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZFTlRfTU9EVUxFX0xPQUQpID09IFNXSVRDSF9TVEFUVVNf U1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJ VENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiY2hhdCIpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRf aGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIm5hbWUiLCBwdHItPmlu dGVyZmFjZV9uYW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQs IFNXSVRDSF9TVEFDS19CT1RUT00sICJrZXkiLCBuZXdfbW9kdWxlLT5rZXkpOwoJCQkJCXN3aXRj aF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImZp bGVuYW1lIiwgbmV3X21vZHVsZS0+ZmlsZW5hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZl dmVudCk7CgkJCQkJYWRkZWQrKzsKCQkJCX0KCQkJCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KGxv YWRhYmxlX21vZHVsZXMuY2hhdF9oYXNoLCBwdHItPmludGVyZmFjZV9uYW1lLCAoY29uc3Qgdm9p ZCAqKSBwdHIpOwoJCQl9CgkJfQoJfQoKCWlmIChuZXdfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNl LT5zYXlfaW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dpdGNoX3NheV9pbnRlcmZhY2VfdCAqcHRyOwoK CQlmb3IgKHB0ciA9IG5ld19tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPnNheV9pbnRlcmZhY2U7 IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CgkJCWlmICghcHRyLT5pbnRlcmZhY2VfbmFtZSkgewoJ CQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NSSVQs ICJGYWlsZWQgdG8gbG9hZCBzYXkgaW50ZXJmYWNlIGZyb20gJXMgZHVlIHRvIG5vIGludGVyZmFj ZSBuYW1lLlxuIiwga2V5KTsKCQkJfSBlbHNlIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRD SF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsICJBZGRpbmcgU2F5IGludGVyZmFjZSAn JXMnXG4iLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRl KCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9MT0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NF U1MpIHsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9T VEFDS19CT1RUT00sICJ0eXBlIiwgInNheSIpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVy X3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIm5hbWUiLCBwdHItPmludGVyZmFj ZV9uYW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRD SF9TVEFDS19CT1RUT00sICJrZXkiLCBuZXdfbW9kdWxlLT5rZXkpOwoJCQkJCXN3aXRjaF9ldmVu dF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImZpbGVuYW1l IiwgbmV3X21vZHVsZS0+ZmlsZW5hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVudCk7 CgkJCQkJYWRkZWQrKzsKCQkJCX0KCQkJCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KGxvYWRhYmxl X21vZHVsZXMuc2F5X2hhc2gsIHB0ci0+aW50ZXJmYWNlX25hbWUsIChjb25zdCB2b2lkICopIHB0 cik7CgkJCX0KCQl9Cgl9CgoJaWYgKG5ld19tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPm1hbmFn ZW1lbnRfaW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dpdGNoX21hbmFnZW1lbnRfaW50ZXJmYWNlX3Qg KnB0cjsKCgkJZm9yIChwdHIgPSBuZXdfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5tYW5hZ2Vt ZW50X2ludGVyZmFjZTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKCQkJaWYgKCFwdHItPnJlbGF0 aXZlX29pZCkgewoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lU Q0hfTE9HX0NSSVQsICJGYWlsZWQgdG8gbG9hZCBtYW5hZ2VtZW50IGludGVyZmFjZSBmcm9tICVz IGR1ZSB0byBubyBpbnRlcmZhY2UgbmFtZS5cbiIsIGtleSk7CgkJCX0gZWxzZSB7CgkJCQlpZiAo c3dpdGNoX2NvcmVfaGFzaF9maW5kKGxvYWRhYmxlX21vZHVsZXMubWFuYWdlbWVudF9oYXNoLCBw dHItPnJlbGF0aXZlX29pZCkpIHsKCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5F TF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwKCQkJCQkJCQkJICAiRmFpbGVkIHRvIGxvYWQgbWFuYWdl bWVudCBpbnRlcmZhY2UgJXMuIE9JRCAlcyBhbHJlYWR5IGV4aXN0c1xuIiwga2V5LCBwdHItPnJl bGF0aXZlX29pZCk7CgkJCQl9IGVsc2UgewoJCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9D SEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsCgkJCQkJCQkJCSAgIkFkZGluZyBNYW5hZ2Vt ZW50IGludGVyZmFjZSAnJXMnIE9JRFslcy4lc11cbiIsIGtleSwgRlJFRVNXSVRDSF9PSURfUFJF RklYLCBwdHItPnJlbGF0aXZlX29pZCk7CgkJCQkJc3dpdGNoX2NvcmVfaGFzaF9pbnNlcnQobG9h ZGFibGVfbW9kdWxlcy5tYW5hZ2VtZW50X2hhc2gsIHB0ci0+cmVsYXRpdmVfb2lkLCAoY29uc3Qg dm9pZCAqKSBwdHIpOwoJCQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENI X0VWRU5UX01PRFVMRV9MT0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJCQkJc3dp dGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAi dHlwZSIsICJtYW5hZ2VtZW50Iik7CgkJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmlu ZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIm5hbWUiLCBwdHItPnJlbGF0aXZlX29pZCk7 CgkJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNL X0JPVFRPTSwgImtleSIsIG5ld19tb2R1bGUtPmtleSk7CgkJCQkJCXN3aXRjaF9ldmVudF9hZGRf aGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImZpbGVuYW1lIiwgbmV3 X21vZHVsZS0+ZmlsZW5hbWUpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQpOwoJCQkJ CQlhZGRlZCsrOwoJCQkJCX0KCQkJCX0KCgkJCX0KCQl9Cgl9CglpZiAobmV3X21vZHVsZS0+bW9k dWxlX2ludGVyZmFjZS0+bGltaXRfaW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dpdGNoX2xpbWl0X2lu dGVyZmFjZV90ICpwdHI7CgoJCWZvciAocHRyID0gbmV3X21vZHVsZS0+bW9kdWxlX2ludGVyZmFj ZS0+bGltaXRfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlpZiAoIXB0ci0+ aW50ZXJmYWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xP RywgU1dJVENIX0xPR19DUklULCAiRmFpbGVkIHRvIGxvYWQgbGltaXQgaW50ZXJmYWNlIGZyb20g JXMgZHVlIHRvIG5vIGludGVyZmFjZSBuYW1lLlxuIiwga2V5KTsKCQkJfSBlbHNlIHsKCQkJCWlm IChzd2l0Y2hfY29yZV9oYXNoX2ZpbmQobG9hZGFibGVfbW9kdWxlcy5saW1pdF9oYXNoLCBwdHIt PmludGVyZmFjZV9uYW1lKSkgewoJCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVM X0xPRywgU1dJVENIX0xPR19DUklULAoJCQkJCQkJCQkgICJGYWlsZWQgdG8gbG9hZCBsaW1pdCBp bnRlcmZhY2UgJXMuIE5hbWUgJXMgYWxyZWFkeSBleGlzdHNcbiIsIGtleSwgcHRyLT5pbnRlcmZh Y2VfbmFtZSk7CgkJCQl9IGVsc2UgewoJCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFO TkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsCgkJCQkJCQkJCSAgIkFkZGluZyBMaW1pdCBpbnRl cmZhY2UgJyVzJ1xuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQkJc3dpdGNoX2NvcmVfaGFz aF9pbnNlcnQobG9hZGFibGVfbW9kdWxlcy5saW1pdF9oYXNoLCBwdHItPmludGVyZmFjZV9uYW1l LCAoY29uc3Qgdm9pZCAqKSBwdHIpOwoJCQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVu dCwgU1dJVENIX0VWRU5UX01PRFVMRV9MT0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsK CQkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tf Qk9UVE9NLCAidHlwZSIsICJsaW1pdCIpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9z dHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuYW1lIiwgcHRyLT5pbnRlcmZhY2Vf bmFtZSk7CgkJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENI X1NUQUNLX0JPVFRPTSwgImtleSIsIG5ld19tb2R1bGUtPmtleSk7CgkJCQkJCXN3aXRjaF9ldmVu dF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImZpbGVuYW1l IiwgbmV3X21vZHVsZS0+ZmlsZW5hbWUpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQp OwoJCQkJCQlhZGRlZCsrOwoJCQkJCX0KCQkJCX0KCgkJCX0KCQl9Cgl9CgoJaWYgKCFhZGRlZCkg ewoJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9M T0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFk ZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAidHlwZSIsICJnZW5lcmljIik7 CgkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JP VFRPTSwgIm5hbWUiLCBuZXdfbW9kdWxlLT5rZXkpOwoJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRl cl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJrZXkiLCBuZXdfbW9kdWxlLT5r ZXkpOwoJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFD S19CT1RUT00sICJmaWxlbmFtZSIsIG5ld19tb2R1bGUtPmZpbGVuYW1lKTsKCQkJc3dpdGNoX2V2 ZW50X2ZpcmUoJmV2ZW50KTsKCQkJYWRkZWQrKzsKCQl9Cgl9CgoJc3dpdGNoX211dGV4X3VubG9j ayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKCXJldHVybiBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1M7 Cgp9CgojZGVmaW5lIENIQVRfTUFYX01TR19RVUVVRSAxMDEKI2RlZmluZSBDSEFUX1FVRVVFX1NJ WkUgNTAwMAoKc3RhdGljIHN0cnVjdCB7Cglzd2l0Y2hfcXVldWVfdCAqbXNnX3F1ZXVlW0NIQVRf TUFYX01TR19RVUVVRV07Cglzd2l0Y2hfdGhyZWFkX3QgKm1zZ19xdWV1ZV90aHJlYWRbQ0hBVF9N QVhfTVNHX1FVRVVFXTsKCWludCBtc2dfcXVldWVfbGVuOwoJc3dpdGNoX211dGV4X3QgKm11dGV4 OwoJc3dpdGNoX21lbW9yeV9wb29sX3QgKnBvb2w7CglpbnQgcnVubmluZzsKfSBjaGF0X2dsb2Jh bHM7CgpzdGF0aWMgaW50IElEWCA9IDA7CgoKc3RhdGljIHN3aXRjaF9zdGF0dXNfdCBkb19jaGF0 X3NlbmQoc3dpdGNoX2V2ZW50X3QgKm1lc3NhZ2VfZXZlbnQpCgp7Cglzd2l0Y2hfY2hhdF9pbnRl cmZhY2VfdCAqY2k7Cglzd2l0Y2hfc3RhdHVzX3Qgc3RhdHVzID0gU1dJVENIX1NUQVRVU19GQUxT RTsKCXN3aXRjaF9oYXNoX2luZGV4X3QgKmhpOwoJc3dpdGNoX2V2ZW50X3QgKmR1cCA9IE5VTEw7 Cgljb25zdCB2b2lkICp2YXI7Cgl2b2lkICp2YWw7Cgljb25zdCBjaGFyICpwcm90bzsKCWNvbnN0 IGNoYXIgKnJlcGx5aW5nOwoJY29uc3QgY2hhciAqZGVzdF9wcm90bzsKCWludCBkb19za2lwID0g MDsKCgkvKgoKCWNvbnN0IGNoYXIgKmZyb207Cgljb25zdCBjaGFyICp0bzsKCWNvbnN0IGNoYXIg KnN1YmplY3Q7Cgljb25zdCBjaGFyICpib2R5OwoJY29uc3QgY2hhciAqdHlwZTsKCWNvbnN0IGNo YXIgKmhpbnQ7CgkqLwoKCWRlc3RfcHJvdG8gPSBzd2l0Y2hfZXZlbnRfZ2V0X2hlYWRlcihtZXNz YWdlX2V2ZW50LCAiZGVzdF9wcm90byIpOwoKCWlmICghZGVzdF9wcm90bykgewoJCXJldHVybiBT V0lUQ0hfU1RBVFVTX0ZBTFNFOwoJfQoKCS8qCgoJZnJvbSA9IHN3aXRjaF9ldmVudF9nZXRfaGVh ZGVyKG1lc3NhZ2VfZXZlbnQsICJmcm9tIik7Cgl0byA9IHN3aXRjaF9ldmVudF9nZXRfaGVhZGVy KG1lc3NhZ2VfZXZlbnQsICJ0byIpOwoJc3ViamVjdCA9IHN3aXRjaF9ldmVudF9nZXRfaGVhZGVy KG1lc3NhZ2VfZXZlbnQsICJzdWJqZWN0Iik7Cglib2R5ID0gc3dpdGNoX2V2ZW50X2dldF9ib2R5 KG1lc3NhZ2VfZXZlbnQpOwoJdHlwZSA9IHN3aXRjaF9ldmVudF9nZXRfaGVhZGVyKG1lc3NhZ2Vf ZXZlbnQsICJ0eXBlIik7CgloaW50ID0gc3dpdGNoX2V2ZW50X2dldF9oZWFkZXIobWVzc2FnZV9l dmVudCwgImhpbnQiKTsKCSovCgoJaWYgKCEocHJvdG8gPSBzd2l0Y2hfZXZlbnRfZ2V0X2hlYWRl cihtZXNzYWdlX2V2ZW50LCAicHJvdG8iKSkpIHsKCQlwcm90byA9ICJnbG9iYWwiOwoJCXN3aXRj aF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhtZXNzYWdlX2V2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9U VE9NLCAicHJvdG8iLCBwcm90byk7Cgl9CgoJcmVwbHlpbmcgPSBzd2l0Y2hfZXZlbnRfZ2V0X2hl YWRlcihtZXNzYWdlX2V2ZW50LCAicmVwbHlpbmciKTsKCglpZiAoIXN3aXRjaF90cnVlKHJlcGx5 aW5nKSAmJiAhc3dpdGNoX3N0cmlzdHIoImdsb2JhbCIsIHByb3RvKSAmJiAhc3dpdGNoX3RydWUo c3dpdGNoX2V2ZW50X2dldF9oZWFkZXIobWVzc2FnZV9ldmVudCwgInNraXBfZ2xvYmFsX3Byb2Nl c3MiKSkpIHsKCQlzd2l0Y2hfbXV0ZXhfbG9jayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKCQlm b3IgKGhpID0gc3dpdGNoX2NvcmVfaGFzaF9maXJzdChsb2FkYWJsZV9tb2R1bGVzLmNoYXRfaGFz aCk7IGhpOyBoaSA9IHN3aXRjaF9jb3JlX2hhc2hfbmV4dCgmaGkpKSB7CgkJCXN3aXRjaF9jb3Jl X2hhc2hfdGhpcyhoaSwgJnZhciwgTlVMTCwgJnZhbCk7CgoJCQlpZiAoKGNpID0gKHN3aXRjaF9j aGF0X2ludGVyZmFjZV90ICopIHZhbCkpIHsKCQkJCWlmIChjaS0+Y2hhdF9zZW5kICYmICFzdHJu Y2FzZWNtcChjaS0+aW50ZXJmYWNlX25hbWUsICJHTE9CQUxfIiwgNykpIHsKCQkJCQlzdGF0dXMg PSBjaS0+Y2hhdF9zZW5kKG1lc3NhZ2VfZXZlbnQpOwoKCQkJCQlpZiAoc3RhdHVzID09IFNXSVRD SF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCQlpZiAoc3dpdGNoX3RydWUoc3dpdGNoX2V2ZW50X2dl dF9oZWFkZXIobWVzc2FnZV9ldmVudCwgImZpbmFsX2RlbGl2ZXJ5IikpKSB7CgkJCQkJCQkvKiBU aGUgZXZlbnQgd2FzIGhhbmRsZWQgYnkgYW4gZXh0ZW5zaW9uIGluIHRoZSBjaGF0cGxhbiwKCQkJ CQkJCSAqIHNvIHRoZSBldmVudCB3aWxsIGJlIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIGFuZCBxdWV1 ZWQgYWdhaW4sCgkJCQkJCQkgKiBidXQgaXQgd29uJ3QgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBjaGF0 cGxhbiBhZ2Fpbi4KCQkJCQkJCSAqIFNvIHRoaXMgY29weSBvZiB0aGUgZXZlbnQgY2FuIGJlIGRl c3Ryb3llZCBieSB0aGUgY2FsbGVyLgoJCQkJCQkJICovCgkJCQkJCQlkb19za2lwID0gMTsKCQkJ CQkJfQoJCQkJCX0gZWxzZSBpZiAoc3RhdHVzID09IFNXSVRDSF9TVEFUVVNfQlJFQUspIHsKCQkJ CQkJLyogVGhlIGV2ZW50IHdlbnQgdGhyb3VnaCB0aGUgY2hhdHBsYW4sIGJ1dCBubyBleHRlbnNp b24gbWF0Y2hlZAoJCQkJCQkgKiB0byBoYW5kbGUgdGhlIHNtcyBtZXNzc2FnZS4gSXQnbGwgYmUg YXR0ZW1wdGVkIHRvIGJlIGRlbGl2ZXJlZAoJCQkJCQkgKiBkaXJlY3RseSwgYW5kIHVubGVzcyB0 aGF0IHdvcmtzIHRoZSBzbXMgZGVsaXZlcnkgd2lsbCBoYXZlIGZhaWxlZC4KCQkJCQkJICovCgkJ CQkJfSBlbHNlIHsKCQkJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBT V0lUQ0hfTE9HX0VSUk9SLCAiQ2hhdCBJbnRlcmZhY2UgRXJyb3IgWyVzXSFcbiIsIGRlc3RfcHJv dG8pOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJc3dpdGNoX3NhZmVfZnJl ZShoaSk7CgkJc3dpdGNoX211dGV4X3VubG9jayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKCX0K CgoJaWYgKCFkb19za2lwICYmICFzd2l0Y2hfc3RyaXN0cigiR0xPQkFMIiwgZGVzdF9wcm90bykp IHsKCQlpZiAoKGNpID0gc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9nZXRfY2hhdF9pbnRlcmZhY2Uo ZGVzdF9wcm90bykpICYmIGNpLT5jaGF0X3NlbmQpIHsKCQkJc3RhdHVzID0gY2ktPmNoYXRfc2Vu ZChtZXNzYWdlX2V2ZW50KTsKCQkJVU5QUk9URUNUX0lOVEVSRkFDRShjaSk7CgkJfSBlbHNlIHsK CQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0VSUk9S LCAiSW52YWxpZCBjaGF0IGludGVyZmFjZSBbJXNdIVxuIiwgZGVzdF9wcm90byk7CgkJCXN0YXR1 cyA9IFNXSVRDSF9TVEFUVVNfRkFMU0U7CgkJfQoJfQoKCglzd2l0Y2hfZXZlbnRfZHVwKCZkdXAs IG1lc3NhZ2VfZXZlbnQpOwoKCWlmICggc3dpdGNoX3RydWUoc3dpdGNoX2V2ZW50X2dldF9oZWFk ZXIobWVzc2FnZV9ldmVudCwgImJsb2NraW5nIikpICkgewoJCWlmIChzdGF0dXMgPT0gU1dJVENI X1NUQVRVU19TVUNDRVNTKSB7CgkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhkdXAs IFNXSVRDSF9TVEFDS19CT1RUT00sICJEZWxpdmVyeS1GYWlsdXJlIiwgImZhbHNlIik7CgkJfSBl bHNlIHsKCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGR1cCwgU1dJVENIX1NUQUNL X0JPVFRPTSwgIkRlbGl2ZXJ5LUZhaWx1cmUiLCAidHJ1ZSIpOwoJCX0KCX0gZWxzZSB7CgkJc3dp dGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGR1cCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIk5v bmJsb2NraW5nLURlbGl2ZXJ5IiwgInRydWUiKTsKCX0KCglzd2l0Y2hfZXZlbnRfZmlyZSgmZHVw KTsKCXJldHVybiBzdGF0dXM7Cn0KCnN0YXRpYyBzd2l0Y2hfc3RhdHVzX3QgY2hhdF9wcm9jZXNz X2V2ZW50KHN3aXRjaF9ldmVudF90ICoqZXZlbnRwKQp7Cglzd2l0Y2hfZXZlbnRfdCAqZXZlbnQ7 Cglzd2l0Y2hfc3RhdHVzX3Qgc3RhdHVzOwoKCXN3aXRjaF9hc3NlcnQoZXZlbnRwKTsKCglldmVu dCA9ICpldmVudHA7CgkqZXZlbnRwID0gTlVMTDsKCglzdGF0dXMgPSBkb19jaGF0X3NlbmQoZXZl bnQpOwoJc3dpdGNoX2V2ZW50X2Rlc3Ryb3koJmV2ZW50KTsKCglyZXR1cm4gc3RhdHVzOwp9CgoK dm9pZCAqU1dJVENIX1RIUkVBRF9GVU5DIGNoYXRfdGhyZWFkX3J1bihzd2l0Y2hfdGhyZWFkX3Qg KnRocmVhZCwgdm9pZCAqb2JqKQp7Cgl2b2lkICpwb3A7Cglzd2l0Y2hfcXVldWVfdCAqcSA9IChz d2l0Y2hfcXVldWVfdCAqKSBvYmo7CgoJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxf TE9HLCBTV0lUQ0hfTE9HX0RFQlVHLCAiQ2hhdCBUaHJlYWQgU3RhcnRlZFxuIik7CgoKCXdoaWxl KHN3aXRjaF9xdWV1ZV9wb3AocSwgJnBvcCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTICYmIHBv cCkgewoJCXN3aXRjaF9ldmVudF90ICpldmVudCA9IChzd2l0Y2hfZXZlbnRfdCAqKSBwb3A7CgkJ Y2hhdF9wcm9jZXNzX2V2ZW50KCZldmVudCk7CgkJc3dpdGNoX2NvbmRfbmV4dCgpOwoJfQoKCXN3 aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19ERUJVRywgIkNo YXQgVGhyZWFkIEVuZGVkXG4iKTsKCglyZXR1cm4gTlVMTDsKfQoKCnN0YXRpYyB2b2lkIGNoYXRf dGhyZWFkX3N0YXJ0KGludCBpZHgpCnsKCglpZiAoaWR4ID49IENIQVRfTUFYX01TR19RVUVVRSB8 fCAoaWR4IDwgY2hhdF9nbG9iYWxzLm1zZ19xdWV1ZV9sZW4gJiYgY2hhdF9nbG9iYWxzLm1zZ19x dWV1ZV90aHJlYWRbaWR4XSkpIHsKCQlyZXR1cm47Cgl9CgoJc3dpdGNoX211dGV4X2xvY2soY2hh dF9nbG9iYWxzLm11dGV4KTsKCglpZiAoaWR4ID49IGNoYXRfZ2xvYmFscy5tc2dfcXVldWVfbGVu KSB7CgkJaW50IGk7CgkJY2hhdF9nbG9iYWxzLm1zZ19xdWV1ZV9sZW4gPSBpZHggKyAxOwoKCQlm b3IgKGkgPSAwOyBpIDwgY2hhdF9nbG9iYWxzLm1zZ19xdWV1ZV9sZW47IGkrKykgewoJCQlpZiAo IWNoYXRfZ2xvYmFscy5tc2dfcXVldWVbaV0pIHsKCQkJCXN3aXRjaF90aHJlYWRhdHRyX3QgKnRo ZF9hdHRyID0gTlVMTDsKCgkJCQlzd2l0Y2hfcXVldWVfY3JlYXRlKCZjaGF0X2dsb2JhbHMubXNn X3F1ZXVlW2ldLCBDSEFUX1FVRVVFX1NJWkUsIGNoYXRfZ2xvYmFscy5wb29sKTsKCgkJCQlzd2l0 Y2hfdGhyZWFkYXR0cl9jcmVhdGUoJnRoZF9hdHRyLCBjaGF0X2dsb2JhbHMucG9vbCk7CgkJCQlz d2l0Y2hfdGhyZWFkYXR0cl9zdGFja3NpemVfc2V0KHRoZF9hdHRyLCBTV0lUQ0hfVEhSRUFEX1NU QUNLU0laRSk7CgkJCQlzd2l0Y2hfdGhyZWFkX2NyZWF0ZSgmY2hhdF9nbG9iYWxzLm1zZ19xdWV1 ZV90aHJlYWRbaV0sCgkJCQkJCQkJCSB0aGRfYXR0ciwKCQkJCQkJCQkJIGNoYXRfdGhyZWFkX3J1 biwKCQkJCQkJCQkJIGNoYXRfZ2xvYmFscy5tc2dfcXVldWVbaV0sCgkJCQkJCQkJCSBjaGF0X2ds b2JhbHMucG9vbCk7CgkJCX0KCQl9Cgl9CgoJc3dpdGNoX211dGV4X3VubG9jayhjaGF0X2dsb2Jh bHMubXV0ZXgpOwp9CgoKc3RhdGljIHZvaWQgY2hhdF9xdWV1ZV9tZXNzYWdlKHN3aXRjaF9ldmVu dF90ICoqZXZlbnRwKQp7CglpbnQgaWR4ID0gMDsKCXN3aXRjaF9ldmVudF90ICpldmVudDsKCglz d2l0Y2hfYXNzZXJ0KGV2ZW50cCk7CgoJZXZlbnQgPSAqZXZlbnRwOwoJKmV2ZW50cCA9IE5VTEw7 CgoJaWYgKGNoYXRfZ2xvYmFscy5ydW5uaW5nID09IDApIHsKCQljaGF0X3Byb2Nlc3NfZXZlbnQo JmV2ZW50KTsKCQlyZXR1cm47Cgl9CgogYWdhaW46CgoJc3dpdGNoX211dGV4X2xvY2soY2hhdF9n bG9iYWxzLm11dGV4KTsKCWlkeCA9IElEWDsKCUlEWCsrOwoJaWYgKElEWCA+PSBjaGF0X2dsb2Jh bHMubXNnX3F1ZXVlX2xlbikgSURYID0gMDsKCXN3aXRjaF9tdXRleF91bmxvY2soY2hhdF9nbG9i YWxzLm11dGV4KTsKCgljaGF0X3RocmVhZF9zdGFydChpZHgpOwoKCWlmIChzd2l0Y2hfcXVldWVf dHJ5cHVzaChjaGF0X2dsb2JhbHMubXNnX3F1ZXVlW2lkeF0sIGV2ZW50KSAhPSBTV0lUQ0hfU1RB VFVTX1NVQ0NFU1MpIHsKCQlpZiAoY2hhdF9nbG9iYWxzLm1zZ19xdWV1ZV9sZW4gPCBDSEFUX01B WF9NU0dfUVVFVUUpIHsKCQkJY2hhdF90aHJlYWRfc3RhcnQoaWR4ICsgMSk7CgkJCWdvdG8gYWdh aW47CgkJfSBlbHNlIHsKCQkJc3dpdGNoX3F1ZXVlX3B1c2goY2hhdF9nbG9iYWxzLm1zZ19xdWV1 ZVtpZHhdLCBldmVudCk7CgkJfQoJfQp9CgoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3N0YXR1c190 KSBzd2l0Y2hfY29yZV9leGVjdXRlX2NoYXRfYXBwKHN3aXRjaF9ldmVudF90ICptZXNzYWdlLCBj b25zdCBjaGFyICphcHAsIGNvbnN0IGNoYXIgKmRhdGEpCnsKCXN3aXRjaF9jaGF0X2FwcGxpY2F0 aW9uX2ludGVyZmFjZV90ICpjYWk7Cglzd2l0Y2hfc3RhdHVzX3Qgc3RhdHVzID0gU1dJVENIX1NU QVRVU19TVUNDRVNTOwoJY2hhciAqZXhwYW5kZWQ7CgoJaWYgKCEoY2FpID0gc3dpdGNoX2xvYWRh YmxlX21vZHVsZV9nZXRfY2hhdF9hcHBsaWNhdGlvbl9pbnRlcmZhY2UoYXBwKSkgfHwgIWNhaS0+ Y2hhdF9hcHBsaWNhdGlvbl9mdW5jdGlvbikgewoJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9D SEFOTkVMX0xPRywgU1dJVENIX0xPR19FUlJPUiwgIkludmFsaWQgY2hhdCBhcHBsaWNhdGlvbiBp bnRlcmZhY2UgWyVzXSFcbiIsIGFwcCk7CgkJcmV0dXJuIFNXSVRDSF9TVEFUVVNfRkFMU0U7Cgl9 CgoJaWYgKHN3aXRjaF90ZXN0X2ZsYWcobWVzc2FnZSwgRUZfTk9fQ0hBVF9FWEVDKSkgewoJCXN3 aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19ERUJVRywgIk1l c3NhZ2UgaXMgbm90IGFsbG93ZWQgdG8gZXhlY3V0ZSBhcHBzXG4iKTsKCQlzd2l0Y2hfZ290b19z dGF0dXMoU1dJVENIX1NUQVRVU19GQUxTRSwgZW5kKTsKCX0KCglpZiAoZGF0YSAmJiAhc3RyY21w KGRhdGEsICJfX3VuZGVmIikpIHsKCQlkYXRhID0gTlVMTDsKCX0KCglleHBhbmRlZCA9IHN3aXRj aF9ldmVudF9leHBhbmRfaGVhZGVycyhtZXNzYWdlLCBkYXRhKTsKCglzdGF0dXMgPSBjYWktPmNo YXRfYXBwbGljYXRpb25fZnVuY3Rpb24obWVzc2FnZSwgZXhwYW5kZWQpOwoKCWlmIChleHBhbmRl ZCAhPSBkYXRhKSB7CgkJZnJlZShleHBhbmRlZCk7Cgl9CgogZW5kOgoKCVVOUFJPVEVDVF9JTlRF UkZBQ0UoY2FpKTsKCglyZXR1cm4gc3RhdHVzOwoKfQoKCgpTV0lUQ0hfREVDTEFSRShzd2l0Y2hf c3RhdHVzX3QpIHN3aXRjaF9jb3JlX2NoYXRfc2VuZF9hcmdzKGNvbnN0IGNoYXIgKmRlc3RfcHJv dG8sIGNvbnN0IGNoYXIgKnByb3RvLCBjb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywK CQkJCQkJCQkJCQkJCQkgICBjb25zdCBjaGFyICpzdWJqZWN0LCBjb25zdCBjaGFyICpib2R5LCBj b25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpoaW50LCBzd2l0Y2hfYm9vbF90IGJsb2NraW5n KQp7Cglzd2l0Y2hfZXZlbnRfdCAqbWVzc2FnZV9ldmVudDsKCXN3aXRjaF9zdGF0dXNfdCBzdGF0 dXM7CgoJaWYgKHN3aXRjaF9ldmVudF9jcmVhdGUoJm1lc3NhZ2VfZXZlbnQsIFNXSVRDSF9FVkVO VF9NRVNTQUdFKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQlzd2l0Y2hfZXZlbnRfYWRk X2hlYWRlcl9zdHJpbmcobWVzc2FnZV9ldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInByb3Rv IiwgcHJvdG8pOwoJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhtZXNzYWdlX2V2ZW50 LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiZnJvbSIsIGZyb20pOwoJCXN3aXRjaF9ldmVudF9hZGRf aGVhZGVyX3N0cmluZyhtZXNzYWdlX2V2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAidG8iLCB0 byk7CgkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKG1lc3NhZ2VfZXZlbnQsIFNXSVRD SF9TVEFDS19CT1RUT00sICJzdWJqZWN0Iiwgc3ViamVjdCk7CgkJc3dpdGNoX2V2ZW50X2FkZF9o ZWFkZXJfc3RyaW5nKG1lc3NhZ2VfZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJ0eXBlIiwg dHlwZSk7CgkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKG1lc3NhZ2VfZXZlbnQsIFNX SVRDSF9TVEFDS19CT1RUT00sICJoaW50IiwgaGludCk7CgkJc3dpdGNoX2V2ZW50X2FkZF9oZWFk ZXJfc3RyaW5nKG1lc3NhZ2VfZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJza2lwX2dsb2Jh bF9wcm9jZXNzIiwgInRydWUiKTsKCQlpZiAoYmxvY2tpbmcpIHsKCQkJc3dpdGNoX2V2ZW50X2Fk ZF9oZWFkZXJfc3RyaW5nKG1lc3NhZ2VfZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJibG9j a2luZyIsICJ0cnVlIik7CgkJfQoKCQlpZiAoYm9keSkgewoJCQlzd2l0Y2hfZXZlbnRfYWRkX2Jv ZHkobWVzc2FnZV9ldmVudCwgIiVzIiwgYm9keSk7CgkJfQoJfSBlbHNlIHsKCQlhYm9ydCgpOwoJ fQoKCWlmIChkZXN0X3Byb3RvKSB7CgkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKG1l c3NhZ2VfZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJkZXN0X3Byb3RvIiwgZGVzdF9wcm90 byk7Cgl9CgoKCWlmIChibG9ja2luZykgewoJCXN0YXR1cyA9IGNoYXRfcHJvY2Vzc19ldmVudCgm bWVzc2FnZV9ldmVudCk7Cgl9IGVsc2UgewoJCWNoYXRfcXVldWVfbWVzc2FnZSgmbWVzc2FnZV9l dmVudCk7CgkJc3RhdHVzID0gU1dJVENIX1NUQVRVU19TVUNDRVNTOwoJfQoKCXJldHVybiBzdGF0 dXM7Cgp9CgoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3N0YXR1c190KSBzd2l0Y2hfY29yZV9jaGF0 X3NlbmQoY29uc3QgY2hhciAqZGVzdF9wcm90bywgc3dpdGNoX2V2ZW50X3QgKm1lc3NhZ2VfZXZl bnQpCnsKCXN3aXRjaF9ldmVudF90ICpkdXA7CgoJc3dpdGNoX2V2ZW50X2R1cCgmZHVwLCBtZXNz YWdlX2V2ZW50KTsKCglpZiAoZGVzdF9wcm90bykgewoJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVy X3N0cmluZyhkdXAsIFNXSVRDSF9TVEFDS19CT1RUT00sICJkZXN0X3Byb3RvIiwgZGVzdF9wcm90 byk7Cgl9CgoJY2hhdF9xdWV1ZV9tZXNzYWdlKCZkdXApOwoJcmV0dXJuIFNXSVRDSF9TVEFUVVNf U1VDQ0VTUzsKfQoKClNXSVRDSF9ERUNMQVJFKHN3aXRjaF9zdGF0dXNfdCkgc3dpdGNoX2NvcmVf Y2hhdF9kZWxpdmVyKGNvbnN0IGNoYXIgKmRlc3RfcHJvdG8sIHN3aXRjaF9ldmVudF90ICoqbWVz c2FnZV9ldmVudCkKewoKCWlmIChkZXN0X3Byb3RvKSB7CgkJc3dpdGNoX2V2ZW50X2FkZF9oZWFk ZXJfc3RyaW5nKCptZXNzYWdlX2V2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiZGVzdF9wcm90 byIsIGRlc3RfcHJvdG8pOwoJfQoKCWNoYXRfcXVldWVfbWVzc2FnZShtZXNzYWdlX2V2ZW50KTsK CglyZXR1cm4gU1dJVENIX1NUQVRVU19TVUNDRVNTOwp9CgoKc3RhdGljIHN3aXRjaF9zdGF0dXNf dCBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3VucHJvY2Vzcyhzd2l0Y2hfbG9hZGFibGVfbW9kdWxl X3QgKm9sZF9tb2R1bGUpCnsKCXN3aXRjaF9ldmVudF90ICpldmVudDsKCWludCByZW1vdmVkID0g MDsKCglzd2l0Y2hfbXV0ZXhfbG9jayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKCglpZiAob2xk X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+ZW5kcG9pbnRfaW50ZXJmYWNlKSB7CgkJY29uc3Qg c3dpdGNoX2VuZHBvaW50X2ludGVyZmFjZV90ICpwdHI7CgoJCWZvciAocHRyID0gb2xkX21vZHVs ZS0+bW9kdWxlX2ludGVyZmFjZS0+ZW5kcG9pbnRfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+ bmV4dCkgewoJCQlpZiAocHRyLT5pbnRlcmZhY2VfbmFtZSkgewoKCQkJCXN3aXRjaF9jb3JlX3Nl c3Npb25faHVwYWxsX2VuZHBvaW50KHB0ciwgU1dJVENIX0NBVVNFX01BTkFHRVJfUkVRVUVTVCk7 CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfREVC VUcsICJXcml0ZSBsb2NrIGludGVyZmFjZSAnJXMnIHRvIHdhaXQgZm9yIGV4aXN0aW5nIHJlZmVy ZW5jZXMuXG4iLAoJCQkJCQkJCSAgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQlpZiAoc3dpdGNo X3RocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrX3RpbWVvdXQocHRyLT5yd2xvY2ssIDEwKSA9PSBTV0lU Q0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJCQlzd2l0Y2hfdGhyZWFkX3J3bG9ja191bmxvY2socHRy LT5yd2xvY2spOwoJCQkJfSBlbHNlIHsKCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hB Tk5FTF9MT0csIFNXSVRDSF9MT0dfRVJST1IsICJHaXZpbmcgdXAgb24gJyVzJyB3YWl0aW5nIGZv ciBleGlzdGluZyByZWZlcmVuY2VzLlxuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQl9CgoJ CQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX05PVElD RSwgIkRlbGV0aW5nIEVuZHBvaW50ICclcydcbiIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJ aWYgKHN3aXRjaF9ldmVudF9jcmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZFTlRfTU9EVUxFX1VOTE9B RCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFk ZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAidHlwZSIsICJlbmRwb2ludCIp OwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNL X0JPVFRPTSwgIm5hbWUiLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRf ZmlyZSgmZXZlbnQpOwoJCQkJCXJlbW92ZWQrKzsKCQkJCX0KCQkJCXN3aXRjaF9jb3JlX2hhc2hf ZGVsZXRlKGxvYWRhYmxlX21vZHVsZXMuZW5kcG9pbnRfaGFzaCwgcHRyLT5pbnRlcmZhY2VfbmFt ZSk7CgkJCX0KCQl9Cgl9CgoJaWYgKG9sZF9tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmNvZGVj X2ludGVyZmFjZSkgewoJCWNvbnN0IHN3aXRjaF9jb2RlY19pbXBsZW1lbnRhdGlvbl90ICppbXBs OwoJCWNvbnN0IHN3aXRjaF9jb2RlY19pbnRlcmZhY2VfdCAqcHRyOwoJCXN3aXRjaF9jb2RlY19u b2RlX3QgKm5vZGUsICpoZWFkLCAqbGFzdCA9IE5VTEw7CgoJCWZvciAocHRyID0gb2xkX21vZHVs ZS0+bW9kdWxlX2ludGVyZmFjZS0+Y29kZWNfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4 dCkgewoJCQlpZiAocHRyLT5pbnRlcmZhY2VfbmFtZSkgewoJCQkJdW5zaWduZWQgbG9hZF9pbnRl cmZhY2UgPSAxOwoJCQkJZm9yIChpbXBsID0gcHRyLT5pbXBsZW1lbnRhdGlvbnM7IGltcGw7IGlt cGwgPSBpbXBsLT5uZXh0KSB7CgkJCQkJaWYgKCFpbXBsLT5pYW5hbmFtZSkgewoJCQkJCQlsb2Fk X2ludGVyZmFjZSA9IDA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmIChsb2FkX2lu dGVyZmFjZSkgewoJCQkJCWZvciAoaW1wbCA9IHB0ci0+aW1wbGVtZW50YXRpb25zOyBpbXBsOyBp bXBsID0gaW1wbC0+bmV4dCkgewoJCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5F TF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLAoJCQkJCQkJCQkJICAiRGVsZXRpbmcgQ29kZWMgJXMg JWQgJXMgJWRoeiAlZG1zXG4iLAoJCQkJCQkJCQkJICBpbXBsLT5pYW5hbmFtZSwgaW1wbC0+aWFu YWNvZGUsCgkJCQkJCQkJCQkgIHB0ci0+aW50ZXJmYWNlX25hbWUsIGltcGwtPmFjdHVhbF9zYW1w bGVzX3Blcl9zZWNvbmQsIGltcGwtPm1pY3Jvc2Vjb25kc19wZXJfcGFja2V0IC8gMTAwMCk7CgkJ CQkJCXN3aXRjaF9jb3JlX3Nlc3Npb25faHVwYWxsX21hdGNoaW5nX3ZhcigicmVhZF9jb2RlYyIs IGltcGwtPmlhbmFuYW1lLCBTV0lUQ0hfQ0FVU0VfTUFOQUdFUl9SRVFVRVNUKTsKCQkJCQkJc3dp dGNoX2NvcmVfc2Vzc2lvbl9odXBhbGxfbWF0Y2hpbmdfdmFyKCJ3cml0ZV9jb2RlYyIsIGltcGwt PmlhbmFuYW1lLCBTV0lUQ0hfQ0FVU0VfTUFOQUdFUl9SRVFVRVNUKTsKCgkJCQkJCWlmICgoaGVh ZCA9IHN3aXRjaF9jb3JlX2hhc2hfZmluZChsb2FkYWJsZV9tb2R1bGVzLmNvZGVjX2hhc2gsIGlt cGwtPmlhbmFuYW1lKSkpIHsKCQkJCQkJCWZvcihub2RlID0gaGVhZDsgbm9kZTsgbm9kZSA9IG5v ZGUtPm5leHQpIHsKCQkJCQkJCQlpZiAoIXN0cmNtcChub2RlLT5pbnRlcmZhY2VfbmFtZSwgb2xk X21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+bW9kdWxlX25hbWUpKSB7CgkJCQkJCQkJCWlmIChu b2RlID09IGhlYWQpIHsKCQkJCQkJCQkJCWlmICgobm9kZSA9IG5vZGUtPm5leHQpKSB7CgkJCQkJ CQkJCQkJc3dpdGNoX2NvcmVfaGFzaF9pbnNlcnQobG9hZGFibGVfbW9kdWxlcy5jb2RlY19oYXNo LCBpbXBsLT5pYW5hbmFtZSwgKGNvbnN0IHZvaWQgKikgbm9kZSk7CgkJCQkJCQkJCQl9IGVsc2Ug ewoJCQkJCQkJCQkJCXN3aXRjaF9jb3JlX2hhc2hfZGVsZXRlKGxvYWRhYmxlX21vZHVsZXMuY29k ZWNfaGFzaCwgaW1wbC0+aWFuYW5hbWUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9IGVsc2UgewoJ CQkJCQkJCQkJaWYgKGxhc3QpIHsKCQkJCQkJCQkJCQlsYXN0LT5uZXh0ID0gbm9kZS0+bmV4dDsK CQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQkJ bGFzdCA9IG5vZGU7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKHN3aXRjaF9ldmVu dF9jcmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZFTlRfTU9EVUxFX1VOTE9BRCkgPT0gU1dJVENIX1NU QVRVU19TVUNDRVNTKSB7CgkJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVu dCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiY29kZWMiKTsKCQkJCQkJc3dpdGNoX2V2 ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAibmFtZSIs IHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJp bmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJtb2R1bGUiLCBvbGRfbW9kdWxlLT5tb2R1 bGVfaW50ZXJmYWNlLT5tb2R1bGVfbmFtZSk7CgkJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVu dCk7CgkJCQkJCXJlbW92ZWQrKzsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYgKG9sZF9t b2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmRpYWxwbGFuX2ludGVyZmFjZSkgewoJCWNvbnN0IHN3 aXRjaF9kaWFscGxhbl9pbnRlcmZhY2VfdCAqcHRyOwoKCQlmb3IgKHB0ciA9IG9sZF9tb2R1bGUt Pm1vZHVsZV9pbnRlcmZhY2UtPmRpYWxwbGFuX2ludGVyZmFjZTsgcHRyOyBwdHIgPSBwdHItPm5l eHQpIHsKCQkJaWYgKHB0ci0+aW50ZXJmYWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRm KFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsICJEZWxldGluZyBEaWFscGxh biAnJXMnXG4iLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCWlmIChzd2l0Y2hfZXZlbnRfY3Jl YXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9VTkxPQUQpID09IFNXSVRDSF9TVEFUVVNf U1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJ VENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiZGlhbHBsYW4iKTsKCQkJCQlzd2l0Y2hfZXZlbnRf YWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuYW1lIiwgcHRy LT5pbnRlcmZhY2VfbmFtZSk7CgkJCQkJc3dpdGNoX2V2ZW50X2ZpcmUoJmV2ZW50KTsKCQkJCQly ZW1vdmVkKys7CgkJCQl9CgkJCQlzd2l0Y2hfY29yZV9oYXNoX2RlbGV0ZShsb2FkYWJsZV9tb2R1 bGVzLmRpYWxwbGFuX2hhc2gsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQl9CgkJfQoJfQoKCWlm IChvbGRfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT50aW1lcl9pbnRlcmZhY2UpIHsKCQljb25z dCBzd2l0Y2hfdGltZXJfaW50ZXJmYWNlX3QgKnB0cjsKCgkJZm9yIChwdHIgPSBvbGRfbW9kdWxl LT5tb2R1bGVfaW50ZXJmYWNlLT50aW1lcl9pbnRlcmZhY2U7IHB0cjsgcHRyID0gcHRyLT5uZXh0 KSB7CgkJCWlmIChwdHItPmludGVyZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihT V0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLCAiRGVsZXRpbmcgVGltZXIgJyVz J1xuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQlpZiAoc3dpdGNoX2V2ZW50X2NyZWF0ZSgm ZXZlbnQsIFNXSVRDSF9FVkVOVF9NT0RVTEVfVU5MT0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NF U1MpIHsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9T VEFDS19CT1RUT00sICJ0eXBlIiwgInRpbWVyIik7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFk ZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAibmFtZSIsIHB0ci0+aW50ZXJm YWNlX25hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVudCk7CgkJCQkJcmVtb3ZlZCsr OwoJCQkJfQoJCQkJc3dpdGNoX2NvcmVfaGFzaF9kZWxldGUobG9hZGFibGVfbW9kdWxlcy50aW1l cl9oYXNoLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJfQoJCX0KCX0KCglpZiAob2xkX21vZHVs ZS0+bW9kdWxlX2ludGVyZmFjZS0+YXBwbGljYXRpb25faW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dp dGNoX2FwcGxpY2F0aW9uX2ludGVyZmFjZV90ICpwdHI7CgkJZm9yIChwdHIgPSBvbGRfbW9kdWxl LT5tb2R1bGVfaW50ZXJmYWNlLT5hcHBsaWNhdGlvbl9pbnRlcmZhY2U7IHB0cjsgcHRyID0gcHRy LT5uZXh0KSB7CgkJCWlmIChwdHItPmludGVyZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3By aW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLCAiRGVsZXRpbmcgQXBw bGljYXRpb24gJyVzJ1xuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQlzd2l0Y2hfY29yZV9z ZXNzaW9uX2h1cGFsbF9tYXRjaGluZ192YXIoU1dJVENIX0NVUlJFTlRfQVBQTElDQVRJT05fVkFS SUFCTEUsIHB0ci0+aW50ZXJmYWNlX25hbWUsIFNXSVRDSF9DQVVTRV9NQU5BR0VSX1JFUVVFU1Qp OwoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0RF QlVHLCAiV3JpdGUgbG9jayBpbnRlcmZhY2UgJyVzJyB0byB3YWl0IGZvciBleGlzdGluZyByZWZl cmVuY2VzLlxuIiwKCQkJCQkJCQkgIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJaWYgKHN3aXRj aF90aHJlYWRfcndsb2NrX3RyeXdybG9ja190aW1lb3V0KHB0ci0+cndsb2NrLCAxMCkgPT0gU1dJ VENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJc3dpdGNoX3RocmVhZF9yd2xvY2tfdW5sb2NrKHB0 ci0+cndsb2NrKTsKCQkJCX0gZWxzZSB7CgkJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NI QU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0VSUk9SLCAiR2l2aW5nIHVwIG9uICclcycgd2FpdGluZyBm b3IgZXhpc3RpbmcgcmVmZXJlbmNlcy5cbiIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJfQoK CQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9V TkxPQUQpID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVudF9hZGRf aGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiYXBwbGlj YXRpb24iKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRD SF9TVEFDS19CT1RUT00sICJuYW1lIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQkJc3dpdGNo X2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiZGVz Y3JpcHRpb24iLCBzd2l0Y2hfc3RyX25pbChwdHItPnNob3J0X2Rlc2MpKTsKCQkJCQlzd2l0Y2hf ZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJzeW50 YXgiLCBzd2l0Y2hfc3RyX25pbChwdHItPnN5bnRheCkpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJl KCZldmVudCk7CgkJCQkJcmVtb3ZlZCsrOwoJCQkJfQoJCQkJc3dpdGNoX2NvcmVfaGFzaF9kZWxl dGUobG9hZGFibGVfbW9kdWxlcy5hcHBsaWNhdGlvbl9oYXNoLCBwdHItPmludGVyZmFjZV9uYW1l KTsKCQkJfQoJCX0KCX0KCglpZiAob2xkX21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+Y2hhdF9h cHBsaWNhdGlvbl9pbnRlcmZhY2UpIHsKCQljb25zdCBzd2l0Y2hfY2hhdF9hcHBsaWNhdGlvbl9p bnRlcmZhY2VfdCAqcHRyOwoJCWZvciAocHRyID0gb2xkX21vZHVsZS0+bW9kdWxlX2ludGVyZmFj ZS0+Y2hhdF9hcHBsaWNhdGlvbl9pbnRlcmZhY2U7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CgkJ CWlmIChwdHItPmludGVyZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hf Q0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLCAiRGVsZXRpbmcgQXBwbGljYXRpb24gJyVz J1xuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQlzd2l0Y2hfY29yZV9zZXNzaW9uX2h1cGFs bF9tYXRjaGluZ192YXIoU1dJVENIX0NVUlJFTlRfQVBQTElDQVRJT05fVkFSSUFCTEUsIHB0ci0+ aW50ZXJmYWNlX25hbWUsIFNXSVRDSF9DQVVTRV9NQU5BR0VSX1JFUVVFU1QpOwoJCQkJc3dpdGNo X2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0RFQlVHLCAiV3JpdGUg bG9jayBpbnRlcmZhY2UgJyVzJyB0byB3YWl0IGZvciBleGlzdGluZyByZWZlcmVuY2VzLlxuIiwK CQkJCQkJCQkgIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJaWYgKHN3aXRjaF90aHJlYWRfcnds b2NrX3RyeXdybG9ja190aW1lb3V0KHB0ci0+cndsb2NrLCAxMCkgPT0gU1dJVENIX1NUQVRVU19T VUNDRVNTKSB7CgkJCQkJc3dpdGNoX3RocmVhZF9yd2xvY2tfdW5sb2NrKHB0ci0+cndsb2NrKTsK CQkJCX0gZWxzZSB7CgkJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBT V0lUQ0hfTE9HX0VSUk9SLCAiR2l2aW5nIHVwIG9uICclcycgd2FpdGluZyBmb3IgZXhpc3Rpbmcg cmVmZXJlbmNlcy5cbiIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJfQoKCQkJCWlmIChzd2l0 Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9VTkxPQUQpID09IFNX SVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmlu ZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiYXBwbGljYXRpb24iKTsKCQkJ CQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RU T00sICJuYW1lIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9o ZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiZGVzY3JpcHRpb24iLCBz d2l0Y2hfc3RyX25pbChwdHItPnNob3J0X2Rlc2MpKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hl YWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJzeW50YXgiLCBzd2l0Y2hf c3RyX25pbChwdHItPnN5bnRheCkpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVudCk7CgkJ CQkJcmVtb3ZlZCsrOwoJCQkJfQoJCQkJc3dpdGNoX2NvcmVfaGFzaF9kZWxldGUobG9hZGFibGVf bW9kdWxlcy5jaGF0X2FwcGxpY2F0aW9uX2hhc2gsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQl9 CgkJfQoJfQoKCWlmIChvbGRfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5hcGlfaW50ZXJmYWNl KSB7CgkJY29uc3Qgc3dpdGNoX2FwaV9pbnRlcmZhY2VfdCAqcHRyOwoKCQlmb3IgKHB0ciA9IG9s ZF9tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmFwaV9pbnRlcmZhY2U7IHB0cjsgcHRyID0gcHRy LT5uZXh0KSB7CgkJCWlmIChwdHItPmludGVyZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3By aW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLCAiRGVsZXRpbmcgQVBJ IEZ1bmN0aW9uICclcydcbiIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoKCQkJCXN3aXRjaF9sb2df cHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19ERUJVRywgIldyaXRlIGxvY2sg aW50ZXJmYWNlICclcycgdG8gd2FpdCBmb3IgZXhpc3RpbmcgcmVmZXJlbmNlcy5cbiIsCgkJCQkJ CQkJICBwdHItPmludGVyZmFjZV9uYW1lKTsKCgkJCQlpZiAoc3dpdGNoX3RocmVhZF9yd2xvY2tf dHJ5d3Jsb2NrX3RpbWVvdXQocHRyLT5yd2xvY2ssIDEwKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NF U1MpIHsKCQkJCQlzd2l0Y2hfdGhyZWFkX3J3bG9ja191bmxvY2socHRyLT5yd2xvY2spOwoJCQkJ fSBlbHNlIHsKCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRD SF9MT0dfRVJST1IsICJHaXZpbmcgdXAgb24gJyVzJyB3YWl0aW5nIGZvciBleGlzdGluZyByZWZl cmVuY2VzLlxuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQl9CgoKCQkJCWlmIChzd2l0Y2hf ZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9VTkxPQUQpID09IFNXSVRD SF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhl dmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiYXBpIik7CgkJCQkJc3dpdGNoX2V2 ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAibmFtZSIs IHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmlu ZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImRlc2NyaXB0aW9uIiwgc3dpdGNoX3N0cl9u aWwocHRyLT5kZXNjKSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50 LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAic3ludGF4Iiwgc3dpdGNoX3N0cl9uaWwocHRyLT5zeW50 YXgpKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9T VEFDS19CT1RUT00sICJrZXkiLCBvbGRfbW9kdWxlLT5rZXkpOwoJCQkJCXN3aXRjaF9ldmVudF9h ZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgImZpbGVuYW1lIiwg b2xkX21vZHVsZS0+ZmlsZW5hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVudCk7CgkJ CQkJcmVtb3ZlZCsrOwoJCQkJfQoJCQkJc3dpdGNoX2NvcmVfaGFzaF9kZWxldGUobG9hZGFibGVf bW9kdWxlcy5hcGlfaGFzaCwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCX0KCQl9Cgl9CgoJaWYg KG9sZF9tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmpzb25fYXBpX2ludGVyZmFjZSkgewoJCWNv bnN0IHN3aXRjaF9qc29uX2FwaV9pbnRlcmZhY2VfdCAqcHRyOwoKCQlmb3IgKHB0ciA9IG9sZF9t b2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmpzb25fYXBpX2ludGVyZmFjZTsgcHRyOyBwdHIgPSBw dHItPm5leHQpIHsKCQkJaWYgKHB0ci0+aW50ZXJmYWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2df cHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsICJEZWxldGluZyBB UEkgRnVuY3Rpb24gJyVzJ1xuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgoJCQkJc3dpdGNoX2xv Z19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0RFQlVHLCAiV3JpdGUgbG9j ayBpbnRlcmZhY2UgJyVzJyB0byB3YWl0IGZvciBleGlzdGluZyByZWZlcmVuY2VzLlxuIiwKCQkJ CQkJCQkgIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoKCQkJCWlmIChzd2l0Y2hfdGhyZWFkX3J3bG9j a190cnl3cmxvY2tfdGltZW91dChwdHItPnJ3bG9jaywgMTApID09IFNXSVRDSF9TVEFUVVNfU1VD Q0VTUykgewoJCQkJCXN3aXRjaF90aHJlYWRfcndsb2NrX3VubG9jayhwdHItPnJ3bG9jayk7CgkJ CQl9IGVsc2UgewoJCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJ VENIX0xPR19FUlJPUiwgIkdpdmluZyB1cCBvbiAnJXMnIHdhaXRpbmcgZm9yIGV4aXN0aW5nIHJl ZmVyZW5jZXMuXG4iLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCX0KCgoJCQkJaWYgKHN3aXRj aF9ldmVudF9jcmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZFTlRfTU9EVUxFX1VOTE9BRCkgPT0gU1dJ VENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5n KGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAidHlwZSIsICJhcGkiKTsKCQkJCQlzd2l0Y2hf ZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuYW1l IiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3Ry aW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiZGVzY3JpcHRpb24iLCBzd2l0Y2hfc3Ry X25pbChwdHItPmRlc2MpKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZl bnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJzeW50YXgiLCBzd2l0Y2hfc3RyX25pbChwdHItPnN5 bnRheCkpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVudCk7CgkJCQkJcmVtb3ZlZCsrOwoJ CQkJfQoJCQkJc3dpdGNoX2NvcmVfaGFzaF9kZWxldGUobG9hZGFibGVfbW9kdWxlcy5qc29uX2Fw aV9oYXNoLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJfQoJCX0KCX0KCglpZiAob2xkX21vZHVs ZS0+bW9kdWxlX2ludGVyZmFjZS0+ZmlsZV9pbnRlcmZhY2UpIHsKCQljb25zdCBzd2l0Y2hfZmls ZV9pbnRlcmZhY2VfdCAqcHRyOwoJCXN3aXRjaF9maWxlX25vZGVfdCAqbm9kZSwgKmhlYWQsICps YXN0ID0gTlVMTDsKCgkJZm9yIChwdHIgPSBvbGRfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5m aWxlX2ludGVyZmFjZTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKCQkJaWYgKHB0ci0+aW50ZXJm YWNlX25hbWUpIHsKCQkJCWludCBpOwoKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFO TkVMX0xPRywgU1dJVENIX0xPR19ERUJVRywgIldyaXRlIGxvY2sgaW50ZXJmYWNlICclcycgdG8g d2FpdCBmb3IgZXhpc3RpbmcgcmVmZXJlbmNlcy5cbiIsCgkJCQkJCQkJICBwdHItPmludGVyZmFj ZV9uYW1lKTsKCgkJCQlpZiAoc3dpdGNoX3RocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrX3RpbWVvdXQo cHRyLT5yd2xvY2ssIDEwKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJCQlzd2l0Y2hf dGhyZWFkX3J3bG9ja191bmxvY2socHRyLT5yd2xvY2spOwoJCQkJfSBlbHNlIHsKCQkJCQlzd2l0 Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfRVJST1IsICJHaXZp bmcgdXAgb24gJyVzJyB3YWl0aW5nIGZvciBleGlzdGluZyByZWZlcmVuY2VzLlxuIiwgcHRyLT5p bnRlcmZhY2VfbmFtZSk7CgkJCQl9CgoJCQkJZm9yIChpID0gMDsgcHRyLT5leHRlbnNbaV07IGkr KykgewoJCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xP R19OT1RJQ0UsICJEZWxldGluZyBGaWxlIEZvcm1hdCAnJXMnXG4iLCBwdHItPmV4dGVuc1tpXSk7 CgkJCQkJaWYgKHN3aXRjaF9ldmVudF9jcmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZFTlRfTU9EVUxF X1VOTE9BRCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJCXN3aXRjaF9ldmVudF9h ZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAiZmls ZSIpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9T VEFDS19CT1RUT00sICJuYW1lIiwgcHRyLT5leHRlbnNbaV0pOwoJCQkJCQlzd2l0Y2hfZXZlbnRf YWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJtb2R1bGUiLCBv bGRfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5tb2R1bGVfbmFtZSk7CgkJCQkJCXN3aXRjaF9l dmVudF9maXJlKCZldmVudCk7CgkJCQkJCXJlbW92ZWQrKzsKCQkJCQl9CgoJCQkJCWlmICgoaGVh ZCA9IHN3aXRjaF9jb3JlX2hhc2hfZmluZChsb2FkYWJsZV9tb2R1bGVzLmZpbGVfaGFzaCwgcHRy LT5leHRlbnNbaV0pKSkgewoJCQkJCQlmb3Iobm9kZSA9IGhlYWQ7IG5vZGU7IG5vZGUgPSBub2Rl LT5uZXh0KSB7CgkJCQkJCQlpZiAoIXN0cmNtcChub2RlLT5pbnRlcmZhY2VfbmFtZSwgb2xkX21v ZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+bW9kdWxlX25hbWUpKSB7CgkJCQkJCQkJaWYgKG5vZGUg PT0gaGVhZCkgewoJCQkJCQkJCQlpZiAoKG5vZGUgPSBub2RlLT5uZXh0KSkgewoJCQkJCQkJCQkJ c3dpdGNoX2NvcmVfaGFzaF9pbnNlcnQobG9hZGFibGVfbW9kdWxlcy5maWxlX2hhc2gsIHB0ci0+ ZXh0ZW5zW2ldLCAoY29uc3Qgdm9pZCAqKSBub2RlKTsKCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJ CQkJCXN3aXRjaF9jb3JlX2hhc2hfZGVsZXRlKGxvYWRhYmxlX21vZHVsZXMuZmlsZV9oYXNoLCBw dHItPmV4dGVuc1tpXSk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlpZiAo bGFzdCkgewoJCQkJCQkJCQkJbGFzdC0+bmV4dCA9IG5vZGUtPm5leHQ7CgkJCQkJCQkJCX0KCQkJ CQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCQlsYXN0ID0gbm9kZTsKCQkJCQkJ fQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAob2xkX21vZHVsZS0+bW9kdWxlX2ludGVy ZmFjZS0+c3BlZWNoX2ludGVyZmFjZSkgewoJCWNvbnN0IHN3aXRjaF9zcGVlY2hfaW50ZXJmYWNl X3QgKnB0cjsKCgkJZm9yIChwdHIgPSBvbGRfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5zcGVl Y2hfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoKCQkJaWYgKHB0ci0+aW50ZXJm YWNlX25hbWUpIHsKCgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNX SVRDSF9MT0dfREVCVUcsICJXcml0ZSBsb2NrIGludGVyZmFjZSAnJXMnIHRvIHdhaXQgZm9yIGV4 aXN0aW5nIHJlZmVyZW5jZXMuXG4iLAoJCQkJCQkJCSAgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgoJ CQkJaWYgKHN3aXRjaF90aHJlYWRfcndsb2NrX3RyeXdybG9ja190aW1lb3V0KHB0ci0+cndsb2Nr LCAxMCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJc3dpdGNoX3RocmVhZF9yd2xv Y2tfdW5sb2NrKHB0ci0+cndsb2NrKTsKCQkJCX0gZWxzZSB7CgkJCQkJc3dpdGNoX2xvZ19wcmlu dGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0VSUk9SLCAiR2l2aW5nIHVwIG9uICcl cycgd2FpdGluZyBmb3IgZXhpc3RpbmcgcmVmZXJlbmNlcy5cbiIsIHB0ci0+aW50ZXJmYWNlX25h bWUpOwoJCQkJfQoKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJ VENIX0xPR19OT1RJQ0UsICJEZWxldGluZyBTcGVlY2ggaW50ZXJmYWNlICclcydcbiIsIHB0ci0+ aW50ZXJmYWNlX25hbWUpOwoJCQkJaWYgKHN3aXRjaF9ldmVudF9jcmVhdGUoJmV2ZW50LCBTV0lU Q0hfRVZFTlRfTU9EVUxFX1VOTE9BRCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJ c3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9N LCAidHlwZSIsICJzcGVlY2giKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmco ZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuYW1lIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7 CgkJCQkJc3dpdGNoX2V2ZW50X2ZpcmUoJmV2ZW50KTsKCQkJCQlyZW1vdmVkKys7CgkJCQl9CgkJ CQlzd2l0Y2hfY29yZV9oYXNoX2RlbGV0ZShsb2FkYWJsZV9tb2R1bGVzLnNwZWVjaF9oYXNoLCBw dHItPmludGVyZmFjZV9uYW1lKTsKCQkJfQoJCX0KCX0KCglpZiAob2xkX21vZHVsZS0+bW9kdWxl X2ludGVyZmFjZS0+YXNyX2ludGVyZmFjZSkgewoJCWNvbnN0IHN3aXRjaF9hc3JfaW50ZXJmYWNl X3QgKnB0cjsKCgkJZm9yIChwdHIgPSBvbGRfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5hc3Jf aW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlpZiAocHRyLT5pbnRlcmZhY2Vf bmFtZSkgewoKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENI X0xPR19ERUJVRywgIldyaXRlIGxvY2sgaW50ZXJmYWNlICclcycgdG8gd2FpdCBmb3IgZXhpc3Rp bmcgcmVmZXJlbmNlcy5cbiIsCgkJCQkJCQkJICBwdHItPmludGVyZmFjZV9uYW1lKTsKCgkJCQlp ZiAoc3dpdGNoX3RocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrX3RpbWVvdXQocHRyLT5yd2xvY2ssIDEw KSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJCQlzd2l0Y2hfdGhyZWFkX3J3bG9ja191 bmxvY2socHRyLT5yd2xvY2spOwoJCQkJfSBlbHNlIHsKCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihT V0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfRVJST1IsICJHaXZpbmcgdXAgb24gJyVzJyB3 YWl0aW5nIGZvciBleGlzdGluZyByZWZlcmVuY2VzLlxuIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7 CgkJCQl9CgoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hf TE9HX05PVElDRSwgIkRlbGV0aW5nIEFzciBpbnRlcmZhY2UgJyVzJ1xuIiwgcHRyLT5pbnRlcmZh Y2VfbmFtZSk7CgkJCQlpZiAoc3dpdGNoX2V2ZW50X2NyZWF0ZSgmZXZlbnQsIFNXSVRDSF9FVkVO VF9NT0RVTEVfVU5MT0FEKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJCQlzd2l0Y2hf ZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJ0eXBl IiwgImFzciIpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJ VENIX1NUQUNLX0JPVFRPTSwgIm5hbWUiLCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCQlzd2l0 Y2hfZXZlbnRfZmlyZSgmZXZlbnQpOwoJCQkJCXJlbW92ZWQrKzsKCQkJCX0KCQkJCXN3aXRjaF9j b3JlX2hhc2hfZGVsZXRlKGxvYWRhYmxlX21vZHVsZXMuYXNyX2hhc2gsIHB0ci0+aW50ZXJmYWNl X25hbWUpOwoJCQl9CgkJfQoJfQoKCWlmIChvbGRfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5k aXJlY3RvcnlfaW50ZXJmYWNlKSB7CgkJY29uc3Qgc3dpdGNoX2RpcmVjdG9yeV9pbnRlcmZhY2Vf dCAqcHRyOwoKCQlmb3IgKHB0ciA9IG9sZF9tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmRpcmVj dG9yeV9pbnRlcmZhY2U7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CgkJCWlmIChwdHItPmludGVy ZmFjZV9uYW1lKSB7CgoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBT V0lUQ0hfTE9HX0RFQlVHLCAiV3JpdGUgbG9jayBpbnRlcmZhY2UgJyVzJyB0byB3YWl0IGZvciBl eGlzdGluZyByZWZlcmVuY2VzLlxuIiwKCQkJCQkJCQkgIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoK CQkJCWlmIChzd2l0Y2hfdGhyZWFkX3J3bG9ja190cnl3cmxvY2tfdGltZW91dChwdHItPnJ3bG9j aywgMTApID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF90aHJlYWRfcnds b2NrX3VubG9jayhwdHItPnJ3bG9jayk7CgkJCQl9IGVsc2UgewoJCQkJCXN3aXRjaF9sb2dfcHJp bnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19FUlJPUiwgIkdpdmluZyB1cCBvbiAn JXMnIHdhaXRpbmcgZm9yIGV4aXN0aW5nIHJlZmVyZW5jZXMuXG4iLCBwdHItPmludGVyZmFjZV9u YW1lKTsKCQkJCX0KCgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNX SVRDSF9MT0dfTk9USUNFLCAiRGVsZXRpbmcgRGlyZWN0b3J5IGludGVyZmFjZSAnJXMnXG4iLCBw dHItPmludGVyZmFjZV9uYW1lKTsKCQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwg U1dJVENIX0VWRU5UX01PRFVMRV9VTkxPQUQpID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJ CQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JP VFRPTSwgInR5cGUiLCAiZGlyZWN0b3J5Iik7CgkJCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJf c3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAibmFtZSIsIHB0ci0+aW50ZXJmYWNl X25hbWUpOwoJCQkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVudCk7CgkJCQkJcmVtb3ZlZCsrOwoJ CQkJfQoJCQkJc3dpdGNoX2NvcmVfaGFzaF9kZWxldGUobG9hZGFibGVfbW9kdWxlcy5kaXJlY3Rv cnlfaGFzaCwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCX0KCQl9Cgl9CgoKCWlmIChvbGRfbW9k dWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5jaGF0X2ludGVyZmFjZSkgewoJCWNvbnN0IHN3aXRjaF9j aGF0X2ludGVyZmFjZV90ICpwdHI7CgoJCWZvciAocHRyID0gb2xkX21vZHVsZS0+bW9kdWxlX2lu dGVyZmFjZS0+Y2hhdF9pbnRlcmZhY2U7IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CgkJCWlmIChw dHItPmludGVyZmFjZV9uYW1lKSB7CgkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5F TF9MT0csIFNXSVRDSF9MT0dfREVCVUcsICJXcml0ZSBsb2NrIGludGVyZmFjZSAnJXMnIHRvIHdh aXQgZm9yIGV4aXN0aW5nIHJlZmVyZW5jZXMuXG4iLAoJCQkJCQkJCSAgcHRyLT5pbnRlcmZhY2Vf bmFtZSk7CgoJCQkJaWYgKHN3aXRjaF90aHJlYWRfcndsb2NrX3RyeXdybG9ja190aW1lb3V0KHB0 ci0+cndsb2NrLCAxMCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJc3dpdGNoX3Ro cmVhZF9yd2xvY2tfdW5sb2NrKHB0ci0+cndsb2NrKTsKCQkJCX0gZWxzZSB7CgkJCQkJc3dpdGNo X2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0VSUk9SLCAiR2l2aW5n IHVwIG9uICclcycgd2FpdGluZyBmb3IgZXhpc3RpbmcgcmVmZXJlbmNlcy5cbiIsIHB0ci0+aW50 ZXJmYWNlX25hbWUpOwoJCQkJfQoKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVM X0xPRywgU1dJVENIX0xPR19OT1RJQ0UsICJEZWxldGluZyBDaGF0IGludGVyZmFjZSAnJXMnXG4i LCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVu dCwgU1dJVENIX0VWRU5UX01PRFVMRV9VTkxPQUQpID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykg ewoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNL X0JPVFRPTSwgInR5cGUiLCAiY2hhdCIpOwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0 cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIm5hbWUiLCBwdHItPmludGVyZmFjZV9u YW1lKTsKCQkJCQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQpOwoJCQkJCXJlbW92ZWQrKzsKCQkJ CX0KCQkJCXN3aXRjaF9jb3JlX2hhc2hfZGVsZXRlKGxvYWRhYmxlX21vZHVsZXMuY2hhdF9oYXNo LCBwdHItPmludGVyZmFjZV9uYW1lKTsKCQkJfQoJCX0KCX0KCglpZiAob2xkX21vZHVsZS0+bW9k dWxlX2ludGVyZmFjZS0+c2F5X2ludGVyZmFjZSkgewoJCWNvbnN0IHN3aXRjaF9zYXlfaW50ZXJm YWNlX3QgKnB0cjsKCgkJZm9yIChwdHIgPSBvbGRfbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5z YXlfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlpZiAocHRyLT5pbnRlcmZh Y2VfbmFtZSkgewoJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lU Q0hfTE9HX0RFQlVHLCAiV3JpdGUgbG9jayBpbnRlcmZhY2UgJyVzJyB0byB3YWl0IGZvciBleGlz dGluZyByZWZlcmVuY2VzLlxuIiwKCQkJCQkJCQkgIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoKCQkJ CWlmIChzd2l0Y2hfdGhyZWFkX3J3bG9ja190cnl3cmxvY2tfdGltZW91dChwdHItPnJ3bG9jaywg MTApID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF90aHJlYWRfcndsb2Nr X3VubG9jayhwdHItPnJ3bG9jayk7CgkJCQl9IGVsc2UgewoJCQkJCXN3aXRjaF9sb2dfcHJpbnRm KFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19FUlJPUiwgIkdpdmluZyB1cCBvbiAnJXMn IHdhaXRpbmcgZm9yIGV4aXN0aW5nIHJlZmVyZW5jZXMuXG4iLCBwdHItPmludGVyZmFjZV9uYW1l KTsKCQkJCX0KCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENI X0xPR19OT1RJQ0UsICJEZWxldGluZyBTYXkgaW50ZXJmYWNlICclcydcbiIsIHB0ci0+aW50ZXJm YWNlX25hbWUpOwoJCQkJaWYgKHN3aXRjaF9ldmVudF9jcmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZF TlRfTU9EVUxFX1VOTE9BRCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJc3dpdGNo X2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAidHlw ZSIsICJzYXkiKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNX SVRDSF9TVEFDS19CT1RUT00sICJuYW1lIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQkJc3dp dGNoX2V2ZW50X2ZpcmUoJmV2ZW50KTsKCQkJCQlyZW1vdmVkKys7CgkJCQl9CgkJCQlzd2l0Y2hf Y29yZV9oYXNoX2RlbGV0ZShsb2FkYWJsZV9tb2R1bGVzLnNheV9oYXNoLCBwdHItPmludGVyZmFj ZV9uYW1lKTsKCQkJfQoJCX0KCX0KCglpZiAob2xkX21vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+ bWFuYWdlbWVudF9pbnRlcmZhY2UpIHsKCQljb25zdCBzd2l0Y2hfbWFuYWdlbWVudF9pbnRlcmZh Y2VfdCAqcHRyOwoKCQlmb3IgKHB0ciA9IG9sZF9tb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPm1h bmFnZW1lbnRfaW50ZXJmYWNlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewoJCQlpZiAocHRyLT5y ZWxhdGl2ZV9vaWQpIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywg U1dJVENIX0xPR19OT1RJQ0UsCgkJCQkJCQkJICAiRGVsZXRpbmcgTWFuYWdlbWVudCBpbnRlcmZh Y2UgJyVzJyBPSURbJXMuJXNdXG4iLCBvbGRfbW9kdWxlLT5rZXksIEZSRUVTV0lUQ0hfT0lEX1BS RUZJWCwgcHRyLT5yZWxhdGl2ZV9vaWQpOwoJCQkJc3dpdGNoX2NvcmVfaGFzaF9kZWxldGUobG9h ZGFibGVfbW9kdWxlcy5tYW5hZ2VtZW50X2hhc2gsIHB0ci0+cmVsYXRpdmVfb2lkKTsKCQkJCWlm IChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01PRFVMRV9VTkxPQUQp ID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVy X3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAibWFuYWdlbWVudCIp OwoJCQkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNL X0JPVFRPTSwgIm5hbWUiLCBwdHItPnJlbGF0aXZlX29pZCk7CgkJCQkJc3dpdGNoX2V2ZW50X2Zp cmUoJmV2ZW50KTsKCQkJCQlyZW1vdmVkKys7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYgKG9sZF9t b2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPmxpbWl0X2ludGVyZmFjZSkgewoJCWNvbnN0IHN3aXRj aF9saW1pdF9pbnRlcmZhY2VfdCAqcHRyOwoKCQlmb3IgKHB0ciA9IG9sZF9tb2R1bGUtPm1vZHVs ZV9pbnRlcmZhY2UtPmxpbWl0X2ludGVyZmFjZTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKCQkJ aWYgKHB0ci0+aW50ZXJmYWNlX25hbWUpIHsKCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9D SEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsCgkJCQkJCQkJICAiRGVsZXRpbmcgTGltaXQg aW50ZXJmYWNlICclcydcbiIsIHB0ci0+aW50ZXJmYWNlX25hbWUpOwoJCQkJc3dpdGNoX2NvcmVf aGFzaF9kZWxldGUobG9hZGFibGVfbW9kdWxlcy5saW1pdF9oYXNoLCBwdHItPmludGVyZmFjZV9u YW1lKTsKCQkJCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX01P RFVMRV9VTkxPQUQpID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJCXN3aXRjaF9ldmVu dF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5cGUiLCAi bGltaXQiKTsKCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRD SF9TVEFDS19CT1RUT00sICJuYW1lIiwgcHRyLT5pbnRlcmZhY2VfbmFtZSk7CgkJCQkJc3dpdGNo X2V2ZW50X2ZpcmUoJmV2ZW50KTsKCQkJCQlyZW1vdmVkKys7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJ aWYgKCFyZW1vdmVkKSB7CgkJaWYgKHN3aXRjaF9ldmVudF9jcmVhdGUoJmV2ZW50LCBTV0lUQ0hf RVZFTlRfTU9EVUxFX1VOTE9BRCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCXN3aXRj aF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgInR5 cGUiLCAiZ2VuZXJpYyIpOwoJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQs IFNXSVRDSF9TVEFDS19CT1RUT00sICJuYW1lIiwgb2xkX21vZHVsZS0+a2V5KTsKCQkJc3dpdGNo X2V2ZW50X2ZpcmUoJmV2ZW50KTsKCQkJcmVtb3ZlZCsrOwoJCX0KCX0KCXN3aXRjaF9tdXRleF91 bmxvY2sobG9hZGFibGVfbW9kdWxlcy5tdXRleCk7CgoJcmV0dXJuIFNXSVRDSF9TVEFUVVNfU1VD Q0VTUzsKCn0KCgpzdGF0aWMgc3dpdGNoX3N0YXR1c190IHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVf bG9hZF9maWxlKGNoYXIgKnBhdGgsIGNoYXIgKmZpbGVuYW1lLCBzd2l0Y2hfYm9vbF90IGdsb2Jh bCwgc3dpdGNoX2xvYWRhYmxlX21vZHVsZV90ICoqbmV3X21vZHVsZSkKewoJc3dpdGNoX2xvYWRh YmxlX21vZHVsZV90ICptb2R1bGUgPSBOVUxMOwoJc3dpdGNoX2Rzb19saWJfdCBkc28gPSBOVUxM OwoJYXByX3N0YXR1c190IHN0YXR1cyA9IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUzsKCXN3aXRjaF9s b2FkYWJsZV9tb2R1bGVfZnVuY3Rpb25fdGFibGVfdCAqaW50ZXJmYWNlX3N0cnVjdF9oYW5kbGUg PSBOVUxMOwoJc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9mdW5jdGlvbl90YWJsZV90ICptb2RfaW50 ZXJmYWNlX2Z1bmN0aW9ucyA9IE5VTEw7CgljaGFyICpzdHJ1Y3RfbmFtZSA9IE5VTEw7Cglzd2l0 Y2hfbW9kdWxlX2xvYWRfdCBsb2FkX2Z1bmNfcHRyID0gTlVMTDsKCWludCBsb2FkaW5nID0gMTsK CXN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfaW50ZXJmYWNlX3QgKm1vZHVsZV9pbnRlcmZhY2UgPSBO VUxMOwoJY2hhciAqZGVyciA9IE5VTEw7Cgljb25zdCBjaGFyICplcnIgPSBOVUxMOwoJc3dpdGNo X21lbW9yeV9wb29sX3QgKnBvb2wgPSBOVUxMOwoJc3dpdGNoX2Jvb2xfdCBsb2FkX2dsb2JhbCA9 IGdsb2JhbDsKCglzd2l0Y2hfYXNzZXJ0KHBhdGggIT0gTlVMTCk7CgoJc3dpdGNoX2NvcmVfbmV3 X21lbW9yeV9wb29sKCZwb29sKTsKCSpuZXdfbW9kdWxlID0gTlVMTDsKCglzdHJ1Y3RfbmFtZSA9 IHN3aXRjaF9jb3JlX3NwcmludGYocG9vbCwgIiVzX21vZHVsZV9pbnRlcmZhY2UiLCBmaWxlbmFt ZSk7CgojaWZkZWYgV0lOMzIKCWRzbyA9IHN3aXRjaF9kc29fb3BlbigiRnJlZVN3aXRjaC5kbGwi LCBsb2FkX2dsb2JhbCwgJmRlcnIpOwojZWxpZiBkZWZpbmVkIChNQUNPU1gpIHx8IGRlZmluZWQo REFSV0lOKQoJewoJCWNoYXIgKmxpYl9wYXRoID0gc3dpdGNoX21wcmludGYoIiVzL2xpYmZyZWVz d2l0Y2guZHlsaWIiLCBTV0lUQ0hfR0xPQkFMX2RpcnMubGliX2Rpcik7CgkJZHNvID0gc3dpdGNo X2Rzb19vcGVuKGxpYl9wYXRoLCBsb2FkX2dsb2JhbCwgJmRlcnIpOwoJCXN3aXRjaF9zYWZlX2Zy ZWUobGliX3BhdGgpOwoJfQojZWxzZQoJZHNvID0gc3dpdGNoX2Rzb19vcGVuKE5VTEwsIGxvYWRf Z2xvYmFsLCAmZGVycik7CiNlbmRpZgoJaWYgKCFkZXJyICYmIGRzbykgewoJCWludGVyZmFjZV9z dHJ1Y3RfaGFuZGxlID0gc3dpdGNoX2Rzb19kYXRhX3N5bShkc28sIHN0cnVjdF9uYW1lLCAmZGVy cik7Cgl9CgoJc3dpdGNoX3NhZmVfZnJlZShkZXJyKTsKCglpZiAoIWludGVyZmFjZV9zdHJ1Y3Rf aGFuZGxlKSB7CgkJaWYgKGRzbykgc3dpdGNoX2Rzb19kZXN0cm95KCZkc28pOwoJCWRzbyA9IHN3 aXRjaF9kc29fb3BlbihwYXRoLCBsb2FkX2dsb2JhbCwgJmRlcnIpOwoJfQoKCXdoaWxlIChsb2Fk aW5nKSB7CgkJaWYgKGRlcnIpIHsKCQkJZXJyID0gZGVycjsKCQkJYnJlYWs7CgkJfQoKCQlpZiAo IWludGVyZmFjZV9zdHJ1Y3RfaGFuZGxlKSB7CgkJCWludGVyZmFjZV9zdHJ1Y3RfaGFuZGxlID0g c3dpdGNoX2Rzb19kYXRhX3N5bShkc28sIHN0cnVjdF9uYW1lLCAmZGVycik7CgkJfQoKCQlpZiAo ZGVycikgewoJCQllcnIgPSBkZXJyOwoJCQlicmVhazsKCQl9CgoJCWlmIChpbnRlcmZhY2Vfc3Ry dWN0X2hhbmRsZSAmJiBpbnRlcmZhY2Vfc3RydWN0X2hhbmRsZS0+c3dpdGNoX2FwaV92ZXJzaW9u ICE9IFNXSVRDSF9BUElfVkVSU0lPTikgewoJCQllcnIgPSAiVHJ5aW5nIHRvIGxvYWQgYW4gb3V0 IG9mIGRhdGUgbW9kdWxlLCBwbGVhc2UgcmVidWlsZCB0aGUgbW9kdWxlLiI7CgkJCWJyZWFrOwoJ CX0KCgkJaWYgKCFsb2FkX2dsb2JhbCAmJiBpbnRlcmZhY2Vfc3RydWN0X2hhbmRsZSAmJiBzd2l0 Y2hfdGVzdF9mbGFnKGludGVyZmFjZV9zdHJ1Y3RfaGFuZGxlLCBTTU9ERl9HTE9CQUxfU1lNQk9M UykpIHsKCQkJbG9hZF9nbG9iYWwgPSBTV0lUQ0hfVFJVRTsKCQkJc3dpdGNoX2Rzb19kZXN0cm95 KCZkc28pOwoJCQlpbnRlcmZhY2Vfc3RydWN0X2hhbmRsZSA9IE5VTEw7CgkJCWRzbyA9IHN3aXRj aF9kc29fb3BlbihwYXRoLCBsb2FkX2dsb2JhbCwgJmRlcnIpOwoJCQlzd2l0Y2hfbG9nX3ByaW50 ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfREVCVUcsICJMb2FkaW5nIG1vZHVsZSB3 aXRoIGdsb2JhbCBuYW1lc3BhY2UgYXQgcmVxdWVzdCBvZiBtb2R1bGVcbiIpOwoJCQljb250aW51 ZTsKCQl9CgoJCWlmIChpbnRlcmZhY2Vfc3RydWN0X2hhbmRsZSkgewoJCQltb2RfaW50ZXJmYWNl X2Z1bmN0aW9ucyA9IGludGVyZmFjZV9zdHJ1Y3RfaGFuZGxlOwoJCQlsb2FkX2Z1bmNfcHRyID0g bW9kX2ludGVyZmFjZV9mdW5jdGlvbnMtPmxvYWQ7CgkJfQoKCQlpZiAobG9hZF9mdW5jX3B0ciA9 PSBOVUxMKSB7CgkJCWVyciA9ICJDYW5ub3QgbG9jYXRlIHN5bWJvbCAnc3dpdGNoX21vZHVsZV9s b2FkJyBwbGVhc2UgbWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBtb2R1bGUuIjsKCQkJYnJlYWs7 CgkJfQoKCQlzdGF0dXMgPSBsb2FkX2Z1bmNfcHRyKCZtb2R1bGVfaW50ZXJmYWNlLCBwb29sKTsK CgkJaWYgKHN0YXR1cyAhPSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFNXSVRD SF9TVEFUVVNfTk9VTkxPQUQpIHsKCQkJZXJyID0gIk1vZHVsZSBsb2FkIHJvdXRpbmUgcmV0dXJu ZWQgYW4gZXJyb3IiOwoJCQltb2R1bGVfaW50ZXJmYWNlID0gTlVMTDsKCQkJYnJlYWs7CgkJfQoK CQlpZiAoIW1vZHVsZV9pbnRlcmZhY2UpIHsKCQkJZXJyID0gIk1vZHVsZSBmYWlsZWQgdG8gaW5p dGlhbGl6ZSBpdHMgbW9kdWxlX2ludGVyZmFjZS4gSXMgdGhpcyBhIHZhbGlkIG1vZHVsZT8iOwoJ CQlicmVhazsKCQl9CgoJCWlmICgobW9kdWxlID0gc3dpdGNoX2NvcmVfYWxsb2MocG9vbCwgc2l6 ZW9mKHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfdCkpKSA9PSAwKSB7CgkJCWVyciA9ICJDb3VsZCBu b3QgYWxsb2NhdGUgbWVtb3J5XG4iOwoJCQlhYm9ydCgpOwoJCX0KCgkJaWYgKHN0YXR1cyA9PSBT V0lUQ0hfU1RBVFVTX05PVU5MT0FEKSB7CgkJCW1vZHVsZS0+cGVybSsrOwoJCX0KCgkJbG9hZGlu ZyA9IDA7Cgl9CgoKCWlmIChlcnIpIHsKCgkJaWYgKGRzbykgewoJCQlzd2l0Y2hfZHNvX2Rlc3Ry b3koJmRzbyk7CgkJfQoKCQlpZiAocG9vbCkgewoJCQlzd2l0Y2hfY29yZV9kZXN0cm95X21lbW9y eV9wb29sKCZwb29sKTsKCQl9CgkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9H LCBTV0lUQ0hfTE9HX0NSSVQsICJFcnJvciBMb2FkaW5nIG1vZHVsZSAlc1xuKiolcyoqXG4iLCBw YXRoLCBlcnIpOwoJCXN3aXRjaF9zYWZlX2ZyZWUoZGVycik7CgkJcmV0dXJuIFNXSVRDSF9TVEFU VVNfR0VORVJSOwoJfQoKCW1vZHVsZS0+cG9vbCA9IHBvb2w7Cgltb2R1bGUtPmZpbGVuYW1lID0g c3dpdGNoX2NvcmVfc3RyZHVwKG1vZHVsZS0+cG9vbCwgcGF0aCk7Cgltb2R1bGUtPm1vZHVsZV9p bnRlcmZhY2UgPSBtb2R1bGVfaW50ZXJmYWNlOwoJbW9kdWxlLT5zd2l0Y2hfbW9kdWxlX2xvYWQg PSBsb2FkX2Z1bmNfcHRyOwoKCWlmIChtb2RfaW50ZXJmYWNlX2Z1bmN0aW9ucykgewoJCW1vZHVs ZS0+c3dpdGNoX21vZHVsZV9zaHV0ZG93biA9IG1vZF9pbnRlcmZhY2VfZnVuY3Rpb25zLT5zaHV0 ZG93bjsKCQltb2R1bGUtPnN3aXRjaF9tb2R1bGVfcnVudGltZSA9IG1vZF9pbnRlcmZhY2VfZnVu Y3Rpb25zLT5ydW50aW1lOwoJfQoKCW1vZHVsZS0+bGliID0gZHNvOwoKCSpuZXdfbW9kdWxlID0g bW9kdWxlOwoJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9H X0NPTlNPTEUsICJTdWNjZXNzZnVsbHkgTG9hZGVkIFslc11cbiIsIG1vZHVsZV9pbnRlcmZhY2Ut Pm1vZHVsZV9uYW1lKTsKCglzd2l0Y2hfY29yZV9zZXRfc2lnbmFsX2hhbmRsZXJzKCk7CgoJcmV0 dXJuIFNXSVRDSF9TVEFUVVNfU1VDQ0VTUzsKCn0KU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3N0YXR1 c190KSBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX2xvYWRfbW9kdWxlKGNoYXIgKmRpciwgY2hhciAq Zm5hbWUsIHN3aXRjaF9ib29sX3QgcnVudGltZSwgY29uc3QgY2hhciAqKmVycikKewoJcmV0dXJu IHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfbG9hZF9tb2R1bGVfZXgoZGlyLCBmbmFtZSwgcnVudGlt ZSwgU1dJVENIX0ZBTFNFLCBlcnIpOwp9CgpzdGF0aWMgc3dpdGNoX3N0YXR1c190IHN3aXRjaF9s b2FkYWJsZV9tb2R1bGVfbG9hZF9tb2R1bGVfZXgoY2hhciAqZGlyLCBjaGFyICpmbmFtZSwgc3dp dGNoX2Jvb2xfdCBydW50aW1lLCBzd2l0Y2hfYm9vbF90IGdsb2JhbCwgY29uc3QgY2hhciAqKmVy cikKewoJc3dpdGNoX3NpemVfdCBsZW4gPSAwOwoJY2hhciAqcGF0aDsKCWNoYXIgKmZpbGUsICpk b3Q7Cglzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3QgKm5ld19tb2R1bGUgPSBOVUxMOwoJc3dpdGNo X3N0YXR1c190IHN0YXR1cyA9IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUzsKCiNpZmRlZiBXSU4zMgoJ Y29uc3QgY2hhciAqZXh0ID0gIi5kbGwiOwojZWxzZQoJY29uc3QgY2hhciAqZXh0ID0gIi5zbyI7 CiNlbmRpZgoKCSplcnIgPSAiIjsKCglpZiAoKGZpbGUgPSBzd2l0Y2hfY29yZV9zdHJkdXAobG9h ZGFibGVfbW9kdWxlcy5wb29sLCBmbmFtZSkpID09IDApIHsKCQkqZXJyID0gImFsbG9jYXRpb24g ZXJyb3IiOwoJCXJldHVybiBTV0lUQ0hfU1RBVFVTX0ZBTFNFOwoJfQoKCWlmIChzd2l0Y2hfaXNf ZmlsZV9wYXRoKGZpbGUpKSB7CgkJcGF0aCA9IHN3aXRjaF9jb3JlX3N0cmR1cChsb2FkYWJsZV9t b2R1bGVzLnBvb2wsIGZpbGUpOwoJCWZpbGUgPSAoY2hhciAqKSBzd2l0Y2hfY3V0X3BhdGgoZmls ZSk7CgkJaWYgKChkb3QgPSBzdHJjaHIoZmlsZSwgJy4nKSkpIHsKCQkJKmRvdCA9ICdcMCc7CgkJ fQoJfSBlbHNlIHsKCQlpZiAoKGRvdCA9IHN0cmNocihmaWxlLCAnLicpKSkgewoJCQkqZG90ID0g J1wwJzsKCQl9CgkJbGVuID0gc3RybGVuKGRpcik7CgkJbGVuICs9IHN0cmxlbihmaWxlKTsKCQls ZW4gKz0gODsKCQlwYXRoID0gKGNoYXIgKikgc3dpdGNoX2NvcmVfYWxsb2MobG9hZGFibGVfbW9k dWxlcy5wb29sLCBsZW4pOwoJCXN3aXRjaF9zbnByaW50ZihwYXRoLCBsZW4sICIlcyVzJXMlcyIs IGRpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SLCBmaWxlLCBleHQpOwoJfQoKCglpZiAoc3dpdGNo X2NvcmVfaGFzaF9maW5kX2xvY2tlZChsb2FkYWJsZV9tb2R1bGVzLm1vZHVsZV9oYXNoLCBmaWxl LCBsb2FkYWJsZV9tb2R1bGVzLm11dGV4KSkgewoJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9D SEFOTkVMX0xPRywgU1dJVENIX0xPR19XQVJOSU5HLCAiTW9kdWxlICVzIEFscmVhZHkgTG9hZGVk IVxuIiwgZmlsZSk7CgkJKmVyciA9ICJNb2R1bGUgYWxyZWFkeSBsb2FkZWQiOwoJCXN0YXR1cyA9 IFNXSVRDSF9TVEFUVVNfRkFMU0U7Cgl9IGVsc2UgaWYgKChzdGF0dXMgPSBzd2l0Y2hfbG9hZGFi bGVfbW9kdWxlX2xvYWRfZmlsZShwYXRoLCBmaWxlLCBnbG9iYWwsICZuZXdfbW9kdWxlKSkgPT0g U1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJaWYgKChzdGF0dXMgPSBzd2l0Y2hfbG9hZGFibGVf bW9kdWxlX3Byb2Nlc3MoZmlsZSwgbmV3X21vZHVsZSkpID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VT UyAmJiBydW50aW1lKSB7CgkJCWlmIChuZXdfbW9kdWxlLT5zd2l0Y2hfbW9kdWxlX3J1bnRpbWUp IHsKCQkJCW5ld19tb2R1bGUtPnRocmVhZCA9IHN3aXRjaF9jb3JlX2xhdW5jaF90aHJlYWQoc3dp dGNoX2xvYWRhYmxlX21vZHVsZV9leGVjLCBuZXdfbW9kdWxlLCBuZXdfbW9kdWxlLT5wb29sKTsK CQkJfQoJCX0gZWxzZSBpZiAoc3RhdHVzICE9IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkq ZXJyID0gIm1vZHVsZSBsb2FkIHJvdXRpbmUgcmV0dXJuZWQgYW4gZXJyb3IiOwoJCX0KCX0gZWxz ZSB7CgkJKmVyciA9ICJtb2R1bGUgbG9hZCBmaWxlIHJvdXRpbmUgcmV0dXJuZWQgYW4gZXJyb3Ii OwoJfQoKCglyZXR1cm4gc3RhdHVzOwoKfQoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3N0YXR1c190 KSBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX2V4aXN0cyhjb25zdCBjaGFyICptb2QpCnsKCXN3aXRj aF9zdGF0dXNfdCBzdGF0dXM7CgoJaWYgKHpzdHIobW9kKSkgewoJCXJldHVybiBTV0lUQ0hfU1RB VFVTX0ZBTFNFOwoJfQoKCXN3aXRjaF9tdXRleF9sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0ZXgp OwoJaWYgKHN3aXRjaF9jb3JlX2hhc2hfZmluZChsb2FkYWJsZV9tb2R1bGVzLm1vZHVsZV9oYXNo LCBtb2QpKSB7CgkJc3RhdHVzID0gU1dJVENIX1NUQVRVU19TVUNDRVNTOwoJfSBlbHNlIHsKCQlz dGF0dXMgPSBTV0lUQ0hfU1RBVFVTX0ZBTFNFOwoJfQoJc3dpdGNoX211dGV4X3VubG9jayhsb2Fk YWJsZV9tb2R1bGVzLm11dGV4KTsKCglyZXR1cm4gc3RhdHVzOwp9CgpTV0lUQ0hfREVDTEFSRShz d2l0Y2hfc3RhdHVzX3QpIHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfdW5sb2FkX21vZHVsZShjaGFy ICpkaXIsIGNoYXIgKmZuYW1lLCBzd2l0Y2hfYm9vbF90IGZvcmNlLCBjb25zdCBjaGFyICoqZXJy KQp7Cglzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3QgKm1vZHVsZSA9IE5VTEw7Cglzd2l0Y2hfc3Rh dHVzX3Qgc3RhdHVzID0gU1dJVENIX1NUQVRVU19TVUNDRVNTOwoKCWlmIChmb3JjZSkgewoJCXN3 aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19XQVJOSU5HLCAi U3BpbiB0aGUgYmFycmVsIGFuZCBwdWxsIHRoZSB0cmlnZ2VyLi4uLi4uLiFcbiIpOwoJfQoKCXN3 aXRjaF9tdXRleF9sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0ZXgpOwoJaWYgKChtb2R1bGUgPSBz d2l0Y2hfY29yZV9oYXNoX2ZpbmQobG9hZGFibGVfbW9kdWxlcy5tb2R1bGVfaGFzaCwgZm5hbWUp KSkgewoJCWlmIChtb2R1bGUtPnBlcm0pIHsKCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NI QU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NSSVQsICJNb2R1bGUgaXMgbm90IHVubG9hZGFibGUuXG4i KTsKCQkJKmVyciA9ICJNb2R1bGUgaXMgbm90IHVubG9hZGFibGUiOwoJCQlzdGF0dXMgPSBTV0lU Q0hfU1RBVFVTX05PVU5MT0FEOwoJCQlnb3RvIHVubG9jazsKCQl9IGVsc2UgewoJCQkvKiBQcmV2 ZW50IGFueXRoaW5nIGZyb20gdXNpbmcgdGhlIG1vZHVsZSB3aGlsZSBpdCdzIHNodXR0aW5nIGRv d24gKi8KCQkJc3dpdGNoX2NvcmVfaGFzaF9kZWxldGUobG9hZGFibGVfbW9kdWxlcy5tb2R1bGVf aGFzaCwgZm5hbWUpOwoJCQlzd2l0Y2hfbXV0ZXhfdW5sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0 ZXgpOwoJCQlpZiAoKHN0YXR1cyA9IGRvX3NodXRkb3duKG1vZHVsZSwgU1dJVENIX1RSVUUsIFNX SVRDSF9UUlVFLCAhZm9yY2UsIGVycikpICE9IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCQkJ LyogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdGhlIG1vZHVsZSdzIHNodXRkb3duIGZ1bmN0aW9u LCBhZGQgaXQgYWdhaW4gKi8KCQkJCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0X2xvY2tlZChsb2Fk YWJsZV9tb2R1bGVzLm1vZHVsZV9oYXNoLCBmbmFtZSwgbW9kdWxlLCBsb2FkYWJsZV9tb2R1bGVz Lm11dGV4KTsKCQkJfQoJCQlnb3RvIGVuZDsKCQl9Cgl9IGVsc2UgewoJCSplcnIgPSAiTm8gc3Vj aCBtb2R1bGUhIjsKCQlzdGF0dXMgPSBTV0lUQ0hfU1RBVFVTX0ZBTFNFOwoJfQp1bmxvY2s6Cglz d2l0Y2hfbXV0ZXhfdW5sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0ZXgpOwogIGVuZDoKCWlmIChm b3JjZSkgewoJCXN3aXRjaF95aWVsZCgxMDAwMDAwKTsKCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lU Q0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfV0FSTklORywgIlBIRVchXG4iKTsKCX0KCglyZXR1 cm4gc3RhdHVzOwoKfQoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3N0YXR1c190KSBzd2l0Y2hfbG9h ZGFibGVfbW9kdWxlX2VudW1lcmF0ZV9hdmFpbGFibGUoY29uc3QgY2hhciAqZGlyX3BhdGgsIHN3 aXRjaF9tb2R1bGVuYW1lX2NhbGxiYWNrX2Z1bmNfdCBjYWxsYmFjaywgdm9pZCAqdXNlcl9kYXRh KQp7Cglzd2l0Y2hfZGlyX3QgKmRpciA9IE5VTEw7Cglzd2l0Y2hfc3RhdHVzX3Qgc3RhdHVzOwoJ Y2hhciBidWZmZXJbMjU2XTsKCWNvbnN0IGNoYXIgKmZuYW1lOwoJY29uc3QgY2hhciAqZm5hbWVf ZXh0OwoJY2hhciAqZm5hbWVfYmFzZTsKCiNpZmRlZiBXSU4zMgoJY29uc3QgY2hhciAqZXh0ID0g Ii5kbGwiOwojZWxzZQoJY29uc3QgY2hhciAqZXh0ID0gIi5zbyI7CiNlbmRpZgoKCWlmICgoc3Rh dHVzID0gc3dpdGNoX2Rpcl9vcGVuKCZkaXIsIGRpcl9wYXRoLCBsb2FkYWJsZV9tb2R1bGVzLnBv b2wpKSAhPSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQlyZXR1cm4gc3RhdHVzOwoJfQoKCXdo aWxlKChmbmFtZSA9IHN3aXRjaF9kaXJfbmV4dF9maWxlKGRpciwgYnVmZmVyLCBzaXplb2YoYnVm ZmVyKSkpKSB7CgkJaWYgKChmbmFtZV9leHQgPSBzdHJyY2hyKGZuYW1lLCAnLicpKSkgewoJCQlp ZiAoIXN0cmNtcChmbmFtZV9leHQsIGV4dCkpIHsKCQkJCWlmICghKGZuYW1lX2Jhc2UgPSBzd2l0 Y2hfbXByaW50ZigiJS4qcyIsIChpbnQpKGZuYW1lX2V4dC1mbmFtZSksIGZuYW1lKSkpIHsKCQkJ CQlzdGF0dXMgPSBTV0lUQ0hfU1RBVFVTX0dFTkVSUjsKCQkJCQlnb3RvIGVuZDsKCQkJCX0KCQkJ CWNhbGxiYWNrKHVzZXJfZGF0YSwgZm5hbWVfYmFzZSk7CgkJCQlzd2l0Y2hfc2FmZV9mcmVlKGZu YW1lX2Jhc2UpCgkJCX0KCQl9Cgl9CgoKICBlbmQ6Cglzd2l0Y2hfZGlyX2Nsb3NlKGRpcik7Cgly ZXR1cm4gc3RhdHVzOwp9CgpTV0lUQ0hfREVDTEFSRShzd2l0Y2hfc3RhdHVzX3QpIHN3aXRjaF9s b2FkYWJsZV9tb2R1bGVfZW51bWVyYXRlX2xvYWRlZChzd2l0Y2hfbW9kdWxlbmFtZV9jYWxsYmFj a19mdW5jX3QgY2FsbGJhY2ssIHZvaWQgKnVzZXJfZGF0YSkKewoJc3dpdGNoX2hhc2hfaW5kZXhf dCAqaGk7Cgl2b2lkICp2YWw7Cglzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3QgKm1vZHVsZTsKCglz d2l0Y2hfbXV0ZXhfbG9jayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKCWZvciAoaGkgPSBzd2l0 Y2hfY29yZV9oYXNoX2ZpcnN0KGxvYWRhYmxlX21vZHVsZXMubW9kdWxlX2hhc2gpOyBoaTsgaGkg PSBzd2l0Y2hfY29yZV9oYXNoX25leHQoJmhpKSkgewoJCXN3aXRjaF9jb3JlX2hhc2hfdGhpcyho aSwgTlVMTCwgTlVMTCwgJnZhbCk7CgkJbW9kdWxlID0gKHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVf dCAqKSB2YWw7CgoJCWNhbGxiYWNrKHVzZXJfZGF0YSwgbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNl LT5tb2R1bGVfbmFtZSk7Cgl9Cglzd2l0Y2hfbXV0ZXhfdW5sb2NrKGxvYWRhYmxlX21vZHVsZXMu bXV0ZXgpOwoKCXJldHVybiBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1M7Cn0KClNXSVRDSF9ERUNMQVJF KHN3aXRjaF9zdGF0dXNfdCkgc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9idWlsZF9keW5hbWljKGNo YXIgKmZpbGVuYW1lLAoJCQkJCQkJCQkJCQkJCQkJCSBzd2l0Y2hfbW9kdWxlX2xvYWRfdCBzd2l0 Y2hfbW9kdWxlX2xvYWQsCgkJCQkJCQkJCQkJCQkJCQkJIHN3aXRjaF9tb2R1bGVfcnVudGltZV90 IHN3aXRjaF9tb2R1bGVfcnVudGltZSwKCQkJCQkJCQkJCQkJCQkJCQkgc3dpdGNoX21vZHVsZV9z aHV0ZG93bl90IHN3aXRjaF9tb2R1bGVfc2h1dGRvd24sIHN3aXRjaF9ib29sX3QgcnVudGltZSkK ewoJc3dpdGNoX2xvYWRhYmxlX21vZHVsZV90ICptb2R1bGUgPSBOVUxMOwoJc3dpdGNoX21vZHVs ZV9sb2FkX3QgbG9hZF9mdW5jX3B0ciA9IE5VTEw7CglpbnQgbG9hZGluZyA9IDE7Cgljb25zdCBj aGFyICplcnIgPSBOVUxMOwoJc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9pbnRlcmZhY2VfdCAqbW9k dWxlX2ludGVyZmFjZSA9IE5VTEw7Cglzd2l0Y2hfbWVtb3J5X3Bvb2xfdCAqcG9vbDsKCgoJaWYg KHN3aXRjaF9jb3JlX25ld19tZW1vcnlfcG9vbCgmcG9vbCkgIT0gU1dJVENIX1NUQVRVU19TVUND RVNTKSB7CgkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9H X0NSSVQsICJPSCBPSCBubyBwb29sXG4iKTsKCQlhYm9ydCgpOwoJfQoKCWlmICgobW9kdWxlID0g c3dpdGNoX2NvcmVfYWxsb2MocG9vbCwgc2l6ZW9mKHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfdCkp KSA9PSAwKSB7CgkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hf TE9HX0NPTlNPTEUsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwoJCWFib3J0KCk7Cgl9 CgoKCgl3aGlsZSAobG9hZGluZykgewoJCXN3aXRjaF9zdGF0dXNfdCBzdGF0dXM7CgkJbG9hZF9m dW5jX3B0ciA9IChzd2l0Y2hfbW9kdWxlX2xvYWRfdCkgc3dpdGNoX21vZHVsZV9sb2FkOwoKCQlp ZiAobG9hZF9mdW5jX3B0ciA9PSBOVUxMKSB7CgkJCWVyciA9ICJDYW5ub3QgTG9hZCI7CgkJCWJy ZWFrOwoJCX0KCgkJc3RhdHVzID0gbG9hZF9mdW5jX3B0cigmbW9kdWxlX2ludGVyZmFjZSwgcG9v bCk7CgoJCWlmIChzdGF0dXMgIT0gU1dJVENIX1NUQVRVU19TVUNDRVNTICYmIHN0YXR1cyAhPSBT V0lUQ0hfU1RBVFVTX05PVU5MT0FEKSB7CgkJCWVyciA9ICJNb2R1bGUgbG9hZCByb3V0aW5lIHJl dHVybmVkIGFuIGVycm9yIjsKCQkJbW9kdWxlX2ludGVyZmFjZSA9IE5VTEw7CgkJCWJyZWFrOwoJ CX0KCgkJaWYgKChtb2R1bGUgPSBzd2l0Y2hfY29yZV9hbGxvYyhwb29sLCBzaXplb2Yoc3dpdGNo X2xvYWRhYmxlX21vZHVsZV90KSkpID09IDApIHsKCQkJZXJyID0gIkNvdWxkIG5vdCBhbGxvY2F0 ZSBtZW1vcnlcbiI7CgkJCWFib3J0KCk7CgkJfQoKCQlpZiAoc3RhdHVzID09IFNXSVRDSF9TVEFU VVNfTk9VTkxPQUQpIHsKCQkJbW9kdWxlLT5wZXJtKys7CgkJfQoKCQlsb2FkaW5nID0gMDsKCX0K CglpZiAoZXJyKSB7CgkJc3dpdGNoX2NvcmVfZGVzdHJveV9tZW1vcnlfcG9vbCgmcG9vbCk7CgkJ c3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NPTlNPTEUs ICJFcnJvciBMb2FkaW5nIG1vZHVsZSAlc1xuKiolcyoqXG4iLCBmaWxlbmFtZSwgZXJyKTsKCQly ZXR1cm4gU1dJVENIX1NUQVRVU19HRU5FUlI7Cgl9CgoJbW9kdWxlLT5wb29sID0gcG9vbDsKCW1v ZHVsZS0+ZmlsZW5hbWUgPSBzd2l0Y2hfY29yZV9zdHJkdXAobW9kdWxlLT5wb29sLCBmaWxlbmFt ZSk7Cgltb2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UgPSBtb2R1bGVfaW50ZXJmYWNlOwoJbW9kdWxl LT5zd2l0Y2hfbW9kdWxlX2xvYWQgPSBsb2FkX2Z1bmNfcHRyOwoKCWlmIChzd2l0Y2hfbW9kdWxl X3NodXRkb3duKSB7CgkJbW9kdWxlLT5zd2l0Y2hfbW9kdWxlX3NodXRkb3duID0gc3dpdGNoX21v ZHVsZV9zaHV0ZG93bjsKCX0KCWlmIChzd2l0Y2hfbW9kdWxlX3J1bnRpbWUpIHsKCQltb2R1bGUt PnN3aXRjaF9tb2R1bGVfcnVudGltZSA9IHN3aXRjaF9tb2R1bGVfcnVudGltZTsKCX0KCWlmIChy dW50aW1lICYmIG1vZHVsZS0+c3dpdGNoX21vZHVsZV9ydW50aW1lKSB7CgkJbW9kdWxlLT50aHJl YWQgPSBzd2l0Y2hfY29yZV9sYXVuY2hfdGhyZWFkKHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfZXhl YywgbW9kdWxlLCBtb2R1bGUtPnBvb2wpOwoJfQoJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NI QU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NPTlNPTEUsICJTdWNjZXNzZnVsbHkgTG9hZGVkIFslc11c biIsIG1vZHVsZV9pbnRlcmZhY2UtPm1vZHVsZV9uYW1lKTsKCXJldHVybiBzd2l0Y2hfbG9hZGFi bGVfbW9kdWxlX3Byb2Nlc3MoKGNoYXIgKikgbW9kdWxlLT5maWxlbmFtZSwgbW9kdWxlKTsKfQoK I2lmZGVmIFdJTjMyCnN0YXRpYyB2b2lkIHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfcGF0aF9pbml0 KCkKewoJY2hhciAqcGF0aCA9IE5VTEwsICp3b3JraW5nID0gTlVMTDsKCWFwcl9kaXJfdCAqcGVy bF9kaXJfaGFuZGxlID0gTlVMTDsKCglhcHJfZW52X2dldCgmcGF0aCwgInBhdGgiLCBsb2FkYWJs ZV9tb2R1bGVzLnBvb2wpOwoJYXByX2ZpbGVwYXRoX2dldCgmd29ya2luZywgQVBSX0ZJTEVQQVRI X05BVElWRSwgbG9hZGFibGVfbW9kdWxlcy5wb29sKTsKCglpZiAoYXByX2Rpcl9vcGVuKCZwZXJs X2Rpcl9oYW5kbGUsICIuXFxwZXJsIiwgbG9hZGFibGVfbW9kdWxlcy5wb29sKSA9PSBBUFJfU1VD Q0VTUykgewoJCWFwcl9kaXJfY2xvc2UocGVybF9kaXJfaGFuZGxlKTsKCQlhcHJfZW52X3NldCgi cGF0aCIsIGFwcl9wc3RyY2F0KGxvYWRhYmxlX21vZHVsZXMucG9vbCwgcGF0aCwgIjsiLCB3b3Jr aW5nLCAiXFxwZXJsIiwgTlVMTCksIGxvYWRhYmxlX21vZHVsZXMucG9vbCk7Cgl9Cn0KI2VuZGlm CgpTV0lUQ0hfREVDTEFSRShzd2l0Y2hfc3RhdHVzX3QpIHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVf aW5pdChzd2l0Y2hfYm9vbF90IGF1dG9sb2FkKQp7CgoJYXByX2ZpbmZvX3QgZmluZm8gPSB7IDAg fTsKCWFwcl9kaXJfdCAqbW9kdWxlX2Rpcl9oYW5kbGUgPSBOVUxMOwoJYXByX2ludDMyX3QgZmlu Zm9fZmxhZ3MgPSBBUFJfRklORk9fRElSRU5UIHwgQVBSX0ZJTkZPX1RZUEUgfCBBUFJfRklORk9f TkFNRTsKCWNoYXIgKmNmID0gIm1vZHVsZXMuY29uZiI7CgljaGFyICpwY2YgPSAicG9zdF9sb2Fk X21vZHVsZXMuY29uZiI7Cglzd2l0Y2hfeG1sX3QgY2ZnLCB4bWw7Cgl1bnNpZ25lZCBjaGFyIGFs bCA9IDA7Cgl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwoJY29uc3QgY2hhciAqZXJyOwoKCiNpZmRl ZiBXSU4zMgoJY29uc3QgY2hhciAqZXh0ID0gIi5kbGwiOwoJY29uc3QgY2hhciAqRVhUID0gIi5E TEwiOwojZWxpZiBkZWZpbmVkIChNQUNPU1gpIHx8IGRlZmluZWQgKERBUldJTikKCWNvbnN0IGNo YXIgKmV4dCA9ICIuZHlsaWIiOwoJY29uc3QgY2hhciAqRVhUID0gIi5EWUxJQiI7CiNlbHNlCglj b25zdCBjaGFyICpleHQgPSAiLnNvIjsKCWNvbnN0IGNoYXIgKkVYVCA9ICIuU08iOwojZW5kaWYK CgltZW1zZXQoJmxvYWRhYmxlX21vZHVsZXMsIDAsIHNpemVvZihsb2FkYWJsZV9tb2R1bGVzKSk7 Cglzd2l0Y2hfY29yZV9uZXdfbWVtb3J5X3Bvb2woJmxvYWRhYmxlX21vZHVsZXMucG9vbCk7CgoK I2lmZGVmIFdJTjMyCglzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3BhdGhfaW5pdCgpOwojZW5kaWYK Cglzd2l0Y2hfY29yZV9oYXNoX2luaXQoJmxvYWRhYmxlX21vZHVsZXMubW9kdWxlX2hhc2gpOwoJ c3dpdGNoX2NvcmVfaGFzaF9pbml0X25vY2FzZSgmbG9hZGFibGVfbW9kdWxlcy5lbmRwb2ludF9o YXNoKTsKCXN3aXRjaF9jb3JlX2hhc2hfaW5pdF9ub2Nhc2UoJmxvYWRhYmxlX21vZHVsZXMuY29k ZWNfaGFzaCk7Cglzd2l0Y2hfY29yZV9oYXNoX2luaXRfbm9jYXNlKCZsb2FkYWJsZV9tb2R1bGVz LnRpbWVyX2hhc2gpOwoJc3dpdGNoX2NvcmVfaGFzaF9pbml0X25vY2FzZSgmbG9hZGFibGVfbW9k dWxlcy5hcHBsaWNhdGlvbl9oYXNoKTsKCXN3aXRjaF9jb3JlX2hhc2hfaW5pdF9ub2Nhc2UoJmxv YWRhYmxlX21vZHVsZXMuY2hhdF9hcHBsaWNhdGlvbl9oYXNoKTsKCXN3aXRjaF9jb3JlX2hhc2hf aW5pdF9ub2Nhc2UoJmxvYWRhYmxlX21vZHVsZXMuYXBpX2hhc2gpOwoJc3dpdGNoX2NvcmVfaGFz aF9pbml0X25vY2FzZSgmbG9hZGFibGVfbW9kdWxlcy5qc29uX2FwaV9oYXNoKTsKCXN3aXRjaF9j b3JlX2hhc2hfaW5pdCgmbG9hZGFibGVfbW9kdWxlcy5maWxlX2hhc2gpOwoJc3dpdGNoX2NvcmVf aGFzaF9pbml0X25vY2FzZSgmbG9hZGFibGVfbW9kdWxlcy5zcGVlY2hfaGFzaCk7Cglzd2l0Y2hf Y29yZV9oYXNoX2luaXRfbm9jYXNlKCZsb2FkYWJsZV9tb2R1bGVzLmFzcl9oYXNoKTsKCXN3aXRj aF9jb3JlX2hhc2hfaW5pdF9ub2Nhc2UoJmxvYWRhYmxlX21vZHVsZXMuZGlyZWN0b3J5X2hhc2gp OwoJc3dpdGNoX2NvcmVfaGFzaF9pbml0X25vY2FzZSgmbG9hZGFibGVfbW9kdWxlcy5jaGF0X2hh c2gpOwoJc3dpdGNoX2NvcmVfaGFzaF9pbml0X25vY2FzZSgmbG9hZGFibGVfbW9kdWxlcy5zYXlf aGFzaCk7Cglzd2l0Y2hfY29yZV9oYXNoX2luaXRfbm9jYXNlKCZsb2FkYWJsZV9tb2R1bGVzLm1h bmFnZW1lbnRfaGFzaCk7Cglzd2l0Y2hfY29yZV9oYXNoX2luaXRfbm9jYXNlKCZsb2FkYWJsZV9t b2R1bGVzLmxpbWl0X2hhc2gpOwoJc3dpdGNoX2NvcmVfaGFzaF9pbml0X25vY2FzZSgmbG9hZGFi bGVfbW9kdWxlcy5kaWFscGxhbl9oYXNoKTsKCXN3aXRjaF9jb3JlX2hhc2hfaW5pdCgmbG9hZGFi bGVfbW9kdWxlcy5zZWNvbmRhcnlfcmVjb3Zlcl9oYXNoKTsKCXN3aXRjaF9tdXRleF9pbml0KCZs b2FkYWJsZV9tb2R1bGVzLm11dGV4LCBTV0lUQ0hfTVVURVhfTkVTVEVELCBsb2FkYWJsZV9tb2R1 bGVzLnBvb2wpOwoKCWlmICghYXV0b2xvYWQpIHJldHVybiBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1M7 CgoJc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9sb2FkX21vZHVsZSgiIiwgIkNPUkVfU09GVFRJTUVS X01PRFVMRSIsIFNXSVRDSF9GQUxTRSwgJmVycik7Cglzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX2xv YWRfbW9kdWxlKCIiLCAiQ09SRV9QQ01fTU9EVUxFIiwgU1dJVENIX0ZBTFNFLCAmZXJyKTsKCXN3 aXRjaF9sb2FkYWJsZV9tb2R1bGVfbG9hZF9tb2R1bGUoIiIsICJDT1JFX1NQRUVYX01PRFVMRSIs IFNXSVRDSF9GQUxTRSwgJmVycik7CiNpZmRlZiBTV0lUQ0hfSEFWRV9ZVVYKI2lmZGVmIFNXSVRD SF9IQVZFX1ZQWAoJc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9sb2FkX21vZHVsZSgiIiwgIkNPUkVf VlBYX01PRFVMRSIsIFNXSVRDSF9GQUxTRSwgJmVycik7CiNlbmRpZgojZW5kaWYKCglpZiAoKHht bCA9IHN3aXRjaF94bWxfb3Blbl9jZmcoY2YsICZjZmcsIE5VTEwpKSkgewoJCXN3aXRjaF94bWxf dCBtb2RzLCBsZDsKCQlpZiAoKG1vZHMgPSBzd2l0Y2hfeG1sX2NoaWxkKGNmZywgIm1vZHVsZXMi KSkpIHsKCQkJZm9yIChsZCA9IHN3aXRjaF94bWxfY2hpbGQobW9kcywgImxvYWQiKTsgbGQ7IGxk ID0gbGQtPm5leHQpIHsKCQkJCXN3aXRjaF9ib29sX3QgZ2xvYmFsID0gU1dJVENIX0ZBTFNFOwoJ CQkJY29uc3QgY2hhciAqdmFsID0gc3dpdGNoX3htbF9hdHRyX3NvZnQobGQsICJtb2R1bGUiKTsK CQkJCWNvbnN0IGNoYXIgKnBhdGggPSBzd2l0Y2hfeG1sX2F0dHJfc29mdChsZCwgInBhdGgiKTsK CQkJCWNvbnN0IGNoYXIgKmNyaXRpY2FsID0gc3dpdGNoX3htbF9hdHRyX3NvZnQobGQsICJjcml0 aWNhbCIpOwoJCQkJY29uc3QgY2hhciAqc2dsb2JhbCA9IHN3aXRjaF94bWxfYXR0cl9zb2Z0KGxk LCAiZ2xvYmFsIik7CgkJCQlpZiAoenN0cih2YWwpIHx8IChzdHJjaHIodmFsLCAnLicpICYmICFz dHJzdHIodmFsLCBleHQpICYmICFzdHJzdHIodmFsLCBFWFQpKSkgewoJCQkJCXN3aXRjaF9sb2df cHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19DT05TT0xFLCAiSW52YWxpZCBl eHRlbnNpb24gZm9yICVzXG4iLCB2YWwpOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJZ2xvYmFs ID0gc3dpdGNoX3RydWUoc2dsb2JhbCk7CgoJCQkJaWYgKHBhdGggJiYgenN0cihwYXRoKSkgewoJ CQkJCXBhdGggPSBTV0lUQ0hfR0xPQkFMX2RpcnMubW9kX2RpcjsKCQkJCX0KCQkJCWlmIChzd2l0 Y2hfbG9hZGFibGVfbW9kdWxlX2xvYWRfbW9kdWxlX2V4KChjaGFyICopIHBhdGgsIChjaGFyICop IHZhbCwgU1dJVENIX0ZBTFNFLCBnbG9iYWwsICZlcnIpID09IFNXSVRDSF9TVEFUVVNfR0VORVJS KSB7CgkJCQkJaWYgKGNyaXRpY2FsICYmIHN3aXRjaF90cnVlKGNyaXRpY2FsKSkgewoJCQkJCQlz d2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwgIkZh aWxlZCB0byBsb2FkIGNyaXRpY2FsIG1vZHVsZSAnJXMnLCBhYm9ydCgpXG4iLCB2YWwpOwoJCQkJ CQlhYm9ydCgpOwoJCQkJCX0KCQkJCX0KCQkJCWNvdW50Kys7CgkJCX0KCQl9CgkJc3dpdGNoX3ht bF9mcmVlKHhtbCk7CgoJfSBlbHNlIHsKCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5F TF9MT0csIFNXSVRDSF9MT0dfQ09OU09MRSwgIm9wZW4gb2YgJXMgZmFpbGVkXG4iLCBjZik7Cgl9 CgoJaWYgKCh4bWwgPSBzd2l0Y2hfeG1sX29wZW5fY2ZnKHBjZiwgJmNmZywgTlVMTCkpKSB7CgkJ c3dpdGNoX3htbF90IG1vZHMsIGxkOwoKCQlpZiAoKG1vZHMgPSBzd2l0Y2hfeG1sX2NoaWxkKGNm ZywgIm1vZHVsZXMiKSkpIHsKCQkJZm9yIChsZCA9IHN3aXRjaF94bWxfY2hpbGQobW9kcywgImxv YWQiKTsgbGQ7IGxkID0gbGQtPm5leHQpIHsKCQkJCXN3aXRjaF9ib29sX3QgZ2xvYmFsID0gU1dJ VENIX0ZBTFNFOwoJCQkJY29uc3QgY2hhciAqdmFsID0gc3dpdGNoX3htbF9hdHRyX3NvZnQobGQs ICJtb2R1bGUiKTsKCQkJCWNvbnN0IGNoYXIgKnBhdGggPSBzd2l0Y2hfeG1sX2F0dHJfc29mdChs ZCwgInBhdGgiKTsKCQkJCWNvbnN0IGNoYXIgKnNnbG9iYWwgPSBzd2l0Y2hfeG1sX2F0dHJfc29m dChsZCwgImdsb2JhbCIpOwoJCQkJaWYgKHpzdHIodmFsKSB8fCAoc3RyY2hyKHZhbCwgJy4nKSAm JiAhc3Ryc3RyKHZhbCwgZXh0KSAmJiAhc3Ryc3RyKHZhbCwgRVhUKSkpIHsKCQkJCQlzd2l0Y2hf bG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ09OU09MRSwgIkludmFs aWQgZXh0ZW5zaW9uIGZvciAlc1xuIiwgdmFsKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWds b2JhbCA9IHN3aXRjaF90cnVlKHNnbG9iYWwpOwoKCQkJCWlmIChwYXRoICYmIHpzdHIocGF0aCkp IHsKCQkJCQlwYXRoID0gU1dJVENIX0dMT0JBTF9kaXJzLm1vZF9kaXI7CgkJCQl9CgkJCQlzd2l0 Y2hfbG9hZGFibGVfbW9kdWxlX2xvYWRfbW9kdWxlX2V4KChjaGFyICopIHBhdGgsIChjaGFyICop IHZhbCwgU1dJVENIX0ZBTFNFLCBnbG9iYWwsICZlcnIpOwoJCQkJY291bnQrKzsKCQkJfQoJCX0K CQlzd2l0Y2hfeG1sX2ZyZWUoeG1sKTsKCgl9IGVsc2UgewoJCXN3aXRjaF9sb2dfcHJpbnRmKFNX SVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19DT05TT0xFLCAib3BlbiBvZiAlcyBmYWlsZWRc biIsIHBjZik7Cgl9CgoJaWYgKCFjb3VudCkgewoJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9D SEFOTkVMX0xPRywgU1dJVENIX0xPR19DT05TT0xFLCAiTm8gbW9kdWxlcyBsb2FkZWQsIGFzc3Vt aW5nICdsb2FkIGFsbCdcbiIpOwoJCWFsbCA9IDE7Cgl9CgoJaWYgKGFsbCkgewoJCWlmIChhcHJf ZGlyX29wZW4oJm1vZHVsZV9kaXJfaGFuZGxlLCBTV0lUQ0hfR0xPQkFMX2RpcnMubW9kX2Rpciwg bG9hZGFibGVfbW9kdWxlcy5wb29sKSAhPSBBUFJfU1VDQ0VTUykgewoJCQlzd2l0Y2hfbG9nX3By aW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ09OU09MRSwgIkNhbid0IG9wZW4g ZGlyZWN0b3J5OiAlc1xuIiwgU1dJVENIX0dMT0JBTF9kaXJzLm1vZF9kaXIpOwoJCQlyZXR1cm4g U1dJVENIX1NUQVRVU19HRU5FUlI7CgkJfQoKCQl3aGlsZSAoYXByX2Rpcl9yZWFkKCZmaW5mbywg ZmluZm9fZmxhZ3MsIG1vZHVsZV9kaXJfaGFuZGxlKSA9PSBBUFJfU1VDQ0VTUykgewoJCQljb25z dCBjaGFyICpmbmFtZSA9IGZpbmZvLmZuYW1lOwoKCQkJaWYgKGZpbmZvLmZpbGV0eXBlICE9IEFQ Ul9SRUcpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoIWZuYW1lKSB7CgkJCQlmbmFtZSA9 IGZpbmZvLm5hbWU7CgkJCX0KCgkJCWlmICghZm5hbWUpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJ CQlpZiAoenN0cihmbmFtZSkgfHwgKCFzdHJzdHIoZm5hbWUsIGV4dCkgJiYgIXN0cnN0cihmbmFt ZSwgRVhUKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzd2l0Y2hfbG9hZGFibGVfbW9kdWxl X2xvYWRfbW9kdWxlKChjaGFyICopIFNXSVRDSF9HTE9CQUxfZGlycy5tb2RfZGlyLCAoY2hhciAq KSBmbmFtZSwgU1dJVENIX0ZBTFNFLCAmZXJyKTsKCQl9CgkJYXByX2Rpcl9jbG9zZShtb2R1bGVf ZGlyX2hhbmRsZSk7Cgl9CgoJc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9ydW50aW1lKCk7CgoJbWVt c2V0KCZjaGF0X2dsb2JhbHMsIDAsIHNpemVvZihjaGF0X2dsb2JhbHMpKTsKCWNoYXRfZ2xvYmFs cy5ydW5uaW5nID0gMTsKCWNoYXRfZ2xvYmFscy5wb29sID0gbG9hZGFibGVfbW9kdWxlcy5wb29s OwoJc3dpdGNoX211dGV4X2luaXQoJmNoYXRfZ2xvYmFscy5tdXRleCwgU1dJVENIX01VVEVYX05F U1RFRCwgY2hhdF9nbG9iYWxzLnBvb2wpOwoKCWNoYXRfdGhyZWFkX3N0YXJ0KDEpOwoKCXJldHVy biBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1M7Cn0KCnN0YXRpYyBzd2l0Y2hfc3RhdHVzX3QgZG9fc2h1 dGRvd24oc3dpdGNoX2xvYWRhYmxlX21vZHVsZV90ICptb2R1bGUsIHN3aXRjaF9ib29sX3Qgc2h1 dGRvd24sIHN3aXRjaF9ib29sX3QgdW5sb2FkLCBzd2l0Y2hfYm9vbF90IGZhaWxfaWZfYnVzeSwK CQkJCQkJCQkgICBjb25zdCBjaGFyICoqZXJyKQp7CglpbnQzMl90IGZsYWdzID0gc3dpdGNoX2Nv cmVfZmxhZ3MoKTsKCXN3aXRjaF9hc3NlcnQobW9kdWxlICE9IE5VTEwpOwoKCWlmIChmYWlsX2lm X2J1c3kgJiYgbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5yd2xvY2sgJiYgc3dpdGNoX3RocmVh ZF9yd2xvY2tfdHJ5d3Jsb2NrKG1vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+cndsb2NrKSAhPSBT V0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQlpZiAoZXJyKSB7CgkJCSplcnIgPSAiTW9kdWxlIGlu IHVzZS4iOwoJCX0KCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRD SF9MT0dfV0FSTklORywgIk1vZHVsZSAlcyBpcyBpbiB1c2UsIGNhbm5vdCB1bmxvYWQuXG4iLCBt b2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPm1vZHVsZV9uYW1lKTsKCQlyZXR1cm4gU1dJVENIX1NU QVRVU19GQUxTRTsKCX0KCgltb2R1bGUtPnNodXR0aW5nX2Rvd24gPSBTV0lUQ0hfVFJVRTsKCglp ZiAoc2h1dGRvd24pIHsKCQlzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3VucHJvY2Vzcyhtb2R1bGUp OwoJCWlmIChtb2R1bGUtPnN3aXRjaF9tb2R1bGVfc2h1dGRvd24pIHsKCQkJc3dpdGNoX2xvZ19w cmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NPTlNPTEUsICJTdG9wcGluZzog JXNcbiIsIG1vZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+bW9kdWxlX25hbWUpOwoJCQltb2R1bGUt PnN0YXR1cyA9IG1vZHVsZS0+c3dpdGNoX21vZHVsZV9zaHV0ZG93bigpOwoJCX0gZWxzZSB7CgkJ CXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19DT05TT0xF LCAiJXMgaGFzIG5vIHNodXRkb3duIHJvdXRpbmVcbiIsIG1vZHVsZS0+bW9kdWxlX2ludGVyZmFj ZS0+bW9kdWxlX25hbWUpOwoJCX0KCX0KCglpZiAoZmFpbF9pZl9idXN5ICYmIG1vZHVsZS0+bW9k dWxlX2ludGVyZmFjZS0+cndsb2NrKSB7CgkJc3dpdGNoX3RocmVhZF9yd2xvY2tfdW5sb2NrKG1v ZHVsZS0+bW9kdWxlX2ludGVyZmFjZS0+cndsb2NrKTsKCX0KCglpZiAodW5sb2FkICYmIG1vZHVs ZS0+c3RhdHVzICE9IFNXSVRDSF9TVEFUVVNfTk9VTkxPQUQgJiYgIShmbGFncyAmIFNDRl9WRykp IHsKCQlzd2l0Y2hfbWVtb3J5X3Bvb2xfdCAqcG9vbDsKCQlzd2l0Y2hfc3RhdHVzX3Qgc3Q7CgoJ CWlmIChtb2R1bGUtPnRocmVhZCkgewoJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5F TF9MT0csIFNXSVRDSF9MT0dfQ09OU09MRSwgIiVzIHN0b3BwaW5nIHJ1bnRpbWUgdGhyZWFkLlxu IiwgbW9kdWxlLT5tb2R1bGVfaW50ZXJmYWNlLT5tb2R1bGVfbmFtZSk7CgkJCXN3aXRjaF90aHJl YWRfam9pbigmc3QsIG1vZHVsZS0+dGhyZWFkKTsKCQl9CgoJCXN3aXRjaF9sb2dfcHJpbnRmKFNX SVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19DT05TT0xFLCAiJXMgdW5sb2FkZWQuXG4iLCBt b2R1bGUtPm1vZHVsZV9pbnRlcmZhY2UtPm1vZHVsZV9uYW1lKTsKCQlzd2l0Y2hfZHNvX2Rlc3Ry b3koJm1vZHVsZS0+bGliKTsKCQlpZiAoKHBvb2wgPSBtb2R1bGUtPnBvb2wpKSB7CgkJCW1vZHVs ZSA9IE5VTEw7CgkJCXN3aXRjaF9jb3JlX2Rlc3Ryb3lfbWVtb3J5X3Bvb2woJnBvb2wpOwoJCX0K CX0KCglyZXR1cm4gU1dJVENIX1NUQVRVU19TVUNDRVNTOwoKfQoKU1dJVENIX0RFQ0xBUkUodm9p ZCkgc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9zaHV0ZG93bih2b2lkKQp7Cglzd2l0Y2hfaGFzaF9p bmRleF90ICpoaTsKCXZvaWQgKnZhbDsKCXN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfdCAqbW9kdWxl OwoJaW50IGk7CgoJaWYgKCFsb2FkYWJsZV9tb2R1bGVzLm1vZHVsZV9oYXNoKSB7CgkJcmV0dXJu OwoJfQoKCWNoYXRfZ2xvYmFscy5ydW5uaW5nID0gMDsKCglmb3IgKGkgPSAwOyBpIDwgY2hhdF9n bG9iYWxzLm1zZ19xdWV1ZV9sZW47IGkrKykgewoJCXN3aXRjaF9xdWV1ZV9wdXNoKGNoYXRfZ2xv YmFscy5tc2dfcXVldWVbaV0sIE5VTEwpOwoJfQoKCWZvciAoaSA9IDA7IGkgPCBjaGF0X2dsb2Jh bHMubXNnX3F1ZXVlX2xlbjsgaSsrKSB7CgkJc3dpdGNoX3N0YXR1c190IHN0OwoJCXN3aXRjaF90 aHJlYWRfam9pbigmc3QsIGNoYXRfZ2xvYmFscy5tc2dfcXVldWVfdGhyZWFkW2ldKTsKCX0KCgoJ Zm9yIChoaSA9IHN3aXRjaF9jb3JlX2hhc2hfZmlyc3QobG9hZGFibGVfbW9kdWxlcy5tb2R1bGVf aGFzaCk7IGhpOyBoaSA9IHN3aXRjaF9jb3JlX2hhc2hfbmV4dCgmaGkpKSB7CgkJc3dpdGNoX2Nv cmVfaGFzaF90aGlzKGhpLCBOVUxMLCBOVUxMLCAmdmFsKTsKCQltb2R1bGUgPSAoc3dpdGNoX2xv YWRhYmxlX21vZHVsZV90ICopIHZhbDsKCQlpZiAoIW1vZHVsZS0+cGVybSkgewoJCQlkb19zaHV0 ZG93bihtb2R1bGUsIFNXSVRDSF9UUlVFLCBTV0lUQ0hfRkFMU0UsIFNXSVRDSF9GQUxTRSwgTlVM TCk7CgkJfQoJfQoKCXN3aXRjaF95aWVsZCgxMDAwMDAwKTsKCglmb3IgKGhpID0gc3dpdGNoX2Nv cmVfaGFzaF9maXJzdChsb2FkYWJsZV9tb2R1bGVzLm1vZHVsZV9oYXNoKTsgaGk7IGhpID0gc3dp dGNoX2NvcmVfaGFzaF9uZXh0KCZoaSkpIHsKCQlzd2l0Y2hfY29yZV9oYXNoX3RoaXMoaGksIE5V TEwsIE5VTEwsICZ2YWwpOwoJCW1vZHVsZSA9IChzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3QgKikg dmFsOwoJCWlmICghbW9kdWxlLT5wZXJtKSB7CgkJCWRvX3NodXRkb3duKG1vZHVsZSwgU1dJVENI X0ZBTFNFLCBTV0lUQ0hfVFJVRSwgU1dJVENIX0ZBTFNFLCBOVUxMKTsKCQl9Cgl9CgoJc3dpdGNo X2NvcmVfaGFzaF9kZXN0cm95KCZsb2FkYWJsZV9tb2R1bGVzLm1vZHVsZV9oYXNoKTsKCXN3aXRj aF9jb3JlX2hhc2hfZGVzdHJveSgmbG9hZGFibGVfbW9kdWxlcy5lbmRwb2ludF9oYXNoKTsKCXN3 aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmbG9hZGFibGVfbW9kdWxlcy5jb2RlY19oYXNoKTsKCXN3 aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmbG9hZGFibGVfbW9kdWxlcy50aW1lcl9oYXNoKTsKCXN3 aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmbG9hZGFibGVfbW9kdWxlcy5hcHBsaWNhdGlvbl9oYXNo KTsKCXN3aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmbG9hZGFibGVfbW9kdWxlcy5jaGF0X2FwcGxp Y2F0aW9uX2hhc2gpOwoJc3dpdGNoX2NvcmVfaGFzaF9kZXN0cm95KCZsb2FkYWJsZV9tb2R1bGVz LmFwaV9oYXNoKTsKCXN3aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmbG9hZGFibGVfbW9kdWxlcy5q c29uX2FwaV9oYXNoKTsKCXN3aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmbG9hZGFibGVfbW9kdWxl cy5maWxlX2hhc2gpOwoJc3dpdGNoX2NvcmVfaGFzaF9kZXN0cm95KCZsb2FkYWJsZV9tb2R1bGVz LnNwZWVjaF9oYXNoKTsKCXN3aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmbG9hZGFibGVfbW9kdWxl cy5hc3JfaGFzaCk7Cglzd2l0Y2hfY29yZV9oYXNoX2Rlc3Ryb3koJmxvYWRhYmxlX21vZHVsZXMu ZGlyZWN0b3J5X2hhc2gpOwoJc3dpdGNoX2NvcmVfaGFzaF9kZXN0cm95KCZsb2FkYWJsZV9tb2R1 bGVzLmNoYXRfaGFzaCk7Cglzd2l0Y2hfY29yZV9oYXNoX2Rlc3Ryb3koJmxvYWRhYmxlX21vZHVs ZXMuc2F5X2hhc2gpOwoJc3dpdGNoX2NvcmVfaGFzaF9kZXN0cm95KCZsb2FkYWJsZV9tb2R1bGVz Lm1hbmFnZW1lbnRfaGFzaCk7Cglzd2l0Y2hfY29yZV9oYXNoX2Rlc3Ryb3koJmxvYWRhYmxlX21v ZHVsZXMubGltaXRfaGFzaCk7Cglzd2l0Y2hfY29yZV9oYXNoX2Rlc3Ryb3koJmxvYWRhYmxlX21v ZHVsZXMuZGlhbHBsYW5faGFzaCk7CgoJc3dpdGNoX2NvcmVfZGVzdHJveV9tZW1vcnlfcG9vbCgm bG9hZGFibGVfbW9kdWxlcy5wb29sKTsKfQoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX2VuZHBvaW50 X2ludGVyZmFjZV90ICopIHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfZ2V0X2VuZHBvaW50X2ludGVy ZmFjZShjb25zdCBjaGFyICpuYW1lKQp7Cglzd2l0Y2hfZW5kcG9pbnRfaW50ZXJmYWNlX3QgKnB0 cjsKCglzd2l0Y2hfbXV0ZXhfbG9jayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKCXB0ciA9IHN3 aXRjaF9jb3JlX2hhc2hfZmluZChsb2FkYWJsZV9tb2R1bGVzLmVuZHBvaW50X2hhc2gsIG5hbWUp OwoJaWYgKHB0cikgewoJCVBST1RFQ1RfSU5URVJGQUNFKHB0cik7Cgl9Cglzd2l0Y2hfbXV0ZXhf dW5sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0ZXgpOwoKCglyZXR1cm4gcHRyOwp9CgpTV0lUQ0hf REVDTEFSRShzd2l0Y2hfZmlsZV9pbnRlcmZhY2VfdCAqKSBzd2l0Y2hfbG9hZGFibGVfbW9kdWxl X2dldF9maWxlX2ludGVyZmFjZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICptb2RuYW1l KQp7Cglzd2l0Y2hfZmlsZV9pbnRlcmZhY2VfdCAqaSA9IE5VTEw7Cglzd2l0Y2hfZmlsZV9ub2Rl X3QgKm5vZGUsICpoZWFkOwoKCXN3aXRjaF9tdXRleF9sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0 ZXgpOwoKCWlmICgoaGVhZCA9IHN3aXRjaF9jb3JlX2hhc2hfZmluZChsb2FkYWJsZV9tb2R1bGVz LmZpbGVfaGFzaCwgbmFtZSkpKSB7CgkJaWYgKG1vZG5hbWUpIHsKCQkJZm9yIChub2RlID0gaGVh ZDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKCQkJCWlmICghc3RyY2FzZWNtcChub2RlLT5p bnRlcmZhY2VfbmFtZSwgbW9kbmFtZSkpIHsKCQkJCQlpID0gKHN3aXRjaF9maWxlX2ludGVyZmFj ZV90ICopIG5vZGUtPnB0cjsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWkg PSAoc3dpdGNoX2ZpbGVfaW50ZXJmYWNlX3QgKikgaGVhZC0+cHRyOwoJCX0KCX0KCglzd2l0Y2hf bXV0ZXhfdW5sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0ZXgpOwoKCWlmIChpKSBQUk9URUNUX0lO VEVSRkFDRShpKTsKCglyZXR1cm4gaTsKfQoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX2NvZGVjX2lu dGVyZmFjZV90ICopIHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfZ2V0X2NvZGVjX2ludGVyZmFjZShj b25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICptb2RuYW1lKQp7Cglzd2l0Y2hfY29kZWNfaW50 ZXJmYWNlX3QgKmNvZGVjID0gTlVMTDsKCXN3aXRjaF9jb2RlY19ub2RlX3QgKm5vZGUsICpoZWFk OwoKCXN3aXRjaF9tdXRleF9sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0ZXgpOwoKCWlmICgoaGVh ZCA9IHN3aXRjaF9jb3JlX2hhc2hfZmluZChsb2FkYWJsZV9tb2R1bGVzLmNvZGVjX2hhc2gsIG5h bWUpKSkgewoJCWlmIChtb2RuYW1lKSB7CgkJCWZvciAobm9kZSA9IGhlYWQ7IG5vZGU7IG5vZGUg PSBub2RlLT5uZXh0KSB7CgkJCQlpZiAoIXN0cmNhc2VjbXAobm9kZS0+aW50ZXJmYWNlX25hbWUs IG1vZG5hbWUpKSB7CgkJCQkJY29kZWMgPSAoc3dpdGNoX2NvZGVjX2ludGVyZmFjZV90ICopIG5v ZGUtPnB0cjsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWNvZGVjID0gKHN3 aXRjaF9jb2RlY19pbnRlcmZhY2VfdCAqKSBoZWFkLT5wdHI7CgkJfQoJfQoKCXN3aXRjaF9tdXRl eF91bmxvY2sobG9hZGFibGVfbW9kdWxlcy5tdXRleCk7CgoJaWYgKGNvZGVjKSB7CgkJUFJPVEVD VF9JTlRFUkZBQ0UoY29kZWMpOwoJfQoKCXJldHVybiBjb2RlYzsKfQoKI2RlZmluZSBIQVNIX0ZV TkMoX2tpbmRfKSBTV0lUQ0hfREVDTEFSRShzd2l0Y2hfIyNfa2luZF8jI19pbnRlcmZhY2VfdCAq KSBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX2dldF8jI19raW5kXyMjX2ludGVyZmFjZShjb25zdCBj aGFyICpuYW1lKQlcCgl7CQkJCQkJCQkJCQkJCQkJCQlcCgkJc3dpdGNoXyMjX2tpbmRfIyNfaW50 ZXJmYWNlX3QgKmkgPSBOVUxMOwkJCQkJCQkJXAoJCWlmIChsb2FkYWJsZV9tb2R1bGVzLl9raW5k XyMjX2hhc2ggJiYgKGkgPSBzd2l0Y2hfY29yZV9oYXNoX2ZpbmRfbG9ja2VkKGxvYWRhYmxlX21v ZHVsZXMuX2tpbmRfIyNfaGFzaCwgbmFtZSwgbG9hZGFibGVfbW9kdWxlcy5tdXRleCkpKSB7CVwK CQkJUFJPVEVDVF9JTlRFUkZBQ0UoaSk7CQkJCQkJCQkJCVwKCQl9CQkJCQkJCQkJCQkJCQkJCVwK CQlyZXR1cm4gaTsJCQkJCQkJCQkJCQkJCVwKCX0KCkhBU0hfRlVOQyhkaWFscGxhbikKSEFTSF9G VU5DKHRpbWVyKQpIQVNIX0ZVTkMoYXBwbGljYXRpb24pCkhBU0hfRlVOQyhjaGF0X2FwcGxpY2F0 aW9uKQpIQVNIX0ZVTkMoYXBpKQpIQVNIX0ZVTkMoanNvbl9hcGkpCkhBU0hfRlVOQyhzcGVlY2gp CkhBU0hfRlVOQyhhc3IpCkhBU0hfRlVOQyhkaXJlY3RvcnkpCkhBU0hfRlVOQyhjaGF0KQpIQVNI X0ZVTkMobGltaXQpCgoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3NheV9pbnRlcmZhY2VfdCAqKSBz d2l0Y2hfbG9hZGFibGVfbW9kdWxlX2dldF9zYXlfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUp CnsKCXJldHVybiBzd2l0Y2hfY29yZV9oYXNoX2ZpbmRfbG9ja2VkKGxvYWRhYmxlX21vZHVsZXMu c2F5X2hhc2gsIG5hbWUsIGxvYWRhYmxlX21vZHVsZXMubXV0ZXgpOwp9CgpTV0lUQ0hfREVDTEFS RShzd2l0Y2hfbWFuYWdlbWVudF9pbnRlcmZhY2VfdCAqKSBzd2l0Y2hfbG9hZGFibGVfbW9kdWxl X2dldF9tYW5hZ2VtZW50X2ludGVyZmFjZShjb25zdCBjaGFyICpyZWxhdGl2ZV9vaWQpCnsKCXJl dHVybiBzd2l0Y2hfY29yZV9oYXNoX2ZpbmRfbG9ja2VkKGxvYWRhYmxlX21vZHVsZXMubWFuYWdl bWVudF9oYXNoLCByZWxhdGl2ZV9vaWQsIGxvYWRhYmxlX21vZHVsZXMubXV0ZXgpOwp9CgojaWZk ZWYgREVCVUdfQ09ERUNfU09SVElORwpzdGF0aWMgdm9pZCBkb19wcmludChjb25zdCBzd2l0Y2hf Y29kZWNfaW1wbGVtZW50YXRpb25fdCAqKmFycmF5LCBpbnQgYXJyYXlsZW4pCnsKCWludCBpOwoK CWZvcihpID0gMDsgaSA8IGFycmF5bGVuOyBpKyspIHsKCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lU Q0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfRVJST1IsCgkJCQkJCSAgIkRFQlVHICVkICVzOiVk ICVkXG4iLCBpLCBhcnJheVtpXS0+aWFuYW5hbWUsIGFycmF5W2ldLT5pYW5hY29kZSwgYXJyYXlb aV0tPm1pY3Jvc2Vjb25kc19wZXJfcGFja2V0IC8gMTAwMCk7Cgl9Cgp9CiNlbmRpZgoKLyogaGVs cGVyIG9ubHkgLS0gYm91bmRzIGNoZWNraW5nIGVuZm9yY2VkIGJ5IGNhbGxlciAqLwpzdGF0aWMg dm9pZCBkb19zd2FwKGNvbnN0IHN3aXRjaF9jb2RlY19pbXBsZW1lbnRhdGlvbl90ICoqYXJyYXks IGludCBhLCBpbnQgYikKewoJY29uc3Qgc3dpdGNoX2NvZGVjX2ltcGxlbWVudGF0aW9uX3QgKnRt cCA9IGFycmF5W2JdOwoJYXJyYXlbYl0gPSBhcnJheVthXTsKCWFycmF5W2FdID0gdG1wOwp9Cgpz dGF0aWMgdm9pZCBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3NvcnRfY29kZWNzKGNvbnN0IHN3aXRj aF9jb2RlY19pbXBsZW1lbnRhdGlvbl90ICoqYXJyYXksIGludCBhcnJheWxlbikKewoJaW50IGkg PSAwLCBzb3J0ZWRfcHRpbWUgPSAwOwoKI2lmZGVmIERFQlVHX0NPREVDX1NPUlRJTkcKCXN3aXRj aF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19FUlJPUiwgIi0tQkVG T1JFXG4iKTsKCWRvX3ByaW50KGFycmF5LCBhcnJheWxlbik7Cglzd2l0Y2hfbG9nX3ByaW50ZihT V0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfRVJST1IsICItLUJFRk9SRVxuIik7CiNlbmRp ZgoKCWZvciAoaSA9IDA7IGkgPCBhcnJheWxlbjsgaSsrKSB7CgkJaW50IHRoaXNfcHRpbWUgPSBh cnJheVtpXS0+bWljcm9zZWNvbmRzX3Blcl9wYWNrZXQgLyAxMDAwOwoKCQlpZiAoIXN0cmNhc2Vj bXAoYXJyYXlbaV0tPmlhbmFuYW1lLCAiaWxiYyIpKSB7CgkJCXRoaXNfcHRpbWUgPSAyMDsKCQl9 CgoJCWlmICghc29ydGVkX3B0aW1lKSB7CgkJCXNvcnRlZF9wdGltZSA9IHRoaXNfcHRpbWU7CiNp ZmRlZiBERUJVR19DT0RFQ19TT1JUSU5HCgkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFO TkVMX0xPRywgU1dJVENIX0xPR19FUlJPUiwgInNvcnRlZDEgPSAlZFxuIiwgc29ydGVkX3B0aW1l KTsKI2VuZGlmCgkJfQoKCQlpZiAoaSA+IDAgJiYgc3RyY2FzZWNtcChhcnJheVtpXS0+aWFuYW5h bWUsIGFycmF5W2ktMV0tPmlhbmFuYW1lKSAmJiB0aGlzX3B0aW1lICE9IHNvcnRlZF9wdGltZSkg ewoJCQlpbnQgajsKCQkJaW50IHN3YXBwZWQgPSAwOwoKI2lmZGVmIERFQlVHX0NPREVDX1NPUlRJ TkcKCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0VS Uk9SLCAiJWQgIT0gJWRcbiIsIHRoaXNfcHRpbWUsIHNvcnRlZF9wdGltZSk7CiNlbmRpZgoJCQlm b3IoaiA9IGk7IGogPCBhcnJheWxlbjsgaisrKSB7CgkJCQlpbnQgY2hlY2tfcHRpbWUgPSBhcnJh eVtqXS0+bWljcm9zZWNvbmRzX3Blcl9wYWNrZXQgLyAxMDAwOwoKCQkJCWlmICghc3RyY2FzZWNt cChhcnJheVtpXS0+aWFuYW5hbWUsICJpbGJjIikpIHsKCQkJCQljaGVja19wdGltZSA9IDIwOwoJ CQkJfQoKCQkJCWlmIChjaGVja19wdGltZSA9PSBzb3J0ZWRfcHRpbWUpIHsKI2lmZGVmIERFQlVH X0NPREVDX1NPUlRJTkcKCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0cs IFNXSVRDSF9MT0dfRVJST1IsICJzd2FwICVkICVkIHB0aW1lICVkXG4iLCBpLCBqLCBjaGVja19w dGltZSk7CiNlbmRpZgoJCQkJCWRvX3N3YXAoYXJyYXksIGksIGopOwoJCQkJCXN3YXBwZWQgPSAx OwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAoIXN3YXBwZWQpIHsKCQkJCXNvcnRlZF9w dGltZSA9IHRoaXNfcHRpbWU7CiNpZmRlZiBERUJVR19DT0RFQ19TT1JUSU5HCgkJCQlzd2l0Y2hf bG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfRVJST1IsICJzb3J0ZWQy ID0gJWRcbiIsIHNvcnRlZF9wdGltZSk7CiNlbmRpZgoJCQl9CgkJfQoJfQoKI2lmZGVmIERFQlVH X0NPREVDX1NPUlRJTkcKCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJ VENIX0xPR19FUlJPUiwgIi0tQUZURVJcbiIpOwoJZG9fcHJpbnQoYXJyYXksIGFycmF5bGVuKTsK CXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19FUlJPUiwg Ii0tQUZURVJcbiIpOwojZW5kaWYKCn0KCgpTV0lUQ0hfREVDTEFSRShpbnQpIHN3aXRjaF9sb2Fk YWJsZV9tb2R1bGVfZ2V0X2NvZGVjcyhjb25zdCBzd2l0Y2hfY29kZWNfaW1wbGVtZW50YXRpb25f dCAqKmFycmF5LCBpbnQgYXJyYXlsZW4pCnsKCXN3aXRjaF9oYXNoX2luZGV4X3QgKmhpOwoJdm9p ZCAqdmFsOwoJc3dpdGNoX2NvZGVjX2ludGVyZmFjZV90ICpjb2RlY19pbnRlcmZhY2U7CglpbnQg aSA9IDA7Cgljb25zdCBzd2l0Y2hfY29kZWNfaW1wbGVtZW50YXRpb25fdCAqaW1wOwoJc3dpdGNo X2NvZGVjX25vZGVfdCAqbm9kZSwgKmhlYWQ7CgoJc3dpdGNoX211dGV4X2xvY2sobG9hZGFibGVf bW9kdWxlcy5tdXRleCk7Cglmb3IgKGhpID0gc3dpdGNoX2NvcmVfaGFzaF9maXJzdChsb2FkYWJs ZV9tb2R1bGVzLmNvZGVjX2hhc2gpOyBoaTsgaGkgPSBzd2l0Y2hfY29yZV9oYXNoX25leHQoJmhp KSkgewoJCXN3aXRjaF9jb3JlX2hhc2hfdGhpcyhoaSwgTlVMTCwgTlVMTCwgJnZhbCk7CgkJaGVh ZCA9IChzd2l0Y2hfY29kZWNfbm9kZV90ICopIHZhbDsKCgkJZm9yIChub2RlID0gaGVhZDsgbm9k ZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKCQkJY29kZWNfaW50ZXJmYWNlID0gKHN3aXRjaF9jb2Rl Y19pbnRlcmZhY2VfdCAqKSBub2RlLT5wdHI7CgoJCQkvKiBMb29rIGZvciB0aGUgZGVmYXVsdCBw dGltZSBvZiB0aGUgY29kZWMgYmVjYXVzZSBpdCdzIHRoZSBzYWZlc3QgY2hvaWNlICovCgkJCWZv ciAoaW1wID0gY29kZWNfaW50ZXJmYWNlLT5pbXBsZW1lbnRhdGlvbnM7IGltcDsgaW1wID0gaW1w LT5uZXh0KSB7CgkJCQl1aW50MzJfdCBkZWZhdWx0X3B0aW1lID0gc3dpdGNoX2RlZmF1bHRfcHRp bWUoaW1wLT5pYW5hbmFtZSwgaW1wLT5pYW5hY29kZSk7CgoJCQkJaWYgKGltcC0+bWljcm9zZWNv bmRzX3Blcl9wYWNrZXQgLyAxMDAwID09IChpbnQpZGVmYXVsdF9wdGltZSkgewoJCQkJCWFycmF5 W2krK10gPSBpbXA7CgkJCQkJZ290byBmb3VuZDsKCQkJCX0KCQkJfQoJCQkvKiBvaCB3ZWxsIHdl IHdpbGwgdXNlIHdoYXQgd2UgaGF2ZSAqLwoJCQlhcnJheVtpKytdID0gY29kZWNfaW50ZXJmYWNl LT5pbXBsZW1lbnRhdGlvbnM7CgkJfQoKCWZvdW5kOgoKCQlpZiAoaSA+IGFycmF5bGVuKSB7CgkJ CWJyZWFrOwoJCX0KCgl9Cglzd2l0Y2hfc2FmZV9mcmVlKGhpKTsKCglzd2l0Y2hfbXV0ZXhfdW5s b2NrKGxvYWRhYmxlX21vZHVsZXMubXV0ZXgpOwoKCXN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfc29y dF9jb2RlY3MoYXJyYXksIGkpOwoKCXJldHVybiBpOwoKfQoKU1dJVENIX0RFQ0xBUkUoY2hhciAq KSBzd2l0Y2hfcGFyc2VfY29kZWNfYnVmKGNoYXIgKmJ1ZiwgdWludDMyX3QgKmludGVydmFsLCB1 aW50MzJfdCAqcmF0ZSwgdWludDMyX3QgKmJpdCwgdWludDMyX3QgKmNoYW5uZWxzLCBjaGFyICoq bW9kbmFtZSwgY2hhciAqKmZtdHApCnsKCWNoYXIgKmN1ciwgKm5leHQgPSBOVUxMLCAqbmFtZSwg KnA7CgoJbmFtZSA9IG5leHQgPSBjdXIgPSBidWY7CgoJKmNoYW5uZWxzID0gMTsKCglmb3IgKDs7 KSB7CgkJaWYgKCFuZXh0KSB7CgkJCWJyZWFrOwoJCX0KCgkJaWYgKChwID0gc3RyY2hyKG5leHQs ICdAJykpKSB7CgkJCSpwKysgPSAnXDAnOwoJCX0KCQluZXh0ID0gcDsKCgkJaWYgKGN1ciAhPSBu YW1lKSB7CgkJCWlmIChzdHJjaHIoY3VyLCAnaScpKSB7CgkJCQkqaW50ZXJ2YWwgPSBhdG9pKGN1 cik7CgkJCX0gZWxzZSBpZiAoKHN0cmNocihjdXIsICdrJykgfHwgc3RyY2hyKGN1ciwgJ2gnKSkp IHsKCQkJCSpyYXRlID0gYXRvaShjdXIpOwoJCQl9IGVsc2UgaWYgKHN0cmNocihjdXIsICdiJykp IHsKCQkJCSpiaXQgPSBhdG9pKGN1cik7CgkJCX0gZWxzZSBpZiAoc3RyY2hyKGN1ciwgJ2MnKSkg ewoJCQkJKmNoYW5uZWxzID0gYXRvaShjdXIpOwoJCQl9IGVsc2UgewoJCQkJc3dpdGNoX2xvZ19w cmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0VSUk9SLCAiQmFkIHN5bnRheCBm b3IgY29kZWMgc3RyaW5nLiBNaXNzaW5nIHF1YWxpZmllciBbaHxrfGl8YnxjXSBmb3IgcGFydCBb JXNdIVxuIiwgY3VyKTsKCQkJfQoJCX0KCQljdXIgPSBuZXh0OwoJfQoKCWlmICgocCA9IHN0cmNo cihuYW1lLCAnLicpKSkgewoJCSpwKysgPSAnXDAnOwoJCSptb2RuYW1lID0gbmFtZTsKCQluYW1l ID0gcDsKCX0KCglpZiAoKHAgPSBzdHJjaHIobmFtZSwgJ34nKSkpIHsKCQkqcCsrID0gJ1wwJzsK CQlpZiAoZm10cCkgewoJCQkqZm10cCA9IHA7CgkJfQoJfQoKCXJldHVybiBuYW1lOwp9CgpTV0lU Q0hfREVDTEFSRShpbnQpIHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfZ2V0X2NvZGVjc19zb3J0ZWQo Y29uc3Qgc3dpdGNoX2NvZGVjX2ltcGxlbWVudGF0aW9uX3QgKiphcnJheSwgY2hhciBmbXRwX2Fy cmF5W1NXSVRDSF9NQVhfQ09ERUNTXVtNQVhfRk1UUF9MRU5dLCBpbnQgYXJyYXlsZW4sIGNoYXIg KipwcmVmcywgaW50IHByZWZsZW4pCnsKCWludCB4LCBpID0gMCwgaiA9IDA7Cglzd2l0Y2hfY29k ZWNfaW50ZXJmYWNlX3QgKmNvZGVjX2ludGVyZmFjZTsKCWNvbnN0IHN3aXRjaF9jb2RlY19pbXBs ZW1lbnRhdGlvbl90ICppbXA7CgoJc3dpdGNoX211dGV4X2xvY2sobG9hZGFibGVfbW9kdWxlcy5t dXRleCk7CgoJZm9yICh4ID0gMDsgeCA8IHByZWZsZW47IHgrKykgewoJCWNoYXIgKm5hbWUsIGJ1 ZlsyNTZdLCBqYnVmWzI1Nl0sICptb2RuYW1lID0gTlVMTCwgKmZtdHAgPSBOVUxMOwoJCXVpbnQz Ml90IGludGVydmFsID0gMCwgcmF0ZSA9IDAsIGJpdCA9IDAsIGNoYW5uZWxzID0gMTsKCgkJc3dp dGNoX2NvcHlfc3RyaW5nKGJ1ZiwgcHJlZnNbeF0sIHNpemVvZihidWYpKTsKCQluYW1lID0gc3dp dGNoX3BhcnNlX2NvZGVjX2J1ZihidWYsICZpbnRlcnZhbCwgJnJhdGUsICZiaXQsICZjaGFubmVs cywgJm1vZG5hbWUsICZmbXRwKTsKCgkJZm9yKGogPSAwOyBqIDwgeDsgaisrKSB7CgkJCWNoYXIg KmpuYW1lLCAqam1vZG5hbWUgPSBOVUxMLCAqamZtdHAgPSBOVUxMOwoJCQl1aW50MzJfdCBqaW50 ZXJ2YWwgPSAwLCBqcmF0ZSA9IDAsIGpiaXQgPSAwLCBqY2hhbm5lbHMgPSAxOwoJCQl1aW50MzJf dCBvaW50ZXJ2YWwgPSBpbnRlcnZhbCwgb3JhdGUgPSByYXRlLCBvY2hhbm5lbHMgPSBjaGFubmVs czsKCgkJCWlmIChvaW50ZXJ2YWwgPT0gMCkgewoJCQkJb2ludGVydmFsID0gc3dpdGNoX2RlZmF1 bHRfcHRpbWUobmFtZSwgMCk7CgkJCX0KCgkJCWlmIChvcmF0ZSA9PSAwKSB7CgkJCQlvcmF0ZSA9 IHN3aXRjaF9kZWZhdWx0X3JhdGUobmFtZSwgMCk7CgkJCX0KCgkJCWlmIChvY2hhbm5lbHMgPT0g MCkgewoJCQkJb2NoYW5uZWxzID0gMTsKCQkJfQoKCQkJc3dpdGNoX2NvcHlfc3RyaW5nKGpidWYs IHByZWZzW2pdLCBzaXplb2YoamJ1ZikpOwoJCQlqbmFtZSA9IHN3aXRjaF9wYXJzZV9jb2RlY19i dWYoamJ1ZiwgJmppbnRlcnZhbCwgJmpyYXRlLCAmamJpdCwgJmpjaGFubmVscywgJmptb2RuYW1l LCAmamZtdHApOwoKCQkJaWYgKGppbnRlcnZhbCA9PSAwKSB7CgkJCQlqaW50ZXJ2YWwgPSBzd2l0 Y2hfZGVmYXVsdF9wdGltZShqbmFtZSwgMCk7CgkJCX0KCgkJCWlmIChqcmF0ZSA9PSAwKSB7CgkJ CQlqcmF0ZSA9IHN3aXRjaF9kZWZhdWx0X3JhdGUoam5hbWUsIDApOwoJCQl9CgoJCQlpZiAoamNo YW5uZWxzID09IDApIHsKCQkJCWpjaGFubmVscyA9IDE7CgkJCX0KCgkJCWlmICghc3RyY2FzZWNt cChuYW1lLCBqbmFtZSkgJiYgb2ludGVydmFsID09IGppbnRlcnZhbCAmJiBvcmF0ZSA9PSBqcmF0 ZSAmJiBvY2hhbm5lbHMgPT0gamNoYW5uZWxzICYmCgkJCQkhc3RyY2FzZWNtcChzd2l0Y2hfc3Ry X25pbChmbXRwKSwgc3dpdGNoX3N0cl9uaWwoamZtdHApKSkgewoJCQkJZ290byBuZXh0X3g7CgkJ CX0KCQl9CgoJCWlmICgoY29kZWNfaW50ZXJmYWNlID0gc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9n ZXRfY29kZWNfaW50ZXJmYWNlKG5hbWUsIG1vZG5hbWUpKSAhPSAwKSB7CgkJCS8qIElmIG5vIHNw ZWNpZmljIGNvZGVjIGludGVydmFsIGlzIHJlcXVlc3RlZCBvcHQgZm9yIHRoZSBkZWZhdWx0IGFi b3ZlIGFsbCBlbHNlIGJlY2F1c2UgbG90cyBvZiBzdHVmZiBhc3N1bWVzIGl0ICovCgkJCWZvciAo aW1wID0gY29kZWNfaW50ZXJmYWNlLT5pbXBsZW1lbnRhdGlvbnM7IGltcDsgaW1wID0gaW1wLT5u ZXh0KSB7CgkJCQl1aW50MzJfdCBkZWZhdWx0X3B0aW1lID0gc3dpdGNoX2RlZmF1bHRfcHRpbWUo aW1wLT5pYW5hbmFtZSwgaW1wLT5pYW5hY29kZSk7CgkJCQl1aW50MzJfdCBkZWZhdWx0X3JhdGUg PSBzd2l0Y2hfZGVmYXVsdF9yYXRlKGltcC0+aWFuYW5hbWUsIGltcC0+aWFuYWNvZGUpOwoKCQkJ CWlmIChpbXAtPmNvZGVjX3R5cGUgIT0gU1dJVENIX0NPREVDX1RZUEVfVklERU8pIHsKCQkJCQl1 aW50MzJfdCBjcmF0ZSA9ICFzdHJjYXNlY21wKGltcC0+aWFuYW5hbWUsICJnNzIyIikgPyBpbXAt PnNhbXBsZXNfcGVyX3NlY29uZCA6IGltcC0+YWN0dWFsX3NhbXBsZXNfcGVyX3NlY29uZDsKCgkJ CQkJaWYgKCghaW50ZXJ2YWwgJiYgKHVpbnQzMl90KSAoaW1wLT5taWNyb3NlY29uZHNfcGVyX3Bh Y2tldCAvIDEwMDApICE9IGRlZmF1bHRfcHRpbWUpIHx8CgkJCQkJCShpbnRlcnZhbCAmJiAodWlu dDMyX3QpIChpbXAtPm1pY3Jvc2Vjb25kc19wZXJfcGFja2V0IC8gMTAwMCkgIT0gaW50ZXJ2YWwp KSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCgkJCQkJaWYgKCgoIXJhdGUgJiYgY3JhdGUgIT0g ZGVmYXVsdF9yYXRlKSB8fCAocmF0ZSAmJiAodWludDMyX3QpIGltcC0+YWN0dWFsX3NhbXBsZXNf cGVyX3NlY29uZCAhPSByYXRlKSkpIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoKCQkJCQlpZiAo Yml0ICYmICh1aW50MzJfdCkgaW1wLT5iaXRzX3Blcl9zZWNvbmQgIT0gYml0KSB7CgkJCQkJCWNv bnRpbnVlOwoJCQkJCX0KCgkJCQkJaWYgKGNoYW5uZWxzICYmIGltcC0+bnVtYmVyX29mX2NoYW5u ZWxzICE9IGNoYW5uZWxzKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAo IXpzdHIoZm10cCkpIHsKCQkJCQlzd2l0Y2hfc2V0X3N0cmluZyhmbXRwX2FycmF5W2ldLCBmbXRw KTsKCQkJCX0KCQkJCWFycmF5W2krK10gPSBpbXA7CgkJCQlnb3RvIGZvdW5kOwoKCQkJfQoKCQkJ LyogRWl0aGVyIGxvb2tpbmcgZm9yIGEgc3BlY2lmaWMgaW50ZXJ2YWwgb3IgdGhlcmUgd2FzIG5v IGludGVydmFsIHNwZWNpZmllZCBhbmQgdGhlcmUgd2Fzbid0IG9uZSBhdCB0aGUgZGVmYXVsdCBw dGltZSBhdmFpbGFibGUgKi8KCQkJZm9yIChpbXAgPSBjb2RlY19pbnRlcmZhY2UtPmltcGxlbWVu dGF0aW9uczsgaW1wOyBpbXAgPSBpbXAtPm5leHQpIHsKCQkJCWlmIChpbXAtPmNvZGVjX3R5cGUg IT0gU1dJVENIX0NPREVDX1RZUEVfVklERU8pIHsKCQkJCQl1aW50MzJfdCBjcmF0ZSA9ICFzdHJj YXNlY21wKGltcC0+aWFuYW5hbWUsICJnNzIyIikgPyBpbXAtPnNhbXBsZXNfcGVyX3NlY29uZCA6 IGltcC0+YWN0dWFsX3NhbXBsZXNfcGVyX3NlY29uZDsKCgkJCQkJaWYgKGludGVydmFsICYmICh1 aW50MzJfdCkgKGltcC0+bWljcm9zZWNvbmRzX3Blcl9wYWNrZXQgLyAxMDAwKSAhPSBpbnRlcnZh bCkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgoJCQkJCWlmIChyYXRlICYmICh1aW50MzJfdCkg Y3JhdGUgIT0gcmF0ZSkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgoJCQkJCWlmIChiaXQgJiYg KHVpbnQzMl90KSBpbXAtPmJpdHNfcGVyX3NlY29uZCAhPSBiaXQpIHsKCQkJCQkJY29udGludWU7 CgkJCQkJfQoKCQkJCQlpZiAoY2hhbm5lbHMgJiYgaW1wLT5udW1iZXJfb2ZfY2hhbm5lbHMgIT0g Y2hhbm5lbHMpIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJfQoKCQkJCWFycmF5W2krK10g PSBpbXA7CgkJCQlnb3RvIGZvdW5kOwoKCQkJfQoKCQkgIGZvdW5kOgoKCQkJVU5QUk9URUNUX0lO VEVSRkFDRShjb2RlY19pbnRlcmZhY2UpOwoKCQkJaWYgKGkgPiBhcnJheWxlbikgewoJCQkJYnJl YWs7CgkJCX0KCgkJfQoKCW5leHRfeDoKCgkJY29udGludWU7Cgl9CgoJc3dpdGNoX211dGV4X3Vu bG9jayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKCglzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX3Nv cnRfY29kZWNzKGFycmF5LCBpKTsKCglyZXR1cm4gaTsKfQoKU1dJVENIX0RFQ0xBUkUoc3dpdGNo X3N0YXR1c190KSBzd2l0Y2hfYXBpX2V4ZWN1dGUoY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFy ICphcmcsIHN3aXRjaF9jb3JlX3Nlc3Npb25fdCAqc2Vzc2lvbiwgc3dpdGNoX3N0cmVhbV9oYW5k bGVfdCAqc3RyZWFtKQp7Cglzd2l0Y2hfYXBpX2ludGVyZmFjZV90ICphcGk7Cglzd2l0Y2hfc3Rh dHVzX3Qgc3RhdHVzOwoJY2hhciAqYXJnX3VzZWQ7CgljaGFyICpjbWRfdXNlZDsKCglzd2l0Y2hf YXNzZXJ0KHN0cmVhbSAhPSBOVUxMKTsKCXN3aXRjaF9hc3NlcnQoc3RyZWFtLT5kYXRhICE9IE5V TEwpOwoJc3dpdGNoX2Fzc2VydChzdHJlYW0tPndyaXRlX2Z1bmN0aW9uICE9IE5VTEwpOwoKCWlm IChzdHJjYXNlY21wKGNtZCwgImNvbnNvbGVfY29tcGxldGUiKSkgewoJCWNtZF91c2VkID0gc3dp dGNoX3N0cmlwX3doaXRlc3BhY2UoY21kKTsKCQlhcmdfdXNlZCA9IHN3aXRjaF9zdHJpcF93aGl0 ZXNwYWNlKGFyZyk7Cgl9IGVsc2UgewoJCWNtZF91c2VkID0gKGNoYXIgKikgY21kOwoJCWFyZ191 c2VkID0gKGNoYXIgKikgYXJnOwoJfQoKCglpZiAoIXN0cmVhbS0+cGFyYW1fZXZlbnQpIHsKCQlz d2l0Y2hfZXZlbnRfY3JlYXRlKCZzdHJlYW0tPnBhcmFtX2V2ZW50LCBTV0lUQ0hfRVZFTlRfQVBJ KTsKCX0KCglpZiAoc3RyZWFtLT5wYXJhbV9ldmVudCkgewoJCWlmIChjbWRfdXNlZCAmJiAqY21k X3VzZWQpIHsKCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKHN0cmVhbS0+cGFyYW1f ZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJBUEktQ29tbWFuZCIsIGNtZF91c2VkKTsKCQl9 CgkJaWYgKGFyZ191c2VkICYmICphcmdfdXNlZCkgewoJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRl cl9zdHJpbmcoc3RyZWFtLT5wYXJhbV9ldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIkFQSS1D b21tYW5kLUFyZ3VtZW50IiwgYXJnX3VzZWQpOwoJCX0KCX0KCgoJaWYgKGNtZF91c2VkICYmIChh cGkgPSBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX2dldF9hcGlfaW50ZXJmYWNlKGNtZF91c2VkKSkg IT0gMCkgewoJCWlmICgoc3RhdHVzID0gYXBpLT5mdW5jdGlvbihhcmdfdXNlZCwgc2Vzc2lvbiwg c3RyZWFtKSkgIT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCXN0cmVhbS0+d3JpdGVfZnVu Y3Rpb24oc3RyZWFtLCAiQ09NTUFORCBSRVRVUk5FRCBFUlJPUiFcbiIpOwoJCX0KCQlVTlBST1RF Q1RfSU5URVJGQUNFKGFwaSk7Cgl9IGVsc2UgewoJCXN0YXR1cyA9IFNXSVRDSF9TVEFUVVNfRkFM U0U7CgkJc3RyZWFtLT53cml0ZV9mdW5jdGlvbihzdHJlYW0sICJJTlZBTElEIENPTU1BTkQhXG4i KTsKCX0KCglpZiAoc3RyZWFtLT5wYXJhbV9ldmVudCkgewoJCXN3aXRjaF9ldmVudF9maXJlKCZz dHJlYW0tPnBhcmFtX2V2ZW50KTsKCX0KCglpZiAoY21kX3VzZWQgIT0gY21kKSB7CgkJc3dpdGNo X3NhZmVfZnJlZShjbWRfdXNlZCk7Cgl9CgoJaWYgKGFyZ191c2VkICE9IGFyZykgewoJCXN3aXRj aF9zYWZlX2ZyZWUoYXJnX3VzZWQpOwoJfQoKCXJldHVybiBzdGF0dXM7Cn0KClNXSVRDSF9ERUNM QVJFKHN3aXRjaF9zdGF0dXNfdCkgc3dpdGNoX2pzb25fYXBpX2V4ZWN1dGUoY0pTT04gKmpzb24s IHN3aXRjaF9jb3JlX3Nlc3Npb25fdCAqc2Vzc2lvbiwgY0pTT04gKipyZXR2YWwpCnsKCXN3aXRj aF9qc29uX2FwaV9pbnRlcmZhY2VfdCAqanNvbl9hcGk7Cglzd2l0Y2hfc3RhdHVzX3Qgc3RhdHVz OwoJY0pTT04gKmZ1bmN0aW9uLCAqanNvbl9yZXBseSA9IE5VTEw7CgoJc3dpdGNoX2Fzc2VydChq c29uKTsKCglmdW5jdGlvbiA9IGNKU09OX0dldE9iamVjdEl0ZW0oanNvbiwgImNvbW1hbmQiKTsK CglpZiAoZnVuY3Rpb24gJiYgZnVuY3Rpb24tPnZhbHVlc3RyaW5nCgkJJiYgY0pTT05fR2V0T2Jq ZWN0SXRlbShqc29uLCAiZGF0YSIpICYmIChqc29uX2FwaSA9IHN3aXRjaF9sb2FkYWJsZV9tb2R1 bGVfZ2V0X2pzb25fYXBpX2ludGVyZmFjZShmdW5jdGlvbi0+dmFsdWVzdHJpbmcpKSAhPSAwKSB7 CgkJaWYgKChzdGF0dXMgPSBqc29uX2FwaS0+ZnVuY3Rpb24oanNvbiwgc2Vzc2lvbiwgJmpzb25f cmVwbHkpKSAhPSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJY0pTT05fQWRkSXRlbVRvT2Jq ZWN0KGpzb24sICJzdGF0dXMiLCBjSlNPTl9DcmVhdGVTdHJpbmcoImVycm9yIikpOwoJCQljSlNP Tl9BZGRJdGVtVG9PYmplY3QoanNvbiwgIm1lc3NhZ2UiLCBjSlNPTl9DcmVhdGVTdHJpbmcoIlRo ZSBjb21tYW5kIHJldHVybmVkIGFuIGVycm9yIikpOwoJCX0gZWxzZSB7CgkJCWNKU09OX0FkZEl0 ZW1Ub09iamVjdChqc29uLCAic3RhdHVzIiwgY0pTT05fQ3JlYXRlU3RyaW5nKCJzdWNjZXNzIikp OwoJCX0KCgkJaWYgKCFqc29uX3JlcGx5KSB7CgkJCWpzb25fcmVwbHkgPSBjSlNPTl9DcmVhdGVO dWxsKCk7CgkJfQoKCQlpZiAocmV0dmFsKSB7CgkJCSpyZXR2YWwgPSBqc29uX3JlcGx5OwoJCX0g ZWxzZSB7CgkJCWNKU09OX0FkZEl0ZW1Ub09iamVjdChqc29uLCAicmVzcG9uc2UiLCBqc29uX3Jl cGx5KTsKCQl9CgoJCVVOUFJPVEVDVF9JTlRFUkZBQ0UoanNvbl9hcGkpOwoJfSBlbHNlIHsKCQlz dGF0dXMgPSBTV0lUQ0hfU1RBVFVTX0ZBTFNFOwoJCWNKU09OX0FkZEl0ZW1Ub09iamVjdChqc29u LCAic3RhdHVzIiwgY0pTT05fQ3JlYXRlU3RyaW5nKCJlcnJvciIpKTsKCQljSlNPTl9BZGRJdGVt VG9PYmplY3QoanNvbiwgIm1lc3NhZ2UiLCBjSlNPTl9DcmVhdGVTdHJpbmcoIkludmFsaWQgcmVx dWVzdCBvciBub24tZXhpc3RhbnQgY29tbWFuZCIpKTsKCQljSlNPTl9BZGRJdGVtVG9PYmplY3Qo anNvbiwgInJlc3BvbnNlIiwgY0pTT05fQ3JlYXRlTnVsbCgpKTsKCX0KCglyZXR1cm4gc3RhdHVz Owp9CgoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX2xvYWRhYmxlX21vZHVsZV9pbnRlcmZhY2VfdCAq KSBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlX2NyZWF0ZV9tb2R1bGVfaW50ZXJmYWNlKHN3aXRjaF9t ZW1vcnlfcG9vbF90ICpwb29sLCBjb25zdCBjaGFyICpuYW1lKQp7Cglzd2l0Y2hfbG9hZGFibGVf bW9kdWxlX2ludGVyZmFjZV90ICptb2Q7CgoJbW9kID0gc3dpdGNoX2NvcmVfYWxsb2MocG9vbCwg c2l6ZW9mKHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfaW50ZXJmYWNlX3QpKTsKCXN3aXRjaF9hc3Nl cnQobW9kICE9IE5VTEwpOwoKCW1vZC0+cG9vbCA9IHBvb2w7CgoJbW9kLT5tb2R1bGVfbmFtZSA9 IHN3aXRjaF9jb3JlX3N0cmR1cChtb2QtPnBvb2wsIG5hbWUpOwoJc3dpdGNoX3RocmVhZF9yd2xv Y2tfY3JlYXRlKCZtb2QtPnJ3bG9jaywgbW9kLT5wb29sKTsKCXJldHVybiBtb2Q7Cn0KCiNkZWZp bmUgQUxMT0NfSU5URVJGQUNFKF9UWVBFXykJewkJCQkJCQkJCVwKCQlzd2l0Y2hfIyNfVFlQRV8j I19pbnRlcmZhY2VfdCAqaSwgKnB0cjsJCQkJCQkJXAoJCWkgPSBzd2l0Y2hfY29yZV9hbGxvYyht b2QtPnBvb2wsIHNpemVvZihzd2l0Y2hfIyNfVFlQRV8jI19pbnRlcmZhY2VfdCkpOyBcCgkJc3dp dGNoX2Fzc2VydChpICE9IE5VTEwpOwkJCQkJCQkJCQkJCVwKCQlmb3IgKHB0ciA9IG1vZC0+X1RZ UEVfIyNfaW50ZXJmYWNlOyBwdHIgJiYgcHRyLT5uZXh0OyBwdHIgPSBwdHItPm5leHQpOyBcCgkJ aWYgKHB0cikgewkJCQkJCQkJCQkJCQkJXAoJCQlwdHItPm5leHQgPSBpOwkJCQkJCQkJCQkJCVwK CQl9IGVsc2UgewkJCQkJCQkJCQkJCQkJXAoJCQltb2QtPl9UWVBFXyMjX2ludGVyZmFjZSA9IGk7 CQkJCQkJCQlcCgkJfQkJCQkJCQkJCQkJCQkJCQlcCgkJc3dpdGNoX3RocmVhZF9yd2xvY2tfY3Jl YXRlKCZpLT5yd2xvY2ssIG1vZC0+cG9vbCk7CQkJCVwKCQlzd2l0Y2hfbXV0ZXhfaW5pdCgmaS0+ cmVmbG9jaywgU1dJVENIX01VVEVYX05FU1RFRCwgbW9kLT5wb29sKTsJXAoJCWktPnBhcmVudCA9 IG1vZDsJCQkJCQkJCQkJCQlcCgkJcmV0dXJuIGk7IH0KCgpTV0lUQ0hfREVDTEFSRSh2b2lkICop IHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfY3JlYXRlX2ludGVyZmFjZShzd2l0Y2hfbG9hZGFibGVf bW9kdWxlX2ludGVyZmFjZV90ICptb2QsIHN3aXRjaF9tb2R1bGVfaW50ZXJmYWNlX25hbWVfdCBp bmFtZSkKewoKCXN3aXRjaCAoaW5hbWUpIHsKCWNhc2UgU1dJVENIX0VORFBPSU5UX0lOVEVSRkFD RToKCQlBTExPQ19JTlRFUkZBQ0UoZW5kcG9pbnQpCgoJY2FzZSBTV0lUQ0hfVElNRVJfSU5URVJG QUNFOgoJCUFMTE9DX0lOVEVSRkFDRSh0aW1lcikKCgljYXNlIFNXSVRDSF9ESUFMUExBTl9JTlRF UkZBQ0U6CgkJQUxMT0NfSU5URVJGQUNFKGRpYWxwbGFuKQoKCWNhc2UgU1dJVENIX0NPREVDX0lO VEVSRkFDRToKCQlBTExPQ19JTlRFUkZBQ0UoY29kZWMpCgoJY2FzZSBTV0lUQ0hfQVBQTElDQVRJ T05fSU5URVJGQUNFOgoJCUFMTE9DX0lOVEVSRkFDRShhcHBsaWNhdGlvbikKCgljYXNlIFNXSVRD SF9DSEFUX0FQUExJQ0FUSU9OX0lOVEVSRkFDRToKCQlBTExPQ19JTlRFUkZBQ0UoY2hhdF9hcHBs aWNhdGlvbikKCgljYXNlIFNXSVRDSF9BUElfSU5URVJGQUNFOgoJCUFMTE9DX0lOVEVSRkFDRShh cGkpCgoJY2FzZSBTV0lUQ0hfSlNPTl9BUElfSU5URVJGQUNFOgoJCUFMTE9DX0lOVEVSRkFDRShq c29uX2FwaSkKCgljYXNlIFNXSVRDSF9GSUxFX0lOVEVSRkFDRToKCQlBTExPQ19JTlRFUkZBQ0Uo ZmlsZSkKCgljYXNlIFNXSVRDSF9TUEVFQ0hfSU5URVJGQUNFOgoJCUFMTE9DX0lOVEVSRkFDRShz cGVlY2gpCgoJY2FzZSBTV0lUQ0hfRElSRUNUT1JZX0lOVEVSRkFDRToKCQlBTExPQ19JTlRFUkZB Q0UoZGlyZWN0b3J5KQoKCWNhc2UgU1dJVENIX0NIQVRfSU5URVJGQUNFOgoJCUFMTE9DX0lOVEVS RkFDRShjaGF0KQoKCWNhc2UgU1dJVENIX1NBWV9JTlRFUkZBQ0U6CgkJQUxMT0NfSU5URVJGQUNF KHNheSkKCgljYXNlIFNXSVRDSF9BU1JfSU5URVJGQUNFOgoJCUFMTE9DX0lOVEVSRkFDRShhc3Ip CgoJY2FzZSBTV0lUQ0hfTUFOQUdFTUVOVF9JTlRFUkZBQ0U6CgkJQUxMT0NfSU5URVJGQUNFKG1h bmFnZW1lbnQpCgoJY2FzZSBTV0lUQ0hfTElNSVRfSU5URVJGQUNFOgoJCUFMTE9DX0lOVEVSRkFD RShsaW1pdCkKCglkZWZhdWx0OgoJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xP RywgU1dJVENIX0xPR19XQVJOSU5HLCAiSW52YWxpZCBNb2R1bGUgVHlwZSFcbiIpOwoJCXJldHVy biBOVUxMOwoJfQp9CgpzdHJ1Y3Qgc3dpdGNoX3NheV9maWxlX2hhbmRsZSB7CgljaGFyICpleHQ7 CglpbnQgY250OwoJc3RydWN0IHN3aXRjaF9zdHJlYW1faGFuZGxlIHN0cmVhbTsKCXN3aXRjaF9l dmVudF90ICpwYXJhbV9ldmVudDsKfTsKClNXSVRDSF9ERUNMQVJFKGNoYXIgKikgc3dpdGNoX3Nh eV9maWxlX2hhbmRsZV9nZXRfdmFyaWFibGUoc3dpdGNoX3NheV9maWxlX2hhbmRsZV90ICpzaCwg Y29uc3QgY2hhciAqdmFyKQp7CgljaGFyICpyZXQgPSBOVUxMOwoKCWlmIChzaC0+cGFyYW1fZXZl bnQpIHsKCQlyZXQgPSBzd2l0Y2hfZXZlbnRfZ2V0X2hlYWRlcihzaC0+cGFyYW1fZXZlbnQsIHZh cik7Cgl9CgoJcmV0dXJuIHJldDsKCn0KClNXSVRDSF9ERUNMQVJFKGNoYXIgKikgc3dpdGNoX3Nh eV9maWxlX2hhbmRsZV9nZXRfcGF0aChzd2l0Y2hfc2F5X2ZpbGVfaGFuZGxlX3QgKnNoKQp7Cgly ZXR1cm4gKGNoYXIgKikgc2gtPnN0cmVhbS5kYXRhOwp9CgpTV0lUQ0hfREVDTEFSRShjaGFyICop IHN3aXRjaF9zYXlfZmlsZV9oYW5kbGVfZGV0YWNoX3BhdGgoc3dpdGNoX3NheV9maWxlX2hhbmRs ZV90ICpzaCkKewoJY2hhciAqcGF0aDsKCglzd2l0Y2hfYXNzZXJ0KHNoKTsKCXBhdGggPSAoY2hh ciAqKSBzaC0+c3RyZWFtLmRhdGE7CglzaC0+c3RyZWFtLmRhdGEgPSBOVUxMOwoJcmV0dXJuIHBh dGg7Cn0KCgpTV0lUQ0hfREVDTEFSRSh2b2lkKSBzd2l0Y2hfc2F5X2ZpbGVfaGFuZGxlX2Rlc3Ry b3koc3dpdGNoX3NheV9maWxlX2hhbmRsZV90ICoqc2gpCnsKCXN3aXRjaF9hc3NlcnQoc2gpOwoK CXN3aXRjaF9zYWZlX2ZyZWUoKCpzaCktPnN0cmVhbS5kYXRhKTsKCXN3aXRjaF9zYWZlX2ZyZWUo KCpzaCktPmV4dCk7CgoJaWYgKCgqc2gpLT5wYXJhbV9ldmVudCkgewoJCXN3aXRjaF9ldmVudF9k ZXN0cm95KCYoKnNoKS0+cGFyYW1fZXZlbnQpOwoJfQoJZnJlZSgqc2gpOwoJKnNoID0gTlVMTDsK fQoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3N0YXR1c190KSBzd2l0Y2hfc2F5X2ZpbGVfaGFuZGxl X2NyZWF0ZShzd2l0Y2hfc2F5X2ZpbGVfaGFuZGxlX3QgKipzaCwgY29uc3QgY2hhciAqZXh0LCBz d2l0Y2hfZXZlbnRfdCAqKnZhcl9ldmVudCkKewoJc3dpdGNoX2Fzc2VydChzaCk7CgoJaWYgKHpz dHIoZXh0KSkgewoJCWV4dCA9ICJ3YXYiOwoJfQoKCSpzaCA9IG1hbGxvYyhzaXplb2YoKipzaCkp OwoJbWVtc2V0KCpzaCwgMCwgc2l6ZW9mKCoqc2gpKTsKCglTV0lUQ0hfU1RBTkRBUkRfU1RSRUFN KCgqc2gpLT5zdHJlYW0pOwoKCWlmICh2YXJfZXZlbnQpIHsKCQkoKnNoKS0+cGFyYW1fZXZlbnQg PSAqdmFyX2V2ZW50OwoJCSp2YXJfZXZlbnQgPSBOVUxMOwoJfQoKCSgqc2gpLT5leHQgPSBzdHJk dXAoZXh0KTsKCglyZXR1cm4gU1dJVENIX1NUQVRVU19TVUNDRVNTOwp9CgpTV0lUQ0hfREVDTEFS RSh2b2lkKSBzd2l0Y2hfc2F5X2ZpbGUoc3dpdGNoX3NheV9maWxlX2hhbmRsZV90ICpzaCwgY29u c3QgY2hhciAqZm10LCAuLi4pCnsKCWNoYXIgYnVmWzI1Nl0gPSAiIjsKCWludCByZXQ7Cgl2YV9s aXN0IGFwOwoKCXZhX3N0YXJ0KGFwLCBmbXQpOwoKCWlmICgocmV0ID0gc3dpdGNoX3ZzbnByaW50 ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKSkgPiAwKSB7CgkJaWYgKCFzaC0+Y250KyspIHsK CQkJc2gtPnN0cmVhbS53cml0ZV9mdW5jdGlvbigmc2gtPnN0cmVhbSwgImZpbGVfc3RyaW5nOi8v JXMuJXMiLCBidWYsIHNoLT5leHQpOwoJCX0gZWxzZSBpZiAoc3Ryc3RyKGJ1ZiwgIjovLyIpKSB7 CgkJCXNoLT5zdHJlYW0ud3JpdGVfZnVuY3Rpb24oJnNoLT5zdHJlYW0sICIhJXMiLCBidWYpOwoJ CX0gZWxzZSB7CgkJCXNoLT5zdHJlYW0ud3JpdGVfZnVuY3Rpb24oJnNoLT5zdHJlYW0sICIhJXMu JXMiLCBidWYsIHNoLT5leHQpOwoJCX0KCgl9CgoJdmFfZW5kKGFwKTsKfQoKU1dJVENIX0RFQ0xB UkUoc3dpdGNoX2NvcmVfcmVjb3Zlcl9jYWxsYmFja190KSBzd2l0Y2hfY29yZV9nZXRfc2Vjb25k YXJ5X3JlY292ZXJfY2FsbGJhY2soY29uc3QgY2hhciAqa2V5KQp7Cglzd2l0Y2hfY29yZV9yZWNv dmVyX2NhbGxiYWNrX3QgY2I7CgoJc3dpdGNoX211dGV4X2xvY2sobG9hZGFibGVfbW9kdWxlcy5t dXRleCk7CgljYiA9IChzd2l0Y2hfY29yZV9yZWNvdmVyX2NhbGxiYWNrX3QpIChpbnRwdHJfdCkg c3dpdGNoX2NvcmVfaGFzaF9maW5kKGxvYWRhYmxlX21vZHVsZXMuc2Vjb25kYXJ5X3JlY292ZXJf aGFzaCwga2V5KTsKCXN3aXRjaF9tdXRleF91bmxvY2sobG9hZGFibGVfbW9kdWxlcy5tdXRleCk7 CgoJcmV0dXJuIGNiOwp9CgoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3N0YXR1c190KSBzd2l0Y2hf Y29yZV9yZWdpc3Rlcl9zZWNvbmRhcnlfcmVjb3Zlcl9jYWxsYmFjayhjb25zdCBjaGFyICprZXks IHN3aXRjaF9jb3JlX3JlY292ZXJfY2FsbGJhY2tfdCBjYikKewoJc3dpdGNoX3N0YXR1c190IHN0 YXR1cyA9IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUzsKCglzd2l0Y2hfYXNzZXJ0KGNiKTsKCglzd2l0 Y2hfbXV0ZXhfbG9jayhsb2FkYWJsZV9tb2R1bGVzLm11dGV4KTsKCWlmIChzd2l0Y2hfY29yZV9o YXNoX2ZpbmQobG9hZGFibGVfbW9kdWxlcy5zZWNvbmRhcnlfcmVjb3Zlcl9oYXNoLCBrZXkpKSB7 CgkJc3RhdHVzID0gU1dJVENIX1NUQVRVU19GQUxTRTsKCX0gZWxzZSB7CgkJc3dpdGNoX2NvcmVf aGFzaF9pbnNlcnQobG9hZGFibGVfbW9kdWxlcy5zZWNvbmRhcnlfcmVjb3Zlcl9oYXNoLCBrZXks ICh2b2lkICopKGludHB0cl90KSBjYik7Cgl9Cglzd2l0Y2hfbXV0ZXhfdW5sb2NrKGxvYWRhYmxl X21vZHVsZXMubXV0ZXgpOwoKCXJldHVybiBzdGF0dXM7Cn0KCgpTV0lUQ0hfREVDTEFSRSh2b2lk KSBzd2l0Y2hfY29yZV91bnJlZ2lzdGVyX3NlY29uZGFyeV9yZWNvdmVyX2NhbGxiYWNrKGNvbnN0 IGNoYXIgKmtleSkKewoJc3dpdGNoX211dGV4X2xvY2sobG9hZGFibGVfbW9kdWxlcy5tdXRleCk7 Cglzd2l0Y2hfY29yZV9oYXNoX2RlbGV0ZShsb2FkYWJsZV9tb2R1bGVzLnNlY29uZGFyeV9yZWNv dmVyX2hhc2gsIGtleSk7Cglzd2l0Y2hfbXV0ZXhfdW5sb2NrKGxvYWRhYmxlX21vZHVsZXMubXV0 ZXgpOwp9CgoKLyogRm9yIEVtYWNzOgogKiBMb2NhbCBWYXJpYWJsZXM6CiAqIG1vZGU6YwogKiBp bmRlbnQtdGFicy1tb2RlOnQKICogdGFiLXdpZHRoOjQKICogYy1iYXNpYy1vZmZzZXQ6NAogKiBF bmQ6CiAqIEZvciBWSU06CiAqIHZpbTpzZXQgc29mdHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgdGFi c3RvcD00IG5vZXQ6CiAqLwo= --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=switch_core.c Content-Transfer-Encoding: base64 LyoKICogRnJlZVNXSVRDSCBNb2R1bGFyIE1lZGlhIFN3aXRjaGluZyBTb2Z0d2FyZSBMaWJyYXJ5 IC8gU29mdC1Td2l0Y2ggQXBwbGljYXRpb24KICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTQsIEFu dGhvbnkgTWluZXNzYWxlIElJIDxhbnRobUBmcmVlc3dpdGNoLm9yZz4KICoKICogVmVyc2lvbjog TVBMIDEuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRo ZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsg eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRo ZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0 cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVy IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhP VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0 aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMg YW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwg Q29kZSBpcyBGcmVlU1dJVENIIE1vZHVsYXIgTWVkaWEgU3dpdGNoaW5nIFNvZnR3YXJlIExpYnJh cnkgLyBTb2Z0LVN3aXRjaCBBcHBsaWNhdGlvbgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIg b2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQW50aG9ueSBNaW5lc3NhbGUgSUkgPGFudGhtQGZy ZWVzd2l0Y2gub3JnPgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3Bl ciBhcmUgQ29weXJpZ2h0IChDKQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMg UmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKgogKiBBbnRob255IE1pbmVzc2FsZSBJ SSA8YW50aG1AZnJlZXN3aXRjaC5vcmc+CiAqIE1pY2hhZWwgSmVycmlzIDxtaWtlQGplcnJpcy5j b20+CiAqIFBhdWwgRC4gVGluc2xleSA8cGR0IGF0IGphY2toYW1tZXIub3JnPgogKiBNYXJjZWwg QmFyYnVsZXNjdSA8bWFyY2VsYmFyYnVsZXNjdUBnbWFpbC5jb20+CiAqIEpvc2VwaCBTdWxsaXZh biA8am9zc3VsbGlAYW1hem9uLmNvbT4KICogU2V2ZW4gRHUgPGR1amluZmFuZ0BnbWFpbC5jb20+ CiAqCiAqIHN3aXRjaF9jb3JlLmMgLS0gTWFpbiBDb3JlIExpYnJhcnkKICoKICovCgoKCiNpbmNs dWRlIDxzd2l0Y2guaD4KI2luY2x1ZGUgPHN3aXRjaF9zc2wuaD4KI2luY2x1ZGUgPHN3aXRjaF9z dHVuLmg+CiNpbmNsdWRlIDxzd2l0Y2hfbmF0Lmg+CiNpbmNsdWRlICJwcml2YXRlL3N3aXRjaF9j b3JlX3B2dC5oIgojaW5jbHVkZSA8c3dpdGNoX2N1cmwuaD4KI2luY2x1ZGUgPHN3aXRjaF9tc3Jw Lmg+CiNpZm5kZWYgV0lOMzIKI2luY2x1ZGUgPHN3aXRjaF9wcml2YXRlLmg+CiNpZmRlZiBIQVZF X1NFVFJMSU1JVAojaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiNlbmRpZgojZW5kaWYKI2luY2x1 ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzcWxpdGUzLmg+CiNpZmRlZiBIQVZFX1NZU19QUkNUTF9I CiNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KI2VuZGlmCiNpZmRlZiBTT0xBUklTX1BSSVZJTEVHRVMK I2luY2x1ZGUgPHByaXYuaD4KI2VuZGlmCgpTV0lUQ0hfREVDTEFSRV9EQVRBIHN3aXRjaF9kaXJl Y3RvcmllcyBTV0lUQ0hfR0xPQkFMX2RpcnMgPSB7IDAgfTsKU1dJVENIX0RFQ0xBUkVfREFUQSBz d2l0Y2hfZmlsZW5hbWVzIFNXSVRDSF9HTE9CQUxfZmlsZW5hbWVzID0geyAwIH07CgovKiBUaGUg bWFpbiBydW50aW1lIG9iaiB3ZSBrZWVwIHRoaXMgaGlkZGVuIGZvciBvdXJzZWx2ZXMgKi8Kc3Ry dWN0IHN3aXRjaF9ydW50aW1lIHJ1bnRpbWUgPSB7IDAgfTsKc3RhdGljIHZvaWQgc3dpdGNoX2xv YWRfY29yZV9jb25maWcoY29uc3QgY2hhciAqZmlsZSk7CgpzdGF0aWMgdm9pZCBzZW5kX2hlYXJ0 YmVhdCh2b2lkKQp7Cglzd2l0Y2hfZXZlbnRfdCAqZXZlbnQ7Cglzd2l0Y2hfY29yZV90aW1lX2R1 cmF0aW9uX3QgZHVyYXRpb247CgoJc3dpdGNoX2NvcmVfbWVhc3VyZV90aW1lKHN3aXRjaF9jb3Jl X3VwdGltZSgpLCAmZHVyYXRpb24pOwoKCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwg U1dJVENIX0VWRU5UX0hFQVJUQkVBVCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJc3dp dGNoX2V2ZW50X2FkZF9oZWFkZXIoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJFdmVudC1J bmZvIiwgIlN5c3RlbSBSZWFkeSIpOwoJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyKGV2ZW50LCBT V0lUQ0hfU1RBQ0tfQk9UVE9NLCAiVXAtVGltZSIsCgkJCQkJCQkJIiV1IHllYXIlcywgIgoJCQkJ CQkJCSIldSBkYXklcywgIgoJCQkJCQkJCSIldSBob3VyJXMsICIKCQkJCQkJCQkiJXUgbWludXRl JXMsICIKCQkJCQkJCQkiJXUgc2Vjb25kJXMsICIKCQkJCQkJCQkiJXUgbWlsbGlzZWNvbmQlcywg IgoJCQkJCQkJCSIldSBtaWNyb3NlY29uZCVzIiwKCQkJCQkJCQlkdXJhdGlvbi55ciwgZHVyYXRp b24ueXIgPT0gMSA/ICIiIDogInMiLAoJCQkJCQkJCWR1cmF0aW9uLmRheSwgZHVyYXRpb24uZGF5 ID09IDEgPyAiIiA6ICJzIiwKCQkJCQkJCQlkdXJhdGlvbi5ociwgZHVyYXRpb24uaHIgPT0gMSA/ ICIiIDogInMiLAoJCQkJCQkJCWR1cmF0aW9uLm1pbiwgZHVyYXRpb24ubWluID09IDEgPyAiIiA6 ICJzIiwKCQkJCQkJCQlkdXJhdGlvbi5zZWMsIGR1cmF0aW9uLnNlYyA9PSAxID8gIiIgOiAicyIs CgkJCQkJCQkJZHVyYXRpb24ubXMsIGR1cmF0aW9uLm1zID09IDEgPyAiIiA6ICJzIiwgZHVyYXRp b24ubW1zLCBkdXJhdGlvbi5tbXMgPT0gMSA/ICIiIDogInMiKTsKCgkJc3dpdGNoX2V2ZW50X2Fk ZF9oZWFkZXIoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJGcmVlU1dJVENILVZlcnNpb24i LCAiJXMiLCBzd2l0Y2hfdmVyc2lvbl9mdWxsKCkpOwoJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVy KGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiVXB0aW1lLW1zZWMiLCAiJSJTV0lUQ0hfVElN RV9UX0ZNVCwgc3dpdGNoX2NvcmVfdXB0aW1lKCkgLyAxMDAwKTsKCQlzd2l0Y2hfZXZlbnRfYWRk X2hlYWRlcihldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIlNlc3Npb24tQ291bnQiLCAiJXUi LCBzd2l0Y2hfY29yZV9zZXNzaW9uX2NvdW50KCkpOwoJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVy KGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiTWF4LVNlc3Npb25zIiwgIiV1Iiwgc3dpdGNo X2NvcmVfc2Vzc2lvbl9saW1pdCgwKSk7CgkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXIoZXZlbnQs IFNXSVRDSF9TVEFDS19CT1RUT00sICJTZXNzaW9uLVBlci1TZWMiLCAiJXUiLCBydW50aW1lLnNw cyk7CgkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXIoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00s ICJTZXNzaW9uLVBlci1TZWMtTGFzdCIsICIldSIsIHJ1bnRpbWUuc3BzX2xhc3QpOwoJCXN3aXRj aF9ldmVudF9hZGRfaGVhZGVyKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiU2Vzc2lvbi1Q ZXItU2VjLU1heCIsICIldSIsIHJ1bnRpbWUuc3BzX3BlYWspOwoJCXN3aXRjaF9ldmVudF9hZGRf aGVhZGVyKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiU2Vzc2lvbi1QZXItU2VjLUZpdmVN aW4iLCAiJXUiLCBydW50aW1lLnNwc19wZWFrX2ZpdmVtaW4pOwoJCXN3aXRjaF9ldmVudF9hZGRf aGVhZGVyKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiU2Vzc2lvbi1TaW5jZS1TdGFydHVw IiwgIiUiIFNXSVRDSF9TSVpFX1RfRk1ULCBzd2l0Y2hfY29yZV9zZXNzaW9uX2lkKCkgLSAxKTsK CQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcihldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIlNl c3Npb24tUGVhay1NYXgiLCAiJXUiLCBydW50aW1lLnNlc3Npb25zX3BlYWspOwoJCXN3aXRjaF9l dmVudF9hZGRfaGVhZGVyKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiU2Vzc2lvbi1QZWFr LUZpdmVNaW4iLCAiJXUiLCBydW50aW1lLnNlc3Npb25zX3BlYWtfZml2ZW1pbik7CgkJc3dpdGNo X2V2ZW50X2FkZF9oZWFkZXIoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJJZGxlLUNQVSIs ICIlZiIsIHN3aXRjaF9jb3JlX2lkbGVfY3B1KCkpOwoJCXN3aXRjaF9ldmVudF9maXJlKCZldmVu dCk7Cgl9Cn0KCnN0YXRpYyBjaGFyIG1haW5faXA0WzI1Nl0gPSAiIjsKc3RhdGljIGNoYXIgbWFp bl9pcDZbMjU2XSA9ICIiOwoKc3RhdGljIHZvaWQgY2hlY2tfaXAodm9pZCkKewoJY2hhciBndWVz c19pcDRbMjU2XSA9ICIiOwoJY2hhciBndWVzc19pcDZbMjU2XSA9ICIiOwoJY2hhciBvbGRfaXA0 WzI1Nl0gPSAiIjsKCWNoYXIgb2xkX2lwNlsyNTZdID0gIiI7CglpbnQgb2s0ID0gMSwgb2s2ID0g MTsKCWludCBtYXNrID0gMDsKCXN3aXRjaF9zdGF0dXNfdCBjaGVjazYsIGNoZWNrNDsKCXN3aXRj aF9ldmVudF90ICpldmVudDsKCWNoYXIgKmhvc3RuYW1lID0gc3dpdGNoX2NvcmVfZ2V0X3Zhcmlh YmxlKCJob3N0bmFtZSIpOwoKCWdldGhvc3RuYW1lKHJ1bnRpbWUuaG9zdG5hbWUsIHNpemVvZihy dW50aW1lLmhvc3RuYW1lKSk7CgoJaWYgKHpzdHIoaG9zdG5hbWUpKSB7CgkJc3dpdGNoX2NvcmVf c2V0X3ZhcmlhYmxlKCJob3N0bmFtZSIsIHJ1bnRpbWUuaG9zdG5hbWUpOwoJfSBlbHNlIGlmIChz dHJjbXAoaG9zdG5hbWUsIHJ1bnRpbWUuaG9zdG5hbWUpKSB7CgkJaWYgKHN3aXRjaF9ldmVudF9j cmVhdGUoJmV2ZW50LCBTV0lUQ0hfRVZFTlRfVFJBUCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNT KSB7CgkJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9N LCAiY29uZGl0aW9uIiwgImhvc3RuYW1lLWNoYW5nZSIpOwoJCQlzd2l0Y2hfZXZlbnRfYWRkX2hl YWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJvbGQtaG9zdG5hbWUiLCBo b3N0bmFtZSA/IGhvc3RuYW1lIDogIm5pbCIpOwoJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9z dHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuZXctaG9zdG5hbWUiLCBydW50aW1l Lmhvc3RuYW1lKTsKCQkJc3dpdGNoX2V2ZW50X2ZpcmUoJmV2ZW50KTsKCQl9CgoJCXN3aXRjaF9j b3JlX3NldF92YXJpYWJsZSgiaG9zdG5hbWUiLCBydW50aW1lLmhvc3RuYW1lKTsKCX0KCgljaGVj azQgPSBzd2l0Y2hfZmluZF9sb2NhbF9pcChndWVzc19pcDQsIHNpemVvZihndWVzc19pcDQpLCAm bWFzaywgQUZfSU5FVCk7CgljaGVjazYgPSBzd2l0Y2hfZmluZF9sb2NhbF9pcChndWVzc19pcDYs IHNpemVvZihndWVzc19pcDYpLCBOVUxMLCBBRl9JTkVUNik7CgoJaWYgKGNoZWNrNiAhPSBTV0lU Q0hfU1RBVFVTX1NVQ0NFU1MgJiYgKHpzdHIobWFpbl9pcDYpIHx8ICFzdHJjYXNlY21wKG1haW5f aXA2LCAiOjoxIikpKSB7CgkJY2hlY2s2ID0gU1dJVENIX1NUQVRVU19TVUNDRVNTOwoJfQoKCWlm IChjaGVjazQgIT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJb2s0ID0gMjsKCX0gZWxzZSBp ZiAoISptYWluX2lwNCkgewoJCXN3aXRjaF9zZXRfc3RyaW5nKG1haW5faXA0LCBndWVzc19pcDQp OwoJfSBlbHNlIHsKCQlpZiAoIShvazQgPSAhc3RyY21wKG1haW5faXA0LCBndWVzc19pcDQpKSkg ewoJCQlzdHJ1Y3QgaW5fYWRkciBpbjsKCgkJCWluLnNfYWRkciA9IG1hc2s7CgkJCXN3aXRjaF9z ZXRfc3RyaW5nKG9sZF9pcDQsIG1haW5faXA0KTsKCQkJc3dpdGNoX3NldF9zdHJpbmcobWFpbl9p cDQsIGd1ZXNzX2lwNCk7CgkJCXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgibG9jYWxfaXBfdjQi LCBndWVzc19pcDQpOwoJCQlzd2l0Y2hfY29yZV9zZXRfdmFyaWFibGUoImxvY2FsX21hc2tfdjQi LCBpbmV0X250b2EoaW4pKTsKCQl9Cgl9CgoJaWYgKGNoZWNrNiAhPSBTV0lUQ0hfU1RBVFVTX1NV Q0NFU1MpIHsKCQlvazYgPSAyOwoJfSBlbHNlIGlmICghKm1haW5faXA2KSB7CgkJc3dpdGNoX3Nl dF9zdHJpbmcobWFpbl9pcDYsIGd1ZXNzX2lwNik7Cgl9IGVsc2UgewoJCWlmICghKG9rNiA9ICFz dHJjbXAobWFpbl9pcDYsIGd1ZXNzX2lwNikpKSB7CgkJCXN3aXRjaF9zZXRfc3RyaW5nKG9sZF9p cDYsIG1haW5faXA2KTsKCQkJc3dpdGNoX3NldF9zdHJpbmcobWFpbl9pcDYsIGd1ZXNzX2lwNik7 CgkJCXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgibG9jYWxfaXBfdjYiLCBndWVzc19pcDYpOwoJ CX0KCX0KCglpZiAoIW9rNCB8fCAhb2s2KSB7CgkJaWYgKHN3aXRjaF9ldmVudF9jcmVhdGUoJmV2 ZW50LCBTV0lUQ0hfRVZFTlRfVFJBUCkgPT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCXN3 aXRjaF9ldmVudF9hZGRfaGVhZGVyKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiY29uZGl0 aW9uIiwgIm5ldHdvcmstYWRkcmVzcy1jaGFuZ2UiKTsKCQkJaWYgKCFvazQpIHsKCQkJCXN3aXRj aF9ldmVudF9hZGRfaGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIm5l dHdvcmstYWRkcmVzcy1wcmV2aW91cy12NCIsIG9sZF9pcDQpOwoJCQkJc3dpdGNoX2V2ZW50X2Fk ZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAibmV0d29yay1hZGRy ZXNzLWNoYW5nZS12NCIsIG1haW5faXA0KTsKCQkJfQoJCQlpZiAoIW9rNikgewoJCQkJc3dpdGNo X2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAibmV0 d29yay1hZGRyZXNzLXByZXZpb3VzLXY2Iiwgb2xkX2lwNik7CgkJCQlzd2l0Y2hfZXZlbnRfYWRk X2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuZXR3b3JrLWFkZHJl c3MtY2hhbmdlLXY2IiwgbWFpbl9pcDYpOwoJCQl9CgkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVu dCk7CgkJfQoJfQoKCWlmIChvazQgPT0gMiB8fCBvazYgPT0gMikgewoJCWlmIChzd2l0Y2hfZXZl bnRfY3JlYXRlKCZldmVudCwgU1dJVENIX0VWRU5UX1RSQVApID09IFNXSVRDSF9TVEFUVVNfU1VD Q0VTUykgewoJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcihldmVudCwgU1dJVENIX1NUQUNLX0JP VFRPTSwgImNvbmRpdGlvbiIsICJuZXR3b3JrLW91dGFnZSIpOwoKCQkJc3dpdGNoX2V2ZW50X2Fk ZF9oZWFkZXJfc3RyaW5nKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAibmV0d29yay1zdGF0 dXMtdjQiLCBvazQgPT0gMiA/ICJkaXNjb25uZWN0ZWQiIDogImFjdGl2ZSIpOwoJCQlzd2l0Y2hf ZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuZXR3 b3JrLWFkZHJlc3MtdjQiLCBtYWluX2lwNCk7CgoJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9z dHJpbmcoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJuZXR3b3JrLXN0YXR1cy12NiIsIG9r NiA9PSAyID8gImRpc2Nvbm5lY3RlZCIgOiAiYWN0aXZlIik7CgkJCXN3aXRjaF9ldmVudF9hZGRf aGVhZGVyX3N0cmluZyhldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIm5ldHdvcmstYWRkcmVz cy12NiIsIG1haW5faXA2KTsKCgkJCXN3aXRjaF9ldmVudF9maXJlKCZldmVudCk7CgkJfQoJfQoK fQoKU1dJVENIX1NUQU5EQVJEX1NDSEVEX0ZVTkMoaGVhcnRiZWF0X2NhbGxiYWNrKQp7CglzZW5k X2hlYXJ0YmVhdCgpOwoKCS8qIHJlc2NoZWR1bGUgdGhpcyB0YXNrICovCgl0YXNrLT5ydW50aW1l ID0gc3dpdGNoX2Vwb2NoX3RpbWVfbm93KE5VTEwpICsgcnVudGltZS5ldmVudF9oZWFydGJlYXRf aW50ZXJ2YWw7Cn0KCgpTV0lUQ0hfU1RBTkRBUkRfU0NIRURfRlVOQyhjaGVja19pcF9jYWxsYmFj aykKewoJY2hlY2tfaXAoKTsKCgkvKiByZXNjaGVkdWxlIHRoaXMgdGFzayAqLwoJdGFzay0+cnVu dGltZSA9IHN3aXRjaF9lcG9jaF90aW1lX25vdyhOVUxMKSArIDYwOwp9CgoKU1dJVENIX0RFQ0xB UkUoc3dpdGNoX3N0YXR1c190KSBzd2l0Y2hfY29yZV9zZXRfY29uc29sZShjb25zdCBjaGFyICpj b25zb2xlKQp7CglpZiAoKHJ1bnRpbWUuY29uc29sZSA9IGZvcGVuKGNvbnNvbGUsICJhIikpID09 IDApIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzLlxuIiwg Y29uc29sZSk7CgkJcmV0dXJuIFNXSVRDSF9TVEFUVVNfRkFMU0U7Cgl9CgoJcmV0dXJuIFNXSVRD SF9TVEFUVVNfU1VDQ0VTUzsKfQoKU1dJVENIX0RFQ0xBUkUoRklMRSAqKSBzd2l0Y2hfY29yZV9n ZXRfY29uc29sZSh2b2lkKQp7CglyZXR1cm4gcnVudGltZS5jb25zb2xlOwp9CgojaWZkZWYgSEFW RV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgpTV0lUQ0hfREVDTEFS RSh2b2lkKSBzd2l0Y2hfY29yZV9zY3JlZW5fc2l6ZShpbnQgKngsIGludCAqeSkKewoKI2lmZGVm IFdJTjMyCglDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBjc2JpOwoJaW50IHJldDsKCglpZiAo KHJldCA9IEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKEdldFN0ZEhhbmRsZSggU1REX09VVFBV VF9IQU5ETEUgKSwgJmNzYmkpKSkgewoJCWlmICh4KSAqeCA9IGNzYmkuZHdTaXplLlg7CgkJaWYg KHkpICp5ID0gY3NiaS5kd1NpemUuWTsKCX0KCiNlbGlmIGRlZmluZWQoVElPQ0dXSU5TWikKCXN0 cnVjdCB3aW5zaXplIHc7Cglpb2N0bCgwLCBUSU9DR1dJTlNaLCAmdyk7CgoJaWYgKHgpICp4ID0g dy53c19jb2w7CglpZiAoeSkgKnkgPSB3LndzX3JvdzsKI2Vsc2UKCWlmICh4KSAqeCA9IDgwOwoJ aWYgKHkpICp5ID0gMjQ7CiNlbmRpZgoKfQoKU1dJVENIX0RFQ0xBUkUoRklMRSAqKSBzd2l0Y2hf Y29yZV9kYXRhX2NoYW5uZWwoc3dpdGNoX3RleHRfY2hhbm5lbF90IGNoYW5uZWwpCnsKCUZJTEUg KmhhbmRsZSA9IHN0ZG91dDsKCglzd2l0Y2ggKGNoYW5uZWwpIHsKCWNhc2UgU1dJVENIX0NIQU5O RUxfSURfTE9HOgoJY2FzZSBTV0lUQ0hfQ0hBTk5FTF9JRF9MT0dfQ0xFQU46CgkJaGFuZGxlID0g cnVudGltZS5jb25zb2xlOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQloYW5kbGUgPSBydW50aW1lLmNv bnNvbGU7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuIGhhbmRsZTsKfQoKClNXSVRDSF9ERUNMQVJFKHZv aWQpIHN3aXRjaF9jb3JlX3JlbW92ZV9zdGF0ZV9oYW5kbGVyKGNvbnN0IHN3aXRjaF9zdGF0ZV9o YW5kbGVyX3RhYmxlX3QgKnN0YXRlX2hhbmRsZXIpCnsKCWludCBpbmRleCwgdG1wX2luZGV4ID0g MDsKCWNvbnN0IHN3aXRjaF9zdGF0ZV9oYW5kbGVyX3RhYmxlX3QgKnRtcFtTV0lUQ0hfTUFYX1NU QVRFX0hBTkRMRVJTICsgMV0gPSB7IDAgfTsKCglzd2l0Y2hfbXV0ZXhfbG9jayhydW50aW1lLmds b2JhbF9tdXRleCk7CgoJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcnVudGltZS5zdGF0ZV9oYW5k bGVyX2luZGV4OyBpbmRleCsrKSB7CgkJY29uc3Qgc3dpdGNoX3N0YXRlX2hhbmRsZXJfdGFibGVf dCAqY3VyID0gcnVudGltZS5zdGF0ZV9oYW5kbGVyc1tpbmRleF07CgkJcnVudGltZS5zdGF0ZV9o YW5kbGVyc1tpbmRleF0gPSBOVUxMOwoJCWlmIChjdXIgPT0gc3RhdGVfaGFuZGxlcikgewoJCQlj b250aW51ZTsKCQl9CgkJdG1wW3RtcF9pbmRleCsrXSA9IGN1cjsKCX0KCglydW50aW1lLnN0YXRl X2hhbmRsZXJfaW5kZXggPSAwOwoKCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRtcF9pbmRleDsg aW5kZXgrKykgewoJCXJ1bnRpbWUuc3RhdGVfaGFuZGxlcnNbcnVudGltZS5zdGF0ZV9oYW5kbGVy X2luZGV4KytdID0gdG1wW2luZGV4XTsKCX0KCXN3aXRjaF9tdXRleF91bmxvY2socnVudGltZS5n bG9iYWxfbXV0ZXgpOwp9CgoKU1dJVENIX0RFQ0xBUkUoaW50KSBzd2l0Y2hfY29yZV9hZGRfc3Rh dGVfaGFuZGxlcihjb25zdCBzd2l0Y2hfc3RhdGVfaGFuZGxlcl90YWJsZV90ICpzdGF0ZV9oYW5k bGVyKQp7CglpbnQgaW5kZXg7CgoJc3dpdGNoX211dGV4X2xvY2socnVudGltZS5nbG9iYWxfbXV0 ZXgpOwoJaW5kZXggPSBydW50aW1lLnN0YXRlX2hhbmRsZXJfaW5kZXg7CgoJaWYgKGluZGV4ID4g KFNXSVRDSF9NQVhfU1RBVEVfSEFORExFUlMgLSAxKSkgewoJCWluZGV4ID0gLTE7Cgl9IGVsc2Ug ewoJCXJ1bnRpbWUuc3RhdGVfaGFuZGxlcnNbaW5kZXhdID0gc3RhdGVfaGFuZGxlcjsKCQlydW50 aW1lLnN0YXRlX2hhbmRsZXJfaW5kZXgrKzsKCX0KCglzd2l0Y2hfbXV0ZXhfdW5sb2NrKHJ1bnRp bWUuZ2xvYmFsX211dGV4KTsKCXJldHVybiBpbmRleDsKfQoKU1dJVENIX0RFQ0xBUkUoY29uc3Qg c3dpdGNoX3N0YXRlX2hhbmRsZXJfdGFibGVfdCAqKSBzd2l0Y2hfY29yZV9nZXRfc3RhdGVfaGFu ZGxlcihpbnQgaW5kZXgpCnsKCglpZiAoaW5kZXggPj0gU1dJVENIX01BWF9TVEFURV9IQU5ETEVS UyB8fCBpbmRleCA+IHJ1bnRpbWUuc3RhdGVfaGFuZGxlcl9pbmRleCkgewoJCXJldHVybiBOVUxM OwoJfQoKCXJldHVybiBydW50aW1lLnN0YXRlX2hhbmRsZXJzW2luZGV4XTsKfQoKU1dJVENIX0RF Q0xBUkUodm9pZCkgc3dpdGNoX2NvcmVfZHVtcF92YXJpYWJsZXMoc3dpdGNoX3N0cmVhbV9oYW5k bGVfdCAqc3RyZWFtKQp7Cglzd2l0Y2hfZXZlbnRfaGVhZGVyX3QgKmhpOwoKCXN3aXRjaF9tdXRl eF9sb2NrKHJ1bnRpbWUuZ2xvYmFsX211dGV4KTsKCWZvciAoaGkgPSBydW50aW1lLmdsb2JhbF92 YXJzLT5oZWFkZXJzOyBoaTsgaGkgPSBoaS0+bmV4dCkgewoJCXN0cmVhbS0+d3JpdGVfZnVuY3Rp b24oc3RyZWFtLCAiJXM9JXNcbiIsIGhpLT5uYW1lLCBoaS0+dmFsdWUpOwoJfQoJc3dpdGNoX211 dGV4X3VubG9jayhydW50aW1lLmdsb2JhbF9tdXRleCk7Cn0KClNXSVRDSF9ERUNMQVJFKGNvbnN0 IGNoYXIgKikgc3dpdGNoX2NvcmVfZ2V0X2hvc3RuYW1lKHZvaWQpCnsKCXJldHVybiBydW50aW1l Lmhvc3RuYW1lOwp9CgpTV0lUQ0hfREVDTEFSRShjb25zdCBjaGFyICopIHN3aXRjaF9jb3JlX2dl dF9zd2l0Y2huYW1lKHZvaWQpCnsKCWlmICghenN0cihydW50aW1lLnN3aXRjaG5hbWUpKSByZXR1 cm4gcnVudGltZS5zd2l0Y2huYW1lOwoJcmV0dXJuIHJ1bnRpbWUuaG9zdG5hbWU7Cn0KClNXSVRD SF9ERUNMQVJFKGNoYXIgKikgc3dpdGNoX2NvcmVfZ2V0X2RvbWFpbihzd2l0Y2hfYm9vbF90IGR1 cCkKewoJY2hhciAqZG9tYWluOwoJY29uc3QgY2hhciAqdmFyOwoKCXN3aXRjaF90aHJlYWRfcnds b2NrX3JkbG9jayhydW50aW1lLmdsb2JhbF92YXJfcndsb2NrKTsKCWlmICghKHZhciA9IHN3aXRj aF9jb3JlX2dldF92YXJpYWJsZSgiZG9tYWluIikpKSB7CgkJdmFyID0gImZyZWVzd2l0Y2gubG9j YWwiOwoJfQoJaWYgKGR1cCkgewoJCWRvbWFpbiA9IHN0cmR1cCh2YXIpOwoJfSBlbHNlIHsKCQlk b21haW4gPSAoY2hhciAqKSB2YXI7Cgl9Cglzd2l0Y2hfdGhyZWFkX3J3bG9ja191bmxvY2socnVu dGltZS5nbG9iYWxfdmFyX3J3bG9jayk7CgoJcmV0dXJuIGRvbWFpbjsKfQoKU1dJVENIX0RFQ0xB UkUoc3dpdGNoX3N0YXR1c190KSBzd2l0Y2hfY29yZV9nZXRfdmFyaWFibGVzKHN3aXRjaF9ldmVu dF90ICoqZXZlbnQpCnsKCXN3aXRjaF9zdGF0dXNfdCBzdGF0dXM7Cglzd2l0Y2hfdGhyZWFkX3J3 bG9ja19yZGxvY2socnVudGltZS5nbG9iYWxfdmFyX3J3bG9jayk7CglzdGF0dXMgPSBzd2l0Y2hf ZXZlbnRfZHVwKGV2ZW50LCBydW50aW1lLmdsb2JhbF92YXJzKTsKCXN3aXRjaF90aHJlYWRfcnds b2NrX3VubG9jayhydW50aW1lLmdsb2JhbF92YXJfcndsb2NrKTsKCXJldHVybiBzdGF0dXM7Cn0K ClNXSVRDSF9ERUNMQVJFKGNoYXIgKikgc3dpdGNoX2NvcmVfZ2V0X3ZhcmlhYmxlKGNvbnN0IGNo YXIgKnZhcm5hbWUpCnsKCWNoYXIgKnZhbDsKCXN3aXRjaF90aHJlYWRfcndsb2NrX3JkbG9jayhy dW50aW1lLmdsb2JhbF92YXJfcndsb2NrKTsKCXZhbCA9IChjaGFyICopIHN3aXRjaF9ldmVudF9n ZXRfaGVhZGVyKHJ1bnRpbWUuZ2xvYmFsX3ZhcnMsIHZhcm5hbWUpOwoJc3dpdGNoX3RocmVhZF9y d2xvY2tfdW5sb2NrKHJ1bnRpbWUuZ2xvYmFsX3Zhcl9yd2xvY2spOwoJcmV0dXJuIHZhbDsKfQoK U1dJVENIX0RFQ0xBUkUoY2hhciAqKSBzd2l0Y2hfY29yZV9nZXRfdmFyaWFibGVfZHVwKGNvbnN0 IGNoYXIgKnZhcm5hbWUpCnsKCWNoYXIgKnZhbCA9IE5VTEwsICp2OwoKCWlmICh2YXJuYW1lKSB7 CgkJc3dpdGNoX3RocmVhZF9yd2xvY2tfcmRsb2NrKHJ1bnRpbWUuZ2xvYmFsX3Zhcl9yd2xvY2sp OwoJCWlmICgodiA9IChjaGFyICopIHN3aXRjaF9ldmVudF9nZXRfaGVhZGVyKHJ1bnRpbWUuZ2xv YmFsX3ZhcnMsIHZhcm5hbWUpKSkgewoJCQl2YWwgPSBzdHJkdXAodik7CgkJfQoJCXN3aXRjaF90 aHJlYWRfcndsb2NrX3VubG9jayhydW50aW1lLmdsb2JhbF92YXJfcndsb2NrKTsKCX0KCglyZXR1 cm4gdmFsOwp9CgpTV0lUQ0hfREVDTEFSRShjaGFyICopIHN3aXRjaF9jb3JlX2dldF92YXJpYWJs ZV9wZHVwKGNvbnN0IGNoYXIgKnZhcm5hbWUsIHN3aXRjaF9tZW1vcnlfcG9vbF90ICpwb29sKQp7 CgljaGFyICp2YWwgPSBOVUxMLCAqdjsKCglpZiAodmFybmFtZSkgewoJCXN3aXRjaF90aHJlYWRf cndsb2NrX3JkbG9jayhydW50aW1lLmdsb2JhbF92YXJfcndsb2NrKTsKCQlpZiAoKHYgPSAoY2hh ciAqKSBzd2l0Y2hfZXZlbnRfZ2V0X2hlYWRlcihydW50aW1lLmdsb2JhbF92YXJzLCB2YXJuYW1l KSkpIHsKCQkJdmFsID0gc3dpdGNoX2NvcmVfc3RyZHVwKHBvb2wsIHYpOwoJCX0KCQlzd2l0Y2hf dGhyZWFkX3J3bG9ja191bmxvY2socnVudGltZS5nbG9iYWxfdmFyX3J3bG9jayk7Cgl9CgoJcmV0 dXJuIHZhbDsKfQoKc3RhdGljIHZvaWQgc3dpdGNoX2NvcmVfdW5zZXRfdmFyaWFibGVzKHZvaWQp CnsKCXN3aXRjaF90aHJlYWRfcndsb2NrX3dybG9jayhydW50aW1lLmdsb2JhbF92YXJfcndsb2Nr KTsKCXN3aXRjaF9ldmVudF9kZXN0cm95KCZydW50aW1lLmdsb2JhbF92YXJzKTsKCXN3aXRjaF9l dmVudF9jcmVhdGVfcGxhaW4oJnJ1bnRpbWUuZ2xvYmFsX3ZhcnMsIFNXSVRDSF9FVkVOVF9DSEFO TkVMX0RBVEEpOwoJc3dpdGNoX3RocmVhZF9yd2xvY2tfdW5sb2NrKHJ1bnRpbWUuZ2xvYmFsX3Zh cl9yd2xvY2spOwp9CgpTV0lUQ0hfREVDTEFSRSh2b2lkKSBzd2l0Y2hfY29yZV9zZXRfdmFyaWFi bGUoY29uc3QgY2hhciAqdmFybmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCnsKCWNoYXIgKnZhbDsK CglpZiAodmFybmFtZSkgewoJCXN3aXRjaF90aHJlYWRfcndsb2NrX3dybG9jayhydW50aW1lLmds b2JhbF92YXJfcndsb2NrKTsKCQl2YWwgPSAoY2hhciAqKSBzd2l0Y2hfZXZlbnRfZ2V0X2hlYWRl cihydW50aW1lLmdsb2JhbF92YXJzLCB2YXJuYW1lKTsKCQlpZiAodmFsKSB7CgkJCXN3aXRjaF9l dmVudF9kZWxfaGVhZGVyKHJ1bnRpbWUuZ2xvYmFsX3ZhcnMsIHZhcm5hbWUpOwoJCX0KCQlpZiAo dmFsdWUpIHsKCQkJY2hhciAqdiA9IHN0cmR1cCh2YWx1ZSk7CgkJCXN3aXRjaF9zdHJpbmdfdmFy X2NoZWNrKHYsIFNXSVRDSF9UUlVFKTsKCQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5n KHJ1bnRpbWUuZ2xvYmFsX3ZhcnMsIFNXSVRDSF9TVEFDS19CT1RUT00gfCBTV0lUQ0hfU1RBQ0tf Tk9EVVAsIHZhcm5hbWUsIHYpOwoJCX0gZWxzZSB7CgkJCXN3aXRjaF9ldmVudF9kZWxfaGVhZGVy KHJ1bnRpbWUuZ2xvYmFsX3ZhcnMsIHZhcm5hbWUpOwoJCX0KCQlzd2l0Y2hfdGhyZWFkX3J3bG9j a191bmxvY2socnVudGltZS5nbG9iYWxfdmFyX3J3bG9jayk7Cgl9Cn0KClNXSVRDSF9ERUNMQVJF KHN3aXRjaF9ib29sX3QpIHN3aXRjaF9jb3JlX3NldF92YXJfY29uZGl0aW9uYWwoY29uc3QgY2hh ciAqdmFybmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKnZhbDIpCnsKCWNoYXIg KnZhbDsKCglpZiAodmFybmFtZSkgewoJCXN3aXRjaF90aHJlYWRfcndsb2NrX3dybG9jayhydW50 aW1lLmdsb2JhbF92YXJfcndsb2NrKTsKCQl2YWwgPSAoY2hhciAqKSBzd2l0Y2hfZXZlbnRfZ2V0 X2hlYWRlcihydW50aW1lLmdsb2JhbF92YXJzLCB2YXJuYW1lKTsKCgkJaWYgKHZhbCkgewoJCQlp ZiAoIXZhbDIgfHwgc3RyY21wKHZhbCwgdmFsMikgIT0gMCkgewoJCQkJc3dpdGNoX3RocmVhZF9y d2xvY2tfdW5sb2NrKHJ1bnRpbWUuZ2xvYmFsX3Zhcl9yd2xvY2spOwoJCQkJcmV0dXJuIFNXSVRD SF9GQUxTRTsKCQkJfQoJCQlzd2l0Y2hfZXZlbnRfZGVsX2hlYWRlcihydW50aW1lLmdsb2JhbF92 YXJzLCB2YXJuYW1lKTsKCQl9IGVsc2UgaWYgKCF6c3RyKHZhbDIpKSB7CgkJCXN3aXRjaF90aHJl YWRfcndsb2NrX3VubG9jayhydW50aW1lLmdsb2JhbF92YXJfcndsb2NrKTsKCQkJcmV0dXJuIFNX SVRDSF9GQUxTRTsKCQl9CgoJCWlmICh2YWx1ZSkgewoJCQljaGFyICp2ID0gc3RyZHVwKHZhbHVl KTsKCQkJc3dpdGNoX3N0cmluZ192YXJfY2hlY2sodiwgU1dJVENIX1RSVUUpOwoJCQlzd2l0Y2hf ZXZlbnRfYWRkX2hlYWRlcl9zdHJpbmcocnVudGltZS5nbG9iYWxfdmFycywgU1dJVENIX1NUQUNL X0JPVFRPTSB8IFNXSVRDSF9TVEFDS19OT0RVUCwgdmFybmFtZSwgdik7CgkJfSBlbHNlIHsKCQkJ c3dpdGNoX2V2ZW50X2RlbF9oZWFkZXIocnVudGltZS5nbG9iYWxfdmFycywgdmFybmFtZSk7CgkJ fQoJCXN3aXRjaF90aHJlYWRfcndsb2NrX3VubG9jayhydW50aW1lLmdsb2JhbF92YXJfcndsb2Nr KTsKCX0KCXJldHVybiBTV0lUQ0hfVFJVRTsKfQoKU1dJVENIX0RFQ0xBUkUoY2hhciAqKSBzd2l0 Y2hfY29yZV9nZXRfdXVpZCh2b2lkKQp7CglyZXR1cm4gcnVudGltZS51dWlkX3N0cjsKfQoKCnN0 YXRpYyB2b2lkICpTV0lUQ0hfVEhSRUFEX0ZVTkMgc3dpdGNoX2NvcmVfc2VydmljZV90aHJlYWQo c3dpdGNoX3RocmVhZF90ICp0aHJlYWQsIHZvaWQgKm9iaikKewoJc3dpdGNoX2NvcmVfc2Vzc2lv bl90ICpzZXNzaW9uID0gb2JqOwoJc3dpdGNoX2NoYW5uZWxfdCAqY2hhbm5lbDsKCXN3aXRjaF9m cmFtZV90ICpyZWFkX2ZyYW1lID0gTlVMTDsKCi8vICBzd2l0Y2hfYXNzZXJ0KHRocmVhZCAhPSBO VUxMKTsKLy8gIHN3aXRjaF9hc3NlcnQoc2Vzc2lvbiAhPSBOVUxMKTsKCglpZiAoc3dpdGNoX2Nv cmVfc2Vzc2lvbl9yZWFkX2xvY2soc2Vzc2lvbikgIT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7 CgkJcmV0dXJuIE5VTEw7Cgl9CgoJc3dpdGNoX211dGV4X2xvY2soc2Vzc2lvbi0+ZnJhbWVfcmVh ZF9tdXRleCk7CgoJY2hhbm5lbCA9IHN3aXRjaF9jb3JlX3Nlc3Npb25fZ2V0X2NoYW5uZWwoc2Vz c2lvbik7CgoJc3dpdGNoX2NoYW5uZWxfc2V0X2ZsYWcoY2hhbm5lbCwgQ0ZfU0VSVklDRSk7Cgl3 aGlsZSAoc3dpdGNoX2NoYW5uZWxfdGVzdF9mbGFnKGNoYW5uZWwsIENGX1NFUlZJQ0UpKSB7CgoJ CWlmIChzd2l0Y2hfY2hhbm5lbF90ZXN0X2ZsYWcoY2hhbm5lbCwgQ0ZfU0VSVklDRV9BVURJTykp IHsKCQkJc3dpdGNoIChzd2l0Y2hfY29yZV9zZXNzaW9uX3JlYWRfZnJhbWUoc2Vzc2lvbiwgJnJl YWRfZnJhbWUsIFNXSVRDSF9JT19GTEFHX05PTkUsIDApKSB7CgkJCWNhc2UgU1dJVENIX1NUQVRV U19TVUNDRVNTOgoJCQljYXNlIFNXSVRDSF9TVEFUVVNfVElNRU9VVDoKCQkJY2FzZSBTV0lUQ0hf U1RBVFVTX0JSRUFLOgoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlzd2l0Y2hfY2hhbm5lbF9j bGVhcl9mbGFnKGNoYW5uZWwsIENGX1NFUlZJQ0UpOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlm IChzd2l0Y2hfY2hhbm5lbF90ZXN0X2ZsYWcoY2hhbm5lbCwgQ0ZfU0VSVklDRV9WSURFTykgJiYg c3dpdGNoX2NoYW5uZWxfdGVzdF9mbGFnKGNoYW5uZWwsIENGX1ZJREVPKSkgewoJCQlzd2l0Y2gg KHN3aXRjaF9jb3JlX3Nlc3Npb25fcmVhZF92aWRlb19mcmFtZShzZXNzaW9uLCAmcmVhZF9mcmFt ZSwgU1dJVENIX0lPX0ZMQUdfTk9ORSwgMCkpIHsKCQkJY2FzZSBTV0lUQ0hfU1RBVFVTX1NVQ0NF U1M6CgkJCWNhc2UgU1dJVENIX1NUQVRVU19USU1FT1VUOgoJCQljYXNlIFNXSVRDSF9TVEFUVVNf QlJFQUs6CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXN3aXRjaF9jaGFubmVsX2NsZWFyX2Zs YWcoY2hhbm5lbCwgQ0ZfU0VSVklDRSk7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglzd2l0Y2hf bXV0ZXhfdW5sb2NrKHNlc3Npb24tPmZyYW1lX3JlYWRfbXV0ZXgpOwoKCXN3aXRjaF9jaGFubmVs X2NsZWFyX2ZsYWcoY2hhbm5lbCwgQ0ZfU0VSVklDRV9BVURJTyk7Cglzd2l0Y2hfY2hhbm5lbF9j bGVhcl9mbGFnKGNoYW5uZWwsIENGX1NFUlZJQ0VfVklERU8pOwoKCXN3aXRjaF9jb3JlX3Nlc3Np b25fcnd1bmxvY2soc2Vzc2lvbik7CgoJcmV0dXJuIE5VTEw7Cn0KCi8qIEVpdGhlciBhZGQgYSB0 aW1lb3V0IGhlcmUgb3IgbWFrZSBkYW1uIHN1cmUgdGhlIHRocmVhZCBjYW5ub3QgZ2V0IGh1bmcg c29tZWhvdyAobXkgcHJlZmVyZW5jZSkgKi8KU1dJVENIX0RFQ0xBUkUodm9pZCkgc3dpdGNoX2Nv cmVfdGhyZWFkX3Nlc3Npb25fZW5kKHN3aXRjaF9jb3JlX3Nlc3Npb25fdCAqc2Vzc2lvbikKewoJ c3dpdGNoX2NoYW5uZWxfdCAqY2hhbm5lbDsKCXN3aXRjaF9hc3NlcnQoc2Vzc2lvbik7CgoJY2hh bm5lbCA9IHN3aXRjaF9jb3JlX3Nlc3Npb25fZ2V0X2NoYW5uZWwoc2Vzc2lvbik7Cglzd2l0Y2hf YXNzZXJ0KGNoYW5uZWwpOwoKCXN3aXRjaF9jaGFubmVsX2NsZWFyX2ZsYWcoY2hhbm5lbCwgQ0Zf U0VSVklDRSk7Cglzd2l0Y2hfY2hhbm5lbF9jbGVhcl9mbGFnKGNoYW5uZWwsIENGX1NFUlZJQ0Vf QVVESU8pOwoJc3dpdGNoX2NoYW5uZWxfY2xlYXJfZmxhZyhjaGFubmVsLCBDRl9TRVJWSUNFX1ZJ REVPKTsKCglzd2l0Y2hfY29yZV9zZXNzaW9uX2tpbGxfY2hhbm5lbChzZXNzaW9uLCBTV0lUQ0hf U0lHX0JSRUFLKTsKCn0KClNXSVRDSF9ERUNMQVJFKHZvaWQpIHN3aXRjaF9jb3JlX3NlcnZpY2Vf c2Vzc2lvbl9hdihzd2l0Y2hfY29yZV9zZXNzaW9uX3QgKnNlc3Npb24sIHN3aXRjaF9ib29sX3Qg YXVkaW8sIHN3aXRjaF9ib29sX3QgdmlkZW8pCnsKCXN3aXRjaF9jaGFubmVsX3QgKmNoYW5uZWw7 Cglzd2l0Y2hfYXNzZXJ0KHNlc3Npb24pOwoKCWNoYW5uZWwgPSBzd2l0Y2hfY29yZV9zZXNzaW9u X2dldF9jaGFubmVsKHNlc3Npb24pOwoJc3dpdGNoX2Fzc2VydChjaGFubmVsKTsKCglpZiAoYXVk aW8pIHN3aXRjaF9jaGFubmVsX3NldF9mbGFnKGNoYW5uZWwsIENGX1NFUlZJQ0VfQVVESU8pOwoJ aWYgKHZpZGVvKSBzd2l0Y2hfY2hhbm5lbF9zZXRfZmxhZyhjaGFubmVsLCBDRl9TRVJWSUNFX1ZJ REVPKTsKCglzd2l0Y2hfY29yZV9zZXNzaW9uX2xhdW5jaF90aHJlYWQoc2Vzc2lvbiwgKHZvaWQg KigqKShzd2l0Y2hfdGhyZWFkX3QgKix2b2lkICopKXN3aXRjaF9jb3JlX3NlcnZpY2VfdGhyZWFk LCBzZXNzaW9uKTsKfQoKLyogVGhpcyBmdW5jdGlvbiBhYnN0cmFjdHMgdGhlIHRocmVhZCBjcmVh dGlvbiBmb3IgbW9kdWxlcyBieSBhbGxvd2luZyB5b3UgdG8gcGFzcyBhIGZ1bmN0aW9uIHB0ciBh bmQKICAgYSB2b2lkIG9iamVjdCBhbmQgdHJ1c3QgdGhhdCB0aGF0IHRoZSBmdW5jdGlvbiB3aWxs IGJlIHJ1biBpbiBhIHRocmVhZCB3aXRoIGFyZyAgVGhpcyBsZXRzCiAgIHlvdSByZXF1ZXN0IGFu ZCBhY3RpdmF0ZSBhIHRocmVhZCB3aXRob3V0IGdpdmluZyB1cCBhbnkga25vd2xlZGdlIGFib3V0 IHdoYXQgaXMgaW4gdGhlIHRocmVhZAogICBuZWl0aGVyIHRoZSBjb3JlIG5vciB0aGUgY2FsbGlu ZyBtb2R1bGUga25vdyBhbnl0aGluZyBhYm91dCBlYWNoIG90aGVyLgoKICAgVGhpcyB0aHJlYWQg aXMgZXhwZWN0ZWQgdG8gbmV2ZXIgZXhpdCB1bnRpbCB0aGUgYXBwbGljYXRpb24gZXhpdHMgc28g dGhlIGZ1bmMgaXMgcmVzcG9uc2libGUKICAgdG8gbWFrZSBzdXJlIHRoYXQgaXMgdGhlIGNhc2Uu CgogICBUaGUgdHlwaWNhbCB1c2UgZm9yIHRoaXMgaXMgc28gc3dpdGNoX2xvYWRhYmxlX21vZHVs ZS5jIGNhbiBzdGFydCB1cCBhIHRocmVhZCBmb3IgZWFjaCBtb2R1bGUKICAgcGFzc2luZyB0aGUg dGFibGUgb2YgbW9kdWxlIG1ldGhvZHMgYXMgYSBzZXNzaW9uIG9iaiBpbnRvIHRoZSBjb3JlIHdp dGhvdXQgYWN0dWFsbHkgYWxsb3dpbmcKICAgdGhlIGNvcmUgdG8gaGF2ZSBhbnkgY2x1ZSBhbmQg a2VlcGluZyBzd2l0Y2hfbG9hZGFibGVfbW9kdWxlLmMgZnJvbSBuZWVkaW5nIGFueSB0aHJlYWQg Y29kZS4KCiovCgpTV0lUQ0hfREVDTEFSRShzd2l0Y2hfdGhyZWFkX3QgKikgc3dpdGNoX2NvcmVf bGF1bmNoX3RocmVhZChzd2l0Y2hfdGhyZWFkX3N0YXJ0X3QgZnVuYywgdm9pZCAqb2JqLCBzd2l0 Y2hfbWVtb3J5X3Bvb2xfdCAqcG9vbCkKewoJc3dpdGNoX3RocmVhZF90ICp0aHJlYWQgPSBOVUxM OwoJc3dpdGNoX3RocmVhZGF0dHJfdCAqdGhkX2F0dHIgPSBOVUxMOwoJc3dpdGNoX2NvcmVfdGhy ZWFkX3Nlc3Npb25fdCAqdHM7CglpbnQgbXlwb29sOwoKCW15cG9vbCA9IHBvb2wgPyAwIDogMTsK CglpZiAoIXBvb2wgJiYgc3dpdGNoX2NvcmVfbmV3X21lbW9yeV9wb29sKCZwb29sKSAhPSBTV0lU Q0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9M T0csIFNXSVRDSF9MT0dfQ1JJVCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgcG9vbFxuIik7 CgkJcmV0dXJuIE5VTEw7Cgl9CgoJc3dpdGNoX3RocmVhZGF0dHJfY3JlYXRlKCZ0aGRfYXR0ciwg cG9vbCk7CgoJaWYgKCh0cyA9IHN3aXRjaF9jb3JlX2FsbG9jKHBvb2wsIHNpemVvZigqdHMpKSkg PT0gMCkgewoJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xP R19DUklULCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7Cgl9IGVsc2UgewoJCWlmICht eXBvb2wpIHsKCQkJdHMtPnBvb2wgPSBwb29sOwoJCX0KCQl0cy0+b2Jqc1swXSA9IG9iajsKCQl0 cy0+b2Jqc1sxXSA9IHRocmVhZDsKCQlzd2l0Y2hfdGhyZWFkYXR0cl9zdGFja3NpemVfc2V0KHRo ZF9hdHRyLCBTV0lUQ0hfVEhSRUFEX1NUQUNLU0laRSk7CgkJc3dpdGNoX3RocmVhZGF0dHJfcHJp b3JpdHlfc2V0KHRoZF9hdHRyLCBTV0lUQ0hfUFJJX1JFQUxUSU1FKTsKCQlzd2l0Y2hfdGhyZWFk X2NyZWF0ZSgmdGhyZWFkLCB0aGRfYXR0ciwgZnVuYywgdHMsIHBvb2wpOwoJfQoKCXJldHVybiB0 aHJlYWQ7Cn0KClNXSVRDSF9ERUNMQVJFKHZvaWQpIHN3aXRjaF9jb3JlX3NldF9nbG9iYWxzKHZv aWQpCnsKI2RlZmluZSBCVUZTSVpFIDEwMjQKI2lmZGVmIFdJTjMyCgljaGFyIGxwUGF0aEJ1ZmZl cltCVUZTSVpFXTsKCURXT1JEIGR3QnVmU2l6ZSA9IEJVRlNJWkU7CgljaGFyIGJhc2VfZGlyWzEw MjRdOwoJY2hhciAqbGFzdGJhY2tsYXNoOwoJY2hhciAqdG1wOwoKCUdldE1vZHVsZUZpbGVOYW1l KE5VTEwsIGJhc2VfZGlyLCBCVUZTSVpFKTsKCWxhc3RiYWNrbGFzaCA9IHN0cnJjaHIoYmFzZV9k aXIsICdcXCcpOwoJYmFzZV9kaXJbKGxhc3RiYWNrbGFzaCAtIGJhc2VfZGlyKV0gPSAnXDAnOwoJ Lyogc2V0IGJhc2VfZGlyIGFzIGN3ZCwgdG8gYmUgYWJsZSB0byB1c2UgcmVsYXRpdmUgcGF0aHMg aW4gc2NyaXB0aW5nIGxhbmd1YWdlcyAoZS5nLiBtb2RfbHVhKSB3aGVuIEZTIGlzIHJ1bm5pbmcg YXMgYSBzZXJ2aWNlIG9yIHdoaWxlIGRlYnVnZ2luZyBGUyB1c2luZyB2aXN1YWwgc3R1ZGlvICov CglTZXRDdXJyZW50RGlyZWN0b3J5KGJhc2VfZGlyKTsKCXRtcCA9IHN3aXRjaF9zdHJpbmdfcmVw bGFjZShiYXNlX2RpciwgIlxcIiwgIi8iKTsKCXN0cmNweShiYXNlX2RpciwgdG1wKTsKCWZyZWUo dG1wKTsKCiNlbHNlCgljaGFyIGJhc2VfZGlyWzEwMjRdID0gU1dJVENIX1BSRUZJWF9ESVI7CiNl bmRpZgoKCS8qIE9yZGVyIG9mIHByZWNlZGVuY2UgZm9yLCBlZywgcnVuZGlyOgoJICogICAtcnVu CgkgKiAgIC1iYXNlCgkgKiAgIC0td2l0aC1ydW5kaXIKCSAqICAgLS1wcmVmaXgKCSAqLwoKCWlm ICghU1dJVENIX0dMT0JBTF9kaXJzLm1vZF9kaXIgJiYgKFNXSVRDSF9HTE9CQUxfZGlycy5tb2Rf ZGlyID0gKGNoYXIgKikgbWFsbG9jKEJVRlNJWkUpKSkgewoJCWlmIChTV0lUQ0hfR0xPQkFMX2Rp cnMuYmFzZV9kaXIpCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMubW9kX2Rp ciwgQlVGU0laRSwgIiVzJXNtb2QiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIsIFNXSVRD SF9QQVRIX1NFUEFSQVRPUik7CgkJZWxzZQojaWZkZWYgU1dJVENIX01PRF9ESVIKCQkJc3dpdGNo X3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5tb2RfZGlyLCBCVUZTSVpFLCAiJXMiLCBTV0lU Q0hfTU9EX0RJUik7CiNlbHNlCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMu bW9kX2RpciwgQlVGU0laRSwgIiVzJXNtb2QiLCBiYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJB VE9SKTsKI2VuZGlmCgl9CgoJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMubGliX2RpciAmJiAoU1dJ VENIX0dMT0JBTF9kaXJzLmxpYl9kaXIgPSAoY2hhciAqKSBtYWxsb2MoQlVGU0laRSkpKSB7CgkJ aWYgKFNXSVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpcikKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRD SF9HTE9CQUxfZGlycy5saWJfZGlyLCBCVUZTSVpFLCAiJXMlc2xpYiIsIFNXSVRDSF9HTE9CQUxf ZGlycy5iYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SKTsKCQllbHNlCiNpZmRlZiBTV0lU Q0hfTElCX0RJUgoJCQlzd2l0Y2hfc25wcmludGYoU1dJVENIX0dMT0JBTF9kaXJzLmxpYl9kaXIs IEJVRlNJWkUsICIlcyIsIFNXSVRDSF9MSUJfRElSKTsKI2Vsc2UKCQkJc3dpdGNoX3NucHJpbnRm KFNXSVRDSF9HTE9CQUxfZGlycy5saWJfZGlyLCBCVUZTSVpFLCAiJXMlc2xpYiIsIGJhc2VfZGly LCBTV0lUQ0hfUEFUSF9TRVBBUkFUT1IpOwojZW5kaWYKCX0KCglpZiAoIVNXSVRDSF9HTE9CQUxf ZGlycy5jb25mX2RpciAmJiAoU1dJVENIX0dMT0JBTF9kaXJzLmNvbmZfZGlyID0gKGNoYXIgKikg bWFsbG9jKEJVRlNJWkUpKSkgewoJCWlmIChTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIpCgkJ CXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuY29uZl9kaXIsIEJVRlNJWkUsICIl cyVzY29uZiIsIFNXSVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJB VE9SKTsKCQllbHNlCiNpZmRlZiBTV0lUQ0hfQ09ORl9ESVIKCQkJc3dpdGNoX3NucHJpbnRmKFNX SVRDSF9HTE9CQUxfZGlycy5jb25mX2RpciwgQlVGU0laRSwgIiVzIiwgU1dJVENIX0NPTkZfRElS KTsKI2Vsc2UKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5jb25mX2Rpciwg QlVGU0laRSwgIiVzJXNjb25mIiwgYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CiNl bmRpZgoJfQoKCWlmICghU1dJVENIX0dMT0JBTF9kaXJzLmxvZ19kaXIgJiYgKFNXSVRDSF9HTE9C QUxfZGlycy5sb2dfZGlyID0gKGNoYXIgKikgbWFsbG9jKEJVRlNJWkUpKSkgewoJCWlmIChTV0lU Q0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIpCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFM X2RpcnMubG9nX2RpciwgQlVGU0laRSwgIiVzJXNsb2ciLCBTV0lUQ0hfR0xPQkFMX2RpcnMuYmFz ZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CgkJZWxzZQojaWZkZWYgU1dJVENIX0xPR19E SVIKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5sb2dfZGlyLCBCVUZTSVpF LCAiJXMiLCBTV0lUQ0hfTE9HX0RJUik7CiNlbHNlCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hf R0xPQkFMX2RpcnMubG9nX2RpciwgQlVGU0laRSwgIiVzJXNsb2ciLCBiYXNlX2RpciwgU1dJVENI X1BBVEhfU0VQQVJBVE9SKTsKI2VuZGlmCgl9CgoJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMucnVu X2RpciAmJiAoU1dJVENIX0dMT0JBTF9kaXJzLnJ1bl9kaXIgPSAoY2hhciAqKSBtYWxsb2MoQlVG U0laRSkpKSB7CgkJaWYgKFNXSVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpcikKCQkJc3dpdGNoX3Nu cHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5ydW5fZGlyLCBCVUZTSVpFLCAiJXMlc3J1biIsIFNX SVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SKTsKCQllbHNl CiNpZmRlZiBTV0lUQ0hfUlVOX0RJUgoJCQlzd2l0Y2hfc25wcmludGYoU1dJVENIX0dMT0JBTF9k aXJzLnJ1bl9kaXIsIEJVRlNJWkUsICIlcyIsIFNXSVRDSF9SVU5fRElSKTsKI2Vsc2UKCQkJc3dp dGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5ydW5fZGlyLCBCVUZTSVpFLCAiJXMlc3J1 biIsIGJhc2VfZGlyLCBTV0lUQ0hfUEFUSF9TRVBBUkFUT1IpOwojZW5kaWYKCX0KCglpZiAoIVNX SVRDSF9HTE9CQUxfZGlycy5yZWNvcmRpbmdzX2RpciAmJiAoU1dJVENIX0dMT0JBTF9kaXJzLnJl Y29yZGluZ3NfZGlyID0gKGNoYXIgKikgbWFsbG9jKEJVRlNJWkUpKSkgewoJCWlmIChTV0lUQ0hf R0xPQkFMX2RpcnMuYmFzZV9kaXIpCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2Rp cnMucmVjb3JkaW5nc19kaXIsIEJVRlNJWkUsICIlcyVzcmVjb3JkaW5ncyIsIFNXSVRDSF9HTE9C QUxfZGlycy5iYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SKTsKCQllbHNlCiNpZmRlZiBT V0lUQ0hfUkVDT1JESU5HU19ESVIKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGly cy5yZWNvcmRpbmdzX2RpciwgQlVGU0laRSwgIiVzIiwgU1dJVENIX1JFQ09SRElOR1NfRElSKTsK I2Vsc2UKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5yZWNvcmRpbmdzX2Rp ciwgQlVGU0laRSwgIiVzJXNyZWNvcmRpbmdzIiwgYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFS QVRPUik7CiNlbmRpZgoJfQoKCWlmICghU1dJVENIX0dMT0JBTF9kaXJzLnNvdW5kc19kaXIgJiYg KFNXSVRDSF9HTE9CQUxfZGlycy5zb3VuZHNfZGlyID0gKGNoYXIgKikgbWFsbG9jKEJVRlNJWkUp KSkgewoJCWlmIChTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIpCgkJCXN3aXRjaF9zbnByaW50 ZihTV0lUQ0hfR0xPQkFMX2RpcnMuc291bmRzX2RpciwgQlVGU0laRSwgIiVzJXNzb3VuZHMiLCBT V0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CgkJZWxz ZQojaWZkZWYgU1dJVENIX1NPVU5EU19ESVIKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9C QUxfZGlycy5zb3VuZHNfZGlyLCBCVUZTSVpFLCAiJXMiLCBTV0lUQ0hfU09VTkRTX0RJUik7CiNl bHNlCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuc291bmRzX2RpciwgQlVG U0laRSwgIiVzJXNzb3VuZHMiLCBiYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SKTsKI2Vu ZGlmCgl9CgoJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMuc3RvcmFnZV9kaXIgJiYgKFNXSVRDSF9H TE9CQUxfZGlycy5zdG9yYWdlX2RpciA9IChjaGFyICopIG1hbGxvYyhCVUZTSVpFKSkpIHsKCQlp ZiAoU1dJVENIX0dMT0JBTF9kaXJzLmJhc2VfZGlyKQoJCQlzd2l0Y2hfc25wcmludGYoU1dJVENI X0dMT0JBTF9kaXJzLnN0b3JhZ2VfZGlyLCBCVUZTSVpFLCAiJXMlc3N0b3JhZ2UiLCBTV0lUQ0hf R0xPQkFMX2RpcnMuYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CgkJZWxzZQojaWZk ZWYgU1dJVENIX1NUT1JBR0VfRElSCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2Rp cnMuc3RvcmFnZV9kaXIsIEJVRlNJWkUsICIlcyIsIFNXSVRDSF9TVE9SQUdFX0RJUik7CiNlbHNl CgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuc3RvcmFnZV9kaXIsIEJVRlNJ WkUsICIlcyVzc3RvcmFnZSIsIGJhc2VfZGlyLCBTV0lUQ0hfUEFUSF9TRVBBUkFUT1IpOwojZW5k aWYKCX0KCglpZiAoIVNXSVRDSF9HTE9CQUxfZGlycy5jYWNoZV9kaXIgJiYgKFNXSVRDSF9HTE9C QUxfZGlycy5jYWNoZV9kaXIgPSAoY2hhciAqKSBtYWxsb2MoQlVGU0laRSkpKSB7CgkJaWYgKFNX SVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpcikKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9C QUxfZGlycy5jYWNoZV9kaXIsIEJVRlNJWkUsICIlcyVzY2FjaGUiLCBTV0lUQ0hfR0xPQkFMX2Rp cnMuYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CgkJZWxzZQojaWZkZWYgU1dJVENI X0NBQ0hFX0RJUgoJCQlzd2l0Y2hfc25wcmludGYoU1dJVENIX0dMT0JBTF9kaXJzLmNhY2hlX2Rp ciwgQlVGU0laRSwgIiVzIiwgU1dJVENIX0NBQ0hFX0RJUik7CiNlbHNlCgkJCXN3aXRjaF9zbnBy aW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuY2FjaGVfZGlyLCBCVUZTSVpFLCAiJXMlc2NhY2hlIiwg YmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CiNlbmRpZgoJfQoKCWlmICghU1dJVENI X0dMT0JBTF9kaXJzLmRiX2RpciAmJiAoU1dJVENIX0dMT0JBTF9kaXJzLmRiX2RpciA9IChjaGFy ICopIG1hbGxvYyhCVUZTSVpFKSkpIHsKCQlpZiAoU1dJVENIX0dMT0JBTF9kaXJzLmJhc2VfZGly KQoJCQlzd2l0Y2hfc25wcmludGYoU1dJVENIX0dMT0JBTF9kaXJzLmRiX2RpciwgQlVGU0laRSwg IiVzJXNkYiIsIFNXSVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJB VE9SKTsKCQllbHNlCiNpZmRlZiBTV0lUQ0hfREJfRElSCgkJCXN3aXRjaF9zbnByaW50ZihTV0lU Q0hfR0xPQkFMX2RpcnMuZGJfZGlyLCBCVUZTSVpFLCAiJXMiLCBTV0lUQ0hfREJfRElSKTsKI2Vs c2UKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5kYl9kaXIsIEJVRlNJWkUs ICIlcyVzZGIiLCBiYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SKTsKI2VuZGlmCgl9CgoJ aWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMuc2NyaXB0X2RpciAmJiAoU1dJVENIX0dMT0JBTF9kaXJz LnNjcmlwdF9kaXIgPSAoY2hhciAqKSBtYWxsb2MoQlVGU0laRSkpKSB7CgkJaWYgKFNXSVRDSF9H TE9CQUxfZGlycy5iYXNlX2RpcikKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGly cy5zY3JpcHRfZGlyLCBCVUZTSVpFLCAiJXMlc3NjcmlwdHMiLCBTV0lUQ0hfR0xPQkFMX2RpcnMu YmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CgkJZWxzZQojaWZkZWYgU1dJVENIX1ND UklQVF9ESVIKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5zY3JpcHRfZGly LCBCVUZTSVpFLCAiJXMiLCBTV0lUQ0hfU0NSSVBUX0RJUik7CiNlbHNlCgkJCXN3aXRjaF9zbnBy aW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuc2NyaXB0X2RpciwgQlVGU0laRSwgIiVzJXNzY3JpcHRz IiwgYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CiNlbmRpZgoJfQoKCWlmICghU1dJ VENIX0dMT0JBTF9kaXJzLmh0ZG9jc19kaXIgJiYgKFNXSVRDSF9HTE9CQUxfZGlycy5odGRvY3Nf ZGlyID0gKGNoYXIgKikgbWFsbG9jKEJVRlNJWkUpKSkgewoJCWlmIChTV0lUQ0hfR0xPQkFMX2Rp cnMuYmFzZV9kaXIpCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuaHRkb2Nz X2RpciwgQlVGU0laRSwgIiVzJXNodGRvY3MiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIs IFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CgkJZWxzZQojaWZkZWYgU1dJVENIX0hURE9DU19ESVIK CQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5odGRvY3NfZGlyLCBCVUZTSVpF LCAiJXMiLCBTV0lUQ0hfSFRET0NTX0RJUik7CiNlbHNlCgkJCXN3aXRjaF9zbnByaW50ZihTV0lU Q0hfR0xPQkFMX2RpcnMuaHRkb2NzX2RpciwgQlVGU0laRSwgIiVzJXNodGRvY3MiLCBiYXNlX2Rp ciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SKTsKI2VuZGlmCgl9CgoJaWYgKCFTV0lUQ0hfR0xPQkFM X2RpcnMuZ3JhbW1hcl9kaXIgJiYgKFNXSVRDSF9HTE9CQUxfZGlycy5ncmFtbWFyX2RpciA9IChj aGFyICopIG1hbGxvYyhCVUZTSVpFKSkpIHsKCQlpZiAoU1dJVENIX0dMT0JBTF9kaXJzLmJhc2Vf ZGlyKQoJCQlzd2l0Y2hfc25wcmludGYoU1dJVENIX0dMT0JBTF9kaXJzLmdyYW1tYXJfZGlyLCBC VUZTSVpFLCAiJXMlc2dyYW1tYXIiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIsIFNXSVRD SF9QQVRIX1NFUEFSQVRPUik7CgkJZWxzZQojaWZkZWYgU1dJVENIX0dSQU1NQVJfRElSCgkJCXN3 aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuZ3JhbW1hcl9kaXIsIEJVRlNJWkUsICIl cyIsIFNXSVRDSF9HUkFNTUFSX0RJUik7CiNlbHNlCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hf R0xPQkFMX2RpcnMuZ3JhbW1hcl9kaXIsIEJVRlNJWkUsICIlcyVzZ3JhbW1hciIsIGJhc2VfZGly LCBTV0lUQ0hfUEFUSF9TRVBBUkFUT1IpOwojZW5kaWYKCX0KCglpZiAoIVNXSVRDSF9HTE9CQUxf ZGlycy5mb250c19kaXIgJiYgKFNXSVRDSF9HTE9CQUxfZGlycy5mb250c19kaXIgPSAoY2hhciAq KSBtYWxsb2MoQlVGU0laRSkpKSB7CgkJaWYgKFNXSVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpcikK CQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5mb250c19kaXIsIEJVRlNJWkUs ICIlcyVzZm9udHMiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NF UEFSQVRPUik7CgkJZWxzZQojaWZkZWYgU1dJVENIX0ZPTlRTX0RJUgoJCQlzd2l0Y2hfc25wcmlu dGYoU1dJVENIX0dMT0JBTF9kaXJzLmZvbnRzX2RpciwgQlVGU0laRSwgIiVzIiwgU1dJVENIX0ZP TlRTX0RJUik7CiNlbHNlCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuZm9u dHNfZGlyLCBCVUZTSVpFLCAiJXMlc2ZvbnRzIiwgYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFS QVRPUik7CiNlbmRpZgoJfQoKCWlmICghU1dJVENIX0dMT0JBTF9kaXJzLmltYWdlc19kaXIgJiYg KFNXSVRDSF9HTE9CQUxfZGlycy5pbWFnZXNfZGlyID0gKGNoYXIgKikgbWFsbG9jKEJVRlNJWkUp KSkgewoJCWlmIChTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIpCgkJCXN3aXRjaF9zbnByaW50 ZihTV0lUQ0hfR0xPQkFMX2RpcnMuaW1hZ2VzX2RpciwgQlVGU0laRSwgIiVzJXNpbWFnZXMiLCBT V0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIsIFNXSVRDSF9QQVRIX1NFUEFSQVRPUik7CgkJZWxz ZQojaWZkZWYgU1dJVENIX0lNQUdFU19ESVIKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9C QUxfZGlycy5pbWFnZXNfZGlyLCBCVUZTSVpFLCAiJXMiLCBTV0lUQ0hfSU1BR0VTX0RJUik7CiNl bHNlCgkJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuaW1hZ2VzX2RpciwgQlVG U0laRSwgIiVzJXNpbWFnZXMiLCBiYXNlX2RpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SKTsKI2Vu ZGlmCgl9CgoJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMuZGF0YV9kaXIgJiYgKFNXSVRDSF9HTE9C QUxfZGlycy5kYXRhX2RpciA9IChjaGFyICopIG1hbGxvYyhCVUZTSVpFKSkpIHsKCQlpZiAoU1dJ VENIX0dMT0JBTF9kaXJzLmJhc2VfZGlyKQoJCQlzd2l0Y2hfc25wcmludGYoU1dJVENIX0dMT0JB TF9kaXJzLmRhdGFfZGlyLCBCVUZTSVpFLCAiJXMiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9k aXIpOwoJCWVsc2UKI2lmZGVmIFNXSVRDSF9EQVRBX0RJUgoJCQlzd2l0Y2hfc25wcmludGYoU1dJ VENIX0dMT0JBTF9kaXJzLmRhdGFfZGlyLCBCVUZTSVpFLCAiJXMiLCBTV0lUQ0hfREFUQV9ESVIp OwojZWxzZQoJCQlzd2l0Y2hfc25wcmludGYoU1dJVENIX0dMT0JBTF9kaXJzLmRhdGFfZGlyLCBC VUZTSVpFLCAiJXMiLCBiYXNlX2Rpcik7CiNlbmRpZgoJfQoKCWlmICghU1dJVENIX0dMT0JBTF9k aXJzLmxvY2Fsc3RhdGVfZGlyICYmIChTV0lUQ0hfR0xPQkFMX2RpcnMubG9jYWxzdGF0ZV9kaXIg PSAoY2hhciAqKSBtYWxsb2MoQlVGU0laRSkpKSB7CgkJaWYgKFNXSVRDSF9HTE9CQUxfZGlycy5i YXNlX2RpcikKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5sb2NhbHN0YXRl X2RpciwgQlVGU0laRSwgIiVzIiwgU1dJVENIX0dMT0JBTF9kaXJzLmJhc2VfZGlyKTsKCQllbHNl CiNpZmRlZiBTV0lUQ0hfTE9DQUxTVEFURV9ESVIKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9H TE9CQUxfZGlycy5sb2NhbHN0YXRlX2RpciwgQlVGU0laRSwgIiVzIiwgU1dJVENIX0xPQ0FMU1RB VEVfRElSKTsKI2Vsc2UKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5sb2Nh bHN0YXRlX2RpciwgQlVGU0laRSwgIiVzIiwgYmFzZV9kaXIpOwojZW5kaWYKCX0KCglpZiAoIVNX SVRDSF9HTE9CQUxfZGlycy5jZXJ0c19kaXIgJiYgKFNXSVRDSF9HTE9CQUxfZGlycy5jZXJ0c19k aXIgPSAoY2hhciAqKSBtYWxsb2MoQlVGU0laRSkpKSB7CgkJaWYgKFNXSVRDSF9HTE9CQUxfZGly cy5iYXNlX2RpcikKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9CQUxfZGlycy5jZXJ0c19k aXIsIEJVRlNJWkUsICIlcyVzY2VydCIsIFNXSVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpciwgU1dJ VENIX1BBVEhfU0VQQVJBVE9SKTsKCQllbHNlCiNpZmRlZiBTV0lUQ0hfQ0VSVFNfRElSCgkJCXN3 aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuY2VydHNfZGlyLCBCVUZTSVpFLCAiJXMi LCBTV0lUQ0hfQ0VSVFNfRElSKTsKI2Vsc2UKCQkJc3dpdGNoX3NucHJpbnRmKFNXSVRDSF9HTE9C QUxfZGlycy5jZXJ0c19kaXIsIEJVRlNJWkUsICIlcyVzY2VydCIsIGJhc2VfZGlyLCBTV0lUQ0hf UEFUSF9TRVBBUkFUT1IpOwojZW5kaWYKCX0KCglpZiAoIVNXSVRDSF9HTE9CQUxfZGlycy50ZW1w X2RpciAmJiAoU1dJVENIX0dMT0JBTF9kaXJzLnRlbXBfZGlyID0gKGNoYXIgKikgbWFsbG9jKEJV RlNJWkUpKSkgewojaWZkZWYgU1dJVENIX1RFTVBfRElSCgkJc3dpdGNoX3NucHJpbnRmKFNXSVRD SF9HTE9CQUxfZGlycy50ZW1wX2RpciwgQlVGU0laRSwgIiVzIiwgU1dJVENIX1RFTVBfRElSKTsK I2Vsc2UKI2lmZGVmIFdJTjMyCgkJR2V0VGVtcFBhdGgoZHdCdWZTaXplLCBscFBhdGhCdWZmZXIp OwoJCWxwUGF0aEJ1ZmZlcltzdHJsZW4obHBQYXRoQnVmZmVyKS0xXSA9IDA7CgkJdG1wID0gc3dp dGNoX3N0cmluZ19yZXBsYWNlKGxwUGF0aEJ1ZmZlciwgIlxcIiwgIi8iKTsKCQlzdHJjcHkobHBQ YXRoQnVmZmVyLCB0bXApOwoJCWZyZWUodG1wKTsKCQlzd2l0Y2hfc25wcmludGYoU1dJVENIX0dM T0JBTF9kaXJzLnRlbXBfZGlyLCBCVUZTSVpFLCAiJXMiLCBscFBhdGhCdWZmZXIpOwojZWxzZQoJ CXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMudGVtcF9kaXIsIEJVRlNJWkUsICIl cyIsICIvdG1wIik7CiNlbmRpZgojZW5kaWYKCX0KCglpZiAoIVNXSVRDSF9HTE9CQUxfZmlsZW5h bWVzLmNvbmZfbmFtZSAmJiAoU1dJVENIX0dMT0JBTF9maWxlbmFtZXMuY29uZl9uYW1lID0gKGNo YXIgKikgbWFsbG9jKEJVRlNJWkUpKSkgewoJCXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFM X2ZpbGVuYW1lcy5jb25mX25hbWUsIEJVRlNJWkUsICIlcyIsICJmcmVlc3dpdGNoLnhtbCIpOwoJ fQoKCS8qIERvIHRoaXMgbGFzdCBiZWNhdXNlIGl0IGJlaW5nIGVtcHR5IGlzIHBhcnQgb2YgdGhl IGFib3ZlIGxvZ2ljICovCglpZiAoIVNXSVRDSF9HTE9CQUxfZGlycy5iYXNlX2RpciAmJiAoU1dJ VENIX0dMT0JBTF9kaXJzLmJhc2VfZGlyID0gKGNoYXIgKikgbWFsbG9jKEJVRlNJWkUpKSkgewoJ CXN3aXRjaF9zbnByaW50ZihTV0lUQ0hfR0xPQkFMX2RpcnMuYmFzZV9kaXIsIEJVRlNJWkUsICIl cyIsIGJhc2VfZGlyKTsKCX0KCglzd2l0Y2hfYXNzZXJ0KFNXSVRDSF9HTE9CQUxfZGlycy5iYXNl X2Rpcik7Cglzd2l0Y2hfYXNzZXJ0KFNXSVRDSF9HTE9CQUxfZGlycy5tb2RfZGlyKTsKCXN3aXRj aF9hc3NlcnQoU1dJVENIX0dMT0JBTF9kaXJzLmxpYl9kaXIpOwoJc3dpdGNoX2Fzc2VydChTV0lU Q0hfR0xPQkFMX2RpcnMuY29uZl9kaXIpOwoJc3dpdGNoX2Fzc2VydChTV0lUQ0hfR0xPQkFMX2Rp cnMubG9nX2Rpcik7Cglzd2l0Y2hfYXNzZXJ0KFNXSVRDSF9HTE9CQUxfZGlycy5ydW5fZGlyKTsK CXN3aXRjaF9hc3NlcnQoU1dJVENIX0dMT0JBTF9kaXJzLmRiX2Rpcik7Cglzd2l0Y2hfYXNzZXJ0 KFNXSVRDSF9HTE9CQUxfZGlycy5zY3JpcHRfZGlyKTsKCXN3aXRjaF9hc3NlcnQoU1dJVENIX0dM T0JBTF9kaXJzLmh0ZG9jc19kaXIpOwoJc3dpdGNoX2Fzc2VydChTV0lUQ0hfR0xPQkFMX2RpcnMu Z3JhbW1hcl9kaXIpOwoJc3dpdGNoX2Fzc2VydChTV0lUQ0hfR0xPQkFMX2RpcnMuZm9udHNfZGly KTsKCXN3aXRjaF9hc3NlcnQoU1dJVENIX0dMT0JBTF9kaXJzLmltYWdlc19kaXIpOwoJc3dpdGNo X2Fzc2VydChTV0lUQ0hfR0xPQkFMX2RpcnMucmVjb3JkaW5nc19kaXIpOwoJc3dpdGNoX2Fzc2Vy dChTV0lUQ0hfR0xPQkFMX2RpcnMuc291bmRzX2Rpcik7Cglzd2l0Y2hfYXNzZXJ0KFNXSVRDSF9H TE9CQUxfZGlycy5jZXJ0c19kaXIpOwoJc3dpdGNoX2Fzc2VydChTV0lUQ0hfR0xPQkFMX2RpcnMu dGVtcF9kaXIpOwoJc3dpdGNoX2Fzc2VydChTV0lUQ0hfR0xPQkFMX2RpcnMuZGF0YV9kaXIpOwoJ c3dpdGNoX2Fzc2VydChTV0lUQ0hfR0xPQkFMX2RpcnMubG9jYWxzdGF0ZV9kaXIpOwoKCXN3aXRj aF9hc3NlcnQoU1dJVENIX0dMT0JBTF9maWxlbmFtZXMuY29uZl9uYW1lKTsKfQoKClNXSVRDSF9E RUNMQVJFKGludDMyX3QpIHN3aXRjaF9jb3JlX3NldF9wcm9jZXNzX3ByaXZpbGVnZXModm9pZCkK ewojaWZkZWYgU09MQVJJU19QUklWSUxFR0VTCglwcml2X3NldF90ICpiYXNpY3NldDsKCgkvKiBt YWtlIHRoZSBwcm9jZXNzIHByaXZpbGVnZS1hd2FyZSAqLwoJc2V0cGZsYWdzKFBSSVZfQVdBUkUs IDEpOwoKCS8qIHJlc2V0IHRoZSBwcml2aWxlZ2VzIHRvIGJhc2ljICovCgliYXNpY3NldCA9IHBy aXZfc3RyX3RvX3NldCgiYmFzaWMiLCAiLCIsIE5VTEwpOwoJaWYgKHNldHBwcml2KFBSSVZfU0VU LCBQUklWX0VGRkVDVElWRSwgYmFzaWNzZXQpICE9IDApIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkVS Uk9SOiBGYWlsZWQgdG8gYWNxdWlyZSBiYXNpYyBwcml2aWxlZ2VzICglcylcbiIsIHN0cmVycm9y KGVycm5vKSk7Cgl9CgoJLyogd2UgbmVlZCBoaWdoLXJlc29sdXRpb24gY2xvY2ssIGFuZCB0aGlz IHJlcXVpcmVzIGEgbm9uLWJhc2ljIHByaXZpbGVnZSAqLwoJaWYgKHByaXZfc2V0KFBSSVZfT04s IFBSSVZfRUZGRUNUSVZFLCBQUklWX1BST0NfQ0xPQ0tfSElHSFJFUywgTlVMTCkgPCAwKSB7CgkJ ZnByaW50ZihzdGRlcnIsICJFUlJPUjogRmFpbGVkIHRvIGFjcXVpcmUgcHJvY19jbG9ja19oaWdo cmVzIHByaXZpbGVnZSAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOwoJCXJldHVybiAtMTsKCX0K CgkvKiBuZWVkIHRoaXMgZm9yIHNldHJsaW1pdCAqLwoJaWYgKHByaXZfc2V0KFBSSVZfT04sIFBS SVZfRUZGRUNUSVZFLCBQUklWX1NZU19SRVNPVVJDRSwgTlVMTCkgPCAwKSB7CgkJZnByaW50Zihz dGRlcnIsICJFUlJPUjogRmFpbGVkIHRvIGFjcXVpcmUgc3lzX3Jlc291cmNlIHByaXZpbGVnZSAo JXMpXG4iLCBzdHJlcnJvcihlcnJubykpOwoJCXJldHVybiAtMTsKCX0KCgkvKiB3ZSBuZWVkIHRv IHJlYWQgZGlyZWN0b3JpZXMgYmVsb25naW5nIHRvIG90aGVyIHVpZCAqLwoJaWYgKHByaXZfc2V0 KFBSSVZfT04sIFBSSVZfRUZGRUNUSVZFLCBQUklWX0ZJTEVfREFDX1NFQVJDSCwgTlVMTCkgPCAw KSB7CgkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogRmFpbGVkIHRvIGFjcXVpcmUgZmlsZV9kYWNf c2VhcmNoIHByaXZpbGVnZSAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOwoJCXJldHVybiAtMTsK CX0KI2VuZGlmCglyZXR1cm4gMDsKfQoKU1dJVENIX0RFQ0xBUkUoaW50MzJfdCkgc2V0X2xvd19w cmlvcml0eSh2b2lkKQp7CiNpZmRlZiBXSU4zMgoJcmV0dXJuIFNldFByaW9yaXR5Q2xhc3MoR2V0 Q3VycmVudFByb2Nlc3MoKSwgQkVMT1dfTk9STUFMX1BSSU9SSVRZX0NMQVNTKTsKI2Vsc2UKI2lm IGRlZmluZWQoVVNFX1NDSEVEX1NFVFNDSEVEVUxFUikgJiYgISBkZWZpbmVkKFNPTEFSSVNfUFJJ VklMRUdFUykKCS8qCgkgKiBUcnkgdG8gdXNlIGEgbm9ybWFsIHNjaGVkdWxlcgoJICovCglzdHJ1 Y3Qgc2NoZWRfcGFyYW0gc2NoZWQgPSB7IDAgfTsKCXNjaGVkLnNjaGVkX3ByaW9yaXR5ID0gMDsK CWlmIChzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfT1RIRVIsICZzY2hlZCkgPCAwKSB7CgkJ ZnByaW50ZihzdGRlcnIsICJFUlJPUjogRmFpbGVkIHRvIHNldCBTQ0hFRF9PVEhFUiBzY2hlZHVs ZXIgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKCQlyZXR1cm4gLTE7Cgl9CiNlbmRpZgoKI2lm ZGVmIEhBVkVfU0VUUFJJT1JJVFkKCS8qCgkgKiBzZXRwcmlvcml0eSgpIHdvcmtzIG9uIEZyZWVC U0QgKDYuMiksIG5pY2UoKSBkb2Vzbid0CgkgKi8KCWlmIChzZXRwcmlvcml0eShQUklPX1BST0NF U1MsIGdldHBpZCgpLCAxOSkgPCAwKSB7CgkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogQ291bGQg bm90IHNldCBuaWNlIGxldmVsXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CiNlbHNlCglpZiAobmljZSgx OSkgIT0gMTkpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBDb3VsZCBub3Qgc2V0IG5pY2Ug bGV2ZWxcbiIpOwoJCXJldHVybiAtMTsKCX0KI2VuZGlmCgoJcmV0dXJuIDA7CiNlbmRpZgp9CgpT V0lUQ0hfREVDTEFSRShpbnQzMl90KSBzZXRfcmVhbHRpbWVfcHJpb3JpdHkodm9pZCkKewojaWZk ZWYgV0lOMzIKCXJldHVybiBTZXRQcmlvcml0eUNsYXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIEhJ R0hfUFJJT1JJVFlfQ0xBU1MpOwojZWxzZQojaWZkZWYgVVNFX1NDSEVEX1NFVFNDSEVEVUxFUgoJ LyoKCSAqIFRyeSB0byB1c2UgYSByb3VuZC1yb2JpbiBzY2hlZHVsZXIKCSAqIHdpdGggYSBmYWxs YmFjayBpZiB0aGF0IGRvZXMgbm90IHdvcmsKCSAqLwoJc3RydWN0IHNjaGVkX3BhcmFtIHNjaGVk ID0geyAwIH07CglzY2hlZC5zY2hlZF9wcmlvcml0eSA9IFNXSVRDSF9QUklfTE9XOwojZW5kaWYK CiNpZmRlZiBTT0xBUklTX1BSSVZJTEVHRVMKCS8qIHJlcXVlc3QgdGhlIHByaXZpbGVnZXMgdG8g ZWxldmF0ZSB0aGUgcHJpb3JpdHkgKi8KCWlmIChwcml2X3NldChQUklWX09OLCBQUklWX0VGRkVD VElWRSwgUFJJVl9QUk9DX1BSSU9DTlRMLCBOVUxMKSA8IDApIHsKI2lmZGVmIFBSSVZfUFJPQ19Q UklPVVAKCQkvKiBmYWxsYmFjayB0byBQUklWX1BST0NfUFJJT1VQIG9uIFNtYXJ0T1MgKi8KCQlm cHJpbnRmKHN0ZGVyciwgIldBUk46IEZhaWxlZCB0byBhY3F1aXJlIHByb2NfcHJpb2NudGwgcHJp dmlsZWdlICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CgkJaWYgKHByaXZfc2V0KFBSSVZfT04s IFBSSVZfRUZGRUNUSVZFLCBQUklWX1BST0NfUFJJT1VQLCBOVUxMKSA8IDApIHsKCQkJZnByaW50 ZihzdGRlcnIsICJFUlJPUjogRmFpbGVkIHRvIGFjcXVpcmUgcHJvY19wcmlvdXAgcHJpdmlsZWdl ICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CgkJCXJldHVybiAtMTsKCQl9CiNlbHNlCgkJZnBy aW50ZihzdGRlcnIsICJFUlJPUjogRmFpbGVkIHRvIGFjcXVpcmUgcHJvY19wcmlvY250bCBwcml2 aWxlZ2UgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKCQlyZXR1cm4gLTE7CiNlbmRpZgoJfQoK CWlmIChzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfRklGTywgJnNjaGVkKSA8IDApIHsKCQlm cHJpbnRmKHN0ZGVyciwgIldBUk46IEZhaWxlZCB0byBzZXQgU0NIRURfRklGTyBzY2hlZHVsZXIg KCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKCX0gZWxzZSB7CgkJcmV0dXJuIDA7Cgl9CgoJaWYg KHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgLTEwKSA8IDApIHsKCQlmcHJpbnRmKHN0ZGVy ciwgIkVSUk9SOiBDb3VsZCBub3Qgc2V0IG5pY2UgbGV2ZWxcbiIpOwoJCXJldHVybiAtMTsKCX0K CglyZXR1cm4gMDsKI2Vsc2UKCiNpZmRlZiBVU0VfU0NIRURfU0VUU0NIRURVTEVSCglpZiAoc2No ZWRfc2V0c2NoZWR1bGVyKDAsIFNDSEVEX0ZJRk8sICZzY2hlZCkgPCAwKSB7CgkJZnByaW50Zihz dGRlcnIsICJFUlJPUjogRmFpbGVkIHRvIHNldCBTQ0hFRF9GSUZPIHNjaGVkdWxlciAoJXMpXG4i LCBzdHJlcnJvcihlcnJubykpOwoJCXNjaGVkLnNjaGVkX3ByaW9yaXR5ID0gMDsKCQlpZiAoc2No ZWRfc2V0c2NoZWR1bGVyKDAsIFNDSEVEX09USEVSLCAmc2NoZWQpIDwgMCApIHsKCQkJZnByaW50 ZihzdGRlcnIsICJFUlJPUjogRmFpbGVkIHRvIHNldCBTQ0hFRF9PVEhFUiBzY2hlZHVsZXIgKCVz KVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KI2VuZGlmCgojaWZk ZWYgSEFWRV9TRVRQUklPUklUWQoJLyoKCSAqIHNldHByaW9yaXR5KCkgd29ya3Mgb24gRnJlZUJT RCAoNi4yKSwgbmljZSgpIGRvZXNuJ3QKCSAqLwoJaWYgKHNldHByaW9yaXR5KFBSSU9fUFJPQ0VT UywgZ2V0cGlkKCksIC0xMCkgPCAwKSB7CgkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogQ291bGQg bm90IHNldCBuaWNlIGxldmVsXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CiNlbHNlCglpZiAobmljZSgt MTApICE9IC0xMCkgewoJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IENvdWxkIG5vdCBzZXQgbmlj ZSBsZXZlbFxuIik7CgkJcmV0dXJuIC0xOwoJfQojZW5kaWYKI2VuZGlmCglyZXR1cm4gMDsKI2Vu ZGlmCn0KClNXSVRDSF9ERUNMQVJFKHVpbnQzMl90KSBzd2l0Y2hfY29yZV9jcHVfY291bnQodm9p ZCkKewoJcmV0dXJuIHJ1bnRpbWUuY3B1X2NvdW50Owp9CgpTV0lUQ0hfREVDTEFSRShpbnQzMl90 KSBzZXRfbm9ybWFsX3ByaW9yaXR5KHZvaWQpCnsKCXJldHVybiAwOwp9CgpTV0lUQ0hfREVDTEFS RShpbnQzMl90KSBzZXRfYXV0b19wcmlvcml0eSh2b2lkKQp7CiNpZm5kZWYgV0lOMzIKCXJ1bnRp bWUuY3B1X2NvdW50ID0gc3lzY29uZiAoX1NDX05QUk9DRVNTT1JTX09OTE4pOwojZWxzZQoJU1lT VEVNX0lORk8gc3lzaW5mbzsKCUdldFN5c3RlbUluZm8oICZzeXNpbmZvICk7CglydW50aW1lLmNw dV9jb3VudCA9IHN5c2luZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CiNlbmRpZgoKCWlmICghcnVu dGltZS5jcHVfY291bnQpIHJ1bnRpbWUuY3B1X2NvdW50ID0gMTsKCglyZXR1cm4gc2V0X3JlYWx0 aW1lX3ByaW9yaXR5KCk7CgoKCS8vIEVSUk9SOiBjb2RlIG5vdCByZWFjaGFibGUgb24gV2luZG93 cyBWaXN1YWwgU3R1ZGlvIEV4cHJlc3MgMjAwOCByZXR1cm4gMDsKfQoKU1dJVENIX0RFQ0xBUkUo aW50MzJfdCkgY2hhbmdlX3VzZXJfZ3JvdXAoY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAq Z3JvdXApCnsKI2lmbmRlZiBXSU4zMgoJdWlkX3QgcnVuYXNfdWlkID0gMDsKCWdpZF90IHJ1bmFz X2dpZCA9IDA7CglzdHJ1Y3QgcGFzc3dkICpydW5hc19wdyA9IE5VTEw7CgoJaWYgKHVzZXIpIHsK CQkvKgoJCSAqIExvb2t1cCB1c2VyIGluZm9ybWF0aW9uIGluIHRoZSBzeXN0ZW0ncyBkYgoJCSAq LwoJCXJ1bmFzX3B3ID0gZ2V0cHduYW0odXNlcik7CgkJaWYgKCFydW5hc19wdykgewoJCQlmcHJp bnRmKHN0ZGVyciwgIkVSUk9SOiBVbmtub3duIHVzZXIgXCIlc1wiXG4iLCB1c2VyKTsKCQkJcmV0 dXJuIC0xOwoJCX0KCQlydW5hc191aWQgPSBydW5hc19wdy0+cHdfdWlkOwoJfQoKCWlmIChncm91 cCkgewoJCXN0cnVjdCBncm91cCAqZ3IgPSBOVUxMOwoKCQkvKgoJCSAqIExvb2t1cCBncm91cCBp bmZvcm1hdGlvbiBpbiB0aGUgc3lzdGVtJ3MgZGIKCQkgKi8KCQlnciA9IGdldGdybmFtKGdyb3Vw KTsKCQlpZiAoIWdyKSB7CgkJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFVua25vd24gZ3JvdXAg XCIlc1wiXG4iLCBncm91cCk7CgkJCXJldHVybiAtMTsKCQl9CgkJcnVuYXNfZ2lkID0gZ3ItPmdy X2dpZDsKCX0KCglpZiAocnVuYXNfdWlkICYmIGdldHVpZCgpID09IHJ1bmFzX3VpZCAmJiAoIXJ1 bmFzX2dpZCB8fCBydW5hc19naWQgPT0gZ2V0Z2lkKCkpKSB7CgkJLyogYWxyZWFkeSBydW5uaW5n IGFzIHRoZSByaWdodCB1c2VyIGFuZCBncm91cCwgbm90aGluZyB0byBkbyEgKi8KCQlyZXR1cm4g MDsKCX0KCglpZiAocnVuYXNfdWlkKSB7CiNpZmRlZiBTT0xBUklTX1BSSVZJTEVHRVMKCQkvKiBy ZXF1ZXN0IHRoZSBwcml2aWxlZ2UgdG8gc2V0IHRoZSBVSUQgKi8KCQlpZiAocHJpdl9zZXQoUFJJ Vl9PTiwgUFJJVl9FRkZFQ1RJVkUsIFBSSVZfUFJPQ19TRVRJRCwgTlVMTCkgPCAwKSB7CgkJCWZw cmludGYoc3RkZXJyLCAiRVJST1I6IEZhaWxlZCB0byBhY3F1aXJlIHByb2Nfc2V0aWQgcHJpdmls ZWdlICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CgkJCXJldHVybiAtMTsKCQl9CiNlbmRpZgoj aWZkZWYgSEFWRV9TRVRHUk9VUFMKCQkvKgoJCSAqIERyb3AgYWxsIGdyb3VwIG1lbWJlcnNoaXBz IHByaW9yIHRvIGNoYW5naW5nIGFueXRoaW5nCgkJICogb3IgZWxzZSB3ZSdyZSBnb2luZyB0byBp bmhlcml0IHRoZSBwYXJlbnQncyBsaXN0IG9mIGdyb3VwcwoJCSAqICh3aGljaCBpcyBub3Qgd2hh dCB3ZSB3YW50Li4uKQoJCSAqLwoJCWlmIChzZXRncm91cHMoMCwgTlVMTCkgPCAwKSB7CgkJCWZw cmludGYoc3RkZXJyLCAiRVJST1I6IEZhaWxlZCB0byBkcm9wIGdyb3VwIGFjY2VzcyBsaXN0XG4i KTsKCQkJcmV0dXJuIC0xOwoJCX0KI2VuZGlmCgkJaWYgKHJ1bmFzX2dpZCkgewoJCQkvKgoJCQkg KiBBIGdyb3VwIGhhcyBiZWVuIHBhc3NlZCwgc3dpdGNoIHRvIGl0CgkJCSAqICh3aXRob3V0IGxv YWRpbmcgdGhlIHVzZXIncyBvdGhlciBncm91cHMpCgkJCSAqLwoJCQlpZiAoc2V0Z2lkKHJ1bmFz X2dpZCkgPCAwKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBGYWlsZWQgdG8gY2hhbmdl IGdpZCFcbiIpOwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfSBlbHNlIHsKCQkJLyoKCQkJICogTm8g Z3JvdXAgaGFzIGJlZW4gcGFzc2VkLCB1c2UgdGhlIHVzZXIncyBwcmltYXJ5IGdyb3VwIGluIHRo aXMgY2FzZQoJCQkgKi8KCQkJaWYgKHNldGdpZChydW5hc19wdy0+cHdfZ2lkKSA8IDApIHsKCQkJ CWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEZhaWxlZCB0byBjaGFuZ2UgZ2lkIVxuIik7CgkJCQly ZXR1cm4gLTE7CgkJCX0KI2lmZGVmIEhBVkVfSU5JVEdST1VQUwoJCQkvKgoJCQkgKiBTZXQgYWxs IHRoZSBvdGhlciBncm91cHMgdGhlIHVzZXIgaXMgYSBtZW1iZXIgb2YKCQkJICogKFRoaXMgY2Fu IGJlIHJlYWxseSB1c2VmdWwgZm9yIGZpbmUtZ3JhaW5lZCBhY2Nlc3MgY29udHJvbCkKCQkJICov CgkJCWlmIChpbml0Z3JvdXBzKHJ1bmFzX3B3LT5wd19uYW1lLCBydW5hc19wdy0+cHdfZ2lkKSA8 IDApIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEZhaWxlZCB0byBzZXQgZ3JvdXAgYWNj ZXNzIGxpc3QgZm9yIHVzZXJcbiIpOwoJCQkJcmV0dXJuIC0xOwoJCQl9CiNlbmRpZgoJCX0KCgkJ LyoKCQkgKiBGaW5hbGx5IGRyb3AgYWxsIHByaXZpbGVnZXMgYnkgc3dpdGNoaW5nIHRvIHRoZSBu ZXcgdXNlcmlkCgkJICovCgkJaWYgKHNldHVpZChydW5hc191aWQpIDwgMCkgewoJCQlmcHJpbnRm KHN0ZGVyciwgIkVSUk9SOiBGYWlsZWQgdG8gY2hhbmdlIHVpZCFcbiIpOwoJCQlyZXR1cm4gLTE7 CgkJfQojaWZkZWYgSEFWRV9TWVNfUFJDVExfSAoJCWlmIChwcmN0bChQUl9TRVRfRFVNUEFCTEUs IDEpIDwgMCkgewoJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBGYWlsZWQgdG8gZW5hYmxlIGNv cmUgZHVtcHMhXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KI2VuZGlmCgl9CiNlbmRpZgoJcmV0dXJu IDA7Cn0KClNXSVRDSF9ERUNMQVJFKHZvaWQpIHN3aXRjaF9jb3JlX3J1bnRpbWVfbG9vcChpbnQg YmcpCnsKI2lmZGVmIFdJTjMyCglIQU5ETEUgc2h1dGRvd25fZXZlbnQ7CgljaGFyIHBhdGhbMjU2 XSA9ICIiOwojZW5kaWYKCWlmIChiZykgewojaWZkZWYgV0lOMzIKCQlzd2l0Y2hfc25wcmludGYo cGF0aCwgc2l6ZW9mKHBhdGgpLCAiR2xvYmFsXFxGcmVlc3dpdGNoLiVkIiwgZ2V0cGlkKCkpOwoJ CXNodXRkb3duX2V2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBwYXRoKTsK CQlpZiAoc2h1dGRvd25fZXZlbnQpIHsKCQkJV2FpdEZvclNpbmdsZU9iamVjdChzaHV0ZG93bl9l dmVudCwgSU5GSU5JVEUpOwoJCX0KI2Vsc2UKCQl3aGlsZSAocnVudGltZS5ydW5uaW5nKSB7CgkJ CXN3aXRjaF95aWVsZCgxMDAwMDAwKTsKCQl9CiNlbmRpZgoJfSBlbHNlIHsKCQkvKiB3YWl0IGZv ciBjb25zb2xlIGlucHV0ICovCgkJc3dpdGNoX2NvbnNvbGVfbG9vcCgpOwoJfQp9CgpTV0lUQ0hf REVDTEFSRShjb25zdCBjaGFyICopIHN3aXRjaF9jb3JlX21pbWVfZXh0MnR5cGUoY29uc3QgY2hh ciAqZXh0KQp7CglpZiAoIWV4dCkgewoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIChjb25zdCBj aGFyICopIHN3aXRjaF9jb3JlX2hhc2hfZmluZChydW50aW1lLm1pbWVfdHlwZXMsIGV4dCk7Cn0K ClNXSVRDSF9ERUNMQVJFKGNvbnN0IGNoYXIgKikgc3dpdGNoX2NvcmVfbWltZV90eXBlMmV4dChj b25zdCBjaGFyICptaW1lKQp7CglpZiAoIW1pbWUpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCXJldHVy biAoY29uc3QgY2hhciAqKSBzd2l0Y2hfY29yZV9oYXNoX2ZpbmQocnVudGltZS5taW1lX3R5cGVf ZXh0cywgbWltZSk7Cn0KClNXSVRDSF9ERUNMQVJFKHN3aXRjaF9oYXNoX2luZGV4X3QgKikgc3dp dGNoX2NvcmVfbWltZV9pbmRleCh2b2lkKQp7CglyZXR1cm4gc3dpdGNoX2NvcmVfaGFzaF9maXJz dChydW50aW1lLm1pbWVfdHlwZXMpOwp9CgpTV0lUQ0hfREVDTEFSRShzd2l0Y2hfc3RhdHVzX3Qp IHN3aXRjaF9jb3JlX21pbWVfYWRkX3R5cGUoY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAq ZXh0KQp7CgljaGFyICpwdHlwZSA9IE5VTEw7CgljaGFyICpleHRfbGlzdCA9IE5VTEw7CglpbnQg YXJnYyA9IDA7CgljaGFyICphcmd2WzIwXSA9IHsgMCB9OwoJaW50IHg7Cglzd2l0Y2hfc3RhdHVz X3Qgc3RhdHVzID0gU1dJVENIX1NUQVRVU19GQUxTRTsKCglzd2l0Y2hfYXNzZXJ0KHR5cGUpOwoJ c3dpdGNoX2Fzc2VydChleHQpOwoKCXB0eXBlID0gc3dpdGNoX2NvcmVfcGVybWFuZW50X3N0cmR1 cCh0eXBlKTsKCWV4dF9saXN0ID0gc3RyZHVwKGV4dCk7CgoJc3dpdGNoX2Fzc2VydChleHRfbGlz dCk7CgoJLyogTWFwIGVhY2ggZmlsZSBleHRlbnNpb24gdG8gdGhpcyBNSU1FIHR5cGUgaWYgbm90 IGFscmVhZHkgbWFwcGVkLiAgTWFwIHRoZSBNSU1FIHR5cGUgdG8gdGhlIGZpcnN0IGZpbGUgZXh0 ZW5zaW9uIGluIHRoZSBsaXN0IGlmIG5vdCBhbHJlYWR5IG1hcHBlZC4gKi8KCWlmICgoYXJnYyA9 IHN3aXRjaF9zZXBhcmF0ZV9zdHJpbmcoZXh0X2xpc3QsICcgJywgYXJndiwgKHNpemVvZihhcmd2 KSAvIHNpemVvZihhcmd2WzBdKSkpKSkgewoJCWludCBpc19tYXBwZWRfdHlwZSA9IHN3aXRjaF9j b3JlX2hhc2hfZmluZChydW50aW1lLm1pbWVfdHlwZV9leHRzLCBwdHlwZSkgIT0gTlVMTDsKCQlm b3IgKHggPSAwOyB4IDwgYXJnYzsgeCsrKSB7CgkJCWlmIChhcmd2W3hdICYmIHB0eXBlKSB7CgkJ CQlpZiAoIXN3aXRjaF9jb3JlX2hhc2hfZmluZChydW50aW1lLm1pbWVfdHlwZXMsIGV4dCkpIHsK CQkJCQlzd2l0Y2hfY29yZV9oYXNoX2luc2VydChydW50aW1lLm1pbWVfdHlwZXMsIGFyZ3ZbeF0s IHB0eXBlKTsKCQkJCX0KCQkJCWlmICghaXNfbWFwcGVkX3R5cGUpIHsKCQkJCQlzd2l0Y2hfY29y ZV9oYXNoX2luc2VydChydW50aW1lLm1pbWVfdHlwZV9leHRzLCBwdHlwZSwgc3dpdGNoX2NvcmVf cGVybWFuZW50X3N0cmR1cChhcmd2W3hdKSk7CgkJCQkJaXNfbWFwcGVkX3R5cGUgPSAxOwoJCQkJ fQoJCQl9CgkJfQoKCQlzdGF0dXMgPSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1M7Cgl9CgoJZnJlZShl eHRfbGlzdCk7CgoJcmV0dXJuIHN0YXR1czsKfQoKc3RhdGljIHZvaWQgbG9hZF9taW1lX3R5cGVz KHZvaWQpCnsKCWNoYXIgKmNmID0gIm1pbWUudHlwZXMiOwoJRklMRSAqZmQgPSBOVUxMOwoJY2hh ciAqbGluZV9idWYgPSBOVUxMOwoJc3dpdGNoX3NpemVfdCBsbGVuID0gMDsKCWNoYXIgKm1pbWVf cGF0aCA9IE5VTEw7CgoJbWltZV9wYXRoID0gc3dpdGNoX21wcmludGYoIiVzLyVzIiwgU1dJVENI X0dMT0JBTF9kaXJzLmNvbmZfZGlyLCBjZik7Cglzd2l0Y2hfYXNzZXJ0KG1pbWVfcGF0aCk7CgoJ ZmQgPSBmb3BlbihtaW1lX3BhdGgsICJyYiIpOwoKCWlmIChmZCA9PSBOVUxMKSB7CgkJZ290byBl bmQ7Cgl9CgoJd2hpbGUgKChzd2l0Y2hfZnBfcmVhZF9kbGluZShmZCwgJmxpbmVfYnVmLCAmbGxl bikpKSB7CgkJY2hhciAqcDsKCQljaGFyICp0eXBlID0gbGluZV9idWY7CgoJCWlmICgqbGluZV9i dWYgPT0gJyMnKSB7CgkJCWNvbnRpbnVlOwoJCX0KCgkJaWYgKChwID0gc3RyY2hyKGxpbmVfYnVm LCAnXHInKSkgfHwgKHAgPSBzdHJjaHIobGluZV9idWYsICdcbicpKSkgewoJCQkqcCA9ICdcMCc7 CgkJfQoKCQlpZiAoKHAgPSBzdHJjaHIodHlwZSwgJ1x0JykpIHx8IChwID0gc3RyY2hyKHR5cGUs ICcgJykpKSB7CgkJCSpwKysgPSAnXDAnOwoKCQkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAn XHQnKSB7CgkJCQlwKys7CgkJCX0KCgkJCXN3aXRjaF9jb3JlX21pbWVfYWRkX3R5cGUodHlwZSwg cCk7CgkJfQoKCX0KCglzd2l0Y2hfc2FmZV9mcmVlKGxpbmVfYnVmKTsKCglpZiAoZmQpIHsKCQlm Y2xvc2UoZmQpOwoJCWZkID0gTlVMTDsKCX0KCiAgZW5kOgoKCXN3aXRjaF9zYWZlX2ZyZWUobWlt ZV9wYXRoKTsKCn0KClNXSVRDSF9ERUNMQVJFKHZvaWQpIHN3aXRjaF9jb3JlX3NldHJsaW1pdHMo dm9pZCkKewojaWZkZWYgSEFWRV9TRVRSTElNSVQKCXN0cnVjdCBybGltaXQgcmxwOwoKCS8qCgkg ICBTZXR0aW5nIHRoZSBzdGFjayBzaXplIG9uIEZyZWVCU0QgcmVzdWx0cyBpbiBhbiBpbnN0YW50 IGNyYXNoLgoKCSAgIElmIGFueW9uZSBrbm93cyBob3cgdG8gZml4IHRoaXMsCgkgICBmZWVsIGZy ZWUgdG8gc3VibWl0IGEgcGF0Y2ggdG8gaHR0cHM6Ly9mcmVlc3dpdGNoLm9yZy9qaXJhCgkgKi8K CiNpZm5kZWYgX19GcmVlQlNEX18KCW1lbXNldCgmcmxwLCAwLCBzaXplb2YocmxwKSk7CglybHAu cmxpbV9jdXIgPSBTV0lUQ0hfVEhSRUFEX1NUQUNLU0laRTsKCXJscC5ybGltX21heCA9IFNXSVRD SF9TWVNURU1fVEhSRUFEX1NUQUNLU0laRTsKCXNldHJsaW1pdChSTElNSVRfU1RBQ0ssICZybHAp OwojZW5kaWYKCgltZW1zZXQoJnJscCwgMCwgc2l6ZW9mKHJscCkpOwoJcmxwLnJsaW1fY3VyID0g OTk5OTk5OwoJcmxwLnJsaW1fbWF4ID0gOTk5OTk5OwoJc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUs ICZybHApOwoKCW1lbXNldCgmcmxwLCAwLCBzaXplb2YocmxwKSk7CglybHAucmxpbV9jdXIgPSBS TElNX0lORklOSVRZOwoJcmxwLnJsaW1fbWF4ID0gUkxJTV9JTkZJTklUWTsKCglzZXRybGltaXQo UkxJTUlUX0NQVSwgJnJscCk7CglzZXRybGltaXQoUkxJTUlUX0RBVEEsICZybHApOwoJc2V0cmxp bWl0KFJMSU1JVF9GU0laRSwgJnJscCk7CiNpZmRlZiBSTElNSVRfTlBST0MKCXNldHJsaW1pdChS TElNSVRfTlBST0MsICZybHApOwojZW5kaWYKI2lmZGVmIFJMSU1JVF9SVFBSSU8KCXNldHJsaW1p dChSTElNSVRfUlRQUklPLCAmcmxwKTsKI2VuZGlmCgojaWYgIWRlZmluZWQoX19PcGVuQlNEX18p ICYmICFkZWZpbmVkKF9fTmV0QlNEX18pCglzZXRybGltaXQoUkxJTUlUX0FTLCAmcmxwKTsKI2Vu ZGlmCiNlbmRpZgoJcmV0dXJuOwp9Cgp0eXBlZGVmIHN0cnVjdCB7Cglzd2l0Y2hfbWVtb3J5X3Bv b2xfdCAqcG9vbDsKCXN3aXRjaF9oYXNoX3QgKmhhc2g7Cn0gc3dpdGNoX2lwX2xpc3RfdDsKCnN0 YXRpYyBzd2l0Y2hfaXBfbGlzdF90IElQX0xJU1QgPSB7IDAgfTsKClNXSVRDSF9ERUNMQVJFKHN3 aXRjaF9ib29sX3QpIHN3aXRjaF9jaGVja19uZXR3b3JrX2xpc3RfaXBfdG9rZW4oY29uc3QgY2hh ciAqaXBfc3RyLCBjb25zdCBjaGFyICpsaXN0X25hbWUsIGNvbnN0IGNoYXIgKip0b2tlbikKewoJ c3dpdGNoX25ldHdvcmtfbGlzdF90ICpsaXN0OwoJaXBfdCAgaXAsIG1hc2ssIG5ldDsKCXVpbnQz Ml90IGJpdHM7CgljaGFyICppcHY2ID0gc3RyY2hyKGlwX3N0ciwnOicpOwoJc3dpdGNoX2Jvb2xf dCBvayA9IFNXSVRDSF9GQUxTRTsKCWNoYXIgKmlwdjQgPSBOVUxMOwoKCWlmICghbGlzdF9uYW1l KSB7CgkJcmV0dXJuIFNXSVRDSF9GQUxTRTsKCX0KCglpZiAoKGlwdjQgPSBzd2l0Y2hfbmV0d29y a19pcHY0X21hcHBlZF9pcHY2X2FkZHIoaXBfc3RyKSkpIHsKCQlpcF9zdHIgPSBpcHY0OwoJCWlw djYgPSBOVUxMOwoJfQoKCXN3aXRjaF9tdXRleF9sb2NrKHJ1bnRpbWUuZ2xvYmFsX211dGV4KTsK CWlmIChpcHY2KSB7CgkJc3dpdGNoX2luZXRfcHRvbihBRl9JTkVUNiwgaXBfc3RyLCAmaXApOwoJ fSBlbHNlIHsKCQlzd2l0Y2hfaW5ldF9wdG9uKEFGX0lORVQsIGlwX3N0ciwgJmlwKTsKCQlpcC52 NCA9IGh0b25sKGlwLnY0KTsKCX0KCglpZiAoKGxpc3QgPSBzd2l0Y2hfY29yZV9oYXNoX2ZpbmQo SVBfTElTVC5oYXNoLCBsaXN0X25hbWUpKSkgewoJCWlmIChpcHY2KSB7CgkJCW9rID0gc3dpdGNo X25ldHdvcmtfbGlzdF92YWxpZGF0ZV9pcDZfdG9rZW4obGlzdCwgaXAsIHRva2VuKTsKCQl9IGVs c2UgewoJCQlvayA9IHN3aXRjaF9uZXR3b3JrX2xpc3RfdmFsaWRhdGVfaXBfdG9rZW4obGlzdCwg aXAudjQsIHRva2VuKTsKCQl9Cgl9IGVsc2UgaWYgKHN0cmNocihsaXN0X25hbWUsICcvJykpIHsK CQlpZiAoc3RyY2hyKGxpc3RfbmFtZSwgJywnKSkgewoJCQljaGFyICpsaXN0X25hbWVfZHVwID0g c3RyZHVwKGxpc3RfbmFtZSk7CgkJCWNoYXIgKmFyZ3ZbMzJdOwoJCQlpbnQgYXJnYzsKCgkJCXN3 aXRjaF9hc3NlcnQobGlzdF9uYW1lX2R1cCk7CgoJCQlpZiAoKGFyZ2MgPSBzd2l0Y2hfc2VwYXJh dGVfc3RyaW5nKGxpc3RfbmFtZV9kdXAsICcsJywgYXJndiwgKHNpemVvZihhcmd2KSAvIHNpemVv Zihhcmd2WzBdKSkpKSkgewoJCQkJaW50IGk7CgkJCQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsr KSB7CgkJCQkJc3dpdGNoX3BhcnNlX2NpZHIoYXJndltpXSwgJm5ldCwgJm1hc2ssICZiaXRzKTsK CQkJCQlpZiAoaXB2NikgewoJCQkJCQlpZiAoKG9rID0gc3dpdGNoX3Rlc3R2Nl9zdWJuZXQoaXAs IG5ldCwgbWFzaykpKXsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJ aWYgKChvayA9IHN3aXRjaF90ZXN0X3N1Ym5ldChpcC52NCwgbmV0LnY0LCBtYXNrLnY0KSkpIHsK CQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWZyZWUobGlzdF9uYW1l X2R1cCk7CgkJfSBlbHNlIHsKCQkJc3dpdGNoX3BhcnNlX2NpZHIobGlzdF9uYW1lLCAmbmV0LCAm bWFzaywgJmJpdHMpOwoKCQkJaWYgKGlwdjYpIHsKCQkJCW9rID0gc3dpdGNoX3Rlc3R2Nl9zdWJu ZXQoaXAsIG5ldCwgbWFzayk7CgkJCX0gZWxzZSB7CgkJCQlvayA9IHN3aXRjaF90ZXN0X3N1Ym5l dChpcC52NCwgbmV0LnY0LCBtYXNrLnY0KTsKCQkJfQoJCX0KCX0KCglzd2l0Y2hfc2FmZV9mcmVl KGlwdjQpOwoJc3dpdGNoX211dGV4X3VubG9jayhydW50aW1lLmdsb2JhbF9tdXRleCk7CgoJcmV0 dXJuIG9rOwp9CgoKU1dJVENIX0RFQ0xBUkUodm9pZCkgc3dpdGNoX2xvYWRfbmV0d29ya19saXN0 cyhzd2l0Y2hfYm9vbF90IHJlbG9hZCkKewoJc3dpdGNoX3htbF90IHhtbCA9IE5VTEwsIHhfbGlz dHMgPSBOVUxMLCB4X2xpc3QgPSBOVUxMLCB4X25vZGUgPSBOVUxMLCBjZmcgPSBOVUxMOwoJc3dp dGNoX25ldHdvcmtfbGlzdF90ICpyZmNfbGlzdCwgKmxpc3Q7CgljaGFyIGd1ZXNzX2lwWzE2XSA9 ICIiOwoJaW50IG1hc2sgPSAwOwoJY2hhciBndWVzc19tYXNrWzE2XSA9ICIiOwoJY2hhciAqdG1w X25hbWU7CglzdHJ1Y3QgaW5fYWRkciBpbjsKCglzd2l0Y2hfZmluZF9sb2NhbF9pcChndWVzc19p cCwgc2l6ZW9mKGd1ZXNzX2lwKSwgJm1hc2ssIEFGX0lORVQpOwoJaW4uc19hZGRyID0gbWFzazsK CXN3aXRjaF9zZXRfc3RyaW5nKGd1ZXNzX21hc2ssIGluZXRfbnRvYShpbikpOwoKCXN3aXRjaF9t dXRleF9sb2NrKHJ1bnRpbWUuZ2xvYmFsX211dGV4KTsKCglpZiAoSVBfTElTVC5oYXNoKSB7CgkJ c3dpdGNoX2NvcmVfaGFzaF9kZXN0cm95KCZJUF9MSVNULmhhc2gpOwoJfQoKCWlmIChJUF9MSVNU LnBvb2wpIHsKCQlzd2l0Y2hfY29yZV9kZXN0cm95X21lbW9yeV9wb29sKCZJUF9MSVNULnBvb2wp OwoJfQoKCW1lbXNldCgmSVBfTElTVCwgMCwgc2l6ZW9mKElQX0xJU1QpKTsKCXN3aXRjaF9jb3Jl X25ld19tZW1vcnlfcG9vbCgmSVBfTElTVC5wb29sKTsKCXN3aXRjaF9jb3JlX2hhc2hfaW5pdCgm SVBfTElTVC5oYXNoKTsKCgoJdG1wX25hbWUgPSAicmZjNjU5OC5hdXRvIjsKCXN3aXRjaF9uZXR3 b3JrX2xpc3RfY3JlYXRlKCZyZmNfbGlzdCwgdG1wX25hbWUsIFNXSVRDSF9GQUxTRSwgSVBfTElT VC5wb29sKTsKCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xP R19OT1RJQ0UsICJDcmVhdGVkIGlwIGxpc3QgJXMgZGVmYXVsdCAoZGVueSlcbiIsIHRtcF9uYW1l KTsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2NpZHIocmZjX2xpc3QsICIxMDAuNjQuMC4wLzEw IiwgU1dJVENIX1RSVUUpOwoJc3dpdGNoX2NvcmVfaGFzaF9pbnNlcnQoSVBfTElTVC5oYXNoLCB0 bXBfbmFtZSwgcmZjX2xpc3QpOwoKCXRtcF9uYW1lID0gInJmYzE5MTguYXV0byI7Cglzd2l0Y2hf bmV0d29ya19saXN0X2NyZWF0ZSgmcmZjX2xpc3QsIHRtcF9uYW1lLCBTV0lUQ0hfRkFMU0UsIElQ X0xJU1QucG9vbCk7Cglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRD SF9MT0dfTk9USUNFLCAiQ3JlYXRlZCBpcCBsaXN0ICVzIGRlZmF1bHQgKGRlbnkpXG4iLCB0bXBf bmFtZSk7Cglzd2l0Y2hfbmV0d29ya19saXN0X2FkZF9jaWRyKHJmY19saXN0LCAiMTAuMC4wLjAv OCIsIFNXSVRDSF9UUlVFKTsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2NpZHIocmZjX2xpc3Qs ICIxNzIuMTYuMC4wLzEyIiwgU1dJVENIX1RSVUUpOwoJc3dpdGNoX25ldHdvcmtfbGlzdF9hZGRf Y2lkcihyZmNfbGlzdCwgIjE5Mi4xNjguMC4wLzE2IiwgU1dJVENIX1RSVUUpOwoJc3dpdGNoX25l dHdvcmtfbGlzdF9hZGRfY2lkcihyZmNfbGlzdCwgImZlODA6Oi8xMCIsIFNXSVRDSF9UUlVFKTsK CXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KElQX0xJU1QuaGFzaCwgdG1wX25hbWUsIHJmY19saXN0 KTsKCgl0bXBfbmFtZSA9ICJ3YW4uYXV0byI7Cglzd2l0Y2hfbmV0d29ya19saXN0X2NyZWF0ZSgm cmZjX2xpc3QsIHRtcF9uYW1lLCBTV0lUQ0hfVFJVRSwgSVBfTElTVC5wb29sKTsKCXN3aXRjaF9s b2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19OT1RJQ0UsICJDcmVhdGVk IGlwIGxpc3QgJXMgZGVmYXVsdCAoYWxsb3cpXG4iLCB0bXBfbmFtZSk7Cglzd2l0Y2hfbmV0d29y a19saXN0X2FkZF9jaWRyKHJmY19saXN0LCAiMC4wLjAuMC84IiwgU1dJVENIX0ZBTFNFKTsKCXN3 aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2NpZHIocmZjX2xpc3QsICIxMC4wLjAuMC84IiwgU1dJVENI X0ZBTFNFKTsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2NpZHIocmZjX2xpc3QsICIxNzIuMTYu MC4wLzEyIiwgU1dJVENIX0ZBTFNFKTsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2NpZHIocmZj X2xpc3QsICIxOTIuMTY4LjAuMC8xNiIsIFNXSVRDSF9GQUxTRSk7Cglzd2l0Y2hfbmV0d29ya19s aXN0X2FkZF9jaWRyKHJmY19saXN0LCAiMTY5LjI1NC4wLjAvMTYiLCBTV0lUQ0hfRkFMU0UpOwoJ c3dpdGNoX25ldHdvcmtfbGlzdF9hZGRfY2lkcihyZmNfbGlzdCwgImZlODA6Oi8xMCIsIFNXSVRD SF9GQUxTRSk7Cglzd2l0Y2hfY29yZV9oYXNoX2luc2VydChJUF9MSVNULmhhc2gsIHRtcF9uYW1l LCByZmNfbGlzdCk7CgoJdG1wX25hbWUgPSAid2FuX3Y2LmF1dG8iOwoJc3dpdGNoX25ldHdvcmtf bGlzdF9jcmVhdGUoJnJmY19saXN0LCB0bXBfbmFtZSwgU1dJVENIX1RSVUUsIElQX0xJU1QucG9v bCk7Cglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9U SUNFLCAiQ3JlYXRlZCBpcCBsaXN0ICVzIGRlZmF1bHQgKGFsbG93KVxuIiwgdG1wX25hbWUpOwoJ c3dpdGNoX25ldHdvcmtfbGlzdF9hZGRfY2lkcihyZmNfbGlzdCwgIjAuMC4wLjAvMCIsIFNXSVRD SF9GQUxTRSk7Cglzd2l0Y2hfbmV0d29ya19saXN0X2FkZF9jaWRyKHJmY19saXN0LCAiZmU4MDo6 LzEwIiwgU1dJVENIX0ZBTFNFKTsKCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KElQX0xJU1QuaGFz aCwgdG1wX25hbWUsIHJmY19saXN0KTsKCgoJdG1wX25hbWUgPSAid2FuX3Y0LmF1dG8iOwoJc3dp dGNoX25ldHdvcmtfbGlzdF9jcmVhdGUoJnJmY19saXN0LCB0bXBfbmFtZSwgU1dJVENIX1RSVUUs IElQX0xJU1QucG9vbCk7Cglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNX SVRDSF9MT0dfTk9USUNFLCAiQ3JlYXRlZCBpcCBsaXN0ICVzIGRlZmF1bHQgKGFsbG93KVxuIiwg dG1wX25hbWUpOwoJc3dpdGNoX25ldHdvcmtfbGlzdF9hZGRfY2lkcihyZmNfbGlzdCwgIjAuMC4w LjAvOCIsIFNXSVRDSF9GQUxTRSk7Cglzd2l0Y2hfbmV0d29ya19saXN0X2FkZF9jaWRyKHJmY19s aXN0LCAiMTAuMC4wLjAvOCIsIFNXSVRDSF9GQUxTRSk7Cglzd2l0Y2hfbmV0d29ya19saXN0X2Fk ZF9jaWRyKHJmY19saXN0LCAiMTcyLjE2LjAuMC8xMiIsIFNXSVRDSF9GQUxTRSk7Cglzd2l0Y2hf bmV0d29ya19saXN0X2FkZF9jaWRyKHJmY19saXN0LCAiMTkyLjE2OC4wLjAvMTYiLCBTV0lUQ0hf RkFMU0UpOwoJc3dpdGNoX25ldHdvcmtfbGlzdF9hZGRfY2lkcihyZmNfbGlzdCwgIjE2OS4yNTQu MC4wLzE2IiwgU1dJVENIX0ZBTFNFKTsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2NpZHIocmZj X2xpc3QsICI6Oi8wIiwgU1dJVENIX0ZBTFNFKTsKCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KElQ X0xJU1QuaGFzaCwgdG1wX25hbWUsIHJmY19saXN0KTsKCgoJdG1wX25hbWUgPSAiYW55X3Y2LmF1 dG8iOwoJc3dpdGNoX25ldHdvcmtfbGlzdF9jcmVhdGUoJnJmY19saXN0LCB0bXBfbmFtZSwgU1dJ VENIX1RSVUUsIElQX0xJU1QucG9vbCk7Cglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5F TF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLCAiQ3JlYXRlZCBpcCBsaXN0ICVzIGRlZmF1bHQgKGFs bG93KVxuIiwgdG1wX25hbWUpOwoJc3dpdGNoX25ldHdvcmtfbGlzdF9hZGRfY2lkcihyZmNfbGlz dCwgIjAuMC4wLjAvMCIsIFNXSVRDSF9GQUxTRSk7Cglzd2l0Y2hfY29yZV9oYXNoX2luc2VydChJ UF9MSVNULmhhc2gsIHRtcF9uYW1lLCByZmNfbGlzdCk7CgoKCXRtcF9uYW1lID0gImFueV92NC5h dXRvIjsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfY3JlYXRlKCZyZmNfbGlzdCwgdG1wX25hbWUsIFNX SVRDSF9UUlVFLCBJUF9MSVNULnBvb2wpOwoJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5O RUxfTE9HLCBTV0lUQ0hfTE9HX05PVElDRSwgIkNyZWF0ZWQgaXAgbGlzdCAlcyBkZWZhdWx0IChh bGxvdylcbiIsIHRtcF9uYW1lKTsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2NpZHIocmZjX2xp c3QsICI6Oi8wIiwgU1dJVENIX0ZBTFNFKTsKCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KElQX0xJ U1QuaGFzaCwgdG1wX25hbWUsIHJmY19saXN0KTsKCgoJdG1wX25hbWUgPSAibmF0LmF1dG8iOwoJ c3dpdGNoX25ldHdvcmtfbGlzdF9jcmVhdGUoJnJmY19saXN0LCB0bXBfbmFtZSwgU1dJVENIX0ZB TFNFLCBJUF9MSVNULnBvb2wpOwoJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9H LCBTV0lUQ0hfTE9HX05PVElDRSwgIkNyZWF0ZWQgaXAgbGlzdCAlcyBkZWZhdWx0IChkZW55KVxu IiwgdG1wX25hbWUpOwoJaWYgKHN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2hvc3RfbWFzayhyZmNf bGlzdCwgZ3Vlc3NfaXAsIGd1ZXNzX21hc2ssIFNXSVRDSF9GQUxTRSkgPT0gU1dJVENIX1NUQVRV U19TVUNDRVNTKSB7CgkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lU Q0hfTE9HX05PVElDRSwgIkFkZGluZyAlcy8lcyAoZGVueSkgdG8gbGlzdCAlc1xuIiwgZ3Vlc3Nf aXAsIGd1ZXNzX21hc2ssIHRtcF9uYW1lKTsKCX0KCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2Np ZHIocmZjX2xpc3QsICIxMC4wLjAuMC84IiwgU1dJVENIX1RSVUUpOwoJc3dpdGNoX25ldHdvcmtf bGlzdF9hZGRfY2lkcihyZmNfbGlzdCwgIjE3Mi4xNi4wLjAvMTIiLCBTV0lUQ0hfVFJVRSk7Cglz d2l0Y2hfbmV0d29ya19saXN0X2FkZF9jaWRyKHJmY19saXN0LCAiMTkyLjE2OC4wLjAvMTYiLCBT V0lUQ0hfVFJVRSk7Cglzd2l0Y2hfbmV0d29ya19saXN0X2FkZF9jaWRyKHJmY19saXN0LCAiMTAw LjY0LjAuMC8xMCIsIFNXSVRDSF9UUlVFKTsKCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KElQX0xJ U1QuaGFzaCwgdG1wX25hbWUsIHJmY19saXN0KTsKCgl0bXBfbmFtZSA9ICJsb29wYmFjay5hdXRv IjsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfY3JlYXRlKCZyZmNfbGlzdCwgdG1wX25hbWUsIFNXSVRD SF9GQUxTRSwgSVBfTElTVC5wb29sKTsKCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVM X0xPRywgU1dJVENIX0xPR19OT1RJQ0UsICJDcmVhdGVkIGlwIGxpc3QgJXMgZGVmYXVsdCAoZGVu eSlcbiIsIHRtcF9uYW1lKTsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2NpZHIocmZjX2xpc3Qs ICIxMjcuMC4wLjAvOCIsIFNXSVRDSF9UUlVFKTsKCXN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2Np ZHIocmZjX2xpc3QsICI6OjEvMTI4IiwgU1dJVENIX1RSVUUpOwoJc3dpdGNoX2NvcmVfaGFzaF9p bnNlcnQoSVBfTElTVC5oYXNoLCB0bXBfbmFtZSwgcmZjX2xpc3QpOwoKCXRtcF9uYW1lID0gImxv Y2FsbmV0LmF1dG8iOwoJc3dpdGNoX25ldHdvcmtfbGlzdF9jcmVhdGUoJmxpc3QsIHRtcF9uYW1l LCBTV0lUQ0hfRkFMU0UsIElQX0xJU1QucG9vbCk7Cglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hf Q0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9USUNFLCAiQ3JlYXRlZCBpcCBsaXN0ICVzIGRlZmF1 bHQgKGRlbnkpXG4iLCB0bXBfbmFtZSk7CgoJaWYgKHN3aXRjaF9uZXR3b3JrX2xpc3RfYWRkX2hv c3RfbWFzayhsaXN0LCBndWVzc19pcCwgZ3Vlc3NfbWFzaywgU1dJVENIX1RSVUUpID09IFNXSVRD SF9TVEFUVVNfU1VDQ0VTUykgewoJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xP RywgU1dJVENIX0xPR19OT1RJQ0UsICJBZGRpbmcgJXMvJXMgKGFsbG93KSB0byBsaXN0ICVzXG4i LCBndWVzc19pcCwgZ3Vlc3NfbWFzaywgdG1wX25hbWUpOwoJfQoJc3dpdGNoX2NvcmVfaGFzaF9p bnNlcnQoSVBfTElTVC5oYXNoLCB0bXBfbmFtZSwgbGlzdCk7CgoKCWlmICgoeG1sID0gc3dpdGNo X3htbF9vcGVuX2NmZygiYWNsLmNvbmYiLCAmY2ZnLCBOVUxMKSkpIHsKCQlpZiAoKHhfbGlzdHMg PSBzd2l0Y2hfeG1sX2NoaWxkKGNmZywgIm5ldHdvcmstbGlzdHMiKSkpIHsKCQkJZm9yICh4X2xp c3QgPSBzd2l0Y2hfeG1sX2NoaWxkKHhfbGlzdHMsICJsaXN0Iik7IHhfbGlzdDsgeF9saXN0ID0g eF9saXN0LT5uZXh0KSB7CgkJCQljb25zdCBjaGFyICpuYW1lID0gc3dpdGNoX3htbF9hdHRyKHhf bGlzdCwgIm5hbWUiKTsKCQkJCWNvbnN0IGNoYXIgKmRmdCA9IHN3aXRjaF94bWxfYXR0cih4X2xp c3QsICJkZWZhdWx0Iik7CgkJCQlzd2l0Y2hfYm9vbF90IGRlZmF1bHRfdHlwZSA9IFNXSVRDSF9U UlVFOwoKCQkJCWlmICh6c3RyKG5hbWUpKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJaWYg KGRmdCkgewoJCQkJCWRlZmF1bHRfdHlwZSA9IHN3aXRjaF90cnVlKGRmdCk7CgkJCQl9CgoJCQkJ aWYgKHN3aXRjaF9uZXR3b3JrX2xpc3RfY3JlYXRlKCZsaXN0LCBuYW1lLCBkZWZhdWx0X3R5cGUs IElQX0xJU1QucG9vbCkgIT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJYWJvcnQoKTsK CQkJCX0KCgkJCQlpZiAocmVsb2FkKSB7CgkJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NI QU5ORUxfTE9HLCBTV0lUQ0hfTE9HX05PVElDRSwgIkNyZWF0ZWQgaXAgbGlzdCAlcyBkZWZhdWx0 ICglcylcbiIsIG5hbWUsIGRlZmF1bHRfdHlwZSA/ICJhbGxvdyIgOiAiZGVueSIpOwoJCQkJfSBl bHNlIHsKCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9M T0dfQ09OU09MRSwgIkNyZWF0ZWQgaXAgbGlzdCAlcyBkZWZhdWx0ICglcylcbiIsIG5hbWUsIGRl ZmF1bHRfdHlwZSA/ICJhbGxvdyIgOiAiZGVueSIpOwoJCQkJfQoKCgkJCQlmb3IgKHhfbm9kZSA9 IHN3aXRjaF94bWxfY2hpbGQoeF9saXN0LCAibm9kZSIpOyB4X25vZGU7IHhfbm9kZSA9IHhfbm9k ZS0+bmV4dCkgewoJCQkJCWNvbnN0IGNoYXIgKmNpZHIgPSBOVUxMLCAqaG9zdCA9IE5VTEwsICpt YXNrID0gTlVMTCwgKmRvbWFpbiA9IE5VTEw7CgkJCQkJc3dpdGNoX2Jvb2xfdCBvayA9IGRlZmF1 bHRfdHlwZTsKCQkJCQljb25zdCBjaGFyICp0eXBlID0gc3dpdGNoX3htbF9hdHRyKHhfbm9kZSwg InR5cGUiKTsKCgkJCQkJaWYgKHR5cGUpIHsKCQkJCQkJb2sgPSBzd2l0Y2hfdHJ1ZSh0eXBlKTsK CQkJCQl9CgoJCQkJCWNpZHIgPSBzd2l0Y2hfeG1sX2F0dHIoeF9ub2RlLCAiY2lkciIpOwoJCQkJ CWhvc3QgPSBzd2l0Y2hfeG1sX2F0dHIoeF9ub2RlLCAiaG9zdCIpOwoJCQkJCW1hc2sgPSBzd2l0 Y2hfeG1sX2F0dHIoeF9ub2RlLCAibWFzayIpOwoJCQkJCWRvbWFpbiA9IHN3aXRjaF94bWxfYXR0 cih4X25vZGUsICJkb21haW4iKTsKCgkJCQkJaWYgKGRvbWFpbikgewoJCQkJCQlzd2l0Y2hfZXZl bnRfdCAqbXlfcGFyYW1zID0gTlVMTDsKCQkJCQkJc3dpdGNoX3htbF90IHhfZG9tYWluLCB4bWxf cm9vdDsKCQkJCQkJc3dpdGNoX3htbF90IGd0LCBndHMsIHV0LCB1dHM7CgoJCQkJCQlzd2l0Y2hf ZXZlbnRfY3JlYXRlKCZteV9wYXJhbXMsIFNXSVRDSF9FVkVOVF9HRU5FUkFMKTsKCQkJCQkJc3dp dGNoX2Fzc2VydChteV9wYXJhbXMpOwoJCQkJCQlzd2l0Y2hfZXZlbnRfYWRkX2hlYWRlcl9zdHJp bmcobXlfcGFyYW1zLCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAiZG9tYWluIiwgZG9tYWluKTsKCQkJ CQkJc3dpdGNoX2V2ZW50X2FkZF9oZWFkZXJfc3RyaW5nKG15X3BhcmFtcywgU1dJVENIX1NUQUNL X0JPVFRPTSwgInB1cnBvc2UiLCAibmV0d29yay1saXN0Iik7CgoJCQkJCQlpZiAoc3dpdGNoX3ht bF9sb2NhdGVfZG9tYWluKGRvbWFpbiwgbXlfcGFyYW1zLCAmeG1sX3Jvb3QsICZ4X2RvbWFpbikg IT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lU Q0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfV0FSTklORywgIkNhbm5vdCBsb2NhdGUgZG9tYWlu ICVzXG4iLCBkb21haW4pOwoJCQkJCQkJc3dpdGNoX2V2ZW50X2Rlc3Ryb3koJm15X3BhcmFtcyk7 CgkJCQkJCQljb250aW51ZTsKCQkJCQkJfQoKCQkJCQkJc3dpdGNoX2V2ZW50X2Rlc3Ryb3koJm15 X3BhcmFtcyk7CgoJCQkJCQlpZiAoKHV0ID0gc3dpdGNoX3htbF9jaGlsZCh4X2RvbWFpbiwgInVz ZXJzIikpKSB7CgkJCQkJCQl4X2RvbWFpbiA9IHV0OwoJCQkJCQl9CgoJCQkJCQlmb3IgKHV0ID0g c3dpdGNoX3htbF9jaGlsZCh4X2RvbWFpbiwgInVzZXIiKTsgdXQ7IHV0ID0gdXQtPm5leHQpIHsK CQkJCQkJCWNvbnN0IGNoYXIgKnVzZXJfY2lkciA9IHN3aXRjaF94bWxfYXR0cih1dCwgImNpZHIi KTsKCQkJCQkJCWNvbnN0IGNoYXIgKmlkID0gc3dpdGNoX3htbF9hdHRyKHV0LCAiaWQiKTsKCgkJ CQkJCQlpZiAoaWQgJiYgdXNlcl9jaWRyKSB7CgkJCQkJCQkJY2hhciAqdG9rZW4gPSBzd2l0Y2hf bXByaW50ZigiJXNAJXMiLCBpZCwgZG9tYWluKTsKCQkJCQkJCQlzd2l0Y2hfYXNzZXJ0KHRva2Vu KTsKCQkJCQkJCQlzd2l0Y2hfbmV0d29ya19saXN0X2FkZF9jaWRyX3Rva2VuKGxpc3QsIHVzZXJf Y2lkciwgb2ssIHRva2VuKTsKCQkJCQkJCQlmcmVlKHRva2VuKTsKCQkJCQkJCX0KCQkJCQkJfQoK CQkJCQkJZm9yIChndHMgPSBzd2l0Y2hfeG1sX2NoaWxkKHhfZG9tYWluLCAiZ3JvdXBzIik7IGd0 czsgZ3RzID0gZ3RzLT5uZXh0KSB7CgkJCQkJCQlmb3IgKGd0ID0gc3dpdGNoX3htbF9jaGlsZChn dHMsICJncm91cCIpOyBndDsgZ3QgPSBndC0+bmV4dCkgewoJCQkJCQkJCWZvciAodXRzID0gc3dp dGNoX3htbF9jaGlsZChndCwgInVzZXJzIik7IHV0czsgdXRzID0gdXRzLT5uZXh0KSB7CgkJCQkJ CQkJCWZvciAodXQgPSBzd2l0Y2hfeG1sX2NoaWxkKHV0cywgInVzZXIiKTsgdXQ7IHV0ID0gdXQt Pm5leHQpIHsKCQkJCQkJCQkJCWNvbnN0IGNoYXIgKnVzZXJfY2lkciA9IHN3aXRjaF94bWxfYXR0 cih1dCwgImNpZHIiKTsKCQkJCQkJCQkJCWNvbnN0IGNoYXIgKmlkID0gc3dpdGNoX3htbF9hdHRy KHV0LCAiaWQiKTsKCgkJCQkJCQkJCQlpZiAoaWQgJiYgdXNlcl9jaWRyKSB7CgkJCQkJCQkJCQkJ Y2hhciAqdG9rZW4gPSBzd2l0Y2hfbXByaW50ZigiJXNAJXMiLCBpZCwgZG9tYWluKTsKCQkJCQkJ CQkJCQlzd2l0Y2hfYXNzZXJ0KHRva2VuKTsKCQkJCQkJCQkJCQlzd2l0Y2hfbmV0d29ya19saXN0 X2FkZF9jaWRyX3Rva2VuKGxpc3QsIHVzZXJfY2lkciwgb2ssIHRva2VuKTsKCQkJCQkJCQkJCQlm cmVlKHRva2VuKTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJ CQkJfQoKCQkJCQkJc3dpdGNoX3htbF9mcmVlKHhtbF9yb290KTsKCQkJCQl9IGVsc2UgaWYgKGNp ZHIpIHsKCQkJCQkJc3dpdGNoX25ldHdvcmtfbGlzdF9hZGRfY2lkcihsaXN0LCBjaWRyLCBvayk7 CgkJCQkJfSBlbHNlIGlmIChob3N0ICYmIG1hc2spIHsKCQkJCQkJc3dpdGNoX25ldHdvcmtfbGlz dF9hZGRfaG9zdF9tYXNrKGxpc3QsIGhvc3QsIG1hc2ssIG9rKTsKCQkJCQl9CgoJCQkJCXN3aXRj aF9jb3JlX2hhc2hfaW5zZXJ0KElQX0xJU1QuaGFzaCwgbmFtZSwgbGlzdCk7CgkJCQl9CgkJCX0K CQl9CgoJCXN3aXRjaF94bWxfZnJlZSh4bWwpOwoJfQoKCXN3aXRjaF9tdXRleF91bmxvY2socnVu dGltZS5nbG9iYWxfbXV0ZXgpOwp9CgpTV0lUQ0hfREVDTEFSRSh1aW50MzJfdCkgc3dpdGNoX2Nv cmVfbWF4X2R0bWZfZHVyYXRpb24odWludDMyX3QgZHVyYXRpb24pCnsKCWlmIChkdXJhdGlvbikg ewoJCWlmIChkdXJhdGlvbiA+IFNXSVRDSF9NQVhfRFRNRl9EVVJBVElPTikgewoJCQlkdXJhdGlv biA9IFNXSVRDSF9NQVhfRFRNRl9EVVJBVElPTjsKCQl9CgkJaWYgKGR1cmF0aW9uIDwgU1dJVENI X01JTl9EVE1GX0RVUkFUSU9OKSB7CgkJCWR1cmF0aW9uID0gU1dJVENIX01JTl9EVE1GX0RVUkFU SU9OOwoJCX0KCQlydW50aW1lLm1heF9kdG1mX2R1cmF0aW9uID0gZHVyYXRpb247CgkJaWYgKGR1 cmF0aW9uIDwgcnVudGltZS5taW5fZHRtZl9kdXJhdGlvbikgewoJCQlydW50aW1lLm1pbl9kdG1m X2R1cmF0aW9uID0gZHVyYXRpb247CgkJfQoJfQoJcmV0dXJuIHJ1bnRpbWUubWF4X2R0bWZfZHVy YXRpb247Cn0KClNXSVRDSF9ERUNMQVJFKHVpbnQzMl90KSBzd2l0Y2hfY29yZV9kZWZhdWx0X2R0 bWZfZHVyYXRpb24odWludDMyX3QgZHVyYXRpb24pCnsKCWlmIChkdXJhdGlvbikgewoJCWlmIChk dXJhdGlvbiA8IFNXSVRDSF9NSU5fRFRNRl9EVVJBVElPTikgewoJCQlkdXJhdGlvbiA9IFNXSVRD SF9NSU5fRFRNRl9EVVJBVElPTjsKCQl9CgkJaWYgKGR1cmF0aW9uID4gU1dJVENIX01BWF9EVE1G X0RVUkFUSU9OKSB7CgkJCWR1cmF0aW9uID0gU1dJVENIX01BWF9EVE1GX0RVUkFUSU9OOwoJCX0K CQlydW50aW1lLmRlZmF1bHRfZHRtZl9kdXJhdGlvbiA9IGR1cmF0aW9uOwoKCQlpZiAoZHVyYXRp b24gPCBydW50aW1lLm1pbl9kdG1mX2R1cmF0aW9uKSB7CgkJCXJ1bnRpbWUubWluX2R0bWZfZHVy YXRpb24gPSBkdXJhdGlvbjsKCQl9CgoJCWlmIChkdXJhdGlvbiA+IHJ1bnRpbWUubWF4X2R0bWZf ZHVyYXRpb24pIHsKCQkJcnVudGltZS5tYXhfZHRtZl9kdXJhdGlvbiA9IGR1cmF0aW9uOwoJCX0K Cgl9CglyZXR1cm4gcnVudGltZS5kZWZhdWx0X2R0bWZfZHVyYXRpb247Cn0KClNXSVRDSF9ERUNM QVJFKHVpbnQzMl90KSBzd2l0Y2hfY29yZV9taW5fZHRtZl9kdXJhdGlvbih1aW50MzJfdCBkdXJh dGlvbikKewoJaWYgKGR1cmF0aW9uKSB7CgkJaWYgKGR1cmF0aW9uIDwgU1dJVENIX01JTl9EVE1G X0RVUkFUSU9OKSB7CgkJCWR1cmF0aW9uID0gU1dJVENIX01JTl9EVE1GX0RVUkFUSU9OOwoJCX0K CQlpZiAoZHVyYXRpb24gPiBTV0lUQ0hfTUFYX0RUTUZfRFVSQVRJT04pIHsKCQkJZHVyYXRpb24g PSBTV0lUQ0hfTUFYX0RUTUZfRFVSQVRJT047CgkJfQoKCQlydW50aW1lLm1pbl9kdG1mX2R1cmF0 aW9uID0gZHVyYXRpb247CgoJCWlmIChkdXJhdGlvbiA+IHJ1bnRpbWUubWF4X2R0bWZfZHVyYXRp b24pIHsKCQkJcnVudGltZS5tYXhfZHRtZl9kdXJhdGlvbiA9IGR1cmF0aW9uOwoJCX0KCX0KCXJl dHVybiBydW50aW1lLm1pbl9kdG1mX2R1cmF0aW9uOwp9CgpTV0lUQ0hfREVDTEFSRShzd2l0Y2hf c3RhdHVzX3QpIHN3aXRjaF9jb3JlX3RocmVhZF9zZXRfY3B1X2FmZmluaXR5KGludCBjcHUpCnsK CXN3aXRjaF9zdGF0dXNfdCBzdGF0dXMgPSBTV0lUQ0hfU1RBVFVTX0ZBTFNFOwoKCWlmIChjcHUg PiAtMSkgewoKI2lmZGVmIEhBVkVfQ1BVX1NFVF9NQUNST1MKCQljcHVfc2V0X3Qgc2V0OwoKCQlD UFVfWkVSTygmc2V0KTsKCQlDUFVfU0VUKGNwdSwgJnNldCk7CgoJCWlmICghc2NoZWRfc2V0YWZm aW5pdHkoMCwgc2l6ZW9mKHNldCksICZzZXQpKSB7CgkJCXN0YXR1cyA9IFNXSVRDSF9TVEFUVVNf U1VDQ0VTUzsKCQl9CgojZWxzZQojaWYgV0lOMzIKCQlpZiAoU2V0VGhyZWFkQWZmaW5pdHlNYXNr KEdldEN1cnJlbnRUaHJlYWQoKSwgKERXT1JEX1BUUikgY3B1KSkgewoJCQlzdGF0dXMgPSBTV0lU Q0hfU1RBVFVTX1NVQ0NFU1M7CgkJfQojZW5kaWYKI2VuZGlmCgl9CgoJcmV0dXJuIHN0YXR1czsK fQoKCiNpZmRlZiBFTkFCTEVfWlJUUApzdGF0aWMgdm9pZCBzd2l0Y2hfY29yZV9zZXRfc2VyaWFs KHZvaWQpCnsKCWNoYXIgYnVmWzEzXSA9ICIiOwoJY2hhciBwYXRoWzI1Nl07CgoJaW50IGZkID0g LTEsIHdyaXRlX2ZkID0gLTE7Cglzd2l0Y2hfc3NpemVfdCBieXRlcyA9IDA7CgoJc3dpdGNoX3Nu cHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzJXNmcmVlc3dpdGNoLnNlcmlhbCIsIFNXSVRD SF9HTE9CQUxfZGlycy5jb25mX2RpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SKTsKCgoJaWYgKChm ZCA9IG9wZW4ocGF0aCwgT19SRE9OTFksIDApKSA8IDApIHsKCQljaGFyICppcCA9IHN3aXRjaF9j b3JlX2dldF92YXJpYWJsZV9kdXAoImxvY2FsX2lwX3Y0Iik7CgkJdWludDMyX3QgaXBpID0gMDsK CQlzd2l0Y2hfYnl0ZV90ICpieXRlOwoJCWludCBpID0gMDsKCgkJaWYgKGlwKSB7CgkJCXN3aXRj aF9pbmV0X3B0b24oQUZfSU5FVCwgaXAsICZpcGkpOwoJCQlmcmVlKGlwKTsKCQkJaXAgPSBOVUxM OwoJCX0KCgoJCWJ5dGUgPSAoc3dpdGNoX2J5dGVfdCAqKSAmIGlwaTsKCgkJZm9yIChpID0gMDsg aSA8IDg7IGkgKz0gMikgewoJCQlzd2l0Y2hfc25wcmludGYoYnVmICsgaSwgc2l6ZW9mKGJ1Zikg LSBpLCAiJTAuMngiLCAqYnl0ZSk7CgkJCWJ5dGUrKzsKCQl9CgoJCXN3aXRjaF9zdHVuX3JhbmRv bV9zdHJpbmcoYnVmICsgOCwgNCwgIjAxMjM0NTY3ODlhYmNkZWYiKTsKCgkJaWYgKCh3cml0ZV9m ZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNf SVdVU1IpKSA+PSAwKSB7CgkJCWJ5dGVzID0gd3JpdGUod3JpdGVfZmQsIGJ1Ziwgc2l6ZW9mKGJ1 ZikpOwoJCQlieXRlcysrOwoJCQljbG9zZSh3cml0ZV9mZCk7CgkJfQoJfSBlbHNlIHsKCQlieXRl cyA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKCQljbG9zZShmZCk7Cgl9CgoJc3dp dGNoX2NvcmVfc2V0X3ZhcmlhYmxlKCJzd2l0Y2hfc2VyaWFsIiwgYnVmKTsKfQojZW5kaWYKClNX SVRDSF9ERUNMQVJFKGludCkgc3dpdGNoX2NvcmVfdGVzdF9mbGFnKGludCBmbGFnKQp7CglyZXR1 cm4gc3dpdGNoX3Rlc3RfZmxhZygoJnJ1bnRpbWUpLCBmbGFnKTsKfQoKClNXSVRDSF9ERUNMQVJF KHN3aXRjaF9zdGF0dXNfdCkgc3dpdGNoX2NvcmVfaW5pdChzd2l0Y2hfY29yZV9mbGFnX3QgZmxh Z3MsIHN3aXRjaF9ib29sX3QgY29uc29sZSwgY29uc3QgY2hhciAqKmVycikKewoJc3dpdGNoX3V1 aWRfdCB1dWlkOwoJY2hhciBndWVzc19pcFsyNTZdOwoJaW50IG1hc2sgPSAwOwoJc3RydWN0IGlu X2FkZHIgaW47CgoKCWlmIChydW50aW1lLnJ1bmxldmVsID4gMCkgewoJCS8qIG9uZSBwZXIgY3Vz dG9tZXIgKi8KCQlyZXR1cm4gU1dJVENIX1NUQVRVU19TVUNDRVNTOwoJfQoKCW1lbXNldCgmcnVu dGltZSwgMCwgc2l6ZW9mKHJ1bnRpbWUpKTsKCWdldGhvc3RuYW1lKHJ1bnRpbWUuaG9zdG5hbWUs IHNpemVvZihydW50aW1lLmhvc3RuYW1lKSk7CgoJcnVudGltZS5tYXhfZGJfaGFuZGxlcyA9IDUw OwoJcnVudGltZS5kYl9oYW5kbGVfdGltZW91dCA9IDUwMDAwMDA7CglydW50aW1lLmV2ZW50X2hl YXJ0YmVhdF9pbnRlcnZhbCA9IDIwOwoKCXJ1bnRpbWUucnVubGV2ZWwrKzsKCXJ1bnRpbWUuZHVt bXlfY25nX2ZyYW1lLmRhdGEgPSBydW50aW1lLmR1bW15X2RhdGE7CglydW50aW1lLmR1bW15X2Nu Z19mcmFtZS5kYXRhbGVuID0gc2l6ZW9mKHJ1bnRpbWUuZHVtbXlfZGF0YSk7CglydW50aW1lLmR1 bW15X2NuZ19mcmFtZS5idWZsZW4gPSBzaXplb2YocnVudGltZS5kdW1teV9kYXRhKTsKCXJ1bnRp bWUuZGJuYW1lID0gImNvcmUiOwoJc3dpdGNoX3NldF9mbGFnKCgmcnVudGltZS5kdW1teV9jbmdf ZnJhbWUpLCBTRkZfQ05HKTsKCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfQVVUT19T Q0hFTUFTKTsKCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfQ0xFQVJfU1FMKTsKCXN3 aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfQVBJX0VYUEFOU0lPTik7Cglzd2l0Y2hfc2V0 X2ZsYWcoKCZydW50aW1lKSwgU0NGX1NFU1NJT05fVEhSRUFEX1BPT0wpOwojaWZkZWYgV0lOMzIK CXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfVEhSRUFERURfU1lTVEVNX0VYRUMpOwoj ZW5kaWYKCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfTk9fTkVXX1NFU1NJT05TKTsK CXJ1bnRpbWUuaGFyZF9sb2dfbGV2ZWwgPSBTV0lUQ0hfTE9HX0RFQlVHOwoJcnVudGltZS5tYWls ZXJfYXBwID0gInNlbmRtYWlsIjsKCXJ1bnRpbWUubWFpbGVyX2FwcF9hcmdzID0gIi10IjsKCXJ1 bnRpbWUubWF4X2R0bWZfZHVyYXRpb24gPSBTV0lUQ0hfTUFYX0RUTUZfRFVSQVRJT047CglydW50 aW1lLmRlZmF1bHRfZHRtZl9kdXJhdGlvbiA9IFNXSVRDSF9ERUZBVUxUX0RUTUZfRFVSQVRJT047 CglydW50aW1lLm1pbl9kdG1mX2R1cmF0aW9uID0gU1dJVENIX01JTl9EVE1GX0RVUkFUSU9OOwoJ cnVudGltZS5vZGJjX2RidHlwZSA9IERCVFlQRV9ERUZBVUxUOwoJcnVudGltZS5kYm5hbWUgPSBO VUxMOwojaWZuZGVmIFdJTjMyCglydW50aW1lLmNwdV9jb3VudCA9IHN5c2NvbmYgKF9TQ19OUFJP Q0VTU09SU19PTkxOKTsKI2Vsc2UKCXsKCQlTWVNURU1fSU5GTyBzeXNpbmZvOwoJCUdldFN5c3Rl bUluZm8oICZzeXNpbmZvICk7CgkJcnVudGltZS5jcHVfY291bnQgPSBzeXNpbmZvLmR3TnVtYmVy T2ZQcm9jZXNzb3JzOwoJfQojZW5kaWYKCglpZiAoIXJ1bnRpbWUuY3B1X2NvdW50KSBydW50aW1l LmNwdV9jb3VudCA9IDE7CgoJaWYgKHNxbGl0ZTNfaW5pdGlhbGl6ZSgpICE9IFNRTElURV9PSykg ewoJCSplcnIgPSAiRkFUQUwgRVJST1IhIENvdWxkIG5vdCBpbml0aWFsaXplIFNRTGl0ZVxuIjsK CQlyZXR1cm4gU1dJVENIX1NUQVRVU19NRU1FUlI7Cgl9CgoJLyogSU5JVCBBUFIgYW5kIENyZWF0 ZSB0aGUgcG9vbCBjb250ZXh0ICovCglpZiAoYXByX2luaXRpYWxpemUoKSAhPSBTV0lUQ0hfU1RB VFVTX1NVQ0NFU1MpIHsKCQkqZXJyID0gIkZBVEFMIEVSUk9SISBDb3VsZCBub3QgaW5pdGlhbGl6 ZSBBUFJcbiI7CgkJcmV0dXJuIFNXSVRDSF9TVEFUVVNfTUVNRVJSOwoJfQoKCWlmICghKHJ1bnRp bWUubWVtb3J5X3Bvb2wgPSBzd2l0Y2hfY29yZV9tZW1vcnlfaW5pdCgpKSkgewoJCSplcnIgPSAi RkFUQUwgRVJST1IhIENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgcG9vbFxuIjsKCQlyZXR1cm4g U1dJVENIX1NUQVRVU19NRU1FUlI7Cgl9Cglzd2l0Y2hfYXNzZXJ0KHJ1bnRpbWUubWVtb3J5X3Bv b2wgIT0gTlVMTCk7CgoJc3dpdGNoX2Rpcl9tYWtlX3JlY3Vyc2l2ZShTV0lUQ0hfR0xPQkFMX2Rp cnMuYmFzZV9kaXIsIFNXSVRDSF9ERUZBVUxUX0RJUl9QRVJNUywgcnVudGltZS5tZW1vcnlfcG9v bCk7Cglzd2l0Y2hfZGlyX21ha2VfcmVjdXJzaXZlKFNXSVRDSF9HTE9CQUxfZGlycy5tb2RfZGly LCBTV0lUQ0hfREVGQVVMVF9ESVJfUEVSTVMsIHJ1bnRpbWUubWVtb3J5X3Bvb2wpOwoJc3dpdGNo X2Rpcl9tYWtlX3JlY3Vyc2l2ZShTV0lUQ0hfR0xPQkFMX2RpcnMuY29uZl9kaXIsIFNXSVRDSF9E RUZBVUxUX0RJUl9QRVJNUywgcnVudGltZS5tZW1vcnlfcG9vbCk7Cglzd2l0Y2hfZGlyX21ha2Vf cmVjdXJzaXZlKFNXSVRDSF9HTE9CQUxfZGlycy5sb2dfZGlyLCBTV0lUQ0hfREVGQVVMVF9ESVJf UEVSTVMsIHJ1bnRpbWUubWVtb3J5X3Bvb2wpOwoJc3dpdGNoX2Rpcl9tYWtlX3JlY3Vyc2l2ZShT V0lUQ0hfR0xPQkFMX2RpcnMucnVuX2RpciwgU1dJVENIX0RFRkFVTFRfRElSX1BFUk1TLCBydW50 aW1lLm1lbW9yeV9wb29sKTsKCXN3aXRjaF9kaXJfbWFrZV9yZWN1cnNpdmUoU1dJVENIX0dMT0JB TF9kaXJzLmRiX2RpciwgU1dJVENIX0RFRkFVTFRfRElSX1BFUk1TLCBydW50aW1lLm1lbW9yeV9w b29sKTsKCXN3aXRjaF9kaXJfbWFrZV9yZWN1cnNpdmUoU1dJVENIX0dMT0JBTF9kaXJzLnNjcmlw dF9kaXIsIFNXSVRDSF9ERUZBVUxUX0RJUl9QRVJNUywgcnVudGltZS5tZW1vcnlfcG9vbCk7Cglz d2l0Y2hfZGlyX21ha2VfcmVjdXJzaXZlKFNXSVRDSF9HTE9CQUxfZGlycy5odGRvY3NfZGlyLCBT V0lUQ0hfREVGQVVMVF9ESVJfUEVSTVMsIHJ1bnRpbWUubWVtb3J5X3Bvb2wpOwoJc3dpdGNoX2Rp cl9tYWtlX3JlY3Vyc2l2ZShTV0lUQ0hfR0xPQkFMX2RpcnMuZ3JhbW1hcl9kaXIsIFNXSVRDSF9E RUZBVUxUX0RJUl9QRVJNUywgcnVudGltZS5tZW1vcnlfcG9vbCk7Cglzd2l0Y2hfZGlyX21ha2Vf cmVjdXJzaXZlKFNXSVRDSF9HTE9CQUxfZGlycy5mb250c19kaXIsIFNXSVRDSF9ERUZBVUxUX0RJ Ul9QRVJNUywgcnVudGltZS5tZW1vcnlfcG9vbCk7Cglzd2l0Y2hfZGlyX21ha2VfcmVjdXJzaXZl KFNXSVRDSF9HTE9CQUxfZGlycy5pbWFnZXNfZGlyLCBTV0lUQ0hfREVGQVVMVF9ESVJfUEVSTVMs IHJ1bnRpbWUubWVtb3J5X3Bvb2wpOwoJc3dpdGNoX2Rpcl9tYWtlX3JlY3Vyc2l2ZShTV0lUQ0hf R0xPQkFMX2RpcnMucmVjb3JkaW5nc19kaXIsIFNXSVRDSF9ERUZBVUxUX0RJUl9QRVJNUywgcnVu dGltZS5tZW1vcnlfcG9vbCk7Cglzd2l0Y2hfZGlyX21ha2VfcmVjdXJzaXZlKFNXSVRDSF9HTE9C QUxfZGlycy5zb3VuZHNfZGlyLCBTV0lUQ0hfREVGQVVMVF9ESVJfUEVSTVMsIHJ1bnRpbWUubWVt b3J5X3Bvb2wpOwoJc3dpdGNoX2Rpcl9tYWtlX3JlY3Vyc2l2ZShTV0lUQ0hfR0xPQkFMX2RpcnMu dGVtcF9kaXIsIFNXSVRDSF9ERUZBVUxUX0RJUl9QRVJNUywgcnVudGltZS5tZW1vcnlfcG9vbCk7 Cglzd2l0Y2hfZGlyX21ha2VfcmVjdXJzaXZlKFNXSVRDSF9HTE9CQUxfZGlycy5jZXJ0c19kaXIs IFNXSVRDSF9ERUZBVUxUX0RJUl9QRVJNUywgcnVudGltZS5tZW1vcnlfcG9vbCk7CgoJc3dpdGNo X211dGV4X2luaXQoJnJ1bnRpbWUudXVpZF9tdXRleCwgU1dJVENIX01VVEVYX05FU1RFRCwgcnVu dGltZS5tZW1vcnlfcG9vbCk7CgoJc3dpdGNoX211dGV4X2luaXQoJnJ1bnRpbWUudGhyb3R0bGVf bXV0ZXgsIFNXSVRDSF9NVVRFWF9ORVNURUQsIHJ1bnRpbWUubWVtb3J5X3Bvb2wpOwoKCXN3aXRj aF9tdXRleF9pbml0KCZydW50aW1lLnNlc3Npb25faGFzaF9tdXRleCwgU1dJVENIX01VVEVYX05F U1RFRCwgcnVudGltZS5tZW1vcnlfcG9vbCk7Cglzd2l0Y2hfbXV0ZXhfaW5pdCgmcnVudGltZS5n bG9iYWxfbXV0ZXgsIFNXSVRDSF9NVVRFWF9ORVNURUQsIHJ1bnRpbWUubWVtb3J5X3Bvb2wpOwoK CXN3aXRjaF90aHJlYWRfcndsb2NrX2NyZWF0ZSgmcnVudGltZS5nbG9iYWxfdmFyX3J3bG9jaywg cnVudGltZS5tZW1vcnlfcG9vbCk7Cglzd2l0Y2hfY29yZV9zZXRfZ2xvYmFscygpOwoJc3dpdGNo X2NvcmVfc2Vzc2lvbl9pbml0KHJ1bnRpbWUubWVtb3J5X3Bvb2wpOwoJc3dpdGNoX2V2ZW50X2Ny ZWF0ZV9wbGFpbigmcnVudGltZS5nbG9iYWxfdmFycywgU1dJVENIX0VWRU5UX0NIQU5ORUxfREFU QSk7Cglzd2l0Y2hfY29yZV9oYXNoX2luaXRfY2FzZSgmcnVudGltZS5taW1lX3R5cGVzLCBTV0lU Q0hfRkFMU0UpOwoJc3dpdGNoX2NvcmVfaGFzaF9pbml0X2Nhc2UoJnJ1bnRpbWUubWltZV90eXBl X2V4dHMsIFNXSVRDSF9GQUxTRSk7Cglzd2l0Y2hfY29yZV9oYXNoX2luaXRfY2FzZSgmcnVudGlt ZS5wdGltZXMsIFNXSVRDSF9GQUxTRSk7Cglsb2FkX21pbWVfdHlwZXMoKTsKCXJ1bnRpbWUuZmxh Z3MgfD0gZmxhZ3M7CglydW50aW1lLnNwc190b3RhbCA9IDMwOwoKCSplcnIgPSBOVUxMOwoKCWlm IChjb25zb2xlKSB7CgkJcnVudGltZS5jb25zb2xlID0gc3Rkb3V0OwoJfQoKCVNTTF9saWJyYXJ5 X2luaXQoKTsKCXN3aXRjaF9zc2xfaW5pdF9zc2xfbG9ja3MoKTsKCXN3aXRjaF9jdXJsX2luaXQo KTsKCglzd2l0Y2hfY29yZV9zZXRfdmFyaWFibGUoImhvc3RuYW1lIiwgcnVudGltZS5ob3N0bmFt ZSk7Cglzd2l0Y2hfZmluZF9sb2NhbF9pcChndWVzc19pcCwgc2l6ZW9mKGd1ZXNzX2lwKSwgJm1h c2ssIEFGX0lORVQpOwoJc3dpdGNoX2NvcmVfc2V0X3ZhcmlhYmxlKCJsb2NhbF9pcF92NCIsIGd1 ZXNzX2lwKTsKCWluLnNfYWRkciA9IG1hc2s7Cglzd2l0Y2hfY29yZV9zZXRfdmFyaWFibGUoImxv Y2FsX21hc2tfdjQiLCBpbmV0X250b2EoaW4pKTsKCgoJc3dpdGNoX2ZpbmRfbG9jYWxfaXAoZ3Vl c3NfaXAsIHNpemVvZihndWVzc19pcCksIE5VTEwsIEFGX0lORVQ2KTsKCXN3aXRjaF9jb3JlX3Nl dF92YXJpYWJsZSgibG9jYWxfaXBfdjYiLCBndWVzc19pcCk7Cglzd2l0Y2hfY29yZV9zZXRfdmFy aWFibGUoImJhc2VfZGlyIiwgU1dJVENIX0dMT0JBTF9kaXJzLmJhc2VfZGlyKTsKCXN3aXRjaF9j b3JlX3NldF92YXJpYWJsZSgicmVjb3JkaW5nc19kaXIiLCBTV0lUQ0hfR0xPQkFMX2RpcnMucmVj b3JkaW5nc19kaXIpOwoJc3dpdGNoX2NvcmVfc2V0X3ZhcmlhYmxlKCJzb3VuZF9wcmVmaXgiLCBT V0lUQ0hfR0xPQkFMX2RpcnMuc291bmRzX2Rpcik7Cglzd2l0Y2hfY29yZV9zZXRfdmFyaWFibGUo InNvdW5kc19kaXIiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuc291bmRzX2Rpcik7Cglzd2l0Y2hfY29y ZV9zZXRfdmFyaWFibGUoImNvbmZfZGlyIiwgU1dJVENIX0dMT0JBTF9kaXJzLmNvbmZfZGlyKTsK CXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgibG9nX2RpciIsIFNXSVRDSF9HTE9CQUxfZGlycy5s b2dfZGlyKTsKCXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgicnVuX2RpciIsIFNXSVRDSF9HTE9C QUxfZGlycy5ydW5fZGlyKTsKCXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgiZGJfZGlyIiwgU1dJ VENIX0dMT0JBTF9kaXJzLmRiX2Rpcik7Cglzd2l0Y2hfY29yZV9zZXRfdmFyaWFibGUoIm1vZF9k aXIiLCBTV0lUQ0hfR0xPQkFMX2RpcnMubW9kX2Rpcik7Cglzd2l0Y2hfY29yZV9zZXRfdmFyaWFi bGUoImh0ZG9jc19kaXIiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuaHRkb2NzX2Rpcik7Cglzd2l0Y2hf Y29yZV9zZXRfdmFyaWFibGUoInNjcmlwdF9kaXIiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuc2NyaXB0 X2Rpcik7Cglzd2l0Y2hfY29yZV9zZXRfdmFyaWFibGUoInRlbXBfZGlyIiwgU1dJVENIX0dMT0JB TF9kaXJzLnRlbXBfZGlyKTsKCXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgiZ3JhbW1hcl9kaXIi LCBTV0lUQ0hfR0xPQkFMX2RpcnMuZ3JhbW1hcl9kaXIpOwoJc3dpdGNoX2NvcmVfc2V0X3Zhcmlh YmxlKCJmb250c19kaXIiLCBTV0lUQ0hfR0xPQkFMX2RpcnMuZm9udHNfZGlyKTsKCXN3aXRjaF9j b3JlX3NldF92YXJpYWJsZSgiaW1hZ2VzX2RpciIsIFNXSVRDSF9HTE9CQUxfZGlycy5pbWFnZXNf ZGlyKTsKCXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgiY2VydHNfZGlyIiwgU1dJVENIX0dMT0JB TF9kaXJzLmNlcnRzX2Rpcik7Cglzd2l0Y2hfY29yZV9zZXRfdmFyaWFibGUoInN0b3JhZ2VfZGly IiwgU1dJVENIX0dMT0JBTF9kaXJzLnN0b3JhZ2VfZGlyKTsKCXN3aXRjaF9jb3JlX3NldF92YXJp YWJsZSgiY2FjaGVfZGlyIiwgU1dJVENIX0dMT0JBTF9kaXJzLmNhY2hlX2Rpcik7Cglzd2l0Y2hf Y29yZV9zZXRfdmFyaWFibGUoImRhdGFfZGlyIiwgU1dJVENIX0dMT0JBTF9kaXJzLmRhdGFfZGly KTsKCXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgibG9jYWxzdGF0ZV9kaXIiLCBTV0lUQ0hfR0xP QkFMX2RpcnMubG9jYWxzdGF0ZV9kaXIpOwojaWZkZWYgRU5BQkxFX1pSVFAKCXN3aXRjaF9jb3Jl X3NldF9zZXJpYWwoKTsKI2VuZGlmCglzd2l0Y2hfY29uc29sZV9pbml0KHJ1bnRpbWUubWVtb3J5 X3Bvb2wpOwoJc3dpdGNoX2V2ZW50X2luaXQocnVudGltZS5tZW1vcnlfcG9vbCk7Cglzd2l0Y2hf Y2hhbm5lbF9nbG9iYWxfaW5pdChydW50aW1lLm1lbW9yeV9wb29sKTsKCglpZiAoc3dpdGNoX3ht bF9pbml0KHJ1bnRpbWUubWVtb3J5X3Bvb2wsIGVycikgIT0gU1dJVENIX1NUQVRVU19TVUNDRVNT KSB7CgkJYXByX3Rlcm1pbmF0ZSgpOwoJCXJldHVybiBTV0lUQ0hfU1RBVFVTX01FTUVSUjsKCX0K CglpZiAoc3dpdGNoX3Rlc3RfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfVVNFX0FVVE9fTkFUKSkgewoJ CXN3aXRjaF9uYXRfaW5pdChydW50aW1lLm1lbW9yeV9wb29sLCBzd2l0Y2hfdGVzdF9mbGFnKCgm cnVudGltZSksIFNDRl9VU0VfTkFUX01BUFBJTkcpKTsKCX0KCglzd2l0Y2hfbG9nX2luaXQocnVu dGltZS5tZW1vcnlfcG9vbCwgcnVudGltZS5jb2xvcml6ZV9jb25zb2xlKTsKCglydW50aW1lLnRp cHBpbmdfcG9pbnQgPSAwOwoJcnVudGltZS50aW1lcl9hZmZpbml0eSA9IC0xOwoJcnVudGltZS5t aWNyb3NlY29uZHNfcGVyX3RpY2sgPSAyMDAwMDsKCglpZiAoZmxhZ3MgJiBTQ0ZfTUlOSU1BTCkg cmV0dXJuIFNXSVRDSF9TVEFUVVNfU1VDQ0VTUzsKCglzd2l0Y2hfbG9hZF9jb3JlX2NvbmZpZygi c3dpdGNoLmNvbmYiKTsKCglzd2l0Y2hfY29yZV9zdGF0ZV9tYWNoaW5lX2luaXQocnVudGltZS5t ZW1vcnlfcG9vbCk7CgoJaWYgKHN3aXRjaF9jb3JlX3NxbGRiX3N0YXJ0KHJ1bnRpbWUubWVtb3J5 X3Bvb2wsIHN3aXRjaF90ZXN0X2ZsYWcoKCZydW50aW1lKSwgU0NGX1VTRV9TUUwpID8gU1dJVENI X1RSVUUgOiBTV0lUQ0hfRkFMU0UpICE9IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCSplcnIg PSAiRXJyb3IgYWN0aXZhdGluZyBkYXRhYmFzZSI7CgkJcmV0dXJuIFNXSVRDSF9TVEFUVVNfRkFM U0U7Cgl9Cglzd2l0Y2hfY29yZV9tZWRpYV9pbml0KCk7Cglzd2l0Y2hfc2NoZWR1bGVyX3Rhc2tf dGhyZWFkX3N0YXJ0KCk7CgoJc3dpdGNoX25hdF9sYXRlX2luaXQoKTsKCglzd2l0Y2hfcnRwX2lu aXQocnVudGltZS5tZW1vcnlfcG9vbCk7CgoJcnVudGltZS5ydW5uaW5nID0gMTsKCXJ1bnRpbWUu aW5pdGlhdGVkID0gc3dpdGNoX21vbm9fbWljcm9fdGltZV9ub3coKTsKCglzd2l0Y2hfc2NoZWR1 bGVyX2FkZF90YXNrKHN3aXRjaF9lcG9jaF90aW1lX25vdyhOVUxMKSwgaGVhcnRiZWF0X2NhbGxi YWNrLCAiaGVhcnRiZWF0IiwgImNvcmUiLCAwLCBOVUxMLCBTU0hGX05PTkUgfCBTU0hGX05PX0RF TCk7CgoJc3dpdGNoX3NjaGVkdWxlcl9hZGRfdGFzayhzd2l0Y2hfZXBvY2hfdGltZV9ub3coTlVM TCksIGNoZWNrX2lwX2NhbGxiYWNrLCAiY2hlY2tfaXAiLCAiY29yZSIsIDAsIE5VTEwsIFNTSEZf Tk9ORSB8IFNTSEZfTk9fREVMIHwgU1NIRl9PV05fVEhSRUFEKTsKCglzd2l0Y2hfdXVpZF9nZXQo JnV1aWQpOwoJc3dpdGNoX3V1aWRfZm9ybWF0KHJ1bnRpbWUudXVpZF9zdHIsICZ1dWlkKTsKCXN3 aXRjaF9jb3JlX3NldF92YXJpYWJsZSgiY29yZV91dWlkIiwgcnVudGltZS51dWlkX3N0cik7CgoK CXJldHVybiBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1M7Cn0KCgojaWZkZWYgVFJBUF9CVVMKc3RhdGlj IHZvaWQgaGFuZGxlX1NJR0JVUyhpbnQgc2lnKQp7Cglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hf Q0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfREVCVUcxLCAiU2lnIEJVUyFcbiIpOwoJcmV0dXJuOwp9 CiNlbmRpZgoKc3RhdGljIHZvaWQgaGFuZGxlX1NJR0hVUChpbnQgc2lnKQp7CglpZiAoc2lnKSB7 CgkJc3dpdGNoX2V2ZW50X3QgKmV2ZW50OwoKCQlpZiAoc3dpdGNoX2V2ZW50X2NyZWF0ZSgmZXZl bnQsIFNXSVRDSF9FVkVOVF9UUkFQKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQkJc3dp dGNoX2V2ZW50X2FkZF9oZWFkZXIoZXZlbnQsIFNXSVRDSF9TVEFDS19CT1RUT00sICJUcmFwcGVk LVNpZ25hbCIsICJIVVAiKTsKCQkJc3dpdGNoX2V2ZW50X2ZpcmUoJmV2ZW50KTsKCQl9Cgl9Cgly ZXR1cm47Cn0KCgpTV0lUQ0hfREVDTEFSRSh1aW50MzJfdCkgc3dpdGNoX2RlZmF1bHRfcHRpbWUo Y29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbnVtYmVyKQp7Cgl1aW50MzJfdCAqcDsKCglpZiAo KHAgPSBzd2l0Y2hfY29yZV9oYXNoX2ZpbmQocnVudGltZS5wdGltZXMsIG5hbWUpKSkgewoJCXJl dHVybiAqcDsKCX0KCglyZXR1cm4gMjA7Cn0KClNXSVRDSF9ERUNMQVJFKHVpbnQzMl90KSBzd2l0 Y2hfZGVmYXVsdF9yYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IG51bWJlcikKewoKCWlm ICghc3RyY2FzZWNtcChuYW1lLCAib3B1cyIpKSB7CgkJcmV0dXJuIDQ4MDAwOwoJfSBlbHNlIGlm ICghc3RybmNhc2VjbXAobmFtZSwgImgyNiIsIDMpKSB7IC8vIGgyNngKCQlyZXR1cm4gOTAwMDA7 Cgl9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChuYW1lLCAidnAiLCAyKSkgeyAgLy8gdnA4LCB2cDkK CQlyZXR1cm4gOTAwMDA7Cgl9CgoJcmV0dXJuIDgwMDA7Cn0KCnN0YXRpYyB1aW50MzJfdCBkXzMw ID0gMzA7CgpzdGF0aWMgdm9pZCBzd2l0Y2hfbG9hZF9jb3JlX2NvbmZpZyhjb25zdCBjaGFyICpm aWxlKQp7Cglzd2l0Y2hfeG1sX3QgeG1sID0gTlVMTCwgY2ZnID0gTlVMTDsKCglzd2l0Y2hfY29y ZV9oYXNoX2luc2VydChydW50aW1lLnB0aW1lcywgImlsYmMiLCAmZF8zMCk7Cglzd2l0Y2hfY29y ZV9oYXNoX2luc2VydChydW50aW1lLnB0aW1lcywgImlzYWMiLCAmZF8zMCk7Cglzd2l0Y2hfY29y ZV9oYXNoX2luc2VydChydW50aW1lLnB0aW1lcywgIkc3MjMiLCAmZF8zMCk7CgoKCWlmICgoeG1s ID0gc3dpdGNoX3htbF9vcGVuX2NmZyhmaWxlLCAmY2ZnLCBOVUxMKSkpIHsKCQlzd2l0Y2hfeG1s X3Qgc2V0dGluZ3MsIHBhcmFtOwoKCQlpZiAoKHNldHRpbmdzID0gc3dpdGNoX3htbF9jaGlsZChj ZmcsICJkZWZhdWx0LXB0aW1lcyIpKSkgewoJCQlmb3IgKHBhcmFtID0gc3dpdGNoX3htbF9jaGls ZChzZXR0aW5ncywgImNvZGVjIik7IHBhcmFtOyBwYXJhbSA9IHBhcmFtLT5uZXh0KSB7CgkJCQlj b25zdCBjaGFyICp2YXIgPSBzd2l0Y2hfeG1sX2F0dHJfc29mdChwYXJhbSwgIm5hbWUiKTsKCQkJ CWNvbnN0IGNoYXIgKnZhbCA9IHN3aXRjaF94bWxfYXR0cl9zb2Z0KHBhcmFtLCAicHRpbWUiKTsK CgkJCQlpZiAoIXpzdHIodmFyKSAmJiAhenN0cih2YWwpKSB7CgkJCQkJdWludDMyX3QgKnA7CgkJ CQkJdWludDMyX3QgdiA9IHN3aXRjaF9hdG91bCh2YWwpOwoKCQkJCQlpZiAoIXN0cmNhc2VjbXAo dmFyLCAiRzcyMyIpIHx8ICFzdHJjYXNlY21wKHZhciwgImlMQkMiKSkgewoJCQkJCQlzd2l0Y2hf bG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwgIkVycm9yIGFk ZGluZyAlcywgZGVmYXVsdHMgY2Fubm90IGJlIGNoYW5nZWRcbiIsIHZhcik7CgkJCQkJCWNvbnRp bnVlOwoJCQkJCX0KCgkJCQkJaWYgKHYgPT0gMCkgewoJCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihT V0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwgIkVycm9yIGFkZGluZyAlcywgaW52 YWxpZCBwdGltZVxuIiwgdmFyKTsKCQkJCQkJY29udGludWU7CgkJCQkJfQoKCQkJCQlwID0gc3dp dGNoX2NvcmVfYWxsb2MocnVudGltZS5tZW1vcnlfcG9vbCwgc2l6ZW9mKCpwKSk7CgkJCQkJKnAg PSB2OwoJCQkJCXN3aXRjaF9jb3JlX2hhc2hfaW5zZXJ0KHJ1bnRpbWUucHRpbWVzLCB2YXIsIHAp OwoJCQkJfQoKCQkJfQoJCX0KCgkJaWYgKChzZXR0aW5ncyA9IHN3aXRjaF94bWxfY2hpbGQoY2Zn LCAic2V0dGluZ3MiKSkpIHsKCQkJZm9yIChwYXJhbSA9IHN3aXRjaF94bWxfY2hpbGQoc2V0dGlu Z3MsICJwYXJhbSIpOyBwYXJhbTsgcGFyYW0gPSBwYXJhbS0+bmV4dCkgewoJCQkJY29uc3QgY2hh ciAqdmFyID0gc3dpdGNoX3htbF9hdHRyX3NvZnQocGFyYW0sICJuYW1lIik7CgkJCQljb25zdCBj aGFyICp2YWwgPSBzd2l0Y2hfeG1sX2F0dHJfc29mdChwYXJhbSwgInZhbHVlIik7CgoJCQkJaWYg KCFzdHJjYXNlY21wKHZhciwgImxvZ2xldmVsIikpIHsKCQkJCQlpbnQgbGV2ZWw7CgkJCQkJaWYg KCp2YWwgPiA0NyAmJiAqdmFsIDwgNTgpIHsKCQkJCQkJbGV2ZWwgPSBhdG9pKHZhbCk7CgkJCQkJ fSBlbHNlIHsKCQkJCQkJbGV2ZWwgPSBzd2l0Y2hfbG9nX3N0cjJsZXZlbCh2YWwpOwoJCQkJCX0K CgkJCQkJaWYgKGxldmVsICE9IFNXSVRDSF9MT0dfSU5WQUxJRCkgewoJCQkJCQlzd2l0Y2hfY29y ZV9zZXNzaW9uX2N0bChTQ1NDX0xPR0xFVkVMLCAmbGV2ZWwpOwoJCQkJCX0KI2lmZGVmIEhBVkVf U0VUUkxJTUlUCgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgImR1bXAtY29yZXMiKSAm JiBzd2l0Y2hfdHJ1ZSh2YWwpKSB7CgkJCQkJc3RydWN0IHJsaW1pdCBybHA7CgkJCQkJbWVtc2V0 KCZybHAsIDAsIHNpemVvZihybHApKTsKCQkJCQlybHAucmxpbV9jdXIgPSBSTElNX0lORklOSVRZ OwoJCQkJCXJscC5ybGltX21heCA9IFJMSU1fSU5GSU5JVFk7CgkJCQkJc2V0cmxpbWl0KFJMSU1J VF9DT1JFLCAmcmxwKTsKI2VuZGlmCgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgImRl YnVnLWxldmVsIikpIHsKCQkJCQlpbnQgdG1wID0gYXRvaSh2YWwpOwoJCQkJCWlmICh0bXAgPiAt MSAmJiB0bXAgPCAxMSkgewoJCQkJCQlzd2l0Y2hfY29yZV9zZXNzaW9uX2N0bChTQ1NDX0RFQlVH X0xFVkVMLCAmdG1wKTsKCQkJCQl9CgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgIm1h eC1kYi1oYW5kbGVzIikpIHsKCQkJCQlsb25nIHRtcCA9IGF0b2wodmFsKTsKCgkJCQkJaWYgKHRt cCA+IDQgJiYgdG1wIDwgNTAwMSkgewoJCQkJCQlydW50aW1lLm1heF9kYl9oYW5kbGVzID0gKHVp bnQzMl90KSB0bXA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENI X0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0VSUk9SLCAibWF4LWRiLWhhbmRsZXMgbXVzdCBiZSBi ZXR3ZWVuIDUgYW5kIDUwMDBcbiIpOwoJCQkJCX0KCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAo dmFyLCAiZGItaGFuZGxlLXRpbWVvdXQiKSkgewoJCQkJCWxvbmcgdG1wID0gYXRvbCh2YWwpOwoK CQkJCQlpZiAodG1wID4gMCAmJiB0bXAgPCA1MDAxKSB7CgkJCQkJCXJ1bnRpbWUuZGJfaGFuZGxl X3RpbWVvdXQgPSAodWludDMyX3QpIHRtcCAqIDEwMDAwMDA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJ c3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0VSUk9SLCAi ZGItaGFuZGxlLXRpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDUwMDBcbiIpOwoJCQkJCX0K CgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgImV2ZW50LWhlYXJ0YmVhdC1pbnRlcnZh bCIpKSB7CgkJCQkJbG9uZyB0bXAgPSBhdG9sKHZhbCk7CgoJCQkJCWlmICh0bXAgPiAwKSB7CgkJ CQkJCXJ1bnRpbWUuZXZlbnRfaGVhcnRiZWF0X2ludGVydmFsID0gKHVpbnQzMl90KSB0bXA7CgkJ CQkJfSBlbHNlIHsKCQkJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBT V0lUQ0hfTE9HX0VSUk9SLCAiaGVhcnRiZWF0LWludGVydmFsIG11c3QgYmUgYSBncmVhdGVyIHRo YW4gMFxuIik7CgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAibXVsdGlw bGUtcmVnaXN0cmF0aW9ucyIpKSB7CgkJCQkJcnVudGltZS5tdWx0aXBsZV9yZWdpc3RyYXRpb25z ID0gc3dpdGNoX3RydWUodmFsKTsKCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAiYXV0 by1jcmVhdGUtc2NoZW1hcyIpKSB7CgkJCQkJaWYgKHN3aXRjaF90cnVlKHZhbCkpIHsKCQkJCQkJ c3dpdGNoX3NldF9mbGFnKCgmcnVudGltZSksIFNDRl9BVVRPX1NDSEVNQVMpOwoJCQkJCX0gZWxz ZSB7CgkJCQkJCXN3aXRjaF9jbGVhcl9mbGFnKCgmcnVudGltZSksIFNDRl9BVVRPX1NDSEVNQVMp OwoJCQkJCX0KCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAic2Vzc2lvbi10aHJlYWQt cG9vbCIpKSB7CgkJCQkJaWYgKHN3aXRjaF90cnVlKHZhbCkpIHsKCQkJCQkJc3dpdGNoX3NldF9m bGFnKCgmcnVudGltZSksIFNDRl9TRVNTSU9OX1RIUkVBRF9QT09MKTsKCQkJCQl9IGVsc2UgewoJ CQkJCQlzd2l0Y2hfY2xlYXJfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfU0VTU0lPTl9USFJFQURfUE9P TCk7CgkJCQkJfQoJCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2YXIsICJhdXRvLWNsZWFyLXNx bCIpKSB7CgkJCQkJaWYgKHN3aXRjaF90cnVlKHZhbCkpIHsKCQkJCQkJc3dpdGNoX3NldF9mbGFn KCgmcnVudGltZSksIFNDRl9DTEVBUl9TUUwpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXN3aXRjaF9j bGVhcl9mbGFnKCgmcnVudGltZSksIFNDRl9DTEVBUl9TUUwpOwoJCQkJCX0KCQkJCX0gZWxzZSBp ZiAoIXN0cmNhc2VjbXAodmFyLCAiYXBpLWV4cGFuc2lvbiIpKSB7CgkJCQkJaWYgKHN3aXRjaF90 cnVlKHZhbCkpIHsKCQkJCQkJc3dpdGNoX3NldF9mbGFnKCgmcnVudGltZSksIFNDRl9BUElfRVhQ QU5TSU9OKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlzd2l0Y2hfY2xlYXJfZmxhZygoJnJ1bnRpbWUp LCBTQ0ZfQVBJX0VYUEFOU0lPTik7CgkJCQkJfQoJCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2 YXIsICJlbmFibGUtZWFybHktaGFuZ3VwIikgJiYgc3dpdGNoX3RydWUodmFsKSkgewoJCQkJCXN3 aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfRUFSTFlfSEFOR1VQKTsKCQkJCX0gZWxzZSBp ZiAoIXN0cmNhc2VjbXAodmFyLCAiY29sb3JpemUtY29uc29sZSIpICYmIHN3aXRjaF90cnVlKHZh bCkpIHsKCQkJCQlydW50aW1lLmNvbG9yaXplX2NvbnNvbGUgPSBTV0lUQ0hfVFJVRTsKCQkJCX0g ZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAiY29yZS1kYi1wcmUtdHJhbnMtZXhlY3V0ZSIpICYm ICF6c3RyKHZhbCkpIHsKCQkJCQlydW50aW1lLmNvcmVfZGJfcHJlX3RyYW5zX2V4ZWN1dGUgPSBz d2l0Y2hfY29yZV9zdHJkdXAocnVudGltZS5tZW1vcnlfcG9vbCwgdmFsKTsKCQkJCX0gZWxzZSBp ZiAoIXN0cmNhc2VjbXAodmFyLCAiY29yZS1kYi1wb3N0LXRyYW5zLWV4ZWN1dGUiKSAmJiAhenN0 cih2YWwpKSB7CgkJCQkJcnVudGltZS5jb3JlX2RiX3Bvc3RfdHJhbnNfZXhlY3V0ZSA9IHN3aXRj aF9jb3JlX3N0cmR1cChydW50aW1lLm1lbW9yeV9wb29sLCB2YWwpOwoJCQkJfSBlbHNlIGlmICgh c3RyY2FzZWNtcCh2YXIsICJjb3JlLWRiLWlubmVyLXByZS10cmFucy1leGVjdXRlIikgJiYgIXpz dHIodmFsKSkgewoJCQkJCXJ1bnRpbWUuY29yZV9kYl9pbm5lcl9wcmVfdHJhbnNfZXhlY3V0ZSA9 IHN3aXRjaF9jb3JlX3N0cmR1cChydW50aW1lLm1lbW9yeV9wb29sLCB2YWwpOwoJCQkJfSBlbHNl IGlmICghc3RyY2FzZWNtcCh2YXIsICJjb3JlLWRiLWlubmVyLXBvc3QtdHJhbnMtZXhlY3V0ZSIp ICYmICF6c3RyKHZhbCkpIHsKCQkJCQlydW50aW1lLmNvcmVfZGJfaW5uZXJfcG9zdF90cmFuc19l eGVjdXRlID0gc3dpdGNoX2NvcmVfc3RyZHVwKHJ1bnRpbWUubWVtb3J5X3Bvb2wsIHZhbCk7CgkJ CQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgImRpYWxwbGFuLXRpbWVzdGFtcHMiKSkgewoJ CQkJCWlmIChzd2l0Y2hfdHJ1ZSh2YWwpKSB7CgkJCQkJCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRp bWUpLCBTQ0ZfRElBTFBMQU5fVElNRVNUQU1QUyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc3dpdGNo X2NsZWFyX2ZsYWcoKCZydW50aW1lKSwgU0NGX0RJQUxQTEFOX1RJTUVTVEFNUFMpOwoJCQkJCX0K CQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAibWFpbGVyLWFwcCIpICYmICF6c3RyKHZh bCkpIHsKCQkJCQlydW50aW1lLm1haWxlcl9hcHAgPSBzd2l0Y2hfY29yZV9zdHJkdXAocnVudGlt ZS5tZW1vcnlfcG9vbCwgdmFsKTsKCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAibWFp bGVyLWFwcC1hcmdzIikgJiYgdmFsKSB7CgkJCQkJcnVudGltZS5tYWlsZXJfYXBwX2FyZ3MgPSBz d2l0Y2hfY29yZV9zdHJkdXAocnVudGltZS5tZW1vcnlfcG9vbCwgdmFsKTsKCQkJCX0gZWxzZSBp ZiAoIXN0cmNhc2VjbXAodmFyLCAic2Vzc2lvbnMtcGVyLXNlY29uZCIpICYmICF6c3RyKHZhbCkp IHsKCQkJCQlzd2l0Y2hfY29yZV9zZXNzaW9uc19wZXJfc2Vjb25kKGF0b2kodmFsKSk7CgkJCQl9 IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgIm1heC1kdG1mLWR1cmF0aW9uIikgJiYgIXpzdHIo dmFsKSkgewoJCQkJCWludCB0bXAgPSBhdG9pKHZhbCk7CgkJCQkJaWYgKHRtcCA+IDApIHsKCQkJ CQkJc3dpdGNoX2NvcmVfbWF4X2R0bWZfZHVyYXRpb24oKHVpbnQzMl90KSB0bXApOwoJCQkJCX0K CQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAibWluLWR0bWYtZHVyYXRpb24iKSAmJiAh enN0cih2YWwpKSB7CgkJCQkJaW50IHRtcCA9IGF0b2kodmFsKTsKCQkJCQlpZiAodG1wID4gMCkg ewoJCQkJCQlzd2l0Y2hfY29yZV9taW5fZHRtZl9kdXJhdGlvbigodWludDMyX3QpIHRtcCk7CgkJ CQkJfQoJCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2YXIsICJkZWZhdWx0LWR0bWYtZHVyYXRp b24iKSAmJiAhenN0cih2YWwpKSB7CgkJCQkJaW50IHRtcCA9IGF0b2kodmFsKTsKCQkJCQlpZiAo dG1wID4gMCkgewoJCQkJCQlzd2l0Y2hfY29yZV9kZWZhdWx0X2R0bWZfZHVyYXRpb24oKHVpbnQz Ml90KSB0bXApOwoJCQkJCX0KCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAiZW5hYmxl LXVzZS1zeXN0ZW0tdGltZSIpKSB7CgkJCQkJc3dpdGNoX3RpbWVfc2V0X3VzZV9zeXN0ZW1fdGlt ZShzd2l0Y2hfdHJ1ZSh2YWwpKTsKCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAiZW5h YmxlLW1vbm90b25pYy10aW1pbmciKSkgewoJCQkJCXN3aXRjaF90aW1lX3NldF9tb25vdG9uaWMo c3dpdGNoX3RydWUodmFsKSk7CgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgImVuYWJs ZS1zb2Z0dGltZXItdGltZXJmZCIpKSB7CgkJCQkJaW50IGl2YWwgPSAwOwoJCQkJCWlmICh2YWwp IHsKCQkJCQkJaWYgKHN3aXRjaF90cnVlKHZhbCkpIHsKCQkJCQkJCWl2YWwgPSAyOwoJCQkJCQl9 IGVsc2UgewoJCQkJCQkJaWYgKHN0cmNhc2VjbXAodmFsLCAiYnJvYWRjYXN0IikpIHsKCQkJCQkJ CQlpdmFsID0gMTsKCQkJCQkJCX0gZWxzZSBpZiAoc3RyY2FzZWNtcCh2YWwsICJmZC1wZXItdGlt ZXIiKSkgewoJCQkJCQkJCWl2YWwgPSAyOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCXN3 aXRjaF90aW1lX3NldF90aW1lcmZkKGl2YWwpOwoJCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2 YXIsICJlbmFibGUtY2xvY2stbmFub3NsZWVwIikpIHsKCQkJCQlzd2l0Y2hfdGltZV9zZXRfbmFu b3NsZWVwKHN3aXRjaF90cnVlKHZhbCkpOwoJCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2YXIs ICJlbmFibGUtY29uZC15aWVsZCIpKSB7CgkJCQkJc3dpdGNoX3RpbWVfc2V0X2NvbmRfeWllbGQo c3dpdGNoX3RydWUodmFsKSk7CgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgImVuYWJs ZS10aW1lci1tYXRyaXgiKSkgewoJCQkJCXN3aXRjaF90aW1lX3NldF9tYXRyaXgoc3dpdGNoX3Ry dWUodmFsKSk7CgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgIm1heC1zZXNzaW9ucyIp ICYmICF6c3RyKHZhbCkpIHsKCQkJCQlzd2l0Y2hfY29yZV9zZXNzaW9uX2xpbWl0KGF0b2kodmFs KSk7CgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgInZlcmJvc2UtY2hhbm5lbC1ldmVu dHMiKSAmJiAhenN0cih2YWwpKSB7CgkJCQkJaW50IHYgPSBzd2l0Y2hfdHJ1ZSh2YWwpOwoJCQkJ CWlmICh2KSB7CgkJCQkJCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfVkVSQk9TRV9F VkVOVFMpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXN3aXRjaF9jbGVhcl9mbGFnKCgmcnVudGltZSks IFNDRl9WRVJCT1NFX0VWRU5UUyk7CgkJCQkJfQoJCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2 YXIsICJ0aHJlYWRlZC1zeXN0ZW0tZXhlYyIpICYmICF6c3RyKHZhbCkpIHsKI2lmZGVmIFdJTjMy CgkJCQkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX1dB Uk5JTkcsICJ0aHJlYWRlZC1zeXN0ZW0tZXhlYyBpcyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBw bGF0Zm9ybVxuIik7CiNlbHNlCgkJCQkJaW50IHYgPSBzd2l0Y2hfdHJ1ZSh2YWwpOwoJCQkJCWlm ICh2KSB7CgkJCQkJCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfVEhSRUFERURfU1lT VEVNX0VYRUMpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXN3aXRjaF9jbGVhcl9mbGFnKCgmcnVudGlt ZSksIFNDRl9USFJFQURFRF9TWVNURU1fRVhFQyk7CgkJCQkJfQojZW5kaWYKCQkJCX0gZWxzZSBp ZiAoIXN0cmNhc2VjbXAodmFyLCAibWluLWlkbGUtY3B1IikgJiYgIXpzdHIodmFsKSkgewoJCQkJ CXN3aXRjaF9jb3JlX21pbl9pZGxlX2NwdShhdG9mKHZhbCkpOwoJCQkJfSBlbHNlIGlmICghc3Ry Y2FzZWNtcCh2YXIsICJ0aXBwaW5nLXBvaW50IikgJiYgIXpzdHIodmFsKSkgewoJCQkJCXJ1bnRp bWUudGlwcGluZ19wb2ludCA9IGF0b2kodmFsKTsKCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAo dmFyLCAiY3B1LWlkbGUtc21vb3RoaW5nLWRlcHRoIikgJiYgIXpzdHIodmFsKSkgewoJCQkJCXJ1 bnRpbWUuY3B1X2lkbGVfc21vb3RoaW5nX2RlcHRoID0gYXRvaSh2YWwpOwoJCQkJfSBlbHNlIGlm ICghc3RyY2FzZWNtcCh2YXIsICJldmVudHMtdXNlLWRpc3BhdGNoIikgJiYgIXpzdHIodmFsKSkg ewoJCQkJCXJ1bnRpbWUuZXZlbnRzX3VzZV9kaXNwYXRjaCA9IHN3aXRjaF90cnVlKHZhbCk7CgkJ CQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgImluaXRpYWwtZXZlbnQtdGhyZWFkcyIpICYm ICF6c3RyKHZhbCkpIHsKCQkJCQlpbnQgdG1wOwoKCQkJCQlpZiAoIXJ1bnRpbWUuZXZlbnRzX3Vz ZV9kaXNwYXRjaCkgewoJCQkJCQlydW50aW1lLmV2ZW50c191c2VfZGlzcGF0Y2ggPSAxOwoJCQkJ CQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfV0FSTklO RywKCQkJCQkJCQkJCSAgIkltcGxpY2l0bHkgc2V0dGluZyBldmVudHMtdXNlLWRpc3BhdGNoIGJh c2VkIG9uIHVzYWdlIG9mIHRoaXMgaW5pdGlhbC1ldmVudC10aHJlYWRzIHBhcmFtZXRlci5cbiIp OwoJCQkJCX0KCgkJCQkJdG1wID0gYXRvaSh2YWwpOwoKCQkJCQlpZiAodG1wID4gcnVudGltZS5j cHVfY291bnQgLyAyKSB7CgkJCQkJCXRtcCA9IHJ1bnRpbWUuY3B1X2NvdW50IC8gMjsKCQkJCQkJ c3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX1dBUk5JTkcs ICJUaGlzIHZhbHVlIGNhbm5vdCBiZSBoaWdoZXIgdGhhbiAlZCBzbyBzZXR0aW5nIGl0IHRvIHRo YXQgdmFsdWVcbiIsCgkJCQkJCQkJCQkgIHJ1bnRpbWUuY3B1X2NvdW50IC8gMik7CgkJCQkJfQoK CQkJCQlpZiAodG1wIDwgMSkgewoJCQkJCQl0bXAgPSAxOwoJCQkJCQlzd2l0Y2hfbG9nX3ByaW50 ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfV0FSTklORywgIlRoaXMgdmFsdWUgY2Fu bm90IGJlIGxvd2VyIHRoYW4gMSBzbyBzZXR0aW5nIGl0IHRvIHRoYXQgbGV2ZWxcbiIpOwoJCQkJ CX0KCgkJCQkJc3dpdGNoX2V2ZW50X2xhdW5jaF9kaXNwYXRjaF90aHJlYWRzKHRtcCk7CgoJCQkJ fSBlbHNlIGlmICghc3RyY2FzZWNtcCh2YXIsICIxbXMtdGltZXIiKSAmJiBzd2l0Y2hfdHJ1ZSh2 YWwpKSB7CgkJCQkJcnVudGltZS5taWNyb3NlY29uZHNfcGVyX3RpY2sgPSAxMDAwOwoJCQkJfSBl bHNlIGlmICghc3RyY2FzZWNtcCh2YXIsICJ0aW1lci1hZmZpbml0eSIpICYmICF6c3RyKHZhbCkp IHsKCQkJCQlpZiAoIXN0cmNhc2VjbXAodmFsLCAiZGlzYWJsZWQiKSkgewoJCQkJCQlydW50aW1l LnRpbWVyX2FmZmluaXR5ID0gLTE7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcnVudGltZS50aW1lcl9h ZmZpbml0eSA9IGF0b2kodmFsKTsKCQkJCQl9CgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZh ciwgInJ0cC1zdGFydC1wb3J0IikgJiYgIXpzdHIodmFsKSkgewoJCQkJCXN3aXRjaF9ydHBfc2V0 X3N0YXJ0X3BvcnQoKHN3aXRjaF9wb3J0X3QpIGF0b2kodmFsKSk7CgkJCQl9IGVsc2UgaWYgKCFz dHJjYXNlY21wKHZhciwgInJ0cC1lbmQtcG9ydCIpICYmICF6c3RyKHZhbCkpIHsKCQkJCQlzd2l0 Y2hfcnRwX3NldF9lbmRfcG9ydCgoc3dpdGNoX3BvcnRfdCkgYXRvaSh2YWwpKTsKCQkJCX0gZWxz ZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAicnRwLXBvcnQtdXNhZ2Utcm9idXN0bmVzcyIpICYmIHN3 aXRjaF90cnVlKHZhbCkpIHsKCQkJCQlydW50aW1lLnBvcnRfYWxsb2NfZmxhZ3MgfD0gU1BGX1JP QlVTVF9VRFA7CgkJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgImNvcmUtZGItbmFtZSIp ICYmICF6c3RyKHZhbCkpIHsKCQkJCQlydW50aW1lLmRibmFtZSA9IHN3aXRjaF9jb3JlX3N0cmR1 cChydW50aW1lLm1lbW9yeV9wb29sLCB2YWwpOwoJCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2 YXIsICJjb3JlLWRiLWRzbiIpICYmICF6c3RyKHZhbCkpIHsKCQkJCQlpZiAoc3dpdGNoX29kYmNf YXZhaWxhYmxlKCkgfHwgc3dpdGNoX3Bnc3FsX2F2YWlsYWJsZSgpKSB7CgkJCQkJCXJ1bnRpbWUu b2RiY19kc24gPSBzd2l0Y2hfY29yZV9zdHJkdXAocnVudGltZS5tZW1vcnlfcG9vbCwgdmFsKTsK CQkJCQl9IGVsc2UgewoJCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0cs IFNXSVRDSF9MT0dfRVJST1IsICJPREJDIEFORCBQR1NRTCBBUkUgTk9UIEFWQUlMQUJMRSFcbiIp OwoJCQkJCX0KCQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFyLCAiY29yZS1ub24tc3FsaXRl LWRiLXJlcXVpcmVkIikgJiYgIXpzdHIodmFsKSkgewoJCQkJCXN3aXRjaF9zZXRfZmxhZygoJnJ1 bnRpbWUpLCBTQ0ZfQ09SRV9OT05fU1FMSVRFX0RCX1JFUSk7CgkJCQl9IGVsc2UgaWYgKCFzdHJj YXNlY21wKHZhciwgImNvcmUtZGJ0eXBlIikgJiYgIXpzdHIodmFsKSkgewoJCQkJCWlmICghc3Ry Y2FzZWNtcCh2YWwsICJNU1NRTCIpKSB7CgkJCQkJCXJ1bnRpbWUub2RiY19kYnR5cGUgPSBEQlRZ UEVfTVNTUUw7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcnVudGltZS5vZGJjX2RidHlwZSA9IERCVFlQ RV9ERUZBVUxUOwoJCQkJCX0KI2lmZGVmIEVOQUJMRV9aUlRQCgkJCQl9IGVsc2UgaWYgKCFzdHJj YXNlY21wKHZhciwgInJ0cC1lbmFibGUtenJ0cCIpKSB7CgkJCQkJc3dpdGNoX2NvcmVfc2V0X3Zh cmlhYmxlKCJ6cnRwX2VuYWJsZWQiLCB2YWwpOwojZW5kaWYKCQkJCX0gZWxzZSBpZiAoIXN0cmNh c2VjbXAodmFyLCAic3dpdGNobmFtZSIpICYmICF6c3RyKHZhbCkpIHsKCQkJCQlydW50aW1lLnN3 aXRjaG5hbWUgPSBzd2l0Y2hfY29yZV9zdHJkdXAocnVudGltZS5tZW1vcnlfcG9vbCwgdmFsKTsK CQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfTk9U SUNFLCAiU2V0IHN3aXRjaG5hbWUgdG8gJXNcbiIsIHJ1bnRpbWUuc3dpdGNobmFtZSk7CgkJCQl9 IGVsc2UgaWYgKCFzdHJjYXNlY21wKHZhciwgInJ0cC1yZXRhaW4tY3J5cHRvLWtleXMiKSkgewoJ CQkJCWlmIChzd2l0Y2hfdHJ1ZSh2YWwpKSB7CgkJCQkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRD SF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19XQVJOSU5HLAoJCQkJCQkJCQkJICAicnRwLXJldGFp bi1jcnlwdG8ta2V5cyBlbmFibGVkLiBDb3VsZCBiZSB1c2VkIHRvIGRlY3J5cHQgc2VjdXJlIG1l ZGlhLlxuIik7CgkJCQkJfQoJCQkJCXN3aXRjaF9jb3JlX3NldF92YXJpYWJsZSgicnRwX3JldGFp bl9jcnlwdG9fa2V5cyIsIHZhbCk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICgoc2V0dGluZ3MgPSBz d2l0Y2hfeG1sX2NoaWxkKGNmZywgInZhcmlhYmxlcyIpKSkgewoJCQlmb3IgKHBhcmFtID0gc3dp dGNoX3htbF9jaGlsZChzZXR0aW5ncywgInZhcmlhYmxlIik7IHBhcmFtOyBwYXJhbSA9IHBhcmFt LT5uZXh0KSB7CgkJCQljb25zdCBjaGFyICp2YXIgPSBzd2l0Y2hfeG1sX2F0dHJfc29mdChwYXJh bSwgIm5hbWUiKTsKCQkJCWNvbnN0IGNoYXIgKnZhbCA9IHN3aXRjaF94bWxfYXR0cl9zb2Z0KHBh cmFtLCAidmFsdWUiKTsKCQkJCWlmICh2YXIgJiYgdmFsKSB7CgkJCQkJc3dpdGNoX2NvcmVfc2V0 X3ZhcmlhYmxlKHZhciwgdmFsKTsKCQkJCX0KCQkJfQoJCX0KCgkJc3dpdGNoX3htbF9mcmVlKHht bCk7Cgl9CgoKfQoKU1dJVENIX0RFQ0xBUkUoY29uc3QgY2hhciAqKSBzd2l0Y2hfY29yZV9iYW5u ZXIodm9pZCkKewoKCXJldHVybiAoIlxuIgoJCQkiLj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0uXG4iCgkJCSJ8ICAgX19fX18gICAg ICAgICAgICAgIF9fX19fXyAgICAgICAgX19fX18gX19fX18gX19fXyBfICAgXyAgIHxcbiIKCQkJ InwgIHwgIF9fX3wgX18gX19fICBfX18vIF9fX1xcIFxcICAgICAgLyAvXyBffF8gICBfLyBfX198 IHwgfCB8ICB8XG4iCgkJCSJ8ICB8IHxfIHwgJ19fLyBfIFxcLyBfIFxcX19fIFxcXFwgXFwgL1xc IC8gLyB8IHwgIHwgfHwgfCAgIHwgfF98IHwgIHxcbiIKCQkJInwgIHwgIF98fCB8IHwgIF9fLyAg X18vX19fKSB8XFwgViAgViAvICB8IHwgIHwgfHwgfF9fX3wgIF8gIHwgIHxcbiIKCQkJInwgIHxf fCAgfF98ICBcXF9fX3xcXF9fX3xfX19fLyAgXFxfL1xcXy8gIHxfX198IHxffCBcXF9fX198X3wg fF98ICB8XG4iCgkJCSJ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHxcbiIKCQkJIi49PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LiIKCQkJIlxuIgoKCQkJInwgICBBbnRo b255IE1pbmVzc2FsZSBJSSwgTWljaGFlbCBKZXJyaXMsIEJyaWFuIFdlc3QsIE90aGVycyAgfFxu IgoJCQkifCAgIEZyZWVTV0lUQ0ggKGh0dHA6Ly93d3cuZnJlZXN3aXRjaC5vcmcpICAgICAgICAg ICAgICAgICAgICB8XG4iCgkJCSJ8ICAgUGF5cGFsIERvbmF0aW9ucyBBcHByZWNpYXRlZDogcGF5 cGFsQGZyZWVzd2l0Y2gub3JnICAgICAgIHxcbiIKCQkJInwgICBCcm91Z2h0IHRvIHlvdSBieSBD bHVlQ29uIGh0dHA6Ly93d3cuY2x1ZWNvbi5jb20vICAgICAgICAgfFxuIgoJCQkiLj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0uXG4i CgkJCSJcbiIpOwp9CgoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX3N0YXR1c190KSBzd2l0Y2hfY29y ZV9pbml0X2FuZF9tb2Rsb2FkKHN3aXRjaF9jb3JlX2ZsYWdfdCBmbGFncywgc3dpdGNoX2Jvb2xf dCBjb25zb2xlLCBjb25zdCBjaGFyICoqZXJyKQp7Cglzd2l0Y2hfZXZlbnRfdCAqZXZlbnQ7Cglj aGFyICpjbWQ7CglpbnQgeCA9IDA7Cgljb25zdCBjaGFyICp1c2UgPSBOVUxMOwojaW5jbHVkZSAi Y2MuaCIKCgoJaWYgKHN3aXRjaF9jb3JlX2luaXQoZmxhZ3MsIGNvbnNvbGUsIGVycikgIT0gU1dJ VENIX1NUQVRVU19TVUNDRVNTKSB7CgkJcmV0dXJuIFNXSVRDSF9TVEFUVVNfR0VORVJSOwoJfQoK CWlmIChydW50aW1lLnJ1bmxldmVsID4gMSkgewoJCS8qIG9uZSBwZXIgY3VzdG9tZXIgKi8KCQly ZXR1cm4gU1dJVENIX1NUQVRVU19TVUNDRVNTOwoJfQoKCXJ1bnRpbWUucnVubGV2ZWwrKzsKCXJ1 bnRpbWUuZXZlbnRzX3VzZV9kaXNwYXRjaCA9IDE7CgoJc3dpdGNoX2NvcmVfc2V0X3NpZ25hbF9o YW5kbGVycygpOwoJc3dpdGNoX2xvYWRfbmV0d29ya19saXN0cyhTV0lUQ0hfRkFMU0UpOwoKCXN3 aXRjaF9tc3JwX2luaXQoKTsKCglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0cs IFNXSVRDSF9MT0dfQ09OU09MRSwgIkJyaW5naW5nIHVwIGVudmlyb25tZW50LlxuIik7Cglzd2l0 Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ09OU09MRSwgIkxv YWRpbmcgTW9kdWxlcy5cbiIpOwoJaWYgKHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfaW5pdChTV0lU Q0hfVFJVRSkgIT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJKmVyciA9ICJDYW5ub3QgbG9h ZCBtb2R1bGVzIjsKCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRD SF9MT0dfQ09OU09MRSwgIkVycm9yOiAlc1xuIiwgKmVycik7CgkJcmV0dXJuIFNXSVRDSF9TVEFU VVNfR0VORVJSOwoJfQoKCXN3aXRjaF9sb2FkX25ldHdvcmtfbGlzdHMoU1dJVENIX0ZBTFNFKTsK Cglzd2l0Y2hfbG9hZF9jb3JlX2NvbmZpZygicG9zdF9sb2FkX3N3aXRjaC5jb25mIik7CgoJc3dp dGNoX2NvcmVfc2V0X3NpZ25hbF9oYW5kbGVycygpOwoKCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRl KCZldmVudCwgU1dJVENIX0VWRU5UX1NUQVJUVVApID09IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykg ewoJCXN3aXRjaF9ldmVudF9hZGRfaGVhZGVyKGV2ZW50LCBTV0lUQ0hfU1RBQ0tfQk9UVE9NLCAi RXZlbnQtSW5mbyIsICJTeXN0ZW0gUmVhZHkiKTsKCQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQp OwoJfQoKCXN3aXRjaF9jb3JlX3NjcmVlbl9zaXplKCZ4LCBOVUxMKTsKCgl1c2UgPSAoeCA+IDEw MCkgPyBjYyA6IGNjX3M7CgojaWZkZWYgV0lOMzIKCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9D SEFOTkVMX0xPRywgU1dJVENIX0xPR19DT05TT0xFLCAiJXMlc1xuXG4iLCBzd2l0Y2hfY29yZV9i YW5uZXIoKSwgdXNlKTsKI2Vsc2UKCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xP RywgU1dJVENIX0xPR19DT05TT0xFLCAiJXMlcyVzJXMlcyVzXG5cbiIsCgkJCQkJICBTV0lUQ0hf U0VRX0RFRkFVTFRfQ09MT1IsCgkJCQkJICBTV0lUQ0hfU0VRX0ZZRUxMT1csIFNXSVRDSF9TRVFf QkJMVUUsCgkJCQkJICBzd2l0Y2hfY29yZV9iYW5uZXIoKSwKCQkJCQkgIHVzZSwgU1dJVENIX1NF UV9ERUZBVUxUX0NPTE9SKTsKCiNlbmRpZgoKCglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hB Tk5FTF9MT0csIFNXSVRDSF9MT0dfSU5GTywKCQkJCQkgICJcbkZyZWVTV0lUQ0ggVmVyc2lvbiAl cyAoJXMpXG5cbkZyZWVTV0lUQ0ggU3RhcnRlZFxuTWF4IFNlc3Npb25zIFsldV1cblNlc3Npb24g UmF0ZSBbJWRdXG5TUUwgWyVzXVxuIiwKCQkJCQkgIHN3aXRjaF92ZXJzaW9uX2Z1bGwoKSwgc3dp dGNoX3ZlcnNpb25fcmV2aXNpb25faHVtYW4oKSwKCQkJCQkgIHN3aXRjaF9jb3JlX3Nlc3Npb25f bGltaXQoMCksCgkJCQkJICBzd2l0Y2hfY29yZV9zZXNzaW9uc19wZXJfc2Vjb25kKDApLCBzd2l0 Y2hfdGVzdF9mbGFnKCgmcnVudGltZSksIFNDRl9VU0VfU1FMKSA/ICJFbmFibGVkIiA6ICJEaXNh YmxlZCIpOwoKCglpZiAoeCA8IDE2MCkgewoJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFO TkVMX0xPRywgU1dJVENIX0xPR19DT05TT0xFLCAiXG5bVGhpcyBhcHAgQmVzdCB2aWV3ZWQgYXQg MTYweDYwIG9yIG1vcmUuLl1cbiIpOwoJfQoKCXN3aXRjaF9jbGVhcl9mbGFnKCgmcnVudGltZSks IFNDRl9OT19ORVdfU0VTU0lPTlMpOwoKCWlmICgoY21kID0gc3dpdGNoX2NvcmVfZ2V0X3Zhcmlh YmxlX2R1cCgiYXBpX29uX3N0YXJ0dXAiKSkpIHsKCQlzd2l0Y2hfc3RyZWFtX2hhbmRsZV90IHN0 cmVhbSA9IHsgMCB9OwoJCVNXSVRDSF9TVEFOREFSRF9TVFJFQU0oc3RyZWFtKTsKCQlzd2l0Y2hf Y29uc29sZV9leGVjdXRlKGNtZCwgMCwgJnN0cmVhbSk7CgkJc3dpdGNoX2xvZ19wcmludGYoU1dJ VENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NPTlNPTEUsICJTdGFydHVwIGNvbW1hbmQgWyVz XSBleGVjdXRlZC4gT3V0cHV0OlxuJXNcbiIsIGNtZCwgKGNoYXIgKilzdHJlYW0uZGF0YSk7CgkJ ZnJlZShzdHJlYW0uZGF0YSk7CgkJZnJlZShjbWQpOwoJfQoKCXJldHVybiBTV0lUQ0hfU1RBVFVT X1NVQ0NFU1M7Cgp9CgpTV0lUQ0hfREVDTEFSRSh2b2lkKSBzd2l0Y2hfY29yZV9tZWFzdXJlX3Rp bWUoc3dpdGNoX3RpbWVfdCB0b3RhbF9tcywgc3dpdGNoX2NvcmVfdGltZV9kdXJhdGlvbl90ICpk dXJhdGlvbikKewoJc3dpdGNoX3RpbWVfdCB0ZW1wID0gdG90YWxfbXMgLyAxMDAwOwoJbWVtc2V0 KGR1cmF0aW9uLCAwLCBzaXplb2YoKmR1cmF0aW9uKSk7CglkdXJhdGlvbi0+bW1zID0gKHVpbnQz Ml90KSAodG90YWxfbXMgJSAxMDAwKTsKCWR1cmF0aW9uLT5tcyA9ICh1aW50MzJfdCkgKHRlbXAg JSAxMDAwKTsKCXRlbXAgPSB0ZW1wIC8gMTAwMDsKCWR1cmF0aW9uLT5zZWMgPSAodWludDMyX3Qp ICh0ZW1wICUgNjApOwoJdGVtcCA9IHRlbXAgLyA2MDsKCWR1cmF0aW9uLT5taW4gPSAodWludDMy X3QpICh0ZW1wICUgNjApOwoJdGVtcCA9IHRlbXAgLyA2MDsKCWR1cmF0aW9uLT5ociA9ICh1aW50 MzJfdCkgKHRlbXAgJSAyNCk7Cgl0ZW1wID0gdGVtcCAvIDI0OwoJZHVyYXRpb24tPmRheSA9ICh1 aW50MzJfdCkgKHRlbXAgJSAzNjUpOwoJZHVyYXRpb24tPnlyID0gKHVpbnQzMl90KSAodGVtcCAv IDM2NSk7Cn0KClNXSVRDSF9ERUNMQVJFKHN3aXRjaF90aW1lX3QpIHN3aXRjaF9jb3JlX3VwdGlt ZSh2b2lkKQp7CglyZXR1cm4gc3dpdGNoX21vbm9fbWljcm9fdGltZV9ub3coKSAtIHJ1bnRpbWUu aW5pdGlhdGVkOwp9CgoKI2lmZGVmIF9NU0NfVkVSCnN0YXRpYyB2b2lkIHdpbl9zaHV0ZG93bih2 b2lkKQp7CgoJSEFORExFIHNodXRkb3duX2V2ZW50OwoJY2hhciBwYXRoWzUxMl07CgkvKiBmb3Ig d2luZG93cyB3ZSBuZWVkIHRoZSBldmVudCB0byBzaWduYWwgZm9yIHNodXR0aW5nIGRvd24gYSBi YWNrZ3JvdW5kIEZyZWVTV0lUQ0ggKi8KCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIkds b2JhbFxcRnJlZXN3aXRjaC4lZCIsIGdldHBpZCgpKTsKCgkvKiBvcGVuIHRoZSBldmVudCBzbyB3 ZSBjYW4gc2lnbmFsIGl0ICovCglzaHV0ZG93bl9ldmVudCA9IE9wZW5FdmVudChFVkVOVF9NT0RJ RllfU1RBVEUsIEZBTFNFLCBwYXRoKTsKCglpZiAoc2h1dGRvd25fZXZlbnQpIHsKCQkvKiBzaWdu YWwgdGhlIGV2ZW50IHRvIHNodXRkb3duICovCgkJU2V0RXZlbnQoc2h1dGRvd25fZXZlbnQpOwoJ CS8qIGNsZWFudXAgKi8KCQlDbG9zZUhhbmRsZShzaHV0ZG93bl9ldmVudCk7Cgl9Cn0KI2VuZGlm CgpTV0lUQ0hfREVDTEFSRSh2b2lkKSBzd2l0Y2hfY29yZV9zZXRfc2lnbmFsX2hhbmRsZXJzKHZv aWQpCnsKCS8qIHNldCBzaWduYWwgaGFuZGxlcnMgKi8KCXNpZ25hbChTSUdJTlQsIFNJR19JR04p OwojaWZkZWYgU0lHUElQRQoJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwojZW5kaWYKI2lmZGVm IFNJR0FMUk0KCXNpZ25hbChTSUdBTFJNLCBTSUdfSUdOKTsKI2VuZGlmCiNpZmRlZiBTSUdRVUlU CglzaWduYWwoU0lHUVVJVCwgU0lHX0lHTik7CiNlbmRpZgojaWZkZWYgU0lHUE9MTAoJc2lnbmFs KFNJR1BPTEwsIFNJR19JR04pOwojZW5kaWYKI2lmZGVmIFNJR0lPCglzaWduYWwoU0lHSU8sIFNJ R19JR04pOwojZW5kaWYKI2lmZGVmIFRSQVBfQlVTCglzaWduYWwoU0lHQlVTLCBoYW5kbGVfU0lH QlVTKTsKI2VuZGlmCiNpZmRlZiBTSUdVU1IxCglzaWduYWwoU0lHVVNSMSwgaGFuZGxlX1NJR0hV UCk7CiNlbmRpZgoJc2lnbmFsKFNJR0hVUCwgaGFuZGxlX1NJR0hVUCk7Cn0KClNXSVRDSF9ERUNM QVJFKHVpbnQzMl90KSBzd2l0Y2hfY29yZV9kZWJ1Z19sZXZlbCh2b2lkKQp7CglyZXR1cm4gcnVu dGltZS5kZWJ1Z19sZXZlbDsKfQoKU1dJVENIX0RFQ0xBUkUoaW50MzJfdCkgc3dpdGNoX2NvcmVf c3BzKHZvaWQpCnsKCXJldHVybiBydW50aW1lLnNwczsKfQoKU1dJVENIX0RFQ0xBUkUoaW50MzJf dCkgc3dpdGNoX2NvcmVfc3BzX2xhc3Qodm9pZCkKewoJcmV0dXJuIHJ1bnRpbWUuc3BzX2xhc3Q7 Cn0KClNXSVRDSF9ERUNMQVJFKGludDMyX3QpIHN3aXRjaF9jb3JlX3Nwc19wZWFrKHZvaWQpCnsK CXJldHVybiBydW50aW1lLnNwc19wZWFrOwp9CgpTV0lUQ0hfREVDTEFSRShpbnQzMl90KSBzd2l0 Y2hfY29yZV9zcHNfcGVha19maXZlbWluKHZvaWQpCnsKCXJldHVybiBydW50aW1lLnNwc19wZWFr X2ZpdmVtaW47Cn0KClNXSVRDSF9ERUNMQVJFKGludDMyX3QpIHN3aXRjaF9jb3JlX3Nlc3Npb25z X3BlYWsodm9pZCkKewoJcmV0dXJuIHJ1bnRpbWUuc2Vzc2lvbnNfcGVhazsKfQoKU1dJVENIX0RF Q0xBUkUoaW50MzJfdCkgc3dpdGNoX2NvcmVfc2Vzc2lvbnNfcGVha19maXZlbWluKHZvaWQpCnsK CXJldHVybiBydW50aW1lLnNlc3Npb25zX3BlYWtfZml2ZW1pbjsKfQoKU1dJVENIX0RFQ0xBUkUo aW50MzJfdCkgc3dpdGNoX2NvcmVfc2Vzc2lvbl9jdGwoc3dpdGNoX3Nlc3Npb25fY3RsX3QgY21k LCB2b2lkICp2YWwpCnsKCWludCAqaW50dmFsID0gKGludCAqKSB2YWw7CglpbnQgb2xkaW50dmFs ID0gMCwgbmV3aW50dmFsID0gMDsKCglpZiAoaW50dmFsKSB7CgkJb2xkaW50dmFsID0gKmludHZh bDsKCX0KCglpZiAoc3dpdGNoX3Rlc3RfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfU0hVVFRJTkdfRE9X TikpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgU0NTQ19SRUNPVkVS OgoJCXsKCQkJY2hhciAqYXJnID0gKGNoYXIgKikgdmFsOwoJCQljaGFyICp0ZWNoID0gTlVMTCwg KnByb2YgPSBOVUxMOwoJCQlpbnQgciwgZmx1c2ggPSAwOwoKCQkJaWYgKCF6c3RyKGFyZykpIHsK CQkJCXRlY2ggPSBzdHJkdXAoYXJnKTsKCgkJCQlpZiAoKHByb2YgPSBzdHJjaHIodGVjaCwgJzon KSkpIHsKCQkJCQkqcHJvZisrID0gJ1wwJzsKCQkJCX0KCgkJCQlpZiAoIXN0cmNhc2VjbXAodGVj aCwgImZsdXNoIikpIHsKCQkJCQlmbHVzaCsrOwoJCQkJCXRlY2ggPSBOVUxMOwoKCQkJCQlpZiAo cHJvZikgewoJCQkJCQl0ZWNoID0gcHJvZjsKCQkJCQkJaWYgKChwcm9mID0gc3RyY2hyKHRlY2gs ICc6JykpKSB7CgkJCQkJCQkqcHJvZisrID0gJ1wwJzsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJ CX0KCgkJCWlmIChmbHVzaCkgewoJCQkJc3dpdGNoX2NvcmVfcmVjb3ZlcnlfZmx1c2godGVjaCwg cHJvZik7CgkJCQlyID0gLTE7CgkJCX0gZWxzZSB7CgkJCQlyID0gc3dpdGNoX2NvcmVfcmVjb3Zl cnlfcmVjb3Zlcih0ZWNoLCBwcm9mKTsKCQkJfQoKCQkJc3dpdGNoX3NhZmVfZnJlZSh0ZWNoKTsK CQkJcmV0dXJuIHI7CgoJCX0KCQlicmVhazsKCWNhc2UgU0NTQ19ERUJVR19TUUw6CgkJewoJCQlp ZiAoc3dpdGNoX3Rlc3RfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfREVCVUdfU1FMKSkgewoJCQkJc3dp dGNoX2NsZWFyX2ZsYWcoKCZydW50aW1lKSwgU0NGX0RFQlVHX1NRTCk7CgkJCQluZXdpbnR2YWwg PSAwOwoJCQl9IGVsc2UgewoJCQkJc3dpdGNoX3NldF9mbGFnKCgmcnVudGltZSksIFNDRl9ERUJV R19TUUwpOwoJCQkJbmV3aW50dmFsID0gMTsKCQkJfQoJCX0KCQlicmVhazsKCWNhc2UgU0NTQ19W RVJCT1NFX0VWRU5UUzoKCQlpZiAoaW50dmFsKSB7CgkJCWlmIChvbGRpbnR2YWwgPiAtMSkgewoJ CQkJaWYgKG9sZGludHZhbCkgewoJCQkJCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0Zf VkVSQk9TRV9FVkVOVFMpOwoJCQkJfSBlbHNlIHsKCQkJCQlzd2l0Y2hfY2xlYXJfZmxhZygoJnJ1 bnRpbWUpLCBTQ0ZfVkVSQk9TRV9FVkVOVFMpOwoJCQkJfQoJCQl9CgkJCW5ld2ludHZhbCA9IHN3 aXRjaF90ZXN0X2ZsYWcoKCZydW50aW1lKSwgU0NGX1ZFUkJPU0VfRVZFTlRTKTsKCQl9CgkJYnJl YWs7CgljYXNlIFNDU0NfQVBJX0VYUEFOU0lPTjoKCQlpZiAoaW50dmFsKSB7CgkJCWlmIChvbGRp bnR2YWwgPiAtMSkgewoJCQkJaWYgKG9sZGludHZhbCkgewoJCQkJCXN3aXRjaF9zZXRfZmxhZygo JnJ1bnRpbWUpLCBTQ0ZfQVBJX0VYUEFOU0lPTik7CgkJCQl9IGVsc2UgewoJCQkJCXN3aXRjaF9j bGVhcl9mbGFnKCgmcnVudGltZSksIFNDRl9BUElfRVhQQU5TSU9OKTsKCQkJCX0KCQkJfQoJCQlu ZXdpbnR2YWwgPSBzd2l0Y2hfdGVzdF9mbGFnKCgmcnVudGltZSksIFNDRl9BUElfRVhQQU5TSU9O KTsKCQl9CgkJYnJlYWs7CgljYXNlIFNDU0NfVEhSRUFERURfU1lTVEVNX0VYRUM6CgkJaWYgKGlu dHZhbCkgewoJCQlpZiAob2xkaW50dmFsID4gLTEpIHsKCQkJCWlmIChvbGRpbnR2YWwpIHsKCQkJ CQlzd2l0Y2hfc2V0X2ZsYWcoKCZydW50aW1lKSwgU0NGX1RIUkVBREVEX1NZU1RFTV9FWEVDKTsK CQkJCX0gZWxzZSB7CgkJCQkJc3dpdGNoX2NsZWFyX2ZsYWcoKCZydW50aW1lKSwgU0NGX1RIUkVB REVEX1NZU1RFTV9FWEVDKTsKCQkJCX0KCQkJfQoJCQluZXdpbnR2YWwgPSBzd2l0Y2hfdGVzdF9m bGFnKCgmcnVudGltZSksIFNDRl9USFJFQURFRF9TWVNURU1fRVhFQyk7CgkJfQoJCWJyZWFrOwoJ Y2FzZSBTQ1NDX0NBTElCUkFURV9DTE9DSzoKCQlzd2l0Y2hfdGltZV9jYWxpYnJhdGVfY2xvY2so KTsKCQlicmVhazsKCWNhc2UgU0NTQ19GTFVTSF9EQl9IQU5ETEVTOgoJCXN3aXRjaF9jYWNoZV9k Yl9mbHVzaF9oYW5kbGVzKCk7CgkJYnJlYWs7CgljYXNlIFNDU0NfU0VORF9TSUdIVVA6CgkJaGFu ZGxlX1NJR0hVUCgxKTsKCQlicmVhazsKCWNhc2UgU0NTQ19TWU5DX0NMT0NLOgoJCXN3aXRjaF90 aW1lX3N5bmMoKTsKCQluZXdpbnR2YWwgPSAwOwoJCWJyZWFrOwoJY2FzZSBTQ1NDX1NZTkNfQ0xP Q0tfV0hFTl9JRExFOgoJCW5ld2ludHZhbCA9IHN3aXRjaF9jb3JlX3Nlc3Npb25fc3luY19jbG9j aygpOwoJCWJyZWFrOwoJY2FzZSBTQ1NDX1NRTDoKCQlpZiAob2xkaW50dmFsKSB7CgkJCXN3aXRj aF9jb3JlX3NxbGRiX3Jlc3VtZSgpOwoJCX0gZWxzZSB7CgkJCXN3aXRjaF9jb3JlX3NxbGRiX3Bh dXNlKCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBTQ1NDX1BBVVNFX0FMTDoKCQlpZiAob2xkaW50dmFs KSB7CgkJCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfTk9fTkVXX1NFU1NJT05TKTsK CQl9IGVsc2UgewoJCQlzd2l0Y2hfY2xlYXJfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfTk9fTkVXX1NF U1NJT05TKTsKCQl9CgkJYnJlYWs7CgljYXNlIFNDU0NfUEFVU0VfSU5CT1VORDoKCQlpZiAob2xk aW50dmFsKSB7CgkJCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfTk9fTkVXX0lOQk9V TkRfU0VTU0lPTlMpOwoJCX0gZWxzZSB7CgkJCXN3aXRjaF9jbGVhcl9mbGFnKCgmcnVudGltZSks IFNDRl9OT19ORVdfSU5CT1VORF9TRVNTSU9OUyk7CgkJfQoJCWJyZWFrOwoJY2FzZSBTQ1NDX1BB VVNFX09VVEJPVU5EOgoJCWlmIChvbGRpbnR2YWwpIHsKCQkJc3dpdGNoX3NldF9mbGFnKCgmcnVu dGltZSksIFNDRl9OT19ORVdfT1VUQk9VTkRfU0VTU0lPTlMpOwoJCX0gZWxzZSB7CgkJCXN3aXRj aF9jbGVhcl9mbGFnKCgmcnVudGltZSksIFNDRl9OT19ORVdfT1VUQk9VTkRfU0VTU0lPTlMpOwoJ CX0KCQlicmVhazsKCWNhc2UgU0NTQ19IVVBBTEw6CgkJc3dpdGNoX2NvcmVfc2Vzc2lvbl9odXBh bGwoU1dJVENIX0NBVVNFX01BTkFHRVJfUkVRVUVTVCk7CgkJYnJlYWs7CgljYXNlIFNDU0NfQ0FO Q0VMX1NIVVRET1dOOgoJCXN3aXRjaF9jbGVhcl9mbGFnKCgmcnVudGltZSksIFNDRl9TSFVURE9X Tl9SRVFVRVNURUQpOwoJCWJyZWFrOwoJY2FzZSBTQ1NDX1NBVkVfSElTVE9SWToKCQlzd2l0Y2hf Y29uc29sZV9zYXZlX2hpc3RvcnkoKTsKCQlicmVhazsKCWNhc2UgU0NTQ19DUkFTSDoKCQlzd2l0 Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwgIkRlY2xp bmF0aW8gTW9ydHV1cyBPYmZpcm1vIVxuIik7CgkJc3dpdGNoX2NvbnNvbGVfc2F2ZV9oaXN0b3J5 KCk7CgkJYWJvcnQoKTsKCQlicmVhazsKCWNhc2UgU0NTQ19TSFVURE9XTl9OT1c6CgkJc3dpdGNo X2NvbnNvbGVfc2F2ZV9oaXN0b3J5KCk7CgkJZXhpdCgwKTsKCQlicmVhazsKCWNhc2UgU0NTQ19S RUlOQ0FSTkFURV9OT1c6CgkJc3dpdGNoX2NvbnNvbGVfc2F2ZV9oaXN0b3J5KCk7CgkJZXhpdChT V0lUQ0hfU1RBVFVTX1JFU1RBUlQpOwoJCWJyZWFrOwoJY2FzZSBTQ1NDX1NIVVRET1dOX0VMRUdB TlQ6CgljYXNlIFNDU0NfU0hVVERPV05fQVNBUDoKCQl7CgkJCWludCB4ID0gMTk7CgkJCXVpbnQz Ml90IGNvdW50OwoKCQkJc3dpdGNoX3NldF9mbGFnKCgmcnVudGltZSksIFNDRl9TSFVURE9XTl9S RVFVRVNURUQpOwoJCQlpZiAoY21kID09IFNDU0NfU0hVVERPV05fQVNBUCkgewoJCQkJc3dpdGNo X3NldF9mbGFnKCgmcnVudGltZSksIFNDRl9OT19ORVdfU0VTU0lPTlMpOwoJCQl9CgoJCQl3aGls ZSAocnVudGltZS5ydW5uaW5nICYmIHN3aXRjaF90ZXN0X2ZsYWcoKCZydW50aW1lKSwgU0NGX1NI VVRET1dOX1JFUVVFU1RFRCkgJiYgKGNvdW50ID0gc3dpdGNoX2NvcmVfc2Vzc2lvbl9jb3VudCgp KSkgewoJCQkJc3dpdGNoX3lpZWxkKDUwMDAwMCk7CgkJCQlpZiAoKyt4ID09IDIwKSB7CgkJCQkJ c3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX1dBUk5JTkcs CgkJCQkJCQkJCSAgIlNodXRkb3duIGluIHByb2dyZXNzLCAldSBzZXNzaW9uKHMpIHJlbWFpbi5c blNodXR0aW5nIGRvd24gJXNcbiIsCgkJCQkJCQkJCSAgY291bnQsIGNtZCA9PSBTQ1NDX1NIVVRE T1dOX0FTQVAgPyAiQVNBUCIgOiAib25jZSB0aGVyZSBhcmUgbm8gYWN0aXZlIGNhbGxzLiIpOwoJ CQkJCXggPSAwOwoJCQkJfQoJCQl9CgoJCQlpZiAoc3dpdGNoX3Rlc3RfZmxhZygoJnJ1bnRpbWUp LCBTQ0ZfU0hVVERPV05fUkVRVUVTVEVEKSkgewoJCQkJc3dpdGNoX3NldF9mbGFnKCgmcnVudGlt ZSksIFNDRl9OT19ORVdfU0VTU0lPTlMpOwojaWZkZWYgX01TQ19WRVIKCQkJCXdpbl9zaHV0ZG93 bigpOwojZW5kaWYKCgkJCQlpZiAob2xkaW50dmFsKSB7CgkJCQkJc3dpdGNoX3NldF9mbGFnKCgm cnVudGltZSksIFNDRl9SRVNUQVJUKTsKCQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hB Tk5FTF9MT0csIFNXSVRDSF9MT0dfSU5GTywgIlJlc3RhcnRpbmdcbiIpOwoJCQkJfSBlbHNlIHsK CQkJCQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfSU5G TywgIlNodXR0aW5nIGRvd25cbiIpOwojaWZkZWYgX01TQ19WRVIKCQkJCQlmY2xvc2Uoc3RkaW4p OwojZW5kaWYKCQkJCX0KCQkJCXJ1bnRpbWUucnVubmluZyA9IDA7CgkJCX0gZWxzZSB7CgkJCQlz d2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfSU5GTywgIlNo dXRkb3duIENhbmNlbGxlZFxuIik7CgkJCQlzd2l0Y2hfY2xlYXJfZmxhZygoJnJ1bnRpbWUpLCBT Q0ZfTk9fTkVXX1NFU1NJT05TKTsKCQkJfQoJCX0KCQlicmVhazsKCWNhc2UgU0NTQ19QQVVTRV9D SEVDSzoKCQluZXdpbnR2YWwgPSAhIShzd2l0Y2hfdGVzdF9mbGFnKCgmcnVudGltZSksIFNDRl9O T19ORVdfU0VTU0lPTlMpID09IFNDRl9OT19ORVdfU0VTU0lPTlMpOwoJCWJyZWFrOwoJY2FzZSBT Q1NDX1BBVVNFX0lOQk9VTkRfQ0hFQ0s6CgkJbmV3aW50dmFsID0gISFzd2l0Y2hfdGVzdF9mbGFn KCgmcnVudGltZSksIFNDRl9OT19ORVdfSU5CT1VORF9TRVNTSU9OUyk7CgkJYnJlYWs7CgljYXNl IFNDU0NfUEFVU0VfT1VUQk9VTkRfQ0hFQ0s6CgkJbmV3aW50dmFsID0gISFzd2l0Y2hfdGVzdF9m bGFnKCgmcnVudGltZSksIFNDRl9OT19ORVdfT1VUQk9VTkRfU0VTU0lPTlMpOwoJCWJyZWFrOwoJ Y2FzZSBTQ1NDX1JFQURZX0NIRUNLOgoJCW5ld2ludHZhbCA9IHN3aXRjaF9jb3JlX3JlYWR5KCk7 CgkJYnJlYWs7CgljYXNlIFNDU0NfU0hVVERPV05fQ0hFQ0s6CgkJbmV3aW50dmFsID0gISFzd2l0 Y2hfdGVzdF9mbGFnKCgmcnVudGltZSksIFNDRl9TSFVURE9XTl9SRVFVRVNURUQpOwoJCWJyZWFr OwoJY2FzZSBTQ1NDX1NIVVRET1dOOgoKI2lmZGVmIF9NU0NfVkVSCgkJd2luX3NodXRkb3duKCk7 CiNlbmRpZgoKCQlpZiAob2xkaW50dmFsKSB7CgkJCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUp LCBTQ0ZfUkVTVEFSVCk7CgkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywg U1dJVENIX0xPR19JTkZPLCAiUmVzdGFydGluZ1xuIik7CgkJfSBlbHNlIHsKCQkJc3dpdGNoX2xv Z19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0lORk8sICJTaHV0dGluZyBk b3duXG4iKTsKI2lmZGVmIF9NU0NfVkVSCgkJCWZjbG9zZShzdGRpbik7CiNlbmRpZgoJCX0KCQly dW50aW1lLnJ1bm5pbmcgPSAwOwoJCWJyZWFrOwoJY2FzZSBTQ1NDX0NIRUNLX1JVTk5JTkc6CgkJ bmV3aW50dmFsID0gcnVudGltZS5ydW5uaW5nOwoJCWJyZWFrOwoJY2FzZSBTQ1NDX0xPR0xFVkVM OgoJCWlmIChvbGRpbnR2YWwgPiAtMSkgewoJCQlydW50aW1lLmhhcmRfbG9nX2xldmVsID0gb2xk aW50dmFsOwoJCX0KCgkJaWYgKHJ1bnRpbWUuaGFyZF9sb2dfbGV2ZWwgPiBTV0lUQ0hfTE9HX0RF QlVHKSB7CgkJCXJ1bnRpbWUuaGFyZF9sb2dfbGV2ZWwgPSBTV0lUQ0hfTE9HX0RFQlVHOwoJCX0K CQluZXdpbnR2YWwgPSBydW50aW1lLmhhcmRfbG9nX2xldmVsOwoJCWJyZWFrOwoJY2FzZSBTQ1ND X0RFQlVHX0xFVkVMOgoJCWlmIChvbGRpbnR2YWwgPiAtMSkgewoJCQlpZiAob2xkaW50dmFsID4g MTApCgkJCQluZXdpbnR2YWwgPSAxMDsKCQkJcnVudGltZS5kZWJ1Z19sZXZlbCA9IG9sZGludHZh bDsKCQl9CgkJbmV3aW50dmFsID0gcnVudGltZS5kZWJ1Z19sZXZlbDsKCQlicmVhazsKCWNhc2Ug U0NTQ19NSU5fSURMRV9DUFU6CgkJewoJCQlkb3VibGUgKmR2YWwgPSAoZG91YmxlICopIHZhbDsK CQkJaWYgKGR2YWwpIHsKCQkJCSpkdmFsID0gc3dpdGNoX2NvcmVfbWluX2lkbGVfY3B1KCpkdmFs KTsKCQkJfQoJCQlpbnR2YWwgPSBOVUxMOwoJCX0KCQlicmVhazsKCWNhc2UgU0NTQ19NQVhfU0VT U0lPTlM6CgkJbmV3aW50dmFsID0gc3dpdGNoX2NvcmVfc2Vzc2lvbl9saW1pdChvbGRpbnR2YWwp OwoJCWJyZWFrOwoJY2FzZSBTQ1NDX0xBU1RfU1BTOgoJCW5ld2ludHZhbCA9IHJ1bnRpbWUuc3Bz X2xhc3Q7CgkJYnJlYWs7CgljYXNlIFNDU0NfU1BTX1BFQUs6CgkJaWYgKG9sZGludHZhbCA9PSAt MSkgewoJCQlydW50aW1lLnNwc19wZWFrID0gMDsKCQl9CgkJbmV3aW50dmFsID0gcnVudGltZS5z cHNfcGVhazsKCQlicmVhazsKCWNhc2UgU0NTQ19TUFNfUEVBS19GSVZFTUlOOgoJCW5ld2ludHZh bCA9IHJ1bnRpbWUuc3BzX3BlYWtfZml2ZW1pbjsKCQlicmVhazsKCWNhc2UgU0NTQ19TRVNTSU9O U19QRUFLOgoJCW5ld2ludHZhbCA9IHJ1bnRpbWUuc2Vzc2lvbnNfcGVhazsKCQlicmVhazsKCWNh c2UgU0NTQ19TRVNTSU9OU19QRUFLX0ZJVkVNSU46CgkJbmV3aW50dmFsID0gcnVudGltZS5zZXNz aW9uc19wZWFrX2ZpdmVtaW47CgkJYnJlYWs7CgljYXNlIFNDU0NfTUFYX0RUTUZfRFVSQVRJT046 CgkJbmV3aW50dmFsID0gc3dpdGNoX2NvcmVfbWF4X2R0bWZfZHVyYXRpb24ob2xkaW50dmFsKTsK CQlicmVhazsKCWNhc2UgU0NTQ19NSU5fRFRNRl9EVVJBVElPTjoKCQluZXdpbnR2YWwgPSBzd2l0 Y2hfY29yZV9taW5fZHRtZl9kdXJhdGlvbihvbGRpbnR2YWwpOwoJCWJyZWFrOwoJY2FzZSBTQ1ND X0RFRkFVTFRfRFRNRl9EVVJBVElPTjoKCQluZXdpbnR2YWwgPSBzd2l0Y2hfY29yZV9kZWZhdWx0 X2R0bWZfZHVyYXRpb24ob2xkaW50dmFsKTsKCQlicmVhazsKCWNhc2UgU0NTQ19TUFM6CgkJc3dp dGNoX211dGV4X2xvY2socnVudGltZS50aHJvdHRsZV9tdXRleCk7CgkJaWYgKG9sZGludHZhbCA+ IDApIHsKCQkJcnVudGltZS5zcHNfdG90YWwgPSBvbGRpbnR2YWw7CgkJfQoJCW5ld2ludHZhbCA9 IHJ1bnRpbWUuc3BzX3RvdGFsOwoJCXN3aXRjaF9tdXRleF91bmxvY2socnVudGltZS50aHJvdHRs ZV9tdXRleCk7CgkJYnJlYWs7CgoJY2FzZSBTQ1NDX1JFQ0xBSU06CgkJc3dpdGNoX2NvcmVfbWVt b3J5X3JlY2xhaW1fYWxsKCk7CgkJbmV3aW50dmFsID0gMDsKCQlicmVhazsKCX0KCglpZiAoaW50 dmFsKSB7CgkJKmludHZhbCA9IG5ld2ludHZhbDsKCX0KCgoJcmV0dXJuIDA7Cn0KClNXSVRDSF9E RUNMQVJFKHN3aXRjaF9jb3JlX2ZsYWdfdCkgc3dpdGNoX2NvcmVfZmxhZ3Modm9pZCkKewoJcmV0 dXJuIHJ1bnRpbWUuZmxhZ3M7Cn0KClNXSVRDSF9ERUNMQVJFKHN3aXRjaF9ib29sX3QpIHN3aXRj aF9jb3JlX3J1bm5pbmcodm9pZCkKewoJcmV0dXJuIHJ1bnRpbWUucnVubmluZyA/IFNXSVRDSF9U UlVFIDogU1dJVENIX0ZBTFNFOwp9CgpTV0lUQ0hfREVDTEFSRShzd2l0Y2hfYm9vbF90KSBzd2l0 Y2hfY29yZV9yZWFkeSh2b2lkKQp7CglyZXR1cm4gKHN3aXRjaF90ZXN0X2ZsYWcoKCZydW50aW1l KSwgU0NGX1NIVVRUSU5HX0RPV04pIHx8IHN3aXRjaF90ZXN0X2ZsYWcoKCZydW50aW1lKSwgU0NG X05PX05FV19TRVNTSU9OUykgPT0gU0NGX05PX05FV19TRVNTSU9OUykgPyBTV0lUQ0hfRkFMU0Ug OiBTV0lUQ0hfVFJVRTsKfQoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX2Jvb2xfdCkgc3dpdGNoX2Nv cmVfcmVhZHlfaW5ib3VuZCh2b2lkKQp7CglyZXR1cm4gKHN3aXRjaF90ZXN0X2ZsYWcoKCZydW50 aW1lKSwgU0NGX1NIVVRUSU5HX0RPV04pIHx8IHN3aXRjaF90ZXN0X2ZsYWcoKCZydW50aW1lKSwg U0NGX05PX05FV19JTkJPVU5EX1NFU1NJT05TKSkgPyBTV0lUQ0hfRkFMU0UgOiBTV0lUQ0hfVFJV RTsKfQoKU1dJVENIX0RFQ0xBUkUoc3dpdGNoX2Jvb2xfdCkgc3dpdGNoX2NvcmVfcmVhZHlfb3V0 Ym91bmQodm9pZCkKewoJcmV0dXJuIChzd2l0Y2hfdGVzdF9mbGFnKCgmcnVudGltZSksIFNDRl9T SFVUVElOR19ET1dOKSB8fCBzd2l0Y2hfdGVzdF9mbGFnKCgmcnVudGltZSksIFNDRl9OT19ORVdf T1VUQk9VTkRfU0VTU0lPTlMpKSA/IFNXSVRDSF9GQUxTRSA6IFNXSVRDSF9UUlVFOwp9CgpTV0lU Q0hfREVDTEFSRShzd2l0Y2hfc3RhdHVzX3QpIHN3aXRjaF9jb3JlX2Rlc3Ryb3kodm9pZCkKewoJ c3dpdGNoX2V2ZW50X3QgKmV2ZW50OwoKCWlmIChzd2l0Y2hfZXZlbnRfY3JlYXRlKCZldmVudCwg U1dJVENIX0VWRU5UX1NIVVRET1dOKSA9PSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQlzd2l0 Y2hfZXZlbnRfYWRkX2hlYWRlcihldmVudCwgU1dJVENIX1NUQUNLX0JPVFRPTSwgIkV2ZW50LUlu Zm8iLCAiU3lzdGVtIFNodXR0aW5nIERvd24iKTsKCQlzd2l0Y2hfZXZlbnRfZmlyZSgmZXZlbnQp OwoJfQoKCXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfTk9fTkVXX1NFU1NJT05TKTsK CXN3aXRjaF9zZXRfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfU0hVVFRJTkdfRE9XTik7CgoJc3dpdGNo X2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9HLCBTV0lUQ0hfTE9HX0NPTlNPTEUsICJFbmQg ZXhpc3Rpbmcgc2Vzc2lvbnNcbiIpOwoJc3dpdGNoX2NvcmVfc2Vzc2lvbl9odXBhbGwoU1dJVENI X0NBVVNFX1NZU1RFTV9TSFVURE9XTik7Cglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5F TF9MT0csIFNXSVRDSF9MT0dfQ09OU09MRSwgIkNsZWFuIHVwIG1vZHVsZXMuXG4iKTsKCglzd2l0 Y2hfbG9hZGFibGVfbW9kdWxlX3NodXRkb3duKCk7CgoJc3dpdGNoX3NzbF9kZXN0cm95X3NzbF9s b2NrcygpOwoKCWlmIChzd2l0Y2hfdGVzdF9mbGFnKCgmcnVudGltZSksIFNDRl9VU0VfU1FMKSkg ewoJCXN3aXRjaF9jb3JlX3NxbGRiX3N0b3AoKTsKCX0KCXN3aXRjaF9zY2hlZHVsZXJfdGFza190 aHJlYWRfc3RvcCgpOwoKCXN3aXRjaF9ydHBfc2h1dGRvd24oKTsKCXN3aXRjaF9tc3JwX2Rlc3Ry b3koKTsKCglpZiAoc3dpdGNoX3Rlc3RfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfVVNFX0FVVE9fTkFU KSkgewoJCXN3aXRjaF9uYXRfc2h1dGRvd24oKTsKCX0KCXN3aXRjaF94bWxfZGVzdHJveSgpOwoJ c3dpdGNoX2NvbnNvbGVfc2h1dGRvd24oKTsKCXN3aXRjaF9jaGFubmVsX2dsb2JhbF91bmluaXQo KTsKCglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ09O U09MRSwgIkNsb3NpbmcgRXZlbnQgRW5naW5lLlxuIik7Cglzd2l0Y2hfZXZlbnRfc2h1dGRvd24o KTsKCglzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ09O U09MRSwgIkZpbmFsaXppbmcgU2h1dGRvd24uXG4iKTsKCXN3aXRjaF9sb2dfc2h1dGRvd24oKTsK Cglzd2l0Y2hfY29yZV9zZXNzaW9uX3VuaW5pdCgpOwoJc3dpdGNoX2NvcmVfdW5zZXRfdmFyaWFi bGVzKCk7Cglzd2l0Y2hfY29yZV9tZW1vcnlfc3RvcCgpOwoKCWlmIChydW50aW1lLmNvbnNvbGUg JiYgcnVudGltZS5jb25zb2xlICE9IHN0ZG91dCAmJiBydW50aW1lLmNvbnNvbGUgIT0gc3RkZXJy KSB7CgkJZmNsb3NlKHJ1bnRpbWUuY29uc29sZSk7CgkJcnVudGltZS5jb25zb2xlID0gTlVMTDsK CX0KCglzd2l0Y2hfc2FmZV9mcmVlKFNXSVRDSF9HTE9CQUxfZGlycy5iYXNlX2Rpcik7Cglzd2l0 Y2hfc2FmZV9mcmVlKFNXSVRDSF9HTE9CQUxfZGlycy5tb2RfZGlyKTsKCXN3aXRjaF9zYWZlX2Zy ZWUoU1dJVENIX0dMT0JBTF9kaXJzLmNvbmZfZGlyKTsKCXN3aXRjaF9zYWZlX2ZyZWUoU1dJVENI X0dMT0JBTF9kaXJzLmxvZ19kaXIpOwoJc3dpdGNoX3NhZmVfZnJlZShTV0lUQ0hfR0xPQkFMX2Rp cnMuZGJfZGlyKTsKCXN3aXRjaF9zYWZlX2ZyZWUoU1dJVENIX0dMT0JBTF9kaXJzLnNjcmlwdF9k aXIpOwoJc3dpdGNoX3NhZmVfZnJlZShTV0lUQ0hfR0xPQkFMX2RpcnMuaHRkb2NzX2Rpcik7Cglz d2l0Y2hfc2FmZV9mcmVlKFNXSVRDSF9HTE9CQUxfZGlycy5ncmFtbWFyX2Rpcik7Cglzd2l0Y2hf c2FmZV9mcmVlKFNXSVRDSF9HTE9CQUxfZGlycy5mb250c19kaXIpOwoJc3dpdGNoX3NhZmVfZnJl ZShTV0lUQ0hfR0xPQkFMX2RpcnMuaW1hZ2VzX2Rpcik7Cglzd2l0Y2hfc2FmZV9mcmVlKFNXSVRD SF9HTE9CQUxfZGlycy5zdG9yYWdlX2Rpcik7Cglzd2l0Y2hfc2FmZV9mcmVlKFNXSVRDSF9HTE9C QUxfZGlycy5jYWNoZV9kaXIpOwoJc3dpdGNoX3NhZmVfZnJlZShTV0lUQ0hfR0xPQkFMX2RpcnMu cmVjb3JkaW5nc19kaXIpOwoJc3dpdGNoX3NhZmVfZnJlZShTV0lUQ0hfR0xPQkFMX2RpcnMuc291 bmRzX2Rpcik7Cglzd2l0Y2hfc2FmZV9mcmVlKFNXSVRDSF9HTE9CQUxfZGlycy5ydW5fZGlyKTsK CXN3aXRjaF9zYWZlX2ZyZWUoU1dJVENIX0dMT0JBTF9kaXJzLnRlbXBfZGlyKTsKCXN3aXRjaF9z YWZlX2ZyZWUoU1dJVENIX0dMT0JBTF9kaXJzLmRhdGFfZGlyKTsKCXN3aXRjaF9zYWZlX2ZyZWUo U1dJVENIX0dMT0JBTF9kaXJzLmxvY2Fsc3RhdGVfZGlyKTsKCglzd2l0Y2hfZXZlbnRfZGVzdHJv eSgmcnVudGltZS5nbG9iYWxfdmFycyk7Cglzd2l0Y2hfY29yZV9oYXNoX2Rlc3Ryb3koJnJ1bnRp bWUucHRpbWVzKTsKCXN3aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmcnVudGltZS5taW1lX3R5cGVz KTsKCXN3aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmcnVudGltZS5taW1lX3R5cGVfZXh0cyk7CgoJ aWYgKElQX0xJU1QuaGFzaCkgewoJCXN3aXRjaF9jb3JlX2hhc2hfZGVzdHJveSgmSVBfTElTVC5o YXNoKTsKCX0KCglpZiAoSVBfTElTVC5wb29sKSB7CgkJc3dpdGNoX2NvcmVfZGVzdHJveV9tZW1v cnlfcG9vbCgmSVBfTElTVC5wb29sKTsKCX0KCglzd2l0Y2hfY29yZV9tZWRpYV9kZWluaXQoKTsK CglpZiAocnVudGltZS5tZW1vcnlfcG9vbCkgewoJCWFwcl9wb29sX2Rlc3Ryb3kocnVudGltZS5t ZW1vcnlfcG9vbCk7CgkJYXByX3Rlcm1pbmF0ZSgpOwoJfQoKCXNxbGl0ZTNfc2h1dGRvd24oKTsK CglyZXR1cm4gc3dpdGNoX3Rlc3RfZmxhZygoJnJ1bnRpbWUpLCBTQ0ZfUkVTVEFSVCkgPyBTV0lU Q0hfU1RBVFVTX1JFU1RBUlQgOiBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1M7Cn0KClNXSVRDSF9ERUNM QVJFKHN3aXRjaF9zdGF0dXNfdCkgc3dpdGNoX2NvcmVfbWFuYWdlbWVudF9leGVjKGNoYXIgKnJl bGF0aXZlX29pZCwgc3dpdGNoX21hbmFnZW1lbnRfYWN0aW9uX3QgYWN0aW9uLCBjaGFyICpkYXRh LCBzd2l0Y2hfc2l6ZV90IGRhdGFsZW4pCnsKCWNvbnN0IHN3aXRjaF9tYW5hZ2VtZW50X2ludGVy ZmFjZV90ICpwdHI7Cglzd2l0Y2hfc3RhdHVzX3Qgc3RhdHVzID0gU1dJVENIX1NUQVRVU19GQUxT RTsKCglpZiAoKHB0ciA9IHN3aXRjaF9sb2FkYWJsZV9tb2R1bGVfZ2V0X21hbmFnZW1lbnRfaW50 ZXJmYWNlKHJlbGF0aXZlX29pZCkpKSB7CgkJc3RhdHVzID0gcHRyLT5tYW5hZ2VtZW50X2Z1bmN0 aW9uKHJlbGF0aXZlX29pZCwgYWN0aW9uLCBkYXRhLCBkYXRhbGVuKTsKCX0KCglyZXR1cm4gc3Rh dHVzOwp9CgpTV0lUQ0hfREVDTEFSRSh2b2lkKSBzd2l0Y2hfY29yZV9tZW1vcnlfcmVjbGFpbV9h bGwodm9pZCkKewoJc3dpdGNoX2NvcmVfbWVtb3J5X3JlY2xhaW1fbG9nZ2VyKCk7Cglzd2l0Y2hf Y29yZV9tZW1vcnlfcmVjbGFpbV9ldmVudHMoKTsKCXN3aXRjaF9jb3JlX21lbW9yeV9yZWNsYWlt KCk7Cn0KCgpzdHJ1Y3Qgc3lzdGVtX3RocmVhZF9oYW5kbGUgewoJY29uc3QgY2hhciAqY21kOwoJ c3dpdGNoX3RocmVhZF9jb25kX3QgKmNvbmQ7Cglzd2l0Y2hfbXV0ZXhfdCAqbXV0ZXg7Cglzd2l0 Y2hfbWVtb3J5X3Bvb2xfdCAqcG9vbDsKCWludCByZXQ7CglpbnQgKmZkczsKfTsKCnN0YXRpYyB2 b2lkICpTV0lUQ0hfVEhSRUFEX0ZVTkMgc3lzdGVtX3RocmVhZChzd2l0Y2hfdGhyZWFkX3QgKnRo cmVhZCwgdm9pZCAqb2JqKQp7CglzdHJ1Y3Qgc3lzdGVtX3RocmVhZF9oYW5kbGUgKnN0aCA9IChz dHJ1Y3Qgc3lzdGVtX3RocmVhZF9oYW5kbGUgKikgb2JqOwoKI2lmIGRlZmluZWQoSEFWRV9TRVRS TElNSVQpICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQoJc3RydWN0IHJsaW1pdCBybGltOwoJc3Ry dWN0IHJsaW1pdCBybGltX3NhdmU7CgoJbWVtc2V0KCZybGltLCAwLCBzaXplb2YocmxpbSkpOwoJ Z2V0cmxpbWl0KFJMSU1JVF9TVEFDSywgJnJsaW0pOwoKCW1lbXNldCgmcmxpbV9zYXZlLCAwLCBz aXplb2YocmxpbV9zYXZlKSk7CglnZXRybGltaXQoUkxJTUlUX1NUQUNLLCAmcmxpbV9zYXZlKTsK CglybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heDsKCWlmIChzZXRybGltaXQoUkxJTUlUX1NU QUNLLCAmcmxpbSkgPCAwKSB7CgkJc3dpdGNoX2xvZ19wcmludGYoU1dJVENIX0NIQU5ORUxfTE9H LCBTV0lUQ0hfTE9HX0VSUk9SLCAiU2V0dGluZyBzdGFjayBzaXplIGZhaWxlZCEgKCVzKVxuIiwg c3RyZXJyb3IoZXJybm8pKTsKCX0KI2VuZGlmCgoJaWYgKHN0aC0+ZmRzKSB7CgkJZHVwMihzdGgt PmZkc1sxXSwgU1RET1VUX0ZJTEVOTyk7Cgl9CgoJc3RoLT5yZXQgPSBzeXN0ZW0oc3RoLT5jbWQp OwoKI2lmIGRlZmluZWQoSEFWRV9TRVRSTElNSVQpICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQoJ aWYgKHNldHJsaW1pdChSTElNSVRfU1RBQ0ssICZybGltX3NhdmUpIDwgMCkgewoJCXN3aXRjaF9s b2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xPR19FUlJPUiwgIlNldHRpbmcg c3RhY2sgc2l6ZSBmYWlsZWQhICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7Cgl9CiNlbmRpZgoK CXN3aXRjaF9tdXRleF9sb2NrKHN0aC0+bXV0ZXgpOwoJc3dpdGNoX3RocmVhZF9jb25kX3NpZ25h bChzdGgtPmNvbmQpOwoJc3dpdGNoX211dGV4X3VubG9jayhzdGgtPm11dGV4KTsKCglzd2l0Y2hf Y29yZV9kZXN0cm95X21lbW9yeV9wb29sKCZzdGgtPnBvb2wpOwoKCXJldHVybiBOVUxMOwp9CgoK c3RhdGljIGludCBzd2l0Y2hfc3lzdGVtX3RocmVhZChjb25zdCBjaGFyICpjbWQsIHN3aXRjaF9i b29sX3Qgd2FpdCkKewoJc3dpdGNoX3RocmVhZF90ICp0aHJlYWQ7Cglzd2l0Y2hfdGhyZWFkYXR0 cl90ICp0aGRfYXR0cjsKCWludCByZXQgPSAwOwoJc3RydWN0IHN5c3RlbV90aHJlYWRfaGFuZGxl ICpzdGg7Cglzd2l0Y2hfbWVtb3J5X3Bvb2xfdCAqcG9vbDsKCglpZiAoc3dpdGNoX2NvcmVfbmV3 X21lbW9yeV9wb29sKCZwb29sKSAhPSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQlzd2l0Y2hf bG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfQ1JJVCwgIlBvb2wgRmFp bHVyZVxuIik7CgkJcmV0dXJuIDE7Cgl9CgoJaWYgKCEoc3RoID0gc3dpdGNoX2NvcmVfYWxsb2Mo cG9vbCwgc2l6ZW9mKHN0cnVjdCBzeXN0ZW1fdGhyZWFkX2hhbmRsZSkpKSkgewoJCXN3aXRjaF9j b3JlX2Rlc3Ryb3lfbWVtb3J5X3Bvb2woJnBvb2wpOwoJCXJldHVybiAxOwoJfQoKCXN0aC0+cG9v bCA9IHBvb2w7CglzdGgtPmNtZCA9IHN3aXRjaF9jb3JlX3N0cmR1cChwb29sLCBjbWQpOwoKCXN3 aXRjaF90aHJlYWRfY29uZF9jcmVhdGUoJnN0aC0+Y29uZCwgc3RoLT5wb29sKTsKCXN3aXRjaF9t dXRleF9pbml0KCZzdGgtPm11dGV4LCBTV0lUQ0hfTVVURVhfTkVTVEVELCBzdGgtPnBvb2wpOwoJ c3dpdGNoX211dGV4X2xvY2soc3RoLT5tdXRleCk7CgoJc3dpdGNoX3RocmVhZGF0dHJfY3JlYXRl KCZ0aGRfYXR0ciwgc3RoLT5wb29sKTsKCXN3aXRjaF90aHJlYWRhdHRyX3N0YWNrc2l6ZV9zZXQo dGhkX2F0dHIsIFNXSVRDSF9TWVNURU1fVEhSRUFEX1NUQUNLU0laRSk7Cglzd2l0Y2hfdGhyZWFk YXR0cl9kZXRhY2hfc2V0KHRoZF9hdHRyLCAxKTsKCXN3aXRjaF90aHJlYWRfY3JlYXRlKCZ0aHJl YWQsIHRoZF9hdHRyLCBzeXN0ZW1fdGhyZWFkLCBzdGgsIHN0aC0+cG9vbCk7CgoJaWYgKHdhaXQp IHsKCQlzd2l0Y2hfdGhyZWFkX2NvbmRfd2FpdChzdGgtPmNvbmQsIHN0aC0+bXV0ZXgpOwoJCXJl dCA9IHN0aC0+cmV0OwoJfQoJc3dpdGNoX211dGV4X3VubG9jayhzdGgtPm11dGV4KTsKCglyZXR1 cm4gcmV0Owp9CgpTV0lUQ0hfREVDTEFSRShpbnQpIHN3aXRjaF9tYXhfZmlsZV9kZXNjKHZvaWQp CnsKCWludCBtYXggPSAwOwoKI2lmbmRlZiBXSU4zMgojaWYgZGVmaW5lZChIQVZFX0dFVERUQUJM RVNJWkUpCgltYXggPSBnZXRkdGFibGVzaXplKCk7CiNlbHNlCgltYXggPSBzeXNjb25mKF9TQ19P UEVOX01BWCk7CiNlbmRpZgojZW5kaWYKCglyZXR1cm4gbWF4OwoKfQoKU1dJVENIX0RFQ0xBUkUo dm9pZCkgc3dpdGNoX2Nsb3NlX2V4dHJhX2ZpbGVzKGludCAqa2VlcCwgaW50IGtlZXBfdHRsKQp7 CglpbnQgb3Blbl9tYXggPSBzd2l0Y2hfbWF4X2ZpbGVfZGVzYygpOwoJaW50IGksIGo7CgoJZm9y IChpID0gMzsgaSA8IG9wZW5fbWF4OyBpKyspIHsKCQlpZiAoa2VlcCkgewoJCQlmb3IgKGogPSAw OyBqIDwga2VlcF90dGw7IGorKykgewoJCQkJaWYgKGkgPT0ga2VlcFtqXSkgewoJCQkJCWdvdG8g c2tpcDsKCQkJCX0KCQkJfQoJCX0KCgkJY2xvc2UoaSk7CgoJc2tpcDoKCgkJY29udGludWU7CgoJ fQp9CgoKI2lmZGVmIFdJTjMyCnN0YXRpYyBpbnQgc3dpdGNoX3N5c3RlbV9mb3JrKGNvbnN0IGNo YXIgKmNtZCwgc3dpdGNoX2Jvb2xfdCB3YWl0KQp7CglyZXR1cm4gc3dpdGNoX3N5c3RlbV90aHJl YWQoY21kLCB3YWl0KTsKfQoKU1dJVENIX0RFQ0xBUkUocGlkX3QpIHN3aXRjaF9mb3JrKHZvaWQp CnsKCXJldHVybiAtMTsKfQoKCiNlbHNlCgpTV0lUQ0hfREVDTEFSRShwaWRfdCkgc3dpdGNoX2Zv cmsodm9pZCkKewoJaW50IGkgPSBmb3JrKCk7CgoJaWYgKCFpKSB7CgkJc2V0X2xvd19wcmlvcml0 eSgpOwoJfQoKCXJldHVybiBpOwp9CgoKCnN0YXRpYyBpbnQgc3dpdGNoX3N5c3RlbV9mb3JrKGNv bnN0IGNoYXIgKmNtZCwgc3dpdGNoX2Jvb2xfdCB3YWl0KQp7CglpbnQgcGlkOwoJY2hhciAqZGNt ZCA9IHN0cmR1cChjbWQpOwojaWYgZGVmaW5lZChIQVZFX1NFVFJMSU1JVCkgJiYgIWRlZmluZWQo X19GcmVlQlNEX18pCglzdHJ1Y3QgcmxpbWl0IHJsaW07CglzdHJ1Y3QgcmxpbWl0IHJsaW1fc2F2 ZTsKI2VuZGlmCgoJc3dpdGNoX2NvcmVfc2V0X3NpZ25hbF9oYW5kbGVycygpOwoKCXBpZCA9IHN3 aXRjaF9mb3JrKCk7CgoJaWYgKHBpZCkgewoJCWlmICh3YWl0KSB7CgkJCXdhaXRwaWQocGlkLCBO VUxMLCAwKTsKCQl9CgkJZnJlZShkY21kKTsKCX0gZWxzZSB7CgkJc3dpdGNoX2Nsb3NlX2V4dHJh X2ZpbGVzKE5VTEwsIDApOwoKI2lmIGRlZmluZWQoSEFWRV9TRVRSTElNSVQpICYmICFkZWZpbmVk KF9fRnJlZUJTRF9fKQoJCW1lbXNldCgmcmxpbSwgMCwgc2l6ZW9mKHJsaW0pKTsKCQlnZXRybGlt aXQoUkxJTUlUX1NUQUNLLCAmcmxpbSk7CgoJCW1lbXNldCgmcmxpbV9zYXZlLCAwLCBzaXplb2Yo cmxpbV9zYXZlKSk7CgkJZ2V0cmxpbWl0KFJMSU1JVF9TVEFDSywgJnJsaW1fc2F2ZSk7CgoJCXJs aW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4OwoJCWlmIChzZXRybGltaXQoUkxJTUlUX1NUQUNL LCAmcmxpbSkgPCAwKSB7CgkJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywg U1dJVENIX0xPR19FUlJPUiwgIlNldHRpbmcgc3RhY2sgc2l6ZSBmYWlsZWQhICglcylcbiIsIHN0 cmVycm9yKGVycm5vKSk7CgkJfQojZW5kaWYKCgkJaWYgKHN5c3RlbShkY21kKSA9PSAtMSkgewoJ CQlzd2l0Y2hfbG9nX3ByaW50ZihTV0lUQ0hfQ0hBTk5FTF9MT0csIFNXSVRDSF9MT0dfRVJST1Is ICJGYWlsZWQgdG8gZXhlY3V0ZSBiZWNhdXNlIG9mIGEgY29tbWFuZCBlcnJvciA6ICVzXG4iLCBk Y21kKTsKCQl9CgkJZnJlZShkY21kKTsKCQlleGl0KDApOwoJfQoKCXJldHVybiAwOwp9CiNlbmRp ZgoKCgpTV0lUQ0hfREVDTEFSRShpbnQpIHN3aXRjaF9zeXN0ZW0oY29uc3QgY2hhciAqY21kLCBz d2l0Y2hfYm9vbF90IHdhaXQpCnsKCWludCAoKnN5c19wKShjb25zdCBjaGFyICpjbWQsIHN3aXRj aF9ib29sX3Qgd2FpdCk7CgoJc3lzX3AgPSBzd2l0Y2hfdGVzdF9mbGFnKCgmcnVudGltZSksIFND Rl9USFJFQURFRF9TWVNURU1fRVhFQykgPyBzd2l0Y2hfc3lzdGVtX3RocmVhZCA6IHN3aXRjaF9z eXN0ZW1fZm9yazsKCglyZXR1cm4gc3lzX3AoY21kLCB3YWl0KTsKCn0KCgoKU1dJVENIX0RFQ0xB UkUoaW50KSBzd2l0Y2hfc3RyZWFtX3N5c3RlbV9mb3JrKGNvbnN0IGNoYXIgKmNtZCwgc3dpdGNo X3N0cmVhbV9oYW5kbGVfdCAqc3RyZWFtKQp7CiNpZmRlZiBXSU4zMgoJcmV0dXJuIHN3aXRjaF9z eXN0ZW0oY21kLCBTV0lUQ0hfVFJVRSk7CiNlbHNlCglpbnQgZmRzWzJdLCBwaWQgPSAwOwoKCWlm IChwaXBlKGZkcykpIHsKCQlnb3RvIGVuZDsKCX0gZWxzZSB7CQkJCQkvKiBnb29kIHRvIGdvICov CgkJcGlkID0gc3dpdGNoX2ZvcmsoKTsKCgkJaWYgKHBpZCA8IDApIHsJCQkvKiBvayBtYXliZSBu b3QgKi8KCQkJY2xvc2UoZmRzWzBdKTsKCQkJY2xvc2UoZmRzWzFdKTsKCQkJZ290byBlbmQ7CgkJ fSBlbHNlIGlmIChwaWQpIHsJCS8qIHBhcmVudCAqLwoJCQljaGFyIGJ1ZlsxMDI0XSA9ICIiOwoJ CQlpbnQgYnl0ZXM7CgkJCWNsb3NlKGZkc1sxXSk7CgkJCXdoaWxlICgoYnl0ZXMgPSByZWFkKGZk c1swXSwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkgewoJCQkJc3RyZWFtLT5yYXdfd3JpdGVfZnVu Y3Rpb24oc3RyZWFtLCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgYnl0ZXMpOwoJCQl9CgkJCWNsb3Nl KGZkc1swXSk7CgkJCXdhaXRwaWQocGlkLCBOVUxMLCAwKTsKCQl9IGVsc2UgewkJCQkvKiAgY2hp bGQgKi8KCQkJc3dpdGNoX2Nsb3NlX2V4dHJhX2ZpbGVzKGZkcywgMik7CgkJCWNsb3NlKGZkc1sw XSk7CgkJCWR1cDIoZmRzWzFdLCBTVERPVVRfRklMRU5PKTsKCQkJc3dpdGNoX3N5c3RlbShjbWQs IFNXSVRDSF9UUlVFKTsKCQkJY2xvc2UoZmRzWzFdKTsKCQkJZXhpdCgwKTsKCQl9Cgl9CgogZW5k OgoKCXJldHVybiAwOwoKI2VuZGlmCgp9CgpTV0lUQ0hfREVDTEFSRShzd2l0Y2hfc3RhdHVzX3Qp IHN3aXRjaF9jb3JlX2dldF9zdGFja3NpemVzKHN3aXRjaF9zaXplX3QgKmN1ciwgc3dpdGNoX3Np emVfdCAqbWF4KQp7CiNpZmRlZiBIQVZFX1NFVFJMSU1JVAoJc3RydWN0IHJsaW1pdCBybHA7CgoJ bWVtc2V0KCZybHAsIDAsIHNpemVvZihybHApKTsKCWdldHJsaW1pdChSTElNSVRfU1RBQ0ssICZy bHApOwoKCSpjdXIgPSBybHAucmxpbV9jdXI7CgkqbWF4ID0gcmxwLnJsaW1fbWF4OwoKCXJldHVy biBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1M7CgojZWxzZQoKCXJldHVybiBTV0lUQ0hfU1RBVFVTX0ZB TFNFOwoKI2VuZGlmCgoKCn0KCgpTV0lUQ0hfREVDTEFSRShpbnQpIHN3aXRjaF9zdHJlYW1fc3lz dGVtKGNvbnN0IGNoYXIgKmNtZCwgc3dpdGNoX3N0cmVhbV9oYW5kbGVfdCAqc3RyZWFtKQp7CiNp ZmRlZiBXSU4zMgoJc3RyZWFtLT53cml0ZV9mdW5jdGlvbihzdHJlYW0sICJDYXB0dXJpbmcgb3V0 cHV0IG5vdCBzdXBwb3J0ZWQuXG4iKTsKCXJldHVybiBzd2l0Y2hfc3lzdGVtKGNtZCwgU1dJVENI X1RSVUUpOwojZWxzZQoJcmV0dXJuIHN3aXRjaF9zdHJlYW1fc3lzdGVtX2ZvcmsoY21kLCBzdHJl YW0pOwojZW5kaWYKCn0KClNXSVRDSF9ERUNMQVJFKHVpbnQxNl90KSBzd2l0Y2hfY29yZV9nZXRf cnRwX3BvcnRfcmFuZ2Vfc3RhcnRfcG9ydCgpCnsKCXVpbnQxNl90IHN0YXJ0X3BvcnQgPSAwOwoK CS8qIEJ5IGRlZmF1bHQgcGFzcyBydHAgcG9ydCByYW5nZSBzdGFydCB2YWx1ZSBhcyB6ZXJvIGlu IG9yZGVyIHRvIGdldCBhY3R1YWwKCSAqIFJUUCBwb3J0IHJhbmdlIHN0YXJ0IHZhbHVlIGFzIGNv bmZpZ3VyZWQgKi8KCXN0YXJ0X3BvcnQgPSAodWludDE2X3Qpc3dpdGNoX3J0cF9zZXRfc3RhcnRf cG9ydCgoc3dpdGNoX3BvcnRfdClzdGFydF9wb3J0KTsKCglyZXR1cm4gc3RhcnRfcG9ydDsKfQoK U1dJVENIX0RFQ0xBUkUodWludDE2X3QpIHN3aXRjaF9jb3JlX2dldF9ydHBfcG9ydF9yYW5nZV9l bmRfcG9ydCgpCnsKCXVpbnQxNl90IGVuZF9wb3J0ID0gMDsKCgkvKiBCeSBkZWZhdWx0IHBhc3Mg cnRwIHBvcnQgcmFuZ2UgZW5kIHZhbHVlIGFzIHplcm8gaW4gb3JkZXIgdG8gZ2V0IGFjdHVhbAoJ ICogUlRQIHBvcnQgcmFuZ2UgZW5kIHZhbHVlIGFzIGNvbmZpZ3VyZWQgKi8KCWVuZF9wb3J0ID0g KHVpbnQxNl90KXN3aXRjaF9ydHBfc2V0X2VuZF9wb3J0KChzd2l0Y2hfcG9ydF90KWVuZF9wb3J0 KTsKCglyZXR1cm4gZW5kX3BvcnQ7Cn0KCi8qIEZvciBFbWFjczoKICogTG9jYWwgVmFyaWFibGVz OgogKiBtb2RlOmMKICogaW5kZW50LXRhYnMtbW9kZTp0CiAqIHRhYi13aWR0aDo0CiAqIGMtYmFz aWMtb2Zmc2V0OjQKICogRW5kOgogKiBGb3IgVklNOgogKiB2aW06c2V0IHNvZnR0YWJzdG9wPTQg c2hpZnR3aWR0aD00IHRhYnN0b3A9NCBub2V0OgogKi8K --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=switch.c Content-Transfer-Encoding: base64 LyoKICogRnJlZVNXSVRDSCBNb2R1bGFyIE1lZGlhIFN3aXRjaGluZyBTb2Z0d2FyZSBMaWJyYXJ5 IC8gU29mdC1Td2l0Y2ggQXBwbGljYXRpb24KICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTQsIEFu dGhvbnkgTWluZXNzYWxlIElJIDxhbnRobUBmcmVlc3dpdGNoLm9yZz4KICoKICogVmVyc2lvbjog TVBMIDEuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRo ZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsg eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRo ZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0 cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVy IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhP VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0 aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMg YW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwg Q29kZSBpcyBGcmVlU1dJVENIIE1vZHVsYXIgTWVkaWEgU3dpdGNoaW5nIFNvZnR3YXJlIExpYnJh cnkgLyBTb2Z0LVN3aXRjaCBBcHBsaWNhdGlvbgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIg b2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQW50aG9ueSBNaW5lc3NhbGUgSUkgPGFudGhtQGZy ZWVzd2l0Y2gub3JnPgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3Bl ciBhcmUgQ29weXJpZ2h0IChDKQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMg UmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKgogKiBBbnRob255IE1pbmVzc2FsZSBJ SSA8YW50aG1AZnJlZXN3aXRjaC5vcmc+CiAqIE1pY2hhZWwgSmVycmlzIDxtaWtlQGplcnJpcy5j b20+CiAqIFBhd2VsIFBpZXJzY2lvbmVrIDxwYXdlbEB2b2ljZXdvcmtzLnBsPgogKiBCcmV0IE1j RGFuZWwgPHRyaXh0ZXIgQVQgMHhkZWNhZmJhZC5jb20+CiAqCiAqCiAqIHN3aXRjaC5jIC0tIE1h aW4KICoKICovCgojaWZuZGVmIF9YT1BFTl9TT1VSQ0UKI2RlZmluZSBfWE9QRU5fU09VUkNFIDYw MAojZW5kaWYKCiNpZm5kZWYgV0lOMzIKI2luY2x1ZGUgPHBvbGwuaD4KI2lmZGVmIEhBVkVfU0VU UkxJTUlUCiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KI2VuZGlmCiNlbmRpZgoKI2lmZGVmIF9f bGludXhfXwojaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN3aXRjaC5o PgojaW5jbHVkZSAicHJpdmF0ZS9zd2l0Y2hfY29yZV9wdnQuaCIKCi8qIHBpZCBmaWxlbmFtZTog U3RvcmVzIHRoZSBwcm9jZXNzIGlkIG9mIHRoZSBmcmVlc3dpdGNoIHByb2Nlc3MgKi8KI2RlZmlu ZSBQSURGSUxFICJmcmVlc3dpdGNoLnBpZCIKc3RhdGljIGNoYXIgKnBmaWxlID0gUElERklMRTsK c3RhdGljIGludCBzeXN0ZW1fcmVhZHkgPSAwOwoKLyogUGlja3kgY29tcGlsZXIgKi8KI2lmZGVm IF9fSUNDCiNwcmFnbWEgd2FybmluZyAoZGlzYWJsZToxNjcpCiNlbmRpZgoKI2lmZGVmIFdJTjMy Ci8qIElmIHdlIGFyZSBhIHdpbmRvd3Mgc2VydmljZSwgd2hhdCBzaG91bGQgd2UgYmUgY2FsbGVk ICovCiNkZWZpbmUgU0VSVklDRU5BTUVfREVGQVVMVCAiRnJlZVNXSVRDSCIKI2RlZmluZSBTRVJW SUNFTkFNRV9NQVhMRU4gMjU2CnN0YXRpYyBjaGFyIHNlcnZpY2VfbmFtZVtTRVJWSUNFTkFNRV9N QVhMRU5dOwpzdGF0aWMgc3dpdGNoX2NvcmVfZmxhZ190IHNlcnZpY2VfZmxhZ3MgPSBTQ0ZfTk9O RTsKI2luY2x1ZGUgPHdpbnNvY2syLmg+CiNpbmNsdWRlIDx3aW5kb3dzLmg+CgovKiBldmVudCB0 byBzaWduYWwgc2h1dGRvd24gKGZvciB5b3UgdW5peCBwZW9wbGUsIHRoaXMgaXMgbGlrZSBhIHB0 aHJlYWRfY29uZCkgKi8Kc3RhdGljIEhBTkRMRSBzaHV0ZG93bl9ldmVudDsKCiNpZm5kZWYgUEFU SF9NQVgKI2RlZmluZSBQQVRIX01BWCAyNTYKI2VuZGlmCiNlbmRpZgoKLyogc2lnbmFsIGhhbmRs ZXIgZm9yIHdoZW4gZnJlZXN3aXRjaCBpcyBydW5uaW5nIGluIGJhY2tncm91bmQgbW9kZS4KICog c2lnbmFsIHRyaWdnZXJzIHRoZSBzaHV0ZG93biBvZiBmcmVlc3dpdGNoCiMgKi8Kc3RhdGljIHZv aWQgaGFuZGxlX1NJR0lMTChpbnQgc2lnKQp7CglpbnQzMl90IGFyZyA9IDA7CglpZiAoc2lnKSB7 fTsKCS8qIHNlbmQgc2h1dGRvd24gc2lnbmFsIHRvIHRoZSBmcmVlc3dpdGNoIGNvcmUgKi8KCXN3 aXRjaF9jb3JlX3Nlc3Npb25fY3RsKFNDU0NfU0hVVERPV04sICZhcmcpOwoJcmV0dXJuOwp9Cgov KiBraWxsIGEgZnJlZXN3aXRjaCBwcm9jZXNzIHJ1bm5pbmcgaW4gYmFja2dyb3VuZCBtb2RlICov CnN0YXRpYyBpbnQgZnJlZXN3aXRjaF9raWxsX2JhY2tncm91bmQoKQp7CglGSUxFICpmOwkJCQkJ LyogRklMRSBoYW5kbGUgdG8gb3BlbiB0aGUgcGlkIGZpbGUgKi8KCWNoYXIgcGF0aFtQQVRIX01B WF0gPSAiIjsJCS8qIGZ1bGwgcGF0aCBvZiB0aGUgUElEIGZpbGUgKi8KCXBpZF90IHBpZCA9IDA7 CQkJCS8qIHBpZCBmcm9tIHRoZSBwaWQgZmlsZSAqLwoKCS8qIHNldCB0aGUgZ2xvYmFscyBzbyB3 ZSBjYW4gdXNlIHRoZSBnbG9iYWwgcGF0aHMuICovCglzd2l0Y2hfY29yZV9zZXRfZ2xvYmFscygp OwoKCS8qIGdldCB0aGUgZnVsbCBwYXRoIG9mIHRoZSBwaWQgZmlsZS4gKi8KCXN3aXRjaF9zbnBy aW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcyVzJXMiLCBTV0lUQ0hfR0xPQkFMX2RpcnMucnVu X2RpciwgU1dJVENIX1BBVEhfU0VQQVJBVE9SLCBwZmlsZSk7CgoJLyogb3BlbiB0aGUgcGlkIGZp bGUgKi8KCWlmICgoZiA9IGZvcGVuKHBhdGgsICJyIikpID09IDApIHsKCQkvKiBwaWQgZmlsZSBk b2VzIG5vdCBleGlzdCAqLwoJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gcGlkIGZpbGUg JXMuXG4iLCBwYXRoKTsKCQlyZXR1cm4gMjU1OwoJfQoKCS8qIHB1bGwgdGhlIHBpZCBmcm9tIHRo ZSBmaWxlICovCglpZiAoZnNjYW5mKGYsICIlZCIsIChpbnQgKikgKGludHB0cl90KSAmIHBpZCkg IT0gMSkgewoJCXN3aXRjaF9sb2dfcHJpbnRmKFNXSVRDSF9DSEFOTkVMX0xPRywgU1dJVENIX0xP R19FUlJPUiwgIlVuYWJsZSB0byBnZXQgdGhlIHBpZCFcbiIpOwoJfQoKCS8qIGlmIHdlIGhhdmUg YSB2YWxpZCBwaWQgKi8KCWlmIChwaWQgPiAwKSB7CgoJCS8qIGtpbGwgdGhlIGZyZWVzd2l0Y2gg cnVubmluZyBhdCB0aGUgcGlkIHdlIGZvdW5kICovCgkJZnByaW50ZihzdGRlcnIsICJLaWxsaW5n OiAlZFxuIiwgKGludCkgcGlkKTsKI2lmZGVmIFdJTjMyCgkJLyogZm9yIHdpbmRvd3Mgd2UgbmVl ZCB0aGUgZXZlbnQgdG8gc2lnbmFsIGZvciBzaHV0dGluZyBkb3duIGEgYmFja2dyb3VuZCBGcmVl U1dJVENIICovCgkJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiR2xvYmFsXFxGcmVlc3dp dGNoLiVkIiwgcGlkKTsKCgkJLyogb3BlbiB0aGUgZXZlbnQgc28gd2UgY2FuIHNpZ25hbCBpdCAq LwoJCXNodXRkb3duX2V2ZW50ID0gT3BlbkV2ZW50KEVWRU5UX01PRElGWV9TVEFURSwgRkFMU0Us IHBhdGgpOwoKCQkvKiBkaWQgd2Ugc3VjY2Vzc2Z1bGx5IG9wZW4gdGhlIGV2ZW50ICovCgkJaWYg KCFzaHV0ZG93bl9ldmVudCkgewoJCQkvKiB3ZSBjYW4ndCBnZXQgdGhlIGV2ZW50LCBzbyB3ZSBj YW4ndCBzaWduYWwgdGhlIHByb2Nlc3MgdG8gc2h1dGRvd24gKi8KCQkJZnByaW50ZihzdGRlcnIs ICJFUlJPUjogQ2FuJ3QgU2h1dGRvd246ICVkXG4iLCAoaW50KSBwaWQpOwoJCX0gZWxzZSB7CgkJ CS8qIHNpZ25hbCB0aGUgZXZlbnQgdG8gc2h1dGRvd24gKi8KCQkJU2V0RXZlbnQoc2h1dGRvd25f ZXZlbnQpOwoJCQkvKiBjbGVhbnVwICovCgkJCUNsb3NlSGFuZGxlKHNodXRkb3duX2V2ZW50KTsK CQl9CiNlbHNlCgkJLyogZm9yIHVuaXgsIHNlbmQgdGhlIHNpZ25hbCB0byBraWxsLiAqLwoJCWtp bGwocGlkLCBTSUdURVJNKTsKI2VuZGlmCgl9CgoJLyogYmUgbmljZSBhbmQgY2xvc2UgdGhlIGZp bGUgaGFuZGxlIHRvIHRoZSBwaWQgZmlsZSAqLwoJZmNsb3NlKGYpOwoKCXJldHVybiAwOwp9Cgoj aWZkZWYgV0lOMzIKCi8qIHdlIG5lZWQgdGhlc2UgdmFycyB0byBoYW5kbGUgdGhlIHNlcnZpY2Ug Ki8KU0VSVklDRV9TVEFUVVNfSEFORExFIGhTdGF0dXM7ClNFUlZJQ0VfU1RBVFVTIHN0YXR1czsK Ci8qIEhhbmRsZXIgZnVuY3Rpb24gZm9yIHNlcnZpY2Ugc3RhcnQvc3RvcCBmcm9tIHRoZSBzZXJ2 aWNlICovCnZvaWQgV0lOQVBJIFNlcnZpY2VDdHJsSGFuZGxlcihEV09SRCBjb250cm9sKQp7Cglz d2l0Y2ggKGNvbnRyb2wpIHsKCWNhc2UgU0VSVklDRV9DT05UUk9MX1NIVVRET1dOOgoJY2FzZSBT RVJWSUNFX0NPTlRST0xfU1RPUDoKCQkvKiBTaHV0ZG93biBmcmVlc3dpdGNoICovCgkJc3dpdGNo X2NvcmVfZGVzdHJveSgpOwoJCS8qIHNldCBzZXJ2aWNlIHN0YXR1cyB2YWx1ZXMgKi8KCQlzdGF0 dXMuZHdDdXJyZW50U3RhdGUgPSBTRVJWSUNFX1NUT1BQRUQ7CgkJc3RhdHVzLmR3V2luMzJFeGl0 Q29kZSA9IDA7CgkJc3RhdHVzLmR3Q2hlY2tQb2ludCA9IDA7CgkJc3RhdHVzLmR3V2FpdEhpbnQg PSAwOwoJCWJyZWFrOwoJY2FzZSBTRVJWSUNFX0NPTlRST0xfSU5URVJST0dBVEU6CgkJLyogd2Ug YWxyZWFkeSBzZXQgdGhlIHNlcnZpY2Ugc3RhdHVzIGV2ZXJ5IHRpbWUgaXQgY2hhbmdlcy4gKi8K CQkvKiBpZiB0aGVyZSBhcmUgb3RoZXIgdGltZXMgd2UgY2hhbmdlIGl0IGFuZCBkb24ndCB1cGRh dGUsIHdlIHNob3VsZCBkbyBzbyBoZXJlICovCgkJYnJlYWs7Cgl9CgoJU2V0U2VydmljZVN0YXR1 cyhoU3RhdHVzLCAmc3RhdHVzKTsKfQoKLyogdGhlIG1haW4gc2VydmljZSBlbnRyeSBwb2ludCAq Lwp2b2lkIFdJTkFQSSBzZXJ2aWNlX21haW4oRFdPUkQgbnVtQXJncywgY2hhciAqKmFyZ3MpCnsK CXN3aXRjaF9jb3JlX2ZsYWdfdCBmbGFncyA9IFNDRl9VU0VfU1FMIHwgU0NGX1VTRV9BVVRPX05B VCB8IFNDRl9VU0VfTkFUX01BUFBJTkcgfCBTQ0ZfQ0FMSUJSQVRFX0NMT0NLIHwgU0NGX1VTRV9D TE9DS19SVDsKCWNvbnN0IGNoYXIgKmVyciA9IE5VTEw7CQkvKiBlcnJvciB2YWx1ZSBmb3IgcmV0 dXJuIGZyb20gZnJlZXN3aXRjaCBpbml0aWFsaXphdGlvbiAqLwoKCS8qIE92ZXJyaWRlIGZsYWdz IGlmIHRoZXkgaGF2ZSBiZWVuIHNldCBlYXJsaWVyICovCglpZiAoc2VydmljZV9mbGFncyAhPSBT Q0ZfTk9ORSkKCQlmbGFncyA9IHNlcnZpY2VfZmxhZ3M7CgoJLyogIHdlIGhhdmUgdG8gaW5pdGlh bGl6ZSB0aGUgc2VydmljZS1zcGVjaWZpYyBzdHVmZiAqLwoJbWVtc2V0KCZzdGF0dXMsIDAsIHNp emVvZihTRVJWSUNFX1NUQVRVUykpOwoJc3RhdHVzLmR3U2VydmljZVR5cGUgPSBTRVJWSUNFX1dJ TjMyOwoJc3RhdHVzLmR3Q3VycmVudFN0YXRlID0gU0VSVklDRV9TVEFSVF9QRU5ESU5HOwoJc3Rh dHVzLmR3Q29udHJvbHNBY2NlcHRlZCA9IFNFUlZJQ0VfQUNDRVBUX1NUT1AgfCBTRVJWSUNFX0FD Q0VQVF9TSFVURE9XTjsKCgkvKiByZWdpc3RlciBvdXIgaGFuZGxlciBmb3Igc2VydmljZSBjb250 cm9sIG1lc3NhZ2VzICovCgloU3RhdHVzID0gUmVnaXN0ZXJTZXJ2aWNlQ3RybEhhbmRsZXIoc2Vy dmljZV9uYW1lLCAmU2VydmljZUN0cmxIYW5kbGVyKTsKCgkvKiB1cGRhdGUgdGhlIHNlcnZpY2Ug c3RhdHVzICovCglTZXRTZXJ2aWNlU3RhdHVzKGhTdGF0dXMsICZzdGF0dXMpOwoKCXN3aXRjaF9j b3JlX3NldF9nbG9iYWxzKCk7CgoJLyogYXR0ZW1wdCB0byBpbml0aWFsaXplIGZyZWVzd2l0Y2gg YW5kIGxvYWQgbW9kdWxlcyAqLwoJaWYgKHN3aXRjaF9jb3JlX2luaXRfYW5kX21vZGxvYWQoZmxh Z3MsIFNXSVRDSF9GQUxTRSwgJmVycikgIT0gU1dJVENIX1NUQVRVU19TVUNDRVNTKSB7CgkJLyog ZnJlZXN3aXRjaCBkaWQgbm90IHN0YXJ0IHN1Y2Nlc3NmdWxseSAqLwoJCXN0YXR1cy5kd0N1cnJl bnRTdGF0ZSA9IFNFUlZJQ0VfU1RPUFBFRDsKCX0gZWxzZSB7CgkJLyogZnJlZXN3aXRjaCBzdGFy dGVkICovCgkJc3RhdHVzLmR3Q3VycmVudFN0YXRlID0gU0VSVklDRV9SVU5OSU5HOwoJfQoKCS8q IHVwZGF0ZSB0aGUgc2VydmljZSBzdGF0dXMgKi8KCVNldFNlcnZpY2VTdGF0dXMoaFN0YXR1cywg JnN0YXR1cyk7Cn0KCiNlbHNlCgpzdGF0aWMgaW50IGNoZWNrX2ZkKGludCBmZCwgaW50IG1zKQp7 CglzdHJ1Y3QgcG9sbGZkIHBmZHNbMl0gPSB7IHsgMCB9IH07CglpbnQgcywgciA9IDAsIGkgPSAw OwoKCXBmZHNbMF0uZmQgPSBmZDsKCXBmZHNbMF0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUjsK CXMgPSBwb2xsKHBmZHMsIDEsIG1zKTsKCglpZiAocyA9PSAwIHx8IHMgPT0gLTEpIHsKCQlyID0g czsKCX0gZWxzZSB7CgkJciA9IC0xOwoKCQlpZiAoKHBmZHNbMF0ucmV2ZW50cyAmIFBPTExJTikp IHsKCQkJaWYgKChpID0gcmVhZChmZCwgJnIsIHNpemVvZihyKSkpID4gLTEpIHsKCQkJCSh2b2lk KXdyaXRlKGZkLCAmciwgc2l6ZW9mKHIpKTsKCQkJfQoJCX0KCX0KCglyZXR1cm4gcjsKfQoKc3Rh dGljIHZvaWQgZGFlbW9uaXplKGludCAqZmRzKQp7CglpbnQgZmQ7CglwaWRfdCBwaWQ7Cgl1bnNp Z25lZCBpbnQgc2FuaXR5ID0gNjA7CgoJaWYgKCFmZHMpIHsKCQlzd2l0Y2ggKGZvcmsoKSkgewoJ CWNhc2UgMDoJCS8qIGNoaWxkIHByb2Nlc3MgKi8KCQkJYnJlYWs7CgkJY2FzZSAtMToKCQkJZnBy aW50ZihzdGRlcnIsICJFcnJvciBCYWNrZ3JvdW5kaW5nIChmb3JrKSEgJWQgLSAlc1xuIiwgZXJy bm8sIHN0cmVycm9yKGVycm5vKSk7CgkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKCQkJYnJlYWs7CgkJ ZGVmYXVsdDoJLyogcGFyZW50IHByb2Nlc3MgKi8KCQkJZXhpdChFWElUX1NVQ0NFU1MpOwoJCX0K CgkJaWYgKHNldHNpZCgpIDwgMCkgewoJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIEJhY2tncm91 bmRpbmcgKHNldHNpZCkhICVkIC0gJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwoJCQll eGl0KEVYSVRfU1VDQ0VTUyk7CgkJfQoJfQoKCXBpZCA9IHN3aXRjaF9mb3JrKCk7CgoJc3dpdGNo IChwaWQpIHsKCWNhc2UgMDoJCS8qIGNoaWxkIHByb2Nlc3MgKi8KCQlpZiAoZmRzKSB7CgkJCWNs b3NlKGZkc1swXSk7CgkJfQoJCWJyZWFrOwoJY2FzZSAtMToKCQlmcHJpbnRmKHN0ZGVyciwgIkVy cm9yIEJhY2tncm91bmRpbmcgKGZvcmsyKSEgJWQgLSAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVy cm5vKSk7CgkJZXhpdChFWElUX1NVQ0NFU1MpOwoJCWJyZWFrOwoJZGVmYXVsdDoJLyogcGFyZW50 IHByb2Nlc3MgKi8KCQlmcHJpbnRmKHN0ZGVyciwgIiVkIEJhY2tncm91bmRpbmcuXG4iLCAoaW50 KSBwaWQpOwoKCQlpZiAoZmRzKSB7CgkJCWNoYXIgKm87CgoJCQljbG9zZShmZHNbMV0pOwoKCQkJ aWYgKChvID0gZ2V0ZW52KCJGUkVFU1dJVENIX0JHX1RJTUVPVVQiKSkpIHsKCQkJCWludCB0bXAg PSBhdG9pKG8pOwoJCQkJaWYgKHRtcCA+IDApIHsKCQkJCQlzYW5pdHkgPSB0bXA7CgkJCQl9CgkJ CX0KCgkJCWRvIHsKCQkJCXN5c3RlbV9yZWFkeSA9IGNoZWNrX2ZkKGZkc1swXSwgMjAwMCk7CgoJ CQkJaWYgKHN5c3RlbV9yZWFkeSA9PSAwKSB7CgkJCQkJcHJpbnRmKCJGcmVlU1dJVENIWyVkXSBX YWl0aW5nIGZvciBiYWNrZ3JvdW5kIHByb2Nlc3MgcGlkOiVkIHRvIGJlIHJlYWR5Li4uLi5cbiIs IChpbnQpZ2V0cGlkKCksIChpbnQpIHBpZCk7CgkJCQl9CgoJCQl9IHdoaWxlICgtLXNhbml0eSAm JiBzeXN0ZW1fcmVhZHkgPT0gMCk7CgoJCQlzaHV0ZG93bihmZHNbMF0sIDIpOwoJCQljbG9zZShm ZHNbMF0pOwoJCQlmZHNbMF0gPSAtMTsKCgoJCQlpZiAoc3lzdGVtX3JlYWR5IDwgMCkgewoJCQkJ cHJpbnRmKCJGcmVlU1dJVENIWyVkXSBFcnJvciBzdGFydGluZyBzeXN0ZW0hIHBpZDolZFxuIiwg KGludClnZXRwaWQoKSwgKGludCkgcGlkKTsKCQkJCWtpbGwocGlkLCA5KTsKCQkJCWV4aXQoRVhJ VF9GQUlMVVJFKTsKCQkJfQoKCQkJcHJpbnRmKCJGcmVlU1dJVENIWyVkXSBTeXN0ZW0gUmVhZHkg cGlkOiVkXG4iLCAoaW50KSBnZXRwaWQoKSwgKGludCkgcGlkKTsKCQl9CgoJCWV4aXQoRVhJVF9T VUNDRVNTKTsKCX0KCglpZiAoZmRzKSB7CgkJc2V0c2lkKCk7Cgl9CgkvKiByZWRpcmVjdCBzdGQq IHRvIG51bGwgKi8KCWZkID0gb3BlbigiL2Rldi9udWxsIiwgT19SRE9OTFkpOwoJc3dpdGNoX2Fz c2VydCggZmQgPj0gMCApOwoJaWYgKGZkICE9IDApIHsKCQlkdXAyKGZkLCAwKTsKCQljbG9zZShm ZCk7Cgl9CgoJZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1dST05MWSk7Cglzd2l0Y2hfYXNzZXJ0 KCBmZCA+PSAwICk7CglpZiAoZmQgIT0gMSkgewoJCWR1cDIoZmQsIDEpOwoJCWNsb3NlKGZkKTsK CX0KCglmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fV1JPTkxZKTsKCXN3aXRjaF9hc3NlcnQoIGZk ID49IDAgKTsKCWlmIChmZCAhPSAyKSB7CgkJZHVwMihmZCwgMik7CgkJY2xvc2UoZmQpOwoJfQoJ cmV0dXJuOwp9CgpzdGF0aWMgcGlkX3QgcmVpbmNhcm5hdGVfY2hpbGQgPSAwOwpzdGF0aWMgdm9p ZCByZWluY2FybmF0ZV9oYW5kbGVfc2lndGVybSAoaW50IHNpZykgewoJaWYgKCFzaWcpIHJldHVy bjsKCWlmIChyZWluY2FybmF0ZV9jaGlsZCkga2lsbChyZWluY2FybmF0ZV9jaGlsZCwgc2lnKTsK CXJldHVybjsKfQoKc3RhdGljIHZvaWQgcmVpbmNhcm5hdGVfcHJvdGVjdChjaGFyICoqYXJndikg ewoJaW50IGk7IHN0cnVjdCBzaWdhY3Rpb24gc2EsIHNhX2RmbCwgc2E0X3ByZXYsIHNhMTVfcHJl diwgc2ExN19wcmV2OwoJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7IG1lbXNldCgmc2FfZGZs LCAwLCBzaXplb2Yoc2FfZGZsKSk7CglzYS5zYV9oYW5kbGVyID0gcmVpbmNhcm5hdGVfaGFuZGxl X3NpZ3Rlcm07CglzYV9kZmwuc2FfaGFuZGxlciA9IFNJR19ERkw7CiByZWZvcms6CglpZiAoKGk9 Zm9yaygpKSkgeyAvKiBwYXJlbnQgKi8KCQlpbnQgczsgcGlkX3QgcjsKCQlyZWluY2FybmF0ZV9j aGlsZCA9IGk7CgkJc2lnYWN0aW9uKFNJR0lMTCwgJnNhLCAmc2E0X3ByZXYpOwoJCXNpZ2FjdGlv bihTSUdURVJNLCAmc2EsICZzYTE1X3ByZXYpOwoJCXNpZ2FjdGlvbihTSUdDSExELCAmc2FfZGZs LCAmc2ExN19wcmV2KTsKCXJld2FpdDoKCQlyID0gd2FpdHBpZChpLCAmcywgMCk7CgkJaWYgKHIg PT0gKHBpZF90KS0xKSB7CgkJCWlmIChlcnJubyA9PSBFSU5UUikgZ290byByZXdhaXQ7CgkJCWV4 aXQoRVhJVF9GQUlMVVJFKTsKCQl9CgkJaWYgKHIgIT0gaSkgZ290byByZXdhaXQ7CgkJaWYgKFdJ RkVYSVRFRChzKQoJCQkmJiAoV0VYSVRTVEFUVVMocykgPT0gRVhJVF9TVUNDRVNTCgkJCQl8fCBX RVhJVFNUQVRVUyhzKSA9PSBFWElUX0ZBSUxVUkUpKSB7CgkJCWV4aXQoV0VYSVRTVEFUVVMocykp OwoJCX0KCQlpZiAoV0lGRVhJVEVEKHMpIHx8IFdJRlNJR05BTEVEKHMpKSB7CgkJCXNpZ2FjdGlv bihTSUdJTEwsICZzYTRfcHJldiwgTlVMTCk7CgkJCXNpZ2FjdGlvbihTSUdURVJNLCAmc2ExNV9w cmV2LCBOVUxMKTsKCQkJc2lnYWN0aW9uKFNJR0NITEQsICZzYTE3X3ByZXYsIE5VTEwpOwoJCQlp ZiAoYXJndikgewoJCQkJaWYgKGV4ZWN2KGFyZ3ZbMF0sIGFyZ3YpID09IC0xKSB7CgkJCQkJY2hh ciBidWZbMjU2XTsKCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlJlaW5jYXJuYXRlIGV4ZWN2KCkgZmFp bGVkOiAlZCAlc1xuIiwgZXJybm8sCgkJCQkJCQlzd2l0Y2hfc3RyZXJyb3JfcihlcnJubywgYnVm LCBzaXplb2YoYnVmKSkpOwoJCQkJfQoJCQkJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgcmVpbmNh cm5hdGUtcmVleGVjIHBsYW4gQi4uLlxuIik7CgkJCQlpZiAoZXhlY3ZwKGFyZ3ZbMF0sIGFyZ3Yp ID09IC0xKSB7CgkJCQkJY2hhciBidWZbMjU2XTsKCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlJlaW5j YXJuYXRlIGV4ZWN2cCgpIGZhaWxlZDogJWQgJXNcbiIsIGVycm5vLAoJCQkJCQkJc3dpdGNoX3N0 cmVycm9yX3IoZXJybm8sIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKCQkJCX0KCQkJCWZwcmludGYoc3Rk ZXJyLCAiRmFsbGluZyBiYWNrIHRvIG5vcm1hbCByZWluY2FybmF0ZSBiZWhhdmlvci4uLlxuIik7 CgkJCQlnb3RvIHJlZm9yazsKCQkJfSBlbHNlIGdvdG8gcmVmb3JrOwoJCX0KCQlnb3RvIHJld2Fp dDsKCX0gZWxzZSB7IC8qIGNoaWxkICovCiNpZmRlZiBfX2xpbnV4X18KCQlwcmN0bChQUl9TRVRf UERFQVRIU0lHLCBTSUdURVJNKTsKI2VuZGlmCgl9Cn0KCiNlbmRpZgoKc3RhdGljIGNvbnN0IGNo YXIgdXNhZ2VbXSA9CgkiVXNhZ2U6IGZyZWVzd2l0Y2ggW09QVElPTlNdXG5cbiIKCSJUaGVzZSBh cmUgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgdG8gZnJlZXN3aXRjaDpcbiIK I2lmZGVmIFdJTjMyCgkiXHQtc2VydmljZSBbbmFtZV0gICAgICAgIC0tIHN0YXJ0IGZyZWVzd2l0 Y2ggYXMgYSBzZXJ2aWNlLCBjYW5ub3QgYmUgdXNlZCBpZiBsb2FkZWQgYXMgYSBjb25zb2xlIGFw cFxuIgoJIlx0LWluc3RhbGwgW25hbWVdICAgICAgICAtLSBpbnN0YWxsIGZyZWVzd2l0Y2ggYXMg YSBzZXJ2aWNlLCB3aXRoIG9wdGlvbmFsIHNlcnZpY2UgbmFtZVxuIgoJIlx0LXVuaW5zdGFsbCAg ICAgICAgICAgICAtLSByZW1vdmUgZnJlZXN3aXRjaCBhcyBhIHNlcnZpY2VcbiIKCSJcdC1tb25v dG9uaWMtY2xvY2sgICAgICAgLS0gdXNlIG1vbm90b25pYyBjbG9jayBhcyB0aW1lciBzb3VyY2Vc biIKI2Vsc2UKCSJcdC1uZiAgICAgICAgICAgICAgICAgICAgLS0gbm8gZm9ya2luZ1xuIgoJIlx0 LXJlaW5jYXJuYXRlICAgICAgICAgICAtLSByZXN0YXJ0IHRoZSBzd2l0Y2ggb24gYW4gdW5jb250 cm9sbGVkIGV4aXRcbiIKCSJcdC1yZWluY2FybmF0ZS1yZWV4ZWMgICAgLS0gcnVuIGV4ZWN2IG9u IGEgcmVzdGFydCAoaGVscGZ1bCBmb3IgdXBncmFkZXMpXG4iCgkiXHQtdSBbdXNlcl0gICAgICAg ICAgICAgIC0tIHNwZWNpZnkgdXNlciB0byBzd2l0Y2ggdG9cbiIKCSJcdC1nIFtncm91cF0gICAg ICAgICAgICAgLS0gc3BlY2lmeSBncm91cCB0byBzd2l0Y2ggdG9cbiIKI2VuZGlmCiNpZmRlZiBI QVZFX1NFVFJMSU1JVAojaWZuZGVmIEZTXzY0QklUCgkiXHQtd2FzdGUgICAgICAgICAgICAgICAg IC0tIGFsbG93IG1lbW9yeSB3YXN0ZVxuIgojZW5kaWYKCSJcdC1jb3JlICAgICAgICAgICAgICAg ICAgLS0gZHVtcCBjb3Jlc1xuIgojZW5kaWYKCSJcdC1oZWxwICAgICAgICAgICAgICAgICAgLS0g dGhpcyBtZXNzYWdlXG4iCgkiXHQtdmVyc2lvbiAgICAgICAgICAgICAgIC0tIHByaW50IHRoZSB2 ZXJzaW9uIGFuZCBleGl0XG4iCgkiXHQtcnAgICAgICAgICAgICAgICAgICAgIC0tIGVuYWJsZSBo aWdoKHJlYWx0aW1lKSBwcmlvcml0eSBzZXR0aW5nc1xuIgoJIlx0LWxwICAgICAgICAgICAgICAg ICAgICAtLSBlbmFibGUgbG93IHByaW9yaXR5IHNldHRpbmdzXG4iCgkiXHQtbnAgICAgICAgICAg ICAgICAgICAgIC0tIGVuYWJsZSBub3JtYWwgcHJpb3JpdHkgc2V0dGluZ3NcbiIKCSJcdC12ZyAg ICAgICAgICAgICAgICAgICAgLS0gcnVuIHVuZGVyIHZhbGdyaW5kXG4iCgkiXHQtbm9zcWwgICAg ICAgICAgICAgICAgIC0tIGRpc2FibGUgaW50ZXJuYWwgc3FsIHNjb3JlYm9hcmRcbiIKCSJcdC1o ZWF2eS10aW1lciAgICAgICAgICAgLS0gSGVhdnkgVGltZXIsIHBvc3NpYmx5IG1vcmUgYWNjdXJh dGUgYnV0IGF0IGEgY29zdFxuIgoJIlx0LW5vbmF0ICAgICAgICAgICAgICAgICAtLSBkaXNhYmxl IGF1dG8gbmF0IGRldGVjdGlvblxuIgoJIlx0LW5vbmF0bWFwICAgICAgICAgICAgICAtLSBkaXNh YmxlIGF1dG8gbmF0IHBvcnQgbWFwcGluZ1xuIgoJIlx0LW5vY2FsICAgICAgICAgICAgICAgICAt LSBkaXNhYmxlIGNsb2NrIGNhbGlicmF0aW9uXG4iCgkiXHQtbm9ydCAgICAgICAgICAgICAgICAg IC0tIGRpc2FibGUgY2xvY2sgY2xvY2tfcmVhbHRpbWVcbiIKCSJcdC1zdG9wICAgICAgICAgICAg ICAgICAgLS0gc3RvcCBmcmVlc3dpdGNoXG4iCgkiXHQtbmMgICAgICAgICAgICAgICAgICAgIC0t IGRvIG5vdCBvdXRwdXQgdG8gYSBjb25zb2xlIGFuZCBiYWNrZ3JvdW5kXG4iCiNpZm5kZWYgV0lO MzIKCSJcdC1uY3dhaXQgICAgICAgICAgICAgICAgLS0gZG8gbm90IG91dHB1dCB0byBhIGNvbnNv bGUgYW5kIGJhY2tncm91bmQgYnV0IHdhaXQgdW50aWwgdGhlIHN5c3RlbSBpcyByZWFkeSBiZWZv cmUgZXhpdGluZyAoaW1wbGllcyAtbmMpXG4iCiNlbmRpZgoJIlx0LWMgICAgICAgICAgICAgICAg ICAgICAtLSBvdXRwdXQgdG8gYSBjb25zb2xlIGFuZCBzdGF5IGluIHRoZSBmb3JlZ3JvdW5kXG4i CgkiXG5cdE9wdGlvbnMgdG8gY29udHJvbCBsb2NhdGlvbnMgb2YgZmlsZXM6XG4iCgkiXHQtYmFz ZSBbYmFzZWRpcl0gICAgICAgICAtLSBhbHRlcm5hdGUgcHJlZml4IGRpcmVjdG9yeVxuIgoJIlx0 LWNmZ25hbWUgW2ZpbGVuYW1lXSAgICAgLS0gYWx0ZXJuYXRlIGZpbGVuYW1lIGZvciBGcmVlU1dJ VENIIG1haW4gY29uZmlndXJhdGlvbiBmaWxlXG4iCgkiXHQtY29uZiBbY29uZmRpcl0gICAgICAg ICAtLSBhbHRlcm5hdGUgZGlyZWN0b3J5IGZvciBGcmVlU1dJVENIIGNvbmZpZ3VyYXRpb24gZmls ZXNcbiIKCSJcdC1sb2cgW2xvZ2Rpcl0gICAgICAgICAgIC0tIGFsdGVybmF0ZSBkaXJlY3Rvcnkg Zm9yIGxvZ2ZpbGVzXG4iCgkiXHQtcnVuIFtydW5kaXJdICAgICAgICAgICAtLSBhbHRlcm5hdGUg ZGlyZWN0b3J5IGZvciBydW50aW1lIGZpbGVzXG4iCgkiXHQtZGIgW2RiZGlyXSAgICAgICAgICAg ICAtLSBhbHRlcm5hdGUgZGlyZWN0b3J5IGZvciB0aGUgaW50ZXJuYWwgZGF0YWJhc2VcbiIKCSJc dC1tb2QgW21vZGRpcl0gICAgICAgICAgIC0tIGFsdGVybmF0ZSBkaXJlY3RvcnkgZm9yIG1vZHVs ZXNcbiIKCSJcdC1odGRvY3MgW2h0ZG9jc2Rpcl0gICAgIC0tIGFsdGVybmF0ZSBkaXJlY3Rvcnkg Zm9yIGh0ZG9jc1xuIgoJIlx0LXNjcmlwdHMgW3NjcmlwdHNkaXJdICAgLS0gYWx0ZXJuYXRlIGRp cmVjdG9yeSBmb3Igc2NyaXB0c1xuIgoJIlx0LXRlbXAgW2RpcmVjdG9yeV0gICAgICAgLS0gYWx0 ZXJuYXRlIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IGZpbGVzXG4iCgkiXHQtZ3JhbW1hciBbZGly ZWN0b3J5XSAgICAtLSBhbHRlcm5hdGUgZGlyZWN0b3J5IGZvciBncmFtbWFyIGZpbGVzXG4iCgki XHQtY2VydHMgW2RpcmVjdG9yeV0gICAgICAtLSBhbHRlcm5hdGUgZGlyZWN0b3J5IGZvciBjZXJ0 aWZpY2F0ZXNcbiIKCSJcdC1yZWNvcmRpbmdzIFtkaXJlY3RvcnldIC0tIGFsdGVybmF0ZSBkaXJl Y3RvcnkgZm9yIHJlY29yZGluZ3NcbiIKCSJcdC1zdG9yYWdlIFtkaXJlY3RvcnldICAgIC0tIGFs dGVybmF0ZSBkaXJlY3RvcnkgZm9yIHZvaWNlbWFpbCBzdG9yYWdlXG4iCgkiXHQtY2FjaGUgW2Rp cmVjdG9yeV0gICAgICAtLSBhbHRlcm5hdGUgZGlyZWN0b3J5IGZvciBjYWNoZSBmaWxlc1xuIgoJ Ilx0LXNvdW5kcyBbZGlyZWN0b3J5XSAgICAgLS0gYWx0ZXJuYXRlIGRpcmVjdG9yeSBmb3Igc291 bmQgZmlsZXNcbiI7CgoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIHN0cmluZyBzdGFydHMgd2l0aCAi LSIKICovCnN0YXRpYyBzd2l0Y2hfYm9vbF90IGlzX29wdGlvbihjb25zdCBjaGFyICpwKQp7Cgkv KiBza2lwIHdoaXRlc3BhY2VzICovCgl3aGlsZSAoKCpwID09IDEzKSB8fCAoKnAgPT0gMTApIHx8 ICgqcCA9PSA5KSB8fCAoKnAgPT0gMzIpIHx8ICgqcCA9PSAxMSkpIHArKzsKCXJldHVybiAocFsw XSA9PSAnLScpOwp9CgoKLyogdGhlIG1haW4gYXBwbGljYXRpb24gZW50cnkgcG9pbnQgKi8KaW50 IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJY2hhciBwaWRfcGF0aFtQQVRIX01BWF0g PSAiIjsJLyogZnVsbCBwYXRoIHRvIHRoZSBwaWQgZmlsZSAqLwoJY2hhciBwaWRfYnVmZmVyWzMy XSA9ICIiOwkvKiBwaWQgc3RyaW5nICovCgljaGFyIG9sZF9waWRfYnVmZmVyWzMyXSA9IHsgMCB9 OwkvKiBwaWQgc3RyaW5nICovCglzd2l0Y2hfc2l6ZV90IHBpZF9sZW4sIG9sZF9waWRfbGVuOwoJ Y29uc3QgY2hhciAqZXJyID0gTlVMTDsJCS8qIGVycm9yIHZhbHVlIGZvciByZXR1cm4gZnJvbSBm cmVlc3dpdGNoIGluaXRpYWxpemF0aW9uICovCiNpZm5kZWYgV0lOMzIKCXN3aXRjaF9ib29sX3Qg bmYgPSBTV0lUQ0hfRkFMU0U7CQkJCS8qIFRSVUUgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gbm9mb3Jr IG1vZGUgKi8KCXN3aXRjaF9ib29sX3QgZG9fd2FpdCA9IFNXSVRDSF9GQUxTRTsKCWNoYXIgKnJ1 bmFzX3VzZXIgPSBOVUxMOwoJY2hhciAqcnVuYXNfZ3JvdXAgPSBOVUxMOwoJc3dpdGNoX2Jvb2xf dCByZWluY2FybmF0ZSA9IFNXSVRDSF9GQUxTRSwgcmVpbmNhcm5hdGVfcmVleGVjID0gU1dJVENI X0ZBTFNFOwoJaW50IGZkc1syXSA9IHsgMCwgMCB9OwojZWxzZQoJY29uc3Qgc3dpdGNoX2Jvb2xf dCBuZiA9IFNXSVRDSF9UUlVFOwkJICAgICAvKiBPbiBXaW5kb3dzLCBmb3JjZSBuZiB0byB0cnVl Ki8KCXN3aXRjaF9ib29sX3Qgd2luMzJfc2VydmljZSA9IFNXSVRDSF9GQUxTRTsKI2VuZGlmCglz d2l0Y2hfYm9vbF90IG5jID0gU1dJVENIX0ZBTFNFOwkJCQkvKiBUUlVFIGlmIHdlIGFyZSBydW5u aW5nIGluIG5vY29uc29sZSBtb2RlICovCglwaWRfdCBwaWQgPSAwOwoJaW50IGksIHg7CgljaGFy ICpvcHRzOwoJY2hhciBvcHRzX3N0clsxMDI0XSA9ICIiOwoJY2hhciAqbG9jYWxfYXJndlsxMDI0 XSA9IHsgMCB9OwoJaW50IGxvY2FsX2FyZ2MgPSBhcmdjOwoJY2hhciAqYXJnX2FyZ3ZbMTI4XSA9 IHsgMCB9OwoJaW50IGFsdF9kaXJzID0gMCwgYWx0X2Jhc2UgPSAwLCBsb2dfc2V0ID0gMCwgcnVu X3NldCA9IDAsIGRvX2tpbGwgPSAwOwoJaW50IHByaW9yaXR5ID0gMDsKI2lmIChkZWZpbmVkKF9f U1ZSNCkgJiYgZGVmaW5lZChfX3N1bikpCglzd2l0Y2hfY29yZV9mbGFnX3QgZmxhZ3MgPSBTQ0Zf VVNFX1NRTCB8IFNDRl9DQUxJQlJBVEVfQ0xPQ0sgfCBTQ0ZfVVNFX0NMT0NLX1JUOwojZWxzZQoJ c3dpdGNoX2NvcmVfZmxhZ190IGZsYWdzID0gU0NGX1VTRV9TUUwgfCBTQ0ZfVVNFX0FVVE9fTkFU IHwgU0NGX1VTRV9OQVRfTUFQUElORyB8IFNDRl9DQUxJQlJBVEVfQ0xPQ0sgfCBTQ0ZfVVNFX0NM T0NLX1JUOwojZW5kaWYKCWludCByZXQgPSAwOwoJc3dpdGNoX3N0YXR1c190IGRlc3Ryb3lfc3Rh dHVzOwoJc3dpdGNoX2ZpbGVfdCAqZmQ7Cglzd2l0Y2hfbWVtb3J5X3Bvb2xfdCAqcG9vbCA9IE5V TEw7CiNpZmRlZiBIQVZFX1NFVFJMSU1JVAojaWZuZGVmIEZTXzY0QklUCglzd2l0Y2hfYm9vbF90 IHdhc3RlID0gU1dJVENIX0ZBTFNFOwojZW5kaWYKI2VuZGlmCgoJZm9yICh4ID0gMDsgeCA8IGFy Z2M7IHgrKykgewoJCWxvY2FsX2FyZ3ZbeF0gPSBhcmd2W3hdOwoJfQoKCWlmICgob3B0cyA9IGdl dGVudigiRlJFRVNXSVRDSF9PUFRTIikpKSB7CgkJc3RybmNweShvcHRzX3N0ciwgb3B0cywgc2l6 ZW9mKG9wdHNfc3RyKSAtIDEpOwoJCWkgPSBzd2l0Y2hfc2VwYXJhdGVfc3RyaW5nKG9wdHNfc3Ry LCAnICcsIGFyZ19hcmd2LCAoc2l6ZW9mKGFyZ19hcmd2KSAvIHNpemVvZihhcmdfYXJndlswXSkp KTsKCQlmb3IgKHggPSAwOyB4IDwgaTsgeCsrKSB7CgkJCWxvY2FsX2FyZ3ZbbG9jYWxfYXJnYysr XSA9IGFyZ19hcmd2W3hdOwoJCX0KCX0KCglpZiAobG9jYWxfYXJndlswXSAmJiBzdHJzdHIobG9j YWxfYXJndlswXSwgImZyZWVzd2l0Y2hkIikpIHsKCQluYyA9IFNXSVRDSF9UUlVFOwoJfQoKCWZv ciAoeCA9IDE7IHggPCBsb2NhbF9hcmdjOyB4KyspIHsKCgkJaWYgKHN3aXRjaF9zdHJsZW5femVy byhsb2NhbF9hcmd2W3hdKSkKCQkJY29udGludWU7CgoJCWlmICghc3RyY21wKGxvY2FsX2FyZ3Zb eF0sICItaGVscCIpIHx8ICFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1oIikgfHwgIXN0cmNtcChs b2NhbF9hcmd2W3hdLCAiLT8iKSkgewoJCQlwcmludGYoIiVzXG4iLCB1c2FnZSk7CgkJCWV4aXQo RVhJVF9TVUNDRVNTKTsKCQl9CiNpZmRlZiBXSU4zMgoJCWlmICh4ID09IDEgJiYgIXN0cmNtcChs b2NhbF9hcmd2W3hdLCAiLXNlcnZpY2UiKSkgewoJCQkvKiBOZXcgaW5zdGFsbHMgd2lsbCBhbHdh eXMgaGF2ZSB0aGUgc2VydmljZSBuYW1lIHNwZWNpZmllZCwgYnV0IGtlZXAgYSBkZWZhdWx0IGZv ciBjb21wYXQgKi8KCQkJeCsrOwoJCQlpZiAoIXN3aXRjaF9zdHJsZW5femVybyhsb2NhbF9hcmd2 W3hdKSkgewoJCQkJc3dpdGNoX2NvcHlfc3RyaW5nKHNlcnZpY2VfbmFtZSwgbG9jYWxfYXJndlt4 XSwgU0VSVklDRU5BTUVfTUFYTEVOKTsKCQkJfSBlbHNlIHsKCQkJCXN3aXRjaF9jb3B5X3N0cmlu ZyhzZXJ2aWNlX25hbWUsIFNFUlZJQ0VOQU1FX0RFRkFVTFQsIFNFUlZJQ0VOQU1FX01BWExFTik7 CgkJCX0KCgkJCXdpbjMyX3NlcnZpY2UgPSBTV0lUQ0hfVFJVRTsKCQkJY29udGludWU7CgkJfQoK CQllbHNlIGlmICh4ID09IDEgJiYgIXN0cmNtcChsb2NhbF9hcmd2W3hdLCAiLWluc3RhbGwiKSkg ewoJCQljaGFyIHNlcnZpY2VQYXRoW1BBVEhfTUFYXTsKCQkJY2hhciBleGVQYXRoW1BBVEhfTUFY XTsKCQkJU0NfSEFORExFIGhTZXJ2aWNlOwoJCQlTQ19IQU5ETEUgaFNDTWFuYWdlcjsKCQkJU0VS VklDRV9ERVNDUklQVElPTiBkZXNjOwoJCQlkZXNjLmxwRGVzY3JpcHRpb24gPSAiVGhlIEZyZWVT V0lUQ0ggc2VydmljZS4iOwoKCQkJeCsrOwoJCQlpZiAoIXN3aXRjaF9zdHJsZW5femVybyhsb2Nh bF9hcmd2W3hdKSkgewoJCQkJc3dpdGNoX2NvcHlfc3RyaW5nKHNlcnZpY2VfbmFtZSwgbG9jYWxf YXJndlt4XSwgU0VSVklDRU5BTUVfTUFYTEVOKTsKCQkJfSBlbHNlIHsKCQkJCXN3aXRjaF9jb3B5 X3N0cmluZyhzZXJ2aWNlX25hbWUsIFNFUlZJQ0VOQU1FX0RFRkFVTFQsIFNFUlZJQ0VOQU1FX01B WExFTik7CgkJCX0KCgkJCUdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGV4ZVBhdGgsIHNpemVvZihl eGVQYXRoKSk7CgkJCXNucHJpbnRmKHNlcnZpY2VQYXRoLCBzaXplb2Yoc2VydmljZVBhdGgpLCAi JXMgLXNlcnZpY2UgJXMiLCBleGVQYXRoLCBzZXJ2aWNlX25hbWUpOwoKCQkJLyogUGVyZm9ybSBz ZXJ2aWNlIGluc3RhbGxhdGlvbiAqLwoKCQkJaFNDTWFuYWdlciA9IE9wZW5TQ01hbmFnZXIoTlVM TCwgTlVMTCwgU0NfTUFOQUdFUl9BTExfQUNDRVNTKTsKCQkJaWYgKCFoU0NNYW5hZ2VyKSB7CgkJ CQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHNlcnZpY2UgbWFuYWdlciAoJXUpLlxu IiwgR2V0TGFzdEVycm9yKCkpOwoJCQkJZXhpdChFWElUX0ZBSUxVUkUpOwoJCQl9CgoJCQloU2Vy dmljZSA9IENyZWF0ZVNlcnZpY2UoaFNDTWFuYWdlciwgc2VydmljZV9uYW1lLCBzZXJ2aWNlX25h bWUsIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfRVhFQ1VURSB8IFNFUlZJQ0VfQ0hBTkdFX0NPTkZJ RywgU0VSVklDRV9XSU4zMl9PV05fUFJPQ0VTUywgU0VSVklDRV9BVVRPX1NUQVJULCBTRVJWSUNF X0VSUk9SX0lHTk9SRSwKCQkJCQkJIHNlcnZpY2VQYXRoLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxM LCAvKiBTZXJ2aWNlIHN0YXJ0IG5hbWUgKi8gTlVMTCk7CgkJCWlmICghaFNlcnZpY2UpIHsKCQkJ CWZwcmludGYoc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgZnJlZXN3aXRjaCBzZXJ2aWNlICgldSku XG4iLCBHZXRMYXN0RXJyb3IoKSk7CgkJCQlDbG9zZVNlcnZpY2VIYW5kbGUoaFNDTWFuYWdlcik7 CgkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CgkJCX0KCgkJCS8qIFNldCBkZXNjLCBhbmQgZG9uJ3Qg Y2FyZSBpZiBpdCBzdWNjZWVkcyAqLwoJCQlpZiAoIUNoYW5nZVNlcnZpY2VDb25maWcyKGhTZXJ2 aWNlLCBTRVJWSUNFX0NPTkZJR19ERVNDUklQVElPTiwgJmRlc2MpKSB7CgkJCQlmcHJpbnRmKHN0 ZGVyciwgIkZyZWVTV0lUQ0ggaW5zdGFsbGVkLCBidXQgY291bGQgbm90IHNldCB0aGUgc2Vydmlj ZSBkZXNjcmlwdGlvbiAoJXUpLlxuIiwgR2V0TGFzdEVycm9yKCkpOwoJCQl9CgoJCQlDbG9zZVNl cnZpY2VIYW5kbGUoaFNlcnZpY2UpOwoJCQlDbG9zZVNlcnZpY2VIYW5kbGUoaFNDTWFuYWdlcik7 CgkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKCQl9CgoJCWVsc2UgaWYgKHggPT0gMSAmJiAhc3RyY21w KGxvY2FsX2FyZ3ZbeF0sICItdW5pbnN0YWxsIikpIHsKCQkJU0NfSEFORExFIGhTZXJ2aWNlOwoJ CQlTQ19IQU5ETEUgaFNDTWFuYWdlcjsKCQkJQk9PTCBkZWxldGVkOwoKCQkJeCsrOwoJCQlpZiAo IXN3aXRjaF9zdHJsZW5femVybyhsb2NhbF9hcmd2W3hdKSkgewoJCQkJc3dpdGNoX2NvcHlfc3Ry aW5nKHNlcnZpY2VfbmFtZSwgbG9jYWxfYXJndlt4XSwgU0VSVklDRU5BTUVfTUFYTEVOKTsKCQkJ fSBlbHNlIHsKCQkJCXN3aXRjaF9jb3B5X3N0cmluZyhzZXJ2aWNlX25hbWUsIFNFUlZJQ0VOQU1F X0RFRkFVTFQsIFNFUlZJQ0VOQU1FX01BWExFTik7CgkJCX0KCgkJCS8qIERvIHRoZSB1bmluc3Rh bGxhdGlvbiAqLwoJCQloU0NNYW5hZ2VyID0gT3BlblNDTWFuYWdlcihOVUxMLCBOVUxMLCBTQ19N QU5BR0VSX0FMTF9BQ0NFU1MpOwoJCQlpZiAoIWhTQ01hbmFnZXIpIHsKCQkJCWZwcmludGYoc3Rk ZXJyLCAiQ291bGQgbm90IG9wZW4gc2VydmljZSBtYW5hZ2VyICgldSkuXG4iLCBHZXRMYXN0RXJy b3IoKSk7CgkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CgkJCX0KCgkJCWhTZXJ2aWNlID0gT3BlblNl cnZpY2UoaFNDTWFuYWdlciwgc2VydmljZV9uYW1lLCBERUxFVEUpOwoJCQlpZiAoIWhTZXJ2aWNl KSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgc2VydmljZSAoJXUpLlxuIiwg R2V0TGFzdEVycm9yKCkpOwoJCQkJQ2xvc2VTZXJ2aWNlSGFuZGxlKGhTQ01hbmFnZXIpOwoJCQkJ ZXhpdChFWElUX0ZBSUxVUkUpOwoJCQl9CgoJCQkvKiByZW1vdmUgdGhlIHNlcnZpY2UhICovCgkJ CWRlbGV0ZWQgPSBEZWxldGVTZXJ2aWNlKGhTZXJ2aWNlKTsKCQkJaWYgKCFkZWxldGVkKSB7CgkJ CQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGRlbGV0aW5nIHNlcnZpY2UgKCV1KS5cbiIsIEdldExh c3RFcnJvcigpKTsKCQkJfQoKCQkJQ2xvc2VTZXJ2aWNlSGFuZGxlKGhTZXJ2aWNlKTsKCQkJQ2xv c2VTZXJ2aWNlSGFuZGxlKGhTQ01hbmFnZXIpOwoJCQlleGl0KGRlbGV0ZWQgPyBFWElUX1NVQ0NF U1MgOiBFWElUX0ZBSUxVUkUpOwoJCX0KCgkJZWxzZSBpZiAoIXN0cmNtcChsb2NhbF9hcmd2W3hd LCAiLW1vbm90b25pYy1jbG9jayIpKSB7CgkJCWZsYWdzIHw9IFNDRl9VU0VfV0lOMzJfTU9OT1RP TklDOwoJCX0KI2Vsc2UKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3ZbeF0sICItdSIpKSB7 CgkJCXgrKzsKCQkJaWYgKHN3aXRjaF9zdHJsZW5femVybyhsb2NhbF9hcmd2W3hdKSB8fCBpc19v cHRpb24obG9jYWxfYXJndlt4XSkpIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiT3B0aW9uICclcycg cmVxdWlyZXMgYW4gYXJndW1lbnQhXG4iLCBsb2NhbF9hcmd2W3ggLSAxXSk7CgkJCQlleGl0KEVY SVRfRkFJTFVSRSk7CgkJCX0KCQkJcnVuYXNfdXNlciA9IGxvY2FsX2FyZ3ZbeF07CgkJfQoKCQll bHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3ZbeF0sICItZyIpKSB7CgkJCXgrKzsKCQkJaWYgKHN3 aXRjaF9zdHJsZW5femVybyhsb2NhbF9hcmd2W3hdKSB8fCBpc19vcHRpb24obG9jYWxfYXJndlt4 XSkpIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiT3B0aW9uICclcycgcmVxdWlyZXMgYW4gYXJndW1l bnQhXG4iLCBsb2NhbF9hcmd2W3ggLSAxXSk7CgkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CgkJCX0K CQkJcnVuYXNfZ3JvdXAgPSBsb2NhbF9hcmd2W3hdOwoJCX0KCgkJZWxzZSBpZiAoIXN0cmNtcChs b2NhbF9hcmd2W3hdLCAiLW5mIikpIHsKCQkJbmYgPSBTV0lUQ0hfVFJVRTsKCQl9CgoJCWVsc2Ug aWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1yZWluY2FybmF0ZSIpKSB7CgkJCXJlaW5jYXJu YXRlID0gU1dJVENIX1RSVUU7CgkJfQoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwg Ii1yZWluY2FybmF0ZS1yZWV4ZWMiKSkgewoJCQlyZWluY2FybmF0ZSA9IFNXSVRDSF9UUlVFOwoJ CQlyZWluY2FybmF0ZV9yZWV4ZWMgPSBTV0lUQ0hfVFJVRTsKCQl9CgoJCWVsc2UgaWYgKCFzdHJj bXAobG9jYWxfYXJndlt4XSwgIi12ZXJzaW9uIikpIHsKCQkJZnByaW50ZihzdGRvdXQsICJGcmVl U1dJVENIIHZlcnNpb246ICVzICglcylcbiIsIHN3aXRjaF92ZXJzaW9uX2Z1bGwoKSwgc3dpdGNo X3ZlcnNpb25fcmV2aXNpb25faHVtYW4oKSk7CgkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKCQl9CiNl bmRpZgojaWZkZWYgSEFWRV9TRVRSTElNSVQKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3Zb eF0sICItY29yZSIpKSB7CgkJCXN0cnVjdCBybGltaXQgcmxwOwoJCQltZW1zZXQoJnJscCwgMCwg c2l6ZW9mKHJscCkpOwoJCQlybHAucmxpbV9jdXIgPSBSTElNX0lORklOSVRZOwoJCQlybHAucmxp bV9tYXggPSBSTElNX0lORklOSVRZOwoJCQlzZXRybGltaXQoUkxJTUlUX0NPUkUsICZybHApOwoJ CX0KCgkJZWxzZSBpZiAoIXN0cmNtcChsb2NhbF9hcmd2W3hdLCAiLXdhc3RlIikpIHsKI2lmbmRl ZiBGU182NEJJVAoJCQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IFdhc3RpbmcgdXAgdG8gOCBt ZWdzIG9mIG1lbW9yeSBwZXIgdGhyZWFkLlxuIik7CgkJCXNsZWVwKDIpOwoJCQl3YXN0ZSA9IFNX SVRDSF9UUlVFOwojZW5kaWYKCQl9CgoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwg Ii1uby1hdXRvLXN0YWNrIikpIHsKI2lmbmRlZiBGU182NEJJVAoJCQl3YXN0ZSA9IFNXSVRDSF9U UlVFOwojZW5kaWYKCQl9CiNlbmRpZgoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwg Ii1ocCIpIHx8ICFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1ycCIpKSB7CgkJCXByaW9yaXR5ID0g MjsKCQl9CgoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1scCIpKSB7CgkJCXBy aW9yaXR5ID0gLTE7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3ZbeF0sICItbnAi KSkgewoJCQlwcmlvcml0eSA9IDE7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3Zb eF0sICItbm9zcWwiKSkgewoJCQlmbGFncyAmPSB+U0NGX1VTRV9TUUw7CgkJfQoKCQllbHNlIGlm ICghc3RyY21wKGxvY2FsX2FyZ3ZbeF0sICItbm9uYXQiKSkgewoJCQlmbGFncyAmPSB+U0NGX1VT RV9BVVRPX05BVDsKCQl9CgoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1ub25h dG1hcCIpKSB7CgkJCWZsYWdzICY9IH5TQ0ZfVVNFX05BVF9NQVBQSU5HOwoJCX0KCgkJZWxzZSBp ZiAoIXN0cmNtcChsb2NhbF9hcmd2W3hdLCAiLWhlYXZ5LXRpbWVyIikpIHsKCQkJZmxhZ3MgfD0g U0NGX1VTRV9IRUFWWV9USU1JTkc7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3Zb eF0sICItbm9ydCIpKSB7CgkJCWZsYWdzICY9IH5TQ0ZfVVNFX0NMT0NLX1JUOwoJCX0KCgkJZWxz ZSBpZiAoIXN0cmNtcChsb2NhbF9hcmd2W3hdLCAiLW5vY2FsIikpIHsKCQkJZmxhZ3MgJj0gflND Rl9DQUxJQlJBVEVfQ0xPQ0s7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3ZbeF0s ICItdmciKSkgewoJCQlmbGFncyB8PSBTQ0ZfVkc7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxv Y2FsX2FyZ3ZbeF0sICItc3RvcCIpKSB7CgkJCWRvX2tpbGwgPSBTV0lUQ0hfVFJVRTsKCQl9CgoJ CWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1uYyIpKSB7CgkJCW5jID0gU1dJVENI X1RSVUU7CgkJfQojaWZuZGVmIFdJTjMyCgkJZWxzZSBpZiAoIXN0cmNtcChsb2NhbF9hcmd2W3hd LCAiLW5jd2FpdCIpKSB7CgkJCW5jID0gU1dJVENIX1RSVUU7CgkJCWRvX3dhaXQgPSBTV0lUQ0hf VFJVRTsKCQl9CiNlbmRpZgoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1jIikp IHsKCQkJbmMgPSBTV0lUQ0hfRkFMU0U7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2Fy Z3ZbeF0sICItY29uZiIpKSB7CgkJCXgrKzsKCQkJaWYgKHN3aXRjaF9zdHJsZW5femVybyhsb2Nh bF9hcmd2W3hdKSB8fCBpc19vcHRpb24obG9jYWxfYXJndlt4XSkpIHsKCQkJCWZwcmludGYoc3Rk ZXJyLCAiV2hlbiB1c2luZyAtY29uZiB5b3UgbXVzdCBzcGVjaWZ5IGEgY29uZmlnIGRpcmVjdG9y eVxuIik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgoJCQlTV0lUQ0hfR0xPQkFMX2RpcnMuY29uZl9k aXIgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvY2FsX2FyZ3ZbeF0pICsgMSk7CgkJCWlmICgh U1dJVENIX0dMT0JBTF9kaXJzLmNvbmZfZGlyKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIkFsbG9j YXRpb24gZXJyb3JcbiIpOwoJCQkJcmV0dXJuIDI1NTsKCQkJfQoJCQlzdHJjcHkoU1dJVENIX0dM T0JBTF9kaXJzLmNvbmZfZGlyLCBsb2NhbF9hcmd2W3hdKTsKCQkJYWx0X2RpcnMrKzsKCQl9CgoJ CWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1tb2QiKSkgewoJCQl4Kys7CgkJCWlm IChzd2l0Y2hfc3RybGVuX3plcm8obG9jYWxfYXJndlt4XSkgfHwgaXNfb3B0aW9uKGxvY2FsX2Fy Z3ZbeF0pKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIldoZW4gdXNpbmcgLW1vZCB5b3UgbXVzdCBz cGVjaWZ5IGEgbW9kdWxlIGRpcmVjdG9yeVxuIik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgoJCQlT V0lUQ0hfR0xPQkFMX2RpcnMubW9kX2RpciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obG9jYWxf YXJndlt4XSkgKyAxKTsKCQkJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMubW9kX2RpcikgewoJCQkJ ZnByaW50ZihzdGRlcnIsICJBbGxvY2F0aW9uIGVycm9yXG4iKTsKCQkJCXJldHVybiAyNTU7CgkJ CX0KCQkJc3RyY3B5KFNXSVRDSF9HTE9CQUxfZGlycy5tb2RfZGlyLCBsb2NhbF9hcmd2W3hdKTsK CQl9CgoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1sb2ciKSkgewoJCQl4Kys7 CgkJCWlmIChzd2l0Y2hfc3RybGVuX3plcm8obG9jYWxfYXJndlt4XSkgfHwgaXNfb3B0aW9uKGxv Y2FsX2FyZ3ZbeF0pKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIldoZW4gdXNpbmcgLWxvZyB5b3Ug bXVzdCBzcGVjaWZ5IGEgbG9nIGRpcmVjdG9yeVxuIik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgoJ CQlTV0lUQ0hfR0xPQkFMX2RpcnMubG9nX2RpciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obG9j YWxfYXJndlt4XSkgKyAxKTsKCQkJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMubG9nX2RpcikgewoJ CQkJZnByaW50ZihzdGRlcnIsICJBbGxvY2F0aW9uIGVycm9yXG4iKTsKCQkJCXJldHVybiAyNTU7 CgkJCX0KCQkJc3RyY3B5KFNXSVRDSF9HTE9CQUxfZGlycy5sb2dfZGlyLCBsb2NhbF9hcmd2W3hd KTsKCQkJYWx0X2RpcnMrKzsKCQkJbG9nX3NldCA9IFNXSVRDSF9UUlVFOwoJCX0KCgkJZWxzZSBp ZiAoIXN0cmNtcChsb2NhbF9hcmd2W3hdLCAiLXJ1biIpKSB7CgkJCXgrKzsKCQkJaWYgKHN3aXRj aF9zdHJsZW5femVybyhsb2NhbF9hcmd2W3hdKSB8fCBpc19vcHRpb24obG9jYWxfYXJndlt4XSkp IHsKCQkJCWZwcmludGYoc3RkZXJyLCAiV2hlbiB1c2luZyAtcnVuIHlvdSBtdXN0IHNwZWNpZnkg YSBwaWQgZGlyZWN0b3J5XG4iKTsKCQkJCXJldHVybiAyNTU7CgkJCX0KCgkJCVNXSVRDSF9HTE9C QUxfZGlycy5ydW5fZGlyID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihsb2NhbF9hcmd2W3hdKSAr IDEpOwoJCQlpZiAoIVNXSVRDSF9HTE9CQUxfZGlycy5ydW5fZGlyKSB7CgkJCQlmcHJpbnRmKHN0 ZGVyciwgIkFsbG9jYXRpb24gZXJyb3JcbiIpOwoJCQkJcmV0dXJuIDI1NTsKCQkJfQoJCQlzdHJj cHkoU1dJVENIX0dMT0JBTF9kaXJzLnJ1bl9kaXIsIGxvY2FsX2FyZ3ZbeF0pOwoJCQlydW5fc2V0 ID0gU1dJVENIX1RSVUU7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3ZbeF0sICIt ZGIiKSkgewoJCQl4Kys7CgkJCWlmIChzd2l0Y2hfc3RybGVuX3plcm8obG9jYWxfYXJndlt4XSkg fHwgaXNfb3B0aW9uKGxvY2FsX2FyZ3ZbeF0pKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIldoZW4g dXNpbmcgLWRiIHlvdSBtdXN0IHNwZWNpZnkgYSBkYiBkaXJlY3RvcnlcbiIpOwoJCQkJcmV0dXJu IDI1NTsKCQkJfQoKCQkJU1dJVENIX0dMT0JBTF9kaXJzLmRiX2RpciA9IChjaGFyICopIG1hbGxv YyhzdHJsZW4obG9jYWxfYXJndlt4XSkgKyAxKTsKCQkJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMu ZGJfZGlyKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRpb24gZXJyb3JcbiIpOwoJCQkJ cmV0dXJuIDI1NTsKCQkJfQoJCQlzdHJjcHkoU1dJVENIX0dMT0JBTF9kaXJzLmRiX2RpciwgbG9j YWxfYXJndlt4XSk7CgkJCWFsdF9kaXJzKys7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxvY2Fs X2FyZ3ZbeF0sICItc2NyaXB0cyIpKSB7CgkJCXgrKzsKCQkJaWYgKHN3aXRjaF9zdHJsZW5femVy byhsb2NhbF9hcmd2W3hdKSB8fCBpc19vcHRpb24obG9jYWxfYXJndlt4XSkpIHsKCQkJCWZwcmlu dGYoc3RkZXJyLCAiV2hlbiB1c2luZyAtc2NyaXB0cyB5b3UgbXVzdCBzcGVjaWZ5IGEgc2NyaXB0 cyBkaXJlY3RvcnlcbiIpOwoJCQkJcmV0dXJuIDI1NTsKCQkJfQoKCQkJU1dJVENIX0dMT0JBTF9k aXJzLnNjcmlwdF9kaXIgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvY2FsX2FyZ3ZbeF0pICsg MSk7CgkJCWlmICghU1dJVENIX0dMT0JBTF9kaXJzLnNjcmlwdF9kaXIpIHsKCQkJCWZwcmludGYo c3RkZXJyLCAiQWxsb2NhdGlvbiBlcnJvclxuIik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgkJCXN0 cmNweShTV0lUQ0hfR0xPQkFMX2RpcnMuc2NyaXB0X2RpciwgbG9jYWxfYXJndlt4XSk7CgkJfQoK CQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3ZbeF0sICItaHRkb2NzIikpIHsKCQkJeCsrOwoJ CQlpZiAoc3dpdGNoX3N0cmxlbl96ZXJvKGxvY2FsX2FyZ3ZbeF0pIHx8IGlzX29wdGlvbihsb2Nh bF9hcmd2W3hdKSkgewoJCQkJZnByaW50ZihzdGRlcnIsICJXaGVuIHVzaW5nIC1odGRvY3MgeW91 IG11c3Qgc3BlY2lmeSBhIGh0ZG9jcyBkaXJlY3RvcnlcbiIpOwoJCQkJcmV0dXJuIDI1NTsKCQkJ fQoKCQkJU1dJVENIX0dMT0JBTF9kaXJzLmh0ZG9jc19kaXIgPSAoY2hhciAqKSBtYWxsb2Moc3Ry bGVuKGxvY2FsX2FyZ3ZbeF0pICsgMSk7CgkJCWlmICghU1dJVENIX0dMT0JBTF9kaXJzLmh0ZG9j c19kaXIpIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiQWxsb2NhdGlvbiBlcnJvclxuIik7CgkJCQly ZXR1cm4gMjU1OwoJCQl9CgkJCXN0cmNweShTV0lUQ0hfR0xPQkFMX2RpcnMuaHRkb2NzX2Rpciwg bG9jYWxfYXJndlt4XSk7CgkJfQoKCQllbHNlIGlmICghc3RyY21wKGxvY2FsX2FyZ3ZbeF0sICIt YmFzZSIpKSB7CgkJCXgrKzsKCQkJaWYgKHN3aXRjaF9zdHJsZW5femVybyhsb2NhbF9hcmd2W3hd KSB8fCBpc19vcHRpb24obG9jYWxfYXJndlt4XSkpIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiV2hl biB1c2luZyAtYmFzZSB5b3UgbXVzdCBzcGVjaWZ5IGEgYmFzZSBkaXJlY3RvcnlcbiIpOwoJCQkJ cmV0dXJuIDI1NTsKCQkJfQoKCQkJU1dJVENIX0dMT0JBTF9kaXJzLmJhc2VfZGlyID0gKGNoYXIg KikgbWFsbG9jKHN0cmxlbihsb2NhbF9hcmd2W3hdKSArIDEpOwoJCQlpZiAoIVNXSVRDSF9HTE9C QUxfZGlycy5iYXNlX2RpcikgewoJCQkJZnByaW50ZihzdGRlcnIsICJBbGxvY2F0aW9uIGVycm9y XG4iKTsKCQkJCXJldHVybiAyNTU7CgkJCX0KCQkJc3RyY3B5KFNXSVRDSF9HTE9CQUxfZGlycy5i YXNlX2RpciwgbG9jYWxfYXJndlt4XSk7CgkJCWFsdF9iYXNlID0gMTsKCQl9CgoJCWVsc2UgaWYg KCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi10ZW1wIikpIHsKCQkJeCsrOwoJCQlpZiAoc3dpdGNo X3N0cmxlbl96ZXJvKGxvY2FsX2FyZ3ZbeF0pIHx8IGlzX29wdGlvbihsb2NhbF9hcmd2W3hdKSkg ewoJCQkJZnByaW50ZihzdGRlcnIsICJXaGVuIHVzaW5nIC10ZW1wIHlvdSBtdXN0IHNwZWNpZnkg YSB0ZW1wIGRpcmVjdG9yeVxuIik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgoJCQlTV0lUQ0hfR0xP QkFMX2RpcnMudGVtcF9kaXIgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvY2FsX2FyZ3ZbeF0p ICsgMSk7CgkJCWlmICghU1dJVENIX0dMT0JBTF9kaXJzLnRlbXBfZGlyKSB7CgkJCQlmcHJpbnRm KHN0ZGVyciwgIkFsbG9jYXRpb24gZXJyb3JcbiIpOwoJCQkJcmV0dXJuIDI1NTsKCQkJfQoJCQlz dHJjcHkoU1dJVENIX0dMT0JBTF9kaXJzLnRlbXBfZGlyLCBsb2NhbF9hcmd2W3hdKTsKCQl9CgoJ CWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1zdG9yYWdlIikpIHsKCQkJeCsrOwoJ CQlpZiAoc3dpdGNoX3N0cmxlbl96ZXJvKGxvY2FsX2FyZ3ZbeF0pIHx8IGlzX29wdGlvbihsb2Nh bF9hcmd2W3hdKSkgewoJCQkJZnByaW50ZihzdGRlcnIsICJXaGVuIHVzaW5nIC1zdG9yYWdlIHlv dSBtdXN0IHNwZWNpZnkgYSBzdG9yYWdlIGRpcmVjdG9yeVxuIik7CgkJCQlyZXR1cm4gMjU1OwoJ CQl9CgoJCQlTV0lUQ0hfR0xPQkFMX2RpcnMuc3RvcmFnZV9kaXIgPSAoY2hhciAqKSBtYWxsb2Mo c3RybGVuKGxvY2FsX2FyZ3ZbeF0pICsgMSk7CgkJCWlmICghU1dJVENIX0dMT0JBTF9kaXJzLnN0 b3JhZ2VfZGlyKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRpb24gZXJyb3JcbiIpOwoJ CQkJcmV0dXJuIDI1NTsKCQkJfQoJCQlzdHJjcHkoU1dJVENIX0dMT0JBTF9kaXJzLnN0b3JhZ2Vf ZGlyLCBsb2NhbF9hcmd2W3hdKTsKCQl9CgoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4 XSwgIi1jYWNoZSIpKSB7CgkJCXgrKzsKCQkJaWYgKHN3aXRjaF9zdHJsZW5femVybyhsb2NhbF9h cmd2W3hdKSB8fCBpc19vcHRpb24obG9jYWxfYXJndlt4XSkpIHsKCQkJCWZwcmludGYoc3RkZXJy LCAiV2hlbiB1c2luZyAtY2FjaGUgeW91IG11c3Qgc3BlY2lmeSBhIGNhY2hlIGRpcmVjdG9yeVxu Iik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgoJCQlTV0lUQ0hfR0xPQkFMX2RpcnMuY2FjaGVfZGly ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihsb2NhbF9hcmd2W3hdKSArIDEpOwoJCQlpZiAoIVNX SVRDSF9HTE9CQUxfZGlycy5jYWNoZV9kaXIpIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiQWxsb2Nh dGlvbiBlcnJvclxuIik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgkJCXN0cmNweShTV0lUQ0hfR0xP QkFMX2RpcnMuY2FjaGVfZGlyLCBsb2NhbF9hcmd2W3hdKTsKCQl9CgoJCWVsc2UgaWYgKCFzdHJj bXAobG9jYWxfYXJndlt4XSwgIi1yZWNvcmRpbmdzIikpIHsKCQkJeCsrOwoJCQlpZiAoc3dpdGNo X3N0cmxlbl96ZXJvKGxvY2FsX2FyZ3ZbeF0pIHx8IGlzX29wdGlvbihsb2NhbF9hcmd2W3hdKSkg ewoJCQkJZnByaW50ZihzdGRlcnIsICJXaGVuIHVzaW5nIC1yZWNvcmRpbmdzIHlvdSBtdXN0IHNw ZWNpZnkgYSByZWNvcmRpbmcgZGlyZWN0b3J5XG4iKTsKCQkJCXJldHVybiAyNTU7CgkJCX0KCgkJ CVNXSVRDSF9HTE9CQUxfZGlycy5yZWNvcmRpbmdzX2RpciA9IChjaGFyICopIG1hbGxvYyhzdHJs ZW4obG9jYWxfYXJndlt4XSkgKyAxKTsKCQkJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMucmVjb3Jk aW5nc19kaXIpIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiQWxsb2NhdGlvbiBlcnJvclxuIik7CgkJ CQlyZXR1cm4gMjU1OwoJCQl9CgkJCXN0cmNweShTV0lUQ0hfR0xPQkFMX2RpcnMucmVjb3JkaW5n c19kaXIsIGxvY2FsX2FyZ3ZbeF0pOwoJCX0KCgkJZWxzZSBpZiAoIXN0cmNtcChsb2NhbF9hcmd2 W3hdLCAiLWdyYW1tYXIiKSkgewoJCQl4Kys7CgkJCWlmIChzd2l0Y2hfc3RybGVuX3plcm8obG9j YWxfYXJndlt4XSkgfHwgaXNfb3B0aW9uKGxvY2FsX2FyZ3ZbeF0pKSB7CgkJCQlmcHJpbnRmKHN0 ZGVyciwgIldoZW4gdXNpbmcgLWdyYW1tYXIgeW91IG11c3Qgc3BlY2lmeSBhIGdyYW1tYXIgZGly ZWN0b3J5XG4iKTsKCQkJCXJldHVybiAyNTU7CgkJCX0KCgkJCVNXSVRDSF9HTE9CQUxfZGlycy5n cmFtbWFyX2RpciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obG9jYWxfYXJndlt4XSkgKyAxKTsK CQkJaWYgKCFTV0lUQ0hfR0xPQkFMX2RpcnMuZ3JhbW1hcl9kaXIpIHsKCQkJCWZwcmludGYoc3Rk ZXJyLCAiQWxsb2NhdGlvbiBlcnJvclxuIik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgkJCXN0cmNw eShTV0lUQ0hfR0xPQkFMX2RpcnMuZ3JhbW1hcl9kaXIsIGxvY2FsX2FyZ3ZbeF0pOwoJCX0KCgkJ ZWxzZSBpZiAoIXN0cmNtcChsb2NhbF9hcmd2W3hdLCAiLWNlcnRzIikpIHsKCQkJeCsrOwoJCQlp ZiAoc3dpdGNoX3N0cmxlbl96ZXJvKGxvY2FsX2FyZ3ZbeF0pIHx8IGlzX29wdGlvbihsb2NhbF9h cmd2W3hdKSkgewoJCQkJZnByaW50ZihzdGRlcnIsICJXaGVuIHVzaW5nIC1jZXJ0cyB5b3UgbXVz dCBzcGVjaWZ5IGEgY2VydGlmaWNhdGVzIGRpcmVjdG9yeVxuIik7CgkJCQlyZXR1cm4gMjU1OwoJ CQl9CgoJCQlTV0lUQ0hfR0xPQkFMX2RpcnMuY2VydHNfZGlyID0gKGNoYXIgKikgbWFsbG9jKHN0 cmxlbihsb2NhbF9hcmd2W3hdKSArIDEpOwoJCQlpZiAoIVNXSVRDSF9HTE9CQUxfZGlycy5jZXJ0 c19kaXIpIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiQWxsb2NhdGlvbiBlcnJvclxuIik7CgkJCQly ZXR1cm4gMjU1OwoJCQl9CgkJCXN0cmNweShTV0lUQ0hfR0xPQkFMX2RpcnMuY2VydHNfZGlyLCBs b2NhbF9hcmd2W3hdKTsKCQl9CgoJCWVsc2UgaWYgKCFzdHJjbXAobG9jYWxfYXJndlt4XSwgIi1z b3VuZHMiKSkgewoJCQl4Kys7CgkJCWlmIChzd2l0Y2hfc3RybGVuX3plcm8obG9jYWxfYXJndlt4 XSkgfHwgaXNfb3B0aW9uKGxvY2FsX2FyZ3ZbeF0pKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIldo ZW4gdXNpbmcgLXNvdW5kcyB5b3UgbXVzdCBzcGVjaWZ5IGEgc291bmRzIGRpcmVjdG9yeVxuIik7 CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgoJCQlTV0lUQ0hfR0xPQkFMX2RpcnMuc291bmRzX2RpciA9 IChjaGFyICopIG1hbGxvYyhzdHJsZW4obG9jYWxfYXJndlt4XSkgKyAxKTsKCQkJaWYgKCFTV0lU Q0hfR0xPQkFMX2RpcnMuc291bmRzX2RpcikgewoJCQkJZnByaW50ZihzdGRlcnIsICJBbGxvY2F0 aW9uIGVycm9yXG4iKTsKCQkJCXJldHVybiAyNTU7CgkJCX0KCQkJc3RyY3B5KFNXSVRDSF9HTE9C QUxfZGlycy5zb3VuZHNfZGlyLCBsb2NhbF9hcmd2W3hdKTsKCQl9CgoJCWVsc2UgaWYgKCFzdHJj bXAobG9jYWxfYXJndlt4XSwgIi1jZmduYW1lIikpIHsKCQkJeCsrOwoJCQlpZiAoc3dpdGNoX3N0 cmxlbl96ZXJvKGxvY2FsX2FyZ3ZbeF0pIHx8IGlzX29wdGlvbihsb2NhbF9hcmd2W3hdKSkgewoJ CQkJZnByaW50ZihzdGRlcnIsICJXaGVuIHVzaW5nIC1jZmduYW1lIHlvdSBtdXN0IHNwZWNpZnkg YSBmaWxlbmFtZVxuIik7CgkJCQlyZXR1cm4gMjU1OwoJCQl9CgoJCQlTV0lUQ0hfR0xPQkFMX2Zp bGVuYW1lcy5jb25mX25hbWUgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvY2FsX2FyZ3ZbeF0p ICsgMSk7CgkJCWlmICghU1dJVENIX0dMT0JBTF9maWxlbmFtZXMuY29uZl9uYW1lKSB7CgkJCQlm cHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRpb24gZXJyb3JcbiIpOwoJCQkJcmV0dXJuIDI1NTsKCQkJ fQoJCQlzdHJjcHkoU1dJVENIX0dMT0JBTF9maWxlbmFtZXMuY29uZl9uYW1lLCBsb2NhbF9hcmd2 W3hdKTsKCQl9CgoJCS8qIFVua25vd24gb3B0aW9uIChhbHdheXMgbGFzdCEpICovCgkJZWxzZSB7 CgkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb24gJyVzJywgc2VlICclcyAtaGVscCcg Zm9yIGEgbGlzdCBvZiB2YWxpZCBvcHRpb25zXG4iLAoJCQkJbG9jYWxfYXJndlt4XSwgbG9jYWxf YXJndlswXSk7CgkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKCQl9Cgl9CgoJaWYgKGxvZ19zZXQgJiYg IXJ1bl9zZXQpIHsKCQlTV0lUQ0hfR0xPQkFMX2RpcnMucnVuX2RpciA9IChjaGFyICopIG1hbGxv YyhzdHJsZW4oU1dJVENIX0dMT0JBTF9kaXJzLmxvZ19kaXIpICsgMSk7CgkJaWYgKCFTV0lUQ0hf R0xPQkFMX2RpcnMucnVuX2RpcikgewoJCQlmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRpb24gZXJy b3JcbiIpOwoJCQlyZXR1cm4gMjU1OwoJCX0KCQlzdHJjcHkoU1dJVENIX0dMT0JBTF9kaXJzLnJ1 bl9kaXIsIFNXSVRDSF9HTE9CQUxfZGlycy5sb2dfZGlyKTsKCX0KCglpZiAoZG9fa2lsbCkgewoJ CXJldHVybiBmcmVlc3dpdGNoX2tpbGxfYmFja2dyb3VuZCgpOwoJfQoKCWlmIChhcHJfaW5pdGlh bGl6ZSgpICE9IFNXSVRDSF9TVEFUVVNfU1VDQ0VTUykgewoJCWZwcmludGYoc3RkZXJyLCAiRkFU QUwgRVJST1IhIENvdWxkIG5vdCBpbml0aWFsaXplIEFQUlxuIik7CgkJcmV0dXJuIDI1NTsKCX0K CglpZiAoYWx0X2RpcnMgJiYgYWx0X2RpcnMgIT0gMyAmJiAhYWx0X2Jhc2UpIHsKCQlmcHJpbnRm KHN0ZGVyciwgIllvdSBtdXN0IHNwZWNpZnkgYWxsIG9yIG5vbmUgb2YgLWNvbmYsIC1sb2csIGFu ZCAtZGJcbiIpOwoJCXJldHVybiAyNTU7Cgl9CgojaWZuZGVmIEZTXzY0QklUCiNpZiBkZWZpbmVk KEhBVkVfU0VUUkxJTUlUKSAmJiAhZGVmaW5lZChfX3N1bikKCWlmICghd2FzdGUgJiYgIShmbGFn cyAmIFNDRl9WRykpIHsKCQlzdHJ1Y3QgcmxpbWl0IHJscDsKCgkJbWVtc2V0KCZybHAsIDAsIHNp emVvZihybHApKTsKCQlnZXRybGltaXQoUkxJTUlUX1NUQUNLLCAmcmxwKTsKCgkJaWYgKHJscC5y bGltX2N1ciAhPSBTV0lUQ0hfVEhSRUFEX1NUQUNLU0laRSkgewoJCQljaGFyIGJ1ZlsxMDI0XSA9 ICIiOwoJCQlpbnQgaSA9IDA7CgoJCQltZW1zZXQoJnJscCwgMCwgc2l6ZW9mKHJscCkpOwoJCQly bHAucmxpbV9jdXIgPSBTV0lUQ0hfVEhSRUFEX1NUQUNLU0laRTsKCQkJcmxwLnJsaW1fbWF4ID0g U1dJVENIX1NZU1RFTV9USFJFQURfU1RBQ0tTSVpFOwoJCQlzZXRybGltaXQoUkxJTUlUX1NUQUNL LCAmcmxwKTsKCgkJCWFwcl90ZXJtaW5hdGUoKTsKCQkJaWYgKGFyZ3YpIHJldCA9IChpbnQpIGV4 ZWN2KGFyZ3ZbMF0sIGFyZ3YpOwoKCQkJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewoJCQkJ c3dpdGNoX3NucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihi dWYpLCAiJXMgIiwgYXJndltpXSk7CgkJCX0KCgkJCXJldHVybiBzeXN0ZW0oYnVmKTsKCQl9Cgl9 CiNlbmRpZgojZW5kaWYKCXNpZ25hbChTSUdJTEwsIGhhbmRsZV9TSUdJTEwpOwoJc2lnbmFsKFNJ R1RFUk0sIGhhbmRsZV9TSUdJTEwpOwojaWZuZGVmIFdJTjMyCglpZiAoZG9fd2FpdCkgewoJCWlm IChwaXBlKGZkcykpIHsKCQkJZnByaW50ZihzdGRlcnIsICJTeXN0ZW0gRXJyb3IhXG4iKTsKCQkJ ZXhpdCgtMSk7CgkJfQoJfQojZW5kaWYKCglpZiAobmMpIHsKI2lmZGVmIFdJTjMyCgkJRnJlZUNv bnNvbGUoKTsKI2Vsc2UKCQlpZiAoIW5mKSB7CgkJCWRhZW1vbml6ZShkb193YWl0ID8gZmRzIDog TlVMTCk7CgkJfQojZW5kaWYKCX0KI2lmbmRlZiBXSU4zMgoJaWYgKHJlaW5jYXJuYXRlKQoJCXJl aW5jYXJuYXRlX3Byb3RlY3QocmVpbmNhcm5hdGVfcmVleGVjID8gYXJndiA6IE5VTEwpOwojZW5k aWYKCglpZiAoc3dpdGNoX2NvcmVfc2V0X3Byb2Nlc3NfcHJpdmlsZWdlcygpIDwgMCkgewoJCXJl dHVybiAyNTU7Cgl9CgoJc3dpdGNoIChwcmlvcml0eSkgewoJY2FzZSAyOgoJCXNldF9yZWFsdGlt ZV9wcmlvcml0eSgpOwoJCWJyZWFrOwoJY2FzZSAxOgoJCXNldF9ub3JtYWxfcHJpb3JpdHkoKTsK CQlicmVhazsKCWNhc2UgLTE6CgkJc2V0X2xvd19wcmlvcml0eSgpOwoJCWJyZWFrOwoJZGVmYXVs dDoKCQlzZXRfYXV0b19wcmlvcml0eSgpOwoJCWJyZWFrOwoJfQoKCXN3aXRjaF9jb3JlX3NldHJs aW1pdHMoKTsKCgojaWZuZGVmIFdJTjMyCglpZiAocnVuYXNfdXNlciB8fCBydW5hc19ncm91cCkg ewoJCWlmIChjaGFuZ2VfdXNlcl9ncm91cChydW5hc191c2VyLCBydW5hc19ncm91cCkgPCAwKSB7 CgkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHN3aXRjaCB1c2VyIFslc10gLyBncm91cCBb JXNdXG4iLAoJCQkJc3dpdGNoX3N0cmxlbl96ZXJvKHJ1bmFzX3VzZXIpICA/ICItIiA6IHJ1bmFz X3VzZXIsCgkJCQlzd2l0Y2hfc3RybGVuX3plcm8ocnVuYXNfZ3JvdXApID8gIi0iIDogcnVuYXNf Z3JvdXApOwoJCQlyZXR1cm4gMjU1OwoJCX0KCX0KI2Vsc2UKCWlmICh3aW4zMl9zZXJ2aWNlKSB7 CgkJLyogQXR0ZW1wdCB0byBzdGFydCBzZXJ2aWNlICovCgkJU0VSVklDRV9UQUJMRV9FTlRSWSBk aXNwYXRjaFRhYmxlW10gPSB7CgkJCXtzZXJ2aWNlX25hbWUsICZzZXJ2aWNlX21haW59CgkJCSwK CQkJe05VTEwsIE5VTEx9CgkJfTsKCQlzZXJ2aWNlX2ZsYWdzID0gZmxhZ3M7IC8qIGNvcHkgcGFy c2VkIGZsYWdzIGZvciBzZXJ2aWNlIHN0YXJ0dXAgKi8KCgkJaWYgKFN0YXJ0U2VydmljZUN0cmxE aXNwYXRjaGVyKGRpc3BhdGNoVGFibGUpID09IDApIHsKCQkJLyogTm90IGxvYWRlZCBhcyBhIHNl cnZpY2UgKi8KCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBGcmVlc3dpdGNoIGxvYWRlZCBhcyBh IGNvbnNvbGUgYXBwIHdpdGggLXNlcnZpY2Ugb3B0aW9uXG4iKTsKCQkJZnByaW50ZihzdGRlcnIs ICJUbyBpbnN0YWxsIHRoZSBzZXJ2aWNlIGxvYWQgZnJlZXN3aXRjaCB3aXRoIC1pbnN0YWxsXG4i KTsKCQl9CgkJZXhpdChFWElUX1NVQ0NFU1MpOwoJfQojZW5kaWYKCglzd2l0Y2hfY29yZV9zZXRf Z2xvYmFscygpOwoKCXBpZCA9IGdldHBpZCgpOwoKCW1lbXNldChwaWRfYnVmZmVyLCAwLCBzaXpl b2YocGlkX2J1ZmZlcikpOwoJc3dpdGNoX3NucHJpbnRmKHBpZF9wYXRoLCBzaXplb2YocGlkX3Bh dGgpLCAiJXMlcyVzIiwgU1dJVENIX0dMT0JBTF9kaXJzLnJ1bl9kaXIsIFNXSVRDSF9QQVRIX1NF UEFSQVRPUiwgcGZpbGUpOwoJc3dpdGNoX3NucHJpbnRmKHBpZF9idWZmZXIsIHNpemVvZihwaWRf YnVmZmVyKSwgIiVkIiwgcGlkKTsKCXBpZF9sZW4gPSBzdHJsZW4ocGlkX2J1ZmZlcik7CgoJYXBy X3Bvb2xfY3JlYXRlKCZwb29sLCBOVUxMKTsKCglzd2l0Y2hfZGlyX21ha2VfcmVjdXJzaXZlKFNX SVRDSF9HTE9CQUxfZGlycy5ydW5fZGlyLCBTV0lUQ0hfREVGQVVMVF9ESVJfUEVSTVMsIHBvb2wp OwoKCWlmIChzd2l0Y2hfZmlsZV9vcGVuKCZmZCwgcGlkX3BhdGgsIFNXSVRDSF9GT1BFTl9SRUFE LCBTV0lUQ0hfRlBST1RfVVJFQUQgfCBTV0lUQ0hfRlBST1RfVVdSSVRFLCBwb29sKSA9PSBTV0lU Q0hfU1RBVFVTX1NVQ0NFU1MpIHsKCgkJb2xkX3BpZF9sZW4gPSBzaXplb2Yob2xkX3BpZF9idWZm ZXIpIC0xOwoJCXN3aXRjaF9maWxlX3JlYWQoZmQsIG9sZF9waWRfYnVmZmVyLCAmb2xkX3BpZF9s ZW4pOwoJCXN3aXRjaF9maWxlX2Nsb3NlKGZkKTsKCX0KCglpZiAoc3dpdGNoX2ZpbGVfb3Blbigm ZmQsCgkJCQkJCSBwaWRfcGF0aCwKCQkJCQkJIFNXSVRDSF9GT1BFTl9XUklURSB8IFNXSVRDSF9G T1BFTl9DUkVBVEUgfCBTV0lUQ0hfRk9QRU5fVFJVTkNBVEUsCgkJCQkJCSBTV0lUQ0hfRlBST1Rf VVJFQUQgfCBTV0lUQ0hfRlBST1RfVVdSSVRFLCBwb29sKSAhPSBTV0lUQ0hfU1RBVFVTX1NVQ0NF U1MpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIHBpZCBmaWxlICVzLlxuIiwgcGlk X3BhdGgpOwoJCXJldHVybiAyNTU7Cgl9CgoJaWYgKHN3aXRjaF9maWxlX2xvY2soZmQsIFNXSVRD SF9GTE9DS19FWENMVVNJVkUgfCBTV0lUQ0hfRkxPQ0tfTk9OQkxPQ0spICE9IFNXSVRDSF9TVEFU VVNfU1VDQ0VTUykgewoJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGxvY2sgcGlkIGZpbGUgJXMu XG4iLCBwaWRfcGF0aCk7CgkJb2xkX3BpZF9sZW4gPSBzdHJsZW4ob2xkX3BpZF9idWZmZXIpOwoJ CWlmIChzdHJsZW4ob2xkX3BpZF9idWZmZXIpKSB7CgkJCXN3aXRjaF9maWxlX3dyaXRlKGZkLCBv bGRfcGlkX2J1ZmZlciwgJm9sZF9waWRfbGVuKTsKCQl9CgkJcmV0dXJuIDI1NTsKCX0KCglzd2l0 Y2hfZmlsZV93cml0ZShmZCwgcGlkX2J1ZmZlciwgJnBpZF9sZW4pOwoKCWlmIChzd2l0Y2hfY29y ZV9pbml0X2FuZF9tb2Rsb2FkKGZsYWdzLCBuYyA/IFNXSVRDSF9GQUxTRSA6IFNXSVRDSF9UUlVF LCAmZXJyKSAhPSBTV0lUQ0hfU1RBVFVTX1NVQ0NFU1MpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkNh bm5vdCBJbml0aWFsaXplIFslc11cbiIsIGVycik7CgkJcmV0dXJuIDI1NTsKCX0KCiNpZm5kZWYg V0lOMzIKCWlmIChkb193YWl0KSB7CgkJaWYgKGZkc1sxXSA+IC0xKSB7CgkJCWludCBpLCB2ID0g MTsKCgkJCWlmICgoaSA9IHdyaXRlKGZkc1sxXSwgJnYsIHNpemVvZih2KSkpIDwgMCkgewoJCQkJ ZnByaW50ZihzdGRlcnIsICJTeXN0ZW0gRXJyb3IgWyVzXVxuIiwgc3RyZXJyb3IoZXJybm8pKTsK CQkJfSBlbHNlIHsKCQkJCSh2b2lkKXJlYWQoZmRzWzFdLCAmdiwgc2l6ZW9mKHYpKTsKCQkJfQoK CQkJc2h1dGRvd24oZmRzWzFdLCAyKTsKCQkJY2xvc2UoZmRzWzFdKTsKCQkJZmRzWzFdID0gLTE7 CgkJfQoJfQojZW5kaWYKCglpZiAobmMgJiYgbmYpIHsKCQlzaWduYWwoU0lHSU5ULCBoYW5kbGVf U0lHSUxMKTsKCX0KCglzd2l0Y2hfY29yZV9ydW50aW1lX2xvb3AobmMpOwoKCWRlc3Ryb3lfc3Rh dHVzID0gc3dpdGNoX2NvcmVfZGVzdHJveSgpOwoKCXN3aXRjaF9maWxlX2Nsb3NlKGZkKTsKCWFw cl9wb29sX2Rlc3Ryb3kocG9vbCk7CgoJaWYgKHVubGluayhwaWRfcGF0aCkgIT0gMCkgewoJCWZw cmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGRlbGV0ZSBwaWQgZmlsZSBbJXNdXG4iLCBwaWRfcGF0 aCk7Cgl9CgoJaWYgKGRlc3Ryb3lfc3RhdHVzID09IFNXSVRDSF9TVEFUVVNfUkVTVEFSVCkgewoJ CWNoYXIgYnVmWzEwMjRdID0geyAwIH07CgkJaW50IGogPSAwOwoKCQlzd2l0Y2hfc2xlZXAoMTAw MDAwMCk7CgkJaWYgKCFhcmd2IHx8IGV4ZWN2KGFyZ3ZbMF0sIGFyZ3YpID09IC0xKSB7CgkJCWZw cmludGYoc3RkZXJyLCAiUmVzdGFydCBGYWlsZWQgWyVzXSByZXNvcnRpbmcgdG8gcGxhbiBiXG4i LCBzdHJlcnJvcihlcnJubykpOwoJCQlmb3IgKGogPSAwOyBqIDwgYXJnYzsgaisrKSB7CgkJCQlz d2l0Y2hfc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIHNpemVvZihidWYpIC0gc3RybGVuKGJ1 ZiksICIlcyAiLCBhcmd2W2pdKTsKCQkJfQoJCQlyZXQgPSBzeXN0ZW0oYnVmKTsKCQl9Cgl9CgoJ cmV0dXJuIHJldDsKfQoKCi8qIEZvciBFbWFjczoKICogTG9jYWwgVmFyaWFibGVzOgogKiBtb2Rl OmMKICogaW5kZW50LXRhYnMtbW9kZTp0CiAqIHRhYi13aWR0aDo0CiAqIGMtYmFzaWMtb2Zmc2V0 OjQKICogRW5kOgogKiBGb3IgVklNOgogKiB2aW06c2V0IHNvZnR0YWJzdG9wPTQgc2hpZnR3aWR0 aD00IHRhYnN0b3A9NCBub2V0OgogKi8K --=-=-=-- From owner-freebsd-hackers@freebsd.org Sat Feb 10 21:57:44 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9D502F21FAE for ; Sat, 10 Feb 2018 21:57:44 +0000 (UTC) (envelope-from Elliott.Rabe@dell.com) Received: from esa1.dell-outbound.iphmx.com (esa1.dell-outbound.iphmx.com [68.232.153.90]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "*.dell-outbound.iphmx.com", Issuer "Go Daddy Secure Certificate Authority - G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id E3691745C1; Sat, 10 Feb 2018 21:57:43 +0000 (UTC) (envelope-from Elliott.Rabe@dell.com) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=dell.com; i=@dell.com; q=dns/txt; s=smtpout; t=1518299712; x=1549835712; h=from:cc:to:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=LGHpY76dFVxQmLNowhHM0a2KOdTX38bZrlWeo6Y2/B0=; b=JFo+LwOTQ+PKXen0FluQ06xrx177f1kz7SoxN2f+HRTAzexl12Slew0Q hB50vdO5TCXsWWmF43mRr4GMFuAMFiBBxjRovlpJyUL/FW5gBtsN7IlUO eRjz/6xI8N3OrpkFRwQjhXId3xM0O90dILYHp1+2VhsCv/NdYAnNUep+1 U=; X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A2G+BAD7aH9ah8mZ6ERdHAEBAQQBAQoBA?= =?us-ascii?q?YQoUDAoCoNbmEiCApdtggMKhTsCGoIgVxUBAgEBAQEBAQIBAhABAQEKCwkIKC9?= =?us-ascii?q?CEAGBZSKCSwEFIxFABRACAQgSBgICBSECAgINAjYCDgIEE4o1sEuCJ4hzggUIA?= =?us-ascii?q?QEBBwIBJYEPg22CFYZthQoYF4MAgmUFpC4JlgSCH4pDh2KLFI0EgTw1gXRwgxi?= =?us-ascii?q?CZYISeIYOhRaBFwEBAQ?= X-IPAS-Result: =?us-ascii?q?A2G+BAD7aH9ah8mZ6ERdHAEBAQQBAQoBAYQoUDAoCoNbmEi?= =?us-ascii?q?CApdtggMKhTsCGoIgVxUBAgEBAQEBAQIBAhABAQEKCwkIKC9CEAGBZSKCSwEFI?= =?us-ascii?q?xFABRACAQgSBgICBSECAgINAjYCDgIEE4o1sEuCJ4hzggUIAQEBBwIBJYEPg22?= =?us-ascii?q?CFYZthQoYF4MAgmUFpC4JlgSCH4pDh2KLFI0EgTw1gXRwgxiCZYISeIYOhRaBF?= =?us-ascii?q?wEBAQ?= Received: from esa1.dell-outbound2.iphmx.com ([68.232.153.201]) by esa1.dell-outbound.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Feb 2018 15:54:02 -0600 From: Cc: , Received: from ausxippc106.us.dell.com ([143.166.85.156]) by esa1.dell-outbound2.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Feb 2018 03:53:59 +0600 X-LoopCount0: from 10.166.135.96 X-IronPort-AV: E=Sophos;i="5.46,491,1511848800"; d="scan'208";a="212581447" X-DLP: DLP_GlobalPCIDSS To: Subject: Re: Stale memory during post fork cow pmap update Thread-Topic: Stale memory during post fork cow pmap update Thread-Index: AQHToi21ONrV41etXEyYDT4ce+JxhKOd4hEAgACyFgA= Date: Sat, 10 Feb 2018 21:56:20 +0000 Message-ID: <5A7F6A7C.80607@dell.com> References: <5A7E7F2B.80900@dell.com> <20180210111848.GL33564@kib.kiev.ua> In-Reply-To: <20180210111848.GL33564@kib.kiev.ua> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.143.242.75] Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Mailman-Approved-At: Sat, 10 Feb 2018 22:34:22 +0000 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 21:57:44 -0000 T24gMDIvMTAvMjAxOCAwNToxOCBBTSwgS29uc3RhbnRpbiBCZWxvdXNvdiB3cm90ZToNCj4gT24g U2F0LCBGZWIgMTAsIDIwMTggYXQgMDU6MTI6MTFBTSArMDAwMCwgRWxsaW90dC5SYWJlQGRlbGwu Y29tIHdyb3RlOg0KPj4gR3JlZXRpbmdzLQ0KPj4NCj4+IEkndmUgYmVlbiBodW50aW5nIGZvciB0 aGUgcm9vdCBjYXVzZSBvZiBlbHVzaXZlLCBzbGlnaHQgbWVtb3J5DQo+PiBjb3JydXB0aW9ucyBp biBhIGxhcmdlLCBjb21wbGV4IHByb2Nlc3MgdGhhdCBtYW5hZ2VzIG1hbnkgdGhyZWFkcy4gQWxs DQo+PiBmYWlsdXJlcyBhbmQgZXhwZXJpbWVudGF0aW9uIHRodXMgZmFyIGhhcyBiZWVuIG9uIHg4 Nl82NCBhcmNoaXRlY3R1cmUNCj4+IG1hY2hpbmVzLCBhbmQgcG1hcF9wY2lkIGlzIG5vdCBpbiB1 c2UuDQo+Pg0KPj4gSSBiZWxpZXZlIEkgaGF2ZSBzdHVtYmxlZCBpbnRvIGEgdmVyeSB1bmxpa2Vs eSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgd2F5DQo+PiB0aGUgdm0gY29kZSB1cGRhdGVzIHRoZSBw bWFwIGR1cmluZyB3cml0ZSBmYXVsdCBwcm9jZXNzaW5nIGZvbGxvd2luZyBhDQo+PiBmb3JrIG9m IHRoZSBwcm9jZXNzLiAgSW4gdGhpcyBzaXR1YXRpb24sIHdoZW4gdGhlIHByb2Nlc3MgaXMgZm9y a2VkLA0KPj4gYXBwcm9wcmlhdGUgdm0gZW50cmllcyBhcmUgbWFya2VkIGNvcHktb24td3JpdGUu IE9uZSBzdWNoIGVudHJ5DQo+PiBhbGxvY2F0ZWQgYnkgc3RhdGljIHByb2Nlc3MgaW5pdGlhbGl6 YXRpb24gaXMgZnJlcXVlbnRseSB1c2VkIGJ5IG1hbnkNCj4+IHRocmVhZHMgaW4gdGhlIHByb2Nl c3MuICBUaGlzIG1ha2VzIGl0IGEgcHJpbWUgY2FuZGlkYXRlIHRvIHdyaXRlLWZhdWx0DQo+PiBz aG9ydGx5IGFmdGVyIGEgZm9yayBzeXN0ZW0gY2FsbCBpcyBtYWRlLiAgSW4gdGhpcyBzY2VuYXJp bywgc3VjaCBhDQo+PiBmYXVsdCBub3JtYWxseSBidXJkZW5zIHRoZSBmYXVsdGluZyB0aHJlYWQg d2l0aCB0aGUgdGFzayBvZiBhbGxvY2F0aW5nIGENCj4+IG5ldyBwYWdlLCBlbnRlcmluZyB0aGUg cGFnZSBhcyBwYXJ0IG9mIG1hbmFnZWQgbWVtb3J5LCBhbmQgdXBkYXRpbmcgdGhlDQo+PiBwbWFw IHdpdGggdGhlIG5ldyBwaHlzaWNhbCBhZGRyZXNzIGFuZCB0aGUgY2hhbmdlIHRvIHdyaXRlYWJs ZSBzdGF0dXMuDQo+PiBUaGlzIGFjdGlvbiBpcyBmb2xsb3dlZCB3aXRoIGFuIGludmFsaWRhdGlv biBvZiB0aGUgVExCIG9uIHRoZSBjdXJyZW50DQo+PiBDUFUsIGFuZCBpbiB0aGlzIGNhc2UgaXMg YWxzbyBmb2xsb3dlZCBieSBJUElfSU5WTFBHIElQSXMgdG8gZG8gdGhlIHNhbWUNCj4+IG9uIG90 aGVyIENQVXMgKHRoZXJlIGFyZSBvZnRlbiBtYW55IGFjdGl2ZSB0aHJlYWRzIGluIHRoaXMgcHJv Y2VzcykuDQo+PiBCZWZvcmUgdGhpcyByZW1vdGUgVExCIGludmFsaWRhdGlvbiBoYXMgY29tcGxl dGVkLCBvdGhlciBDUFVzIGFyZSBmcmVlDQo+PiB0byBhY3Qgb24gZWl0aGVyIHRoZSBvbGQgT1Ig bmV3IHBhZ2UgY2hhcmFjdGVyaXN0aWNzLiAgSWYgb3RoZXIgdGhyZWFkcw0KPj4gYXJlIGFsaXZl IGFuZCB1c2luZyBjb250ZW50cyBvZiB0aGUgZmF1bHRpbmcgcGFnZSBvbiBvdGhlciBDUFVzLCBi YWQNCj4+IHRoaW5ncyBjYW4gb2NjdXIuDQo+Pg0KPj4gSW4gb25lIHNpbXBsaWZpZWQgYW5kIHNv bWV3aGF0IGNvbnRyaXZlZCBleGFtcGxlLCBvbmUgdGhyZWFkIGF0dGVtcHRzIHRvDQo+PiB3cml0 ZSB0byBhIGxvY2F0aW9uIG9uIHRoZSBmYXVsdGluZyBwYWdlIHVuZGVyIHRoZSBwcm90ZWN0aW9u IG9mIGEgbG9jaw0KPj4gd2hpbGUgYW5vdGhlciB0aHJlYWQgYXR0ZW1wdHMgdG8gcmVhZCBmcm9t IHRoZSBzYW1lIGxvY2F0aW9uIHR3aWNlIGluDQo+PiBzdWNjZXNzaW9uIHVuZGVyIHRoZSBwcm90 ZWN0aW9uIG9mIHRoZSBzYW1lIGxvY2suICBJZiBib3RoIHRoZSB3cml0aW5nDQo+PiB0aHJlYWQg YW5kIHJlYWRpbmcgdGhyZWFkIGFyZSBydW5uaW5nIG9uIGRpZmZlcmVudCBDUFVzLCBhbmQgaWYg dGhlDQo+PiB3cml0ZSBpcyBkaXJlY3RlZCB0byB0aGUgbmV3IHBoeXNpY2FsIGFkZHJlc3MsIHRo ZSByZWFkcyBtYXkgY29tZSBmcm9tDQo+PiBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVzc2VzIGlm IGEgVExCIGludmFsaWRhdGlvbiBvY2N1cnMgYmV0d2VlbiB0aGVtLg0KPj4gVGhpcyBzZWVtaW5n bHkgdmlvbGF0ZXMgdGhlIGd1YXJhbnRlZXMgcHJvdmlkZWQgYnkgdGhlIGxvY2tpbmcNCj4+IHBy aW1pdGl2ZXMgYW5kIGNhbiByZXN1bHQgaW4gc3VidGxlIG1lbW9yeSBjb3JydXB0aW9uIHN5bXB0 b21zLg0KPj4NCj4+IEl0IHRvb2sgbWUgcXVpdGUgYSB3aGlsZSB0byBjaGFzZSB0aGVzZSBzeW1w dG9tcyBmcm9tIHVzZXItc3BhY2UgZG93bg0KPj4gaW50byB0aGUgb3BlcmF0aW5nIHN5c3RlbSwg YW5kIGV2ZW4gbG9uZ2VyIHRvIGVuZCB1cCB3aXRoIGEgc3RhbmQtYWxvbmUNCj4+IHRlc3QgZml4 dHVyZSBhYmxlIHRvIHJlcHJvZHVjZSB0aGUgc2l0dWF0aW9uIGRlc2NyaWJlZCBhYm92ZSBvbiBk ZW1hbmQuDQo+PiBJZiBJIGFsdGVyIHRoZSBrZXJuZWwgY29kZSB0byBwZXJmb3JtIGEgdHdvLXN0 YWdlIHVwZGF0ZSBvZiB0aGUgcG1hcA0KPj4gZW50cnksIHRoZSBvYnNlcnZlZCBjb3JydXB0aW9u IHN5bXB0b21zIGRpc2FwcGVhci4gIFRoaXMgdHdvLXN0YWdlDQo+PiBtZWNoYW5pc20gdXBkYXRl cyBhbmQgaW52YWxpZGF0ZXMgdGhlIG5ldyBwaHlzaWNhbCBhZGRyZXNzIGluIGENCj4+IHJlYWQt b25seSBzdGF0ZSBmaXJzdCwgYW5kIHRoZW4gZG9lcyBhIHNlY29uZCBwbWFwIHVwZGF0ZSBhbmQN Cj4+IGludmFsaWRhdGlvbiB0byBjaGFuZ2UgdGhlIHN0YXR1cyB0byB3cml0ZWFibGUuICBUaGUg aW50ZW5kZWQgZWZmZWN0IHdhcw0KPj4gdG8gY2F1c2UgYW55IG90aGVyIHRocmVhZHMgd3JpdGlu ZyB0byB0aGUgZmF1bHRpbmcgcGFnZSB0byBiZWNvbWUNCj4+IG9ic3RydWN0ZWQgdW50aWwgdGhl IGVhcmxpZXIgZmF1bHQgaXMgY29tcGxldGUsIHRodXMgZWxpbWluYXRpbmcgdGhlDQo+PiBwb3Nz aWJpbGl0eSBvZiB0aGUgcGh5c2ljYWwgcGFnZXMgaGF2aW5nIGRpZmZlcmVudCBjb250ZW50cyB1 bnRpbCB0aGUNCj4+IG5ldyBwaHlzaWNhbCBhZGRyZXNzIHdhcyBmdWxseSB2aXNpYmxlLiAgVGhp cyBpcyBnb29meSwgYW5kIGZyb20gYW4NCj4+IGVmZmljaWVuY3kgc3RhbmRwb2ludCBpdCBpcyBv YnZpb3VzbHkgdW5kZXNpcmFibGUsIGJ1dCBpdCB3YXMgdGhlIGZpcnN0DQo+PiB0aGluZyB0aGF0 IGNhbWUgdG8gbWluZCwgYW5kIGl0IHNlZW1zIHRvIGJlIHdvcmtpbmcgZmluZS4NCj4+DQo+PiBJ IGFtIG5vdCB0ZXJyaWJseSBmYW1pbGxpYXIgd2l0aCB0aGUgaGlnaGVyIGxldmVsIGRlc2lnbiBo ZXJlLCBzbyBpdCBpcw0KPj4gdW5jbGVhciB0byBtZSBpZiB0aGlzIHByb2JsZW0gaXMgc2ltcGx5 IGEgdmVyeSB1bmxpa2VseSByYWNlIGNvbmRpdGlvbg0KPj4gdGhhdCBoYXNuJ3QgeWV0IGJlZW4g ZGlhZ25vc2VkIG9yIGlmIHRoaXMgaXMgaW5zdGVhZCB0aGUgYnJlYWtkb3duIG9mDQo+PiBzb21l IG90aGVyIG1lY2hhbmlzbSBvZiB3aGljaCBJIGFtIG5vdCBhd2FyZS4gIEkgd291bGQgYXBwcmVj aWF0ZSB0aGUNCj4+IGluc2lnaHRzIG9mIHRob3NlIG9mIHlvdSB3aG8gaGF2ZSBtb3JlIGhpc3Rv cnkgYW5kIGV4cGVyaWVuY2Ugd2l0aCB0aGlzDQo+PiBhcmVhIG9mIHRoZSBjb2RlLg0KPiBZb3Ug YXJlIHJpZ2h0IGRlc2NyaWJpbmcgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbWVtb3J5IGNvcHkgb24g Zm9yay4gQnV0IEkNCj4gY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBwYXJ0cyBvZiBpdCwgZXhhY3Rs eSwgYXJlIHByb2JsZW1hdGljLCBmcm9tIHlvdXINCj4gZGVzY3JpcHRpb24uIEl0IGlzIG5lY2Vz c2FyeSBmb3IgeW91IHRvIHByb3ZpZGUgdGhlIHRlc3QgYW5kIHByb3ZpZGUNCj4gc29tZSBraW5k IG9mIHRoZSB0ZXN0IHRyYWNlIG9yIHRoZSBvdXRwdXQgd2hpY2ggaWxsdXN0cmF0ZXMgdGhlIGlz c3VlDQo+IHlvdSBmb3VuZC4NCj4NCj4gRG8geW91IG1lYW4gc29tZXRoaW5nIGxpa2UgdGhhdDoN Cj4gLSBhZnRlciBmb3JrDQo+IC0gdGhyZWFkIEEgd3JpdGVzIGludG8gdGhlIHBhZ2UsIGNhdXNp bmcgcGFnZSBmYXVsdCBhbmQgQ09XIGJlY2F1c2UgdGhlDQo+ICAgIGVudHJ5IGhhcyB3cml0ZSBw ZXJtaXNzaW9ucyByZW1vdmVkDQo+IC0gdGhyZWFkIEIgcmVhZHMgZnJvbSB0aGUgcGFnZSwgYW5k IHNpbmNlIGludmFsaWRhdGlvbiBJUEkgd2FzIG5vdCB5ZXQNCj4gICAgZGVsaXZlcmVkLCBpdCBy ZWFkcyBmcm9tIHRoZSBuZWVkLWNvcHkgcGFnZSwgZWZmZWN0aXZlbHkgc2VlaW5nIHRoZQ0KPiAg ICBvbGQgY29udGVudCwgYmVmb3JlIHRocmVhZCBBIHdyaXRlDQo+DQo+IEFuZCB5b3UgY2xhaW0g aXMgdGhhdCB5b3UgY2FuIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSBib3RoIHRocmVhZHMgQQ0K PiBhbmQgQiBvd25zIHRoZSBzYW1lIGxvY2sgYXJvdW5kIHRoZSB3cml0ZSBhbmQgcmVhZCA/ICBJ IGRvIG5vdCB1bmRlcnN0YW5kDQo+IHRoaXMsIHNpbmNlIGlmIHRocmVhZCBBIG93bnMgYSAodXNl cm1vZGUpIGxvY2ssIGl0IHByZXZlbnRzIHRocmVhZCBCIGZyb20NCj4gdGFraW5nIHRoZSBzYW1l IGxvY2sgdW50aWwgZmF1bHQgaXMgZnVsbHkgaGFuZGxlZCwgaW4gcGFydGljdWxhciwgdGhlIElQ SQ0KPiBpcyBkZWxpdmVyZWQuDQoNCkhlcmUgaXMgdGhlIHNlcXVlbmNlIG9mIGFjdGlvbnMgSSBh bSByZWZlcnJpbmcgdG8uICBUaGVyZSBpcyBvbmx5IG9uZSANCmxvY2ssIGFuZCBhbGwgdGhlIHdy aXRlcy9yZWFkcyBhcmUgb24gb25lIGxvZ2ljYWwgcGFnZS4NCg0KK1RoZSBwcm9jZXNzIGlzIGZv cmtlZCB0cmFuc2l0aW9uaW5nIGEgbWFwIGVudHJ5IHRvIENPVw0KK1RocmVhZCBBIHdyaXRlcyB0 byBhIHBhZ2Ugb24gdGhlIG1hcCBlbnRyeSwgZmF1bHRzLCB1cGRhdGVzIHRoZSBwbWFwIHRvIA0K d3JpdGFibGUgYXQgYSBuZXcgcGh5cyBhZGRyLCBhbmQgc3RhcnRzIFRMQiBpbnZhbGlkYXRpb25z Li4uDQorVGhyZWFkIEIgYWNxdWlyZXMgYSBsb2NrLCB3cml0ZXMgdG8gYSBsb2NhdGlvbiBvbiB0 aGUgbmV3IHBoeXMgYWRkciwgDQphbmQgcmVsZWFzZXMgdGhlIGxvY2sNCitUaHJlYWQgQyBhY3F1 aXJlcyB0aGUgbG9jaywgcmVhZHMgZnJvbSB0aGUgbG9jYXRpb24gb24gdGhlIG9sZCBwaHlzIGFk ZHIuLi4NCitUaHJlYWQgQSAuLi5jb250aW51ZXMgdGhlIFRMQiBpbnZhbGlkYXRpb25zIHdoaWNo IGFyZSBjb21wbGV0ZWQNCitUaHJlYWQgQyAuLi5yZWFkcyBmcm9tIHRoZSBsb2NhdGlvbiBvbiB0 aGUgbmV3IHBoeXMgYWRkciwgYW5kIHJlbGVhc2VzIA0KdGhlIGxvY2sNCg0KSW4gdGhpcyBleGFt cGxlIFRocmVhZCBCIGFuZCBDIFtsb2NrLCB1c2UgYW5kIHVubG9ja10gcHJvcGVybHkgYW5kIA0K bmVpdGhlciBvd24gdGhlIGxvY2sgYXQgdGhlIHNhbWUgdGltZS4gIFRocmVhZCBBIHdhcyB3cml0 aW5nIHNvbWV3aGVyZSANCmVsc2Ugb24gdGhlIHBhZ2UgYW5kIHNvIG5ldmVyIGhhZC9uZWVkZWQg dGhlIGxvY2suICBUaHJlYWQgQiBzZWVzIGEgDQpsb2NhdGlvbiB0aGF0IGlzIG9ubHkgZXZlciBy ZWFkfG1vZGlmaWVkIHVuZGVyIGEgbG9jayBjaGFuZ2UgYmVuZWF0aCBpdCANCndoaWxlIGl0IGlz IHRoZSBsb2NrIG93bmVyLg0KDQpJIHdpbGwgZ2V0IGEgdGVzdCBwYXRjaCB0b2dldGhlciBhbmQg bWFrZSBpdCBhdmFpbGFibGUgYXMgc29vbiBhcyBJIGNhbi4NCg== From owner-freebsd-hackers@freebsd.org Sat Feb 10 22:40:33 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 09B0EF02F09 for ; Sat, 10 Feb 2018 22:40:33 +0000 (UTC) (envelope-from eugen@grosbein.net) Received: from hz.grosbein.net (hz.grosbein.net [78.47.246.247]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "hz.grosbein.net", Issuer "hz.grosbein.net" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 9236076719; Sat, 10 Feb 2018 22:40:32 +0000 (UTC) (envelope-from eugen@grosbein.net) Received: from eg.sd.rdtc.ru (root@eg.sd.rdtc.ru [62.231.161.221] (may be forged)) by hz.grosbein.net (8.15.2/8.15.2) with ESMTPS id w1AMeKTu009585 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 10 Feb 2018 23:40:21 +0100 (CET) (envelope-from eugen@grosbein.net) X-Envelope-From: eugen@grosbein.net X-Envelope-To: emss@free.fr Received: from [10.58.0.4] ([10.58.0.4]) by eg.sd.rdtc.ru (8.15.2/8.15.2) with ESMTPS id w1AMe9t0097260 (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NOT); Sun, 11 Feb 2018 05:40:09 +0700 (+07) (envelope-from eugen@grosbein.net) Subject: Re: Regression between 10 & 11, Freeswitch hangs when exiting To: Eric Masson , freebsd-hackers@FreeBSD.org, kib@freebsd.org References: <86tvuor6bt.fsf@newsrv.interne.associated-bears.org> From: Eugene Grosbein Message-ID: <5A7F74C7.9020609@grosbein.net> Date: Sun, 11 Feb 2018 05:40:07 +0700 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <86tvuor6bt.fsf@newsrv.interne.associated-bears.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=3.9 required=5.0 tests=BAYES_00, LOCAL_FROM, RDNS_NONE, URIBL_BLACK autolearn=no autolearn_force=no version=3.4.1 X-Spam-Report: * 1.7 URIBL_BLACK Contains an URL listed in the URIBL blacklist * [URIs: freewitch.org] * -2.3 BAYES_00 BODY: Bayes spam probability is 0 to 1% * [score: 0.0000] * 2.6 LOCAL_FROM From my domains * 1.9 RDNS_NONE Delivered to internal network by a host with no rDNS X-Spam-Level: *** X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on hz.grosbein.net X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 22:40:33 -0000 11.02.2018 2:29, Eric Masson пишет: > Hi, > > Freeswitch, a multiprotocol softswitch (http://freewitch.org) runs on > FreeBSD and a port is available (net/freeswitch/) > > Freeswitch runs fine on any 10.x installation, issueing the shutdown > command from cli makes the application exit cleanly. > > On any 11.x installation, issueing the shutdown command from cli makes > the application hang. > > FreeBSD version is : > FreeBSD newsrv.interne.associated-bears.org 11.1-STABLE FreeBSD 11.1-STABLE #0 r327876M: Sat Jan 13 16:19:26 CET 2018 emss@newsrv.interne.associated-bears.org:/usr/obj/usr/src/sys/SE7525GP2 amd64 > > Generic or custom kernel behave the same. > > On Freeswitch side, 1.6.19 (net/freeswitch) and also git branches master > & v1.6 show the same issue. > > I've reproduced the issue on the latest v1.6, the backtrace of stuck > process shows the following : > #0 0x00000008030ea91c in _umtx_op_err () from /lib/libthr.so.3 > #1 0x00000008030e6f97 in join_common (pthread=0x807ed7700, thread_return=0x7fffffffb658, abstime=0x0) at /usr/src/lib/libthr/thread/thr_join.c:125 > #2 0x0000000800f01421 in apr_thread_join (retval=0x7fffffffb68c, thd=0x8059e9658) at threadproc/unix/thread.c:234 > #3 0x0000000800cd889e in do_shutdown (module=0x2, shutdown=, unload=SWITCH_TRUE, fail_if_busy=(unknown: 1523667750), err=) at src/switch_loadable_module.c:2031 > #4 0x0000000800cdb84a in switch_loadable_module_shutdown () at src/switch_loadable_module.c:2083 > #5 0x0000000800c9d92c in switch_core_destroy () at src/switch_core.c:2940 > #6 0x0000000000403b2b in main (argc=, argv=0x7fffffffe988) at src/switch.c:1210 > > It seems the issue lies in thread handling. > > I've attached : > - the output of a Freeswitch related script used to gather relevant > information. > - source files showing in bt > > Thank for help. See also: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225584 What CPU do you use? From owner-freebsd-hackers@freebsd.org Sat Feb 10 22:56:23 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 34A67F042C7 for ; Sat, 10 Feb 2018 22:56:23 +0000 (UTC) (envelope-from kib@freebsd.org) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B052F7742C; Sat, 10 Feb 2018 22:56:22 +0000 (UTC) (envelope-from kib@freebsd.org) Received: from tom.home (kib@localhost [127.0.0.1]) by kib.kiev.ua (8.15.2/8.15.2) with ESMTPS id w1AMu8fa087483 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sun, 11 Feb 2018 00:56:11 +0200 (EET) (envelope-from kib@freebsd.org) DKIM-Filter: OpenDKIM Filter v2.10.3 kib.kiev.ua w1AMu8fa087483 Received: (from kostik@localhost) by tom.home (8.15.2/8.15.2/Submit) id w1AMu83p087482; Sun, 11 Feb 2018 00:56:08 +0200 (EET) (envelope-from kib@freebsd.org) X-Authentication-Warning: tom.home: kostik set sender to kib@freebsd.org using -f Date: Sun, 11 Feb 2018 00:56:08 +0200 From: Konstantin Belousov To: Elliott.Rabe@dell.com Cc: alc@freebsd.org, markj@freebsd.org, freebsd-hackers@freebsd.org, Eric.Van.Gyzen@dell.com Subject: Re: Stale memory during post fork cow pmap update Message-ID: <20180210225608.GM33564@kib.kiev.ua> References: <5A7E7F2B.80900@dell.com> <20180210111848.GL33564@kib.kiev.ua> <5A7F6A7C.80607@dell.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5A7F6A7C.80607@dell.com> User-Agent: Mutt/1.9.3 (2018-01-21) X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on tom.home X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 22:56:23 -0000 On Sat, Feb 10, 2018 at 09:56:20PM +0000, Elliott.Rabe@dell.com wrote: > On 02/10/2018 05:18 AM, Konstantin Belousov wrote: > > On Sat, Feb 10, 2018 at 05:12:11AM +0000, Elliott.Rabe@dell.com wrote: > >> Greetings- > >> > >> I've been hunting for the root cause of elusive, slight memory > >> corruptions in a large, complex process that manages many threads. All > >> failures and experimentation thus far has been on x86_64 architecture > >> machines, and pmap_pcid is not in use. > >> > >> I believe I have stumbled into a very unlikely race condition in the way > >> the vm code updates the pmap during write fault processing following a > >> fork of the process. In this situation, when the process is forked, > >> appropriate vm entries are marked copy-on-write. One such entry > >> allocated by static process initialization is frequently used by many > >> threads in the process. This makes it a prime candidate to write-fault > >> shortly after a fork system call is made. In this scenario, such a > >> fault normally burdens the faulting thread with the task of allocating a > >> new page, entering the page as part of managed memory, and updating the > >> pmap with the new physical address and the change to writeable status. > >> This action is followed with an invalidation of the TLB on the current > >> CPU, and in this case is also followed by IPI_INVLPG IPIs to do the same > >> on other CPUs (there are often many active threads in this process). > >> Before this remote TLB invalidation has completed, other CPUs are free > >> to act on either the old OR new page characteristics. If other threads > >> are alive and using contents of the faulting page on other CPUs, bad > >> things can occur. > >> > >> In one simplified and somewhat contrived example, one thread attempts to > >> write to a location on the faulting page under the protection of a lock > >> while another thread attempts to read from the same location twice in > >> succession under the protection of the same lock. If both the writing > >> thread and reading thread are running on different CPUs, and if the > >> write is directed to the new physical address, the reads may come from > >> different physical addresses if a TLB invalidation occurs between them. > >> This seemingly violates the guarantees provided by the locking > >> primitives and can result in subtle memory corruption symptoms. > >> > >> It took me quite a while to chase these symptoms from user-space down > >> into the operating system, and even longer to end up with a stand-alone > >> test fixture able to reproduce the situation described above on demand. > >> If I alter the kernel code to perform a two-stage update of the pmap > >> entry, the observed corruption symptoms disappear. This two-stage > >> mechanism updates and invalidates the new physical address in a > >> read-only state first, and then does a second pmap update and > >> invalidation to change the status to writeable. The intended effect was > >> to cause any other threads writing to the faulting page to become > >> obstructed until the earlier fault is complete, thus eliminating the > >> possibility of the physical pages having different contents until the > >> new physical address was fully visible. This is goofy, and from an > >> efficiency standpoint it is obviously undesirable, but it was the first > >> thing that came to mind, and it seems to be working fine. > >> > >> I am not terribly familliar with the higher level design here, so it is > >> unclear to me if this problem is simply a very unlikely race condition > >> that hasn't yet been diagnosed or if this is instead the breakdown of > >> some other mechanism of which I am not aware. I would appreciate the > >> insights of those of you who have more history and experience with this > >> area of the code. > > You are right describing the operation of the memory copy on fork. But I > > cannot understand what parts of it, exactly, are problematic, from your > > description. It is necessary for you to provide the test and provide > > some kind of the test trace or the output which illustrates the issue > > you found. > > > > Do you mean something like that: > > - after fork > > - thread A writes into the page, causing page fault and COW because the > > entry has write permissions removed > > - thread B reads from the page, and since invalidation IPI was not yet > > delivered, it reads from the need-copy page, effectively seeing the > > old content, before thread A write > > > > And you claim is that you can create a situation where both threads A > > and B owns the same lock around the write and read ? I do not understand > > this, since if thread A owns a (usermode) lock, it prevents thread B from > > taking the same lock until fault is fully handled, in particular, the IPI > > is delivered. > > Here is the sequence of actions I am referring to. There is only one > lock, and all the writes/reads are on one logical page. > > +The process is forked transitioning a map entry to COW > +Thread A writes to a page on the map entry, faults, updates the pmap to > writable at a new phys addr, and starts TLB invalidations... > +Thread B acquires a lock, writes to a location on the new phys addr, > and releases the lock > +Thread C acquires the lock, reads from the location on the old phys addr... > +Thread A ...continues the TLB invalidations which are completed > +Thread C ...reads from the location on the new phys addr, and releases > the lock > > In this example Thread B and C [lock, use and unlock] properly and > neither own the lock at the same time. Thread A was writing somewhere > else on the page and so never had/needed the lock. Thread B sees a > location that is only ever read|modified under a lock change beneath it > while it is the lock owner. I believe you mean 'Thread C' in the last sentence. > > I will get a test patch together and make it available as soon as I can. Please. So I agree that doing two-stage COW, with the first stage copying page but keeping it read-only, is the right solution. Below is my take. During the smoke boot, I noted that there is somewhat related issue in reevaluation of the map entry permissions. diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 83e12a588ee..149a15f1d9d 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -1135,6 +1157,10 @@ RetryFault:; */ pmap_copy_page(fs.m, fs.first_m); fs.first_m->valid = VM_PAGE_BITS_ALL; + if ((fault_flags & VM_FAULT_WIRE) == 0) { + prot &= ~VM_PROT_WRITE; + fault_type &= ~VM_PROT_WRITE; + } if (wired && (fault_flags & VM_FAULT_WIRE) == 0) { vm_page_lock(fs.first_m); @@ -1219,6 +1245,12 @@ RetryFault:; * write-enabled after all. */ prot &= retry_prot; + fault_type &= retry_prot; + if (prot == 0) { + release_page(&fs); + unlock_and_deallocate(&fs); + goto RetryFault; + } } } From owner-freebsd-hackers@freebsd.org Sat Feb 10 23:14:40 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id EBF8CF05781 for ; Sat, 10 Feb 2018 23:14:39 +0000 (UTC) (envelope-from sbruno@freebsd.org) Received: from mail.ignoranthack.me (ignoranthack.me [199.102.79.106]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 9197F7815E for ; Sat, 10 Feb 2018 23:14:39 +0000 (UTC) (envelope-from sbruno@freebsd.org) Received: from [192.168.0.6] (67-0-236-88.albq.qwest.net [67.0.236.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: sbruno@ignoranthack.me) by mail.ignoranthack.me (Postfix) with ESMTPSA id 562901928F3; Sat, 10 Feb 2018 14:59:46 +0000 (UTC) Subject: Re: New microcode updating tool for FreeBSD To: Stefan Blachmann , freebsd-hackers@freebsd.org References: From: Sean Bruno Message-ID: <4db65b52-5a82-15ff-1629-0371a619f89b@freebsd.org> Date: Sat, 10 Feb 2018 16:14:28 -0700 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="nh4sZmjakbmu9BQdB3HUjNLCrov85DWwn" X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 23:14:40 -0000 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --nh4sZmjakbmu9BQdB3HUjNLCrov85DWwn Content-Type: multipart/mixed; boundary="ZH9gQCk6l7BDgYopaVxCihxlxxkRboANB"; protected-headers="v1" From: Sean Bruno To: Stefan Blachmann , freebsd-hackers@freebsd.org Message-ID: <4db65b52-5a82-15ff-1629-0371a619f89b@freebsd.org> Subject: Re: New microcode updating tool for FreeBSD References: In-Reply-To: --ZH9gQCk6l7BDgYopaVxCihxlxxkRboANB Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: quoted-printable On 02/08/18 23:15, Stefan Blachmann wrote: > Hello, >=20 > I would like to introduce you to my new microcode updater for FreeBSD. >=20 > As the old devcpu-data port has serious bug and does not support the > new multi-blobbed Intel microcode format, I have made this new tool. devcpu-data is a bunch of microcode files and a parser for the intel legacy microcode.dat file. Do you mean cpucontrol in the base system has a bug? I found reference to this in the code at the github download link pointing at a patchless comment-type bugzilla entry here: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D192487 Do you feel like trying to come up with a patchset or modification to the existing usr.sbin/cpucontrol (which appears to be the basis of the code in this github repository)? We could start using the Phabricator review system to try and get your work into a form that would be accepted into the base system. sean --ZH9gQCk6l7BDgYopaVxCihxlxxkRboANB-- --nh4sZmjakbmu9BQdB3HUjNLCrov85DWwn Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- iQGTBAEBCgB9FiEE6MTp+IA1BOHj9Lo0veT1/om1/LYFAlp/fNdfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEU4 QzRFOUY4ODAzNTA0RTFFM0Y0QkEzNEJERTRGNUZFODlCNUZDQjYACgkQveT1/om1 /LaSGQgAxvWgnwr3CHPlFeV037yRlgc8nT1LMRZBGRB+Shet4PblzNAEk0Kf7GEV OwXbwiO4JBINzWJSZR2eFhtnzH/TNInPk4A7rZ+mb5DqKSp9UWW/YsmQXq1sF4c2 n34jF9cKs6TVnbEpMkHOtOYbrGAA1mxOSyQQTRG5WSwJbzeOfqYdc17rOlwdyT/u 2iKOOXITiRM3j/OIdddMpwHOOM3RxTiJHn5GnWwBgSJFRsm4ByFCBWXsT8ersupr jCKlos5lFhsVyv1CosO76fsQcMOHIxvjWfn82ExkHa007eCywojBeoNwOs0Y5JeM eu7TUx3XqCBbsXvN6ngCg84UzOcumQ== =X14b -----END PGP SIGNATURE----- --nh4sZmjakbmu9BQdB3HUjNLCrov85DWwn-- From owner-freebsd-hackers@freebsd.org Sat Feb 10 23:41:00 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 30C9CF0757F for ; Sat, 10 Feb 2018 23:41:00 +0000 (UTC) (envelope-from emss.mail@gmail.com) Received: from mail-wm0-x241.google.com (mail-wm0-x241.google.com [IPv6:2a00:1450:400c:c09::241]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 96B7679290; Sat, 10 Feb 2018 23:40:59 +0000 (UTC) (envelope-from emss.mail@gmail.com) Received: by mail-wm0-x241.google.com with SMTP id b21so3677118wme.4; Sat, 10 Feb 2018 15:40:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:in-reply-to:references:user-agent:date :message-id:mime-version:content-transfer-encoding; bh=MthvP61Sy9/gA+hdsc1w6hsRPhml3pBQbNfvtxgxBdY=; b=U+UiGDnMuw8x8a1xPRvH60Ye3FwYQi2NsmWwF2sf+VDTIo0Pyv2YyACeYnLL8XHzXh hkG45tyeYkmU2HPs/HWx0wpsSeUGDzpIbE2uQKMBLZNT6+i+X1/WpqCreRH6mWCb3teK hq8LfzeBG8gjVh75IUVW6uJVo2m7TE8FoM3g80CD3Sc8wyfUUbeu6aVcloOEYTPdAa+X muLhR+9eU24Kb8reo6P4DdUzqzXM7W/T+X7zUsm3SKhLISj67cMRuknRAtGpd1bfPhez QMz0/ONKcVUNDUowHnKM7Rl0+5glN71NbTyxJE6kyxPQ/DfnUPeDG0VZFBi84sUhIKXE HnpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:in-reply-to:references :user-agent:date:message-id:mime-version:content-transfer-encoding; bh=MthvP61Sy9/gA+hdsc1w6hsRPhml3pBQbNfvtxgxBdY=; b=rqm3zNu3BWZGhq/aF2y1qaTKOr+weA9kCTjS7LUShaqVNEH33aAfQIMwDkU3lutf7t x20vm76Hyeenmx4FaUy2IfQGySZ6XHnZy0qKvNscaaFS6ZEUbVauz8JtPLolyYTfFxgh m3jYFK6/SoevN7Cg24H8XKzc/oiK586wSWRIQcFdOdnl9kCgiFB6KkDwz13F09+9nyI6 R66BvSiBh1JLzxtdO6yeSOYfIc2z1owCP1h2OjWKVTXOCaP4OvkGwb/5wowgoFOCTjzu S3bekdV5qHHeLkb/VjHWjoitkCmHAUGBfifIib3LjEXBqAlUbbRkciox2FzVYKwdEd20 gn0A== X-Gm-Message-State: APf1xPD7D0iYdEE3cz9LJBtRHw2r00xt19Nm2Yl3bFJHLqrdTAqhsjH5 M7FtwZu6s8wgOx2q6yF74mGAxg== X-Google-Smtp-Source: AH8x224byUn/i+QTJllGOQnHj7hn8Q6KLUOXh9jHFltD173TmRt8a1JFUC9mdX4RldEhdfXd6+oW0w== X-Received: by 10.28.151.70 with SMTP id z67mr130049wmd.13.1518306058361; Sat, 10 Feb 2018 15:40:58 -0800 (PST) Received: from srvbsdfenssv.interne.associated-bears.org (LStLambert-658-1-110-48.w217-128.abo.wanadoo.fr. [217.128.200.48]) by smtp.gmail.com with ESMTPSA id 77sm4071617wmt.37.2018.02.10.15.40.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 10 Feb 2018 15:40:57 -0800 (PST) Sender: Eric Masson Received: from newsrv.interne.associated-bears.org (localhost [127.0.0.1]) by srvbsdfenssv.interne.associated-bears.org (Postfix) with ESMTP id 8557D4F07; Sun, 11 Feb 2018 00:40:56 +0100 (CET) X-Virus-Scanned: amavisd-new at interne.associated-bears.org Received: from srvbsdfenssv.interne.associated-bears.org ([127.0.0.1]) by newsrv.interne.associated-bears.org (newsrv.interne.associated-bears.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YxCYx8plqrtD; Sun, 11 Feb 2018 00:40:54 +0100 (CET) Received: by srvbsdfenssv.interne.associated-bears.org (Postfix, from userid 1001) id A34E34F01; Sun, 11 Feb 2018 00:40:54 +0100 (CET) From: Eric Masson To: Eugene Grosbein Cc: freebsd-hackers@FreeBSD.org, kib@freebsd.org Subject: Re: Regression between 10 & 11, Freeswitch hangs when exiting In-Reply-To: <5A7F74C7.9020609@grosbein.net> (Eugene Grosbein's message of "Sun, 11 Feb 2018 05:40:07 +0700") References: <86tvuor6bt.fsf@newsrv.interne.associated-bears.org> <5A7F74C7.9020609@grosbein.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (berkeley-unix) X-Operating-System: FreeBSD 11.1-STABLE amd64 Date: Sun, 11 Feb 2018 00:40:54 +0100 Message-ID: <86lgg0qupl.fsf@newsrv.interne.associated-bears.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 23:41:00 -0000 Eugene Grosbein writes: Hi Eugene, > See also: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225584 I'll check. > What CPU do you use? Older ones... Intel SE-7525GP2 fitted with 2 Xeons Type: Central Processor Family: Xeon Manufacturer: Intel ID: 4A 0F 00 00 FF FB EB BF Signature: Type 0, Family 15, Model 4, Stepping 10 Version: Intel(R) Xeon(TM) CPU 3.60GHz Voltage: 1.3 V External Clock: 200 MHz Max Speed: 3600 MHz Current Speed: 3600 MHz Regards Éric Masson