<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "http://bugs.gentoo.org/bugzilla.dtd">

<bugzilla version="2.22.7"
          urlbase="http://bugs.gentoo.org/"
          maintainer="bugzilla@gentoo.org"
>

    <bug>
          <bug_id>180266</bug_id>
          
          <creation_ts>2007-05-29 20:06 0000</creation_ts>
          <short_desc>net-analyzer/net-snmp-5.4.1 - Memory leak on x86 and x86_64 (broken by gentoo patch)</short_desc>
          <delta_ts>2007-12-31 19:31:12 0000</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>Gentoo Linux</product>
          <component>Applications</component>
          <version>unspecified</version>
          <rep_platform>All</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          <bug_file_loc>http://gentoo-portage.com/net-analyzer/net-snmp</bug_file_loc>
          
          
          <priority>P2</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <votes>5</votes>
          <everconfirmed>1</everconfirmed>
          <reporter>doug.manley@gmail.com</reporter>
          <assigned_to>netmon@gentoo.org</assigned_to>
          

      

      
          <long_desc isprivate="0">
            <who>doug.manley@gmail.com</who>
            <bug_when>2007-05-29 20:06:02 0000</bug_when>
            <thetext>Hey guys; I wasn&apos;t sure whom to contact about this. In the stable 5.4 (tested on an &quot;emerge-webrsync&quot; on 2007.05.07) release of net-snmp, there is a bug where some memory from &quot;netsnmp_udp_transport&quot; is not freed.

net-snmp claims to have fixed this bug in a current build. Can the package be updated or at least marked as unstable?

(Valgrind example):
==23482== 20 bytes in 1 blocks are definitely lost in loss record 5 of 16
==23482== at 0x4A1FB80: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
==23482== by 0x4DEFEEA: netsnmp_udp_transport (in /usr/lib64/libnetsnmp.so.15.0.0)
==23482== by 0x4DF03E9: netsnmp_udp_create_tstring (in /usr/lib64/libnetsnmp.so.15.0.0)
==23482== by 0x4DED1C4: netsnmp_tdomain_transport_full (in /usr/lib64/libnetsnmp.so.15.0.0)
==23482== by 0x4DCDFA6: snmp_sess_open (in /usr/lib64/libnetsnmp.so.15.0.0)

From this site:
www.mail-archive.com/net-snmp-coders@lists.sourceforge.net/msg09641.html
----
This is a bug. It is already fixed in revision 15683.

/MF
----

Thanks,
Doug


Reproducible: Always

Steps to Reproduce:
1.Create an SNMP session.
2.Do an snmpget on, say, &quot;sysDescr.0&quot;.
3.See what valgrind says.

Actual Results:  

==23482== 20 bytes in 1 blocks are definitely lost in loss record 5 of 16
==23482== at 0x4A1FB80: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
==23482== by 0x4DEFEEA: netsnmp_udp_transport (in /usr/lib64/libnetsnmp.so.15.0.0)
==23482== by 0x4DF03E9: netsnmp_udp_create_tstring (in /usr/lib64/libnetsnmp.so.15.0.0)
==23482== by 0x4DED1C4: netsnmp_tdomain_transport_full (in /usr/lib64/libnetsnmp.so.15.0.0)
==23482== by 0x4DCDFA6: snmp_sess_open (in /usr/lib64/libnetsnmp.so.15.0.0)

Expected Results:  
==23482== 0 bytes lost

&quot;MF&quot; says that net-snmp has already fixed it:
&quot;This is a bug. It is already fixed in revision 15683.&quot;

Is this revision being used by portage?  If not, can it be really soon?</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>jokey@gentoo.org</who>
            <bug_when>2007-09-06 08:08:10 0000</bug_when>
            <thetext>Please check again with 5.4.1 currently in ~arch
</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>doug.manley@gmail.com</who>
            <bug_when>2007-11-12 20:36:04 0000</bug_when>
            <thetext>(In reply to comment #1)
&gt; Please check again with 5.4.1 currently in ~arch
&gt; 

No luck.  I compiled &quot;net-analyzer/net-snmp-5.4.1-r1&quot; with &quot;~amd64&quot; to no avail.  It still leaks.


emerge -pv net-snmp
[ebuild   R   ] net-analyzer/net-snmp-5.4.1-r1  USE=&quot;diskio ipv6 perl python ssl tcpd -X -doc -elf -lm_sensors -mfd-rewrites -minimal -rpm (-selinux) -sendmail -smux&quot; 0 kB


uname -a
Linux peer1-slave 2.6.16-gentoo-r7 #2 SMP Wed Jun 7 02:24:56 UTC 2006 x86_64 AMD Athlon(tm) 64 Processor 3200+ AuthenticAMD GNU/Linux


Here is the valgrind output:
==1924== 462 bytes in 44 blocks are definitely lost in loss record 5 of 6
==1924==    at 0x4A1EDA0: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
==1924==    by 0x50E30A1: strdup (in /lib64/libc-2.5.so)
==1924==    by 0x4DFD028: (within /usr/lib64/libnetsnmp.so.15.1.0)
==1924==    by 0x4DFEA33: netsnmp_udp_transport (in /usr/lib64/libnetsnmp.so.15.1.0)
==1924==    by 0x4DFFA4A: netsnmp_udp_create_tstring (in /usr/lib64/libnetsnmp.so.15.1.0)
==1924==    by 0x4DF8D09: netsnmp_tdomain_transport_full (in /usr/lib64/libnetsnmp.so.15.1.0)
==1924==    by 0x4DD2A05: snmp_sess_open (in /usr/lib64/libnetsnmp.so.15.1.0)
==1924==    by 0x4F69194: snmpOpen (in /usr/local/lib64/libsevonebase.so)
==1924==    by 0x4F6938F: snmpOpenByDevId (in /usr/local/lib64/libsevonebase.so)
==1924==    by 0x401111: nPoll (nPoll.c:118)
==1924==    by 0x402535: main (nPoll.c:739)
</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>doug.manley@gmail.com</who>
            <bug_when>2007-11-13 15:40:06 0000</bug_when>
            <thetext>I did some MD5-checking on the &quot;gz&quot; files from portage and from net-snmp, and they are identical for &quot;5.4.1&quot;.  I built 5.4.1 separately, and it removed the issue.  I am emerging net-snmp again (I&apos;ve done this at least three times now) to see if there&apos;s something that I&apos;m missing.

Could there possibly be a USE flag that is the problem?</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>doug.manley@gmail.com</who>
            <bug_when>2007-11-13 15:49:14 0000</bug_when>
            <thetext>All right.  It seems to work perfectly fine now.  I have no idea what happened (perhaps I had a total lapse of sanity).

This seems fine.

However, there are some errors:
==25535== ERROR SUMMARY: 5 errors from 3 contexts (suppressed: 5 from 1)
==25535==
==25535== 1 errors in context 1 of 3:
==25535== Syscall param ���������������������������������������� points to uninitialised byte(s)
==25535==    at 0x512C500: sendmsg (in /lib64/libc-2.5.so)
==25535==    by 0x4DF922E: netsnmp_udp_send (snmpUDPDomain.c:180)
==25535==    by 0x4DD197C: snmp_sess_async_send (snmp_api.c:4892)
==25535==    by 0x4DB1349: snmp_sess_synch_response (snmp_client.c:1078)
==25535==    by 0x4F644D4: snmpGetMany (in /usr/local/lib64/libsevonebase.so)
==25535==    by 0x4019D6: nPoll (nPoll.c:426)
==25535==    by 0x402535: main (nPoll.c:740)
==25535==  Address 0x7FEFFDF58 is on thread 1&apos;s stack
==25535==
==25535== 2 errors in context 2 of 3:
==25535== Invalid read of size 1
==25535==    at 0x4DE56F9: read_config_files_in_path (read_config.c:1127)
==25535==    by 0x4DE5C86: read_config_files (read_config.c:1199)
==25535==    by 0x4DE5DED: read_configs (read_config.c:864)
==25535==    by 0x4024E1: main (nPoll.c:731)
==25535==  Address 0x5D66292 is 0 bytes after a block of size 74 alloc&apos;d
==25535==    at 0x4A1EDA0: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
==25535==    by 0x50DE0A1: strdup (in /lib64/libc-2.5.so)
==25535==    by 0x4DE5649: read_config_files_in_path (read_config.c:1047)
==25535==    by 0x4DE5C86: read_config_files (read_config.c:1199)
==25535==    by 0x4DE5DED: read_configs (read_config.c:864)
==25535==    by 0x4024E1: main (nPoll.c:731)
==25535==
==25535== 2 errors in context 3 of 3:
==25535== Invalid read of size 1
==25535==    at 0x4DE56F9: read_config_files_in_path (read_config.c:1127)
==25535==    by 0x4DE5C86: read_config_files (read_config.c:1199)
==25535==    by 0x4DE5CE4: read_premib_configs (read_config.c:893)
==25535==    by 0x4DC7814: init_snmp (snmp_api.c:836)
==25535==    by 0x4024E1: main (nPoll.c:731)
==25535==  Address 0x5D4151A is 0 bytes after a block of size 74 alloc&apos;d
==25535==    at 0x4A1EDA0: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
==25535==    by 0x50DE0A1: strdup (in /lib64/libc-2.5.so)
==25535==    by 0x4DE5649: read_config_files_in_path (read_config.c:1047)
==25535==    by 0x4DE5C86: read_config_files (read_config.c:1199)
==25535==    by 0x4DE5CE4: read_premib_configs (read_config.c:893)
==25535==    by 0x4DC7814: init_snmp (snmp_api.c:836)
==25535==    by 0x4024E1: main (nPoll.c:731)
</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>doug.manley@gmail.com</who>
            <bug_when>2007-11-20 17:24:19 0000</bug_when>
            <thetext>Hi guys.

All right, we did some hardcore tests (finally), and we have the results.  There IS still a memory leak in net-snmp 5.4.1-r1, and we know where and why and how.

Basically, the net-snmp 5.4.1 distribution is perfectly fine.  However, the patch that gentoo installs for the &quot;clientaddr&quot; fix is what creates the leak.

The patch provides some better debug output in one of the internal functions (among other things).  What it also does is a &quot;strdup&quot; in an &quot;sprintf&quot; command in the variables section, which is very, very bad (as there is now no pointer to the address that &quot;strdup&quot; put its output in--so it can&apos;t be &quot;free&quot;d).

What&apos;s really strange is that there is a comment about &quot;strdup&quot; being very important.

File: snmpUDPDomain.c
Patch file: net-snmp-5.4.1-clientaddr-fix.patch
Original:
static char *
netsnmp_udp_fmtaddr(netsnmp_transport *t, void *data, int len)
{
    netsnmp_udp_addr_pair *addr_pair = NULL;

    if (data != NULL &amp;&amp; len == sizeof(netsnmp_udp_addr_pair)) {
    addr_pair = (netsnmp_udp_addr_pair *) data;
    } else if (t != NULL &amp;&amp; t-&gt;data != NULL) {
    addr_pair = (netsnmp_udp_addr_pair *) t-&gt;data;
    }

    if (addr_pair == NULL) {
        return strdup(&quot;UDP: unknown&quot;);
    } else {
        struct sockaddr_in *to = NULL;
    char tmp[64];
        to = (struct sockaddr_in *) &amp;(addr_pair-&gt;remote_addr);
        if (to == NULL) {
            return strdup(&quot;UDP: unknown&quot;);
        }

        sprintf(tmp, &quot;UDP: [%s]:%hu&quot;,
                inet_ntoa(to-&gt;sin_addr), ntohs(to-&gt;sin_port));
        return strdup(tmp);
    }
}
Patched:
static char *
netsnmp_udp_fmtaddr(netsnmp_transport *t, void *data, int len)
{
    netsnmp_udp_addr_pair *addr_pair = NULL;

    if (data != NULL &amp;&amp; len == sizeof(netsnmp_udp_addr_pair)) {
    addr_pair = (netsnmp_udp_addr_pair *) data;
    } else if (t != NULL &amp;&amp; t-&gt;data != NULL) {
    addr_pair = (netsnmp_udp_addr_pair *) t-&gt;data;
    }

    if (addr_pair == NULL) {
        return strdup(&quot;UDP: unknown&quot;);
    } else {
        struct sockaddr_in *to = NULL;
    char tmp[64];
        to = (struct sockaddr_in *) &amp;(addr_pair-&gt;remote_addr);
        /* Using strdup on the output of inet_ntoa is important! */
        if (to == NULL) {
            sprintf(tmp, &quot;UDP: [%s]-&gt;unknown&quot;,
                    strdup(inet_ntoa(addr_pair-&gt;local_addr)));
        } else {
            sprintf(tmp, &quot;UDP: [%s]-&gt;[%s]:%hu&quot;,
                    strdup(inet_ntoa(addr_pair-&gt;local_addr)),
                    strdup(inet_ntoa(to-&gt;sin_addr)), ntohs(to-&gt;sin_port)); //&lt; This is line 113.
        }
        return strdup(tmp);
    }
}

Valgrind output:
==19221== 378 bytes in 36 blocks are definitely lost in loss record 7 of 8
==19221==    at 0x4A1EDA0: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
==19221==    by 0x50E30A1: strdup (in /lib64/libc-2.5.so)
==19221==    by 0x4DFD028: netsnmp_udp_fmtaddr (snmpUDPDomain.c:113)
==19221==    by 0x4DFD5CF: netsnmp_udp_send (snmpUDPDomain.c:263)
==19221==    by 0x4DD239C: snmp_sess_async_send (snmp_api.c:4892)
==19221==    by 0x4DB1D69: snmp_sess_synch_response (snmp_client.c:1078)
==19221==    by 0x4F694D4: snmpGetMany (in /usr/local/lib64/libsevonebase.so)
==19221==    by 0x4019D6: nPoll (nPoll.c:426)
==19221==    by 0x402535: main (nPoll.c:740)

=== Gentoo configuration ===
./configure --prefix=/usr --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --with-install-prefix=/var/tmp/portage/net-analyzer/net-snmp-5.4.1-r1/image/ --with-sys-location=Unknown --with-sys-contact=root@Unknown --with-default-snmp-version=3 --with-mib-modules=&apos;host ucd-snmp/dlmod ucd-snmp/diskio&apos; --with-logfile=/var/log/net-snmpd.log --with-persistent-directory=/var/lib/net-snmp --enable-ucd-snmp-compatibility --enable-shared --enable-as-needed --disable-mfd-rewrites --enable-embedded-perl --enable-ipv6 --disable-internal-md5 --with-openssl --with-libwrap --without-rpm --without-bzip2 --without-zlib --without-elf --with-python-modules --libdir=/usr/lib64 --build=x86_64-pc-linux-gnu
	* Leaks in snmp_sess_synch_response (strdup).

=== Doug 1 (gentoo with debugging) ===
./configure --prefix=/usr --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --with-install-prefix=/var/tmp/portage/net-analyzer/net-snmp-5.4.1-r1/image/ --with-sys-location=Unknown --with-sys-contact=root@Unknown --with-default-snmp-version=3 --with-mib-modules=&apos;host ucd-snmp/dlmod ucd-snmp/diskio&apos; --with-logfile=/var/log/net-snmpd.log --with-persistent-directory=/var/lib/net-snmp --enable-ucd-snmp-compatibility --enable-shared --enable-as-needed --disable-mfd-rewrites --enable-embedded-perl --enable-ipv6 --disable-internal-md5 --with-openssl --with-libwrap --without-rpm --without-bzip2 --without-zlib --without-elf --with-python-modules --libdir=/usr/lib64 --build=x86_64-pc-linux-gnu --enable-debugging
	* No leaks... (lots of errors).

=== Doug 2 (gentoo without prefix) ===
./configure --prefix=/usr --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --with-sys-location=Unknown --with-sys-contact=root@Unknown --with-default-snmp-version=3 --with-mib-modules=&apos;host ucd-snmp/dlmod ucd-snmp/diskio&apos; --with-logfile=/var/log/net-snmpd.log --with-persistent-directory=/var/lib/net-snmp --enable-ucd-snmp-compatibility --enable-shared --enable-as-needed --disable-mfd-rewrites --enable-embedded-perl --enable-ipv6 --disable-internal-md5 --with-openssl --with-libwrap --without-rpm --without-bzip2 --without-zlib --without-elf --with-python-modules --libdir=/usr/lib64 --build=x86_64-pc-linux-gnu --enable-debugging
	* No leaks... (lots of errors).

=== Doug 2 (gentoo without prefix) ===
./configure --prefix=/usr --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --with-sys-location=Unknown --with-sys-contact=root@Unknown --with-default-snmp-version=3 --with-mib-modules=&apos;host ucd-snmp/dlmod ucd-snmp/diskio&apos; --with-logfile=/var/log/net-snmpd.log --with-persistent-directory=/var/lib/net-snmp --enable-ucd-snmp-compatibility --enable-shared --enable-as-needed --disable-mfd-rewrites --enable-embedded-perl --enable-ipv6 --disable-internal-md5 --with-openssl --with-libwrap --without-rpm --without-bzip2 --without-zlib --without-elf --with-python-modules --libdir=/usr/lib64 --build=x86_64-pc-linux-gnu
	* No leaks... (lots of errors).

=== Doug 3 (gentoo without prefix with patch) ===
./configure --prefix=/usr --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --with-sys-location=Unknown --with-sys-contact=root@Unknown --with-default-snmp-version=3 --with-mib-modules=&apos;host ucd-snmp/dlmod ucd-snmp/diskio&apos; --with-logfile=/var/log/net-snmpd.log --with-persistent-directory=/var/lib/net-snmp --enable-ucd-snmp-compatibility --enable-shared --enable-as-needed --disable-mfd-rewrites --enable-embedded-perl --enable-ipv6 --disable-internal-md5 --with-openssl --with-libwrap --without-rpm --without-bzip2 --without-zlib --without-elf --with-python-modules --libdir=/usr/lib64 --build=x86_64-pc-linux-gnu
	* Leaks in snmp_sess_synch_response (strdup).

=== Doug 4 (gentoo without prefix with patch with debugging) ===
./configure --prefix=/usr --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --with-sys-location=Unknown --with-sys-contact=root@Unknown --with-default-snmp-version=3 --with-mib-modules=&apos;host ucd-snmp/dlmod ucd-snmp/diskio&apos; --with-logfile=/var/log/net-snmpd.log --with-persistent-directory=/var/lib/net-snmp --enable-ucd-snmp-compatibility --enable-shared --enable-as-needed --disable-mfd-rewrites --enable-embedded-perl --enable-ipv6 --disable-internal-md5 --with-openssl --with-libwrap --without-rpm --without-bzip2 --without-zlib --without-elf --with-python-modules --libdir=/usr/lib64 --build=x86_64-pc-linux-gnu --enable-debugging
	* Leaks in snmp_sess_synch_response (strdup).

</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>doug.manley@gmail.com</who>
            <bug_when>2007-11-20 18:00:22 0000</bug_when>
            <thetext>Created an attachment (id=136511)
This is my proposed patch.  It has the exact same functionality as the current one, but it does not leak.

This does not do unnecessary &quot;strdup&quot; operations, and it frees the ones that it does do.

If there is a reason for the &quot;strdup&quot; sprinkling all over the patch, it is not apparent.  &quot;strdup&quot; should only be necessary for preventing the buffer from being overwritten by two successive calls in the &quot;sprintf&quot;.</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>doug.manley@gmail.com</who>
            <bug_when>2007-11-20 18:01:06 0000</bug_when>
            <thetext>Created an attachment (id=136513)
This is the patched snmpUDPDomain.c file.

This is the patched snmpUDPDomain.c file.</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>pva@gentoo.org</who>
            <bug_when>2007-12-27 17:13:42 0000</bug_when>
            <thetext>Should be fixed in net-snmp-5.4.1-r2. I&apos;ve backport some further changes from upstream which fixes memory leaks. Please, reopen if it still leaks for you. Thank you very much for your investigation of the problem.</thetext>
          </long_desc>
          <long_desc isprivate="0">
            <who>doug.manley@gmail.com</who>
            <bug_when>2007-12-31 19:31:12 0000</bug_when>
            <thetext>This seems to do the trick; thanks.</thetext>
          </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>136511</attachid>
            <date>2007-11-20 18:00 0000</date>
            <desc>This is my proposed patch.  It has the exact same functionality as the current one, but it does not leak.</desc>
            <filename>net-snmp-5.4.1-clientaddr-fix.doug.patch</filename>
            <type>text/plain</type>
            <data encoding="base64">LS0tIHNubXBsaWIvc25tcFVEUERvbWFpbi5jLm9yaWdpbmFsCTIwMDctMTEtMjAgMTY6NDM6NTUu
MDAwMDAwMDAwICswMDAwCisrKyBzbm1wbGliL3NubXBVRFBEb21haW4uYwkyMDA3LTExLTIwIDE3
OjQzOjI5LjAwMDAwMDAwMCArMDAwMApAQCAtMTAzLDEyICsxMDMsMjYgQEAKICAgICAgICAgc3Ry
dWN0IHNvY2thZGRyX2luICp0byA9IE5VTEw7CiAJY2hhciB0bXBbNjRdOwogICAgICAgICB0byA9
IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihhZGRyX3BhaXItPnJlbW90ZV9hZGRyKTsKKyAgICAg
ICAgLyogVXNpbmcgc3RyZHVwIG9uIHRoZSBvdXRwdXQgb2YgaW5ldF9udG9hIGlzIGltcG9ydGFu
dCEgKi8KKyAgICAgICAgLyogImluZXRfbnRvYSIgdXNlcyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVk
IGJ1ZmZlciB0byBzdG9yZQorICAgICAgICAgICBpdHMgaW5mb3JtYXRpb24uICBUbyB1c2UgdHdv
IGluIGEgcm93LCB0aGUgZmlyc3QgbmVlZHMKKyAgICAgICAgICAgdG8gYmUgc2F2ZWQgc29tZXdo
ZXJlIGVsc2Ugc28gdGhhdCB0aGUgc2Vjb25kIGRvZXMgbm90CisgICAgICAgICAgIG92ZXJ3cml0
ZSBpdC4gIEhvd2V2ZXIsIGl0IGlzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0CisgICAgICAg
ICAgIGFsbCAic3RyZHVwIiBjYWxscyBNVVNUIGJlIGZyZWVkLiAqLwogICAgICAgICBpZiAodG8g
PT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIHN0cmR1cCgiVURQOiB1bmtub3duIik7Cisg
ICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlVEUDogWyVzXS0+dW5rbm93biIsCisgICAgICAgICAg
ICAgICAgICAgIGluZXRfbnRvYShhZGRyX3BhaXItPmxvY2FsX2FkZHIpKTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIC8qIFRoaXMgd2lsbCBzdG9yZSB0aGUgZmlyc3QgYWRkcmVzcyBm
cm9tIHN0cmR1cCBzbyB0aGF0IHRoZSBzZWNvbmQKKyAgICAgICAgICAgICAgIGNhbGwgd2lsbCBu
b3Qgb3ZlcndyaXRlIGl0LiAqLworICAgICAgICAgICAgY2hhciogbG9jYWxfYWRkcl9jb3B5ID0g
c3RyZHVwKCBpbmV0X250b2EoYWRkcl9wYWlyLT5sb2NhbF9hZGRyKSApOworICAgICAgICAgICAg
c3ByaW50Zih0bXAsICJVRFA6IFslc10tPlslc106JWh1IiwKKyAgICAgICAgICAgICAgICAgICAg
bG9jYWxfYWRkcl9jb3B5LAorICAgICAgICAgICAgICAgICAgICBpbmV0X250b2EodG8tPnNpbl9h
ZGRyKSwgbnRvaHModG8tPnNpbl9wb3J0KSk7CisgICAgICAgICAgICAvKiBSZW1lbWJlciwgd2Ug
bXVzdCBmcmVlIG91ciBjb3B5IG5vdy4gKi8KKyAgICAgICAgICAgIGZyZWUoIGxvY2FsX2FkZHJf
Y29weSApOwogICAgICAgICB9CiAKLSAgICAgICAgc3ByaW50Zih0bXAsICJVRFA6IFslc106JWh1
IiwKLSAgICAgICAgICAgICAgICBpbmV0X250b2EodG8tPnNpbl9hZGRyKSwgbnRvaHModG8tPnNp
bl9wb3J0KSk7CiAgICAgICAgIHJldHVybiBzdHJkdXAodG1wKTsKICAgICB9CiB9CkBAIC02NjYs
MTEgKzY4MCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIE5FVFNOTVBfRFNfTElCX0NMSUVOVF9BRERSKTsKICAgICAgICAgaWYgKGNsaWVudF9zb2Nr
ZXQpIHsKICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjbGllbnRfYWRkcjsKKyAgICAg
ICAgICAgIGludCByZXQ7CiAgICAgICAgICAgICBuZXRzbm1wX3NvY2thZGRyX2luMigmY2xpZW50
X2FkZHIsIGNsaWVudF9zb2NrZXQsIE5VTEwpOworICAgICAgICAgICAgYWRkcl9wYWlyLmxvY2Fs
X2FkZHIgPSBjbGllbnRfYWRkci5zaW5fYWRkcjsKICAgICAgICAgICAgIGNsaWVudF9hZGRyLnNp
bl9wb3J0ID0gMDsKLSAgICAgICAgICAgIGJpbmQodC0+c29jaywgKHN0cnVjdCBzb2NrYWRkciAq
KSZjbGllbnRfYWRkciwKKyAgICAgICAgICAgIHJldCA9IGJpbmQodC0+c29jaywgKHN0cnVjdCBz
b2NrYWRkciAqKSZjbGllbnRfYWRkciwKICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qg
c29ja2FkZHIpKTsKKyAgICAgICAgICAgIGlmKHJldCkKKyAgICAgICAgICAgICAgICBERUJVR01T
R1RMKCgibmV0c25tcF91ZHAiLCAiZmFpbGVkIHRvIGJpbmQgZm9yIGNsaWVudGFkZHI6ICVkICVz
XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLHN0cmVycm9yKGVycm5vKSkp
OworICAgICAgICAgICAgLyogVE9ETzogc2hvdWxkIHdlIGV4aXQgaGVyZT8gKi8KICAgICAgICAg
fQorCisgICAgICAgIHN0ciA9IG5ldHNubXBfdWRwX2ZtdGFkZHIoTlVMTCwgKHZvaWQgKikmYWRk
cl9wYWlyLCAKKyAgICAgICAgICAgICAgICBzaXplb2YobmV0c25tcF91ZHBfYWRkcl9wYWlyKSk7
CisgICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX3VkcCIsICJjbGllbnQgb3BlbiAlc1xuIiwg
c3RyKSk7CisgICAgICAgIGZyZWUoc3RyKTsKKwogICAgICAgICAvKgogICAgICAgICAgKiBTYXZl
IHRoZSAocmVtb3RlKSBhZGRyZXNzIGluIHRoZQogICAgICAgICAgKiB0cmFuc3BvcnQtc3BlY2lm
aWMgZGF0YSBwb2ludGVyIGZvciBsYXRlciB1c2UgYnkgbmV0c25tcF91ZHBfc2VuZC4K
</data>        

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>136513</attachid>
            <date>2007-11-20 18:01 0000</date>
            <desc>This is the patched snmpUDPDomain.c file.</desc>
            <filename>snmpUDPDomain.c</filename>
            <type>text/plain</type>
            <data encoding="base64">LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29w
eXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBk
ZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICog
UG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IENv
cHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
ICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJ
TkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiNp
bmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgoj
aW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZXJybm8u
aD4KCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUg
PHN0cmluZ3MuaD4KI2VuZGlmCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4K
I2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBI
QVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmIEhBVkVf
TkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9BUlBB
X0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgojaWYgSEFWRV9ORVREQl9ICiNp
bmNsdWRlIDxuZXRkYi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1VJT19ICiNpbmNsdWRlIDxzeXMv
dWlvLmg+CiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrMi5oPgoj
aW5jbHVkZSA8d3MydGNwaXAuaD4KI2VuZGlmCgojaWYgSEFWRV9ETUFMTE9DX0gKI2luY2x1ZGUg
PGRtYWxsb2MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUg
PG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2NvbmZpZ19hcGkuaD4K
CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfdHJhbnNwb3J0Lmg+CiNpbmNsdWRlIDxu
ZXQtc25tcC9saWJyYXJ5L3NubXBVRFBEb21haW4uaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJh
cnkvc3lzdGVtLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3Rvb2xzLmg+CgojaWZuZGVm
IElOQUREUl9OT05FCiNkZWZpbmUgSU5BRERSX05PTkUJLTEKI2VuZGlmCgpzdGF0aWMgbmV0c25t
cF90ZG9tYWluIHVkcERvbWFpbjsKCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfdWRwX2FkZHJfcGFp
cl9zIHsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVfYWRkcjsKICAgIHN0cnVjdCBpbl9h
ZGRyIGxvY2FsX2FkZHI7Cn0gbmV0c25tcF91ZHBfYWRkcl9wYWlyOwoKLyoKICogbm90IHN0YXRp
Yywgc2luY2Ugc25tcFVEUElQdjZEb21haW4gbmVlZHMgaXQsIGJ1dCBub3QgcHVibGljLCBlaXRo
ZXIuCiAqIChpZSBkb24ndCBwdXQgaXQgaW4gYSBwdWJsaWMgaGVhZGVyLikKICovCnZvaWQgX25l
dHNubXBfdWRwX3NvY2tvcHRfc2V0KGludCBmZCwgaW50IHNlcnZlcik7CmludApuZXRzbm1wX3Nv
Y2thZGRyX2luMihzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsCiAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IGNoYXIgKmlucGVlcm5hbWUsIGNvbnN0IGNoYXIgKmRlZmF1bHRfdGFyZ2V0KTsKCi8q
CiAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGFkZHJlc3MgaW4gZGF0YSwgb3Ig
ZWxzZSB0aGUgImZhciBlbmQiCiAqIGFkZHJlc3MgaWYgZGF0YSBpcyBOVUxMLiAgCiAqLwoKc3Rh
dGljIGNoYXIgKgpuZXRzbm1wX3VkcF9mbXRhZGRyKG5ldHNubXBfdHJhbnNwb3J0ICp0LCB2b2lk
ICpkYXRhLCBpbnQgbGVuKQp7CiAgICBuZXRzbm1wX3VkcF9hZGRyX3BhaXIgKmFkZHJfcGFpciA9
IE5VTEw7CgogICAgaWYgKGRhdGEgIT0gTlVMTCAmJiBsZW4gPT0gc2l6ZW9mKG5ldHNubXBfdWRw
X2FkZHJfcGFpcikpIHsKCWFkZHJfcGFpciA9IChuZXRzbm1wX3VkcF9hZGRyX3BhaXIgKikgZGF0
YTsKICAgIH0gZWxzZSBpZiAodCAhPSBOVUxMICYmIHQtPmRhdGEgIT0gTlVMTCkgewoJYWRkcl9w
YWlyID0gKG5ldHNubXBfdWRwX2FkZHJfcGFpciAqKSB0LT5kYXRhOwogICAgfQoKICAgIGlmIChh
ZGRyX3BhaXIgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBzdHJkdXAoIlVEUDogdW5rbm93biIp
OwogICAgfSBlbHNlIHsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnRvID0gTlVMTDsKCWNo
YXIgdG1wWzY0XTsKICAgICAgICB0byA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihhZGRyX3Bh
aXItPnJlbW90ZV9hZGRyKTsKICAgICAgICAvKiBVc2luZyBzdHJkdXAgb24gdGhlIG91dHB1dCBv
ZiBpbmV0X250b2EgaXMgaW1wb3J0YW50ISAqLwogICAgICAgIC8qICJpbmV0X250b2EiIHVzZXMg
YSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBidWZmZXIgdG8gc3RvcmUKICAgICAgICAgICBpdHMgaW5m
b3JtYXRpb24uICBUbyB1c2UgdHdvIGluIGEgcm93LCB0aGUgZmlyc3QgbmVlZHMKICAgICAgICAg
ICB0byBiZSBzYXZlZCBzb21ld2hlcmUgZWxzZSBzbyB0aGF0IHRoZSBzZWNvbmQgZG9lcyBub3QK
ICAgICAgICAgICBvdmVyd3JpdGUgaXQuICBIb3dldmVyLCBpdCBpcyBpbXBvcnRhbnQgdG8gcmVt
ZW1iZXIgdGhhdAogICAgICAgICAgIGFsbCAic3RyZHVwIiBjYWxscyBNVVNUIGJlIGZyZWVkLiAq
LwogICAgICAgIGlmICh0byA9PSBOVUxMKSB7CiAgICAgICAgICAgIHNwcmludGYodG1wLCAiVURQ
OiBbJXNdLT51bmtub3duIiwKICAgICAgICAgICAgICAgICAgICBpbmV0X250b2EoYWRkcl9wYWly
LT5sb2NhbF9hZGRyKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogVGhpcyB3aWxs
IHN0b3JlIHRoZSBmaXJzdCBhZGRyZXNzIGZyb20gc3RyZHVwIHNvIHRoYXQgdGhlIHNlY29uZAog
ICAgICAgICAgICAgICBjYWxsIHdpbGwgbm90IG92ZXJ3cml0ZSBpdC4gKi8KICAgICAgICAgICAg
Y2hhciogbG9jYWxfYWRkcl9jb3B5ID0gc3RyZHVwKCBpbmV0X250b2EoYWRkcl9wYWlyLT5sb2Nh
bF9hZGRyKSApOwogICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlVEUDogWyVzXS0+WyVzXTolaHUi
LAogICAgICAgICAgICAgICAgICAgIGxvY2FsX2FkZHJfY29weSwKICAgICAgICAgICAgICAgICAg
ICBpbmV0X250b2EodG8tPnNpbl9hZGRyKSwgbnRvaHModG8tPnNpbl9wb3J0KSk7CiAgICAgICAg
ICAgIC8qIFJlbWVtYmVyLCB3ZSBtdXN0IGZyZWUgb3VyIGNvcHkgbm93LiAqLwogICAgICAgICAg
ICBmcmVlKCBsb2NhbF9hZGRyX2NvcHkgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHJk
dXAodG1wKTsKICAgIH0KfQoKCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChJUF9QS1RJ
TkZPKQoKIyBkZWZpbmUgbmV0c25tcF9kc3RhZGRyKHgpICgmKCgoc3RydWN0IGluX3BrdGluZm8g
KikoQ01TR19EQVRBKHgpKSktPmlwaV9hZGRyKSkKCnN0YXRpYyBpbnQgbmV0c25tcF91ZHBfcmVj
dmZyb20oaW50IHMsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IHNvY2thZGRyICpmcm9tLCBz
b2NrbGVuX3QgKmZyb21sZW4sIHN0cnVjdCBpbl9hZGRyICpkc3RpcCkKewogICAgaW50IHI7CiAg
ICBzdHJ1Y3QgaW92ZWMgaW92WzFdOwogICAgY2hhciBjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0
cnVjdCBpbl9wa3RpbmZvKSldOwogICAgc3RydWN0IGNtc2doZHIgKmNtc2dwdHI7CiAgICBzdHJ1
Y3QgbXNnaGRyIG1zZzsKCiAgICBpb3ZbMF0uaW92X2Jhc2UgPSBidWY7CiAgICBpb3ZbMF0uaW92
X2xlbiA9IGxlbjsKCiAgICBtZW1zZXQoJm1zZywgMCwgc2l6ZW9mIG1zZyk7CiAgICBtc2cubXNn
X25hbWUgPSBmcm9tOwogICAgbXNnLm1zZ19uYW1lbGVuID0gKmZyb21sZW47CiAgICBtc2cubXNn
X2lvdiA9IGlvdjsKICAgIG1zZy5tc2dfaW92bGVuID0gMTsKICAgIG1zZy5tc2dfY29udHJvbCA9
ICZjbXNnOwogICAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNtc2cpOwoKICAgIHIgPSBy
ZWN2bXNnKHMsICZtc2csIDApOwoKICAgIGlmIChyID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0x
OwogICAgfQogICAgCiAgICBERUJVR01TR1RMKCgibmV0c25tcF91ZHAiLCAiZ290IHNvdXJjZSBh
ZGRyOiAlc1xuIiwgaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopZnJvbSktPnNpbl9h
ZGRyKSkpOwogICAgZm9yIChjbXNncHRyID0gQ01TR19GSVJTVEhEUigmbXNnKTsgY21zZ3B0ciAh
PSBOVUxMOyBjbXNncHRyID0gQ01TR19OWFRIRFIoJm1zZywgY21zZ3B0cikpIHsKICAgICAgICBp
ZiAoY21zZ3B0ci0+Y21zZ19sZXZlbCA9PSBTT0xfSVAgJiYgY21zZ3B0ci0+Y21zZ190eXBlID09
IElQX1BLVElORk8pIHsKICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopIGRzdGlwLCBuZXRzbm1w
X2RzdGFkZHIoY21zZ3B0ciksIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwogICAgICAgICAgICBE
RUJVR01TR1RMKCgibmV0c25tcF91ZHAiLCAiZ290IGRlc3RpbmF0aW9uIChsb2NhbCkgYWRkciAl
c1xuIiwKICAgICAgICAgICAgICAgICAgICBpbmV0X250b2EoKmRzdGlwKSkpOwogICAgICAgIH0K
ICAgIH0KICAgIHJldHVybiByOwp9CgpzdGF0aWMgaW50IG5ldHNubXBfdWRwX3NlbmR0byhpbnQg
ZmQsIHN0cnVjdCBpbl9hZGRyICpzcmNpcCwgc3RydWN0IHNvY2thZGRyICpyZW1vdGUsCgkJCXZv
aWQgKmRhdGEsIGludCBsZW4pCnsKICAgIHN0cnVjdCBpb3ZlYyBpb3YgPSB7IGRhdGEsIGxlbiB9
OwogICAgc3RydWN0IHsKICAgICAgICBzdHJ1Y3QgY21zZ2hkciBjbTsKICAgICAgICBzdHJ1Y3Qg
aW5fcGt0aW5mbyBpcGk7CiAgICB9IGNtc2c7CiAgICBzdHJ1Y3QgbXNnaGRyIG07CgogICAgY21z
Zy5jbS5jbXNnX2xlbiA9IHNpemVvZihzdHJ1Y3QgY21zZ2hkcikgKyBzaXplb2Yoc3RydWN0IGlu
X3BrdGluZm8pOwogICAgY21zZy5jbS5jbXNnX2xldmVsID0gU09MX0lQOwogICAgY21zZy5jbS5j
bXNnX3R5cGUgPSBJUF9QS1RJTkZPOwogICAgY21zZy5pcGkuaXBpX2lmaW5kZXggPSAwOwogICAg
Y21zZy5pcGkuaXBpX3NwZWNfZHN0LnNfYWRkciA9IChzcmNpcCA/IHNyY2lwLT5zX2FkZHIgOiBJ
TkFERFJfQU5ZKTsKCiAgICBtLm1zZ19uYW1lCQk9IHJlbW90ZTsKICAgIG0ubXNnX25hbWVsZW4J
PSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKICAgIG0ubXNnX2lvdgkJPSAmaW92OwogICAg
bS5tc2dfaW92bGVuCT0gMTsKICAgIG0ubXNnX2NvbnRyb2wJPSAmY21zZzsKICAgIG0ubXNnX2Nv
bnRyb2xsZW4JPSBzaXplb2YoY21zZyk7CiAgICBtLm1zZ19mbGFncwkJPSAwOwoKICAgIHJldHVy
biBzZW5kbXNnKGZkLCAmbSwgTVNHX05PU0lHTkFMfE1TR19ET05UV0FJVCk7Cn0KI2VuZGlmIC8q
IGxpbnV4ICYmIElQX1BLVElORk8gKi8KCi8qCiAqIFlvdSBjYW4gd3JpdGUgc29tZXRoaW5nIGlu
dG8gb3BhcXVlIHRoYXQgd2lsbCBzdWJzZXF1ZW50bHkgZ2V0IHBhc3NlZCBiYWNrIAogKiB0byB5
b3VyIHNlbmQgZnVuY3Rpb24gaWYgeW91IGxpa2UuICBGb3IgaW5zdGFuY2UsIHlvdSBtaWdodCB3
YW50IHRvCiAqIHJlbWVtYmVyIHdoZXJlIGEgUERVIGNhbWUgZnJvbSwgc28gdGhhdCB5b3UgY2Fu
IHNlbmQgYSByZXBseSB0aGVyZS4uLiAgCiAqLwoKc3RhdGljIGludApuZXRzbm1wX3VkcF9yZWN2
KG5ldHNubXBfdHJhbnNwb3J0ICp0LCB2b2lkICpidWYsIGludCBzaXplLAoJCSB2b2lkICoqb3Bh
cXVlLCBpbnQgKm9sZW5ndGgpCnsKICAgIGludCAgICAgICAgICAgICByYyA9IC0xOwogICAgc29j
a2xlbl90ICAgICAgIGZyb21sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKICAgIG5ldHNu
bXBfdWRwX2FkZHJfcGFpciAqYWRkcl9wYWlyID0gTlVMTDsKICAgIHN0cnVjdCBzb2NrYWRkciAq
ZnJvbTsKCiAgICBpZiAodCAhPSBOVUxMICYmIHQtPnNvY2sgPj0gMCkgewogICAgICAgIGFkZHJf
cGFpciA9IChuZXRzbm1wX3VkcF9hZGRyX3BhaXIgKikgbWFsbG9jKHNpemVvZihuZXRzbm1wX3Vk
cF9hZGRyX3BhaXIpKTsKICAgICAgICBpZiAoYWRkcl9wYWlyID09IE5VTEwpIHsKICAgICAgICAg
ICAgKm9wYXF1ZSA9IE5VTEw7CiAgICAgICAgICAgICpvbGVuZ3RoID0gMDsKICAgICAgICAgICAg
cmV0dXJuIC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lbXNldChhZGRyX3BhaXIs
IDAsIHNpemVvZihuZXRzbm1wX3VkcF9hZGRyX3BhaXIpKTsKICAgICAgICAgICAgZnJvbSA9IChz
dHJ1Y3Qgc29ja2FkZHIgKikgJihhZGRyX3BhaXItPnJlbW90ZV9hZGRyKTsKICAgICAgICB9CgoJ
d2hpbGUgKHJjIDwgMCkgewojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChJUF9QS1RJTkZP
KQogICAgICAgICAgICByYyA9IG5ldHNubXBfdWRwX3JlY3Zmcm9tKHQtPnNvY2ssIGJ1Ziwgc2l6
ZSwgZnJvbSwgJmZyb21sZW4sICYoYWRkcl9wYWlyLT5sb2NhbF9hZGRyKSk7CiNlbHNlCiAgICAg
ICAgICAgIHJjID0gcmVjdmZyb20odC0+c29jaywgYnVmLCBzaXplLCAwLCBmcm9tLCAmZnJvbWxl
bik7CiNlbmRpZiAvKiBsaW51eCAmJiBJUF9QS1RJTkZPICovCgkgICAgaWYgKHJjIDwgMCAmJiBl
cnJubyAhPSBFSU5UUikgewoJCWJyZWFrOwoJICAgIH0KCX0KCiAgICAgICAgaWYgKHJjID49IDAp
IHsKICAgICAgICAgICAgY2hhciAqc3RyID0gbmV0c25tcF91ZHBfZm10YWRkcihOVUxMLCBhZGRy
X3BhaXIsIHNpemVvZihuZXRzbm1wX3VkcF9hZGRyX3BhaXIpKTsKICAgICAgICAgICAgREVCVUdN
U0dUTCgoIm5ldHNubXBfdWRwIiwKCQkJInJlY3Zmcm9tIGZkICVkIGdvdCAlZCBieXRlcyAoZnJv
bSAlcylcbiIsCgkJCXQtPnNvY2ssIHJjLCBzdHIpKTsKICAgICAgICAgICAgZnJlZShzdHIpOwog
ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX3VkcCIsICJy
ZWN2ZnJvbSBmZCAlZCBlcnIgJWQgKFwiJXNcIilcbiIsCiAgICAgICAgICAgICAgICAgICAgICAg
IHQtPnNvY2ssIGVycm5vLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICB9CiAgICAgICAgKm9w
YXF1ZSA9ICh2b2lkICopYWRkcl9wYWlyOwogICAgICAgICpvbGVuZ3RoID0gc2l6ZW9mKG5ldHNu
bXBfdWRwX2FkZHJfcGFpcik7CiAgICB9CiAgICByZXR1cm4gcmM7Cn0KCgoKc3RhdGljIGludApu
ZXRzbm1wX3VkcF9zZW5kKG5ldHNubXBfdHJhbnNwb3J0ICp0LCB2b2lkICpidWYsIGludCBzaXpl
LAoJCSB2b2lkICoqb3BhcXVlLCBpbnQgKm9sZW5ndGgpCnsKICAgIGludCByYyA9IC0xOwogICAg
bmV0c25tcF91ZHBfYWRkcl9wYWlyICphZGRyX3BhaXIgPSBOVUxMOwogICAgc3RydWN0IHNvY2th
ZGRyICp0byA9IE5VTEw7CgogICAgaWYgKG9wYXF1ZSAhPSBOVUxMICYmICpvcGFxdWUgIT0gTlVM
TCAmJgogICAgICAgICpvbGVuZ3RoID09IHNpemVvZihuZXRzbm1wX3VkcF9hZGRyX3BhaXIpKSB7
CiAgICAgICAgYWRkcl9wYWlyID0gKG5ldHNubXBfdWRwX2FkZHJfcGFpciAqKSAoKm9wYXF1ZSk7
CiAgICB9IGVsc2UgaWYgKHQgIT0gTlVMTCAmJiB0LT5kYXRhICE9IE5VTEwgJiYKICAgICAgICAg
ICAgICAgIHQtPmRhdGFfbGVuZ3RoID09IHNpemVvZihuZXRzbm1wX3VkcF9hZGRyX3BhaXIpKSB7
CiAgICAgICAgYWRkcl9wYWlyID0gKG5ldHNubXBfdWRwX2FkZHJfcGFpciAqKSAodC0+ZGF0YSk7
CiAgICB9CgogICAgdG8gPSAoc3RydWN0IHNvY2thZGRyICopICYoYWRkcl9wYWlyLT5yZW1vdGVf
YWRkcik7CgogICAgaWYgKHRvICE9IE5VTEwgJiYgdCAhPSBOVUxMICYmIHQtPnNvY2sgPj0gMCkg
ewogICAgICAgIGNoYXIgKnN0ciA9IG5ldHNubXBfdWRwX2ZtdGFkZHIoTlVMTCwgKHZvaWQgKikg
YWRkcl9wYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9m
KG5ldHNubXBfdWRwX2FkZHJfcGFpcikpOwogICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX3Vk
cCIsICJzZW5kICVkIGJ5dGVzIGZyb20gJXAgdG8gJXMgb24gZmQgJWRcbiIsCiAgICAgICAgICAg
ICAgICAgICAgc2l6ZSwgYnVmLCBzdHIsIHQtPnNvY2spKTsKICAgICAgICBmcmVlKHN0cik7Cgl3
aGlsZSAocmMgPCAwKSB7CiNpZiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKElQX1BLVElORk8p
CiAgICAgICAgICAgIHJjID0gbmV0c25tcF91ZHBfc2VuZHRvKHQtPnNvY2ssIGFkZHJfcGFpciA/
ICYoYWRkcl9wYWlyLT5sb2NhbF9hZGRyKSA6IE5VTEwsIHRvLCBidWYsIHNpemUpOwojZWxzZQog
ICAgICAgICAgICByYyA9IHNlbmR0byh0LT5zb2NrLCBidWYsIHNpemUsIDAsIHRvLCBzaXplb2Yo
c3RydWN0IHNvY2thZGRyKSk7CiNlbmRpZiAvKiBsaW51eCAmJiBJUF9QS1RJTkZPICovCgkgICAg
aWYgKHJjIDwgMCAmJiBlcnJubyAhPSBFSU5UUikgewogICAgICAgICAgICAgICAgREVCVUdNU0dU
TCgoIm5ldHNubXBfdWRwIiwgInNlbmR0byBlcnJvciwgcmMgJWQgKGVycm5vICVkKVxuIiwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJjLCBlcnJubykpOwoJCWJyZWFrOwoJICAgIH0KCX0K
ICAgIH0KICAgIHJldHVybiByYzsKfQoKCgpzdGF0aWMgaW50Cm5ldHNubXBfdWRwX2Nsb3NlKG5l
dHNubXBfdHJhbnNwb3J0ICp0KQp7CiAgICBpbnQgcmMgPSAtMTsKICAgIGlmICh0LT5zb2NrID49
IDApIHsKI2lmbmRlZiBIQVZFX0NMT1NFU09DS0VUCiAgICAgICAgcmMgPSBjbG9zZSh0LT5zb2Nr
KTsKI2Vsc2UKICAgICAgICByYyA9IGNsb3Nlc29ja2V0KHQtPnNvY2spOwojZW5kaWYKICAgICAg
ICB0LT5zb2NrID0gLTE7CiAgICB9CiAgICByZXR1cm4gcmM7Cn0KCi8qCiAqIGZpbmQgbGFyZ2Vz
dCBwb3NzaWJsZSBidWZmZXIgYmV0d2VlbiBjdXJyZW50IHNpemUgYW5kIHNwZWNpZmllZCBzaXpl
LgogKgogKiBUcnkgdG8gbWF4aW1pemUgdGhlIGN1cnJlbnQgYnVmZmVyIG9mIHR5cGUgIm9wdG5h
bWUiCiAqIHRvIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBzaXplIGJ5IHRoZSBPUyAoYXMgY2xvc2Ug
dG8KICogc2l6ZSBhcyBwb3NzaWJsZSkKICovCnN0YXRpYyBpbnQKX3NvY2tfYnVmZmVyX21heGlt
aXplKGludCBzLCBpbnQgb3B0bmFtZSwgY29uc3QgY2hhciAqYnVmdHlwZSwgaW50IHNpemUpCnsK
ICAgIGludCAgICAgICAgICAgIGN1cmJ1ZiA9IDA7CiAgICBzaXplX3QgICAgICAgICBjdXJidWZs
ZW4gPSBzaXplb2YoaW50KTsKICAgIGludCAgICAgICAgICAgIGxvLCBtaWQsIGhpOwoKICAgIC8q
CiAgICAgKiBGaXJzdCB3ZSBuZWVkIHRvIGRldGVybWluZSBvdXIgY3VycmVudCBidWZmZXIKICAg
ICAqLwogICAgaWYgKChnZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIG9wdG5hbWUsICh2b2lkICop
ICZjdXJidWYsCiAgICAgICAgICAgICAgICAgICAgJmN1cmJ1ZmxlbikgPT0gMCkgCiAgICAgICAg
ICAgICYmIChjdXJidWZsZW4gPT0gc2l6ZW9mKGludCkpKSB7CgogICAgICAgIERFQlVHTVNHVEwo
KCJ2ZXJib3NlOnNvY2tldDpidWZmZXI6bWF4IiwgIkN1cnJlbnQgJXMgaXMgJWRcbiIsCiAgICAg
ICAgICAgICAgICAgICAgYnVmdHlwZSwgY3VyYnVmKSk7CgogICAgICAgIC8qCiAgICAgICAgICog
TGV0J3Mgbm90IGJlIHN0dXBpZCAuLi4gaWYgd2Ugd2VyZSBhc2tlZCBmb3IgbGVzcyB0aGFuIHdo
YXQgd2UKICAgICAgICAgKiBhbHJlYWR5IGhhdmUsIHRoZW4gZm9yZ2V0IGFib3V0IGl0CiAgICAg
ICAgICovCiAgICAgICAgaWYgKHNpemUgPD0gY3VyYnVmKSB7CiAgICAgICAgICAgIERFQlVHTVNH
VEwoKCJ2ZXJib3NlOnNvY2tldDpidWZmZXI6bWF4IiwKICAgICAgICAgICAgICAgICAgICAgICAg
IlJlcXVlc3RlZCAlcyA8PSBjdXJyZW50IGJ1ZmZlclxuIiwgYnVmdHlwZSkpOwogICAgICAgICAg
ICByZXR1cm4gY3VyYnVmOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBEbyBhIGJp
bmFyeSBzZWFyY2ggdGhlIG9wdGltYWwgYnVmZmVyIHdpdGhpbiAxayBvZiB0aGUgcG9pbnQgb2YK
ICAgICAgICAgKiBmYWlsdXJlLiBUaGlzIGlzIHJhdGhlciBicnV0ZWZvcmNlLCBidXQgc2ltcGxl
CiAgICAgICAgICovCiAgICAgICAgaGkgPSBzaXplOwogICAgICAgIGxvID0gY3VyYnVmOwoKICAg
ICAgICB3aGlsZSAoaGkgLSBsbyA+IDEwMjQpIHsKICAgICAgICAgICAgbWlkID0gKGxvICsgaGkp
IC8gMjsKICAgICAgICAgICAgaWYgKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgb3B0bmFtZSwg
KHZvaWQgKikgJm1pZCwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkpID09IDAp
IHsKICAgICAgICAgICAgICAgIGxvID0gbWlkOyAvKiBTdWNjZXNzOiBzZWFyY2ggYmV0d2VlbiBt
aWQgYW5kIGhpICovCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoaSA9IG1p
ZDsgLyogRmFpbGVkOiBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgbWlkICovCiAgICAgICAgICAgIH0K
ICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTm93IHByaW50IGlmIHRoaXMgb3B0aW1p
emF0aW9uIGhlbHBlZCBvciBub3QKICAgICAgICAgKi8KICAgICAgICBpZiAoZ2V0c29ja29wdChz
LFNPTF9TT0NLRVQsIG9wdG5hbWUsICh2b2lkICopICZjdXJidWYsCiAgICAgICAgICAgICAgICAg
ICAgJmN1cmJ1ZmxlbikgPT0gMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgic29ja2V0OmJ1
ZmZlcjptYXgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIk1heGltaXplZCAlczogJWRcbiIs
YnVmdHlwZSwgY3VyYnVmKSk7CiAgICAgICAgfSAKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAg
ICAgICAgKiBUaGVyZSBpcyByZWFsbHkgbm90IGEgbG90IHdlIGNhbiBkbyBhbnltb3JlLgogICAg
ICAgICAqIElmIHRoZSBPUyBkb2Vzbid0IGdpdmUgdXMgdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGVu
IHdoYXQncyB0aGUgCiAgICAgICAgICogcG9pbnQgaW4gdHJ5aW5nIHRvIG1ha2UgaXQgYmV0dGVy
CiAgICAgICAgICovCiAgICAgICAgREVCVUdNU0dUTCgoInNvY2tldDpidWZmZXI6bWF4IiwgIkdl
dCAlcyBmYWlsZWQgLi4uIGdpdmluZyB1cCFcbiIsCiAgICAgICAgICAgICAgICAgICAgYnVmdHlw
ZSkpOwogICAgICAgIGN1cmJ1ZiA9IC0xOwogICAgfQoKICAgIHJldHVybiBjdXJidWY7Cn0KCgpz
dGF0aWMgY29uc3QgY2hhciAqCl9zb2NrX2J1Zl90eXBlX2dldChpbnQgb3B0bmFtZSwgaW50IGxv
Y2FsKQp7CiAgICBpZiAob3B0bmFtZSA9PSBTT19TTkRCVUYpIHsKICAgICAgICBpZiAobG9jYWwp
CiAgICAgICAgICAgIHJldHVybiAic2VydmVyIHNlbmQgYnVmZmVyIjsKICAgICAgICBlbHNlCiAg
ICAgICAgICAgIHJldHVybiAiY2xpZW50IHNlbmQgYnVmZmVyIjsKICAgIH0gZWxzZSBpZiAob3B0
bmFtZSA9PSBTT19SQ1ZCVUYpIHsKICAgICAgICBpZiAobG9jYWwpCiAgICAgICAgICAgIHJldHVy
biAic2VydmVyIHJlY2VpdmUgYnVmZmVyIjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVy
biAiY2xpZW50IHJlY2VpdmUgYnVmZmVyIjsKICAgIH0KCiAgICByZXR1cm4gInVua25vd24gYnVm
ZmVyIjsKfQoKLyoKICoKICogR2V0IHRoZSByZXF1ZXN0ZWQgYnVmZmVyc2l6ZSwgYmFzZWQgb24K
ICogLSBzb2NrZXR0eXBlIDogY2xpZW50IChsb2NhbCA9IDApIG9yIHNlcnZlciAobG9jYWwgPSAx
KSAKICogLSBidWZmZXJ0eXBlIDogc2VuZCAob3B0bmFtZSA9IFNPX1NOREJVRikgb3IgcmVjdiAo
U09fUkNWQlVGKQogKgogKiBJbiBjYXNlIGEgY29tcGlsZSB0aW1lIGJ1ZmZlciB3YXMgc3BlY2lm
aWVkLCB0aGVuIHVzZSB0aGF0IG9uZQogKiBpZiB0aGVyZSB3YXMgbm8gcnVudGltZSBjb25maWd1
cmF0aW9uIG92ZXJyaWRlCiAqLwpzdGF0aWMgaW50Cl9zb2NrX2J1ZmZlcl9zaXplX2dldChpbnQg
b3B0bmFtZSwgaW50IGxvY2FsLCBjb25zdCBjaGFyICoqYnVmdHlwZSkKewogICAgaW50IHNpemU7
CgogICAgaWYgKE5VTEwgIT0gYnVmdHlwZSkKICAgICAgICAqYnVmdHlwZSA9IF9zb2NrX2J1Zl90
eXBlX2dldChvcHRuYW1lLCBsb2NhbCk7CgogICAgaWYgKG9wdG5hbWUgPT0gU09fU05EQlVGKSB7
CiAgICAgICAgaWYgKGxvY2FsKSB7CiAgICAgICAgICAgIHNpemUgPSBuZXRzbm1wX2RzX2dldF9p
bnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RT
X0xJQl9TRVJWRVJTRU5EQlVGKTsKI2lmZGVmIE5FVFNOTVBfREVGQVVMVF9TRVJWRVJfU0VORF9C
VUYKICAgICAgICAgICAgaWYgKHNpemUgPD0gMCkKICAgICAgICAgICAgICAgc2l6ZSA9IE5FVFNO
TVBfREVGQVVMVF9TRVJWRVJfU0VORF9CVUY7CiNlbmRpZgogICAgICAgIH0gZWxzZSB7CiAgICAg
ICAgICAgIHNpemUgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAK
ICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9DTElFTlRTRU5EQlVGKTsKI2lmZGVm
IE5FVFNOTVBfREVGQVVMVF9DTElFTlRfU0VORF9CVUYKICAgICAgICAgICAgaWYgKHNpemUgPD0g
MCkKICAgICAgICAgICAgICAgc2l6ZSA9IE5FVFNOTVBfREVGQVVMVF9DTElFTlRfU0VORF9CVUY7
CiNlbmRpZgogICAgICAgIH0KICAgIH0gZWxzZSBpZiAob3B0bmFtZSA9PSBTT19SQ1ZCVUYpIHsK
ICAgICAgICBpZiAobG9jYWwpIHsKICAgICAgICAgICAgc2l6ZSA9IG5ldHNubXBfZHNfZ2V0X2lu
dChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNf
TElCX1NFUlZFUlJFQ1ZCVUYpOwojaWZkZWYgTkVUU05NUF9ERUZBVUxUX1NFUlZFUl9SRUNWX0JV
RgogICAgICAgICAgICBpZiAoc2l6ZSA8PSAwKQogICAgICAgICAgICAgICBzaXplID0gTkVUU05N
UF9ERUZBVUxUX1NFUlZFUl9SRUNWX0JVRjsKI2VuZGlmCiAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgc2l6ZSA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAog
ICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0NMSUVOVFJFQ1ZCVUYpOwojaWZkZWYg
TkVUU05NUF9ERUZBVUxUX0NMSUVOVF9SRUNWX0JVRgogICAgICAgICAgICBpZiAoc2l6ZSA8PSAw
KQogICAgICAgICAgICAgICBzaXplID0gTkVUU05NUF9ERUZBVUxUX0NMSUVOVF9SRUNWX0JVRjsK
I2VuZGlmCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBzaXplID0gMDsKICAgIH0KCiAg
ICBERUJVR01TR1RMKCgic29ja2V0OmJ1ZmZlciIsICJSZXF1ZXN0ZWQgJXMgaXMgJWRcbiIsCiAg
ICAgICAgICAgICAgICAoYnVmdHlwZSkgPyAqYnVmdHlwZSA6ICJ1bmtub3duIGJ1ZmZlciIsIHNp
emUpKTsKCiAgICByZXR1cm4oc2l6ZSk7Cn0KCi8qCiAqIHNldCBzb2NrZXQgYnVmZmVyIHNpemUK
ICoKICogQHBhcmFtIHNzICAgICA6IHNvY2tldAogKiBAcGFyYW0gb3B0bmFtZTogU09fU05EQlVG
IG9yIFNPX1JDVkJVRgogKiBAcGFyYW0gbG9jYWwgIDogMSBmb3Igc2VydmVyLCAwIGZvciBjbGll
bnQKICogQHBhcmFtIHJlcWJ1ZiA6IHJlcXVlc3RlZCBzaXplLCBvciAwIGZvciBkZWZhdWx0CiAq
CiAqIEByZXR2YWwgICAgLTEgOiBlcnJvcgogKiBAcmV0dmFsICAgID4wIDogbmV3IGJ1ZmZlciBz
aXplCiAqLwppbnQKbmV0c25tcF9zb2NrX2J1ZmZlcl9zZXQoaW50IHMsIGludCBvcHRuYW1lLCBp
bnQgbG9jYWwsIGludCBzaXplKQp7CiNpZiAhIGRlZmluZWQoU09fU05EQlVGKSAmJiAhIGRlZmlu
ZWQoU09fUkNWQlVGKQogICAgREVCVUdNU0dUTCgoInNvY2tldDpidWZmZXIiLCAiQ2hhbmdpbmcg
c29ja2V0IGJ1ZmZlciBpcyBub3Qgc3VwcG9ydGVkXG4iKSk7CiAgICByZXR1cm4gLTE7CiNlbHNl
CiAgICBjb25zdCBjaGFyICAgICAqYnVmdHlwZTsKICAgIGludCAgICAgICAgICAgIGN1cmJ1ZiA9
IDA7CiAgICBzaXplX3QgICAgICAgICBjdXJidWZsZW4gPSBzaXplb2YoaW50KTsKCiMgICBpZm5k
ZWYgIFNPX1NOREJVRgogICAgaWYgKFNPX1NOREJVRiA9PSBvcHRuYW1lKSB7CiAgICAgICAgREVC
VUdNU0dUTCgoInNvY2tldDpidWZmZXIiLAogICAgICAgICAgICAgICAgICAgICJDaGFuZ2luZyBz
b2NrZXQgc2VuZCBidWZmZXIgaXMgbm90IHN1cHBvcnRlZFxuIikpOwogICAgICAgIHJldHVybiAt
MTsKICAgIH0KIyAgIGVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKlNPX1NOREJVRiAq
LwojICAgaWZuZGVmICBTT19SQ1ZCVUYKICAgIGlmIChTT19SQ1ZCVUYgPT0gb3B0bmFtZSkgewog
ICAgICAgIERFQlVHTVNHVEwoKCJzb2NrZXQ6YnVmZmVyIiwKICAgICAgICAgICAgICAgICAgICAi
Q2hhbmdpbmcgc29ja2V0IHJlY2VpdmUgYnVmZmVyIGlzIG5vdCBzdXBwb3J0ZWRcbiIpKTsKICAg
ICAgICByZXR1cm4gLTE7CiAgICB9CiMgICBlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAg
LypTT19SQ1ZCVUYgKi8KCiAgICAvKgogICAgICogV2hhdCBpcyB0aGUgcmVxdWVzdGVkIGJ1ZmZl
ciBzaXplID8KICAgICAqLwogICAgaWYgKDAgPT0gc2l6ZSkKICAgICAgICBzaXplID0gX3NvY2tf
YnVmZmVyX3NpemVfZ2V0KG9wdG5hbWUsIGxvY2FsLCAmYnVmdHlwZSk7CiAgICBlbHNlIHsKICAg
ICAgICBidWZ0eXBlID0gX3NvY2tfYnVmX3R5cGVfZ2V0KG9wdG5hbWUsIGxvY2FsKTsKICAgICAg
ICBERUJVR01TR1QoKCJ2ZXJib3NlOnNvY2tldDpidWZmZXIiLCAiUmVxdWVzdGVkICVzIGlzICVk
XG4iLAogICAgICAgICAgICAgICAgICAgYnVmdHlwZSwgc2l6ZSkpOwogICAgfQoKICAgIGlmICgo
Z2V0c29ja29wdChzLCBTT0xfU09DS0VULCBvcHRuYW1lLCAodm9pZCAqKSAmY3VyYnVmLAogICAg
ICAgICAgICAgICAgICAgICZjdXJidWZsZW4pID09IDApIAogICAgICAgICYmIChjdXJidWZsZW4g
PT0gc2l6ZW9mKGludCkpKSB7CiAgICAgICAgCiAgICAgICAgREVCVUdNU0dUKCgidmVyYm9zZTpz
b2NrZXQ6YnVmZmVyIiwgIk9yaWdpbmFsICVzIGlzICVkXG4iLAogICAgICAgICAgICAgICAgICAg
YnVmdHlwZSwgY3VyYnVmKSk7CiAgICAgICAgaWYgKGN1cmJ1ZiA+PSBzaXplKSB7CiAgICAgICAg
ICAgIERFQlVHTVNHVCgoInZlcmJvc2U6c29ja2V0OmJ1ZmZlciIsCiAgICAgICAgICAgICAgICAg
ICAgICAiTmV3ICVzIHNpemUgaXMgc21hbGxlciB0aGFuIG9yaWdpbmFsIVxuIiwgYnVmdHlwZSkp
OwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogSWYgdGhlIGJ1ZmZlcnNpemUgd2FzIG5v
dCBzcGVjaWZpZWQgb3IgaXQgd2FzIGEgbmVnYXRpdmUgdmFsdWUKICAgICAqIHRoZW4gZG9uJ3Qg
Y2hhbmdlIHRoZSBPUyBidWZmZXJzIGF0IGFsbAogICAgICovCiAgICBpZiAoc2l6ZSA8PSAwKSB7
CiAgICAgICBERUJVR01TR1QoKCJzb2NrZXQ6YnVmZmVyIiwKICAgICAgICAgICAgICAgICAgICAi
JXMgbm90IHZhbGlkIG9yIG5vdCBzcGVjaWZpZWQ7IHVzaW5nIE9TIGRlZmF1bHQoJWQpXG4iLAog
ICAgICAgICAgICAgICAgICAgIGJ1ZnR5cGUsY3VyYnVmKSk7CiAgICAgICByZXR1cm4gY3VyYnVm
OwogICAgfQoKICAgIC8qCiAgICAgKiBUcnkgdG8gc2V0IHRoZSByZXF1ZXN0ZWQgc2VuZCBidWZm
ZXIKICAgICAqLwogICAgaWYgKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgb3B0bmFtZSwgKHZv
aWQgKikgJnNpemUsIHNpemVvZihpbnQpKSA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBC
ZWNhdXNlIHNvbWUgcGxhdGZvcm1zIGxpZSBhYm91dCB0aGUgYWN0dWFsIGJ1ZmZlciB0aGF0IGhh
cyBiZWVuIAogICAgICAgICAqIHNldCAoTGludXggd2lsbCBhbHdheXMgc2F5IGl0IHdvcmtlZCAu
Li4pLCB3ZSBwcmludCBzb21lIAogICAgICAgICAqIGRpYWdub3N0aWMgb3V0cHV0IGZvciBkZWJ1
Z2dpbmcKICAgICAgICAgKi8KICAgICAgICBERUJVR0lGKCJzb2NrZXQ6YnVmZmVyIikgewogICAg
ICAgICAgICBERUJVR01TR1QoKCJzb2NrZXQ6YnVmZmVyIiwgIlNldCAlcyB0byAlZFxuIiwKICAg
ICAgICAgICAgICAgICAgICAgICBidWZ0eXBlLCBzaXplKSk7CiAgICAgICAgICAgIGlmICgoZ2V0
c29ja29wdChzLCBTT0xfU09DS0VULCBvcHRuYW1lLCAodm9pZCAqKSAmY3VyYnVmLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJmN1cmJ1ZmxlbikgPT0gMCkgCiAgICAgICAgICAgICAgICAg
ICAgJiYgKGN1cmJ1ZmxlbiA9PSBzaXplb2YoaW50KSkpIHsKCiAgICAgICAgICAgICAgICBERUJV
R01TR1QoKCJ2ZXJib3NlOnNvY2tldDpidWZmZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAiTm93ICVzIGlzICVkXG4iLCBidWZ0eXBlLCBjdXJidWYpKTsKICAgICAgICAgICAgfQogICAg
ICAgIH0KICAgICAgICAvKgogICAgICAgICAqIElmIHRoZSBuZXcgYnVmZmVyIGlzIHNtYWxsZXIg
dGhhbiB0aGUgc2l6ZSB3ZSByZXF1ZXN0ZWQsIHdlIHdpbGwKICAgICAgICAgKiB0cnkgdG8gaW5j
cmVtZW50IHRoZSBuZXcgYnVmZmVyIHdpdGggMWsgaW5jcmVtZW50cyAKICAgICAgICAgKiAodGhp
cyB3aWxsIHNvbWV0aW1lIGFsbG93IHVzIHRvIHJlYWNoIGEgbW9yZSBvcHRpbWFsIGJ1ZmZlci4p
CiAgICAgICAgICogICBGb3IgZXhhbXBsZSA6IE9uIFNvbGFyaXMsIGlmIHRoZSBtYXggT1MgYnVm
ZmVyIGlzIDEwMGsgYW5kIHlvdQogICAgICAgICAqICAgcmVxdWVzdCAxMTBrLCB5b3UgZW5kIHVw
IHdpdGggdGhlIGRlZmF1bHQgOGsgOi0oCiAgICAgICAgICovCiAgICAgICAgaWYgKGN1cmJ1ZiA8
IHNpemUpIHsKICAgICAgICAgICAgY3VyYnVmID0gX3NvY2tfYnVmZmVyX21heGltaXplKHMsIG9w
dG5hbWUsIGJ1ZnR5cGUsIHNpemUpOwogICAgICAgICAgICBpZigtMSAhPSBjdXJidWYpCiAgICAg
ICAgICAgICAgICBzaXplID0gY3VyYnVmOwogICAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICAg
IC8qCiAgICAgICAgICogT2J2aW91c2x5IGNoYW5naW5nIHRoZSBidWZmZXIgZmFpbGVkLCBtb3N0
IGxpa2UgbGlrZSBiZWNhdXNlIHdlIAogICAgICAgICAqIHJlcXVlc3RlZCBhIGJ1ZmZlciBncmVh
dGVyIHRoYW4gdGhlIE9TIGxpbWl0LgogICAgICAgICAqIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHNl
YXJjaCBmb3IgYW4gb3B0aW1hbCBidWZmZXIgdGhhdCBpcyBjbG9zZQogICAgICAgICAqIGVub3Vn
aCB0byB0aGUgcG9pbnQgb2YgZmFpbHVyZS4KICAgICAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdXMg
dG8gcmVhY2ggYSBtb3JlIG9wdGltYWwgYnVmZmVyLgogICAgICAgICAqICAgRm9yIGV4YW1wbGUg
OiBPbiBTb2xhcmlzLCBpZiB0aGUgbWF4IE9TIGJ1ZmZlciBpcyAxMDBrIGFuZCB5b3UgCiAgICAg
ICAgICogICByZXF1ZXN0IDExMGssIHlvdSBlbmQgdXAgd2l0aCB0aGUgZGVmYXVsdCA4ayA6LSgK
ICAgICAgICAgKiAgIEFmdGVyIHRoaXMgcXVpY2sgc2VhY2ggd2Ugd291bGQgZ2V0IDFrIGNsb3Nl
IHRvIDEwMGsgKHRoZSBtYXgpCiAgICAgICAgICovCiAgICAgICAgREVCVUdNU0dUTCgoInNvY2tl
dDpidWZmZXIiLCAiY291bGRuJ3Qgc2V0ICVzIHRvICVkXG4iLAogICAgICAgICAgICAgICAgICAg
IGJ1ZnR5cGUsIHNpemUpKTsKCiAgICAgICAgY3VyYnVmID0gX3NvY2tfYnVmZmVyX21heGltaXpl
KHMsIG9wdG5hbWUsIGJ1ZnR5cGUsIHNpemUpOwogICAgICAgIGlmKC0xICE9IGN1cmJ1ZikKICAg
ICAgICAgICAgc2l6ZSA9IGN1cmJ1ZjsKICAgIH0KCiAgICByZXR1cm4gc2l6ZTsKI2VuZGlmCn0K
Ci8qCiAqIE9wZW4gYSBVRFAtYmFzZWQgdHJhbnNwb3J0IGZvciBTTk1QLiAgTG9jYWwgaXMgVFJV
RSBpZiBhZGRyIGlzIHRoZSBsb2NhbAogKiBhZGRyZXNzIHRvIGJpbmQgdG8gKGkuZS4gdGhpcyBp
cyBhIHNlcnZlci10eXBlIHNlc3Npb24pOyBvdGhlcndpc2UgYWRkciBpcyAKICogdGhlIHJlbW90
ZSBhZGRyZXNzIHRvIHNlbmQgdGhpbmdzIHRvLiAgCiAqLwoKbmV0c25tcF90cmFuc3BvcnQgKgpu
ZXRzbm1wX3VkcF90cmFuc3BvcnQoc3RydWN0IHNvY2thZGRyX2luICphZGRyLCBpbnQgbG9jYWwp
CnsKICAgIG5ldHNubXBfdHJhbnNwb3J0ICp0ID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICBy
YyA9IDA7CiAgICBjaGFyICAgICAgICAgICAqc3RyID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAg
ICpjbGllbnRfc29ja2V0ID0gTlVMTDsKICAgIG5ldHNubXBfdWRwX2FkZHJfcGFpciBhZGRyX3Bh
aXI7CgogICAgaWYgKGFkZHIgPT0gTlVMTCB8fCBhZGRyLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQp
IHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBtZW1zZXQoJmFkZHJfcGFpciwgMCwg
c2l6ZW9mKG5ldHNubXBfdWRwX2FkZHJfcGFpcikpOwogICAgbWVtY3B5KCYoYWRkcl9wYWlyLnJl
bW90ZV9hZGRyKSwgYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwoKICAgIHQgPSAo
bmV0c25tcF90cmFuc3BvcnQgKikgbWFsbG9jKHNpemVvZihuZXRzbm1wX3RyYW5zcG9ydCkpOwog
ICAgaWYgKHQgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHN0ciA9
IG5ldHNubXBfdWRwX2ZtdGFkZHIoTlVMTCwgKHZvaWQgKikmYWRkcl9wYWlyLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmV0c25tcF91ZHBfYWRkcl9wYWlyKSk7CiAg
ICBERUJVR01TR1RMKCgibmV0c25tcF91ZHAiLCAib3BlbiAlcyAlc1xuIiwgbG9jYWwgPyAibG9j
YWwiIDogInJlbW90ZSIsCiAgICAgICAgICAgICAgICBzdHIpKTsKICAgIGZyZWUoc3RyKTsKCiAg
ICBtZW1zZXQodCwgMCwgc2l6ZW9mKG5ldHNubXBfdHJhbnNwb3J0KSk7CgogICAgdC0+ZG9tYWlu
ID0gbmV0c25tcFVEUERvbWFpbjsKICAgIHQtPmRvbWFpbl9sZW5ndGggPSBuZXRzbm1wVURQRG9t
YWluX2xlbjsKCiAgICB0LT5zb2NrID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOwog
ICAgaWYgKHQtPnNvY2sgPCAwKSB7CiAgICAgICAgbmV0c25tcF90cmFuc3BvcnRfZnJlZSh0KTsK
ICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBfbmV0c25tcF91ZHBfc29ja29wdF9zZXQo
dC0+c29jaywgbG9jYWwpOwoKICAgIGlmIChsb2NhbCkgewogICAgICAgIC8qCiAgICAgICAgICog
VGhpcyBzZXNzaW9uIGlzIGludGVuZWRlZCBhcyBhIHNlcnZlciwgc28gd2UgbXVzdCBiaW5kIG9u
IHRvIHRoZQogICAgICAgICAqIGdpdmVuIElQIGFkZHJlc3MsIHdoaWNoIG1heSBpbmNsdWRlIGFu
IGludGVyZmFjZSBhZGRyZXNzLCBvciBjb3VsZAogICAgICAgICAqIGJlIElOQUREUl9BTlksIGJ1
dCBjZXJ0YWlubHkgaW5jbHVkZXMgYSBwb3J0IG51bWJlci4KICAgICAgICAgKi8KCiAgICAgIHQt
PmxvY2FsID0gKHVfY2hhciAqKSBtYWxsb2MoNik7CiAgICAgICAgaWYgKHQtPmxvY2FsID09IE5V
TEwpIHsKICAgICAgICAgICAgbmV0c25tcF90cmFuc3BvcnRfZnJlZSh0KTsKICAgICAgICAgICAg
cmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIG1lbWNweSh0LT5sb2NhbCwgKHVfY2hhciAq
KSAmIChhZGRyLT5zaW5fYWRkci5zX2FkZHIpLCA0KTsKICAgICAgICB0LT5sb2NhbFs0XSA9ICho
dG9ucyhhZGRyLT5zaW5fcG9ydCkgJiAweGZmMDApID4+IDg7CiAgICAgICAgdC0+bG9jYWxbNV0g
PSAoaHRvbnMoYWRkci0+c2luX3BvcnQpICYgMHgwMGZmKSA+PiAwOwogICAgICAgIHQtPmxvY2Fs
X2xlbmd0aCA9IDY7CgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChJUF9QS1RJTkZPKQog
ICAgICAgIHsgCiAgICAgICAgICAgIGludCBzb2Nrb3B0ID0gMTsKICAgICAgICAgICAgaWYgKHNl
dHNvY2tvcHQodC0+c29jaywgU09MX0lQLCBJUF9QS1RJTkZPLCAmc29ja29wdCwgc2l6ZW9mIHNv
Y2tvcHQpID09IC0xKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibmV0c25tcF91ZHAi
LCAiY291bGRuJ3Qgc2V0IElQX1BLVElORk86ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHN0
cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAg
IH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoIm5ldHNubXBfdWRwIiwgInNldCBJUF9QS1RJTkZP
XG4iKSk7CiAgICAgICAgfQojZW5kaWYKICAgICAgICByYyA9IGJpbmQodC0+c29jaywgKHN0cnVj
dCBzb2NrYWRkciAqKSBhZGRyLAogICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvY2th
ZGRyKSk7CiAgICAgICAgaWYgKHJjICE9IDApIHsKICAgICAgICAgICAgbmV0c25tcF91ZHBfY2xv
c2UodCk7CiAgICAgICAgICAgIG5ldHNubXBfdHJhbnNwb3J0X2ZyZWUodCk7CiAgICAgICAgICAg
IHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICB0LT5kYXRhID0gTlVMTDsKICAgICAgICB0
LT5kYXRhX2xlbmd0aCA9IDA7CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogVGhp
cyBpcyBhIGNsaWVudCBzZXNzaW9uLiAgSWYgd2UndmUgYmVlbiBnaXZlbiBhCiAgICAgICAgICog
Y2xpZW50IGFkZHJlc3MgdG8gc2VuZCBmcm9tLCB0aGVuIGJpbmQgdG8gdGhhdC4KICAgICAgICAg
KiBPdGhlcndpc2UgdGhlIHNlbmQgd2lsbCB1c2UgInNvbWV0aGluZyBzZW5zaWJsZSIuCiAgICAg
ICAgICovCiAgICAgICAgY2xpZW50X3NvY2tldCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRT
Tk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBORVRTTk1QX0RTX0xJQl9DTElFTlRfQUREUik7CiAgICAgICAgaWYgKGNsaWVudF9z
b2NrZXQpIHsKICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGNsaWVudF9hZGRyOwogICAg
ICAgICAgICBpbnQgcmV0OwogICAgICAgICAgICBuZXRzbm1wX3NvY2thZGRyX2luMigmY2xpZW50
X2FkZHIsIGNsaWVudF9zb2NrZXQsIE5VTEwpOwogICAgICAgICAgICBhZGRyX3BhaXIubG9jYWxf
YWRkciA9IGNsaWVudF9hZGRyLnNpbl9hZGRyOwogICAgICAgICAgICBjbGllbnRfYWRkci5zaW5f
cG9ydCA9IDA7CiAgICAgICAgICAgIHJldCA9IGJpbmQodC0+c29jaywgKHN0cnVjdCBzb2NrYWRk
ciAqKSZjbGllbnRfYWRkciwKICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRk
cikpOwogICAgICAgICAgICBpZihyZXQpCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibmV0
c25tcF91ZHAiLCAiZmFpbGVkIHRvIGJpbmQgZm9yIGNsaWVudGFkZHI6ICVkICVzXG4iLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8sc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAg
ICAgIC8qIFRPRE86IHNob3VsZCB3ZSBleGl0IGhlcmU/ICovCiAgICAgICAgfQoKICAgICAgICBz
dHIgPSBuZXRzbm1wX3VkcF9mbXRhZGRyKE5VTEwsICh2b2lkICopJmFkZHJfcGFpciwgCiAgICAg
ICAgICAgICAgICBzaXplb2YobmV0c25tcF91ZHBfYWRkcl9wYWlyKSk7CiAgICAgICAgREVCVUdN
U0dUTCgoIm5ldHNubXBfdWRwIiwgImNsaWVudCBvcGVuICVzXG4iLCBzdHIpKTsKICAgICAgICBm
cmVlKHN0cik7CgogICAgICAgIC8qCiAgICAgICAgICogU2F2ZSB0aGUgKHJlbW90ZSkgYWRkcmVz
cyBpbiB0aGUKICAgICAgICAgKiB0cmFuc3BvcnQtc3BlY2lmaWMgZGF0YSBwb2ludGVyIGZvciBs
YXRlciB1c2UgYnkgbmV0c25tcF91ZHBfc2VuZC4KICAgICAgICAgKi8KCiAgICAgICAgdC0+ZGF0
YSA9IG1hbGxvYyhzaXplb2YobmV0c25tcF91ZHBfYWRkcl9wYWlyKSk7CiAgICAgICAgdC0+cmVt
b3RlID0gKHVfY2hhciAqKW1hbGxvYyg2KTsKICAgICAgICBpZiAodC0+ZGF0YSA9PSBOVUxMIHx8
IHQtPnJlbW90ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgIG5ldHNubXBfdHJhbnNwb3J0X2ZyZWUo
dCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBtZW1jcHkodC0+
cmVtb3RlLCAodV9jaGFyICopICYgKGFkZHItPnNpbl9hZGRyLnNfYWRkciksIDQpOwogICAgICAg
IHQtPnJlbW90ZVs0XSA9IChodG9ucyhhZGRyLT5zaW5fcG9ydCkgJiAweGZmMDApID4+IDg7CiAg
ICAgICAgdC0+cmVtb3RlWzVdID0gKGh0b25zKGFkZHItPnNpbl9wb3J0KSAmIDB4MDBmZikgPj4g
MDsKICAgICAgICB0LT5yZW1vdGVfbGVuZ3RoID0gNjsKICAgICAgICBtZW1jcHkodC0+ZGF0YSwg
JmFkZHJfcGFpciwgc2l6ZW9mKG5ldHNubXBfdWRwX2FkZHJfcGFpcikpOwogICAgICAgIHQtPmRh
dGFfbGVuZ3RoID0gc2l6ZW9mKG5ldHNubXBfdWRwX2FkZHJfcGFpcik7CiAgICB9CgogICAgLyoK
ICAgICAqIDE2LWJpdCBsZW5ndGggZmllbGQsIDggYnl0ZSBVRFAgaGVhZGVyLCAyMCBieXRlIElQ
djQgaGVhZGVyICAKICAgICAqLwoKICAgIHQtPm1zZ01heFNpemUgPSAweGZmZmYgLSA4IC0gMjA7
CiAgICB0LT5mX3JlY3YgICAgID0gbmV0c25tcF91ZHBfcmVjdjsKICAgIHQtPmZfc2VuZCAgICAg
PSBuZXRzbm1wX3VkcF9zZW5kOwogICAgdC0+Zl9jbG9zZSAgICA9IG5ldHNubXBfdWRwX2Nsb3Nl
OwogICAgdC0+Zl9hY2NlcHQgICA9IE5VTEw7CiAgICB0LT5mX2ZtdGFkZHIgID0gbmV0c25tcF91
ZHBfZm10YWRkcjsKCiAgICByZXR1cm4gdDsKfQoKCnZvaWQKX25ldHNubXBfdWRwX3NvY2tvcHRf
c2V0KGludCBmZCwgaW50IGxvY2FsKQp7CiNpZmRlZiAgU09fQlNEQ09NUEFUCiAgICAvKgogICAg
ICogUGF0Y2ggZm9yIExpbnV4LiAgV2l0aG91dCB0aGlzLCBVRFAgcGFja2V0cyB0aGF0IGZhaWwg
Z2V0IGFuIElDTVAKICAgICAqIHJlc3BvbnNlLiAgTGludXggdHVybnMgdGhlIGZhaWxlZCBJQ01Q
IHJlc3BvbnNlIGludG8gYW4gZXJyb3IgbWVzc2FnZQogICAgICogYW5kIHJldHVybiB2YWx1ZSwg
dW5saWtlIGFsbCBvdGhlciBPUydzLiAgCiAgICAgKi8KICAgIGlmICgwID09IG5ldHNubXBfb3Nf
cHJlbWF0Y2goIkxpbnV4IiwiMi40IikpCiAgICB7CiAgICAgICAgaW50ICAgICAgICAgICAgIG9u
ZSA9IDE7CiAgICAgICAgREVCVUdNU0dUTCgoInNvY2tldDpvcHRpb24iLCAic2V0dGluZyBzb2Nr
ZXQgb3B0aW9uIFNPX0JTRENPTVBBVFxuIikpOwogICAgICAgIHNldHNvY2tvcHQoZmQsIFNPTF9T
T0NLRVQsIFNPX0JTRENPTVBBVCwgKHZvaWQgKikgJm9uZSwKICAgICAgICAgICAgICAgICAgIHNp
emVvZihvbmUpKTsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKlNPX0JT
RENPTVBBVCAqLwogICAgLyoKICAgICAqIFNPX1JFVVNFQUREUiB3aWxsIGFsbG93IG11bHRpcGxl
IGFwcHMgdG8gb3BlbiB0aGUgc2FtZSBwb3J0IGF0CiAgICAgKiB0aGUgc2FtZSB0aW1lLiBPbmx5
IHRoZSBsYXN0IG9uZSB0byBvcGVuIHRoZSBzb2NrZXQgd2lsbCBnZXQKICAgICAqIGRhdGEuIE9i
dmlvdXNseSwgZm9yIGFuIGFnZW50LCB0aGlzIGlzIGEgYmFkIHRoaW5nLiBUaGVyZSBzaG91bGQK
ICAgICAqIG9ubHkgYmUgb25lIGxpc3RlbmVyLgogICAgICovCiNpZmRlZiBBTExPV19QT1JUX0hJ
SkFDS0lORwojaWZkZWYgIFNPX1JFVVNFQUREUgogICAgLyoKICAgICAqIEFsbG93IHRoZSBzYW1l
IHBvcnQgdG8gYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgZmFpbGluZy4KICAg
ICAqICAgICh1c2VmdWwgZm9yIGEgbGlzdGVuZXIpCiAgICAgKi8KICAgIHsKICAgICAgICBpbnQg
ICAgICAgICAgICAgb25lID0gMTsKICAgICAgICBERUJVR01TR1RMKCgic29ja2V0Om9wdGlvbiIs
ICJzZXR0aW5nIHNvY2tldCBvcHRpb24gU09fUkVVU0VBRERSXG4iKSk7CiAgICAgICAgc2V0c29j
a29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAodm9pZCAqKSAmb25lLAogICAgICAg
ICAgICAgICAgICAgc2l6ZW9mKG9uZSkpOwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8qU09fUkVVU0VBRERSICovCiNlbmRpZgoKICAgIC8qCiAgICAgKiBUcnkgdG8gc2V0
IHRoZSBzZW5kIGFuZCByZWNlaXZlIGJ1ZmZlcnMgdG8gYSByZWFzb25hYmx5IGxhcmdlIHZhbHVl
LCBzbwogICAgICogdGhhdCB3ZSBjYW4gc2VuZCBhbmQgcmVjZWl2ZSBiaWcgUERVcyAoZGVmYXVs
dHMgdG8gODE5MiBieXRlcyAoISkgb24KICAgICAqIFNvbGFyaXMsIGZvciBpbnN0YW5jZSkuICBE
b24ndCB3b3JyeSB0b28gbXVjaCBhYm91dCBlcnJvcnMgLS0ganVzdAogICAgICogcGxvdWdoIG9u
IHJlZ2FyZGxlc3MuICAKICAgICAqLwogICAgbmV0c25tcF9zb2NrX2J1ZmZlcl9zZXQoZmQsIFNP
X1NOREJVRiwgbG9jYWwsIDApOwogICAgbmV0c25tcF9zb2NrX2J1ZmZlcl9zZXQoZmQsIFNPX1JD
VkJVRiwgbG9jYWwsIDApOwp9CgppbnQKbmV0c25tcF9zb2NrYWRkcl9pbjIoc3RydWN0IHNvY2th
ZGRyX2luICphZGRyLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnBlZXJuYW1l
LCBjb25zdCBjaGFyICpkZWZhdWx0X3RhcmdldCkKewojaWYgSEFWRV9HRVRBRERSSU5GTwogICAg
c3RydWN0IGFkZHJpbmZvICphZGRycyA9IE5VTEw7CiAgICBzdHJ1Y3QgYWRkcmluZm8gaGludDsK
ICAgIGludCAgICAgICAgICAgICBlcnI7CiNlbGlmIEhBVkVfR0VUSVBOT0RFQllOQU1FCiAgICBz
dHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIGVycjsKI2VsaWYg
SEFWRV9HRVRIT1NUQllOQU1FCiAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwojZW5kaWYK
CiAgICBpZiAoYWRkciA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgREVC
VUdNU0dUTCgoIm5ldHNubXBfc29ja2FkZHJfaW4iLAogICAgICAgICAgICAgICAgImFkZHIgJXAs
IGlucGVlcm5hbWUgXCIlc1wiLCBkZWZhdWx0X3RhcmdldCBcIiVzXCJcbiIsCiAgICAgICAgICAg
ICAgICBhZGRyLCBpbnBlZXJuYW1lID8gaW5wZWVybmFtZSA6ICJbTklMXSIsCiAgICAgICAgICAg
ICAgICBkZWZhdWx0X3RhcmdldCA/IGRlZmF1bHRfdGFyZ2V0IDogIltOSUxdIikpOwoKICAgIG1l
bXNldChhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CiAgICBhZGRyLT5zaW5f
YWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKICAgIGFkZHItPnNpbl9mYW1pbHkgPSBB
Rl9JTkVUOwogICAgYWRkci0+c2luX3BvcnQgPSBodG9ucygodV9zaG9ydClTTk1QX1BPUlQpOwoK
ICAgIHsKCWludCBwb3J0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9J
RCwKCQkJCSAgICAgIE5FVFNOTVBfRFNfTElCX0RFRkFVTFRfUE9SVCk7CgoJaWYgKHBvcnQgIT0g
MCkgewoJICAgIGFkZHItPnNpbl9wb3J0ID0gaHRvbnMoKHVfc2hvcnQpcG9ydCk7Cgl9IGVsc2Ug
aWYgKGRlZmF1bHRfdGFyZ2V0ICE9IE5VTEwpCgkgICAgbmV0c25tcF9zb2NrYWRkcl9pbjIoYWRk
ciwgZGVmYXVsdF90YXJnZXQsIE5VTEwpOwogICAgfQoKICAgIGlmIChpbnBlZXJuYW1lICE9IE5V
TEwgJiYgKmlucGVlcm5hbWUgIT0gJ1wwJykgewoJY29uc3QgY2hhciAgICAgKmhvc3QsICpwb3J0
OwoJY2hhciAgICAgICAgICAgKnBlZXJuYW1lID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAg
ICAqY3A7CiAgICAgICAgLyoKICAgICAgICAgKiBEdXBsaWNhdGUgdGhlIHBlZXJuYW1lIGJlY2F1
c2Ugd2UgbWlnaHQgd2FudCB0byBtYW5rIGFyb3VuZCB3aXRoCiAgICAgICAgICogaXQuICAKICAg
ICAgICAgKi8KCiAgICAgICAgcGVlcm5hbWUgPSBzdHJkdXAoaW5wZWVybmFtZSk7CiAgICAgICAg
aWYgKHBlZXJuYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoK
ICAgICAgICAvKgogICAgICAgICAqIFRyeSBhbmQgZXh0cmFjdCBhbiBhcHBlbmRlZCBwb3J0IG51
bWJlci4gIAogICAgICAgICAqLwogICAgICAgIGNwID0gc3RyY2hyKHBlZXJuYW1lLCAnOicpOwog
ICAgICAgIGlmIChjcCAhPSBOVUxMKSB7CiAgICAgICAgICAgICpjcCA9ICdcMCc7CiAgICAgICAg
ICAgIHBvcnQgPSBjcCArIDE7CiAgICAgICAgICAgIGhvc3QgPSBwZWVybmFtZTsKICAgICAgICB9
IGVsc2UgewogICAgICAgICAgICBob3N0ID0gTlVMTDsKICAgICAgICAgICAgcG9ydCA9IHBlZXJu
YW1lOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBUcnkgdG8gY29udmVydCB0aGUg
dXNlciBwb3J0IHNwZWNpZmllcgogICAgICAgICAqLwogICAgICAgIGlmIChwb3J0ICYmICpwb3J0
ID09ICdcMCcpCiAgICAgICAgICAgIHBvcnQgPSBOVUxMOwoKICAgICAgICBpZiAocG9ydCAhPSBO
VUxMKSB7CiAgICAgICAgICAgIGxvbmcgaW50IGw7CiAgICAgICAgICAgIGNoYXIqIGVwOwoKICAg
ICAgICAgICAgREVCVUdNU0dUTCgoIm5ldHNubXBfc29ja2FkZHJfaW4iLCAiY2hlY2sgdXNlciBz
ZXJ2aWNlICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBwb3J0KSk7CgogICAgICAgICAg
ICBsID0gc3RydG9sKHBvcnQsICZlcCwgMTApOwogICAgICAgICAgICBpZiAoZXAgIT0gcG9ydCAm
JiAqZXAgPT0gJ1wwJyAmJiAwIDw9IGwgJiYgbCA8PSAweDBmZmZmKQogICAgICAgICAgICAgICAg
YWRkci0+c2luX3BvcnQgPSBodG9ucygodV9zaG9ydClsKTsKICAgICAgICAgICAgZWxzZSB7CiAg
ICAgICAgICAgICAgICBpZiAoaG9zdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgREVC
VUdNU0dUTCgoIm5ldHNubXBfc29ja2FkZHJfaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJzZXJ2bmFtZSBub3QgbnVtZXJpYywgIgoJCQkJImNoZWNrIGlmIGl0IHJlYWxseSBp
cyBhIGRlc3RpbmF0aW9uKSIpKTsKICAgICAgICAgICAgICAgICAgICBob3N0ID0gcG9ydDsKICAg
ICAgICAgICAgICAgICAgICBwb3J0ID0gTlVMTDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm5ldHNubXBfc29ja2FkZHJfaW4iLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2bmFtZSBub3QgbnVtZXJpYyIpKTsKICAg
ICAgICAgICAgICAgICAgICBmcmVlKHBlZXJuYW1lKTsKICAgICAgICAgICAgICAgICAgICByZXR1
cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAg
LyoKICAgICAgICAgKiBUcnkgdG8gY29udmVydCB0aGUgdXNlciBob3N0IHNwZWNpZmllcgogICAg
ICAgICAqLwogICAgICAgIGlmIChob3N0ICYmICpob3N0ID09ICdcMCcpCiAgICAgICAgICAgIGhv
c3QgPSBOVUxMOwoKICAgICAgICBpZiAoaG9zdCAhPSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVH
TVNHVEwoKCJuZXRzbm1wX3NvY2thZGRyX2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgImNo
ZWNrIGRlc3RpbmF0aW9uICVzXG4iLCBob3N0KSk7CgojaWYgSEFWRV9HRVRBRERSSU5GTwogICAg
ICAgICAgICBtZW1zZXQoJmhpbnQsIDAsIHNpemVvZiBoaW50KTsKICAgICAgICAgICAgaGludC5h
aV9mbGFncyA9IDA7CiAgICAgICAgICAgIGhpbnQuYWlfZmFtaWx5ID0gUEZfSU5FVDsKICAgICAg
ICAgICAgaGludC5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CiAgICAgICAgICAgIGhpbnQuYWlf
cHJvdG9jb2wgPSAwOwoKICAgICAgICAgICAgZXJyID0gZ2V0YWRkcmluZm8ocGVlcm5hbWUsIE5V
TEwsICZoaW50LCAmYWRkcnMpOwogICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKI2lmIEhBVkVf
R0FJX1NUUkVSUk9SCiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiZ2V0YWRkcmlu
Zm86ICVzICVzXG4iLCBwZWVybmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGdhaV9zdHJl
cnJvcihlcnIpKTsKI2Vsc2UKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJnZXRh
ZGRyaW5mbzogJXMgKGVycm9yICVkKVxuIiwgcGVlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAg
ICAgICBlcnIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGZyZWUocGVlcm5hbWUpOwogICAgICAg
ICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFkZHJzICE9
IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX3NvY2thZGRyX2lu
IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAocmVzb2x2ZWQgb2theSlc
biIpKTsKICAgICAgICAgICAgICAgIG1lbWNweSgmYWRkci0+c2luX2FkZHIsCiAgICAgICAgICAg
ICAgICAgICAgICAgJigoc3RydWN0IHNvY2thZGRyX2luICopIGFkZHJzLT5haV9hZGRyKS0+c2lu
X2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CiAg
ICAgICAgICAgICAgICBmcmVlYWRkcmluZm8oYWRkcnMpOwogICAgICAgICAgICB9CiAgICAgICAg
ICAgIGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm5ldHNubXBfc29ja2FkZHJf
aW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlIElQdjQg
aG9zdG5hbWVcbiIpKTsKICAgICAgICAgICAgfQojZWxpZiBIQVZFX0dFVEhPU1RCWU5BTUUKICAg
ICAgICAgICAgaHAgPSBnZXRob3N0YnluYW1lKGhvc3QpOwogICAgICAgICAgICBpZiAoaHAgPT0g
TlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm5ldHNubXBfc29ja2FkZHJfaW4i
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChjb3VsZG4ndCByZXNvbHZl
KVxuIikpOwogICAgICAgICAgICAgICAgZnJlZShwZWVybmFtZSk7CiAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChocC0+aF9hZGRydHlwZSAhPSBBRl9JTkVU
KSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibmV0c25tcF9zb2NrYWRkcl9pbiIsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKG5vdCBBRl9JTkVUISlcbiIpKTsK
ICAgICAgICAgICAgICAgIGZyZWUocGVlcm5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7
CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibmV0c25t
cF9zb2NrYWRkcl9pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKHJl
c29sdmVkIG9rYXkpXG4iKSk7CiAgICAgICAgICAgICAgICBtZW1jcHkoJmFkZHItPnNpbl9hZGRy
LCBocC0+aF9hZGRyLCBocC0+aF9sZW5ndGgpOwogICAgICAgICAgICB9CiNlbGlmIEhBVkVfR0VU
SVBOT0RFQllOQU1FCiAgICAgICAgICAgIGhwID0gZ2V0aXBub2RlYnluYW1lKHBlZXJuYW1lLCBB
Rl9JTkVULCAwLCAmZXJyKTsKICAgICAgICAgICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICAg
ICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX3NvY2thZGRyX2luIiwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJob3N0bmFtZSAoY291bGRuJ3QgcmVzb2x2ZSA9ICVkKVxuIiwgZXJyKSk7
CiAgICAgICAgICAgICAgICBmcmVlKHBlZXJuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiAw
OwogICAgICAgICAgICB9CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX3NvY2thZGRy
X2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChyZXNvbHZlZCBva2F5KVxu
IikpOwogICAgICAgICAgICBtZW1jcHkoJihhZGRyLT5zaW5fYWRkciksIGhwLT5oX2FkZHIsIGhw
LT5oX2xlbmd0aCk7CiNlbHNlIC8qIEhBVkVfR0VUSVBOT0RFQllOQU1FICovCiAgICAgICAgICAg
IC8qCiAgICAgICAgICAgICAqIFRoZXJlIGlzIG5vIG5hbWUgcmVzb2x2aW5nIGZ1bmN0aW9uIGF2
YWlsYWJsZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1w
X3NvY2thZGRyX2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGdldGFkZHJpbmZvKCkv
Z2V0aXBub2RlYnluYW1lKCkvZ2V0aG9zdGJ5bmFtZSgpXG4iKSk7CiAgICAgICAgICAgIGZyZWUo
cGVlcm5hbWUpOwogICAgICAgICAgICByZXR1cm4gMDsKI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZ
TkFNRSAqLwogICAgICAgIH0KCWZyZWUocGVlcm5hbWUpOwogICAgfQoKICAgIC8qCiAgICAgKiBG
aW5pc2hlZAogICAgICovCgogICAgREVCVUdNU0dUTCgoIm5ldHNubXBfc29ja2FkZHJfaW4iLCAi
cmV0dXJuIHsgQUZfSU5FVCwgJXM6JWh1IH1cbiIsCiAgICAgICAgICAgICAgICBpbmV0X250b2Eo
YWRkci0+c2luX2FkZHIpLCBudG9ocyhhZGRyLT5zaW5fcG9ydCkpKTsKICAgIHJldHVybiAxOwp9
CgoKaW50Cm5ldHNubXBfc29ja2FkZHJfaW4oc3RydWN0IHNvY2thZGRyX2luICphZGRyLAogICAg
ICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlucGVlcm5hbWUsIGludCByZW1vdGVfcG9ydCkK
ewogICAgY2hhciBidWZbc2l6ZW9mKGludCkgKiAzICsgMl07CiAgICBzcHJpbnRmKGJ1ZiwgIjol
dSIsIHJlbW90ZV9wb3J0KTsKICAgIHJldHVybiBuZXRzbm1wX3NvY2thZGRyX2luMihhZGRyLCBp
bnBlZXJuYW1lLCByZW1vdGVfcG9ydCA/IGJ1ZiA6IE5VTEwpOwp9CgojaWYgIWRlZmluZWQoTkVU
U05NUF9ESVNBQkxFX1NOTVBWMSkgfHwgIWRlZmluZWQoTkVUU05NUF9ESVNBQkxFX1NOTVBWMkMp
Ci8qCiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgdGhlICJjb20yc2VjIiBjb25m
aWd1cmF0aW9uIHRva2VuCiAqIGZ1bmN0aW9uYWxpdHkgZm9yIGNvbXBhdGliaWxpdHkuICAKICov
CgojZGVmaW5lIEVYQU1QTEVfTkVUV09SSwkJIk5FVFdPUksiCiNkZWZpbmUgRVhBTVBMRV9DT01N
VU5JVFkJIkNPTU1VTklUWSIKCnR5cGVkZWYgc3RydWN0IF9jb20yU2VjRW50cnkgewogICAgY2hh
ciAgICAgICAgICAgIGNvbW11bml0eVtDT01NVU5JVFlfTUFYX0xFTl07CiAgICB1bnNpZ25lZCBs
b25nICAgbmV0d29yazsKICAgIHVuc2lnbmVkIGxvbmcgICBtYXNrOwogICAgY2hhciAgICAgICAg
ICAgIHNlY05hbWVbVkFDTVNUUklOR0xFTl07CiAgICBjaGFyICAgICAgICAgICAgY29udGV4dE5h
bWVbVkFDTVNUUklOR0xFTl07CiAgICBzdHJ1Y3QgX2NvbTJTZWNFbnRyeSAqbmV4dDsKfSBjb20y
U2VjRW50cnk7Cgpjb20yU2VjRW50cnkgICAqY29tMlNlY0xpc3QgPSBOVUxMLCAqY29tMlNlY0xp
c3RMYXN0ID0gTlVMTDsKCnZvaWQKbmV0c25tcF91ZHBfcGFyc2Vfc2VjdXJpdHkoY29uc3QgY2hh
ciAqdG9rZW4sIGNoYXIgKnBhcmFtKQp7CiAgICBjaGFyICAgICAgICAgICAgc2VjTmFtZVtWQUNN
U1RSSU5HTEVOXTsKICAgIGNoYXIgICAgICAgICAgICBjb250ZXh0TmFtZVtWQUNNU1RSSU5HTEVO
XTsKICAgIGNoYXIgICAgICAgICAgICBjb21tdW5pdHlbQ09NTVVOSVRZX01BWF9MRU5dOwogICAg
Y2hhciAgICAgICAgICAgIHNvdXJjZVtTTk1QX01BWEJVRl9TTUFMTF07CiAgICBjaGFyICAgICAg
ICAgICAqY3AgPSBOVUxMOwogICAgY29uc3QgY2hhciAgICAgKnN0cm1hc2sgPSBOVUxMOwogICAg
Y29tMlNlY0VudHJ5ICAgKmUgPSBOVUxMOwogICAgaW5fYWRkcl90ICAgbmV0d29yayA9IDAsIG1h
c2sgPSAwOwoKICAgIC8qCiAgICAgKiBHZXQgc2VjdXJpdHksIHNvdXJjZSBhZGRyZXNzL25ldG1h
c2sgYW5kIGNvbW11bml0eSBzdHJpbmdzLiAgCiAgICAgKi8KCiAgICBjcCA9IGNvcHlfbndvcmQo
IHBhcmFtLCBzZWNOYW1lLCBzaXplb2Yoc2VjTmFtZSkpOwogICAgaWYgKHN0cmNtcChzZWNOYW1l
LCAiLUNuIikgPT0gMCkgewogICAgICAgIGlmICghY3ApIHsKICAgICAgICAgICAgY29uZmlnX3Bl
cnJvcigibWlzc2luZyBDT05URVhUX05BTUUgcGFyYW1ldGVyIik7CiAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICB9CiAgICAgICAgY3AgPSBjb3B5X253b3JkKCBjcCwgY29udGV4dE5hbWUsIHNp
emVvZihjb250ZXh0TmFtZSkpOwogICAgICAgIGNwID0gY29weV9ud29yZCggY3AsIHNlY05hbWUs
IHNpemVvZihzZWNOYW1lKSk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnRleHROYW1lWzBdID0g
J1wwJzsKICAgIH0KICAgIGlmIChzZWNOYW1lWzBdID09ICdcMCcpIHsKICAgICAgICBjb25maWdf
cGVycm9yKCJtaXNzaW5nIE5BTUUgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBl
bHNlIGlmIChzdHJsZW4oc2VjTmFtZSkgPiAoVkFDTVNUUklOR0xFTiAtIDEpKSB7CiAgICAgICAg
Y29uZmlnX3BlcnJvcigic2VjdXJpdHkgbmFtZSB0b28gbG9uZyIpOwogICAgICAgIHJldHVybjsK
ICAgIH0KICAgIGNwID0gY29weV9ud29yZCggY3AsIHNvdXJjZSwgc2l6ZW9mKHNvdXJjZSkpOwog
ICAgaWYgKHNvdXJjZVswXSA9PSAnXDAnKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWlzc2lu
ZyBTT1VSQ0UgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChzdHJu
Y21wKHNvdXJjZSwgRVhBTVBMRV9ORVRXT1JLLCBzdHJsZW4oRVhBTVBMRV9ORVRXT1JLKSkgPT0K
ICAgICAgICAgICAgICAgMCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoImV4YW1wbGUgY29uZmln
IE5FVFdPUksgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQiKTsKICAgICAgICByZXR1cm47CiAgICB9
CiAgICBjcCA9IGNvcHlfbndvcmQoIGNwLCBjb21tdW5pdHksIHNpemVvZihjb21tdW5pdHkpKTsK
ICAgIGlmIChjb21tdW5pdHlbMF0gPT0gJ1wwJykgewogICAgICAgIGNvbmZpZ19wZXJyb3IoIm1p
c3NpbmcgQ09NTVVOSVRZIHBhcmFtZXRlclxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNl
CiAgICAgICAgaWYgKHN0cm5jbXAKICAgICAgICAgICAgKGNvbW11bml0eSwgRVhBTVBMRV9DT01N
VU5JVFksIHN0cmxlbihFWEFNUExFX0NPTU1VTklUWSkpCiAgICAgICAgICAgID09IDApIHsKICAg
ICAgICBjb25maWdfcGVycm9yKCJleGFtcGxlIGNvbmZpZyBDT01NVU5JVFkgbm90IHByb3Blcmx5
IGNvbmZpZ3VyZWQiKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKHN0cmxlbihjb21t
dW5pdHkpID4gKENPTU1VTklUWV9NQVhfTEVOIC0gMSkpIHsKICAgICAgICBjb25maWdfcGVycm9y
KCJjb21tdW5pdHkgbmFtZSB0b28gbG9uZyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAv
KgogICAgICogUHJvY2VzcyB0aGUgc291cmNlIGFkZHJlc3MvbmV0bWFzayBzdHJpbmcuICAKICAg
ICAqLwoKICAgIGNwID0gc3RyY2hyKHNvdXJjZSwgJy8nKTsKICAgIGlmIChjcCAhPSBOVUxMKSB7
CiAgICAgICAgLyoKICAgICAgICAgKiBNYXNrIGdpdmVuLiAgCiAgICAgICAgICovCiAgICAgICAg
KmNwID0gJ1wwJzsKICAgICAgICBzdHJtYXNrID0gY3AgKyAxOwogICAgfQoKICAgIC8qCiAgICAg
KiBEZWFsIHdpdGggdGhlIG5ldHdvcmsgcGFydCBmaXJzdC4gIAogICAgICovCgogICAgaWYgKChz
dHJjbXAoc291cmNlLCAiZGVmYXVsdCIpID09IDApCiAgICAgICAgfHwgKHN0cmNtcChzb3VyY2Us
ICIwLjAuMC4wIikgPT0gMCkpIHsKICAgICAgICBuZXR3b3JrID0gMDsKICAgICAgICBzdHJtYXNr
ID0gIjAuMC4wLjAiOwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIFRyeSBpbnRl
cnByZXRpbmcgYXMgYSBkb3R0ZWQgcXVhZC4gIAogICAgICAgICAqLwogICAgICAgIG5ldHdvcmsg
PSBpbmV0X2FkZHIoc291cmNlKTsKCiAgICAgICAgaWYgKG5ldHdvcmsgPT0gKGluX2FkZHJfdCkg
LTEpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTm9wZSwgd2Fzbid0IGEgZG90dGVk
IHF1YWQuICBNdXN0IGJlIGEgaG9zdG5hbWUuICAKICAgICAgICAgICAgICovCiNpZmRlZiAgSEFW
RV9HRVRIT1NUQllOQU1FCiAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IGdldGhvc3Ri
eW5hbWUoc291cmNlKTsKICAgICAgICAgICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICAgICAg
ICAgIGNvbmZpZ19wZXJyb3IoImJhZCBzb3VyY2UgYWRkcmVzcyIpOwogICAgICAgICAgICAgICAg
cmV0dXJuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGhwLT5oX2Fk
ZHJ0eXBlICE9IEFGX0lORVQpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdfcGVycm9yKCJu
byBJUCBhZGRyZXNzIGZvciBzb3VyY2UgaG9zdG5hbWUiKTsKICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXR3b3JrID0gKigoaW5f
YWRkcl90ICopIGhwLT5oX2FkZHIpOwogICAgICAgICAgICB9CiNlbHNlICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLypIQVZFX0dFVEhPU1RCWU5BTUUgKi8KICAgICAgICAgICAgLyoKICAgICAg
ICAgICAgICogT2ggZGVhci4gIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29uZmlnX3Bl
cnJvcigiY2Fubm90IHJlc29sdmUgc291cmNlIGhvc3RuYW1lIik7CiAgICAgICAgICAgIHJldHVy
bjsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKkhBVkVfR0VUSE9TVEJZTkFNRSAq
LwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogTm93IHdvcmsgb3V0IHRoZSBtYXNrLiAg
CiAgICAgKi8KCiAgICBpZiAoc3RybWFzayA9PSBOVUxMIHx8ICpzdHJtYXNrID09ICdcMCcpIHsK
ICAgICAgICAvKgogICAgICAgICAqIE5vIG1hc2sgd2FzIGdpdmVuLiAgVXNlIDI1NS4yNTUuMjU1
LjI1NS4gIAogICAgICAgICAqLwogICAgICAgIG1hc2sgPSAweGZmZmZmZmZmTDsKICAgIH0gZWxz
ZSB7CiAgICAgICAgaWYgKHN0cmNocihzdHJtYXNrLCAnLicpKSB7CiAgICAgICAgICAgIC8qCiAg
ICAgICAgICAgICAqIFRyeSB0byBpbnRlcnByZXQgbWFzayBhcyBhIGRvdHRlZCBxdWFkLiAgCiAg
ICAgICAgICAgICAqLwogICAgICAgICAgICBtYXNrID0gaW5ldF9hZGRyKHN0cm1hc2spOwogICAg
ICAgICAgICBpZiAobWFzayA9PSAoaW5fYWRkcl90KSAtMSAmJgogICAgICAgICAgICAgICAgc3Ry
bmNtcChzdHJtYXNrLCAiMjU1LjI1NS4yNTUuMjU1IiwgMTUpICE9IDApIHsKICAgICAgICAgICAg
ICAgIGNvbmZpZ19wZXJyb3IoImJhZCBtYXNrIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAg
ICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAg
KiBUcnkgdG8gaW50ZXJwcmV0IG1hc2sgYXMgYSAibnVtYmVyIG9mIDEgYml0cyIuICAKICAgICAg
ICAgICAgICovCiAgICAgICAgICAgIGludCAgICAgICAgICAgICBtYXNrTGVuID0gYXRvaShzdHJt
YXNrKSwgbWFza0JpdCA9IDB4ODAwMDAwMDBMOwogICAgICAgICAgICBpZiAobWFza0xlbiA8PSAw
IHx8IG1hc2tMZW4gPiAzMikgewogICAgICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiYmFkIG1h
c2sgbGVuZ3RoIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAg
ICAgICAgd2hpbGUgKG1hc2tMZW4tLSkgewogICAgICAgICAgICAgICAgbWFzayB8PSBtYXNrQml0
OwogICAgICAgICAgICAgICAgbWFza0JpdCA+Pj0gMTsKICAgICAgICAgICAgfQogICAgICAgICAg
ICBtYXNrID0gaHRvbmwobWFzayk7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBDaGVj
ayB0aGF0IHRoZSBuZXR3b3JrIGFuZCBtYXNrIGFyZSBjb25zaXN0ZW50LiAgCiAgICAgKi8KCiAg
ICBpZiAobmV0d29yayAmIH5tYXNrKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigic291cmNlL21h
c2sgbWlzbWF0Y2giKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZSA9IChjb20yU2VjRW50
cnkgKikgbWFsbG9jKHNpemVvZihjb20yU2VjRW50cnkpKTsKICAgIGlmIChlID09IE5VTEwpIHsK
ICAgICAgICBjb25maWdfcGVycm9yKCJtZW1vcnkgZXJyb3IiKTsKICAgICAgICByZXR1cm47CiAg
ICB9CgogICAgLyoKICAgICAqIEV2ZXJ5dGhpbmcgaXMgb2theS4gIENvcHkgdGhlIHBhcmFtZXRl
cnMgdG8gdGhlIHN0cnVjdHVyZSBhbGxvY2F0ZWQKICAgICAqIGFib3ZlIGFuZCBhZGQgaXQgdG8g
RU5EIG9mIHRoZSBsaXN0LiAgCiAgICAgKi8KCiAgICBERUJVR01TR1RMKCgibmV0c25tcF91ZHBf
cGFyc2Vfc2VjdXJpdHkiLAogICAgICAgICAgICAgICAgIjxcIiVzXCIsIDB4JTA4eC8weCUwOHg+
ID0+IFwiJXNcIlxuIiwgY29tbXVuaXR5LCBuZXR3b3JrLAogICAgICAgICAgICAgICAgbWFzaywg
c2VjTmFtZSkpOwoKICAgIHN0cmNweShlLT5jb250ZXh0TmFtZSwgY29udGV4dE5hbWUpOwogICAg
c3RyY3B5KGUtPnNlY05hbWUsIHNlY05hbWUpOwogICAgc3RyY3B5KGUtPmNvbW11bml0eSwgY29t
bXVuaXR5KTsKICAgIGUtPm5ldHdvcmsgPSBuZXR3b3JrOwogICAgZS0+bWFzayA9IG1hc2s7CiAg
ICBlLT5uZXh0ID0gTlVMTDsKCiAgICBpZiAoY29tMlNlY0xpc3RMYXN0ICE9IE5VTEwpIHsKICAg
ICAgICBjb20yU2VjTGlzdExhc3QtPm5leHQgPSBlOwogICAgICAgIGNvbTJTZWNMaXN0TGFzdCA9
IGU7CiAgICB9IGVsc2UgewogICAgICAgIGNvbTJTZWNMaXN0TGFzdCA9IGNvbTJTZWNMaXN0ID0g
ZTsKICAgIH0KfQoKCnZvaWQKbmV0c25tcF91ZHBfY29tMlNlY0xpc3RfZnJlZSh2b2lkKQp7CiAg
ICBjb20yU2VjRW50cnkgICAqZSA9IGNvbTJTZWNMaXN0OwogICAgd2hpbGUgKGUgIT0gTlVMTCkg
ewogICAgICAgIGNvbTJTZWNFbnRyeSAgICp0bXAgPSBlOwogICAgICAgIGUgPSBlLT5uZXh0Owog
ICAgICAgIGZyZWUodG1wKTsKICAgIH0KICAgIGNvbTJTZWNMaXN0ID0gY29tMlNlY0xpc3RMYXN0
ID0gTlVMTDsKfQojZW5kaWYgLyogc3VwcG9ydCBmb3IgY29tbXVuaXR5IGJhc2VkIFNOTVAgKi8K
CnZvaWQKbmV0c25tcF91ZHBfYWdlbnRfY29uZmlnX3Rva2Vuc19yZWdpc3Rlcih2b2lkKQp7CiNp
ZiAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYxKSB8fCAhZGVmaW5lZChORVRTTk1QX0RJ
U0FCTEVfU05NUFYyQykKICAgIHJlZ2lzdGVyX2FwcF9jb25maWdfaGFuZGxlcigiY29tMnNlYyIs
IG5ldHNubXBfdWRwX3BhcnNlX3NlY3VyaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5ldHNubXBfdWRwX2NvbTJTZWNMaXN0X2ZyZWUsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIlstQ24gQ09OVEVYVF0gc2VjTmFtZSBJUHY0LW5ldHdvcmstYWRkcmVzc1svbmV0
bWFza10gY29tbXVuaXR5Iik7CiNlbmRpZiAvKiBzdXBwb3J0IGZvciBjb21tdW5pdHkgYmFzZWQg
U05NUCAqLwp9CgoKCi8qCiAqIFJldHVybiAwIGlmIHRoZXJlIGFyZSBubyBjb20yc2VjIGVudHJp
ZXMsIG9yIHJldHVybiAxIGlmIHRoZXJlIEFSRSBjb20yc2VjIAogKiBlbnRyaWVzLiAgT24gcmV0
dXJuLCBpZiBhIGNvbTJzZWMgZW50cnkgbWF0Y2hlZCB0aGUgcGFzc2VkIHBhcmFtZXRlcnMsCiAq
IHRoZW4gKnNlY05hbWUgcG9pbnRzIGF0IHRoZSBhcHByb3ByaWF0ZSBzZWN1cml0eSBuYW1lLCBv
ciBpcyBOVUxMIGlmIHRoZQogKiBwYXJhbWV0ZXJzIGRpZCBub3QgbWF0Y2ggYW55IGNvbTJzZWMg
ZW50cnkuICAKICovCgojaWYgIWRlZmluZWQoTkVUU05NUF9ESVNBQkxFX1NOTVBWMSkgfHwgIWRl
ZmluZWQoTkVUU05NUF9ESVNBQkxFX1NOTVBWMkMpCmludApuZXRzbm1wX3VkcF9nZXRTZWNOYW1l
KHZvaWQgKm9wYXF1ZSwgaW50IG9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
Y2hhciAqY29tbXVuaXR5LAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb21tdW5pdHlf
bGVuLCBjaGFyICoqc2VjTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqY29udGV4
dE5hbWUpCnsKICAgIGNvbTJTZWNFbnRyeSAgICpjOwogICAgbmV0c25tcF91ZHBfYWRkcl9wYWly
ICphZGRyX3BhaXIgPSAobmV0c25tcF91ZHBfYWRkcl9wYWlyICopIG9wYXF1ZTsKICAgIHN0cnVj
dCBzb2NrYWRkcl9pbiAqZnJvbSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihhZGRyX3BhaXIt
PnJlbW90ZV9hZGRyKTsKICAgIGNoYXIgICAgICAgICAgICp6dGNvbW11bml0eSA9IE5VTEw7Cgog
ICAgaWYgKHNlY05hbWUgIT0gTlVMTCkgewogICAgICAgICpzZWNOYW1lID0gTlVMTDsgIC8qIEhh
dmVuJ3QgZm91bmQgYW55dGhpbmcgeWV0ICovCiAgICB9CgogICAgLyoKICAgICAqIFNwZWNpYWwg
Y2FzZSBpZiB0aGVyZSBhcmUgTk8gZW50cmllcyAoYXMgb3Bwb3NlZCB0byBubyBNQVRDSElORwog
ICAgICogZW50cmllcykuICAKICAgICAqLwoKICAgIGlmIChjb20yU2VjTGlzdCA9PSBOVUxMKSB7
CiAgICAgICAgREVCVUdNU0dUTCgoIm5ldHNubXBfdWRwX2dldFNlY05hbWUiLCAibm8gY29tMnNl
YyBlbnRyaWVzXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIElm
IHRoZXJlIGlzIG5vIElQdjQgc291cmNlIGFkZHJlc3MsIHRoZW4gdGhlcmUgY2FuIGJlIG5vIHZh
bGlkIHNlY3VyaXR5CiAgICAgKiBuYW1lLiAgCiAgICAgKi8KCiAgICBpZiAob3BhcXVlID09IE5V
TEwgfHwgb2xlbmd0aCAhPSBzaXplb2YobmV0c25tcF91ZHBfYWRkcl9wYWlyKSB8fAogICAgICAg
IGZyb20tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgewogICAgICAgIERFQlVHTVNHVEwoKCJuZXRz
bm1wX3VkcF9nZXRTZWNOYW1lIiwKCQkgICAgIm5vIElQdjQgc291cmNlIGFkZHJlc3MgaW4gUERV
P1xuIikpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIERFQlVHSUYoIm5ldHNubXBfdWRw
X2dldFNlY05hbWUiKSB7Cgl6dGNvbW11bml0eSA9IChjaGFyICopbWFsbG9jKGNvbW11bml0eV9s
ZW4gKyAxKTsKCWlmICh6dGNvbW11bml0eSAhPSBOVUxMKSB7CgkgICAgbWVtY3B5KHp0Y29tbXVu
aXR5LCBjb21tdW5pdHksIGNvbW11bml0eV9sZW4pOwoJICAgIHp0Y29tbXVuaXR5W2NvbW11bml0
eV9sZW5dID0gJ1wwJzsKCX0KCglERUJVR01TR1RMKCgibmV0c25tcF91ZHBfZ2V0U2VjTmFtZSIs
ICJyZXNvbHZlIDxcIiVzXCIsIDB4JTA4eD5cbiIsCgkJICAgIHp0Y29tbXVuaXR5ID8genRjb21t
dW5pdHkgOiAiPG1hbGxvYyBlcnJvcj4iLAoJCSAgICBmcm9tLT5zaW5fYWRkci5zX2FkZHIpKTsK
ICAgIH0KCiAgICBmb3IgKGMgPSBjb20yU2VjTGlzdDsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dCkg
ewogICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX3VkcF9nZXRTZWNOYW1lIiwiY29tcGFyZSA8
XCIlc1wiLCAweCUwOHgvMHglMDh4PiIsCgkJICAgIGMtPmNvbW11bml0eSwgYy0+bmV0d29yaywg
Yy0+bWFzaykpOwogICAgICAgIGlmICgoY29tbXVuaXR5X2xlbiA9PSBzdHJsZW4oYy0+Y29tbXVu
aXR5KSkgJiYKCSAgICAobWVtY21wKGNvbW11bml0eSwgYy0+Y29tbXVuaXR5LCBjb21tdW5pdHlf
bGVuKSA9PSAwKSAmJgogICAgICAgICAgICAoKGZyb20tPnNpbl9hZGRyLnNfYWRkciAmIGMtPm1h
c2spID09IGMtPm5ldHdvcmspKSB7CiAgICAgICAgICAgIERFQlVHTVNHKCgibmV0c25tcF91ZHBf
Z2V0U2VjTmFtZSIsICIuLi4gU1VDQ0VTU1xuIikpOwogICAgICAgICAgICBpZiAoc2VjTmFtZSAh
PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAqc2VjTmFtZSA9IGMtPnNlY05hbWU7CiAgICAgICAg
ICAgICAgICAqY29udGV4dE5hbWUgPSBjLT5jb250ZXh0TmFtZTsKICAgICAgICAgICAgfQogICAg
ICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgREVCVUdNU0coKCJuZXRzbm1wX3VkcF9n
ZXRTZWNOYW1lIiwgIi4uLiBub3BlXG4iKSk7CiAgICB9CiAgICBpZiAoenRjb21tdW5pdHkgIT0g
TlVMTCkgewogICAgICAgIGZyZWUoenRjb21tdW5pdHkpOwogICAgfQogICAgcmV0dXJuIDE7Cn0K
I2VuZGlmIC8qIHN1cHBvcnQgZm9yIGNvbW11bml0eSBiYXNlZCBTTk1QICovCgoKbmV0c25tcF90
cmFuc3BvcnQgKgpuZXRzbm1wX3VkcF9jcmVhdGVfdHN0cmluZyhjb25zdCBjaGFyICpzdHIsIGlu
dCBsb2NhbCwKCQkJICAgY29uc3QgY2hhciAqZGVmYXVsdF90YXJnZXQpCnsKICAgIHN0cnVjdCBz
b2NrYWRkcl9pbiBhZGRyOwoKICAgIGlmIChuZXRzbm1wX3NvY2thZGRyX2luMigmYWRkciwgc3Ry
LCBkZWZhdWx0X3RhcmdldCkpIHsKICAgICAgICByZXR1cm4gbmV0c25tcF91ZHBfdHJhbnNwb3J0
KCZhZGRyLCBsb2NhbCk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQp9
CgoKbmV0c25tcF90cmFuc3BvcnQgKgpuZXRzbm1wX3VkcF9jcmVhdGVfb3N0cmluZyhjb25zdCB1
X2NoYXIgKiBvLCBzaXplX3Qgb19sZW4sIGludCBsb2NhbCkKewogICAgc3RydWN0IHNvY2thZGRy
X2luIGFkZHI7CgogICAgaWYgKG9fbGVuID09IDYpIHsKICAgICAgICB1bnNpZ25lZCBzaG9ydCBw
b3J0dG1wID0gKG9bNF0gPDwgOCkgKyBvWzVdOwogICAgICAgIGFkZHIuc2luX2ZhbWlseSA9IEFG
X0lORVQ7CiAgICAgICAgbWVtY3B5KCh1X2NoYXIgKikgJiAoYWRkci5zaW5fYWRkci5zX2FkZHIp
LCBvLCA0KTsKICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydHRtcCk7CiAgICAgICAg
cmV0dXJuIG5ldHNubXBfdWRwX3RyYW5zcG9ydCgmYWRkciwgbG9jYWwpOwogICAgfQogICAgcmV0
dXJuIE5VTEw7Cn0KCgp2b2lkCm5ldHNubXBfdWRwX2N0b3Iodm9pZCkKewogICAgdWRwRG9tYWlu
Lm5hbWUgPSBuZXRzbm1wVURQRG9tYWluOwogICAgdWRwRG9tYWluLm5hbWVfbGVuZ3RoID0gbmV0
c25tcFVEUERvbWFpbl9sZW47CiAgICB1ZHBEb21haW4ucHJlZml4ID0gKGNvbnN0IGNoYXIqKilj
YWxsb2MoMiwgc2l6ZW9mKGNoYXIgKikpOwogICAgdWRwRG9tYWluLnByZWZpeFswXSA9ICJ1ZHAi
OwoKICAgIHVkcERvbWFpbi5mX2NyZWF0ZV9mcm9tX3RzdHJpbmdfbmV3ID0gbmV0c25tcF91ZHBf
Y3JlYXRlX3RzdHJpbmc7CiAgICB1ZHBEb21haW4uZl9jcmVhdGVfZnJvbV9vc3RyaW5nID0gbmV0
c25tcF91ZHBfY3JlYXRlX29zdHJpbmc7CgogICAgbmV0c25tcF90ZG9tYWluX3JlZ2lzdGVyKCZ1
ZHBEb21haW4pOwp9Cg==
</data>        

          </attachment>
    </bug>

</bugzilla>