<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>45416</bug_id>
          
          <creation_ts>2010-09-08 15:50:34 -0700</creation_ts>
          <short_desc>Allow Chromium port to link with system-provided SQLite</short_desc>
          <delta_ts>2013-04-11 12:40:10 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</resolution>
          
          
          <bug_file_loc>http://code.google.com/p/chromium/issues/detail?id=22208</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Paweł Hajdan, Jr.">phajdan.jr</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>dumi</cc>
    
    <cc>evan</cc>
    
    <cc>michaeln</cc>
    
    <cc>schenney</cc>
    
    <cc>tony</cc>
    
    <cc>wangxianzhu</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>276134</commentid>
    <comment_count>0</comment_count>
    <who name="Paweł Hajdan, Jr.">phajdan.jr</who>
    <bug_when>2010-09-08 15:50:34 -0700</bug_when>
    <thetext>It should be possible to link the Chromium port with system-provided SQLite on Linux. Currently it relies on added chromium_sqlite3 hacks.

out/Release/obj/app/libapp_base.a(connection.o): In function
`sql::Connection::Preload()&apos;:
connection.cc:(.text._ZN3sql10Connection7PreloadEv+0xcb): undefined
reference to `sqlite3Preload&apos;
out/Release/obj/webkit/libwebcore.a(SQLiteFileSystemChromiumPosix.o): In
function `(anonymous namespace)::chromiumOpen(sqlite3_vfs*, char const*,
sqlite3_file*, int, int*)&apos;:
SQLiteFileSystemChromiumPosix.cpp:(.text._ZN12_GLOBAL__N_112chromiumOpenEP11sqlite3_vfsPKcP12sqlite3_fileiPi+0x3a):
undefined reference to `initUnixFile&apos;
SQLiteFileSystemChromiumPosix.cpp:(.text._ZN12_GLOBAL__N_112chromiumOpenEP11sqlite3_vfsPKcP12sqlite3_fileiPi+0xfd):
undefined reference to `fillInUnixFile&apos;

For more info see http://code.google.com/p/chromium/issues/detail?id=22208</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276139</commentid>
    <comment_count>1</comment_count>
      <attachid>66952</attachid>
    <who name="Paweł Hajdan, Jr.">phajdan.jr</who>
    <bug_when>2010-09-08 15:55:39 -0700</bug_when>
    <thetext>Created attachment 66952
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279928</commentid>
    <comment_count>2</comment_count>
      <attachid>66952</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-09-15 20:34:33 -0700</bug_when>
    <thetext>Comment on attachment 66952
patch

View in context: https://bugs.webkit.org/attachment.cgi?id=66952&amp;action=prettypatch

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:46
&gt;  // Chromium&apos;s Posix implementation of SQLite VFS
we should probably mention here that this code was mostly copy-pasted from os_unix.c.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:47
&gt;  namespace {
webkit prefers static functions/structs over anonymous namespaces.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:120
&gt; +    
no need for empty line.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:127
&gt; +    
no need for empty line.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:131
&gt; +            || (sqliteIOErr == SQLITE_IOERR_UNLOCK)
keep || at the end of lines. i know the webkit style guide says to put them at the beginning of the line, but there&apos;s a lot of code that violates this rule, and i&apos;ve never seen it enforced.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:133
&gt; +            || (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK)) {
no need for {}.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:139
&gt; +    
no need for empty line.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:142
&gt; +    
no need for empty line.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:205
&gt; +    struct stat statbuf;
don&apos;t think you need &apos;struct&apos; here (but i might be wrong).

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:316
&gt; +        } else if (lock.l_type != F_UNLCK) {
no need for {}.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:330
&gt; +    struct flock lock;
don&apos;t think we need &apos;struct&apos;.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:334
&gt; +    lock.l_len = SQLiteSharedSize;
why is there no case for (pFile-&gt;fileFlags &amp; SQLITE_WHOLE_FILE_LOCKING != 0)?

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:409
&gt; +        &amp;&amp; (pLock-&gt;locktype &gt;= SQLITE_LOCK_PENDING || locktype &gt; SQLITE_LOCK_SHARED)) {
move &amp;&amp; to the end of the previous line. also, no need for {}.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:416
&gt; +        &amp;&amp; (pLock-&gt;locktype == SQLITE_LOCK_SHARED || pLock-&gt;locktype == SQLITE_LOCK_RESERVED)) {
&amp;&amp; on previous line.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:431
&gt; +        || (locktype == SQLITE_LOCK_EXCLUSIVE &amp;&amp; pFile-&gt;locktype &lt; SQLITE_LOCK_PENDING)) {
|| on previous line.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:527
&gt; +        } else {
no need for {}.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:543
&gt; +
remove extra line.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:559
&gt; +            if (rangeLock(pFile, F_RDLCK, &amp;tErrno) == -1) {
combine these 2 if-blocks into a single one.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:623
&gt; +static int closeChromiumFile(sqlite3_file* id)
change name to chromiumCloseNoLock(), or something similar.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:636
&gt; +        if (close(pFile-&gt;h)) {
combine these 2 if-blocks into a single one.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:768
&gt; +    if (fsync(pFile-&gt;h)) {
why did full_fsync() get replaced by fsync()?

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:812
&gt; +#if PLATFORM(MAC)
this code should not be #ifdef&apos;d. it&apos;s not specific to Mac OS in os_unix.c.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:842
&gt; +    return 512;
define a constant for this right on top of this function. something like SQliteDefaultSectorSize should do. add a comment that it&apos;s the same as SQLITE_DEFAULT_SECTOR_SIZE, which is defined in os.h.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:928
&gt; +    } else {
no need for {}.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:940
&gt; +    struct stat sStat;
probably don&apos;t need &apos;struct&apos; here.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:973
&gt; +    ChromiumFile* unixSQLite3File = reinterpret_cast&lt;ChromiumFile*&gt;(id);
s/unixSQLite3File/chromiumFile/g.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1009
&gt; +    int result = fillInChromiumFile(vfs, fd, -1, id, fileName, noLock);
s/result/rc/, for consistency.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:-125
&gt; -        *res = 1;   // if the file doesn&apos;t exist, attr &lt; 0
leave this comment here.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1090
&gt;      sqlite3_vfs* unix_vfs = sqlite3_vfs_find(&quot;unix&quot;);
we don&apos;t need the &quot;unix&quot; VFS anymore; delete this line.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1094
&gt;          unix_vfs-&gt;mxPathname,
define a constant PosixMaxPathName = 512, and use that here. add a comment that it corresponds to MAX_PATHNAME defined in os_unix.c.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280242</commentid>
    <comment_count>3</comment_count>
      <attachid>67824</attachid>
    <who name="Paweł Hajdan, Jr.">phajdan.jr</who>
    <bug_when>2010-09-16 11:49:44 -0700</bug_when>
    <thetext>Created attachment 67824
patch

Fixes review comments, will post responses to your other comments shortly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280244</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-16 11:56:34 -0700</bug_when>
    <thetext>Attachment 67824 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:37:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:129:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:130:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:131:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:403:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:409:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:424:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
Total errors found: 7 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280245</commentid>
    <comment_count>5</comment_count>
    <who name="Paweł Hajdan, Jr.">phajdan.jr</who>
    <bug_when>2010-09-16 11:56:43 -0700</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=66952&amp;action=prettypatch

Thanks for the review. The updated patch is already uploaded (from a WebKit checkout), and ready for another review. Please take a look.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:47
&gt;  namespace {
Converted to statics. Please note the anonymous namespace was there before.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:205
&gt; +    struct stat statbuf;
We need it for struct stat. Removal results in a compile error.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:330
&gt; +    struct flock lock;
This one could be removed. Done.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:334
&gt; +    lock.l_len = SQLiteSharedSize;
We don&apos;t use SQLite whole file locking, so I have removed it from this patch.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:768
&gt; +    if (fsync(pFile-&gt;h)) {
That was the simplest implementation. We can do something more fancy on Mac, but it&apos;s more risky (I was developing this on Linux). I can add a TODO(phajdan.jr) to port the Mac logic here when I switch to the Mac checkout.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:940
&gt; +    struct stat sStat;
Removal results in a compile error.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1090
&gt;      sqlite3_vfs* unix_vfs = sqlite3_vfs_find(&quot;unix&quot;);
We still need it for other things, like xDlError, xSleep, xCurrentTime, and so on.

&gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1094
&gt;          unix_vfs-&gt;mxPathname,
While we have unix_vfs here, I thought it would be useful to reuse it. Do you still think it&apos;s worth to duplicate this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280527</commentid>
    <comment_count>6</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-09-16 21:24:19 -0700</bug_when>
    <thetext>&gt; &gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:47
&gt; &gt;  namespace {
&gt; Converted to statics. Please note the anonymous namespace was there before.

yeah, i know, was one of my first webkit patches...

&gt; &gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:768
&gt; &gt; +    if (fsync(pFile-&gt;h)) {
&gt; That was the simplest implementation. We can do something more fancy on Mac, but it&apos;s more risky (I was developing this on Linux). I can add a TODO(phajdan.jr) to port the Mac logic here when I switch to the Mac checkout.

we _have_ to do exactly what sqlite&apos;s vfs does (on linux _and_ on mac). otherwise, we&apos;ll end up with subtle bugs that will take months to debug.

&gt; &gt; platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1090
&gt; &gt;      sqlite3_vfs* unix_vfs = sqlite3_vfs_find(&quot;unix&quot;);
&gt; We still need it for other things, like xDlError, xSleep, xCurrentTime, and so on.

we should copy-paste + modify those too, and remove any references to the &quot;unix&quot; VFS: either we reuse as much of it as possible, or we don&apos;t use it at all.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281529</commentid>
    <comment_count>7</comment_count>
      <attachid>68080</attachid>
    <who name="Paweł Hajdan, Jr.">phajdan.jr</who>
    <bug_when>2010-09-20 07:31:18 -0700</bug_when>
    <thetext>Created attachment 68080
patch

Dumitru, thanks for review. I detected an additional problem with chromiumSync in previous patch versions (missing dirfd fsync call). I have ported the original logic more carefully, and tested it on the Mac. Please take another look.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281531</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-20 07:35:07 -0700</bug_when>
    <thetext>Attachment 68080 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:37:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:130:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:131:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:132:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:404:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:410:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:425:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1088:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 8 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282719</commentid>
    <comment_count>9</comment_count>
      <attachid>68080</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-09-21 18:37:42 -0700</bug_when>
    <thetext>Comment on attachment 68080
patch

View in context: https://bugs.webkit.org/attachment.cgi?id=68080&amp;action=review

looks pretty good. a few more comments. and please check that all layout tests in LayoutTests/storage pass in chromium on linux and mac.

&gt; WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:749
&gt; +static int syncWrapper(int fd, bool fullSync)

change the return type of this function to &apos;bool&apos;, and rename &apos;rc&apos; to &apos;synced&apos;, or something like that.

&gt; WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:757
&gt; +#if PLATFORM(MAC)
&gt; +    if (fullSync)
&gt; +        rc = fcntl(fd, F_FULLSYNC, 0);
&gt; +#endif
&gt; +    if (rc)
&gt; +        rc = fsync(fd);

i don&apos;t think this code mirrors what&apos;s in full_fsync(). i think it should be more like:

   int rc = 1;
#if PLATFORM(MAC)
    if (fullSync)
        rc = fcntl(fd, F_FULLSYNC, 0);
    if (rc)
        rc = fsync(fd);
#else
    rc = fdatasync(fd);
#endif
    return rc;

(with the appropriate changes to make it return a boolean)

&gt; WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:769
&gt; +    if (syncWrapper(pFile-&gt;h, (flags &amp; 0x0F) == SQLITE_SYNC_FULL)) {

let&apos;s add a isFullSync = flags &amp; 0x0F == SQLITE_SYNC_FULL variable, since we need it a few lines below too.

&gt; WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1080
&gt; +// We disallow loading DSOs inside the renderer process, so the following
&gt; +// procedures are no-op.

1 line.

&gt; WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1085
&gt; +static void chromiumDlError(sqlite3_vfs*, int, char*)

empty lines between these functions.

&gt; WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1153
&gt; +static const int ChromiumMaxPathname = 512;

chromiumMaxPathname</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282901</commentid>
    <comment_count>10</comment_count>
      <attachid>68364</attachid>
    <who name="Paweł Hajdan, Jr.">phajdan.jr</who>
    <bug_when>2010-09-22 06:57:59 -0700</bug_when>
    <thetext>Created attachment 68364
patch

PTAL</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282904</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-22 07:01:16 -0700</bug_when>
    <thetext>Attachment 68364 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:37:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:130:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:131:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:132:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:404:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:410:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:425:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:1092:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 8 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284158</commentid>
    <comment_count>12</comment_count>
      <attachid>68364</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-09-23 18:04:33 -0700</bug_when>
    <thetext>Comment on attachment 68364
patch

View in context: https://bugs.webkit.org/attachment.cgi?id=68364&amp;action=review

r=me, but please patch this change into chromium __on linux and mac__, and make sure all LayoutTests/storage tests pass before you submit it. if you&apos;re not a webkit committer, please address my comment and upload a new patch, and i&apos;ll r+/cq+ it.

&gt; WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp:756
&gt; +    bool success = false;
&gt; +    if (fullSync)
&gt; +        success = !fcntl(fd, F_FULLSYNC, 0);
&gt; +    if (!success)
&gt; +        success = !fsync(fd);

missing return statement for PLATFORM(MAC). please test the patch on both linux and mac.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284436</commentid>
    <comment_count>13</comment_count>
      <attachid>68693</attachid>
    <who name="Paweł Hajdan, Jr.">phajdan.jr</who>
    <bug_when>2010-09-24 09:33:00 -0700</bug_when>
    <thetext>Created attachment 68693
patch

I have tested on Mac and Linux. It works. I have fixed one additional problem (inverted condition when checking for syncWrapper&apos;s return value - I detected it when testing).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284645</commentid>
    <comment_count>14</comment_count>
      <attachid>68693</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-09-24 13:14:17 -0700</bug_when>
    <thetext>Comment on attachment 68693
patch

r=me. adding to commit queue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284822</commentid>
    <comment_count>15</comment_count>
      <attachid>68693</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-24 16:17:59 -0700</bug_when>
    <thetext>Comment on attachment 68693
patch

Clearing flags on attachment: 68693

Committed r68310: &lt;http://trac.webkit.org/changeset/68310&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284823</commentid>
    <comment_count>16</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-24 16:18:06 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563578</commentid>
    <comment_count>17</comment_count>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2012-02-23 15:47:16 -0800</bug_when>
    <thetext>As the patch has been reverted (bug 53185), should we reopen this bug or open a new bug?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563615</commentid>
    <comment_count>18</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2012-02-23 16:04:22 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; As the patch has been reverted (bug 53185), should we reopen this bug or open a new bug?

Or should we mark this as WONT_FIX? What is the compelling reason to do this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563629</commentid>
    <comment_count>19</comment_count>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2012-02-23 16:11:20 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; Or should we mark this as WONT_FIX? What is the compelling reason to do this?

It&apos;s useful to reduce binary size, just like we can use many other system libraries like icu, skia, libjpeg etc. on certain platforms.

Specifically, we need this for chromium-android.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563672</commentid>
    <comment_count>20</comment_count>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2012-02-23 16:34:41 -0800</bug_when>
    <thetext>I&apos;m sure we should reopen this bug, according to https://lists.webkit.org/pipermail/webkit-dev/2011-June/017169.html

I&apos;ll work on this bug, fix the tsan reported racing issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563745</commentid>
    <comment_count>21</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2012-02-23 17:34:34 -0800</bug_when>
    <thetext>&gt; It&apos;s useful to reduce binary size, just like we can use many other system libraries like icu, skia, libjpeg etc. on certain platforms.
&gt; 
&gt; Specifically, we need this for chromium-android.

Q1: Other than reducing size, why is this needed for chromium-android? What is different about android&apos;s library that forces the need to dynamically link with it? Or is the need purely based on reducing size?

Q2: Can we modify android&apos;s sqlite system library? That might change the shape of the answer. Specifically can android&apos;s system library export these symbols... 

// Defined in Chromium&apos;s codebase in third_party/sqlite/src/os_unix.c
extern &quot;C&quot; {
void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file);
int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs, int fd, int dirfd, sqlite3_file* file, const char* fileName, int noLock);
int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, const char* fileName, int flags, int* fd);
void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, int fd, int flags);
void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file);
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563798</commentid>
    <comment_count>22</comment_count>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2012-02-23 18:25:20 -0800</bug_when>
    <thetext>(In reply to comment #21)

&gt; Q1: Other than reducing size, why is this needed for chromium-android? What is different about android&apos;s library that forces the need to dynamically link with it? Or is the need purely based on reducing size?
&gt; 
&gt; Q2: Can we modify android&apos;s sqlite system library?
&gt; That might change the shape of the answer. Specifically can android&apos;s system library export these symbols... 
&gt; 
&gt; // Defined in Chromium&apos;s codebase in third_party/sqlite/src/os_unix.c
&gt; extern &quot;C&quot; {
&gt; void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file);
&gt; int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs, int fd, int dirfd, sqlite3_file* file, const char* fileName, int noLock);
&gt; int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, const char* fileName, int flags, int* fd);
&gt; void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, int fd, int flags);
&gt; void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file);
&gt; }

I just started to look at the issue, and haven&apos;t got much detail yet. Just think there may ght be demand for use_system_sqlite=1, with reasons just like use_system_skia=1 and use_system_libjpeg, etc.

Just read http://code.google.com/p/chromium/issues/detail?id=22208 and noticed that this is still a pending issue at chromium side. As the bug at chromium side is still open, I think we&apos;d better also keep this one open if fixing at chromium side is not enough to fix the issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563850</commentid>
    <comment_count>23</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2012-02-23 19:42:48 -0800</bug_when>
    <thetext>&gt; I just started to look at the issue, and haven&apos;t got much detail yet. Just think there may ght be demand for use_system_sqlite=1, with reasons just like use_system_skia=1 and use_system_libjpeg, etc.
&gt; 
&gt; Just read http://code.google.com/p/chromium/issues/detail?id=22208 and noticed that this is still a pending issue at chromium side. As the bug at chromium side is still open, I think we&apos;d better also keep this one open if fixing at chromium side is not enough to fix the issue.

Proceed with caution :)

The presence of a change request in a tracking system does not mean there is a compelling reason to do it. The reason I&apos;m probing for a justification is because resolving this has hair on it. Pawel was the motivating force for USE_SYSTEM_SQLITE for quite some time but has since dropped it (but only after some lengthy efforts).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574011</commentid>
    <comment_count>24</comment_count>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2012-03-08 11:34:10 -0800</bug_when>
    <thetext>(In reply to comment #20)
&gt; I&apos;m sure we should reopen this bug, according to https://lists.webkit.org/pipermail/webkit-dev/2011-June/017169.html
&gt; 
&gt; I&apos;ll work on this bug, fix the tsan reported racing issues.

Sorry that I won&apos;t work on this in the coming months as chromium-android doesn&apos;t have the requirement for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589166</commentid>
    <comment_count>25</comment_count>
      <attachid>68364</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-03-27 12:48:18 -0700</bug_when>
    <thetext>Comment on attachment 68364
patch

Cleared Dumitru Daniliuc&apos;s review+ from obsolete attachment 68364 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66952</attachid>
            <date>2010-09-08 15:55:39 -0700</date>
            <delta_ts>2010-09-16 11:49:44 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>36289</size>
            <attacher name="Paweł Hajdan, Jr.">phajdan.jr</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDY3MDMw
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDUgQEAKKzIwMTAtMDkt
MDggIFBhd2VsIEhhamRhbiAgPHBoYWpkYW4uanJAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE1vdmUgdGhlIGltcGxlbWVudGF0
aW9uIG9mIGNocm9taXVtX3ZmcyB0byB3ZWJraXQgZm9yIFBPU0lYLgorICAgICAgICBUaGlzIGFs
bG93cyB1cyB0byBsaW5rIENocm9tZSB3aXRoIHN5c3RlbS1wcm92aWRlZCBTUUxpdGUgb24gTGlu
dXguCisgICAgICAgIFNlZSBhbHNvIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9p
c3N1ZXMvZGV0YWlsP2lkPTIyMjA4LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NDU0MTYKKworICAgICAgICBObyBuZXcgdGVzdHMuCisKKyAgICAgICAg
KiBwbGF0Zm9ybS9zcWwvY2hyb21pdW0vU1FMaXRlRmlsZVN5c3RlbUNocm9taXVtUG9zaXguY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6c3FsaXRlRXJyb3JGcm9tUG9zaXhFcnJvcik6CisgICAgICAg
IChXZWJDb3JlOjpyZWxlYXNlTG9ja0luZm8pOgorICAgICAgICAoV2ViQ29yZTo6cmVsZWFzZU9w
ZW5JbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRMb2NrSW5mbyk6CisgICAgICAgIChXZWJD
b3JlOjpjaHJvbWl1bUNoZWNrUmVzZXJ2ZWRMb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OnJhbmdl
TG9jayk6CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1bUxvY2spOgorICAgICAgICAoV2ViQ29y
ZTo6Y2xvc2VQZW5kaW5nRmRzKToKKyAgICAgICAgKFdlYkNvcmU6OmNocm9taXVtVW5sb2NrKToK
KyAgICAgICAgKFdlYkNvcmU6OmNsb3NlQ2hyb21pdW1GaWxlKToKKyAgICAgICAgKFdlYkNvcmU6
OmNocm9taXVtQ2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6Y2hyb21pdW1DaGVja1Jlc2VydmVk
TG9ja05vb3ApOgorICAgICAgICAoV2ViQ29yZTo6Y2hyb21pdW1Mb2NrTm9vcCk6CisgICAgICAg
IChXZWJDb3JlOjpjaHJvbWl1bVVubG9ja05vb3ApOgorICAgICAgICAoV2ViQ29yZTo6c2Vla0Fu
ZFJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Y2hyb21pdW1SZWFkKToKKyAgICAgICAgKFdlYkNv
cmU6OnNlZWtBbmRXcml0ZSk6CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1bVdyaXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OmNocm9taXVtU3luYyk6CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1
bVRydW5jYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmNocm9taXVtRmlsZVNpemUpOgorICAgICAg
ICAoV2ViQ29yZTo6Y2hyb21pdW1GaWxlQ29udHJvbCk6CisgICAgICAgIChXZWJDb3JlOjpjaHJv
bWl1bVNlY3RvclNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Y2hyb21pdW1EZXZpY2VDaGFyYWN0
ZXJpc3RpY3MpOgorICAgICAgICAoV2ViQ29yZTo6ZmlsbEluQ2hyb21pdW1GaWxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OmZpbmRSZXVzYWJsZUZkKToKKyAgICAgICAgKFdlYkNvcmU6OmNocm9taXVt
T3Blbik6CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1bUFjY2Vzcyk6CisgICAgICAgIChXZWJD
b3JlOjpTUUxpdGVGaWxlU3lzdGVtOjpyZWdpc3RlclNRTGl0ZVZGUyk6CisKIDIwMTAtMDktMDgg
IEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBF
cmljIFNlaWRlbC4KSW5kZXg6IHBsYXRmb3JtL3NxbC9jaHJvbWl1bS9TUUxpdGVGaWxlU3lzdGVt
Q2hyb21pdW1Qb3NpeC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vc3FsL2Nocm9taXVtL1NR
TGl0ZUZpbGVTeXN0ZW1DaHJvbWl1bVBvc2l4LmNwcAkocmV2aXNpb24gNjY2NjYpCisrKyBwbGF0
Zm9ybS9zcWwvY2hyb21pdW0vU1FMaXRlRmlsZVN5c3RlbUNocm9taXVtUG9zaXguY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNCwyNCArMzQsOTI4IEBACiAjaW5jbHVkZSAiQ2hyb21pdW1CcmlkZ2Uu
aCIKICNpbmNsdWRlIDxzcWxpdGUzLmg+CiAKKyNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUg
PGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNp
bmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogdXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7CiAKLS8vIERlZmluZWQgaW4gQ2hyb21pdW0ncyBjb2RlYmFzZSBpbiB0aGly
ZF9wYXJ0eS9zcWxpdGUvc3JjL29zX3VuaXguYwotZXh0ZXJuICJDIiB7Ci12b2lkIGNocm9taXVt
X3NxbGl0ZTNfaW5pdGlhbGl6ZV91bml4X3NxbGl0ZTNfZmlsZShzcWxpdGUzX2ZpbGUqIGZpbGUp
OwotaW50IGNocm9taXVtX3NxbGl0ZTNfZmlsbF9pbl91bml4X3NxbGl0ZTNfZmlsZShzcWxpdGUz
X3ZmcyogdmZzLCBpbnQgZmQsIGludCBkaXJmZCwgc3FsaXRlM19maWxlKiBmaWxlLCBjb25zdCBj
aGFyKiBmaWxlTmFtZSwgaW50IG5vTG9jayk7Ci1pbnQgY2hyb21pdW1fc3FsaXRlM19nZXRfcmV1
c2FibGVfZmlsZV9oYW5kbGUoc3FsaXRlM19maWxlKiBmaWxlLCBjb25zdCBjaGFyKiBmaWxlTmFt
ZSwgaW50IGZsYWdzLCBpbnQqIGZkKTsKLXZvaWQgY2hyb21pdW1fc3FsaXRlM191cGRhdGVfcmV1
c2FibGVfZmlsZV9oYW5kbGUoc3FsaXRlM19maWxlKiBmaWxlLCBpbnQgZmQsIGludCBmbGFncyk7
Ci12b2lkIGNocm9taXVtX3NxbGl0ZTNfZGVzdHJveV9yZXVzYWJsZV9maWxlX2hhbmRsZShzcWxp
dGUzX2ZpbGUqIGZpbGUpOwotfQotCiAvLyBDaHJvbWl1bSdzIFBvc2l4IGltcGxlbWVudGF0aW9u
IG9mIFNRTGl0ZSBWRlMKIG5hbWVzcGFjZSB7CiAKKy8vIElkZW50aWZpZXMgYSBmaWxlIGJ5IGl0
cyBkZXZpY2UgbnVtYmVyIGFuZCBpbm9kZS4KK3N0cnVjdCBDaHJvbWl1bUZpbGVJZCB7CisgICAg
ZGV2X3QgZGV2OyAvLyBEZXZpY2UgbnVtYmVyLgorICAgIGlub190IGlubzsgLy8gSW5vZGUgbnVt
YmVyLgorfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgZmlsZSBsb2NrcyAob25lIHBlciBvcGVu
IGlub2RlKS4gTm90ZSB0aGF0IG1hbnkgb3BlbgorLy8gZmlsZSBkZXNjcmlwdG9ycyBtYXkgcmVm
ZXIgdG8gdGhlIHNhbWUgaW5vZGUuCitzdHJ1Y3QgQ2hyb21pdW1Mb2NrSW5mbyB7CisgICAgQ2hy
b21pdW1GaWxlSWQgbG9ja0tleTsgLy8gRmlsZSBpZGVudGlmaWVyLgorICAgIGludCBjbnQ7IC8v
IE51bWJlciBvZiBzaGFyZWQgbG9ja3MgaGVsZC4KKyAgICBpbnQgbG9ja3R5cGU7IC8vIFR5cGUg
b2YgdGhlIGxvY2suCisgICAgaW50IG5SZWY7IC8vIFJlZmVyZW5jZSBjb3VudC4KKworICAgIC8v
IERvdWJsZS1saW5rZWQgbGlzdCBwb2ludGVycy4KKyAgICBDaHJvbWl1bUxvY2tJbmZvKiBwTmV4
dDsgCisgICAgQ2hyb21pdW1Mb2NrSW5mbyogcFByZXY7Cit9OworCisvLyBJbmZvcm1hdGlvbiBh
Ym91dCBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IGNhbm5vdCBiZSBjbG9zZWQgaW1tZWRpYXRlbHku
CitzdHJ1Y3QgQ2hyb21pdW1VbnVzZWRGZCB7CisgICAgaW50IGZkOyAvLyBGaWxlIGRlc2NyaXB0
b3IuCisgICAgaW50IGZsYWdzOyAvLyBGbGFncyB0aGlzIGZpbGUgZGVzY3JpcHRvciB3YXMgb3Bl
bmVkIHdpdGguCisgICAgQ2hyb21pdW1VbnVzZWRGZCogcE5leHQ7IC8vIE5leHQgdW51c2VkIGZp
bGUgZGVzY3JpcHRvciBvbiB0aGUgc2FtZSBmaWxlLgorfTsKKworLy8gSW5mb3JtYXRpb24gYWJv
dXQgYW4gb3BlbiBpbm9kZS4gV2hlbiB3ZSB3YW50IHRvIGNsb3NlIGFuIGlub2RlCisvLyB0aGF0
IHN0aWxsIGhhcyBsb2Nrcywgd2UgZGVmZXIgdGhlIGNsb3NlIHVudGlsIGFsbCBsb2NrcyBhcmUg
Y2xlYXJlZC4KK3N0cnVjdCBDaHJvbWl1bU9wZW5JbmZvIHsKKyAgICBDaHJvbWl1bUZpbGVJZCBm
aWxlSWQ7IC8vIFRoZSBsb29rdXAga2V5LgorICAgIGludCBuUmVmOyAvLyBSZWZlcmVuY2UgY291
bnQuCisgICAgaW50IG5Mb2NrOyAvLyBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgbG9ja3MuCisgICAg
Q2hyb21pdW1VbnVzZWRGZCogcFVudXNlZDsgLy8gTGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzIHRv
IGNsb3NlLgorCisgICAgLy8gRG91YmxlLWxpbmtlZCBsaXN0IHBvaW50ZXJzLgorICAgIENocm9t
aXVtT3BlbkluZm8qIHBOZXh0OworICAgIENocm9taXVtT3BlbkluZm8qIHBQcmV2OworfTsKKwor
Ly8gS2VlcCB0cmFjayBvZiBsb2NrcyBhbmQgaW5vZGVzIGluIGRvdWJsZS1saW5rZWQgbGlzdHMu
CitzdGF0aWMgc3RydWN0IENocm9taXVtTG9ja0luZm8qIGxvY2tMaXN0ID0gMDsKK3N0YXRpYyBz
dHJ1Y3QgQ2hyb21pdW1PcGVuSW5mbyogb3Blbkxpc3QgPSAwOworCisvLyBFeHRlbnNpb24gb2Yg
c3FsaXRlM19maWxlIHNwZWNpZmljIHRvIHRoZSBjaHJvbWl1bSBWRlMuCitzdHJ1Y3QgQ2hyb21p
dW1GaWxlIHsKKyAgICBzcWxpdGUzX2lvX21ldGhvZHMgY29uc3QqIHBNZXRob2Q7IC8vIEltcGxl
bWVudGF0aW9uIG9mIHNxbGl0ZTNfZmlsZS4KKyAgICBDaHJvbWl1bU9wZW5JbmZvKiBwT3Blbjsg
Ly8gSW5mb3JtYXRpb24gYWJvdXQgYWxsIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBm
aWxlLgorICAgIENocm9taXVtTG9ja0luZm8qIHBMb2NrOyAvLyBJbmZvcm1hdGlvbiBhYm91dCBh
bGwgbG9ja3MgZm9yIHRoaXMgZmlsZS4KKyAgICBpbnQgaDsgLy8gRmlsZSBkZXNjcmlwdG9yLgor
ICAgIGludCBkaXJmZDsgLy8gRmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSBkaXJlY3Rvcnku
CisgICAgdW5zaWduZWQgY2hhciBsb2NrdHlwZTsgLy8gVHlwZSBvZiB0aGUgbG9jayB1c2VkIGZv
ciB0aGlzIGZpbGUuCisgICAgaW50IGxhc3RFcnJubzsgLy8gVmFsdWUgb2YgZXJybm8gZm9yIGxh
c3Qgb3BlcmF0aW9uIG9uIHRoaXMgZmlsZS4KKyAgICBDaHJvbWl1bVVudXNlZEZkKiBwVW51c2Vk
OyAvLyBJbmZvcm1hdGlvbiBhYm91dCB1bnVzZWQgZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBm
aWxlLgorfTsKKworLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgc3BlY2lmeSB0aGUgcmFuZ2Ug
b2YgYnl0ZXMgdXNlZCBmb3IgbG9ja2luZy4KKy8vIFNRTGl0ZVNoYXJlZFNpemUgaXMgdGhlIG51
bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHBvb2wgZnJvbSB3aGljaAorLy8gYSByYW5k
b20gYnl0ZSBpcyBzZWxlY3RlZCBmb3IgYSBzaGFyZWQgbG9jay4gIFRoZSBwb29sIG9mIGJ5dGVz
IGZvcgorLy8gc2hhcmVkIGxvY2tzIGJlZ2lucyBhdCBTUUxpdGVTaGFyZWRGaXJzdEJ5dGUuIAor
Ly8gVGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgdXNlZCBieSBTUUxpdGUgZm9yIGNvbXBhdGli
aWxpdHkuCitjb25zdCBvZmZfdCBTUUxpdGVQZW5kaW5nQnl0ZSA9IDB4NDAwMDAwMDA7Citjb25z
dCBvZmZfdCBTUUxpdGVSZXNlcnZlZEJ5dGUgPSBTUUxpdGVQZW5kaW5nQnl0ZSArIDE7Citjb25z
dCBvZmZfdCBTUUxpdGVTaGFyZWRGaXJzdEJ5dGUgPSBTUUxpdGVQZW5kaW5nQnl0ZSArIDI7Citj
b25zdCBvZmZfdCBTUUxpdGVTaGFyZWRTaXplID0gNTEwOworCisvLyBNYXBzIGEgUE9TSVggZXJy
b3IgY29kZSB0byBhbiBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQgc3FsaXRlRXJyb3JG
cm9tUG9zaXhFcnJvcihpbnQgcG9zaXhFcnJvciwgaW50IHNxbGl0ZUlPRXJyKQoreworICAgIHN3
aXRjaCAocG9zaXhFcnJvcikgeworICAgIGNhc2UgMDogCisgICAgICAgIHJldHVybiBTUUxJVEVf
T0s7CisgICAgCisgICAgY2FzZSBFQUdBSU46CisgICAgY2FzZSBFVElNRURPVVQ6CisgICAgY2Fz
ZSBFQlVTWToKKyAgICBjYXNlIEVJTlRSOgorICAgIGNhc2UgRU5PTENLOiAgCisgICAgICAgIHJl
dHVybiBTUUxJVEVfQlVTWTsKKyAgICAKKyAgICBjYXNlIEVBQ0NFUzogCisgICAgICAgIC8vIEVB
Q0NFUyBpcyBsaWtlIEVBR0FJTiBkdXJpbmcgbG9ja2luZyBvcGVyYXRpb25zLgorICAgICAgICBp
ZiAoKHNxbGl0ZUlPRXJyID09IFNRTElURV9JT0VSUl9MT0NLKQorICAgICAgICAgICAgfHwgKHNx
bGl0ZUlPRXJyID09IFNRTElURV9JT0VSUl9VTkxPQ0spCisgICAgICAgICAgICB8fCAoc3FsaXRl
SU9FcnIgPT0gU1FMSVRFX0lPRVJSX1JETE9DSykKKyAgICAgICAgICAgIHx8IChzcWxpdGVJT0Vy
ciA9PSBTUUxJVEVfSU9FUlJfQ0hFQ0tSRVNFUlZFRExPQ0spKSB7CisgICAgICAgICAgICByZXR1
cm4gU1FMSVRFX0JVU1k7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNRTElURV9QRVJNOwor
ICAgIGNhc2UgRVBFUk06IAorICAgICAgICByZXR1cm4gU1FMSVRFX1BFUk07CisgICAgCisgICAg
Y2FzZSBFREVBRExLOgorICAgICAgICByZXR1cm4gU1FMSVRFX0lPRVJSX0JMT0NLRUQ7CisgICAg
CisgICAgZGVmYXVsdDogCisgICAgICAgIHJldHVybiBzcWxpdGVJT0VycjsKKyAgICB9Cit9CisK
Ky8vIFJlbGVhc2VzIGEgQ2hyb21pdW1Mb2NrSW5mbyBzdHJ1Y3R1cmUgcHJldmlvdXNseSBhbGxv
Y2F0ZWQgYnkgZmluZExvY2tJbmZvKCkuCitzdGF0aWMgdm9pZCByZWxlYXNlTG9ja0luZm8oQ2hy
b21pdW1Mb2NrSW5mbyogcExvY2spCit7CisgICAgaWYgKCFwTG9jaykKKyAgICAgICAgcmV0dXJu
OworCisgICAgcExvY2stPm5SZWYtLTsKKyAgICBpZiAocExvY2stPm5SZWYgPiAwKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAocExvY2stPnBQcmV2KSB7CisgICAgICAgIEFTU0VSVChwTG9j
ay0+cFByZXYtPnBOZXh0ID09IHBMb2NrKTsKKyAgICAgICAgcExvY2stPnBQcmV2LT5wTmV4dCA9
IHBMb2NrLT5wTmV4dDsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlQobG9ja0xpc3QgPT0g
cExvY2spOworICAgICAgICBsb2NrTGlzdCA9IHBMb2NrLT5wTmV4dDsKKyAgICB9CisgICAgaWYg
KHBMb2NrLT5wTmV4dCkgeworICAgICAgICBBU1NFUlQocExvY2stPnBOZXh0LT5wUHJldiA9PSBw
TG9jayk7CisgICAgICAgIHBMb2NrLT5wTmV4dC0+cFByZXYgPSBwTG9jay0+cFByZXY7CisgICAg
fQorCisgICAgc3FsaXRlM19mcmVlKHBMb2NrKTsKK30KKworLy8gUmVsZWFzZXMgYSBDaHJvbWl1
bU9wZW5JbmZvIHN0cnVjdHVyZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBieSBmaW5kTG9ja0luZm8o
KS4KK3N0YXRpYyB2b2lkIHJlbGVhc2VPcGVuSW5mbyhDaHJvbWl1bU9wZW5JbmZvKiBwT3BlbikK
K3sKKyAgICBpZiAoIXBPcGVuKQorICAgICAgICByZXR1cm47CisKKyAgICBwT3Blbi0+blJlZi0t
OworICAgIGlmIChwT3Blbi0+blJlZiA+IDApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChw
T3Blbi0+cFByZXYpIHsKKyAgICAgICAgQVNTRVJUKHBPcGVuLT5wUHJldi0+cE5leHQgPT0gcE9w
ZW4pOworICAgICAgICBwT3Blbi0+cFByZXYtPnBOZXh0ID0gcE9wZW4tPnBOZXh0OworICAgIH0g
ZWxzZSB7CisgICAgICAgIEFTU0VSVChvcGVuTGlzdCA9PSBwT3Blbik7CisgICAgICAgIG9wZW5M
aXN0ID0gcE9wZW4tPnBOZXh0OworICAgIH0KKyAgICBpZiAocE9wZW4tPnBOZXh0KSB7CisgICAg
ICAgIEFTU0VSVChwT3Blbi0+cE5leHQtPnBQcmV2ID09IHBPcGVuKTsKKyAgICAgICAgcE9wZW4t
PnBOZXh0LT5wUHJldiA9IHBPcGVuLT5wUHJldjsKKyAgICB9CisKKyAgICBBU1NFUlQoIXBPcGVu
LT5wVW51c2VkKTsgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBsZWFraW5nIG1lbW9yeSBhbmQgZmls
ZSBkZXNjcmlwdG9ycy4KKworICAgIHNxbGl0ZTNfZnJlZShwT3Blbik7Cit9CisKKy8vIExvY2F0
ZXMgQ2hyb21pdW1Mb2NrSW5mbyBhbmQgQ2hyb21pdW1PcGVuSW5mbyBmb3IgZ2l2ZW4gZmlsZSBk
ZXNjcmlwdG9yIChjcmVhdGluZyBuZXcgb25lcyBpZiBuZWVkZWQpLgorLy8gUmV0dXJucyBhIFNR
TGl0ZSBlcnJvciBjb2RlLgorc3RhdGljIGludCBmaW5kTG9ja0luZm8oQ2hyb21pdW1GaWxlKiBw
RmlsZSwgQ2hyb21pdW1Mb2NrSW5mbyoqIHBwTG9jaywgQ2hyb21pdW1PcGVuSW5mbyoqIHBwT3Bl
bikKK3sKKyAgICBpbnQgZmQgPSBwRmlsZS0+aDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwor
ICAgIGludCByYyA9IGZzdGF0KGZkLCAmc3RhdGJ1Zik7CisgICAgaWYgKHJjKSB7CisgICAgICAg
IHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyNpZmRlZiBFT1ZFUkZMT1cKKyAgICAgICAgaWYg
KHBGaWxlLT5sYXN0RXJybm8gPT0gRU9WRVJGTE9XKQorICAgICAgICAgICAgcmV0dXJuIFNRTElU
RV9OT0xGUzsKKyNlbmRpZgorICAgICAgICByZXR1cm4gU1FMSVRFX0lPRVJSOworICAgIH0KKwor
I2lmIFBMQVRGT1JNKE1BQykKKyAgICAvLyBPbiBPUyBYIG9uIGFuIG1zZG9zL2ZhdCBmaWxlc3lz
dGVtcywgdGhlIGlub2RlIG51bWJlciBpcyByZXBvcnRlZAorICAgIC8vIGluY29ycmVjdGx5IGZv
ciB6ZXJvLXNpemUgZmlsZXMuIFNlZSBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvY3ZzdHJhYy90a3R2
aWV3P3RuPTMyNjAuCisgICAgLy8gVG8gd29yayBhcm91bmQgdGhpcyBwcm9ibGVtIHdlIGFsd2F5
cyBpbmNyZWFzZSB0aGUgZmlsZSBzaXplIHRvIDEgYnkgd3JpdGluZyBhIHNpbmdsZSBieXRlCisg
ICAgLy8gcHJpb3IgdG8gYWNjZXNzaW5nIHRoZSBpbm9kZSBudW1iZXIuIFRoZSBvbmUgYnl0ZSB3
cml0dGVuIGlzIGFuIEFTQ0lJICdTJyBjaGFyYWN0ZXIgd2hpY2gKKyAgICAvLyBhbHNvIGhhcHBl
bnMgdG8gYmUgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGhlYWRlciBvZiBldmVyeSBTUUxpdGUgZGF0
YWJhc2UuICBJbiB0aGlzIHdheSwKKyAgICAvLyBpZiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9u
IHN1Y2ggdGhhdCBhbm90aGVyIHRocmVhZCBoYXMgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGZpcnN0
IHBhZ2UKKyAgICAvLyBvZiB0aGUgZGF0YWJhc2UsIG5vIGRhbWFnZSBpcyBkb25lLgorICAgIGlm
ICghc3RhdGJ1Zi5zdF9zaXplKSB7CisgICAgICAgIHJjID0gd3JpdGUoZmQsICJTIiwgMSk7Cisg
ICAgICAgIGlmIChyYyAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIFNRTElURV9JT0VSUjsKKyAg
ICAgICAgcmMgPSBmc3RhdChmZCwgJnN0YXRidWYpOworICAgICAgICBpZiAocmMpIHsKKyAgICAg
ICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgIHJldHVybiBTUUxJ
VEVfSU9FUlI7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIENocm9taXVtRmlsZUlk
IGZpbGVJZDsKKyAgICBtZW1zZXQoJmZpbGVJZCwgMCwgc2l6ZW9mKGZpbGVJZCkpOworICAgIGZp
bGVJZC5kZXYgPSBzdGF0YnVmLnN0X2RldjsKKyAgICBmaWxlSWQuaW5vID0gc3RhdGJ1Zi5zdF9p
bm87CisKKyAgICBDaHJvbWl1bUxvY2tJbmZvKiBwTG9jayA9IDA7CisKKyAgICBpZiAocHBMb2Nr
KSB7CisgICAgICAgIHBMb2NrID0gbG9ja0xpc3Q7CisgICAgICAgIHdoaWxlIChwTG9jayAmJiBt
ZW1jbXAoJmZpbGVJZCwgJnBMb2NrLT5sb2NrS2V5LCBzaXplb2YoZmlsZUlkKSkpCisgICAgICAg
ICAgICBwTG9jayA9IHBMb2NrLT5wTmV4dDsKKyAgICAgICAgaWYgKHBMb2NrKQorICAgICAgICAg
ICAgcExvY2stPm5SZWYrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwTG9jayA9IHN0
YXRpY19jYXN0PENocm9taXVtTG9ja0luZm8qPihzcWxpdGUzX21hbGxvYyhzaXplb2YoKnBMb2Nr
KSkpOworICAgICAgICAgICAgaWYgKCFwTG9jaykKKyAgICAgICAgICAgICAgICByZXR1cm4gU1FM
SVRFX05PTUVNOworICAgICAgICAgICAgcExvY2stPmxvY2tLZXkgPSBmaWxlSWQ7CisgICAgICAg
ICAgICBwTG9jay0+blJlZiA9IDE7CisgICAgICAgICAgICBwTG9jay0+Y250ID0gMDsKKyAgICAg
ICAgICAgIHBMb2NrLT5sb2NrdHlwZSA9IDA7CisgICAgICAgICAgICBwTG9jay0+cE5leHQgPSBs
b2NrTGlzdDsKKyAgICAgICAgICAgIHBMb2NrLT5wUHJldiA9IDA7CisgICAgICAgICAgICBpZiAo
bG9ja0xpc3QpCisgICAgICAgICAgICAgICAgbG9ja0xpc3QtPnBQcmV2ID0gcExvY2s7CisgICAg
ICAgICAgICBsb2NrTGlzdCA9IHBMb2NrOworICAgICAgICB9CisgICAgICAgICpwcExvY2sgPSBw
TG9jazsKKyAgICB9CisKKyAgICBpZiAocHBPcGVuKSB7CisgICAgICAgIENocm9taXVtT3Blbklu
Zm8qIHBPcGVuID0gb3Blbkxpc3Q7CisgICAgICAgIHdoaWxlIChwT3BlbiAmJiBtZW1jbXAoJmZp
bGVJZCwgJnBPcGVuLT5maWxlSWQsIHNpemVvZihmaWxlSWQpKSkKKyAgICAgICAgICAgIHBPcGVu
ID0gcE9wZW4tPnBOZXh0OworICAgICAgICBpZiAocE9wZW4pCisgICAgICAgICAgICBwT3Blbi0+
blJlZisrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBPcGVuID0gc3RhdGljX2Nhc3Q8
Q2hyb21pdW1PcGVuSW5mbyo+KHNxbGl0ZTNfbWFsbG9jKHNpemVvZigqcE9wZW4pKSk7CisgICAg
ICAgICAgICBpZiAoIXBPcGVuKSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2tJbmZvKHBM
b2NrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU1FMSVRFX05PTUVNOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgbWVtc2V0KHBPcGVuLCAwLCBzaXplb2YoKnBPcGVuKSk7CisgICAgICAg
ICAgICBwT3Blbi0+ZmlsZUlkID0gZmlsZUlkOworICAgICAgICAgICAgcE9wZW4tPm5SZWYgPSAx
OworICAgICAgICAgICAgcE9wZW4tPnBOZXh0ID0gb3Blbkxpc3Q7CisgICAgICAgICAgICBpZiAo
b3Blbkxpc3QpCisgICAgICAgICAgICAgICAgb3Blbkxpc3QtPnBQcmV2ID0gcE9wZW47CisgICAg
ICAgICAgICBvcGVuTGlzdCA9IHBPcGVuOworICAgICAgICB9CisgICAgICAgICpwcE9wZW4gPSBw
T3BlbjsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8vIENoZWNrcyBpZiB0aGVyZSBp
cyBhIFJFU0VSVkVEIGxvY2sgaGVsZCBvbiB0aGUgc3BlY2lmaWVkIGZpbGUgYnkgdGhpcyBvciBh
bnkgb3RoZXIgcHJvY2Vzcy4KKy8vIElmIHRoZSBsb2NrIGlzIGhlbGQsIHNldHMgcFJlc091dCB0
byBhIG5vbi16ZXJvIHZhbHVlLiBSZXR1cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMg
aW50IGNocm9taXVtQ2hlY2tSZXNlcnZlZExvY2soc3FsaXRlM19maWxlKiBpZCwgaW50KiBwUmVz
T3V0KQoreworICAgIENocm9taXVtRmlsZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9t
aXVtRmlsZSo+KGlkKTsKKyAgICBBU1NFUlQocEZpbGUpOworCisgICAgLy8gTG9vayBmb3IgbG9j
a3MgaGVsZCBieSB0aGlzIHByb2Nlc3MuCisgICAgaW50IHJlc2VydmVkID0gMDsKKyAgICBpZiAo
cEZpbGUtPnBMb2NrLT5sb2NrdHlwZSA+IFNRTElURV9MT0NLX1NIQVJFRCkKKyAgICAgICAgcmVz
ZXJ2ZWQgPSAxOworCisgICAgLy8gTG9vayBmb3IgbG9ja3MgaGVsZCBieSBvdGhlciBwcm9jZXNz
ZXMuCisgICAgaW50IHJjID0gU1FMSVRFX09LOworICAgIGlmICghcmVzZXJ2ZWQpIHsKKyAgICAg
ICAgc3RydWN0IGZsb2NrIGxvY2s7CisgICAgICAgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsK
KyAgICAgICAgbG9jay5sX3N0YXJ0ID0gU1FMaXRlUmVzZXJ2ZWRCeXRlOworICAgICAgICBsb2Nr
LmxfbGVuID0gMTsKKyAgICAgICAgbG9jay5sX3R5cGUgPSBGX1dSTENLOworICAgICAgICBpZiAo
LTEgPT0gZmNudGwocEZpbGUtPmgsIEZfR0VUTEssICZsb2NrKSkgeworICAgICAgICAgICAgaW50
IHRFcnJubyA9IGVycm5vOworICAgICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVy
cm9yKHRFcnJubywgU1FMSVRFX0lPRVJSX0NIRUNLUkVTRVJWRURMT0NLKTsKKyAgICAgICAgICAg
IHBGaWxlLT5sYXN0RXJybm8gPSB0RXJybm87CisgICAgICAgIH0gZWxzZSBpZiAobG9jay5sX3R5
cGUgIT0gRl9VTkxDSykgeworICAgICAgICAgICAgcmVzZXJ2ZWQgPSAxOworICAgICAgICB9Cisg
ICAgfQorCisgICAgKnBSZXNPdXQgPSByZXNlcnZlZDsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8v
IFBlcmZvcm1zIGEgZmlsZSBsb2NraW5nIG9wZXJhdGlvbiBvbiBhIHJhbmdlIG9mIGJ5dGVzIGlu
IGEgZmlsZS4KKy8vIFRoZSB8b3B8IHBhcmFtZXRlciBzaG91bGQgYmUgb25lIG9mIEZfUkZMQ0ss
IEZfV1JMQ0sgb3IgRl9VTkxDSy4KKy8vIFJldHVybnMgYSBVbml4IGVycm9yIGNvZGUsIGFuZCBh
bHNvIHdyaXRlcyBpdCB0byBwRXJyY29kZS4KK3N0YXRpYyBpbnQgcmFuZ2VMb2NrKENocm9taXVt
RmlsZSogcEZpbGUsIGludCBvcCwgaW50KiBwRXJyY29kZSkKK3sKKyAgICBzdHJ1Y3QgZmxvY2sg
bG9jazsKKyAgICBsb2NrLmxfdHlwZSA9IG9wOworICAgIGxvY2subF9zdGFydCA9IFNRTGl0ZVNo
YXJlZEZpcnN0Qnl0ZTsKKyAgICBsb2NrLmxfd2hlbmNlID0gU0VFS19TRVQ7CisgICAgbG9jay5s
X2xlbiA9IFNRTGl0ZVNoYXJlZFNpemU7CisgICAgaW50IHJjID0gZmNudGwocEZpbGUtPmgsIEZf
U0VUTEssICZsb2NrKTsKKyAgICAqcEVycmNvZGUgPSBlcnJubzsKKyAgICByZXR1cm4gcmM7Cit9
CisKKy8vIExvY2tzIHRoZSBmaWxlIHdpdGggdGhlIGxvY2sgc3BlY2lmaWVkIGJ5IHBhcmFtZXRl
ciBsb2NrdHlwZSAtIG9uZQorLy8gb2YgdGhlIGZvbGxvd2luZzoKKy8vCisvLyAgICAgKDEpIFNR
TElURV9MT0NLX1NIQVJFRAorLy8gICAgICgyKSBTUUxJVEVfTE9DS19SRVNFUlZFRAorLy8gICAg
ICgzKSBTUUxJVEVfTE9DS19QRU5ESU5HCisvLyAgICAgKDQpIFNRTElURV9MT0NLX0VYQ0xVU0lW
RQorLy8KKy8vIFNvbWV0aW1lcyB3aGVuIHJlcXVlc3Rpbmcgb25lIGxvY2sgc3RhdGUsIGFkZGl0
aW9uYWwgbG9jayBzdGF0ZXMKKy8vIGFyZSBpbnNlcnRlZCBpbiBiZXR3ZWVuLiAgVGhlIGxvY2tp
bmcgbWlnaHQgZmFpbCBvbiBvbmUgb2YgdGhlIGxhdGVyCisvLyB0cmFuc2l0aW9ucyBsZWF2aW5n
IHRoZSBsb2NrIHN0YXRlIGRpZmZlcmVudCBmcm9tIHdoYXQgaXQgc3RhcnRlZCBidXQKKy8vIHN0
aWxsIHNob3J0IG9mIGl0cyBnb2FsLiAgVGhlIGZvbGxvd2luZyBjaGFydCBzaG93cyB0aGUgYWxs
b3dlZAorLy8gdHJhbnNpdGlvbnMgYW5kIHRoZSBpbnNlcnRlZCBpbnRlcm1lZGlhdGUgc3RhdGVz
OgorLy8KKy8vICAgIFVOTE9DS0VEIC0+IFNIQVJFRAorLy8gICAgU0hBUkVEIC0+IFJFU0VSVkVE
CisvLyAgICBTSEFSRUQgLT4gKFBFTkRJTkcpIC0+IEVYQ0xVU0lWRQorLy8gICAgUkVTRVJWRUQg
LT4gKFBFTkRJTkcpIC0+IEVYQ0xVU0lWRQorLy8gICAgUEVORElORyAtPiBFWENMVVNJVkUKK3N0
YXRpYyBpbnQgY2hyb21pdW1Mb2NrKHNxbGl0ZTNfZmlsZSogaWQsIGludCBsb2NrdHlwZSkKK3sK
KyAgICAvLyBUbyBvYnRhaW4gYSBTSEFSRUQgbG9jaywgYSByZWFkLWxvY2sgaXMgb2J0YWluZWQg
b24gdGhlICdwZW5kaW5nCisgICAgLy8gYnl0ZScuICBJZiB0aGlzIGlzIHN1Y2Nlc3NmdWwsIGEg
cmFuZG9tIGJ5dGUgZnJvbSB0aGUgJ3NoYXJlZCBieXRlCisgICAgLy8gcmFuZ2UnIGlzIHJlYWQt
bG9ja2VkIGFuZCB0aGUgbG9jayBvbiB0aGUgJ3BlbmRpbmcgYnl0ZScgcmVsZWFzZWQuCisgICAg
Ly8KKyAgICAvLyBBIHByb2Nlc3MgbWF5IG9ubHkgb2J0YWluIGEgUkVTRVJWRUQgbG9jayBhZnRl
ciBpdCBoYXMgYSBTSEFSRUQgbG9jay4KKyAgICAvLyBBIFJFU0VSVkVEIGxvY2sgaXMgaW1wbGVt
ZW50ZWQgYnkgZ3JhYmJpbmcgYSB3cml0ZS1sb2NrIG9uIHRoZQorICAgIC8vICdyZXNlcnZlZCBi
eXRlJy4gCisgICAgLy8KKyAgICAvLyBBIHByb2Nlc3MgbWF5IG9ubHkgb2J0YWluIGEgUEVORElO
RyBsb2NrIGFmdGVyIGl0IGhhcyBvYnRhaW5lZCBhCisgICAgLy8gU0hBUkVEIGxvY2suIEEgUEVO
RElORyBsb2NrIGlzIGltcGxlbWVudGVkIGJ5IG9idGFpbmluZyBhIHdyaXRlLWxvY2sKKyAgICAv
LyBvbiB0aGUgJ3BlbmRpbmcgYnl0ZScuIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG5ldyBTSEFSRUQg
bG9ja3MgY2FuIGJlCisgICAgLy8gb2J0YWluZWQsIGJ1dCBleGlzdGluZyBTSEFSRUQgbG9ja3Mg
YXJlIGFsbG93ZWQgdG8gcGVyc2lzdC4gQSBwcm9jZXNzCisgICAgLy8gZG9lcyBub3QgaGF2ZSB0
byBvYnRhaW4gYSBSRVNFUlZFRCBsb2NrIG9uIHRoZSB3YXkgdG8gYSBQRU5ESU5HIGxvY2suCisg
ICAgLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IHRoZSBhbGdvcml0aG0gZm9yIHJvbGxpbmcg
YmFjayBhIGpvdXJuYWwgZmlsZQorICAgIC8vIGFmdGVyIGEgY3Jhc2guCisgICAgLy8KKyAgICAv
LyBBbiBFWENMVVNJVkUgbG9jaywgb2J0YWluZWQgYWZ0ZXIgYSBQRU5ESU5HIGxvY2sgaXMgaGVs
ZCwgaXMKKyAgICAvLyBpbXBsZW1lbnRlZCBieSBvYnRhaW5pbmcgYSB3cml0ZS1sb2NrIG9uIHRo
ZSBlbnRpcmUgJ3NoYXJlZCBieXRlCisgICAgLy8gcmFuZ2UnLiBTaW5jZSBhbGwgb3RoZXIgbG9j
a3MgcmVxdWlyZSBhIHJlYWQtbG9jayBvbiBvbmUgb2YgdGhlIGJ5dGVzCisgICAgLy8gd2l0aGlu
IHRoaXMgcmFuZ2UsIHRoaXMgZW5zdXJlcyB0aGF0IG5vIG90aGVyIGxvY2tzIGFyZSBoZWxkIG9u
IHRoZQorICAgIC8vIGRhdGFiYXNlLiAKKworICAgIGludCByYyA9IFNRTElURV9PSzsKKyAgICBz
dHJ1Y3QgZmxvY2sgbG9jazsKKyAgICBpbnQgcyA9IDA7CisgICAgaW50IHRFcnJubzsKKworICAg
IENocm9taXVtRmlsZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlk
KTsKKyAgICBBU1NFUlQocEZpbGUpOworCisgICAgQ2hyb21pdW1Mb2NrSW5mbyogcExvY2sgPSBw
RmlsZS0+cExvY2s7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgbG9jayBvZiB0aGlz
IHR5cGUgb3IgbW9yZSByZXN0cmljdGl2ZSwgZG8gbm90aGluZy4KKyAgICBpZiAocEZpbGUtPmxv
Y2t0eXBlID49IGxvY2t0eXBlKQorICAgICAgICByZXR1cm4gU1FMSVRFX09LOworCisgICAgLy8g
TWFrZSBzdXJlIHdlIG5ldmVyIG1vdmUgZnJvbSB1bmxvY2tlZCB0byBhbnl0aGluZyBoaWdoZXIg
dGhhbiBzaGFyZWQgbG9jay4KKyAgICBBU1NFUlQocEZpbGUtPmxvY2t0eXBlICE9IFNRTElURV9M
T0NLX05PTkUgfHwgbG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfU0hBUkVEKTsKKworICAgIC8vIE1h
a2Ugc3VyZSB3ZSBuZXZlciByZXF1ZXN0IGEgcGVuZGluZyBsb2NrLgorICAgIEFTU0VSVChsb2Nr
dHlwZSAhPSBTUUxJVEVfTE9DS19QRU5ESU5HKTsKKworICAgIC8vIE1ha2Ugc3VyZSBhIHNoYXJl
ZCBsb2NrIGlzIGFsd2F5cyBoZWxkIHdoZW4gYSBSRVNFUlZFRCBsb2NrIGlzIHJlcXVlc3RlZC4K
KyAgICBBU1NFUlQobG9ja3R5cGUgIT0gU1FMSVRFX0xPQ0tfUkVTRVJWRUQgfHwgcEZpbGUtPmxv
Y2t0eXBlID09IFNRTElURV9MT0NLX1NIQVJFRCk7CisKKyAgICAvLyBJZiBzb21lIHRocmVhZCB1
c2luZyB0aGlzIFBJRCBoYXMgYSBsb2NrIHZpYSBhIGRpZmZlcmVudCBDaHJvbWl1bUZpbGUKKyAg
ICAvLyBoYW5kbGUgdGhhdCBwcmVjbHVkZXMgdGhlIHJlcXVlc3RlZCBsb2NrLCByZXR1cm4gQlVT
WS4KKyAgICBpZiAocEZpbGUtPmxvY2t0eXBlICE9IHBMb2NrLT5sb2NrdHlwZQorICAgICAgICAm
JiAocExvY2stPmxvY2t0eXBlID49IFNRTElURV9MT0NLX1BFTkRJTkcgfHwgbG9ja3R5cGUgPiBT
UUxJVEVfTE9DS19TSEFSRUQpKSB7CisgICAgICAgIHJldHVybiBTUUxJVEVfQlVTWTsKKyAgICB9
CisKKyAgICAvLyBJZiBhIFNIQVJFRCBsb2NrIGlzIHJlcXVlc3RlZCwgYW5kIHNvbWUgdGhyZWFk
IHVzaW5nIHRoaXMgUElEIGFscmVhZHkKKyAgICAvLyBoYXMgYSBTSEFSRUQgb3IgUkVTRVJWRUQg
bG9jaywgdGhlbiBqdXN0IGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzLgorICAgIGlmIChsb2Nr
dHlwZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQKKyAgICAgICAgJiYgKHBMb2NrLT5sb2NrdHlwZSA9
PSBTUUxJVEVfTE9DS19TSEFSRUQgfHwgcExvY2stPmxvY2t0eXBlID09IFNRTElURV9MT0NLX1JF
U0VSVkVEKSkgeworICAgICAgICBBU1NFUlQoIXBGaWxlLT5sb2NrdHlwZSk7CisgICAgICAgIEFT
U0VSVChwTG9jay0+Y250ID4gMCk7CisgICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IFNRTElURV9M
T0NLX1NIQVJFRDsKKyAgICAgICAgcExvY2stPmNudCsrOworICAgICAgICBwRmlsZS0+cE9wZW4t
Pm5Mb2NrKys7CisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisgICAgfQorCisgICAgLy8gQSBQ
RU5ESU5HIGxvY2sgaXMgbmVlZGVkIGJlZm9yZSBhY3F1aXJpbmcgYSBTSEFSRUQgbG9jayBhbmQg
YmVmb3JlCisgICAgLy8gYWNxdWlyaW5nIGFuIEVYQ0xVU0lWRSBsb2NrLiAgRm9yIHRoZSBTSEFS
RUQgbG9jaywgdGhlIFBFTkRJTkcgd2lsbAorICAgIC8vIGJlIHJlbGVhc2VkLgorICAgIGxvY2su
bF9sZW4gPSAxOworICAgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKyAgICBpZiAobG9ja3R5
cGUgPT0gU1FMSVRFX0xPQ0tfU0hBUkVEIAorICAgICAgICB8fCAobG9ja3R5cGUgPT0gU1FMSVRF
X0xPQ0tfRVhDTFVTSVZFICYmIHBGaWxlLT5sb2NrdHlwZSA8IFNRTElURV9MT0NLX1BFTkRJTkcp
KSB7CisgICAgICAgIGxvY2subF90eXBlID0gKGxvY2t0eXBlID09IFNRTElURV9MT0NLX1NIQVJF
RCA/IEZfUkRMQ0sgOiBGX1dSTENLKTsKKyAgICAgICAgbG9jay5sX3N0YXJ0ID0gU1FMaXRlUGVu
ZGluZ0J5dGU7CisgICAgICAgIHMgPSBmY250bChwRmlsZS0+aCwgRl9TRVRMSywgJmxvY2spOwor
ICAgICAgICBpZiAocyA9PSAtMSkgeworICAgICAgICAgICAgdEVycm5vID0gZXJybm87CisgICAg
ICAgICAgICByYyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5vLCBTUUxJVEVfSU9F
UlJfTE9DSyk7CisgICAgICAgICAgICBpZiAoKHJjICE9IFNRTElURV9PSykgJiYgKHJjICE9IFNR
TElURV9CVVNZKSkKKyAgICAgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gdEVycm5vOwor
ICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvY2t0
eXBlID09IFNRTElURV9MT0NLX1NIQVJFRCkgeworICAgICAgICBBU1NFUlQoIXBMb2NrLT5jbnQp
OworICAgICAgICBBU1NFUlQoIXBMb2NrLT5sb2NrdHlwZSk7CisKKyAgICAgICAgcyA9IHJhbmdl
TG9jayhwRmlsZSwgRl9SRExDSywgJnRFcnJubyk7CisKKyAgICAgICAgLy8gRHJvcCB0aGUgdGVt
cG9yYXJ5IFBFTkRJTkcgbG9jay4KKyAgICAgICAgbG9jay5sX3N0YXJ0ID0gU1FMaXRlUGVuZGlu
Z0J5dGU7CisgICAgICAgIGxvY2subF9sZW4gPSAxOworICAgICAgICBsb2NrLmxfdHlwZSA9IEZf
VU5MQ0s7CisgICAgICAgIGlmIChmY250bChwRmlsZS0+aCwgRl9TRVRMSywgJmxvY2spKSB7Cisg
ICAgICAgICAgICBpZiAocyAhPSAtMSkgeworICAgICAgICAgICAgICAgIHRFcnJubyA9IGVycm5v
OyAKKyAgICAgICAgICAgICAgICByYyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5v
LCBTUUxJVEVfSU9FUlJfVU5MT0NLKTsgCisgICAgICAgICAgICAgICAgaWYgKChyYyAhPSBTUUxJ
VEVfT0spICYmIChyYyAhPSBTUUxJVEVfQlVTWSkpCisgICAgICAgICAgICAgICAgICAgIHBGaWxl
LT5sYXN0RXJybm8gPSB0RXJybm87CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzID09IC0xKSB7CisgICAgICAgICAgICBy
YyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5vLCBTUUxJVEVfSU9FUlJfTE9DSyk7
CisgICAgICAgICAgICBpZiAoKHJjICE9IFNRTElURV9PSykgJiYgKHJjICE9IFNRTElURV9CVVNZ
KSkKKyAgICAgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gdEVycm5vOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgcEZpbGUtPmxvY2t0eXBlID0gU1FMSVRFX0xPQ0tfU0hBUkVE
OworICAgICAgICAgICAgcEZpbGUtPnBPcGVuLT5uTG9jaysrOworICAgICAgICAgICAgcExvY2st
PmNudCA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxvY2t0eXBlID09IFNRTElURV9M
T0NLX0VYQ0xVU0lWRSAmJiBwTG9jay0+Y250ID4gMSkgeworICAgICAgICAvLyBXZSBhcmUgdHJ5
aW5nIGZvciBhbiBleGNsdXNpdmUgbG9jayBidXQgYW5vdGhlciB0aHJlYWQgaW4gdGhlCisgICAg
ICAgIC8vIHNhbWUgcHJvY2VzcyBpcyBzdGlsbCBob2xkaW5nIGEgc2hhcmVkIGxvY2suCisgICAg
ICAgIHJjID0gU1FMSVRFX0JVU1k7CisgICAgfSAgZWxzZSB7CisgICAgICAgIC8vIFRoZSByZXF1
ZXN0IHdhcyBmb3IgYSBSRVNFUlZFRCBvciBFWENMVVNJVkUgbG9jay4gIEl0IGlzCisgICAgICAg
IC8vIGFzc3VtZWQgdGhhdCB0aGVyZSBpcyBhIFNIQVJFRCBvciBncmVhdGVyIGxvY2sgb24gdGhl
IGZpbGUKKyAgICAgICAgLy8gYWxyZWFkeS4KKyAgICAgICAgQVNTRVJUKHBGaWxlLT5sb2NrdHlw
ZSk7CisgICAgICAgIGxvY2subF90eXBlID0gRl9XUkxDSzsKKyAgICAgICAgc3dpdGNoIChsb2Nr
dHlwZSkgeworICAgICAgICBjYXNlIFNRTElURV9MT0NLX1JFU0VSVkVEOgorICAgICAgICAgICAg
bG9jay5sX3N0YXJ0ID0gU1FMaXRlUmVzZXJ2ZWRCeXRlOworICAgICAgICAgICAgcyA9IGZjbnRs
KHBGaWxlLT5oLCBGX1NFVExLLCAmbG9jayk7CisgICAgICAgICAgICB0RXJybm8gPSBlcnJubzsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9MT0NLX0VYQ0xVU0lWRToK
KyAgICAgICAgICAgIHMgPSByYW5nZUxvY2socEZpbGUsIEZfV1JMQ0ssICZ0RXJybm8pOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocyA9PSAtMSkgeworICAgICAgICAg
ICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRFcnJubywgU1FMSVRFX0lPRVJSX0xP
Q0spOworICAgICAgICAgICAgaWYgKChyYyAhPSBTUUxJVEVfT0spICYmIChyYyAhPSBTUUxJVEVf
QlVTWSkpCisgICAgICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IHRFcnJubzsKKyAgICAg
ICAgfQorICAgIH0KKyAgCisgICAgaWYgKHJjID09IFNRTElURV9PSykgeworICAgICAgICBwRmls
ZS0+bG9ja3R5cGUgPSBsb2NrdHlwZTsKKyAgICAgICAgcExvY2stPmxvY2t0eXBlID0gbG9ja3R5
cGU7CisgICAgfSBlbHNlIGlmIChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19FWENMVVNJVkUpIHsK
KyAgICAgICAgcEZpbGUtPmxvY2t0eXBlID0gU1FMSVRFX0xPQ0tfUEVORElORzsKKyAgICAgICAg
cExvY2stPmxvY2t0eXBlID0gU1FMSVRFX0xPQ0tfUEVORElORzsKKyAgICB9CisKKyAgICByZXR1
cm4gcmM7Cit9CisKKy8vIENsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBmb3IgZ2l2ZW4gQ2hy
b21pdW1GaWxlIGZvciB3aGljaCB0aGUgY2xvc2UgaGFzIGJlZW4gZGVmZXJyZWQuCisvLyBSZXR1
cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGNsb3NlUGVuZGluZ0ZkcyhDaHJv
bWl1bUZpbGUqIHBGaWxlKQoreworICAgIGludCByYyA9IFNRTElURV9PSzsKKyAgICBDaHJvbWl1
bU9wZW5JbmZvKiBwT3BlbiA9IHBGaWxlLT5wT3BlbjsKKyAgICBDaHJvbWl1bVVudXNlZEZkKiBw
RXJyb3IgPSAwOworICAgIENocm9taXVtVW51c2VkRmQqIHBOZXh0OworICAgIGZvciAoQ2hyb21p
dW1VbnVzZWRGZCogcCA9IHBPcGVuLT5wVW51c2VkOyBwOyBwID0gcE5leHQpIHsKKyAgICAgICAg
cE5leHQgPSBwLT5wTmV4dDsKKyAgICAgICAgaWYgKGNsb3NlKHAtPmZkKSkgeworICAgICAgICAg
ICAgcEZpbGUtPmxhc3RFcnJubyA9IGVycm5vOworICAgICAgICAgICAgcmMgPSBTUUxJVEVfSU9F
UlJfQ0xPU0U7CisgICAgICAgICAgICBwLT5wTmV4dCA9IHBFcnJvcjsKKyAgICAgICAgICAgIHBF
cnJvciA9IHA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcWxpdGUzX2ZyZWUocCk7
CisgICAgICAgIH0KKyAgICB9CisgICAgcE9wZW4tPnBVbnVzZWQgPSBwRXJyb3I7CisgICAgcmV0
dXJuIHJjOworfQorCisvLyBMb3dlcnMgdGhlIGxvY2tpbmcgbGV2ZWwgb24gZmlsZSBkZXNjcmlw
dG9yLgorLy8gbG9ja3R5cGUgbXVzdCBiZSBlaXRoZXIgU1FMSVRFX0xPQ0tfTk9ORSBvciBTUUxJ
VEVfTE9DS19TSEFSRUQuCitzdGF0aWMgaW50IGNocm9taXVtVW5sb2NrKHNxbGl0ZTNfZmlsZSog
aWQsIGludCBsb2NrdHlwZSkKK3sKKyAgICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRlcnBy
ZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CisgICAgQVNTRVJUKHBGaWxlKTsKKyAgICBBU1NF
UlQobG9ja3R5cGUgPD0gU1FMSVRFX0xPQ0tfU0hBUkVEKTsKKworCisgICAgaWYgKHBGaWxlLT5s
b2NrdHlwZSA8PSBsb2NrdHlwZSkKKyAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKKworICAgIENo
cm9taXVtTG9ja0luZm8qIHBMb2NrID0gcEZpbGUtPnBMb2NrOworICAgIEFTU0VSVChwTG9jay0+
Y250KTsKKworICAgIHN0cnVjdCBmbG9jayBsb2NrOworICAgIGludCByYyA9IFNRTElURV9PSzsK
KyAgICBpbnQgaCA9IHBGaWxlLT5oOworICAgIGludCB0RXJybm87CisKKyAgICBpZiAocEZpbGUt
PmxvY2t0eXBlID4gU1FMSVRFX0xPQ0tfU0hBUkVEKSB7CisgICAgICAgIEFTU0VSVChwTG9jay0+
bG9ja3R5cGUgPT0gcEZpbGUtPmxvY2t0eXBlKTsKKworICAgICAgICBpZiAobG9ja3R5cGUgPT0g
U1FMSVRFX0xPQ0tfU0hBUkVEKSB7CisgICAgICAgICAgICBpZiAocmFuZ2VMb2NrKHBGaWxlLCBG
X1JETENLLCAmdEVycm5vKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJjID0gc3FsaXRlRXJy
b3JGcm9tUG9zaXhFcnJvcih0RXJybm8sIFNRTElURV9JT0VSUl9SRExPQ0spOworICAgICAgICAg
ICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAmJiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAg
ICAgICAgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gdEVycm5vOworICAgICAgICAgICAg
ICAgIGlmIChyYyA9PSBTUUxJVEVfT0spCisgICAgICAgICAgICAgICAgICAgIHBGaWxlLT5sb2Nr
dHlwZSA9IGxvY2t0eXBlOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICAgICBsb2NrLmxfdHlwZSA9IEZfVU5MQ0s7CisgICAgICAgIGxv
Y2subF93aGVuY2UgPSBTRUVLX1NFVDsKKyAgICAgICAgbG9jay5sX3N0YXJ0ID0gU1FMaXRlUGVu
ZGluZ0J5dGU7CisgICAgICAgIGxvY2subF9sZW4gPSAyOworICAgICAgICBpZiAoZmNudGwoaCwg
Rl9TRVRMSywgJmxvY2spICE9IC0xKQorICAgICAgICAgICAgcExvY2stPmxvY2t0eXBlID0gU1FM
SVRFX0xPQ0tfU0hBUkVEOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRFcnJubyA9IGVy
cm5vOworICAgICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRFcnJubywg
U1FMSVRFX0lPRVJSX1VOTE9DSyk7CisgICAgICAgICAgICBpZiAoKHJjICE9IFNRTElURV9PSykg
JiYgKHJjICE9IFNRTElURV9CVVNZKSkKKyAgICAgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5v
ID0gdEVycm5vOworICAgICAgICAgICAgaWYgKHJjID09IFNRTElURV9PSykKKyAgICAgICAgICAg
ICAgICBwRmlsZS0+bG9ja3R5cGUgPSBsb2NrdHlwZTsKKyAgICAgICAgICAgIHJldHVybiByYzsK
KyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfTk9ORSkg
eworICAgICAgICBzdHJ1Y3QgQ2hyb21pdW1PcGVuSW5mbyAqcE9wZW47CisKKyAgICAgICAgcExv
Y2stPmNudC0tOworCisgICAgICAgIC8vIFJlbGVhc2UgdGhlIGxvY2sgdXNpbmcgYW4gT1MgY2Fs
bCBvbmx5IHdoZW4gYWxsIHRocmVhZHMgaW4gdGhpcyBzYW1lIHByb2Nlc3MgaGF2ZSByZWxlYXNl
ZCB0aGUgbG9jay4KKyAgICAgICAgaWYgKCFwTG9jay0+Y250KSB7CisgICAgICAgICAgICBsb2Nr
LmxfdHlwZSA9IEZfVU5MQ0s7CisgICAgICAgICAgICBsb2NrLmxfd2hlbmNlID0gU0VFS19TRVQ7
CisgICAgICAgICAgICBsb2NrLmxfc3RhcnQgPSBsb2NrLmxfbGVuID0gMEw7CisgICAgICAgICAg
ICBpZiAoZmNudGwoaCwgRl9TRVRMSywgJmxvY2spICE9IC0xKQorICAgICAgICAgICAgICAgIHBM
b2NrLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX05PTkU7CisgICAgICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgICAgICB0RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgICAgICByYyA9IHNxbGl0
ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5vLCBTUUxJVEVfSU9FUlJfVU5MT0NLKTsKKyAgICAg
ICAgICAgICAgICBpZiAoKHJjICE9IFNRTElURV9PSykgJiYgKHJjICE9IFNRTElURV9CVVNZKSkK
KyAgICAgICAgICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IHRFcnJubzsKKyAgICAgICAg
ICAgICAgICBwTG9jay0+bG9ja3R5cGUgPSBTUUxJVEVfTE9DS19OT05FOworICAgICAgICAgICAg
ICAgIHBGaWxlLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX05PTkU7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICBwT3BlbiA9IHBGaWxlLT5wT3BlbjsKKyAgICAgICAgcE9wZW4t
Pm5Mb2NrLS07CisgICAgICAgIEFTU0VSVChwT3Blbi0+bkxvY2sgPj0gMCk7CisgICAgICAgIGlm
ICghcE9wZW4tPm5Mb2NrKSB7CisgICAgICAgICAgICBpbnQgcmMyID0gY2xvc2VQZW5kaW5nRmRz
KHBGaWxlKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfT0spCisgICAgICAgICAgICAg
ICAgcmMgPSByYzI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmMgPT0gU1FMSVRFX09L
KQorICAgICAgICBwRmlsZS0+bG9ja3R5cGUgPSBsb2NrdHlwZTsKKyAgICByZXR1cm4gcmM7Cit9
CisKKy8vIENsb3NlcyBhbGwgZmlsZSBoYW5kbGVzIGZvciBnaXZlbiBDaHJvbWl1bUZpbGUgYW5k
IHNldHMgYWxsIGl0cyBmaWVsZHMgdG8gMC4KKy8vIFJldHVybnMgYSBTUUxpdGUgZXJyb3IgY29k
ZS4KK3N0YXRpYyBpbnQgY2xvc2VDaHJvbWl1bUZpbGUoc3FsaXRlM19maWxlKiBpZCkKK3sKKyAg
ICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihp
ZCk7CisgICAgaWYgKCFwRmlsZSkKKyAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKKyAgICBpZiAo
cEZpbGUtPmRpcmZkID49IDApIHsKKyAgICAgICAgaWYgKGNsb3NlKHBGaWxlLT5kaXJmZCkpIHsK
KyAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgIHJldHVy
biBTUUxJVEVfSU9FUlJfRElSX0NMT1NFOworICAgICAgICB9CisgICAgICAgIHBGaWxlLT5kaXJm
ZCA9IC0xOworICAgIH0KKyAgICBpZiAocEZpbGUtPmggPj0gMCkgeworICAgICAgICBpZiAoY2xv
c2UocEZpbGUtPmgpKSB7CisgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJybm87Cisg
ICAgICAgICAgICByZXR1cm4gU1FMSVRFX0lPRVJSX0NMT1NFOworICAgICAgICB9CisgICAgfQor
ICAgIHNxbGl0ZTNfZnJlZShwRmlsZS0+cFVudXNlZCk7CisgICAgbWVtc2V0KHBGaWxlLCAwLCBz
aXplb2YoQ2hyb21pdW1GaWxlKSk7CisgICAgcmV0dXJuIFNRTElURV9PSzsKK30KKworLy8gQ2xv
c2VzIGEgQ2hyb21pdW1GaWxlLCBpbmNsdWRpbmcgbG9ja2luZyBvcGVyYXRpb25zLiBSZXR1cm5z
IGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGNocm9taXVtQ2xvc2Uoc3FsaXRlM19m
aWxlKiBpZCkKK3sKKyAgICBpZiAoIWlkKQorICAgICAgICByZXR1cm4gU1FMSVRFX09LOworCisg
ICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4o
aWQpOworICAgIGNocm9taXVtVW5sb2NrKGlkLCBTUUxJVEVfTE9DS19OT05FKTsKKyAgICBpZiAo
cEZpbGUtPnBPcGVuICYmIHBGaWxlLT5wT3Blbi0+bkxvY2spIHsKKyAgICAgICAgLy8gSWYgdGhl
cmUgYXJlIG91dHN0YW5kaW5nIGxvY2tzLCBkbyBub3QgYWN0dWFsbHkgY2xvc2UgdGhlIGZpbGUg
anVzdAorICAgICAgICAvLyB5ZXQgYmVjYXVzZSB0aGF0IHdvdWxkIGNsZWFyIHRob3NlIGxvY2tz
LgorICAgICAgICBDaHJvbWl1bU9wZW5JbmZvKiBwT3BlbiA9IHBGaWxlLT5wT3BlbjsKKyAgICAg
ICAgQ2hyb21pdW1VbnVzZWRGZCogcCA9IHBGaWxlLT5wVW51c2VkOworICAgICAgICBwLT5wTmV4
dCA9IHBPcGVuLT5wVW51c2VkOworICAgICAgICBwT3Blbi0+cFVudXNlZCA9IHA7CisgICAgICAg
IHBGaWxlLT5oID0gLTE7CisgICAgICAgIHBGaWxlLT5wVW51c2VkID0gMDsKKyAgICB9CisgICAg
cmVsZWFzZUxvY2tJbmZvKHBGaWxlLT5wTG9jayk7CisgICAgcmVsZWFzZU9wZW5JbmZvKHBGaWxl
LT5wT3Blbik7CisgICAgcmV0dXJuIGNsb3NlQ2hyb21pdW1GaWxlKGlkKTsKK30KKworc3RhdGlj
IGludCBjaHJvbWl1bUNoZWNrUmVzZXJ2ZWRMb2NrTm9vcChzcWxpdGUzX2ZpbGUqLCBpbnQqIHBS
ZXNPdXQpCit7CisgICAgKnBSZXNPdXQgPSAwOworICAgIHJldHVybiBTUUxJVEVfT0s7Cit9CisK
K3N0YXRpYyBpbnQgY2hyb21pdW1Mb2NrTm9vcChzcWxpdGUzX2ZpbGUqLCBpbnQpCit7CisgICAg
cmV0dXJuIFNRTElURV9PSzsKK30KKworc3RhdGljIGludCBjaHJvbWl1bVVubG9ja05vb3Aoc3Fs
aXRlM19maWxlKiwgaW50KQoreworICAgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKKy8vIFNlZWtz
IHRvIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IGFuZCByZWFkcyB1cCB0byB8Y250fCBieXRlcyBpbnRv
IHxwQnVmfC4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4KK3N0YXRpYyBp
bnQgc2Vla0FuZFJlYWQoQ2hyb21pdW1GaWxlKiBpZCwgc3FsaXRlM19pbnQ2NCBvZmZzZXQsIHZv
aWQqIHBCdWYsIGludCBjbnQpCit7CisgICAgc3FsaXRlX2ludDY0IG5ld09mZnNldCA9IGxzZWVr
KGlkLT5oLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAobmV3T2Zmc2V0ICE9IG9mZnNldCkg
eworICAgICAgICBpZC0+bGFzdEVycm5vID0gKG5ld09mZnNldCA9PSAtMSkgPyBlcnJubyA6IDA7
CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IGdvdCA9IHJlYWQoaWQtPmgsIHBC
dWYsIGNudCk7CisgICAgaWYgKGdvdCA8IDApCisgICAgICAgIGlkLT5sYXN0RXJybm8gPSBlcnJu
bzsKKyAgICByZXR1cm4gZ290OworfQorCisvLyBSZWFkcyBkYXRhIGZyb20gZmlsZSBpbnRvIGEg
YnVmZmVyLiBSZXR1cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGNocm9taXVt
UmVhZChzcWxpdGUzX2ZpbGUqIGlkLCB2b2lkKiBwQnVmLCBpbnQgYW10LCBzcWxpdGUzX2ludDY0
IG9mZnNldCkKK3sKKyAgICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRlcnByZXRfY2FzdDxD
aHJvbWl1bUZpbGUqPihpZCk7CisgICAgQVNTRVJUKHBGaWxlKTsKKworICAgIC8vIFRoZSBieXRl
cyBpbiB0aGUgbG9ja2luZyByYW5nZSBzaG91bGQgbmV2ZXIgYmUgcmVhZC4KKyAgICBBU1NFUlQo
IXBGaWxlLT5wVW51c2VkIHx8IG9mZnNldCA+PSBTUUxpdGVQZW5kaW5nQnl0ZSArIDUxMiB8fCBv
ZmZzZXQgKyBhbXQgPD0gU1FMaXRlUGVuZGluZ0J5dGUpOworCisgICAgaW50IGdvdCA9IHNlZWtB
bmRSZWFkKHBGaWxlLCBvZmZzZXQsIHBCdWYsIGFtdCk7CisgICAgaWYgKGdvdCA9PSBhbXQpCisg
ICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisKKyAgICBpZiAoZ290IDwgMCkKKyAgICAgICAgcmV0
dXJuIFNRTElURV9JT0VSUl9SRUFEOworCisgICAgLy8gVW5yZWFkIHBhcnRzIG9mIHRoZSBidWZm
ZXIgbXVzdCBiZSB6ZXJvLWZpbGxlZC4KKyAgICBtZW1zZXQoJihyZWludGVycHJldF9jYXN0PGNo
YXIqPihwQnVmKSlbZ290XSwgMCwgYW10IC0gZ290KTsKKyAgICBwRmlsZS0+bGFzdEVycm5vID0g
MDsKKyAgICByZXR1cm4gU1FMSVRFX0lPRVJSX1NIT1JUX1JFQUQ7Cit9CisKKy8vIFNlZWtzIHRv
IHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IGFuZCB3cml0ZXMgdXAgdG8gfGNudHwgYnl0ZXMuIFJldHVy
bnMgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCitzdGF0aWMgaW50IHNlZWtBbmRX
cml0ZShDaHJvbWl1bUZpbGUqIGlkLCBzcWxpdGVfaW50NjQgb2Zmc2V0LCBjb25zdCB2b2lkKiBw
QnVmLCBpbnQgY250KQoreworICAgIHNxbGl0ZV9pbnQ2NCBuZXdPZmZzZXQgPSBsc2VlayhpZC0+
aCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKG5ld09mZnNldCAhPSBvZmZzZXQpIHsKKyAg
ICAgICAgaWQtPmxhc3RFcnJubyA9IChuZXdPZmZzZXQgPT0gLTEpID8gZXJybm8gOiAwOworICAg
ICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBnb3QgPSB3cml0ZShpZC0+aCwgcEJ1Ziwg
Y250KTsKKyAgICBpZiAoZ290IDwgMCkKKyAgICAgICAgaWQtPmxhc3RFcnJubyA9IGVycm5vOwor
ICAgIHJldHVybiBnb3Q7Cit9CisKKy8vIFdyaXRlcyBkYXRhIGZyb20gYnVmZmVyIGludG8gYSBm
aWxlLiBSZXR1cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGNocm9taXVtV3Jp
dGUoc3FsaXRlM19maWxlKiBpZCwgY29uc3Qgdm9pZCogcEJ1ZiwgaW50IGFtdCwgc3FsaXRlM19p
bnQ2NCBvZmZzZXQpCit7CisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nh
c3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7CisgICAgQVNTRVJUKGFt
dCA+IDApOworCisgICAgLy8gVGhlIGJ5dGVzIGluIHRoZSBsb2NraW5nIHJhbmdlIHNob3VsZCBu
ZXZlciBiZSB3cml0dGVuLgorICAgIEFTU0VSVCghcEZpbGUtPnBVbnVzZWQgfHwgb2Zmc2V0ID49
IFNRTGl0ZVBlbmRpbmdCeXRlICsgNTEyIHx8IG9mZnNldCArIGFtdCA8PSBTUUxpdGVQZW5kaW5n
Qnl0ZSk7CisKKyAgICBpbnQgd3JvdGUgPSAwOworICAgIHdoaWxlIChhbXQgPiAwICYmICh3cm90
ZSA9IHNlZWtBbmRXcml0ZShwRmlsZSwgb2Zmc2V0LCBwQnVmLCBhbXQpKSA+IDApIHsKKyAgICAg
ICAgYW10IC09IHdyb3RlOworICAgICAgICBvZmZzZXQgKz0gd3JvdGU7CisgICAgICAgIHBCdWYg
PSAmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBCdWYpKVt3cm90ZV07CisgICAgfQor
ICAgIGlmIChhbXQgPiAwKSB7CisgICAgICAgIGlmICh3cm90ZSA8IDApCisgICAgICAgICAgICBy
ZXR1cm4gU1FMSVRFX0lPRVJSX1dSSVRFOworICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gMDsK
KyAgICAgICAgcmV0dXJuIFNRTElURV9GVUxMOworICAgIH0KKyAgICByZXR1cm4gU1FMSVRFX09L
OworfQorCisvLyBNYWtlcyBzdXJlIGFsbCB3cml0ZXMgdG8gYSBwYXJ0aWN1bGFyIGZpbGUgYXJl
IGNvbW1pdHRlZCB0byBkaXNrLiBSZXR1cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMg
aW50IGNocm9taXVtU3luYyhzcWxpdGUzX2ZpbGUqIGlkLCBpbnQgZmxhZ3MpCit7CisgICAgQVNT
RVJUKChmbGFncyAmIDB4MEYpID09IFNRTElURV9TWU5DX05PUk1BTCB8fCAoZmxhZ3MgJiAweDBG
KSA9PSBTUUxJVEVfU1lOQ19GVUxMKTsKKworICAgIENocm9taXVtRmlsZSogcEZpbGUgPSByZWlu
dGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAgICBBU1NFUlQocEZpbGUpOworCisg
ICAgaWYgKGZzeW5jKHBGaWxlLT5oKSkgeworICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJy
bm87CisgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlJfRlNZTkM7CisgICAgfQorCisgICAgaWYg
KHBGaWxlLT5kaXJmZCA+PSAwKSB7CisgICAgICAgIGlmICghY2xvc2UocEZpbGUtPmRpcmZkKSkK
KyAgICAgICAgICAgIHBGaWxlLT5kaXJmZCA9IC0xOworICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgIHJldHVybiBTUUxJVEVf
SU9FUlJfRElSX0NMT1NFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFNRTElURV9P
SzsKK30KKworLy8gVHJ1bmNhdGVzIGFuIG9wZW4gZmlsZSB0byB0aGUgc3BlY2lmaWVkIHNpemUu
IFJldHVybnMgYSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQgY2hyb21pdW1UcnVuY2F0
ZShzcWxpdGUzX2ZpbGUqIGlkLCBzcWxpdGVfaW50NjQgbkJ5dGUpCit7CisgICAgQ2hyb21pdW1G
aWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIEFT
U0VSVChwRmlsZSk7CisKKyAgICBpZiAoZnRydW5jYXRlKHBGaWxlLT5oLCBuQnl0ZSkpIHsKKyAg
ICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IGVycm5vOworICAgICAgICByZXR1cm4gU1FMSVRFX0lP
RVJSX1RSVU5DQVRFOworICAgIH0KKworICAgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKKy8vIERl
dGVybWluZXMgdGhlIHNpemUgb2YgYSBmaWxlIGluIGJ5dGVzLiBSZXR1cm5zIGEgU1FMaXRlIGVy
cm9yIGNvZGUuCitzdGF0aWMgaW50IGNocm9taXVtRmlsZVNpemUoc3FsaXRlM19maWxlKiBpZCwg
c3FsaXRlX2ludDY0KiBwU2l6ZSkKK3sKKyAgICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRl
cnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CisgICAgQVNTRVJUKHBGaWxlKTsKKworICAg
IHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpZiAoZnN0YXQocEZpbGUtPmgsICZidWYpKSB7CisgICAg
ICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgcmV0dXJuIFNRTElURV9JT0VS
Ul9GU1RBVDsKKyAgICB9CisgICAgKnBTaXplID0gYnVmLnN0X3NpemU7CisKKyNpZiBQTEFURk9S
TShNQUMpCisgICAgLy8gV2hlbiBvcGVuaW5nIGEgemVyby1zaXplIGRhdGFiYXNlLCBmaW5kTG9j
a0luZm8gd3JpdGVzIGEgc2luZ2xlIGJ5dGUgaW50byB0aGF0IGZpbGUKKyAgICAvLyBpbiBvcmRl
ciB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgT1MgWCBtc2RvcyBmaWxlc3lzdGVtLiBJbiBv
cmRlciB0byBhdm9pZCBwcm9ibGVtcworICAgIC8vIHdpdGggdXBwZXIgbGF5ZXJzLCB3ZSBuZWVk
IHRvIHJlcG9ydCB0aGlzIGZpbGUgc2l6ZSBhcyB6ZXJvIGV2ZW4gdGhvdWdoIGl0IGlzIHJlYWxs
eSAxLgorICAgIC8vIFNlZSBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvY3ZzdHJhYy90a3R2aWV3P3Ru
PTMyNjAuCisgICAgaWYgKCpwU2l6ZSA9PSAxKQorICAgICAgICAqcFNpemUgPSAwOworI2VuZGlm
CisKKyAgICByZXR1cm4gU1FMSVRFX09LOworfQorCitzdGF0aWMgaW50IGNocm9taXVtRmlsZUNv
bnRyb2woc3FsaXRlM19maWxlKiBpZCwgaW50IG9wLCB2b2lkKiBwQXJnKQoreworICAgIENocm9t
aXVtRmlsZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAg
ICBBU1NFUlQocEZpbGUpOworCisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgU1FMSVRFX0ZD
TlRMX0xPQ0tTVEFURToKKyAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8aW50Kj4ocEFyZykgPSBw
RmlsZS0+bG9ja3R5cGU7CisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisgICAgY2FzZSBTUUxJ
VEVfTEFTVF9FUlJOTzoKKyAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8aW50Kj4ocEFyZykgPSBw
RmlsZS0+bGFzdEVycm5vOworICAgICAgICByZXR1cm4gU1FMSVRFX09LOworICAgIH0KKyAgICBy
ZXR1cm4gU1FMSVRFX0VSUk9SOworfQorCitzdGF0aWMgaW50IGNocm9taXVtU2VjdG9yU2l6ZShz
cWxpdGUzX2ZpbGUqKQoreworICAgIHJldHVybiA1MTI7Cit9CisKK3N0YXRpYyBpbnQgY2hyb21p
dW1EZXZpY2VDaGFyYWN0ZXJpc3RpY3Moc3FsaXRlM19maWxlKikKK3sKKyAgICByZXR1cm4gMDsK
K30KKworc3RhdGljIGNvbnN0IHNxbGl0ZTNfaW9fbWV0aG9kcyBwb3NpeElvTWV0aG9kcyA9IHsK
KyAgICAxLAorICAgIGNocm9taXVtQ2xvc2UsCisgICAgY2hyb21pdW1SZWFkLAorICAgIGNocm9t
aXVtV3JpdGUsCisgICAgY2hyb21pdW1UcnVuY2F0ZSwKKyAgICBjaHJvbWl1bVN5bmMsCisgICAg
Y2hyb21pdW1GaWxlU2l6ZSwKKyAgICBjaHJvbWl1bUxvY2ssCisgICAgY2hyb21pdW1VbmxvY2ss
CisgICAgY2hyb21pdW1DaGVja1Jlc2VydmVkTG9jaywKKyAgICBjaHJvbWl1bUZpbGVDb250cm9s
LAorICAgIGNocm9taXVtU2VjdG9yU2l6ZSwKKyAgICBjaHJvbWl1bURldmljZUNoYXJhY3Rlcmlz
dGljcworfTsKKworc3RhdGljIGNvbnN0IHNxbGl0ZTNfaW9fbWV0aG9kcyBub2xvY2tJb01ldGhv
ZHMgPSB7CisgICAgMSwKKyAgICBjbG9zZUNocm9taXVtRmlsZSwgLy8gVXNlIGEgbm9uLWxvY2tp
bmcgaW50ZXJuYWwgZnVuY3Rpb24uCisgICAgY2hyb21pdW1SZWFkLAorICAgIGNocm9taXVtV3Jp
dGUsCisgICAgY2hyb21pdW1UcnVuY2F0ZSwKKyAgICBjaHJvbWl1bVN5bmMsCisgICAgY2hyb21p
dW1GaWxlU2l6ZSwKKyAgICBjaHJvbWl1bUxvY2tOb29wLAorICAgIGNocm9taXVtVW5sb2NrTm9v
cCwKKyAgICBjaHJvbWl1bUNoZWNrUmVzZXJ2ZWRMb2NrTm9vcCwKKyAgICBjaHJvbWl1bUZpbGVD
b250cm9sLAorICAgIGNocm9taXVtU2VjdG9yU2l6ZSwKKyAgICBjaHJvbWl1bURldmljZUNoYXJh
Y3RlcmlzdGljcworfTsKKworLy8gSW5pdGlhbGl6ZXMgYSBDaHJvbWl1bUZpbGUuIFJldHVybnMg
YSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQgZmlsbEluQ2hyb21pdW1GaWxlKHNxbGl0
ZTNfdmZzKiBwVmZzLCBpbnQgaCwgaW50IGRpcmZkLCBzcWxpdGUzX2ZpbGUqIHBJZCwgY29uc3Qg
Y2hhciogekZpbGVuYW1lLCBpbnQgbm9Mb2NrKQoreworICAgIENocm9taXVtRmlsZSogcE5ldyA9
IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4ocElkKTsKKworICAgIEFTU0VSVCghcE5l
dy0+cExvY2spOworICAgIEFTU0VSVCghcE5ldy0+cE9wZW4pOworCisgICAgcE5ldy0+aCA9IGg7
CisgICAgcE5ldy0+ZGlyZmQgPSBkaXJmZDsKKworICAgIGludCByYyA9IFNRTElURV9PSzsKKyAg
ICBjb25zdCBzcWxpdGUzX2lvX21ldGhvZHMqIHBMb2NraW5nU3R5bGU7CisgICAgaWYgKG5vTG9j
aykKKyAgICAgICAgcExvY2tpbmdTdHlsZSA9ICZub2xvY2tJb01ldGhvZHM7CisgICAgZWxzZSB7
CisgICAgICAgIHBMb2NraW5nU3R5bGUgPSAmcG9zaXhJb01ldGhvZHM7CisgICAgICAgIHJjID0g
ZmluZExvY2tJbmZvKHBOZXcsICZwTmV3LT5wTG9jaywgJnBOZXctPnBPcGVuKTsKKyAgICAgICAg
aWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgLy8gSWYgYW4gZXJyb3Igb2NjdXJl
ZCBpbiBmaW5kTG9ja0luZm8oKSwgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICAg
ICAgLy8gaW1tZWRpYXRlbHkuIFRoaXMgY2FuIGhhcHBlbiBpbiB0d28gc2NlbmFyaW9zOgorICAg
ICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgKGEpIEEgY2FsbCB0byBmc3RhdCgpIGZhaWxl
ZC4KKyAgICAgICAgICAgIC8vICAgKGIpIEEgbWFsbG9jIGZhaWxlZC4KKyAgICAgICAgICAgIC8v
CisgICAgICAgICAgICAvLyBTY2VuYXJpbyAoYikgbWF5IG9ubHkgb2NjdXIgaWYgdGhlIHByb2Nl
c3MgaXMgaG9sZGluZyBubyBvdGhlcgorICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9ycyBv
cGVuIG9uIHRoZSBzYW1lIGZpbGUuIElmIHRoZXJlIHdlcmUgb3RoZXIgZmlsZQorICAgICAgICAg
ICAgLy8gZGVzY3JpcHRvcnMgb24gdGhpcyBmaWxlLCB0aGVuIG5vIG1hbGxvYyB3b3VsZCBiZSBy
ZXF1aXJlZCBieQorICAgICAgICAgICAgLy8gZmluZExvY2tJbmZvKCkuIElmIHRoaXMgaXMgdGhl
IGNhc2UsIGl0IGlzIHF1aXRlIHNhZmUgdG8gY2xvc2UKKyAgICAgICAgICAgIC8vIGhhbmRsZSBo
IC0gYXMgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IG5vIHBvc2l4IGxvY2tzIHdpbGwgYmUgcmVsZWFz
ZWQKKyAgICAgICAgICAgIC8vIGJ5IGRvaW5nIHNvLgorICAgICAgICAgICAgLy8KKyAgICAgICAg
ICAgIC8vIElmIHNjZW5hcmlvIChhKSBjYXVzZWQgdGhlIGVycm9yIHRoZW4gdGhpbmdzIGFyZSBu
b3Qgc28gc2FmZS4gVGhlCisgICAgICAgICAgICAvLyBpbXBsaWNpdCBhc3N1bXB0aW9uIGhlcmUg
aXMgdGhhdCBpZiBmc3RhdCgpIGZhaWxzLCB0aGluZ3MgYXJlIGluCisgICAgICAgICAgICAvLyBz
dWNoIGJhZCBzaGFwZSB0aGF0IGRyb3BwaW5nIGEgbG9jayBvciB0d28gZG9lc24ndCBtYXR0ZXIg
bXVjaC4KKyAgICAgICAgICAgIGNsb3NlKGgpOworICAgICAgICAgICAgaCA9IC0xOworICAgICAg
ICB9CisgICAgfQorCisgICAgcE5ldy0+bGFzdEVycm5vID0gMDsKKyAgICBpZiAocmMgIT0gU1FM
SVRFX09LKSB7CisgICAgICAgIGlmIChkaXJmZCA+PSAwKQorICAgICAgICAgICAgY2xvc2UoZGly
ZmQpOworICAgICAgICBpZiAoaCA+PSAwKQorICAgICAgICAgICAgY2xvc2UoaCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgcE5ldy0+cE1ldGhvZCA9IHBMb2NraW5nU3R5bGU7CisgICAgfQorICAg
IHJldHVybiByYzsKK30KKworLy8gU2VhcmNoZXMgZm9yIGFuIHVudXNlZCBmaWxlIGRlc2NyaXB0
b3IgdGhhdCB3YXMgb3BlbmVkIG9uIHRoZSBkYXRhYmFzZSAKKy8vIGZpbGUgaWRlbnRpZmllZCBi
eSB6UGF0aCB3aXRoIG1hdGNoaW5nIGZsYWdzLiBSZXR1cm5zIDAgaWYgbm90IGZvdW5kLgorc3Rh
dGljIENocm9taXVtVW51c2VkRmQqIGZpbmRSZXVzYWJsZUZkKGNvbnN0IGNoYXIqIHpQYXRoLCBp
bnQgZmxhZ3MpCit7CisgICAgQ2hyb21pdW1VbnVzZWRGZCogcFVudXNlZCA9IDA7CisKKyAgICBz
dHJ1Y3Qgc3RhdCBzU3RhdDsKKyAgICBpZiAoIXN0YXQoelBhdGgsICZzU3RhdCkpIHsKKyAgICAg
ICAgQ2hyb21pdW1GaWxlSWQgaWQ7CisgICAgICAgIGlkLmRldiA9IHNTdGF0LnN0X2RldjsKKyAg
ICAgICAgaWQuaW5vID0gc1N0YXQuc3RfaW5vOworCisgICAgICAgIENocm9taXVtT3BlbkluZm8q
IHBPID0gMDsKKyAgICAgICAgZm9yIChwTyA9IG9wZW5MaXN0OyBwTyAmJiBtZW1jbXAoJmlkLCAm
cE8tPmZpbGVJZCwgc2l6ZW9mKGlkKSk7IHBPID0gcE8tPnBOZXh0KSB7IH0KKyAgICAgICAgaWYg
KHBPKSB7CisgICAgICAgICAgICBDaHJvbWl1bVVudXNlZEZkKiogcHA7CisgICAgICAgICAgICBm
b3IgKHBwID0gJnBPLT5wVW51c2VkOyAqcHAgJiYgKCpwcCktPmZsYWdzICE9IGZsYWdzOyBwcCA9
ICYoKCpwcCktPnBOZXh0KSkgeyB9CisgICAgICAgICAgICBwVW51c2VkID0gKnBwOworICAgICAg
ICAgICAgaWYgKHBVbnVzZWQpCisgICAgICAgICAgICAgICAgKnBwID0gcFVudXNlZC0+cE5leHQ7
CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBVbnVzZWQ7Cit9CisKIC8vIE9wZW5zIGEg
ZmlsZS4KIC8vCiAvLyB2ZnMgLSBwb2ludGVyIHRvIHRoZSBzcWxpdGUzX3ZmcyBvYmplY3QuCkBA
IC02MiwxMSArOTY2LDIzIEBAIG5hbWVzcGFjZSB7CiBpbnQgY2hyb21pdW1PcGVuKHNxbGl0ZTNf
dmZzKiB2ZnMsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLAogICAgICAgICAgICAgICAgICBzcWxpdGUz
X2ZpbGUqIGlkLCBpbnQgZGVzaXJlZEZsYWdzLCBpbnQqIHVzZWRGbGFncykKIHsKLSAgICBjaHJv
bWl1bV9zcWxpdGUzX2luaXRpYWxpemVfdW5peF9zcWxpdGUzX2ZpbGUoaWQpOworICAgIC8vIFRo
ZSBtYXNrIDB4MDAwMDdGMDAgZ2l2ZXMgdXMgdGhlIDcgYml0cyB0aGF0IGRldGVybWluZSB0aGUg
dHlwZSBvZiB0aGUgZmlsZSBTUUxpdGUgaXMgdHJ5aW5nIHRvIG9wZW4uCisgICAgaW50IGZpbGVU
eXBlID0gZGVzaXJlZEZsYWdzICYgMHgwMDAwN0YwMDsKKworICAgIG1lbXNldChpZCwgMCwgc2l6
ZW9mKENocm9taXVtRmlsZSkpOworICAgIENocm9taXVtRmlsZSogdW5peFNRTGl0ZTNGaWxlID0g
cmVpbnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CiAgICAgaW50IGZkID0gLTE7Ci0g
ICAgaW50IHJlc3VsdCA9IGNocm9taXVtX3NxbGl0ZTNfZ2V0X3JldXNhYmxlX2ZpbGVfaGFuZGxl
KGlkLCBmaWxlTmFtZSwgZGVzaXJlZEZsYWdzLCAmZmQpOwotICAgIGlmIChyZXN1bHQgIT0gU1FM
SVRFX09LKQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGlmIChmaWxlVHlwZSA9PSBTUUxJ
VEVfT1BFTl9NQUlOX0RCKSB7CisgICAgICAgIENocm9taXVtVW51c2VkRmQqIHVudXNlZEZkID0g
ZmluZFJldXNhYmxlRmQoZmlsZU5hbWUsIGRlc2lyZWRGbGFncyk7CisgICAgICAgIGlmICh1bnVz
ZWRGZCkKKyAgICAgICAgICAgIGZkID0gdW51c2VkRmQtPmZkOworICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgIHVudXNlZEZkID0gc3RhdGljX2Nhc3Q8Q2hyb21pdW1VbnVzZWRGZCo+KHNxbGl0
ZTNfbWFsbG9jKHNpemVvZigqdW51c2VkRmQpKSk7CisgICAgICAgICAgICBpZiAoIXVudXNlZEZk
KQorICAgICAgICAgICAgICAgIHJldHVybiBTUUxJVEVfTk9NRU07CisgICAgICAgIH0KKyAgICAg
ICAgdW5peFNRTGl0ZTNGaWxlLT5wVW51c2VkID0gdW51c2VkRmQ7CisgICAgfQogCiAgICAgaWYg
KGZkIDwgMCkgewogICAgICAgICBmZCA9IENocm9taXVtQnJpZGdlOjpkYXRhYmFzZU9wZW5GaWxl
KGZpbGVOYW1lLCBkZXNpcmVkRmxhZ3MpOwpAQCAtNzYsMjIgKzk5MiwyMyBAQCBpbnQgY2hyb21p
dW1PcGVuKHNxbGl0ZTNfdmZzKiB2ZnMsIGNvbnN0CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYg
KGZkIDwgMCkgewotICAgICAgICBjaHJvbWl1bV9zcWxpdGUzX2Rlc3Ryb3lfcmV1c2FibGVfZmls
ZV9oYW5kbGUoaWQpOworICAgICAgICBzcWxpdGUzX2ZyZWUodW5peFNRTGl0ZTNGaWxlLT5wVW51
c2VkKTsKICAgICAgICAgcmV0dXJuIFNRTElURV9DQU5UT1BFTjsKICAgICB9CiAKICAgICBpZiAo
dXNlZEZsYWdzKQogICAgICAgICAqdXNlZEZsYWdzID0gZGVzaXJlZEZsYWdzOwotICAgIGNocm9t
aXVtX3NxbGl0ZTNfdXBkYXRlX3JldXNhYmxlX2ZpbGVfaGFuZGxlKGlkLCBmZCwgZGVzaXJlZEZs
YWdzKTsKKyAgICBpZiAodW5peFNRTGl0ZTNGaWxlLT5wVW51c2VkKSB7CisgICAgICAgIHVuaXhT
UUxpdGUzRmlsZS0+cFVudXNlZC0+ZmQgPSBmZDsKKyAgICAgICAgdW5peFNRTGl0ZTNGaWxlLT5w
VW51c2VkLT5mbGFncyA9IGRlc2lyZWRGbGFnczsKKyAgICB9CiAKICAgICBmY250bChmZCwgRl9T
RVRGRCwgZmNudGwoZmQsIEZfR0VURkQpIHwgRkRfQ0xPRVhFQyk7CiAKLSAgICAvLyBUaGUgbWFz
ayAweDAwMDA3RjAwIGdpdmVzIHVzIHRoZSA3IGJpdHMgdGhhdCBkZXRlcm1pbmUgdGhlIHR5cGUg
b2YgdGhlIGZpbGUgU1FMaXRlIGlzIHRyeWluZyB0byBvcGVuLgotICAgIGludCBmaWxlVHlwZSA9
IGRlc2lyZWRGbGFncyAmIDB4MDAwMDdGMDA7CiAgICAgaW50IG5vTG9jayA9IChmaWxlVHlwZSAh
PSBTUUxJVEVfT1BFTl9NQUlOX0RCKTsKLSAgICByZXN1bHQgPSBjaHJvbWl1bV9zcWxpdGUzX2Zp
bGxfaW5fdW5peF9zcWxpdGUzX2ZpbGUodmZzLCBmZCwgLTEsIGlkLCBmaWxlTmFtZSwgbm9Mb2Nr
KTsKKyAgICBpbnQgcmVzdWx0ID0gZmlsbEluQ2hyb21pdW1GaWxlKHZmcywgZmQsIC0xLCBpZCwg
ZmlsZU5hbWUsIG5vTG9jayk7CiAgICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfT0spCi0gICAgICAg
IGNocm9taXVtX3NxbGl0ZTNfZGVzdHJveV9yZXVzYWJsZV9maWxlX2hhbmRsZShpZCk7CisgICAg
ICAgIHNxbGl0ZTNfZnJlZSh1bml4U1FMaXRlM0ZpbGUtPnBVbnVzZWQpOwogICAgIHJldHVybiBy
ZXN1bHQ7CiB9CiAKQEAgLTEyMiw3ICsxMDM5LDcgQEAgaW50IGNocm9taXVtQWNjZXNzKHNxbGl0
ZTNfdmZzKiwgY29uc3QgYwogCiAgICAgc3dpdGNoIChmbGFnKSB7CiAgICAgY2FzZSBTUUxJVEVf
QUNDRVNTX0VYSVNUUzoKLSAgICAgICAgKnJlcyA9IDE7ICAgLy8gaWYgdGhlIGZpbGUgZG9lc24n
dCBleGlzdCwgYXR0ciA8IDAKKyAgICAgICAgKnJlcyA9IDE7CiAgICAgICAgIGJyZWFrOwogICAg
IGNhc2UgU1FMSVRFX0FDQ0VTU19SRUFEV1JJVEU6CiAgICAgICAgICpyZXMgPSAoYXR0ciAmIFdf
T0spICYmIChhdHRyICYgUl9PSyk7CkBAIC0xNzMsMTEgKzEwOTAsMTEgQEAgdm9pZCBTUUxpdGVG
aWxlU3lzdGVtOjpyZWdpc3RlclNRTGl0ZVZGUwogICAgIHNxbGl0ZTNfdmZzKiB1bml4X3ZmcyA9
IHNxbGl0ZTNfdmZzX2ZpbmQoInVuaXgiKTsKICAgICBzdGF0aWMgc3FsaXRlM192ZnMgY2hyb21p
dW1fdmZzID0gewogICAgICAgICAxLAotICAgICAgICB1bml4X3Zmcy0+c3pPc0ZpbGUsCisgICAg
ICAgIHNpemVvZihDaHJvbWl1bUZpbGUpLAogICAgICAgICB1bml4X3Zmcy0+bXhQYXRobmFtZSwK
ICAgICAgICAgMCwKICAgICAgICAgImNocm9taXVtX3ZmcyIsCi0gICAgICAgIHVuaXhfdmZzLT5w
QXBwRGF0YSwKKyAgICAgICAgMCwKICAgICAgICAgY2hyb21pdW1PcGVuLAogICAgICAgICBjaHJv
bWl1bURlbGV0ZSwKICAgICAgICAgY2hyb21pdW1BY2Nlc3MsCg==
</data>
<flag name="review"
          id="56109"
          type_id="1"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67824</attachid>
            <date>2010-09-16 11:49:44 -0700</date>
            <delta_ts>2010-09-20 07:31:18 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>38439</size>
            <attacher name="Paweł Hajdan, Jr.">phajdan.jr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzY0MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDUgQEAKKzIwMTAtMDktMTYgIFBhd2VsIEhhamRhbiAgPHBoYWpkYW4uanJAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIE1vdmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNocm9taXVtX3ZmcyB0byB3ZWJraXQgZm9y
IFBPU0lYLgorICAgICAgICBUaGlzIGFsbG93cyB1cyB0byBsaW5rIENocm9tZSB3aXRoIHN5c3Rl
bS1wcm92aWRlZCBTUUxpdGUgb24gTGludXguCisgICAgICAgIFNlZSBhbHNvIGh0dHA6Ly9jb2Rl
Lmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyMjA4LgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDU0MTYKKworICAgICAgICBO
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwvY2hyb21pdW0vU1FMaXRlRmls
ZVN5c3RlbUNocm9taXVtUG9zaXguY3BwOgorICAgICAgICAoV2ViQ29yZTo6c3FsaXRlRXJyb3JG
cm9tUG9zaXhFcnJvcik6CisgICAgICAgIChXZWJDb3JlOjpyZWxlYXNlTG9ja0luZm8pOgorICAg
ICAgICAoV2ViQ29yZTo6cmVsZWFzZU9wZW5JbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRM
b2NrSW5mbyk6CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1bUNoZWNrUmVzZXJ2ZWRMb2NrKToK
KyAgICAgICAgKFdlYkNvcmU6OnJhbmdlTG9jayk6CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1
bUxvY2spOgorICAgICAgICAoV2ViQ29yZTo6Y2xvc2VQZW5kaW5nRmRzKToKKyAgICAgICAgKFdl
YkNvcmU6OmNocm9taXVtVW5sb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OmNsb3NlQ2hyb21pdW1G
aWxlKToKKyAgICAgICAgKFdlYkNvcmU6OmNocm9taXVtQ2xvc2UpOgorICAgICAgICAoV2ViQ29y
ZTo6Y2hyb21pdW1DaGVja1Jlc2VydmVkTG9ja05vb3ApOgorICAgICAgICAoV2ViQ29yZTo6Y2hy
b21pdW1Mb2NrTm9vcCk6CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1bVVubG9ja05vb3ApOgor
ICAgICAgICAoV2ViQ29yZTo6c2Vla0FuZFJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Y2hyb21p
dW1SZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OnNlZWtBbmRXcml0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpjaHJvbWl1bVdyaXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmNocm9taXVtU3luYyk6Cisg
ICAgICAgIChXZWJDb3JlOjpjaHJvbWl1bVRydW5jYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmNo
cm9taXVtRmlsZVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Y2hyb21pdW1GaWxlQ29udHJvbCk6
CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1bVNlY3RvclNpemUpOgorICAgICAgICAoV2ViQ29y
ZTo6Y2hyb21pdW1EZXZpY2VDaGFyYWN0ZXJpc3RpY3MpOgorICAgICAgICAoV2ViQ29yZTo6Zmls
bEluQ2hyb21pdW1GaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRSZXVzYWJsZUZkKToKKyAg
ICAgICAgKFdlYkNvcmU6OmNocm9taXVtT3Blbik6CisgICAgICAgIChXZWJDb3JlOjpjaHJvbWl1
bUFjY2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVGaWxlU3lzdGVtOjpyZWdpc3RlclNR
TGl0ZVZGUyk6CisKIDIwMTAtMDktMTYgIERhbmllbCBDaGVuZyAgPGRjaGVuZ0BjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgVG9ueSBDaGFuZy4KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vc3FsL2Nocm9taXVtL1NRTGl0ZUZpbGVTeXN0ZW1DaHJvbWl1bVBvc2l4LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3NxbC9jaHJvbWl1bS9TUUxpdGVGaWxlU3lzdGVt
Q2hyb21pdW1Qb3NpeC5jcHAJKHJldmlzaW9uIDY3NjQzKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9z
cWwvY2hyb21pdW0vU1FMaXRlRmlsZVN5c3RlbUNocm9taXVtUG9zaXguY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zNCwyMyArMzQsOTE1IEBACiAjaW5jbHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKICNp
bmNsdWRlIDxzcWxpdGUzLmg+CiAKKyNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRs
Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRl
IDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7CiAKLS8vIERlZmluZWQgaW4gQ2hyb21pdW0ncyBjb2RlYmFzZSBpbiB0aGlyZF9wYXJ0
eS9zcWxpdGUvc3JjL29zX3VuaXguYwotZXh0ZXJuICJDIiB7Ci12b2lkIGNocm9taXVtX3NxbGl0
ZTNfaW5pdGlhbGl6ZV91bml4X3NxbGl0ZTNfZmlsZShzcWxpdGUzX2ZpbGUqIGZpbGUpOwotaW50
IGNocm9taXVtX3NxbGl0ZTNfZmlsbF9pbl91bml4X3NxbGl0ZTNfZmlsZShzcWxpdGUzX3Zmcyog
dmZzLCBpbnQgZmQsIGludCBkaXJmZCwgc3FsaXRlM19maWxlKiBmaWxlLCBjb25zdCBjaGFyKiBm
aWxlTmFtZSwgaW50IG5vTG9jayk7Ci1pbnQgY2hyb21pdW1fc3FsaXRlM19nZXRfcmV1c2FibGVf
ZmlsZV9oYW5kbGUoc3FsaXRlM19maWxlKiBmaWxlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgaW50
IGZsYWdzLCBpbnQqIGZkKTsKLXZvaWQgY2hyb21pdW1fc3FsaXRlM191cGRhdGVfcmV1c2FibGVf
ZmlsZV9oYW5kbGUoc3FsaXRlM19maWxlKiBmaWxlLCBpbnQgZmQsIGludCBmbGFncyk7Ci12b2lk
IGNocm9taXVtX3NxbGl0ZTNfZGVzdHJveV9yZXVzYWJsZV9maWxlX2hhbmRsZShzcWxpdGUzX2Zp
bGUqIGZpbGUpOworLy8gQ2hyb21pdW0ncyBQb3NpeCBpbXBsZW1lbnRhdGlvbiBvZiBTUUxpdGUg
VkZTLgorLy8gVGhpcyBpcyBoZWF2aWx5IGJhc2VkIG9uIFNRTGl0ZSdzIG9zX3VuaXguYywKKy8v
IHdpdGhvdXQgcGFydHMgd2UgZG9uJ3QgbmVlZC4KKworLy8gSWRlbnRpZmllcyBhIGZpbGUgYnkg
aXRzIGRldmljZSBudW1iZXIgYW5kIGlub2RlLgorc3RydWN0IENocm9taXVtRmlsZUlkIHsKKyAg
ICBkZXZfdCBkZXY7IC8vIERldmljZSBudW1iZXIuCisgICAgaW5vX3QgaW5vOyAvLyBJbm9kZSBu
dW1iZXIuCit9OworCisvLyBJbmZvcm1hdGlvbiBhYm91dCBmaWxlIGxvY2tzIChvbmUgcGVyIG9w
ZW4gaW5vZGUpLiBOb3RlIHRoYXQgbWFueSBvcGVuCisvLyBmaWxlIGRlc2NyaXB0b3JzIG1heSBy
ZWZlciB0byB0aGUgc2FtZSBpbm9kZS4KK3N0cnVjdCBDaHJvbWl1bUxvY2tJbmZvIHsKKyAgICBD
aHJvbWl1bUZpbGVJZCBsb2NrS2V5OyAvLyBGaWxlIGlkZW50aWZpZXIuCisgICAgaW50IGNudDsg
Ly8gTnVtYmVyIG9mIHNoYXJlZCBsb2NrcyBoZWxkLgorICAgIGludCBsb2NrdHlwZTsgLy8gVHlw
ZSBvZiB0aGUgbG9jay4KKyAgICBpbnQgblJlZjsgLy8gUmVmZXJlbmNlIGNvdW50LgorCisgICAg
Ly8gRG91YmxlLWxpbmtlZCBsaXN0IHBvaW50ZXJzLgorICAgIENocm9taXVtTG9ja0luZm8qIHBO
ZXh0OyAKKyAgICBDaHJvbWl1bUxvY2tJbmZvKiBwUHJldjsKK307CisKKy8vIEluZm9ybWF0aW9u
IGFib3V0IGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY2Fubm90IGJlIGNsb3NlZCBpbW1lZGlhdGVs
eS4KK3N0cnVjdCBDaHJvbWl1bVVudXNlZEZkIHsKKyAgICBpbnQgZmQ7IC8vIEZpbGUgZGVzY3Jp
cHRvci4KKyAgICBpbnQgZmxhZ3M7IC8vIEZsYWdzIHRoaXMgZmlsZSBkZXNjcmlwdG9yIHdhcyBv
cGVuZWQgd2l0aC4KKyAgICBDaHJvbWl1bVVudXNlZEZkKiBwTmV4dDsgLy8gTmV4dCB1bnVzZWQg
ZmlsZSBkZXNjcmlwdG9yIG9uIHRoZSBzYW1lIGZpbGUuCit9OworCisvLyBJbmZvcm1hdGlvbiBh
Ym91dCBhbiBvcGVuIGlub2RlLiBXaGVuIHdlIHdhbnQgdG8gY2xvc2UgYW4gaW5vZGUKKy8vIHRo
YXQgc3RpbGwgaGFzIGxvY2tzLCB3ZSBkZWZlciB0aGUgY2xvc2UgdW50aWwgYWxsIGxvY2tzIGFy
ZSBjbGVhcmVkLgorc3RydWN0IENocm9taXVtT3BlbkluZm8geworICAgIENocm9taXVtRmlsZUlk
IGZpbGVJZDsgLy8gVGhlIGxvb2t1cCBrZXkuCisgICAgaW50IG5SZWY7IC8vIFJlZmVyZW5jZSBj
b3VudC4KKyAgICBpbnQgbkxvY2s7IC8vIE51bWJlciBvZiBvdXRzdGFuZGluZyBsb2Nrcy4KKyAg
ICBDaHJvbWl1bVVudXNlZEZkKiBwVW51c2VkOyAvLyBMaXN0IG9mIGZpbGUgZGVzY3JpcHRvcnMg
dG8gY2xvc2UuCisKKyAgICAvLyBEb3VibGUtbGlua2VkIGxpc3QgcG9pbnRlcnMuCisgICAgQ2hy
b21pdW1PcGVuSW5mbyogcE5leHQ7CisgICAgQ2hyb21pdW1PcGVuSW5mbyogcFByZXY7Cit9Owor
CisvLyBLZWVwIHRyYWNrIG9mIGxvY2tzIGFuZCBpbm9kZXMgaW4gZG91YmxlLWxpbmtlZCBsaXN0
cy4KK3N0YXRpYyBzdHJ1Y3QgQ2hyb21pdW1Mb2NrSW5mbyogbG9ja0xpc3QgPSAwOworc3RhdGlj
IHN0cnVjdCBDaHJvbWl1bU9wZW5JbmZvKiBvcGVuTGlzdCA9IDA7CisKKy8vIEV4dGVuc2lvbiBv
ZiBzcWxpdGUzX2ZpbGUgc3BlY2lmaWMgdG8gdGhlIGNocm9taXVtIFZGUy4KK3N0cnVjdCBDaHJv
bWl1bUZpbGUgeworICAgIHNxbGl0ZTNfaW9fbWV0aG9kcyBjb25zdCogcE1ldGhvZDsgLy8gSW1w
bGVtZW50YXRpb24gb2Ygc3FsaXRlM19maWxlLgorICAgIENocm9taXVtT3BlbkluZm8qIHBPcGVu
OyAvLyBJbmZvcm1hdGlvbiBhYm91dCBhbGwgb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGlz
IGZpbGUuCisgICAgQ2hyb21pdW1Mb2NrSW5mbyogcExvY2s7IC8vIEluZm9ybWF0aW9uIGFib3V0
IGFsbCBsb2NrcyBmb3IgdGhpcyBmaWxlLgorICAgIGludCBoOyAvLyBGaWxlIGRlc2NyaXB0b3Iu
CisgICAgaW50IGRpcmZkOyAvLyBGaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWxlIGRpcmVjdG9y
eS4KKyAgICB1bnNpZ25lZCBjaGFyIGxvY2t0eXBlOyAvLyBUeXBlIG9mIHRoZSBsb2NrIHVzZWQg
Zm9yIHRoaXMgZmlsZS4KKyAgICBpbnQgbGFzdEVycm5vOyAvLyBWYWx1ZSBvZiBlcnJubyBmb3Ig
bGFzdCBvcGVyYXRpb24gb24gdGhpcyBmaWxlLgorICAgIENocm9taXVtVW51c2VkRmQqIHBVbnVz
ZWQ7IC8vIEluZm9ybWF0aW9uIGFib3V0IHVudXNlZCBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGlz
IGZpbGUuCit9OworCisvLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBzcGVjaWZ5IHRoZSByYW5n
ZSBvZiBieXRlcyB1c2VkIGZvciBsb2NraW5nLgorLy8gU1FMaXRlU2hhcmVkU2l6ZSBpcyB0aGUg
bnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgcG9vbCBmcm9tIHdoaWNoCisvLyBhIHJh
bmRvbSBieXRlIGlzIHNlbGVjdGVkIGZvciBhIHNoYXJlZCBsb2NrLiAgVGhlIHBvb2wgb2YgYnl0
ZXMgZm9yCisvLyBzaGFyZWQgbG9ja3MgYmVnaW5zIGF0IFNRTGl0ZVNoYXJlZEZpcnN0Qnl0ZS4g
CisvLyBUaGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyB1c2VkIGJ5IFNRTGl0ZSBmb3IgY29tcGF0
aWJpbGl0eS4KK3N0YXRpYyBjb25zdCBvZmZfdCBTUUxpdGVQZW5kaW5nQnl0ZSA9IDB4NDAwMDAw
MDA7CitzdGF0aWMgY29uc3Qgb2ZmX3QgU1FMaXRlUmVzZXJ2ZWRCeXRlID0gU1FMaXRlUGVuZGlu
Z0J5dGUgKyAxOworc3RhdGljIGNvbnN0IG9mZl90IFNRTGl0ZVNoYXJlZEZpcnN0Qnl0ZSA9IFNR
TGl0ZVBlbmRpbmdCeXRlICsgMjsKK3N0YXRpYyBjb25zdCBvZmZfdCBTUUxpdGVTaGFyZWRTaXpl
ID0gNTEwOworCisvLyBNYXBzIGEgUE9TSVggZXJyb3IgY29kZSB0byBhbiBTUUxpdGUgZXJyb3Ig
Y29kZS4KK3N0YXRpYyBpbnQgc3FsaXRlRXJyb3JGcm9tUG9zaXhFcnJvcihpbnQgcG9zaXhFcnJv
ciwgaW50IHNxbGl0ZUlPRXJyKQoreworICAgIHN3aXRjaCAocG9zaXhFcnJvcikgeworICAgIGNh
c2UgMDogCisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisgICAgY2FzZSBFQUdBSU46CisgICAg
Y2FzZSBFVElNRURPVVQ6CisgICAgY2FzZSBFQlVTWToKKyAgICBjYXNlIEVJTlRSOgorICAgIGNh
c2UgRU5PTENLOiAgCisgICAgICAgIHJldHVybiBTUUxJVEVfQlVTWTsKKyAgICBjYXNlIEVBQ0NF
UzogCisgICAgICAgIC8vIEVBQ0NFUyBpcyBsaWtlIEVBR0FJTiBkdXJpbmcgbG9ja2luZyBvcGVy
YXRpb25zLgorICAgICAgICBpZiAoKHNxbGl0ZUlPRXJyID09IFNRTElURV9JT0VSUl9MT0NLKSB8
fAorICAgICAgICAgICAgKHNxbGl0ZUlPRXJyID09IFNRTElURV9JT0VSUl9VTkxPQ0spIHx8Cisg
ICAgICAgICAgICAoc3FsaXRlSU9FcnIgPT0gU1FMSVRFX0lPRVJSX1JETE9DSykgfHwKKyAgICAg
ICAgICAgIChzcWxpdGVJT0VyciA9PSBTUUxJVEVfSU9FUlJfQ0hFQ0tSRVNFUlZFRExPQ0spKQor
ICAgICAgICAgICAgcmV0dXJuIFNRTElURV9CVVNZOworICAgICAgICByZXR1cm4gU1FMSVRFX1BF
Uk07CisgICAgY2FzZSBFUEVSTTogCisgICAgICAgIHJldHVybiBTUUxJVEVfUEVSTTsKKyAgICBj
YXNlIEVERUFETEs6CisgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlJfQkxPQ0tFRDsKKyAgICBk
ZWZhdWx0OiAKKyAgICAgICAgcmV0dXJuIHNxbGl0ZUlPRXJyOworICAgIH0KK30KKworLy8gUmVs
ZWFzZXMgYSBDaHJvbWl1bUxvY2tJbmZvIHN0cnVjdHVyZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBi
eSBmaW5kTG9ja0luZm8oKS4KK3N0YXRpYyB2b2lkIHJlbGVhc2VMb2NrSW5mbyhDaHJvbWl1bUxv
Y2tJbmZvKiBwTG9jaykKK3sKKyAgICBpZiAoIXBMb2NrKQorICAgICAgICByZXR1cm47CisKKyAg
ICBwTG9jay0+blJlZi0tOworICAgIGlmIChwTG9jay0+blJlZiA+IDApCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmIChwTG9jay0+cFByZXYpIHsKKyAgICAgICAgQVNTRVJUKHBMb2NrLT5wUHJl
di0+cE5leHQgPT0gcExvY2spOworICAgICAgICBwTG9jay0+cFByZXYtPnBOZXh0ID0gcExvY2st
PnBOZXh0OworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChsb2NrTGlzdCA9PSBwTG9jayk7
CisgICAgICAgIGxvY2tMaXN0ID0gcExvY2stPnBOZXh0OworICAgIH0KKyAgICBpZiAocExvY2st
PnBOZXh0KSB7CisgICAgICAgIEFTU0VSVChwTG9jay0+cE5leHQtPnBQcmV2ID09IHBMb2NrKTsK
KyAgICAgICAgcExvY2stPnBOZXh0LT5wUHJldiA9IHBMb2NrLT5wUHJldjsKKyAgICB9CisKKyAg
ICBzcWxpdGUzX2ZyZWUocExvY2spOworfQorCisvLyBSZWxlYXNlcyBhIENocm9taXVtT3Blbklu
Zm8gc3RydWN0dXJlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ5IGZpbmRMb2NrSW5mbygpLgorc3Rh
dGljIHZvaWQgcmVsZWFzZU9wZW5JbmZvKENocm9taXVtT3BlbkluZm8qIHBPcGVuKQoreworICAg
IGlmICghcE9wZW4pCisgICAgICAgIHJldHVybjsKKworICAgIHBPcGVuLT5uUmVmLS07CisgICAg
aWYgKHBPcGVuLT5uUmVmID4gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHBPcGVuLT5w
UHJldikgeworICAgICAgICBBU1NFUlQocE9wZW4tPnBQcmV2LT5wTmV4dCA9PSBwT3Blbik7Cisg
ICAgICAgIHBPcGVuLT5wUHJldi0+cE5leHQgPSBwT3Blbi0+cE5leHQ7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgQVNTRVJUKG9wZW5MaXN0ID09IHBPcGVuKTsKKyAgICAgICAgb3Blbkxpc3QgPSBw
T3Blbi0+cE5leHQ7CisgICAgfQorICAgIGlmIChwT3Blbi0+cE5leHQpIHsKKyAgICAgICAgQVNT
RVJUKHBPcGVuLT5wTmV4dC0+cFByZXYgPT0gcE9wZW4pOworICAgICAgICBwT3Blbi0+cE5leHQt
PnBQcmV2ID0gcE9wZW4tPnBQcmV2OworICAgIH0KKworICAgIEFTU0VSVCghcE9wZW4tPnBVbnVz
ZWQpOyAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGxlYWtpbmcgbWVtb3J5IGFuZCBmaWxlIGRlc2Ny
aXB0b3JzLgorCisgICAgc3FsaXRlM19mcmVlKHBPcGVuKTsKK30KKworLy8gTG9jYXRlcyBDaHJv
bWl1bUxvY2tJbmZvIGFuZCBDaHJvbWl1bU9wZW5JbmZvIGZvciBnaXZlbiBmaWxlIGRlc2NyaXB0
b3IgKGNyZWF0aW5nIG5ldyBvbmVzIGlmIG5lZWRlZCkuCisvLyBSZXR1cm5zIGEgU1FMaXRlIGVy
cm9yIGNvZGUuCitzdGF0aWMgaW50IGZpbmRMb2NrSW5mbyhDaHJvbWl1bUZpbGUqIHBGaWxlLCBD
aHJvbWl1bUxvY2tJbmZvKiogcHBMb2NrLCBDaHJvbWl1bU9wZW5JbmZvKiogcHBPcGVuKQorewor
ICAgIGludCBmZCA9IHBGaWxlLT5oOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgaW50
IHJjID0gZnN0YXQoZmQsICZzdGF0YnVmKTsKKyAgICBpZiAocmMpIHsKKyAgICAgICAgcEZpbGUt
Pmxhc3RFcnJubyA9IGVycm5vOworI2lmZGVmIEVPVkVSRkxPVworICAgICAgICBpZiAocEZpbGUt
Pmxhc3RFcnJubyA9PSBFT1ZFUkZMT1cpCisgICAgICAgICAgICByZXR1cm4gU1FMSVRFX05PTEZT
OworI2VuZGlmCisgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlI7CisgICAgfQorCisjaWYgUExB
VEZPUk0oTUFDKQorICAgIC8vIE9uIE9TIFggb24gYW4gbXNkb3MvZmF0IGZpbGVzeXN0ZW1zLCB0
aGUgaW5vZGUgbnVtYmVyIGlzIHJlcG9ydGVkCisgICAgLy8gaW5jb3JyZWN0bHkgZm9yIHplcm8t
c2l6ZSBmaWxlcy4gU2VlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jdnN0cmFjL3RrdHZpZXc/dG49
MzI2MC4KKyAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0gd2UgYWx3YXlzIGluY3Jl
YXNlIHRoZSBmaWxlIHNpemUgdG8gMSBieSB3cml0aW5nIGEgc2luZ2xlIGJ5dGUKKyAgICAvLyBw
cmlvciB0byBhY2Nlc3NpbmcgdGhlIGlub2RlIG51bWJlci4gVGhlIG9uZSBieXRlIHdyaXR0ZW4g
aXMgYW4gQVNDSUkgJ1MnIGNoYXJhY3RlciB3aGljaAorICAgIC8vIGFsc28gaGFwcGVucyB0byBi
ZSB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaGVhZGVyIG9mIGV2ZXJ5IFNRTGl0ZSBkYXRhYmFzZS4g
IEluIHRoaXMgd2F5LAorICAgIC8vIGlmIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gc3VjaCB0
aGF0IGFub3RoZXIgdGhyZWFkIGhhcyBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgZmlyc3QgcGFnZQor
ICAgIC8vIG9mIHRoZSBkYXRhYmFzZSwgbm8gZGFtYWdlIGlzIGRvbmUuCisgICAgaWYgKCFzdGF0
YnVmLnN0X3NpemUpIHsKKyAgICAgICAgcmMgPSB3cml0ZShmZCwgIlMiLCAxKTsKKyAgICAgICAg
aWYgKHJjICE9IDEpCisgICAgICAgICAgICByZXR1cm4gU1FMSVRFX0lPRVJSOworICAgICAgICBy
YyA9IGZzdGF0KGZkLCAmc3RhdGJ1Zik7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAg
cEZpbGUtPmxhc3RFcnJubyA9IGVycm5vOworICAgICAgICAgICAgcmV0dXJuIFNRTElURV9JT0VS
UjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgQ2hyb21pdW1GaWxlSWQgZmlsZUlk
OworICAgIG1lbXNldCgmZmlsZUlkLCAwLCBzaXplb2YoZmlsZUlkKSk7CisgICAgZmlsZUlkLmRl
diA9IHN0YXRidWYuc3RfZGV2OworICAgIGZpbGVJZC5pbm8gPSBzdGF0YnVmLnN0X2lubzsKKwor
ICAgIENocm9taXVtTG9ja0luZm8qIHBMb2NrID0gMDsKKworICAgIGlmIChwcExvY2spIHsKKyAg
ICAgICAgcExvY2sgPSBsb2NrTGlzdDsKKyAgICAgICAgd2hpbGUgKHBMb2NrICYmIG1lbWNtcCgm
ZmlsZUlkLCAmcExvY2stPmxvY2tLZXksIHNpemVvZihmaWxlSWQpKSkKKyAgICAgICAgICAgIHBM
b2NrID0gcExvY2stPnBOZXh0OworICAgICAgICBpZiAocExvY2spCisgICAgICAgICAgICBwTG9j
ay0+blJlZisrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBMb2NrID0gc3RhdGljX2Nh
c3Q8Q2hyb21pdW1Mb2NrSW5mbyo+KHNxbGl0ZTNfbWFsbG9jKHNpemVvZigqcExvY2spKSk7Cisg
ICAgICAgICAgICBpZiAoIXBMb2NrKQorICAgICAgICAgICAgICAgIHJldHVybiBTUUxJVEVfTk9N
RU07CisgICAgICAgICAgICBwTG9jay0+bG9ja0tleSA9IGZpbGVJZDsKKyAgICAgICAgICAgIHBM
b2NrLT5uUmVmID0gMTsKKyAgICAgICAgICAgIHBMb2NrLT5jbnQgPSAwOworICAgICAgICAgICAg
cExvY2stPmxvY2t0eXBlID0gMDsKKyAgICAgICAgICAgIHBMb2NrLT5wTmV4dCA9IGxvY2tMaXN0
OworICAgICAgICAgICAgcExvY2stPnBQcmV2ID0gMDsKKyAgICAgICAgICAgIGlmIChsb2NrTGlz
dCkKKyAgICAgICAgICAgICAgICBsb2NrTGlzdC0+cFByZXYgPSBwTG9jazsKKyAgICAgICAgICAg
IGxvY2tMaXN0ID0gcExvY2s7CisgICAgICAgIH0KKyAgICAgICAgKnBwTG9jayA9IHBMb2NrOwor
ICAgIH0KKworICAgIGlmIChwcE9wZW4pIHsKKyAgICAgICAgQ2hyb21pdW1PcGVuSW5mbyogcE9w
ZW4gPSBvcGVuTGlzdDsKKyAgICAgICAgd2hpbGUgKHBPcGVuICYmIG1lbWNtcCgmZmlsZUlkLCAm
cE9wZW4tPmZpbGVJZCwgc2l6ZW9mKGZpbGVJZCkpKQorICAgICAgICAgICAgcE9wZW4gPSBwT3Bl
bi0+cE5leHQ7CisgICAgICAgIGlmIChwT3BlbikKKyAgICAgICAgICAgIHBPcGVuLT5uUmVmKys7
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcE9wZW4gPSBzdGF0aWNfY2FzdDxDaHJvbWl1
bU9wZW5JbmZvKj4oc3FsaXRlM19tYWxsb2Moc2l6ZW9mKCpwT3BlbikpKTsKKyAgICAgICAgICAg
IGlmICghcE9wZW4pIHsKKyAgICAgICAgICAgICAgICByZWxlYXNlTG9ja0luZm8ocExvY2spOwor
ICAgICAgICAgICAgICAgIHJldHVybiBTUUxJVEVfTk9NRU07CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBtZW1zZXQocE9wZW4sIDAsIHNpemVvZigqcE9wZW4pKTsKKyAgICAgICAgICAgIHBP
cGVuLT5maWxlSWQgPSBmaWxlSWQ7CisgICAgICAgICAgICBwT3Blbi0+blJlZiA9IDE7CisgICAg
ICAgICAgICBwT3Blbi0+cE5leHQgPSBvcGVuTGlzdDsKKyAgICAgICAgICAgIGlmIChvcGVuTGlz
dCkKKyAgICAgICAgICAgICAgICBvcGVuTGlzdC0+cFByZXYgPSBwT3BlbjsKKyAgICAgICAgICAg
IG9wZW5MaXN0ID0gcE9wZW47CisgICAgICAgIH0KKyAgICAgICAgKnBwT3BlbiA9IHBPcGVuOwor
ICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLy8gQ2hlY2tzIGlmIHRoZXJlIGlzIGEgUkVT
RVJWRUQgbG9jayBoZWxkIG9uIHRoZSBzcGVjaWZpZWQgZmlsZSBieSB0aGlzIG9yIGFueSBvdGhl
ciBwcm9jZXNzLgorLy8gSWYgdGhlIGxvY2sgaXMgaGVsZCwgc2V0cyBwUmVzT3V0IHRvIGEgbm9u
LXplcm8gdmFsdWUuIFJldHVybnMgYSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQgY2hy
b21pdW1DaGVja1Jlc2VydmVkTG9jayhzcWxpdGUzX2ZpbGUqIGlkLCBpbnQqIHBSZXNPdXQpCit7
CisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxl
Kj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7CisKKyAgICAvLyBMb29rIGZvciBsb2NrcyBoZWxk
IGJ5IHRoaXMgcHJvY2Vzcy4KKyAgICBpbnQgcmVzZXJ2ZWQgPSAwOworICAgIGlmIChwRmlsZS0+
cExvY2stPmxvY2t0eXBlID4gU1FMSVRFX0xPQ0tfU0hBUkVEKQorICAgICAgICByZXNlcnZlZCA9
IDE7CisKKyAgICAvLyBMb29rIGZvciBsb2NrcyBoZWxkIGJ5IG90aGVyIHByb2Nlc3Nlcy4KKyAg
ICBpbnQgcmMgPSBTUUxJVEVfT0s7CisgICAgaWYgKCFyZXNlcnZlZCkgeworICAgICAgICBzdHJ1
Y3QgZmxvY2sgbG9jazsKKyAgICAgICAgbG9jay5sX3doZW5jZSA9IFNFRUtfU0VUOworICAgICAg
ICBsb2NrLmxfc3RhcnQgPSBTUUxpdGVSZXNlcnZlZEJ5dGU7CisgICAgICAgIGxvY2subF9sZW4g
PSAxOworICAgICAgICBsb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisgICAgICAgIGlmICgtMSA9PSBm
Y250bChwRmlsZS0+aCwgRl9HRVRMSywgJmxvY2spKSB7CisgICAgICAgICAgICBpbnQgdEVycm5v
ID0gZXJybm87CisgICAgICAgICAgICByYyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVy
cm5vLCBTUUxJVEVfSU9FUlJfQ0hFQ0tSRVNFUlZFRExPQ0spOworICAgICAgICAgICAgcEZpbGUt
Pmxhc3RFcnJubyA9IHRFcnJubzsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NrLmxfdHlwZSAhPSBG
X1VOTENLKQorICAgICAgICAgICAgcmVzZXJ2ZWQgPSAxOworICAgIH0KKworICAgICpwUmVzT3V0
ID0gcmVzZXJ2ZWQ7CisgICAgcmV0dXJuIHJjOworfQorCisvLyBQZXJmb3JtcyBhIGZpbGUgbG9j
a2luZyBvcGVyYXRpb24gb24gYSByYW5nZSBvZiBieXRlcyBpbiBhIGZpbGUuCisvLyBUaGUgfG9w
fCBwYXJhbWV0ZXIgc2hvdWxkIGJlIG9uZSBvZiBGX1JGTENLLCBGX1dSTENLIG9yIEZfVU5MQ0su
CisvLyBSZXR1cm5zIGEgVW5peCBlcnJvciBjb2RlLCBhbmQgYWxzbyB3cml0ZXMgaXQgdG8gcEVy
cmNvZGUuCitzdGF0aWMgaW50IHJhbmdlTG9jayhDaHJvbWl1bUZpbGUqIHBGaWxlLCBpbnQgb3As
IGludCogcEVycmNvZGUpCit7CisgICAgZmxvY2sgbG9jazsKKyAgICBsb2NrLmxfdHlwZSA9IG9w
OworICAgIGxvY2subF9zdGFydCA9IFNRTGl0ZVNoYXJlZEZpcnN0Qnl0ZTsKKyAgICBsb2NrLmxf
d2hlbmNlID0gU0VFS19TRVQ7CisgICAgbG9jay5sX2xlbiA9IFNRTGl0ZVNoYXJlZFNpemU7Cisg
ICAgaW50IHJjID0gZmNudGwocEZpbGUtPmgsIEZfU0VUTEssICZsb2NrKTsKKyAgICAqcEVycmNv
ZGUgPSBlcnJubzsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8vIExvY2tzIHRoZSBmaWxlIHdpdGgg
dGhlIGxvY2sgc3BlY2lmaWVkIGJ5IHBhcmFtZXRlciBsb2NrdHlwZSAtIG9uZQorLy8gb2YgdGhl
IGZvbGxvd2luZzoKKy8vCisvLyAgICAgKDEpIFNRTElURV9MT0NLX1NIQVJFRAorLy8gICAgICgy
KSBTUUxJVEVfTE9DS19SRVNFUlZFRAorLy8gICAgICgzKSBTUUxJVEVfTE9DS19QRU5ESU5HCisv
LyAgICAgKDQpIFNRTElURV9MT0NLX0VYQ0xVU0lWRQorLy8KKy8vIFNvbWV0aW1lcyB3aGVuIHJl
cXVlc3Rpbmcgb25lIGxvY2sgc3RhdGUsIGFkZGl0aW9uYWwgbG9jayBzdGF0ZXMKKy8vIGFyZSBp
bnNlcnRlZCBpbiBiZXR3ZWVuLiAgVGhlIGxvY2tpbmcgbWlnaHQgZmFpbCBvbiBvbmUgb2YgdGhl
IGxhdGVyCisvLyB0cmFuc2l0aW9ucyBsZWF2aW5nIHRoZSBsb2NrIHN0YXRlIGRpZmZlcmVudCBm
cm9tIHdoYXQgaXQgc3RhcnRlZCBidXQKKy8vIHN0aWxsIHNob3J0IG9mIGl0cyBnb2FsLiAgVGhl
IGZvbGxvd2luZyBjaGFydCBzaG93cyB0aGUgYWxsb3dlZAorLy8gdHJhbnNpdGlvbnMgYW5kIHRo
ZSBpbnNlcnRlZCBpbnRlcm1lZGlhdGUgc3RhdGVzOgorLy8KKy8vICAgIFVOTE9DS0VEIC0+IFNI
QVJFRAorLy8gICAgU0hBUkVEIC0+IFJFU0VSVkVECisvLyAgICBTSEFSRUQgLT4gKFBFTkRJTkcp
IC0+IEVYQ0xVU0lWRQorLy8gICAgUkVTRVJWRUQgLT4gKFBFTkRJTkcpIC0+IEVYQ0xVU0lWRQor
Ly8gICAgUEVORElORyAtPiBFWENMVVNJVkUKK3N0YXRpYyBpbnQgY2hyb21pdW1Mb2NrKHNxbGl0
ZTNfZmlsZSogaWQsIGludCBsb2NrdHlwZSkKK3sKKyAgICAvLyBUbyBvYnRhaW4gYSBTSEFSRUQg
bG9jaywgYSByZWFkLWxvY2sgaXMgb2J0YWluZWQgb24gdGhlICdwZW5kaW5nCisgICAgLy8gYnl0
ZScuICBJZiB0aGlzIGlzIHN1Y2Nlc3NmdWwsIGEgcmFuZG9tIGJ5dGUgZnJvbSB0aGUgJ3NoYXJl
ZCBieXRlCisgICAgLy8gcmFuZ2UnIGlzIHJlYWQtbG9ja2VkIGFuZCB0aGUgbG9jayBvbiB0aGUg
J3BlbmRpbmcgYnl0ZScgcmVsZWFzZWQuCisgICAgLy8KKyAgICAvLyBBIHByb2Nlc3MgbWF5IG9u
bHkgb2J0YWluIGEgUkVTRVJWRUQgbG9jayBhZnRlciBpdCBoYXMgYSBTSEFSRUQgbG9jay4KKyAg
ICAvLyBBIFJFU0VSVkVEIGxvY2sgaXMgaW1wbGVtZW50ZWQgYnkgZ3JhYmJpbmcgYSB3cml0ZS1s
b2NrIG9uIHRoZQorICAgIC8vICdyZXNlcnZlZCBieXRlJy4gCisgICAgLy8KKyAgICAvLyBBIHBy
b2Nlc3MgbWF5IG9ubHkgb2J0YWluIGEgUEVORElORyBsb2NrIGFmdGVyIGl0IGhhcyBvYnRhaW5l
ZCBhCisgICAgLy8gU0hBUkVEIGxvY2suIEEgUEVORElORyBsb2NrIGlzIGltcGxlbWVudGVkIGJ5
IG9idGFpbmluZyBhIHdyaXRlLWxvY2sKKyAgICAvLyBvbiB0aGUgJ3BlbmRpbmcgYnl0ZScuIFRo
aXMgZW5zdXJlcyB0aGF0IG5vIG5ldyBTSEFSRUQgbG9ja3MgY2FuIGJlCisgICAgLy8gb2J0YWlu
ZWQsIGJ1dCBleGlzdGluZyBTSEFSRUQgbG9ja3MgYXJlIGFsbG93ZWQgdG8gcGVyc2lzdC4gQSBw
cm9jZXNzCisgICAgLy8gZG9lcyBub3QgaGF2ZSB0byBvYnRhaW4gYSBSRVNFUlZFRCBsb2NrIG9u
IHRoZSB3YXkgdG8gYSBQRU5ESU5HIGxvY2suCisgICAgLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2Vk
IGJ5IHRoZSBhbGdvcml0aG0gZm9yIHJvbGxpbmcgYmFjayBhIGpvdXJuYWwgZmlsZQorICAgIC8v
IGFmdGVyIGEgY3Jhc2guCisgICAgLy8KKyAgICAvLyBBbiBFWENMVVNJVkUgbG9jaywgb2J0YWlu
ZWQgYWZ0ZXIgYSBQRU5ESU5HIGxvY2sgaXMgaGVsZCwgaXMKKyAgICAvLyBpbXBsZW1lbnRlZCBi
eSBvYnRhaW5pbmcgYSB3cml0ZS1sb2NrIG9uIHRoZSBlbnRpcmUgJ3NoYXJlZCBieXRlCisgICAg
Ly8gcmFuZ2UnLiBTaW5jZSBhbGwgb3RoZXIgbG9ja3MgcmVxdWlyZSBhIHJlYWQtbG9jayBvbiBv
bmUgb2YgdGhlIGJ5dGVzCisgICAgLy8gd2l0aGluIHRoaXMgcmFuZ2UsIHRoaXMgZW5zdXJlcyB0
aGF0IG5vIG90aGVyIGxvY2tzIGFyZSBoZWxkIG9uIHRoZQorICAgIC8vIGRhdGFiYXNlLiAKKwor
ICAgIGludCByYyA9IFNRTElURV9PSzsKKyAgICBzdHJ1Y3QgZmxvY2sgbG9jazsKKyAgICBpbnQg
cyA9IDA7CisgICAgaW50IHRFcnJubzsKKworICAgIENocm9taXVtRmlsZSogcEZpbGUgPSByZWlu
dGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAgICBBU1NFUlQocEZpbGUpOworCisg
ICAgQ2hyb21pdW1Mb2NrSW5mbyogcExvY2sgPSBwRmlsZS0+cExvY2s7CisKKyAgICAvLyBJZiB0
aGVyZSBpcyBhbHJlYWR5IGEgbG9jayBvZiB0aGlzIHR5cGUgb3IgbW9yZSByZXN0cmljdGl2ZSwg
ZG8gbm90aGluZy4KKyAgICBpZiAocEZpbGUtPmxvY2t0eXBlID49IGxvY2t0eXBlKQorICAgICAg
ICByZXR1cm4gU1FMSVRFX09LOworCisgICAgLy8gTWFrZSBzdXJlIHdlIG5ldmVyIG1vdmUgZnJv
bSB1bmxvY2tlZCB0byBhbnl0aGluZyBoaWdoZXIgdGhhbiBzaGFyZWQgbG9jay4KKyAgICBBU1NF
UlQocEZpbGUtPmxvY2t0eXBlICE9IFNRTElURV9MT0NLX05PTkUgfHwgbG9ja3R5cGUgPT0gU1FM
SVRFX0xPQ0tfU0hBUkVEKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBuZXZlciByZXF1ZXN0IGEg
cGVuZGluZyBsb2NrLgorICAgIEFTU0VSVChsb2NrdHlwZSAhPSBTUUxJVEVfTE9DS19QRU5ESU5H
KTsKKworICAgIC8vIE1ha2Ugc3VyZSBhIHNoYXJlZCBsb2NrIGlzIGFsd2F5cyBoZWxkIHdoZW4g
YSBSRVNFUlZFRCBsb2NrIGlzIHJlcXVlc3RlZC4KKyAgICBBU1NFUlQobG9ja3R5cGUgIT0gU1FM
SVRFX0xPQ0tfUkVTRVJWRUQgfHwgcEZpbGUtPmxvY2t0eXBlID09IFNRTElURV9MT0NLX1NIQVJF
RCk7CisKKyAgICAvLyBJZiBzb21lIHRocmVhZCB1c2luZyB0aGlzIFBJRCBoYXMgYSBsb2NrIHZp
YSBhIGRpZmZlcmVudCBDaHJvbWl1bUZpbGUKKyAgICAvLyBoYW5kbGUgdGhhdCBwcmVjbHVkZXMg
dGhlIHJlcXVlc3RlZCBsb2NrLCByZXR1cm4gQlVTWS4KKyAgICBpZiAocEZpbGUtPmxvY2t0eXBl
ICE9IHBMb2NrLT5sb2NrdHlwZSAmJgorICAgICAgICAocExvY2stPmxvY2t0eXBlID49IFNRTElU
RV9MT0NLX1BFTkRJTkcgfHwgbG9ja3R5cGUgPiBTUUxJVEVfTE9DS19TSEFSRUQpKQorICAgICAg
ICByZXR1cm4gU1FMSVRFX0JVU1k7CisKKyAgICAvLyBJZiBhIFNIQVJFRCBsb2NrIGlzIHJlcXVl
c3RlZCwgYW5kIHNvbWUgdGhyZWFkIHVzaW5nIHRoaXMgUElEIGFscmVhZHkKKyAgICAvLyBoYXMg
YSBTSEFSRUQgb3IgUkVTRVJWRUQgbG9jaywgdGhlbiBqdXN0IGluY3JlbWVudCByZWZlcmVuY2Ug
Y291bnRzLgorICAgIGlmIChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQgJiYKKyAgICAg
ICAgKHBMb2NrLT5sb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQgfHwgcExvY2stPmxvY2t0
eXBlID09IFNRTElURV9MT0NLX1JFU0VSVkVEKSkgeworICAgICAgICBBU1NFUlQoIXBGaWxlLT5s
b2NrdHlwZSk7CisgICAgICAgIEFTU0VSVChwTG9jay0+Y250ID4gMCk7CisgICAgICAgIHBGaWxl
LT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX1NIQVJFRDsKKyAgICAgICAgcExvY2stPmNudCsrOwor
ICAgICAgICBwRmlsZS0+cE9wZW4tPm5Mb2NrKys7CisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7
CisgICAgfQorCisgICAgLy8gQSBQRU5ESU5HIGxvY2sgaXMgbmVlZGVkIGJlZm9yZSBhY3F1aXJp
bmcgYSBTSEFSRUQgbG9jayBhbmQgYmVmb3JlCisgICAgLy8gYWNxdWlyaW5nIGFuIEVYQ0xVU0lW
RSBsb2NrLiAgRm9yIHRoZSBTSEFSRUQgbG9jaywgdGhlIFBFTkRJTkcgd2lsbAorICAgIC8vIGJl
IHJlbGVhc2VkLgorICAgIGxvY2subF9sZW4gPSAxOworICAgIGxvY2subF93aGVuY2UgPSBTRUVL
X1NFVDsKKyAgICBpZiAobG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfU0hBUkVEIHx8CisgICAgICAg
IChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19FWENMVVNJVkUgJiYgcEZpbGUtPmxvY2t0eXBlIDwg
U1FMSVRFX0xPQ0tfUEVORElORykpIHsKKyAgICAgICAgbG9jay5sX3R5cGUgPSAobG9ja3R5cGUg
PT0gU1FMSVRFX0xPQ0tfU0hBUkVEID8gRl9SRExDSyA6IEZfV1JMQ0spOworICAgICAgICBsb2Nr
Lmxfc3RhcnQgPSBTUUxpdGVQZW5kaW5nQnl0ZTsKKyAgICAgICAgcyA9IGZjbnRsKHBGaWxlLT5o
LCBGX1NFVExLLCAmbG9jayk7CisgICAgICAgIGlmIChzID09IC0xKSB7CisgICAgICAgICAgICB0
RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgIHJjID0gc3FsaXRlRXJyb3JGcm9tUG9zaXhFcnJv
cih0RXJybm8sIFNRTElURV9JT0VSUl9MT0NLKTsKKyAgICAgICAgICAgIGlmICgocmMgIT0gU1FM
SVRFX09LKSAmJiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAgIHBGaWxlLT5s
YXN0RXJybm8gPSB0RXJybm87CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBpZiAobG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfU0hBUkVEKSB7CisgICAgICAg
IEFTU0VSVCghcExvY2stPmNudCk7CisgICAgICAgIEFTU0VSVCghcExvY2stPmxvY2t0eXBlKTsK
KworICAgICAgICBzID0gcmFuZ2VMb2NrKHBGaWxlLCBGX1JETENLLCAmdEVycm5vKTsKKworICAg
ICAgICAvLyBEcm9wIHRoZSB0ZW1wb3JhcnkgUEVORElORyBsb2NrLgorICAgICAgICBsb2NrLmxf
c3RhcnQgPSBTUUxpdGVQZW5kaW5nQnl0ZTsKKyAgICAgICAgbG9jay5sX2xlbiA9IDE7CisgICAg
ICAgIGxvY2subF90eXBlID0gRl9VTkxDSzsKKyAgICAgICAgaWYgKGZjbnRsKHBGaWxlLT5oLCBG
X1NFVExLLCAmbG9jaykpIHsKKyAgICAgICAgICAgIGlmIChzICE9IC0xKSB7CisgICAgICAgICAg
ICAgICAgdEVycm5vID0gZXJybm87IAorICAgICAgICAgICAgICAgIHJjID0gc3FsaXRlRXJyb3JG
cm9tUG9zaXhFcnJvcih0RXJybm8sIFNRTElURV9JT0VSUl9VTkxPQ0spOyAKKyAgICAgICAgICAg
ICAgICBpZiAoKHJjICE9IFNRTElURV9PSykgJiYgKHJjICE9IFNRTElURV9CVVNZKSkKKyAgICAg
ICAgICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IHRFcnJubzsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMgPT0g
LTEpIHsKKyAgICAgICAgICAgIHJjID0gc3FsaXRlRXJyb3JGcm9tUG9zaXhFcnJvcih0RXJybm8s
IFNRTElURV9JT0VSUl9MT0NLKTsKKyAgICAgICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAm
JiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8g
PSB0RXJybm87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwRmlsZS0+bG9ja3R5cGUg
PSBTUUxJVEVfTE9DS19TSEFSRUQ7CisgICAgICAgICAgICBwRmlsZS0+cE9wZW4tPm5Mb2NrKys7
CisgICAgICAgICAgICBwTG9jay0+Y250ID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAo
bG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfRVhDTFVTSVZFICYmIHBMb2NrLT5jbnQgPiAxKSB7Cisg
ICAgICAgIC8vIFdlIGFyZSB0cnlpbmcgZm9yIGFuIGV4Y2x1c2l2ZSBsb2NrIGJ1dCBhbm90aGVy
IHRocmVhZCBpbiB0aGUKKyAgICAgICAgLy8gc2FtZSBwcm9jZXNzIGlzIHN0aWxsIGhvbGRpbmcg
YSBzaGFyZWQgbG9jay4KKyAgICAgICAgcmMgPSBTUUxJVEVfQlVTWTsKKyAgICB9ICBlbHNlIHsK
KyAgICAgICAgLy8gVGhlIHJlcXVlc3Qgd2FzIGZvciBhIFJFU0VSVkVEIG9yIEVYQ0xVU0lWRSBs
b2NrLiAgSXQgaXMKKyAgICAgICAgLy8gYXNzdW1lZCB0aGF0IHRoZXJlIGlzIGEgU0hBUkVEIG9y
IGdyZWF0ZXIgbG9jayBvbiB0aGUgZmlsZQorICAgICAgICAvLyBhbHJlYWR5LgorICAgICAgICBB
U1NFUlQocEZpbGUtPmxvY2t0eXBlKTsKKyAgICAgICAgbG9jay5sX3R5cGUgPSBGX1dSTENLOwor
ICAgICAgICBzd2l0Y2ggKGxvY2t0eXBlKSB7CisgICAgICAgIGNhc2UgU1FMSVRFX0xPQ0tfUkVT
RVJWRUQ6CisgICAgICAgICAgICBsb2NrLmxfc3RhcnQgPSBTUUxpdGVSZXNlcnZlZEJ5dGU7Cisg
ICAgICAgICAgICBzID0gZmNudGwocEZpbGUtPmgsIEZfU0VUTEssICZsb2NrKTsKKyAgICAgICAg
ICAgIHRFcnJubyA9IGVycm5vOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FM
SVRFX0xPQ0tfRVhDTFVTSVZFOgorICAgICAgICAgICAgcyA9IHJhbmdlTG9jayhwRmlsZSwgRl9X
UkxDSywgJnRFcnJubyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CisgICAgICAgIGlmIChz
ID09IC0xKSB7CisgICAgICAgICAgICByYyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVy
cm5vLCBTUUxJVEVfSU9FUlJfTE9DSyk7CisgICAgICAgICAgICBpZiAoKHJjICE9IFNRTElURV9P
SykgJiYgKHJjICE9IFNRTElURV9CVVNZKSkKKyAgICAgICAgICAgICAgICBwRmlsZS0+bGFzdEVy
cm5vID0gdEVycm5vOworICAgICAgICB9CisgICAgfQorICAKKyAgICBpZiAocmMgPT0gU1FMSVRF
X09LKSB7CisgICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IGxvY2t0eXBlOworICAgICAgICBwTG9j
ay0+bG9ja3R5cGUgPSBsb2NrdHlwZTsKKyAgICB9IGVsc2UgaWYgKGxvY2t0eXBlID09IFNRTElU
RV9MT0NLX0VYQ0xVU0lWRSkgeworICAgICAgICBwRmlsZS0+bG9ja3R5cGUgPSBTUUxJVEVfTE9D
S19QRU5ESU5HOworICAgICAgICBwTG9jay0+bG9ja3R5cGUgPSBTUUxJVEVfTE9DS19QRU5ESU5H
OworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLy8gQ2xvc2VzIGFsbCBmaWxlIGRlc2Ny
aXB0b3JzIGZvciBnaXZlbiBDaHJvbWl1bUZpbGUgZm9yIHdoaWNoIHRoZSBjbG9zZSBoYXMgYmVl
biBkZWZlcnJlZC4KKy8vIFJldHVybnMgYSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQg
Y2xvc2VQZW5kaW5nRmRzKENocm9taXVtRmlsZSogcEZpbGUpCit7CisgICAgaW50IHJjID0gU1FM
SVRFX09LOworICAgIENocm9taXVtT3BlbkluZm8qIHBPcGVuID0gcEZpbGUtPnBPcGVuOworICAg
IENocm9taXVtVW51c2VkRmQqIHBFcnJvciA9IDA7CisgICAgQ2hyb21pdW1VbnVzZWRGZCogcE5l
eHQ7CisgICAgZm9yIChDaHJvbWl1bVVudXNlZEZkKiBwID0gcE9wZW4tPnBVbnVzZWQ7IHA7IHAg
PSBwTmV4dCkgeworICAgICAgICBwTmV4dCA9IHAtPnBOZXh0OworICAgICAgICBpZiAoY2xvc2Uo
cC0+ZmQpKSB7CisgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJybm87CisgICAgICAg
ICAgICByYyA9IFNRTElURV9JT0VSUl9DTE9TRTsKKyAgICAgICAgICAgIHAtPnBOZXh0ID0gcEVy
cm9yOworICAgICAgICAgICAgcEVycm9yID0gcDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICBzcWxpdGUzX2ZyZWUocCk7CisgICAgfQorICAgIHBPcGVuLT5wVW51c2VkID0gcEVycm9yOwor
ICAgIHJldHVybiByYzsKK30KKworLy8gTG93ZXJzIHRoZSBsb2NraW5nIGxldmVsIG9uIGZpbGUg
ZGVzY3JpcHRvci4KKy8vIGxvY2t0eXBlIG11c3QgYmUgZWl0aGVyIFNRTElURV9MT0NLX05PTkUg
b3IgU1FMSVRFX0xPQ0tfU0hBUkVELgorc3RhdGljIGludCBjaHJvbWl1bVVubG9jayhzcWxpdGUz
X2ZpbGUqIGlkLCBpbnQgbG9ja3R5cGUpCit7CisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7Cisg
ICAgQVNTRVJUKGxvY2t0eXBlIDw9IFNRTElURV9MT0NLX1NIQVJFRCk7CisKKyAgICBpZiAocEZp
bGUtPmxvY2t0eXBlIDw9IGxvY2t0eXBlKQorICAgICAgICByZXR1cm4gU1FMSVRFX09LOworCisg
ICAgQ2hyb21pdW1Mb2NrSW5mbyogcExvY2sgPSBwRmlsZS0+cExvY2s7CisgICAgQVNTRVJUKHBM
b2NrLT5jbnQpOworCisgICAgc3RydWN0IGZsb2NrIGxvY2s7CisgICAgaW50IHJjID0gU1FMSVRF
X09LOworICAgIGludCBoID0gcEZpbGUtPmg7CisgICAgaW50IHRFcnJubzsKKworICAgIGlmIChw
RmlsZS0+bG9ja3R5cGUgPiBTUUxJVEVfTE9DS19TSEFSRUQpIHsKKyAgICAgICAgQVNTRVJUKHBM
b2NrLT5sb2NrdHlwZSA9PSBwRmlsZS0+bG9ja3R5cGUpOworCisgICAgICAgIGlmIChsb2NrdHlw
ZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQgJiYgcmFuZ2VMb2NrKHBGaWxlLCBGX1JETENLLCAmdEVy
cm5vKSA9PSAtMSkgeworICAgICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9y
KHRFcnJubywgU1FMSVRFX0lPRVJSX1JETE9DSyk7CisgICAgICAgICAgICBpZiAoKHJjICE9IFNR
TElURV9PSykgJiYgKHJjICE9IFNRTElURV9CVVNZKSkKKyAgICAgICAgICAgICAgICBwRmlsZS0+
bGFzdEVycm5vID0gdEVycm5vOworICAgICAgICAgICAgaWYgKHJjID09IFNRTElURV9PSykKKyAg
ICAgICAgICAgICAgICBwRmlsZS0+bG9ja3R5cGUgPSBsb2NrdHlwZTsKKyAgICAgICAgICAgIHJl
dHVybiByYzsKKyAgICAgICAgfQorICAgICAgICBsb2NrLmxfdHlwZSA9IEZfVU5MQ0s7CisgICAg
ICAgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKyAgICAgICAgbG9jay5sX3N0YXJ0ID0gU1FM
aXRlUGVuZGluZ0J5dGU7CisgICAgICAgIGxvY2subF9sZW4gPSAyOworICAgICAgICBpZiAoZmNu
dGwoaCwgRl9TRVRMSywgJmxvY2spICE9IC0xKQorICAgICAgICAgICAgcExvY2stPmxvY2t0eXBl
ID0gU1FMSVRFX0xPQ0tfU0hBUkVEOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRFcnJu
byA9IGVycm5vOworICAgICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRF
cnJubywgU1FMSVRFX0lPRVJSX1VOTE9DSyk7CisgICAgICAgICAgICBpZiAoKHJjICE9IFNRTElU
RV9PSykgJiYgKHJjICE9IFNRTElURV9CVVNZKSkKKyAgICAgICAgICAgICAgICBwRmlsZS0+bGFz
dEVycm5vID0gdEVycm5vOworICAgICAgICAgICAgaWYgKHJjID09IFNRTElURV9PSykKKyAgICAg
ICAgICAgICAgICBwRmlsZS0+bG9ja3R5cGUgPSBsb2NrdHlwZTsKKyAgICAgICAgICAgIHJldHVy
biByYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tf
Tk9ORSkgeworICAgICAgICBzdHJ1Y3QgQ2hyb21pdW1PcGVuSW5mbyAqcE9wZW47CisKKyAgICAg
ICAgcExvY2stPmNudC0tOworCisgICAgICAgIC8vIFJlbGVhc2UgdGhlIGxvY2sgdXNpbmcgYW4g
T1MgY2FsbCBvbmx5IHdoZW4gYWxsIHRocmVhZHMgaW4gdGhpcyBzYW1lIHByb2Nlc3MgaGF2ZSBy
ZWxlYXNlZCB0aGUgbG9jay4KKyAgICAgICAgaWYgKCFwTG9jay0+Y250KSB7CisgICAgICAgICAg
ICBsb2NrLmxfdHlwZSA9IEZfVU5MQ0s7CisgICAgICAgICAgICBsb2NrLmxfd2hlbmNlID0gU0VF
S19TRVQ7CisgICAgICAgICAgICBsb2NrLmxfc3RhcnQgPSBsb2NrLmxfbGVuID0gMEw7CisgICAg
ICAgICAgICBpZiAoZmNudGwoaCwgRl9TRVRMSywgJmxvY2spICE9IC0xKQorICAgICAgICAgICAg
ICAgIHBMb2NrLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX05PTkU7CisgICAgICAgICAgICBlbHNl
IHsKKyAgICAgICAgICAgICAgICB0RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgICAgICByYyA9
IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5vLCBTUUxJVEVfSU9FUlJfVU5MT0NLKTsK
KyAgICAgICAgICAgICAgICBpZiAoKHJjICE9IFNRTElURV9PSykgJiYgKHJjICE9IFNRTElURV9C
VVNZKSkKKyAgICAgICAgICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IHRFcnJubzsKKyAg
ICAgICAgICAgICAgICBwTG9jay0+bG9ja3R5cGUgPSBTUUxJVEVfTE9DS19OT05FOworICAgICAg
ICAgICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX05PTkU7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICBwT3BlbiA9IHBGaWxlLT5wT3BlbjsKKyAgICAgICAg
cE9wZW4tPm5Mb2NrLS07CisgICAgICAgIEFTU0VSVChwT3Blbi0+bkxvY2sgPj0gMCk7CisgICAg
ICAgIGlmICghcE9wZW4tPm5Mb2NrKSB7CisgICAgICAgICAgICBpbnQgcmMyID0gY2xvc2VQZW5k
aW5nRmRzKHBGaWxlKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfT0spCisgICAgICAg
ICAgICAgICAgcmMgPSByYzI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmMgPT0gU1FM
SVRFX09LKQorICAgICAgICBwRmlsZS0+bG9ja3R5cGUgPSBsb2NrdHlwZTsKKyAgICByZXR1cm4g
cmM7Cit9CisKKy8vIENsb3NlcyBhbGwgZmlsZSBoYW5kbGVzIGZvciBnaXZlbiBDaHJvbWl1bUZp
bGUgYW5kIHNldHMgYWxsIGl0cyBmaWVsZHMgdG8gMC4KKy8vIFJldHVybnMgYSBTUUxpdGUgZXJy
b3IgY29kZS4KK3N0YXRpYyBpbnQgY2hyb21pdW1DbG9zZU5vTG9jayhzcWxpdGUzX2ZpbGUqIGlk
KQoreworICAgIENocm9taXVtRmlsZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVt
RmlsZSo+KGlkKTsKKyAgICBpZiAoIXBGaWxlKQorICAgICAgICByZXR1cm4gU1FMSVRFX09LOwor
ICAgIGlmIChwRmlsZS0+ZGlyZmQgPj0gMCkgeworICAgICAgICBpZiAoY2xvc2UocEZpbGUtPmRp
cmZkKSkgeworICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IGVycm5vOworICAgICAgICAg
ICAgcmV0dXJuIFNRTElURV9JT0VSUl9ESVJfQ0xPU0U7CisgICAgICAgIH0KKyAgICAgICAgcEZp
bGUtPmRpcmZkID0gLTE7CisgICAgfQorICAgIGlmIChwRmlsZS0+aCA+PSAwICYmIGNsb3NlKHBG
aWxlLT5oKSkgeworICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJybm87CisgICAgICAgIHJl
dHVybiBTUUxJVEVfSU9FUlJfQ0xPU0U7CisgICAgfQorICAgIHNxbGl0ZTNfZnJlZShwRmlsZS0+
cFVudXNlZCk7CisgICAgbWVtc2V0KHBGaWxlLCAwLCBzaXplb2YoQ2hyb21pdW1GaWxlKSk7Cisg
ICAgcmV0dXJuIFNRTElURV9PSzsKK30KKworLy8gQ2xvc2VzIGEgQ2hyb21pdW1GaWxlLCBpbmNs
dWRpbmcgbG9ja2luZyBvcGVyYXRpb25zLiBSZXR1cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitz
dGF0aWMgaW50IGNocm9taXVtQ2xvc2Uoc3FsaXRlM19maWxlKiBpZCkKK3sKKyAgICBpZiAoIWlk
KQorICAgICAgICByZXR1cm4gU1FMSVRFX09LOworCisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9
IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIGNocm9taXVtVW5sb2Nr
KGlkLCBTUUxJVEVfTE9DS19OT05FKTsKKyAgICBpZiAocEZpbGUtPnBPcGVuICYmIHBGaWxlLT5w
T3Blbi0+bkxvY2spIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG91dHN0YW5kaW5nIGxvY2tz
LCBkbyBub3QgYWN0dWFsbHkgY2xvc2UgdGhlIGZpbGUganVzdAorICAgICAgICAvLyB5ZXQgYmVj
YXVzZSB0aGF0IHdvdWxkIGNsZWFyIHRob3NlIGxvY2tzLgorICAgICAgICBDaHJvbWl1bU9wZW5J
bmZvKiBwT3BlbiA9IHBGaWxlLT5wT3BlbjsKKyAgICAgICAgQ2hyb21pdW1VbnVzZWRGZCogcCA9
IHBGaWxlLT5wVW51c2VkOworICAgICAgICBwLT5wTmV4dCA9IHBPcGVuLT5wVW51c2VkOworICAg
ICAgICBwT3Blbi0+cFVudXNlZCA9IHA7CisgICAgICAgIHBGaWxlLT5oID0gLTE7CisgICAgICAg
IHBGaWxlLT5wVW51c2VkID0gMDsKKyAgICB9CisgICAgcmVsZWFzZUxvY2tJbmZvKHBGaWxlLT5w
TG9jayk7CisgICAgcmVsZWFzZU9wZW5JbmZvKHBGaWxlLT5wT3Blbik7CisgICAgcmV0dXJuIGNo
cm9taXVtQ2xvc2VOb0xvY2soaWQpOworfQorCitzdGF0aWMgaW50IGNocm9taXVtQ2hlY2tSZXNl
cnZlZExvY2tOb29wKHNxbGl0ZTNfZmlsZSosIGludCogcFJlc091dCkKK3sKKyAgICAqcFJlc091
dCA9IDA7CisgICAgcmV0dXJuIFNRTElURV9PSzsKK30KKworc3RhdGljIGludCBjaHJvbWl1bUxv
Y2tOb29wKHNxbGl0ZTNfZmlsZSosIGludCkKK3sKKyAgICByZXR1cm4gU1FMSVRFX09LOworfQor
CitzdGF0aWMgaW50IGNocm9taXVtVW5sb2NrTm9vcChzcWxpdGUzX2ZpbGUqLCBpbnQpCit7Cisg
ICAgcmV0dXJuIFNRTElURV9PSzsKK30KKworLy8gU2Vla3MgdG8gdGhlIHJlcXVlc3RlZCBvZmZz
ZXQgYW5kIHJlYWRzIHVwIHRvIHxjbnR8IGJ5dGVzIGludG8gfHBCdWZ8LiBSZXR1cm5zIG51bWJl
ciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgorc3RhdGljIGludCBzZWVrQW5kUmVhZChDaHJvbWl1
bUZpbGUqIGlkLCBzcWxpdGUzX2ludDY0IG9mZnNldCwgdm9pZCogcEJ1ZiwgaW50IGNudCkKK3sK
KyAgICBzcWxpdGVfaW50NjQgbmV3T2Zmc2V0ID0gbHNlZWsoaWQtPmgsIG9mZnNldCwgU0VFS19T
RVQpOworICAgIGlmIChuZXdPZmZzZXQgIT0gb2Zmc2V0KSB7CisgICAgICAgIGlkLT5sYXN0RXJy
bm8gPSAobmV3T2Zmc2V0ID09IC0xKSA/IGVycm5vIDogMDsKKyAgICAgICAgcmV0dXJuIC0xOwor
ICAgIH0KKyAgICBpbnQgZ290ID0gcmVhZChpZC0+aCwgcEJ1ZiwgY250KTsKKyAgICBpZiAoZ290
IDwgMCkKKyAgICAgICAgaWQtPmxhc3RFcnJubyA9IGVycm5vOworICAgIHJldHVybiBnb3Q7Cit9
CisKKy8vIFJlYWRzIGRhdGEgZnJvbSBmaWxlIGludG8gYSBidWZmZXIuIFJldHVybnMgYSBTUUxp
dGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQgY2hyb21pdW1SZWFkKHNxbGl0ZTNfZmlsZSogaWQs
IHZvaWQqIHBCdWYsIGludCBhbXQsIHNxbGl0ZTNfaW50NjQgb2Zmc2V0KQoreworICAgIENocm9t
aXVtRmlsZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAg
ICBBU1NFUlQocEZpbGUpOworCisgICAgLy8gVGhlIGJ5dGVzIGluIHRoZSBsb2NraW5nIHJhbmdl
IHNob3VsZCBuZXZlciBiZSByZWFkLgorICAgIEFTU0VSVCghcEZpbGUtPnBVbnVzZWQgfHwgb2Zm
c2V0ID49IFNRTGl0ZVBlbmRpbmdCeXRlICsgNTEyIHx8IG9mZnNldCArIGFtdCA8PSBTUUxpdGVQ
ZW5kaW5nQnl0ZSk7CisKKyAgICBpbnQgZ290ID0gc2Vla0FuZFJlYWQocEZpbGUsIG9mZnNldCwg
cEJ1ZiwgYW10KTsKKyAgICBpZiAoZ290ID09IGFtdCkKKyAgICAgICAgcmV0dXJuIFNRTElURV9P
SzsKKworICAgIGlmIChnb3QgPCAwKQorICAgICAgICByZXR1cm4gU1FMSVRFX0lPRVJSX1JFQUQ7
CisKKyAgICAvLyBVbnJlYWQgcGFydHMgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIHplcm8tZmlsbGVk
LgorICAgIG1lbXNldCgmKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHBCdWYpKVtnb3RdLCAwLCBh
bXQgLSBnb3QpOworICAgIHBGaWxlLT5sYXN0RXJybm8gPSAwOworICAgIHJldHVybiBTUUxJVEVf
SU9FUlJfU0hPUlRfUkVBRDsKK30KKworLy8gU2Vla3MgdG8gdGhlIHJlcXVlc3RlZCBvZmZzZXQg
YW5kIHdyaXRlcyB1cCB0byB8Y250fCBieXRlcy4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYWN0
dWFsbHkgd3JpdHRlbi4KK3N0YXRpYyBpbnQgc2Vla0FuZFdyaXRlKENocm9taXVtRmlsZSogaWQs
IHNxbGl0ZV9pbnQ2NCBvZmZzZXQsIGNvbnN0IHZvaWQqIHBCdWYsIGludCBjbnQpCit7CisgICAg
c3FsaXRlX2ludDY0IG5ld09mZnNldCA9IGxzZWVrKGlkLT5oLCBvZmZzZXQsIFNFRUtfU0VUKTsK
KyAgICBpZiAobmV3T2Zmc2V0ICE9IG9mZnNldCkgeworICAgICAgICBpZC0+bGFzdEVycm5vID0g
KG5ld09mZnNldCA9PSAtMSkgPyBlcnJubyA6IDA7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9
CisgICAgaW50IGdvdCA9IHdyaXRlKGlkLT5oLCBwQnVmLCBjbnQpOworICAgIGlmIChnb3QgPCAw
KQorICAgICAgICBpZC0+bGFzdEVycm5vID0gZXJybm87CisgICAgcmV0dXJuIGdvdDsKK30KKwor
Ly8gV3JpdGVzIGRhdGEgZnJvbSBidWZmZXIgaW50byBhIGZpbGUuIFJldHVybnMgYSBTUUxpdGUg
ZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQgY2hyb21pdW1Xcml0ZShzcWxpdGUzX2ZpbGUqIGlkLCBj
b25zdCB2b2lkKiBwQnVmLCBpbnQgYW10LCBzcWxpdGUzX2ludDY0IG9mZnNldCkKK3sKKyAgICBD
aHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7
CisgICAgQVNTRVJUKHBGaWxlKTsKKyAgICBBU1NFUlQoYW10ID4gMCk7CisKKyAgICAvLyBUaGUg
Ynl0ZXMgaW4gdGhlIGxvY2tpbmcgcmFuZ2Ugc2hvdWxkIG5ldmVyIGJlIHdyaXR0ZW4uCisgICAg
QVNTRVJUKCFwRmlsZS0+cFVudXNlZCB8fCBvZmZzZXQgPj0gU1FMaXRlUGVuZGluZ0J5dGUgKyA1
MTIgfHwgb2Zmc2V0ICsgYW10IDw9IFNRTGl0ZVBlbmRpbmdCeXRlKTsKKworICAgIGludCB3cm90
ZSA9IDA7CisgICAgd2hpbGUgKGFtdCA+IDAgJiYgKHdyb3RlID0gc2Vla0FuZFdyaXRlKHBGaWxl
LCBvZmZzZXQsIHBCdWYsIGFtdCkpID4gMCkgeworICAgICAgICBhbXQgLT0gd3JvdGU7CisgICAg
ICAgIG9mZnNldCArPSB3cm90ZTsKKyAgICAgICAgcEJ1ZiA9ICYocmVpbnRlcnByZXRfY2FzdDxj
b25zdCBjaGFyKj4ocEJ1ZikpW3dyb3RlXTsKKyAgICB9CisgICAgaWYgKGFtdCA+IDApIHsKKyAg
ICAgICAgaWYgKHdyb3RlIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlJfV1JJ
VEU7CisgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSAwOworICAgICAgICByZXR1cm4gU1FMSVRF
X0ZVTEw7CisgICAgfQorICAgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKKy8vIE1ha2VzIHN1cmUg
YWxsIHdyaXRlcyB0byBhIHBhcnRpY3VsYXIgZmlsZSBhcmUgY29tbWl0dGVkIHRvIGRpc2suIFJl
dHVybnMgYSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQgY2hyb21pdW1TeW5jKHNxbGl0
ZTNfZmlsZSogaWQsIGludCBmbGFncykKK3sKKyAgICBBU1NFUlQoKGZsYWdzICYgMHgwRikgPT0g
U1FMSVRFX1NZTkNfTk9STUFMIHx8IChmbGFncyAmIDB4MEYpID09IFNRTElURV9TWU5DX0ZVTEwp
OworCisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1G
aWxlKj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7CisKKyAgICBpZiAoZnN5bmMocEZpbGUtPmgp
KSB7CisgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgcmV0dXJuIFNR
TElURV9JT0VSUl9GU1lOQzsKKyAgICB9CisKKyAgICBpZiAocEZpbGUtPmRpcmZkID49IDApIHsK
KyAgICAgICAgaWYgKCFjbG9zZShwRmlsZS0+ZGlyZmQpKQorICAgICAgICAgICAgcEZpbGUtPmRp
cmZkID0gLTE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9
IGVycm5vOworICAgICAgICAgICAgcmV0dXJuIFNRTElURV9JT0VSUl9ESVJfQ0xPU0U7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gU1FMSVRFX09LOwogfQogCi0vLyBDaHJvbWl1bSdz
IFBvc2l4IGltcGxlbWVudGF0aW9uIG9mIFNRTGl0ZSBWRlMKLW5hbWVzcGFjZSB7CisvLyBUcnVu
Y2F0ZXMgYW4gb3BlbiBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgc2l6ZS4gUmV0dXJucyBhIFNRTGl0
ZSBlcnJvciBjb2RlLgorc3RhdGljIGludCBjaHJvbWl1bVRydW5jYXRlKHNxbGl0ZTNfZmlsZSog
aWQsIHNxbGl0ZV9pbnQ2NCBuQnl0ZSkKK3sKKyAgICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVp
bnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CisgICAgQVNTRVJUKHBGaWxlKTsKKwor
ICAgIGlmIChmdHJ1bmNhdGUocEZpbGUtPmgsIG5CeXRlKSkgeworICAgICAgICBwRmlsZS0+bGFz
dEVycm5vID0gZXJybm87CisgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlJfVFJVTkNBVEU7Cisg
ICAgfQorCisgICAgcmV0dXJuIFNRTElURV9PSzsKK30KKworLy8gRGV0ZXJtaW5lcyB0aGUgc2l6
ZSBvZiBhIGZpbGUgaW4gYnl0ZXMuIFJldHVybnMgYSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRp
YyBpbnQgY2hyb21pdW1GaWxlU2l6ZShzcWxpdGUzX2ZpbGUqIGlkLCBzcWxpdGVfaW50NjQqIHBT
aXplKQoreworICAgIENocm9taXVtRmlsZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9t
aXVtRmlsZSo+KGlkKTsKKyAgICBBU1NFUlQocEZpbGUpOworCisgICAgc3RydWN0IHN0YXQgYnVm
OworICAgIGlmIChmc3RhdChwRmlsZS0+aCwgJmJ1ZikpIHsKKyAgICAgICAgcEZpbGUtPmxhc3RF
cnJubyA9IGVycm5vOworICAgICAgICByZXR1cm4gU1FMSVRFX0lPRVJSX0ZTVEFUOworICAgIH0K
KyAgICAqcFNpemUgPSBidWYuc3Rfc2l6ZTsKKworICAgIC8vIFdoZW4gb3BlbmluZyBhIHplcm8t
c2l6ZSBkYXRhYmFzZSwgZmluZExvY2tJbmZvIHdyaXRlcyBhIHNpbmdsZSBieXRlIGludG8gdGhh
dCBmaWxlCisgICAgLy8gaW4gb3JkZXIgdG8gd29yayBhcm91bmQgYSBidWcgaW4gdGhlIE9TIFgg
bXNkb3MgZmlsZXN5c3RlbS4gSW4gb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXMKKyAgICAvLyB3aXRo
IHVwcGVyIGxheWVycywgd2UgbmVlZCB0byByZXBvcnQgdGhpcyBmaWxlIHNpemUgYXMgemVybyBl
dmVuIHRob3VnaCBpdCBpcyByZWFsbHkgMS4KKyAgICAvLyBTZWUgaHR0cDovL3d3dy5zcWxpdGUu
b3JnL2N2c3RyYWMvdGt0dmlldz90bj0zMjYwLgorICAgIGlmICgqcFNpemUgPT0gMSkKKyAgICAg
ICAgKnBTaXplID0gMDsKKworICAgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKK3N0YXRpYyBpbnQg
Y2hyb21pdW1GaWxlQ29udHJvbChzcWxpdGUzX2ZpbGUqIGlkLCBpbnQgb3AsIHZvaWQqIHBBcmcp
Cit7CisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1G
aWxlKj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7CisKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAg
Y2FzZSBTUUxJVEVfRkNOVExfTE9DS1NUQVRFOgorICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxp
bnQqPihwQXJnKSA9IHBGaWxlLT5sb2NrdHlwZTsKKyAgICAgICAgcmV0dXJuIFNRTElURV9PSzsK
KyAgICBjYXNlIFNRTElURV9MQVNUX0VSUk5POgorICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxp
bnQqPihwQXJnKSA9IHBGaWxlLT5sYXN0RXJybm87CisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7
CisgICAgfQorICAgIHJldHVybiBTUUxJVEVfRVJST1I7Cit9CisKKy8vIFNhbWUgYXMgU1FMSVRF
X0RFRkFVTFRfU0VDVE9SX1NJWkUgZnJvbSBzcWxpdGUncyBvcy5oLgorc3RhdGljIGNvbnN0IGlu
dCBTUUxpdGVEZWZhdWx0U2VjdG9yU2l6ZSA9IDUxMjsKKworc3RhdGljIGludCBjaHJvbWl1bVNl
Y3RvclNpemUoc3FsaXRlM19maWxlKikKK3sKKyAgICByZXR1cm4gU1FMaXRlRGVmYXVsdFNlY3Rv
clNpemU7Cit9CisKK3N0YXRpYyBpbnQgY2hyb21pdW1EZXZpY2VDaGFyYWN0ZXJpc3RpY3Moc3Fs
aXRlM19maWxlKikKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHNxbGl0ZTNf
aW9fbWV0aG9kcyBwb3NpeElvTWV0aG9kcyA9IHsKKyAgICAxLAorICAgIGNocm9taXVtQ2xvc2Us
CisgICAgY2hyb21pdW1SZWFkLAorICAgIGNocm9taXVtV3JpdGUsCisgICAgY2hyb21pdW1UcnVu
Y2F0ZSwKKyAgICBjaHJvbWl1bVN5bmMsCisgICAgY2hyb21pdW1GaWxlU2l6ZSwKKyAgICBjaHJv
bWl1bUxvY2ssCisgICAgY2hyb21pdW1VbmxvY2ssCisgICAgY2hyb21pdW1DaGVja1Jlc2VydmVk
TG9jaywKKyAgICBjaHJvbWl1bUZpbGVDb250cm9sLAorICAgIGNocm9taXVtU2VjdG9yU2l6ZSwK
KyAgICBjaHJvbWl1bURldmljZUNoYXJhY3RlcmlzdGljcworfTsKKworc3RhdGljIGNvbnN0IHNx
bGl0ZTNfaW9fbWV0aG9kcyBub2xvY2tJb01ldGhvZHMgPSB7CisgICAgMSwKKyAgICBjaHJvbWl1
bUNsb3NlTm9Mb2NrLAorICAgIGNocm9taXVtUmVhZCwKKyAgICBjaHJvbWl1bVdyaXRlLAorICAg
IGNocm9taXVtVHJ1bmNhdGUsCisgICAgY2hyb21pdW1TeW5jLAorICAgIGNocm9taXVtRmlsZVNp
emUsCisgICAgY2hyb21pdW1Mb2NrTm9vcCwKKyAgICBjaHJvbWl1bVVubG9ja05vb3AsCisgICAg
Y2hyb21pdW1DaGVja1Jlc2VydmVkTG9ja05vb3AsCisgICAgY2hyb21pdW1GaWxlQ29udHJvbCwK
KyAgICBjaHJvbWl1bVNlY3RvclNpemUsCisgICAgY2hyb21pdW1EZXZpY2VDaGFyYWN0ZXJpc3Rp
Y3MKK307CisKKy8vIEluaXRpYWxpemVzIGEgQ2hyb21pdW1GaWxlLiBSZXR1cm5zIGEgU1FMaXRl
IGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGZpbGxJbkNocm9taXVtRmlsZShzcWxpdGUzX3Zmcyog
cFZmcywgaW50IGgsIGludCBkaXJmZCwgc3FsaXRlM19maWxlKiBwSWQsIGNvbnN0IGNoYXIqIHpG
aWxlbmFtZSwgaW50IG5vTG9jaykKK3sKKyAgICBDaHJvbWl1bUZpbGUqIHBOZXcgPSByZWludGVy
cHJldF9jYXN0PENocm9taXVtRmlsZSo+KHBJZCk7CisKKyAgICBBU1NFUlQoIXBOZXctPnBMb2Nr
KTsKKyAgICBBU1NFUlQoIXBOZXctPnBPcGVuKTsKKworICAgIHBOZXctPmggPSBoOworICAgIHBO
ZXctPmRpcmZkID0gZGlyZmQ7CisKKyAgICBpbnQgcmMgPSBTUUxJVEVfT0s7CisgICAgY29uc3Qg
c3FsaXRlM19pb19tZXRob2RzKiBwTG9ja2luZ1N0eWxlOworICAgIGlmIChub0xvY2spCisgICAg
ICAgIHBMb2NraW5nU3R5bGUgPSAmbm9sb2NrSW9NZXRob2RzOworICAgIGVsc2UgeworICAgICAg
ICBwTG9ja2luZ1N0eWxlID0gJnBvc2l4SW9NZXRob2RzOworICAgICAgICByYyA9IGZpbmRMb2Nr
SW5mbyhwTmV3LCAmcE5ldy0+cExvY2ssICZwTmV3LT5wT3Blbik7CisgICAgICAgIGlmIChyYyAh
PSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIC8vIElmIGFuIGVycm9yIG9jY3VyZWQgaW4gZmlu
ZExvY2tJbmZvKCksIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIC8vIGlt
bWVkaWF0ZWx5LiBUaGlzIGNhbiBoYXBwZW4gaW4gdHdvIHNjZW5hcmlvczoKKyAgICAgICAgICAg
IC8vCisgICAgICAgICAgICAvLyAgIChhKSBBIGNhbGwgdG8gZnN0YXQoKSBmYWlsZWQuCisgICAg
ICAgICAgICAvLyAgIChiKSBBIG1hbGxvYyBmYWlsZWQuCisgICAgICAgICAgICAvLworICAgICAg
ICAgICAgLy8gU2NlbmFyaW8gKGIpIG1heSBvbmx5IG9jY3VyIGlmIHRoZSBwcm9jZXNzIGlzIGhv
bGRpbmcgbm8gb3RoZXIKKyAgICAgICAgICAgIC8vIGZpbGUgZGVzY3JpcHRvcnMgb3BlbiBvbiB0
aGUgc2FtZSBmaWxlLiBJZiB0aGVyZSB3ZXJlIG90aGVyIGZpbGUKKyAgICAgICAgICAgIC8vIGRl
c2NyaXB0b3JzIG9uIHRoaXMgZmlsZSwgdGhlbiBubyBtYWxsb2Mgd291bGQgYmUgcmVxdWlyZWQg
YnkKKyAgICAgICAgICAgIC8vIGZpbmRMb2NrSW5mbygpLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBp
dCBpcyBxdWl0ZSBzYWZlIHRvIGNsb3NlCisgICAgICAgICAgICAvLyBoYW5kbGUgaCAtIGFzIGl0
IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBwb3NpeCBsb2NrcyB3aWxsIGJlIHJlbGVhc2VkCisgICAg
ICAgICAgICAvLyBieSBkb2luZyBzby4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJ
ZiBzY2VuYXJpbyAoYSkgY2F1c2VkIHRoZSBlcnJvciB0aGVuIHRoaW5ncyBhcmUgbm90IHNvIHNh
ZmUuIFRoZQorICAgICAgICAgICAgLy8gaW1wbGljaXQgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQg
aWYgZnN0YXQoKSBmYWlscywgdGhpbmdzIGFyZSBpbgorICAgICAgICAgICAgLy8gc3VjaCBiYWQg
c2hhcGUgdGhhdCBkcm9wcGluZyBhIGxvY2sgb3IgdHdvIGRvZXNuJ3QgbWF0dGVyIG11Y2guCisg
ICAgICAgICAgICBjbG9zZShoKTsKKyAgICAgICAgICAgIGggPSAtMTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHBOZXctPmxhc3RFcnJubyA9IDA7CisgICAgaWYgKHJjICE9IFNRTElURV9PSykg
eworICAgICAgICBpZiAoZGlyZmQgPj0gMCkKKyAgICAgICAgICAgIGNsb3NlKGRpcmZkKTsKKyAg
ICAgICAgaWYgKGggPj0gMCkKKyAgICAgICAgICAgIGNsb3NlKGgpOworICAgIH0gZWxzZQorICAg
ICAgICBwTmV3LT5wTWV0aG9kID0gcExvY2tpbmdTdHlsZTsKKyAgICByZXR1cm4gcmM7Cit9CisK
Ky8vIFNlYXJjaGVzIGZvciBhbiB1bnVzZWQgZmlsZSBkZXNjcmlwdG9yIHRoYXQgd2FzIG9wZW5l
ZCBvbiB0aGUgZGF0YWJhc2UgCisvLyBmaWxlIGlkZW50aWZpZWQgYnkgelBhdGggd2l0aCBtYXRj
aGluZyBmbGFncy4gUmV0dXJucyAwIGlmIG5vdCBmb3VuZC4KK3N0YXRpYyBDaHJvbWl1bVVudXNl
ZEZkKiBmaW5kUmV1c2FibGVGZChjb25zdCBjaGFyKiB6UGF0aCwgaW50IGZsYWdzKQoreworICAg
IENocm9taXVtVW51c2VkRmQqIHBVbnVzZWQgPSAwOworCisgICAgc3RydWN0IHN0YXQgc1N0YXQ7
CisgICAgaWYgKCFzdGF0KHpQYXRoLCAmc1N0YXQpKSB7CisgICAgICAgIENocm9taXVtRmlsZUlk
IGlkOworICAgICAgICBpZC5kZXYgPSBzU3RhdC5zdF9kZXY7CisgICAgICAgIGlkLmlubyA9IHNT
dGF0LnN0X2lubzsKKworICAgICAgICBDaHJvbWl1bU9wZW5JbmZvKiBwTyA9IDA7CisgICAgICAg
IGZvciAocE8gPSBvcGVuTGlzdDsgcE8gJiYgbWVtY21wKCZpZCwgJnBPLT5maWxlSWQsIHNpemVv
ZihpZCkpOyBwTyA9IHBPLT5wTmV4dCkgeyB9CisgICAgICAgIGlmIChwTykgeworICAgICAgICAg
ICAgQ2hyb21pdW1VbnVzZWRGZCoqIHBwOworICAgICAgICAgICAgZm9yIChwcCA9ICZwTy0+cFVu
dXNlZDsgKnBwICYmICgqcHApLT5mbGFncyAhPSBmbGFnczsgcHAgPSAmKCgqcHApLT5wTmV4dCkp
IHsgfQorICAgICAgICAgICAgcFVudXNlZCA9ICpwcDsKKyAgICAgICAgICAgIGlmIChwVW51c2Vk
KQorICAgICAgICAgICAgICAgICpwcCA9IHBVbnVzZWQtPnBOZXh0OworICAgICAgICB9CisgICAg
fQorICAgIHJldHVybiBwVW51c2VkOworfQogCiAvLyBPcGVucyBhIGZpbGUuCiAvLwpAQCAtNTks
MTQgKzk1MSwyNiBAQCBuYW1lc3BhY2UgewogLy8gaWQgLSB0aGUgc3RydWN0dXJlIHRoYXQgd2ls
bCBtYW5pcHVsYXRlIHRoZSBuZXdseSBvcGVuZWQgZmlsZS4KIC8vIGRlc2lyZWRGbGFncyAtIHRo
ZSBkZXNpcmVkIG9wZW4gbW9kZSBmbGFncy4KIC8vIHVzZWRGbGFncyAtIHRoZSBhY3R1YWwgb3Bl
biBtb2RlIGZsYWdzIHRoYXQgd2VyZSB1c2VkLgotaW50IGNocm9taXVtT3BlbihzcWxpdGUzX3Zm
cyogdmZzLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgc3FsaXRlM19m
aWxlKiBpZCwgaW50IGRlc2lyZWRGbGFncywgaW50KiB1c2VkRmxhZ3MpCitzdGF0aWMgaW50IGNo
cm9taXVtT3BlbihzcWxpdGUzX3ZmcyogdmZzLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHNxbGl0ZTNfZmlsZSogaWQsIGludCBkZXNpcmVkRmxhZ3MsIGlu
dCogdXNlZEZsYWdzKQogewotICAgIGNocm9taXVtX3NxbGl0ZTNfaW5pdGlhbGl6ZV91bml4X3Nx
bGl0ZTNfZmlsZShpZCk7CisgICAgLy8gVGhlIG1hc2sgMHgwMDAwN0YwMCBnaXZlcyB1cyB0aGUg
NyBiaXRzIHRoYXQgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBmaWxlIFNRTGl0ZSBpcyB0cnlp
bmcgdG8gb3Blbi4KKyAgICBpbnQgZmlsZVR5cGUgPSBkZXNpcmVkRmxhZ3MgJiAweDAwMDA3RjAw
OworCisgICAgbWVtc2V0KGlkLCAwLCBzaXplb2YoQ2hyb21pdW1GaWxlKSk7CisgICAgQ2hyb21p
dW1GaWxlKiBjaHJvbWl1bUZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlk
KTsKICAgICBpbnQgZmQgPSAtMTsKLSAgICBpbnQgcmVzdWx0ID0gY2hyb21pdW1fc3FsaXRlM19n
ZXRfcmV1c2FibGVfZmlsZV9oYW5kbGUoaWQsIGZpbGVOYW1lLCBkZXNpcmVkRmxhZ3MsICZmZCk7
Ci0gICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfT0spCi0gICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgaWYgKGZpbGVUeXBlID09IFNRTElURV9PUEVOX01BSU5fREIpIHsKKyAgICAgICAgQ2hyb21p
dW1VbnVzZWRGZCogdW51c2VkRmQgPSBmaW5kUmV1c2FibGVGZChmaWxlTmFtZSwgZGVzaXJlZEZs
YWdzKTsKKyAgICAgICAgaWYgKHVudXNlZEZkKQorICAgICAgICAgICAgZmQgPSB1bnVzZWRGZC0+
ZmQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdW51c2VkRmQgPSBzdGF0aWNfY2FzdDxD
aHJvbWl1bVVudXNlZEZkKj4oc3FsaXRlM19tYWxsb2Moc2l6ZW9mKCp1bnVzZWRGZCkpKTsKKyAg
ICAgICAgICAgIGlmICghdW51c2VkRmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIFNRTElURV9O
T01FTTsKKyAgICAgICAgfQorICAgICAgICBjaHJvbWl1bUZpbGUtPnBVbnVzZWQgPSB1bnVzZWRG
ZDsKKyAgICB9CiAKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIGZkID0gQ2hyb21pdW1Ccmlk
Z2U6OmRhdGFiYXNlT3BlbkZpbGUoZmlsZU5hbWUsIGRlc2lyZWRGbGFncyk7CkBAIC03NiwyMyAr
OTgwLDI0IEBAIGludCBjaHJvbWl1bU9wZW4oc3FsaXRlM192ZnMqIHZmcywgY29uc3QKICAgICAg
ICAgfQogICAgIH0KICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIGNocm9taXVtX3NxbGl0ZTNf
ZGVzdHJveV9yZXVzYWJsZV9maWxlX2hhbmRsZShpZCk7CisgICAgICAgIHNxbGl0ZTNfZnJlZShj
aHJvbWl1bUZpbGUtPnBVbnVzZWQpOwogICAgICAgICByZXR1cm4gU1FMSVRFX0NBTlRPUEVOOwog
ICAgIH0KIAogICAgIGlmICh1c2VkRmxhZ3MpCiAgICAgICAgICp1c2VkRmxhZ3MgPSBkZXNpcmVk
RmxhZ3M7Ci0gICAgY2hyb21pdW1fc3FsaXRlM191cGRhdGVfcmV1c2FibGVfZmlsZV9oYW5kbGUo
aWQsIGZkLCBkZXNpcmVkRmxhZ3MpOworICAgIGlmIChjaHJvbWl1bUZpbGUtPnBVbnVzZWQpIHsK
KyAgICAgICAgY2hyb21pdW1GaWxlLT5wVW51c2VkLT5mZCA9IGZkOworICAgICAgICBjaHJvbWl1
bUZpbGUtPnBVbnVzZWQtPmZsYWdzID0gZGVzaXJlZEZsYWdzOworICAgIH0KIAogICAgIGZjbnRs
KGZkLCBGX1NFVEZELCBmY250bChmZCwgRl9HRVRGRCkgfCBGRF9DTE9FWEVDKTsKIAotICAgIC8v
IFRoZSBtYXNrIDB4MDAwMDdGMDAgZ2l2ZXMgdXMgdGhlIDcgYml0cyB0aGF0IGRldGVybWluZSB0
aGUgdHlwZSBvZiB0aGUgZmlsZSBTUUxpdGUgaXMgdHJ5aW5nIHRvIG9wZW4uCi0gICAgaW50IGZp
bGVUeXBlID0gZGVzaXJlZEZsYWdzICYgMHgwMDAwN0YwMDsKICAgICBpbnQgbm9Mb2NrID0gKGZp
bGVUeXBlICE9IFNRTElURV9PUEVOX01BSU5fREIpOwotICAgIHJlc3VsdCA9IGNocm9taXVtX3Nx
bGl0ZTNfZmlsbF9pbl91bml4X3NxbGl0ZTNfZmlsZSh2ZnMsIGZkLCAtMSwgaWQsIGZpbGVOYW1l
LCBub0xvY2spOwotICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX09LKQotICAgICAgICBjaHJvbWl1
bV9zcWxpdGUzX2Rlc3Ryb3lfcmV1c2FibGVfZmlsZV9oYW5kbGUoaWQpOwotICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgaW50IHJjID0gZmlsbEluQ2hyb21pdW1GaWxlKHZmcywgZmQsIC0xLCBpZCwg
ZmlsZU5hbWUsIG5vTG9jayk7CisgICAgaWYgKHJjICE9IFNRTElURV9PSykKKyAgICAgICAgc3Fs
aXRlM19mcmVlKGNocm9taXVtRmlsZS0+cFVudXNlZCk7CisgICAgcmV0dXJuIHJjOwogfQogCiAv
LyBEZWxldGVzIHRoZSBnaXZlbiBmaWxlLgpAQCAtMTAxLDcgKzEwMDYsNyBAQCBpbnQgY2hyb21p
dW1PcGVuKHNxbGl0ZTNfdmZzKiB2ZnMsIGNvbnN0CiAvLyBmaWxlTmFtZSAtIHRoZSBuYW1lIG9m
IHRoZSBmaWxlLgogLy8gc3luY0RpciAtIGRldGVybWluZXMgaWYgdGhlIGRpcmVjdG9yeSB0byB3
aGljaCB0aGlzIGZpbGUgYmVsb25ncwogLy8gICAgICAgICAgIHNob3VsZCBiZSBzeW5jaGVkIGFm
dGVyIHRoZSBmaWxlIGlzIGRlbGV0ZWQuCi1pbnQgY2hyb21pdW1EZWxldGUoc3FsaXRlM192ZnMq
LCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgaW50IHN5bmNEaXIpCitzdGF0aWMgaW50IGNocm9taXVt
RGVsZXRlKHNxbGl0ZTNfdmZzKiwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBzeW5jRGlyKQog
ewogICAgIHJldHVybiBDaHJvbWl1bUJyaWRnZTo6ZGF0YWJhc2VEZWxldGVGaWxlKGZpbGVOYW1l
LCBzeW5jRGlyKTsKIH0KQEAgLTExMiw3ICsxMDE3LDcgQEAgaW50IGNocm9taXVtRGVsZXRlKHNx
bGl0ZTNfdmZzKiwgY29uc3QgYwogLy8gZmlsZU5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4K
IC8vIGZsYWcgLSB0aGUgdHlwZSBvZiB0ZXN0IHRvIG1ha2Ugb24gdGhpcyBmaWxlLgogLy8gcmVz
IC0gdGhlIHJlc3VsdC4KLWludCBjaHJvbWl1bUFjY2VzcyhzcWxpdGUzX3ZmcyosIGNvbnN0IGNo
YXIqIGZpbGVOYW1lLCBpbnQgZmxhZywgaW50KiByZXMpCitzdGF0aWMgaW50IGNocm9taXVtQWNj
ZXNzKHNxbGl0ZTNfdmZzKiwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBmbGFnLCBpbnQqIHJl
cykKIHsKICAgICBpbnQgYXR0ciA9IHN0YXRpY19jYXN0PGludD4oQ2hyb21pdW1CcmlkZ2U6OmRh
dGFiYXNlR2V0RmlsZUF0dHJpYnV0ZXMoZmlsZU5hbWUpKTsKICAgICBpZiAoYXR0ciA8IDApIHsK
QEAgLTE0Myw4ICsxMDQ4LDggQEAgaW50IGNocm9taXVtQWNjZXNzKHNxbGl0ZTNfdmZzKiwgY29u
c3QgYwogLy8gcmVsYXRpdmVQYXRoIC0gdGhlIHJlbGF0aXZlIHBhdGguCiAvLyBidWZTaXplIC0g
dGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIgaW4gYnl0ZXMuCiAvLyBhYnNvbHV0ZVBhdGgg
LSB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgYWJzb2x1dGUgcGF0aCB3aWxsIGJlIHN0b3Jl
ZC4KLWludCBjaHJvbWl1bUZ1bGxQYXRobmFtZShzcWxpdGUzX3ZmcyogdmZzLCBjb25zdCBjaGFy
KiByZWxhdGl2ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBjaGFyKiBhYnNv
bHV0ZVBhdGgpCitzdGF0aWMgaW50IGNocm9taXVtRnVsbFBhdGhuYW1lKHNxbGl0ZTNfdmZzKiB2
ZnMsIGNvbnN0IGNoYXIqIHJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW50LCBjaGFyKiBhYnNvbHV0ZVBhdGgpCiB7CiAgICAgLy8gVGhlIHJlbmRlcmVyIHBy
b2Nlc3MgZG9lc24ndCBuZWVkIHRvIGtub3cgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUK
ICAgICBzcWxpdGUzX3NucHJpbnRmKHZmcy0+bXhQYXRobmFtZSwgYWJzb2x1dGVQYXRoLCAiJXMi
LCByZWxhdGl2ZVBhdGgpOwpAQCAtMTU2LDcgKzEwNjEsNyBAQCBpbnQgY2hyb21pdW1GdWxsUGF0
aG5hbWUoc3FsaXRlM192ZnMqIHZmCiAvLwogLy8gdmZzIC0gcG9pbnRlciB0byB0aGUgc3FsaXRl
M192ZnMgb2JqZWN0LgogLy8gZmlsZU5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJh
cnkgZmlsZS4KLXZvaWQqIGNocm9taXVtRGxPcGVuKHNxbGl0ZTNfdmZzKiwgY29uc3QgY2hhciop
CitzdGF0aWMgdm9pZCogY2hyb21pdW1EbE9wZW4oc3FsaXRlM192ZnMqLCBjb25zdCBjaGFyKikK
IHsKICAgICByZXR1cm4gMDsKIH0KQEAgLTE2NCw4ICsxMDY5LDYgQEAgdm9pZCogY2hyb21pdW1E
bE9wZW4oc3FsaXRlM192ZnMqLCBjb25zdAogI2RlZmluZSBjaHJvbWl1bURsT3BlbiAwCiAjZW5k
aWYgLy8gU1FMSVRFX09NSVRfTE9BRF9FWFRFTlNJT04KIAotfSAvLyBuYW1lc3BhY2UKLQogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiB2b2lkIFNRTGl0ZUZpbGVTeXN0ZW06OnJlZ2lzdGVyU1FMaXRl
VkZTKCkKQEAgLTE3MywxMSArMTA3NiwxMSBAQCB2b2lkIFNRTGl0ZUZpbGVTeXN0ZW06OnJlZ2lz
dGVyU1FMaXRlVkZTCiAgICAgc3FsaXRlM192ZnMqIHVuaXhfdmZzID0gc3FsaXRlM192ZnNfZmlu
ZCgidW5peCIpOwogICAgIHN0YXRpYyBzcWxpdGUzX3ZmcyBjaHJvbWl1bV92ZnMgPSB7CiAgICAg
ICAgIDEsCi0gICAgICAgIHVuaXhfdmZzLT5zek9zRmlsZSwKKyAgICAgICAgc2l6ZW9mKENocm9t
aXVtRmlsZSksCiAgICAgICAgIHVuaXhfdmZzLT5teFBhdGhuYW1lLAogICAgICAgICAwLAogICAg
ICAgICAiY2hyb21pdW1fdmZzIiwKLSAgICAgICAgdW5peF92ZnMtPnBBcHBEYXRhLAorICAgICAg
ICAwLAogICAgICAgICBjaHJvbWl1bU9wZW4sCiAgICAgICAgIGNocm9taXVtRGVsZXRlLAogICAg
ICAgICBjaHJvbWl1bUFjY2VzcywK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68080</attachid>
            <date>2010-09-20 07:31:18 -0700</date>
            <delta_ts>2010-09-22 06:57:59 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>41766</size>
            <attacher name="Paweł Hajdan, Jr.">phajdan.jr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Nzg0NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTYgQEAKKzIwMTAtMDktMjAgIFBhd2VsIEhhamRhbiAgPHBoYWpkYW4uanJAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIE1vdmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNocm9taXVtX3ZmcyB0byB3ZWJraXQgZm9y
IFBPU0lYLgorICAgICAgICBUaGlzIGFsbG93cyB1cyB0byBsaW5rIENocm9tZSB3aXRoIHN5c3Rl
bS1wcm92aWRlZCBTUUxpdGUgb24gTGludXguCisgICAgICAgIFNlZSBhbHNvIGh0dHA6Ly9jb2Rl
Lmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyMjA4LgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDU0MTYKKworICAgICAgICBO
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwvY2hyb21pdW0vU1FMaXRlRmls
ZVN5c3RlbUNocm9taXVtUG9zaXguY3BwOgorICAgICAgICAoc3FsaXRlRXJyb3JGcm9tUG9zaXhF
cnJvcik6CisgICAgICAgIChyZWxlYXNlTG9ja0luZm8pOgorICAgICAgICAocmVsZWFzZU9wZW5J
bmZvKToKKyAgICAgICAgKGZpbmRMb2NrSW5mbyk6CisgICAgICAgIChjaHJvbWl1bUNoZWNrUmVz
ZXJ2ZWRMb2NrKToKKyAgICAgICAgKHJhbmdlTG9jayk6CisgICAgICAgIChjaHJvbWl1bUxvY2sp
OgorICAgICAgICAoY2xvc2VQZW5kaW5nRmRzKToKKyAgICAgICAgKGNocm9taXVtVW5sb2NrKToK
KyAgICAgICAgKGNocm9taXVtQ2xvc2VOb0xvY2spOgorICAgICAgICAoY2hyb21pdW1DbG9zZSk6
CisgICAgICAgIChjaHJvbWl1bUNoZWNrUmVzZXJ2ZWRMb2NrTm9vcCk6CisgICAgICAgIChjaHJv
bWl1bUxvY2tOb29wKToKKyAgICAgICAgKGNocm9taXVtVW5sb2NrTm9vcCk6CisgICAgICAgIChz
ZWVrQW5kUmVhZCk6CisgICAgICAgIChjaHJvbWl1bVJlYWQpOgorICAgICAgICAoc2Vla0FuZFdy
aXRlKToKKyAgICAgICAgKGNocm9taXVtV3JpdGUpOgorICAgICAgICAoc3luY1dyYXBwZXIpOgor
ICAgICAgICAoY2hyb21pdW1TeW5jKToKKyAgICAgICAgKGNocm9taXVtVHJ1bmNhdGUpOgorICAg
ICAgICAoY2hyb21pdW1GaWxlU2l6ZSk6CisgICAgICAgIChjaHJvbWl1bUZpbGVDb250cm9sKToK
KyAgICAgICAgKGNocm9taXVtU2VjdG9yU2l6ZSk6CisgICAgICAgIChjaHJvbWl1bURldmljZUNo
YXJhY3RlcmlzdGljcyk6CisgICAgICAgIChmaWxsSW5DaHJvbWl1bUZpbGUpOgorICAgICAgICAo
ZmluZFJldXNhYmxlRmQpOgorICAgICAgICAoY2hyb21pdW1PcGVuKToKKyAgICAgICAgKGNocm9t
aXVtRGVsZXRlKToKKyAgICAgICAgKGNocm9taXVtQWNjZXNzKToKKyAgICAgICAgKGNocm9taXVt
RnVsbFBhdGhuYW1lKToKKyAgICAgICAgKGNocm9taXVtRGxPcGVuKToKKyAgICAgICAgKGNocm9t
aXVtRGxFcnJvcik6CisgICAgICAgIChjaHJvbWl1bURsU3ltKToKKyAgICAgICAgKGNocm9taXVt
RGxDbG9zZSk6CisgICAgICAgIChjaHJvbWl1bVJhbmRvbW5lc3MpOgorICAgICAgICAoY2hyb21p
dW1TbGVlcCk6CisgICAgICAgIChjaHJvbWl1bUN1cnJlbnRUaW1lKToKKyAgICAgICAgKGNocm9t
aXVtR2V0TGFzdEVycm9yKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZUZpbGVTeXN0ZW06OnJl
Z2lzdGVyU1FMaXRlVkZTKToKKwogMjAxMC0wOS0yMCAgUGF2ZWwgUG9kaXZpbG92ICA8cG9kaXZp
bG92QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBQYXZlbCBGZWxkbWFuLgpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvY2hyb21pdW0vU1FMaXRlRmlsZVN5c3RlbUNocm9t
aXVtUG9zaXguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL2Nocm9taXVt
L1NRTGl0ZUZpbGVTeXN0ZW1DaHJvbWl1bVBvc2l4LmNwcAkocmV2aXNpb24gNjc4NDQpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3NxbC9jaHJvbWl1bS9TUUxpdGVGaWxlU3lzdGVtQ2hyb21pdW1Qb3Np
eC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDIzICszNCw5MzQgQEAKICNpbmNsdWRlICJDaHJv
bWl1bUJyaWRnZS5oIgogI2luY2x1ZGUgPHNxbGl0ZTMuaD4KIAorI2luY2x1ZGUgPGVycm5vLmg+
CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMv
c3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAj
aW5jbHVkZSA8dW5pc3RkLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCi0vLyBEZWZp
bmVkIGluIENocm9taXVtJ3MgY29kZWJhc2UgaW4gdGhpcmRfcGFydHkvc3FsaXRlL3NyYy9vc191
bml4LmMKLWV4dGVybiAiQyIgewotdm9pZCBjaHJvbWl1bV9zcWxpdGUzX2luaXRpYWxpemVfdW5p
eF9zcWxpdGUzX2ZpbGUoc3FsaXRlM19maWxlKiBmaWxlKTsKLWludCBjaHJvbWl1bV9zcWxpdGUz
X2ZpbGxfaW5fdW5peF9zcWxpdGUzX2ZpbGUoc3FsaXRlM192ZnMqIHZmcywgaW50IGZkLCBpbnQg
ZGlyZmQsIHNxbGl0ZTNfZmlsZSogZmlsZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBub0xv
Y2spOwotaW50IGNocm9taXVtX3NxbGl0ZTNfZ2V0X3JldXNhYmxlX2ZpbGVfaGFuZGxlKHNxbGl0
ZTNfZmlsZSogZmlsZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBmbGFncywgaW50KiBmZCk7
Ci12b2lkIGNocm9taXVtX3NxbGl0ZTNfdXBkYXRlX3JldXNhYmxlX2ZpbGVfaGFuZGxlKHNxbGl0
ZTNfZmlsZSogZmlsZSwgaW50IGZkLCBpbnQgZmxhZ3MpOwotdm9pZCBjaHJvbWl1bV9zcWxpdGUz
X2Rlc3Ryb3lfcmV1c2FibGVfZmlsZV9oYW5kbGUoc3FsaXRlM19maWxlKiBmaWxlKTsKKy8vIENo
cm9taXVtJ3MgUG9zaXggaW1wbGVtZW50YXRpb24gb2YgU1FMaXRlIFZGUy4KKy8vIFRoaXMgaXMg
aGVhdmlseSBiYXNlZCBvbiBTUUxpdGUncyBvc191bml4LmMsCisvLyB3aXRob3V0IHBhcnRzIHdl
IGRvbid0IG5lZWQuCisKKy8vIElkZW50aWZpZXMgYSBmaWxlIGJ5IGl0cyBkZXZpY2UgbnVtYmVy
IGFuZCBpbm9kZS4KK3N0cnVjdCBDaHJvbWl1bUZpbGVJZCB7CisgICAgZGV2X3QgZGV2OyAvLyBE
ZXZpY2UgbnVtYmVyLgorICAgIGlub190IGlubzsgLy8gSW5vZGUgbnVtYmVyLgorfTsKKworLy8g
SW5mb3JtYXRpb24gYWJvdXQgZmlsZSBsb2NrcyAob25lIHBlciBvcGVuIGlub2RlKS4gTm90ZSB0
aGF0IG1hbnkgb3BlbgorLy8gZmlsZSBkZXNjcmlwdG9ycyBtYXkgcmVmZXIgdG8gdGhlIHNhbWUg
aW5vZGUuCitzdHJ1Y3QgQ2hyb21pdW1Mb2NrSW5mbyB7CisgICAgQ2hyb21pdW1GaWxlSWQgbG9j
a0tleTsgLy8gRmlsZSBpZGVudGlmaWVyLgorICAgIGludCBjbnQ7IC8vIE51bWJlciBvZiBzaGFy
ZWQgbG9ja3MgaGVsZC4KKyAgICBpbnQgbG9ja3R5cGU7IC8vIFR5cGUgb2YgdGhlIGxvY2suCisg
ICAgaW50IG5SZWY7IC8vIFJlZmVyZW5jZSBjb3VudC4KKworICAgIC8vIERvdWJsZS1saW5rZWQg
bGlzdCBwb2ludGVycy4KKyAgICBDaHJvbWl1bUxvY2tJbmZvKiBwTmV4dDsgCisgICAgQ2hyb21p
dW1Mb2NrSW5mbyogcFByZXY7Cit9OworCisvLyBJbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgZGVz
Y3JpcHRvciB0aGF0IGNhbm5vdCBiZSBjbG9zZWQgaW1tZWRpYXRlbHkuCitzdHJ1Y3QgQ2hyb21p
dW1VbnVzZWRGZCB7CisgICAgaW50IGZkOyAvLyBGaWxlIGRlc2NyaXB0b3IuCisgICAgaW50IGZs
YWdzOyAvLyBGbGFncyB0aGlzIGZpbGUgZGVzY3JpcHRvciB3YXMgb3BlbmVkIHdpdGguCisgICAg
Q2hyb21pdW1VbnVzZWRGZCogcE5leHQ7IC8vIE5leHQgdW51c2VkIGZpbGUgZGVzY3JpcHRvciBv
biB0aGUgc2FtZSBmaWxlLgorfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gb3BlbiBpbm9k
ZS4gV2hlbiB3ZSB3YW50IHRvIGNsb3NlIGFuIGlub2RlCisvLyB0aGF0IHN0aWxsIGhhcyBsb2Nr
cywgd2UgZGVmZXIgdGhlIGNsb3NlIHVudGlsIGFsbCBsb2NrcyBhcmUgY2xlYXJlZC4KK3N0cnVj
dCBDaHJvbWl1bU9wZW5JbmZvIHsKKyAgICBDaHJvbWl1bUZpbGVJZCBmaWxlSWQ7IC8vIFRoZSBs
b29rdXAga2V5LgorICAgIGludCBuUmVmOyAvLyBSZWZlcmVuY2UgY291bnQuCisgICAgaW50IG5M
b2NrOyAvLyBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgbG9ja3MuCisgICAgQ2hyb21pdW1VbnVzZWRG
ZCogcFVudXNlZDsgLy8gTGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzIHRvIGNsb3NlLgorCisgICAg
Ly8gRG91YmxlLWxpbmtlZCBsaXN0IHBvaW50ZXJzLgorICAgIENocm9taXVtT3BlbkluZm8qIHBO
ZXh0OworICAgIENocm9taXVtT3BlbkluZm8qIHBQcmV2OworfTsKKworLy8gS2VlcCB0cmFjayBv
ZiBsb2NrcyBhbmQgaW5vZGVzIGluIGRvdWJsZS1saW5rZWQgbGlzdHMuCitzdGF0aWMgc3RydWN0
IENocm9taXVtTG9ja0luZm8qIGxvY2tMaXN0ID0gMDsKK3N0YXRpYyBzdHJ1Y3QgQ2hyb21pdW1P
cGVuSW5mbyogb3Blbkxpc3QgPSAwOworCisvLyBFeHRlbnNpb24gb2Ygc3FsaXRlM19maWxlIHNw
ZWNpZmljIHRvIHRoZSBjaHJvbWl1bSBWRlMuCitzdHJ1Y3QgQ2hyb21pdW1GaWxlIHsKKyAgICBz
cWxpdGUzX2lvX21ldGhvZHMgY29uc3QqIHBNZXRob2Q7IC8vIEltcGxlbWVudGF0aW9uIG9mIHNx
bGl0ZTNfZmlsZS4KKyAgICBDaHJvbWl1bU9wZW5JbmZvKiBwT3BlbjsgLy8gSW5mb3JtYXRpb24g
YWJvdXQgYWxsIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBmaWxlLgorICAgIENocm9t
aXVtTG9ja0luZm8qIHBMb2NrOyAvLyBJbmZvcm1hdGlvbiBhYm91dCBhbGwgbG9ja3MgZm9yIHRo
aXMgZmlsZS4KKyAgICBpbnQgaDsgLy8gRmlsZSBkZXNjcmlwdG9yLgorICAgIGludCBkaXJmZDsg
Ly8gRmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSBkaXJlY3RvcnkuCisgICAgdW5zaWduZWQg
Y2hhciBsb2NrdHlwZTsgLy8gVHlwZSBvZiB0aGUgbG9jayB1c2VkIGZvciB0aGlzIGZpbGUuCisg
ICAgaW50IGxhc3RFcnJubzsgLy8gVmFsdWUgb2YgZXJybm8gZm9yIGxhc3Qgb3BlcmF0aW9uIG9u
IHRoaXMgZmlsZS4KKyAgICBDaHJvbWl1bVVudXNlZEZkKiBwVW51c2VkOyAvLyBJbmZvcm1hdGlv
biBhYm91dCB1bnVzZWQgZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBmaWxlLgorfTsKKworLy8g
VGhlIGZvbGxvd2luZyBjb25zdGFudHMgc3BlY2lmeSB0aGUgcmFuZ2Ugb2YgYnl0ZXMgdXNlZCBm
b3IgbG9ja2luZy4KKy8vIFNRTGl0ZVNoYXJlZFNpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBh
dmFpbGFibGUgaW4gdGhlIHBvb2wgZnJvbSB3aGljaAorLy8gYSByYW5kb20gYnl0ZSBpcyBzZWxl
Y3RlZCBmb3IgYSBzaGFyZWQgbG9jay4gIFRoZSBwb29sIG9mIGJ5dGVzIGZvcgorLy8gc2hhcmVk
IGxvY2tzIGJlZ2lucyBhdCBTUUxpdGVTaGFyZWRGaXJzdEJ5dGUuIAorLy8gVGhlIHZhbHVlcyBh
cmUgdGhlIHNhbWUgYXMgdXNlZCBieSBTUUxpdGUgZm9yIGNvbXBhdGliaWxpdHkuCitzdGF0aWMg
Y29uc3Qgb2ZmX3QgU1FMaXRlUGVuZGluZ0J5dGUgPSAweDQwMDAwMDAwOworc3RhdGljIGNvbnN0
IG9mZl90IFNRTGl0ZVJlc2VydmVkQnl0ZSA9IFNRTGl0ZVBlbmRpbmdCeXRlICsgMTsKK3N0YXRp
YyBjb25zdCBvZmZfdCBTUUxpdGVTaGFyZWRGaXJzdEJ5dGUgPSBTUUxpdGVQZW5kaW5nQnl0ZSAr
IDI7CitzdGF0aWMgY29uc3Qgb2ZmX3QgU1FMaXRlU2hhcmVkU2l6ZSA9IDUxMDsKKworLy8gTWFw
cyBhIFBPU0lYIGVycm9yIGNvZGUgdG8gYW4gU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50
IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IoaW50IHBvc2l4RXJyb3IsIGludCBzcWxpdGVJT0Vy
cikKK3sKKyAgICBzd2l0Y2ggKHBvc2l4RXJyb3IpIHsKKyAgICBjYXNlIDA6IAorICAgICAgICBy
ZXR1cm4gU1FMSVRFX09LOworICAgIGNhc2UgRUFHQUlOOgorICAgIGNhc2UgRVRJTUVET1VUOgor
ICAgIGNhc2UgRUJVU1k6CisgICAgY2FzZSBFSU5UUjoKKyAgICBjYXNlIEVOT0xDSzogIAorICAg
ICAgICByZXR1cm4gU1FMSVRFX0JVU1k7CisgICAgY2FzZSBFQUNDRVM6IAorICAgICAgICAvLyBF
QUNDRVMgaXMgbGlrZSBFQUdBSU4gZHVyaW5nIGxvY2tpbmcgb3BlcmF0aW9ucy4KKyAgICAgICAg
aWYgKChzcWxpdGVJT0VyciA9PSBTUUxJVEVfSU9FUlJfTE9DSykgfHwKKyAgICAgICAgICAgIChz
cWxpdGVJT0VyciA9PSBTUUxJVEVfSU9FUlJfVU5MT0NLKSB8fAorICAgICAgICAgICAgKHNxbGl0
ZUlPRXJyID09IFNRTElURV9JT0VSUl9SRExPQ0spIHx8CisgICAgICAgICAgICAoc3FsaXRlSU9F
cnIgPT0gU1FMSVRFX0lPRVJSX0NIRUNLUkVTRVJWRURMT0NLKSkKKyAgICAgICAgICAgIHJldHVy
biBTUUxJVEVfQlVTWTsKKyAgICAgICAgcmV0dXJuIFNRTElURV9QRVJNOworICAgIGNhc2UgRVBF
Uk06IAorICAgICAgICByZXR1cm4gU1FMSVRFX1BFUk07CisgICAgY2FzZSBFREVBRExLOgorICAg
ICAgICByZXR1cm4gU1FMSVRFX0lPRVJSX0JMT0NLRUQ7CisgICAgZGVmYXVsdDogCisgICAgICAg
IHJldHVybiBzcWxpdGVJT0VycjsKKyAgICB9Cit9CisKKy8vIFJlbGVhc2VzIGEgQ2hyb21pdW1M
b2NrSW5mbyBzdHJ1Y3R1cmUgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZmluZExvY2tJbmZvKCku
CitzdGF0aWMgdm9pZCByZWxlYXNlTG9ja0luZm8oQ2hyb21pdW1Mb2NrSW5mbyogcExvY2spCit7
CisgICAgaWYgKCFwTG9jaykKKyAgICAgICAgcmV0dXJuOworCisgICAgcExvY2stPm5SZWYtLTsK
KyAgICBpZiAocExvY2stPm5SZWYgPiAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocExv
Y2stPnBQcmV2KSB7CisgICAgICAgIEFTU0VSVChwTG9jay0+cFByZXYtPnBOZXh0ID09IHBMb2Nr
KTsKKyAgICAgICAgcExvY2stPnBQcmV2LT5wTmV4dCA9IHBMb2NrLT5wTmV4dDsKKyAgICB9IGVs
c2UgeworICAgICAgICBBU1NFUlQobG9ja0xpc3QgPT0gcExvY2spOworICAgICAgICBsb2NrTGlz
dCA9IHBMb2NrLT5wTmV4dDsKKyAgICB9CisgICAgaWYgKHBMb2NrLT5wTmV4dCkgeworICAgICAg
ICBBU1NFUlQocExvY2stPnBOZXh0LT5wUHJldiA9PSBwTG9jayk7CisgICAgICAgIHBMb2NrLT5w
TmV4dC0+cFByZXYgPSBwTG9jay0+cFByZXY7CisgICAgfQorCisgICAgc3FsaXRlM19mcmVlKHBM
b2NrKTsKK30KKworLy8gUmVsZWFzZXMgYSBDaHJvbWl1bU9wZW5JbmZvIHN0cnVjdHVyZSBwcmV2
aW91c2x5IGFsbG9jYXRlZCBieSBmaW5kTG9ja0luZm8oKS4KK3N0YXRpYyB2b2lkIHJlbGVhc2VP
cGVuSW5mbyhDaHJvbWl1bU9wZW5JbmZvKiBwT3BlbikKK3sKKyAgICBpZiAoIXBPcGVuKQorICAg
ICAgICByZXR1cm47CisKKyAgICBwT3Blbi0+blJlZi0tOworICAgIGlmIChwT3Blbi0+blJlZiA+
IDApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwT3Blbi0+cFByZXYpIHsKKyAgICAgICAg
QVNTRVJUKHBPcGVuLT5wUHJldi0+cE5leHQgPT0gcE9wZW4pOworICAgICAgICBwT3Blbi0+cFBy
ZXYtPnBOZXh0ID0gcE9wZW4tPnBOZXh0OworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChv
cGVuTGlzdCA9PSBwT3Blbik7CisgICAgICAgIG9wZW5MaXN0ID0gcE9wZW4tPnBOZXh0OworICAg
IH0KKyAgICBpZiAocE9wZW4tPnBOZXh0KSB7CisgICAgICAgIEFTU0VSVChwT3Blbi0+cE5leHQt
PnBQcmV2ID09IHBPcGVuKTsKKyAgICAgICAgcE9wZW4tPnBOZXh0LT5wUHJldiA9IHBPcGVuLT5w
UHJldjsKKyAgICB9CisKKyAgICBBU1NFUlQoIXBPcGVuLT5wVW51c2VkKTsgLy8gTWFrZSBzdXJl
IHdlJ3JlIG5vdCBsZWFraW5nIG1lbW9yeSBhbmQgZmlsZSBkZXNjcmlwdG9ycy4KKworICAgIHNx
bGl0ZTNfZnJlZShwT3Blbik7Cit9CisKKy8vIExvY2F0ZXMgQ2hyb21pdW1Mb2NrSW5mbyBhbmQg
Q2hyb21pdW1PcGVuSW5mbyBmb3IgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIChjcmVhdGluZyBuZXcg
b25lcyBpZiBuZWVkZWQpLgorLy8gUmV0dXJucyBhIFNRTGl0ZSBlcnJvciBjb2RlLgorc3RhdGlj
IGludCBmaW5kTG9ja0luZm8oQ2hyb21pdW1GaWxlKiBwRmlsZSwgQ2hyb21pdW1Mb2NrSW5mbyoq
IHBwTG9jaywgQ2hyb21pdW1PcGVuSW5mbyoqIHBwT3BlbikKK3sKKyAgICBpbnQgZmQgPSBwRmls
ZS0+aDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGludCByYyA9IGZzdGF0KGZkLCAm
c3RhdGJ1Zik7CisgICAgaWYgKHJjKSB7CisgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJu
bzsKKyNpZmRlZiBFT1ZFUkZMT1cKKyAgICAgICAgaWYgKHBGaWxlLT5sYXN0RXJybm8gPT0gRU9W
RVJGTE9XKQorICAgICAgICAgICAgcmV0dXJuIFNRTElURV9OT0xGUzsKKyNlbmRpZgorICAgICAg
ICByZXR1cm4gU1FMSVRFX0lPRVJSOworICAgIH0KKworI2lmIFBMQVRGT1JNKE1BQykKKyAgICAv
LyBPbiBPUyBYIG9uIGFuIG1zZG9zL2ZhdCBmaWxlc3lzdGVtcywgdGhlIGlub2RlIG51bWJlciBp
cyByZXBvcnRlZAorICAgIC8vIGluY29ycmVjdGx5IGZvciB6ZXJvLXNpemUgZmlsZXMuIFNlZSBo
dHRwOi8vd3d3LnNxbGl0ZS5vcmcvY3ZzdHJhYy90a3R2aWV3P3RuPTMyNjAuCisgICAgLy8gVG8g
d29yayBhcm91bmQgdGhpcyBwcm9ibGVtIHdlIGFsd2F5cyBpbmNyZWFzZSB0aGUgZmlsZSBzaXpl
IHRvIDEgYnkgd3JpdGluZyBhIHNpbmdsZSBieXRlCisgICAgLy8gcHJpb3IgdG8gYWNjZXNzaW5n
IHRoZSBpbm9kZSBudW1iZXIuIFRoZSBvbmUgYnl0ZSB3cml0dGVuIGlzIGFuIEFTQ0lJICdTJyBj
aGFyYWN0ZXIgd2hpY2gKKyAgICAvLyBhbHNvIGhhcHBlbnMgdG8gYmUgdGhlIGZpcnN0IGJ5dGUg
aW4gdGhlIGhlYWRlciBvZiBldmVyeSBTUUxpdGUgZGF0YWJhc2UuICBJbiB0aGlzIHdheSwKKyAg
ICAvLyBpZiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHN1Y2ggdGhhdCBhbm90aGVyIHRocmVh
ZCBoYXMgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGZpcnN0IHBhZ2UKKyAgICAvLyBvZiB0aGUgZGF0
YWJhc2UsIG5vIGRhbWFnZSBpcyBkb25lLgorICAgIGlmICghc3RhdGJ1Zi5zdF9zaXplKSB7Cisg
ICAgICAgIHJjID0gd3JpdGUoZmQsICJTIiwgMSk7CisgICAgICAgIGlmIChyYyAhPSAxKQorICAg
ICAgICAgICAgcmV0dXJuIFNRTElURV9JT0VSUjsKKyAgICAgICAgcmMgPSBmc3RhdChmZCwgJnN0
YXRidWYpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8g
PSBlcnJubzsKKyAgICAgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlI7CisgICAgICAgIH0KKyAg
ICB9CisjZW5kaWYKKworICAgIENocm9taXVtRmlsZUlkIGZpbGVJZDsKKyAgICBtZW1zZXQoJmZp
bGVJZCwgMCwgc2l6ZW9mKGZpbGVJZCkpOworICAgIGZpbGVJZC5kZXYgPSBzdGF0YnVmLnN0X2Rl
djsKKyAgICBmaWxlSWQuaW5vID0gc3RhdGJ1Zi5zdF9pbm87CisKKyAgICBDaHJvbWl1bUxvY2tJ
bmZvKiBwTG9jayA9IDA7CisKKyAgICBpZiAocHBMb2NrKSB7CisgICAgICAgIHBMb2NrID0gbG9j
a0xpc3Q7CisgICAgICAgIHdoaWxlIChwTG9jayAmJiBtZW1jbXAoJmZpbGVJZCwgJnBMb2NrLT5s
b2NrS2V5LCBzaXplb2YoZmlsZUlkKSkpCisgICAgICAgICAgICBwTG9jayA9IHBMb2NrLT5wTmV4
dDsKKyAgICAgICAgaWYgKHBMb2NrKQorICAgICAgICAgICAgcExvY2stPm5SZWYrKzsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICBwTG9jayA9IHN0YXRpY19jYXN0PENocm9taXVtTG9ja0lu
Zm8qPihzcWxpdGUzX21hbGxvYyhzaXplb2YoKnBMb2NrKSkpOworICAgICAgICAgICAgaWYgKCFw
TG9jaykKKyAgICAgICAgICAgICAgICByZXR1cm4gU1FMSVRFX05PTUVNOworICAgICAgICAgICAg
cExvY2stPmxvY2tLZXkgPSBmaWxlSWQ7CisgICAgICAgICAgICBwTG9jay0+blJlZiA9IDE7Cisg
ICAgICAgICAgICBwTG9jay0+Y250ID0gMDsKKyAgICAgICAgICAgIHBMb2NrLT5sb2NrdHlwZSA9
IDA7CisgICAgICAgICAgICBwTG9jay0+cE5leHQgPSBsb2NrTGlzdDsKKyAgICAgICAgICAgIHBM
b2NrLT5wUHJldiA9IDA7CisgICAgICAgICAgICBpZiAobG9ja0xpc3QpCisgICAgICAgICAgICAg
ICAgbG9ja0xpc3QtPnBQcmV2ID0gcExvY2s7CisgICAgICAgICAgICBsb2NrTGlzdCA9IHBMb2Nr
OworICAgICAgICB9CisgICAgICAgICpwcExvY2sgPSBwTG9jazsKKyAgICB9CisKKyAgICBpZiAo
cHBPcGVuKSB7CisgICAgICAgIENocm9taXVtT3BlbkluZm8qIHBPcGVuID0gb3Blbkxpc3Q7Cisg
ICAgICAgIHdoaWxlIChwT3BlbiAmJiBtZW1jbXAoJmZpbGVJZCwgJnBPcGVuLT5maWxlSWQsIHNp
emVvZihmaWxlSWQpKSkKKyAgICAgICAgICAgIHBPcGVuID0gcE9wZW4tPnBOZXh0OworICAgICAg
ICBpZiAocE9wZW4pCisgICAgICAgICAgICBwT3Blbi0+blJlZisrOworICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgIHBPcGVuID0gc3RhdGljX2Nhc3Q8Q2hyb21pdW1PcGVuSW5mbyo+KHNxbGl0
ZTNfbWFsbG9jKHNpemVvZigqcE9wZW4pKSk7CisgICAgICAgICAgICBpZiAoIXBPcGVuKSB7Cisg
ICAgICAgICAgICAgICAgcmVsZWFzZUxvY2tJbmZvKHBMb2NrKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gU1FMSVRFX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KHBP
cGVuLCAwLCBzaXplb2YoKnBPcGVuKSk7CisgICAgICAgICAgICBwT3Blbi0+ZmlsZUlkID0gZmls
ZUlkOworICAgICAgICAgICAgcE9wZW4tPm5SZWYgPSAxOworICAgICAgICAgICAgcE9wZW4tPnBO
ZXh0ID0gb3Blbkxpc3Q7CisgICAgICAgICAgICBpZiAob3Blbkxpc3QpCisgICAgICAgICAgICAg
ICAgb3Blbkxpc3QtPnBQcmV2ID0gcE9wZW47CisgICAgICAgICAgICBvcGVuTGlzdCA9IHBPcGVu
OworICAgICAgICB9CisgICAgICAgICpwcE9wZW4gPSBwT3BlbjsKKyAgICB9CisKKyAgICByZXR1
cm4gcmM7Cit9CisKKy8vIENoZWNrcyBpZiB0aGVyZSBpcyBhIFJFU0VSVkVEIGxvY2sgaGVsZCBv
biB0aGUgc3BlY2lmaWVkIGZpbGUgYnkgdGhpcyBvciBhbnkgb3RoZXIgcHJvY2Vzcy4KKy8vIElm
IHRoZSBsb2NrIGlzIGhlbGQsIHNldHMgcFJlc091dCB0byBhIG5vbi16ZXJvIHZhbHVlLiBSZXR1
cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGNocm9taXVtQ2hlY2tSZXNlcnZl
ZExvY2soc3FsaXRlM19maWxlKiBpZCwgaW50KiBwUmVzT3V0KQoreworICAgIENocm9taXVtRmls
ZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAgICBBU1NF
UlQocEZpbGUpOworCisgICAgLy8gTG9vayBmb3IgbG9ja3MgaGVsZCBieSB0aGlzIHByb2Nlc3Mu
CisgICAgaW50IHJlc2VydmVkID0gMDsKKyAgICBpZiAocEZpbGUtPnBMb2NrLT5sb2NrdHlwZSA+
IFNRTElURV9MT0NLX1NIQVJFRCkKKyAgICAgICAgcmVzZXJ2ZWQgPSAxOworCisgICAgLy8gTG9v
ayBmb3IgbG9ja3MgaGVsZCBieSBvdGhlciBwcm9jZXNzZXMuCisgICAgaW50IHJjID0gU1FMSVRF
X09LOworICAgIGlmICghcmVzZXJ2ZWQpIHsKKyAgICAgICAgc3RydWN0IGZsb2NrIGxvY2s7Cisg
ICAgICAgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKyAgICAgICAgbG9jay5sX3N0YXJ0ID0g
U1FMaXRlUmVzZXJ2ZWRCeXRlOworICAgICAgICBsb2NrLmxfbGVuID0gMTsKKyAgICAgICAgbG9j
ay5sX3R5cGUgPSBGX1dSTENLOworICAgICAgICBpZiAoLTEgPT0gZmNudGwocEZpbGUtPmgsIEZf
R0VUTEssICZsb2NrKSkgeworICAgICAgICAgICAgaW50IHRFcnJubyA9IGVycm5vOworICAgICAg
ICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRFcnJubywgU1FMSVRFX0lPRVJS
X0NIRUNLUkVTRVJWRURMT0NLKTsKKyAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSB0RXJy
bm87CisgICAgICAgIH0gZWxzZSBpZiAobG9jay5sX3R5cGUgIT0gRl9VTkxDSykKKyAgICAgICAg
ICAgIHJlc2VydmVkID0gMTsKKyAgICB9CisKKyAgICAqcFJlc091dCA9IHJlc2VydmVkOworICAg
IHJldHVybiByYzsKK30KKworLy8gUGVyZm9ybXMgYSBmaWxlIGxvY2tpbmcgb3BlcmF0aW9uIG9u
IGEgcmFuZ2Ugb2YgYnl0ZXMgaW4gYSBmaWxlLgorLy8gVGhlIHxvcHwgcGFyYW1ldGVyIHNob3Vs
ZCBiZSBvbmUgb2YgRl9SRkxDSywgRl9XUkxDSyBvciBGX1VOTENLLgorLy8gUmV0dXJucyBhIFVu
aXggZXJyb3IgY29kZSwgYW5kIGFsc28gd3JpdGVzIGl0IHRvIHBFcnJjb2RlLgorc3RhdGljIGlu
dCByYW5nZUxvY2soQ2hyb21pdW1GaWxlKiBwRmlsZSwgaW50IG9wLCBpbnQqIHBFcnJjb2RlKQor
eworICAgIHN0cnVjdCBmbG9jayBsb2NrOworICAgIGxvY2subF90eXBlID0gb3A7CisgICAgbG9j
ay5sX3N0YXJ0ID0gU1FMaXRlU2hhcmVkRmlyc3RCeXRlOworICAgIGxvY2subF93aGVuY2UgPSBT
RUVLX1NFVDsKKyAgICBsb2NrLmxfbGVuID0gU1FMaXRlU2hhcmVkU2l6ZTsKKyAgICBpbnQgcmMg
PSBmY250bChwRmlsZS0+aCwgRl9TRVRMSywgJmxvY2spOworICAgICpwRXJyY29kZSA9IGVycm5v
OworICAgIHJldHVybiByYzsKK30KKworLy8gTG9ja3MgdGhlIGZpbGUgd2l0aCB0aGUgbG9jayBz
cGVjaWZpZWQgYnkgcGFyYW1ldGVyIGxvY2t0eXBlIC0gb25lCisvLyBvZiB0aGUgZm9sbG93aW5n
OgorLy8KKy8vICAgICAoMSkgU1FMSVRFX0xPQ0tfU0hBUkVECisvLyAgICAgKDIpIFNRTElURV9M
T0NLX1JFU0VSVkVECisvLyAgICAgKDMpIFNRTElURV9MT0NLX1BFTkRJTkcKKy8vICAgICAoNCkg
U1FMSVRFX0xPQ0tfRVhDTFVTSVZFCisvLworLy8gU29tZXRpbWVzIHdoZW4gcmVxdWVzdGluZyBv
bmUgbG9jayBzdGF0ZSwgYWRkaXRpb25hbCBsb2NrIHN0YXRlcworLy8gYXJlIGluc2VydGVkIGlu
IGJldHdlZW4uICBUaGUgbG9ja2luZyBtaWdodCBmYWlsIG9uIG9uZSBvZiB0aGUgbGF0ZXIKKy8v
IHRyYW5zaXRpb25zIGxlYXZpbmcgdGhlIGxvY2sgc3RhdGUgZGlmZmVyZW50IGZyb20gd2hhdCBp
dCBzdGFydGVkIGJ1dAorLy8gc3RpbGwgc2hvcnQgb2YgaXRzIGdvYWwuICBUaGUgZm9sbG93aW5n
IGNoYXJ0IHNob3dzIHRoZSBhbGxvd2VkCisvLyB0cmFuc2l0aW9ucyBhbmQgdGhlIGluc2VydGVk
IGludGVybWVkaWF0ZSBzdGF0ZXM6CisvLworLy8gICAgVU5MT0NLRUQgLT4gU0hBUkVECisvLyAg
ICBTSEFSRUQgLT4gUkVTRVJWRUQKKy8vICAgIFNIQVJFRCAtPiAoUEVORElORykgLT4gRVhDTFVT
SVZFCisvLyAgICBSRVNFUlZFRCAtPiAoUEVORElORykgLT4gRVhDTFVTSVZFCisvLyAgICBQRU5E
SU5HIC0+IEVYQ0xVU0lWRQorc3RhdGljIGludCBjaHJvbWl1bUxvY2soc3FsaXRlM19maWxlKiBp
ZCwgaW50IGxvY2t0eXBlKQoreworICAgIC8vIFRvIG9idGFpbiBhIFNIQVJFRCBsb2NrLCBhIHJl
YWQtbG9jayBpcyBvYnRhaW5lZCBvbiB0aGUgJ3BlbmRpbmcKKyAgICAvLyBieXRlJy4gIElmIHRo
aXMgaXMgc3VjY2Vzc2Z1bCwgYSByYW5kb20gYnl0ZSBmcm9tIHRoZSAnc2hhcmVkIGJ5dGUKKyAg
ICAvLyByYW5nZScgaXMgcmVhZC1sb2NrZWQgYW5kIHRoZSBsb2NrIG9uIHRoZSAncGVuZGluZyBi
eXRlJyByZWxlYXNlZC4KKyAgICAvLworICAgIC8vIEEgcHJvY2VzcyBtYXkgb25seSBvYnRhaW4g
YSBSRVNFUlZFRCBsb2NrIGFmdGVyIGl0IGhhcyBhIFNIQVJFRCBsb2NrLgorICAgIC8vIEEgUkVT
RVJWRUQgbG9jayBpcyBpbXBsZW1lbnRlZCBieSBncmFiYmluZyBhIHdyaXRlLWxvY2sgb24gdGhl
CisgICAgLy8gJ3Jlc2VydmVkIGJ5dGUnLiAKKyAgICAvLworICAgIC8vIEEgcHJvY2VzcyBtYXkg
b25seSBvYnRhaW4gYSBQRU5ESU5HIGxvY2sgYWZ0ZXIgaXQgaGFzIG9idGFpbmVkIGEKKyAgICAv
LyBTSEFSRUQgbG9jay4gQSBQRU5ESU5HIGxvY2sgaXMgaW1wbGVtZW50ZWQgYnkgb2J0YWluaW5n
IGEgd3JpdGUtbG9jaworICAgIC8vIG9uIHRoZSAncGVuZGluZyBieXRlJy4gVGhpcyBlbnN1cmVz
IHRoYXQgbm8gbmV3IFNIQVJFRCBsb2NrcyBjYW4gYmUKKyAgICAvLyBvYnRhaW5lZCwgYnV0IGV4
aXN0aW5nIFNIQVJFRCBsb2NrcyBhcmUgYWxsb3dlZCB0byBwZXJzaXN0LiBBIHByb2Nlc3MKKyAg
ICAvLyBkb2VzIG5vdCBoYXZlIHRvIG9idGFpbiBhIFJFU0VSVkVEIGxvY2sgb24gdGhlIHdheSB0
byBhIFBFTkRJTkcgbG9jay4KKyAgICAvLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGFs
Z29yaXRobSBmb3Igcm9sbGluZyBiYWNrIGEgam91cm5hbCBmaWxlCisgICAgLy8gYWZ0ZXIgYSBj
cmFzaC4KKyAgICAvLworICAgIC8vIEFuIEVYQ0xVU0lWRSBsb2NrLCBvYnRhaW5lZCBhZnRlciBh
IFBFTkRJTkcgbG9jayBpcyBoZWxkLCBpcworICAgIC8vIGltcGxlbWVudGVkIGJ5IG9idGFpbmlu
ZyBhIHdyaXRlLWxvY2sgb24gdGhlIGVudGlyZSAnc2hhcmVkIGJ5dGUKKyAgICAvLyByYW5nZScu
IFNpbmNlIGFsbCBvdGhlciBsb2NrcyByZXF1aXJlIGEgcmVhZC1sb2NrIG9uIG9uZSBvZiB0aGUg
Ynl0ZXMKKyAgICAvLyB3aXRoaW4gdGhpcyByYW5nZSwgdGhpcyBlbnN1cmVzIHRoYXQgbm8gb3Ro
ZXIgbG9ja3MgYXJlIGhlbGQgb24gdGhlCisgICAgLy8gZGF0YWJhc2UuIAorCisgICAgaW50IHJj
ID0gU1FMSVRFX09LOworICAgIHN0cnVjdCBmbG9jayBsb2NrOworICAgIGludCBzID0gMDsKKyAg
ICBpbnQgdEVycm5vOworCisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nh
c3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7CisKKyAgICBDaHJvbWl1
bUxvY2tJbmZvKiBwTG9jayA9IHBGaWxlLT5wTG9jazsKKworICAgIC8vIElmIHRoZXJlIGlzIGFs
cmVhZHkgYSBsb2NrIG9mIHRoaXMgdHlwZSBvciBtb3JlIHJlc3RyaWN0aXZlLCBkbyBub3RoaW5n
LgorICAgIGlmIChwRmlsZS0+bG9ja3R5cGUgPj0gbG9ja3R5cGUpCisgICAgICAgIHJldHVybiBT
UUxJVEVfT0s7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgbmV2ZXIgbW92ZSBmcm9tIHVubG9ja2Vk
IHRvIGFueXRoaW5nIGhpZ2hlciB0aGFuIHNoYXJlZCBsb2NrLgorICAgIEFTU0VSVChwRmlsZS0+
bG9ja3R5cGUgIT0gU1FMSVRFX0xPQ0tfTk9ORSB8fCBsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19T
SEFSRUQpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIG5ldmVyIHJlcXVlc3QgYSBwZW5kaW5nIGxv
Y2suCisgICAgQVNTRVJUKGxvY2t0eXBlICE9IFNRTElURV9MT0NLX1BFTkRJTkcpOworCisgICAg
Ly8gTWFrZSBzdXJlIGEgc2hhcmVkIGxvY2sgaXMgYWx3YXlzIGhlbGQgd2hlbiBhIFJFU0VSVkVE
IGxvY2sgaXMgcmVxdWVzdGVkLgorICAgIEFTU0VSVChsb2NrdHlwZSAhPSBTUUxJVEVfTE9DS19S
RVNFUlZFRCB8fCBwRmlsZS0+bG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfU0hBUkVEKTsKKworICAg
IC8vIElmIHNvbWUgdGhyZWFkIHVzaW5nIHRoaXMgUElEIGhhcyBhIGxvY2sgdmlhIGEgZGlmZmVy
ZW50IENocm9taXVtRmlsZQorICAgIC8vIGhhbmRsZSB0aGF0IHByZWNsdWRlcyB0aGUgcmVxdWVz
dGVkIGxvY2ssIHJldHVybiBCVVNZLgorICAgIGlmIChwRmlsZS0+bG9ja3R5cGUgIT0gcExvY2st
PmxvY2t0eXBlICYmCisgICAgICAgIChwTG9jay0+bG9ja3R5cGUgPj0gU1FMSVRFX0xPQ0tfUEVO
RElORyB8fCBsb2NrdHlwZSA+IFNRTElURV9MT0NLX1NIQVJFRCkpCisgICAgICAgIHJldHVybiBT
UUxJVEVfQlVTWTsKKworICAgIC8vIElmIGEgU0hBUkVEIGxvY2sgaXMgcmVxdWVzdGVkLCBhbmQg
c29tZSB0aHJlYWQgdXNpbmcgdGhpcyBQSUQgYWxyZWFkeQorICAgIC8vIGhhcyBhIFNIQVJFRCBv
ciBSRVNFUlZFRCBsb2NrLCB0aGVuIGp1c3QgaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMuCisg
ICAgaWYgKGxvY2t0eXBlID09IFNRTElURV9MT0NLX1NIQVJFRCAmJgorICAgICAgICAocExvY2st
PmxvY2t0eXBlID09IFNRTElURV9MT0NLX1NIQVJFRCB8fCBwTG9jay0+bG9ja3R5cGUgPT0gU1FM
SVRFX0xPQ0tfUkVTRVJWRUQpKSB7CisgICAgICAgIEFTU0VSVCghcEZpbGUtPmxvY2t0eXBlKTsK
KyAgICAgICAgQVNTRVJUKHBMb2NrLT5jbnQgPiAwKTsKKyAgICAgICAgcEZpbGUtPmxvY2t0eXBl
ID0gU1FMSVRFX0xPQ0tfU0hBUkVEOworICAgICAgICBwTG9jay0+Y250Kys7CisgICAgICAgIHBG
aWxlLT5wT3Blbi0+bkxvY2srKzsKKyAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKKyAgICB9CisK
KyAgICAvLyBBIFBFTkRJTkcgbG9jayBpcyBuZWVkZWQgYmVmb3JlIGFjcXVpcmluZyBhIFNIQVJF
RCBsb2NrIGFuZCBiZWZvcmUKKyAgICAvLyBhY3F1aXJpbmcgYW4gRVhDTFVTSVZFIGxvY2suICBG
b3IgdGhlIFNIQVJFRCBsb2NrLCB0aGUgUEVORElORyB3aWxsCisgICAgLy8gYmUgcmVsZWFzZWQu
CisgICAgbG9jay5sX2xlbiA9IDE7CisgICAgbG9jay5sX3doZW5jZSA9IFNFRUtfU0VUOworICAg
IGlmIChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQgfHwKKyAgICAgICAgKGxvY2t0eXBl
ID09IFNRTElURV9MT0NLX0VYQ0xVU0lWRSAmJiBwRmlsZS0+bG9ja3R5cGUgPCBTUUxJVEVfTE9D
S19QRU5ESU5HKSkgeworICAgICAgICBsb2NrLmxfdHlwZSA9IChsb2NrdHlwZSA9PSBTUUxJVEVf
TE9DS19TSEFSRUQgPyBGX1JETENLIDogRl9XUkxDSyk7CisgICAgICAgIGxvY2subF9zdGFydCA9
IFNRTGl0ZVBlbmRpbmdCeXRlOworICAgICAgICBzID0gZmNudGwocEZpbGUtPmgsIEZfU0VUTEss
ICZsb2NrKTsKKyAgICAgICAgaWYgKHMgPT0gLTEpIHsKKyAgICAgICAgICAgIHRFcnJubyA9IGVy
cm5vOworICAgICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRFcnJubywg
U1FMSVRFX0lPRVJSX0xPQ0spOworICAgICAgICAgICAgaWYgKChyYyAhPSBTUUxJVEVfT0spICYm
IChyYyAhPSBTUUxJVEVfQlVTWSkpCisgICAgICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9
IHRFcnJubzsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmIChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQpIHsKKyAgICAgICAgQVNTRVJUKCFw
TG9jay0+Y250KTsKKyAgICAgICAgQVNTRVJUKCFwTG9jay0+bG9ja3R5cGUpOworCisgICAgICAg
IHMgPSByYW5nZUxvY2socEZpbGUsIEZfUkRMQ0ssICZ0RXJybm8pOworCisgICAgICAgIC8vIERy
b3AgdGhlIHRlbXBvcmFyeSBQRU5ESU5HIGxvY2suCisgICAgICAgIGxvY2subF9zdGFydCA9IFNR
TGl0ZVBlbmRpbmdCeXRlOworICAgICAgICBsb2NrLmxfbGVuID0gMTsKKyAgICAgICAgbG9jay5s
X3R5cGUgPSBGX1VOTENLOworICAgICAgICBpZiAoZmNudGwocEZpbGUtPmgsIEZfU0VUTEssICZs
b2NrKSkgeworICAgICAgICAgICAgaWYgKHMgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0RXJy
bm8gPSBlcnJubzsgCisgICAgICAgICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVy
cm9yKHRFcnJubywgU1FMSVRFX0lPRVJSX1VOTE9DSyk7IAorICAgICAgICAgICAgICAgIGlmICgo
cmMgIT0gU1FMSVRFX09LKSAmJiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAg
ICAgICBwRmlsZS0+bGFzdEVycm5vID0gdEVycm5vOworICAgICAgICAgICAgICAgIHJldHVybiBy
YzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocyA9PSAtMSkgeworICAg
ICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRFcnJubywgU1FMSVRFX0lP
RVJSX0xPQ0spOworICAgICAgICAgICAgaWYgKChyYyAhPSBTUUxJVEVfT0spICYmIChyYyAhPSBT
UUxJVEVfQlVTWSkpCisgICAgICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IHRFcnJubzsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IFNRTElURV9M
T0NLX1NIQVJFRDsKKyAgICAgICAgICAgIHBGaWxlLT5wT3Blbi0+bkxvY2srKzsKKyAgICAgICAg
ICAgIHBMb2NrLT5jbnQgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChsb2NrdHlwZSA9
PSBTUUxJVEVfTE9DS19FWENMVVNJVkUgJiYgcExvY2stPmNudCA+IDEpIHsKKyAgICAgICAgLy8g
V2UgYXJlIHRyeWluZyBmb3IgYW4gZXhjbHVzaXZlIGxvY2sgYnV0IGFub3RoZXIgdGhyZWFkIGlu
IHRoZQorICAgICAgICAvLyBzYW1lIHByb2Nlc3MgaXMgc3RpbGwgaG9sZGluZyBhIHNoYXJlZCBs
b2NrLgorICAgICAgICByYyA9IFNRTElURV9CVVNZOworICAgIH0gIGVsc2UgeworICAgICAgICAv
LyBUaGUgcmVxdWVzdCB3YXMgZm9yIGEgUkVTRVJWRUQgb3IgRVhDTFVTSVZFIGxvY2suICBJdCBp
cworICAgICAgICAvLyBhc3N1bWVkIHRoYXQgdGhlcmUgaXMgYSBTSEFSRUQgb3IgZ3JlYXRlciBs
b2NrIG9uIHRoZSBmaWxlCisgICAgICAgIC8vIGFscmVhZHkuCisgICAgICAgIEFTU0VSVChwRmls
ZS0+bG9ja3R5cGUpOworICAgICAgICBsb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisgICAgICAgIHN3
aXRjaCAobG9ja3R5cGUpIHsKKyAgICAgICAgY2FzZSBTUUxJVEVfTE9DS19SRVNFUlZFRDoKKyAg
ICAgICAgICAgIGxvY2subF9zdGFydCA9IFNRTGl0ZVJlc2VydmVkQnl0ZTsKKyAgICAgICAgICAg
IHMgPSBmY250bChwRmlsZS0+aCwgRl9TRVRMSywgJmxvY2spOworICAgICAgICAgICAgdEVycm5v
ID0gZXJybm87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfTE9DS19F
WENMVVNJVkU6CisgICAgICAgICAgICBzID0gcmFuZ2VMb2NrKHBGaWxlLCBGX1dSTENLLCAmdEVy
cm5vKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMgPT0gLTEpIHsK
KyAgICAgICAgICAgIHJjID0gc3FsaXRlRXJyb3JGcm9tUG9zaXhFcnJvcih0RXJybm8sIFNRTElU
RV9JT0VSUl9MT0NLKTsKKyAgICAgICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAmJiAocmMg
IT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSB0RXJy
bm87CisgICAgICAgIH0KKyAgICB9CisgIAorICAgIGlmIChyYyA9PSBTUUxJVEVfT0spIHsKKyAg
ICAgICAgcEZpbGUtPmxvY2t0eXBlID0gbG9ja3R5cGU7CisgICAgICAgIHBMb2NrLT5sb2NrdHlw
ZSA9IGxvY2t0eXBlOworICAgIH0gZWxzZSBpZiAobG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfRVhD
TFVTSVZFKSB7CisgICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX1BFTkRJTkc7
CisgICAgICAgIHBMb2NrLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX1BFTkRJTkc7CisgICAgfQor
CisgICAgcmV0dXJuIHJjOworfQorCisvLyBDbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgZm9y
IGdpdmVuIENocm9taXVtRmlsZSBmb3Igd2hpY2ggdGhlIGNsb3NlIGhhcyBiZWVuIGRlZmVycmVk
LgorLy8gUmV0dXJucyBhIFNRTGl0ZSBlcnJvciBjb2RlLgorc3RhdGljIGludCBjbG9zZVBlbmRp
bmdGZHMoQ2hyb21pdW1GaWxlKiBwRmlsZSkKK3sKKyAgICBpbnQgcmMgPSBTUUxJVEVfT0s7Cisg
ICAgQ2hyb21pdW1PcGVuSW5mbyogcE9wZW4gPSBwRmlsZS0+cE9wZW47CisgICAgQ2hyb21pdW1V
bnVzZWRGZCogcEVycm9yID0gMDsKKyAgICBDaHJvbWl1bVVudXNlZEZkKiBwTmV4dDsKKyAgICBm
b3IgKENocm9taXVtVW51c2VkRmQqIHAgPSBwT3Blbi0+cFVudXNlZDsgcDsgcCA9IHBOZXh0KSB7
CisgICAgICAgIHBOZXh0ID0gcC0+cE5leHQ7CisgICAgICAgIGlmIChjbG9zZShwLT5mZCkpIHsK
KyAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgIHJjID0g
U1FMSVRFX0lPRVJSX0NMT1NFOworICAgICAgICAgICAgcC0+cE5leHQgPSBwRXJyb3I7CisgICAg
ICAgICAgICBwRXJyb3IgPSBwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNxbGl0ZTNf
ZnJlZShwKTsKKyAgICB9CisgICAgcE9wZW4tPnBVbnVzZWQgPSBwRXJyb3I7CisgICAgcmV0dXJu
IHJjOworfQorCisvLyBMb3dlcnMgdGhlIGxvY2tpbmcgbGV2ZWwgb24gZmlsZSBkZXNjcmlwdG9y
LgorLy8gbG9ja3R5cGUgbXVzdCBiZSBlaXRoZXIgU1FMSVRFX0xPQ0tfTk9ORSBvciBTUUxJVEVf
TE9DS19TSEFSRUQuCitzdGF0aWMgaW50IGNocm9taXVtVW5sb2NrKHNxbGl0ZTNfZmlsZSogaWQs
IGludCBsb2NrdHlwZSkKK3sKKyAgICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRlcnByZXRf
Y2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CisgICAgQVNTRVJUKHBGaWxlKTsKKyAgICBBU1NFUlQo
bG9ja3R5cGUgPD0gU1FMSVRFX0xPQ0tfU0hBUkVEKTsKKworICAgIGlmIChwRmlsZS0+bG9ja3R5
cGUgPD0gbG9ja3R5cGUpCisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisKKyAgICBDaHJvbWl1
bUxvY2tJbmZvKiBwTG9jayA9IHBGaWxlLT5wTG9jazsKKyAgICBBU1NFUlQocExvY2stPmNudCk7
CisKKyAgICBzdHJ1Y3QgZmxvY2sgbG9jazsKKyAgICBpbnQgcmMgPSBTUUxJVEVfT0s7CisgICAg
aW50IGggPSBwRmlsZS0+aDsKKyAgICBpbnQgdEVycm5vOworCisgICAgaWYgKHBGaWxlLT5sb2Nr
dHlwZSA+IFNRTElURV9MT0NLX1NIQVJFRCkgeworICAgICAgICBBU1NFUlQocExvY2stPmxvY2t0
eXBlID09IHBGaWxlLT5sb2NrdHlwZSk7CisKKyAgICAgICAgaWYgKGxvY2t0eXBlID09IFNRTElU
RV9MT0NLX1NIQVJFRCAmJiByYW5nZUxvY2socEZpbGUsIEZfUkRMQ0ssICZ0RXJybm8pID09IC0x
KSB7CisgICAgICAgICAgICByYyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5vLCBT
UUxJVEVfSU9FUlJfUkRMT0NLKTsKKyAgICAgICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAm
JiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8g
PSB0RXJybm87CisgICAgICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKQorICAgICAgICAgICAg
ICAgIHBGaWxlLT5sb2NrdHlwZSA9IGxvY2t0eXBlOworICAgICAgICAgICAgcmV0dXJuIHJjOwor
ICAgICAgICB9CisgICAgICAgIGxvY2subF90eXBlID0gRl9VTkxDSzsKKyAgICAgICAgbG9jay5s
X3doZW5jZSA9IFNFRUtfU0VUOworICAgICAgICBsb2NrLmxfc3RhcnQgPSBTUUxpdGVQZW5kaW5n
Qnl0ZTsKKyAgICAgICAgbG9jay5sX2xlbiA9IDI7CisgICAgICAgIGlmIChmY250bChoLCBGX1NF
VExLLCAmbG9jaykgIT0gLTEpCisgICAgICAgICAgICBwTG9jay0+bG9ja3R5cGUgPSBTUUxJVEVf
TE9DS19TSEFSRUQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdEVycm5vID0gZXJybm87
CisgICAgICAgICAgICByYyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5vLCBTUUxJ
VEVfSU9FUlJfVU5MT0NLKTsKKyAgICAgICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAmJiAo
cmMgIT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSB0
RXJybm87CisgICAgICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKQorICAgICAgICAgICAgICAg
IHBGaWxlLT5sb2NrdHlwZSA9IGxvY2t0eXBlOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAg
ICAgICB9CisgICAgfQorICAgIGlmIChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19OT05FKSB7Cisg
ICAgICAgIHN0cnVjdCBDaHJvbWl1bU9wZW5JbmZvICpwT3BlbjsKKworICAgICAgICBwTG9jay0+
Y250LS07CisKKyAgICAgICAgLy8gUmVsZWFzZSB0aGUgbG9jayB1c2luZyBhbiBPUyBjYWxsIG9u
bHkgd2hlbiBhbGwgdGhyZWFkcyBpbiB0aGlzIHNhbWUgcHJvY2VzcyBoYXZlIHJlbGVhc2VkIHRo
ZSBsb2NrLgorICAgICAgICBpZiAoIXBMb2NrLT5jbnQpIHsKKyAgICAgICAgICAgIGxvY2subF90
eXBlID0gRl9VTkxDSzsKKyAgICAgICAgICAgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKyAg
ICAgICAgICAgIGxvY2subF9zdGFydCA9IGxvY2subF9sZW4gPSAwTDsKKyAgICAgICAgICAgIGlm
IChmY250bChoLCBGX1NFVExLLCAmbG9jaykgIT0gLTEpCisgICAgICAgICAgICAgICAgcExvY2st
PmxvY2t0eXBlID0gU1FMSVRFX0xPQ0tfTk9ORTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAg
ICAgICAgICAgIHRFcnJubyA9IGVycm5vOworICAgICAgICAgICAgICAgIHJjID0gc3FsaXRlRXJy
b3JGcm9tUG9zaXhFcnJvcih0RXJybm8sIFNRTElURV9JT0VSUl9VTkxPQ0spOworICAgICAgICAg
ICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAmJiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAg
ICAgICAgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gdEVycm5vOworICAgICAgICAgICAg
ICAgIHBMb2NrLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX05PTkU7CisgICAgICAgICAgICAgICAg
cEZpbGUtPmxvY2t0eXBlID0gU1FMSVRFX0xPQ0tfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIHBPcGVuID0gcEZpbGUtPnBPcGVuOworICAgICAgICBwT3Blbi0+bkxv
Y2stLTsKKyAgICAgICAgQVNTRVJUKHBPcGVuLT5uTG9jayA+PSAwKTsKKyAgICAgICAgaWYgKCFw
T3Blbi0+bkxvY2spIHsKKyAgICAgICAgICAgIGludCByYzIgPSBjbG9zZVBlbmRpbmdGZHMocEZp
bGUpOworICAgICAgICAgICAgaWYgKHJjID09IFNRTElURV9PSykKKyAgICAgICAgICAgICAgICBy
YyA9IHJjMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyYyA9PSBTUUxJVEVfT0spCisg
ICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IGxvY2t0eXBlOworICAgIHJldHVybiByYzsKK30KKwor
Ly8gQ2xvc2VzIGFsbCBmaWxlIGhhbmRsZXMgZm9yIGdpdmVuIENocm9taXVtRmlsZSBhbmQgc2V0
cyBhbGwgaXRzIGZpZWxkcyB0byAwLgorLy8gUmV0dXJucyBhIFNRTGl0ZSBlcnJvciBjb2RlLgor
c3RhdGljIGludCBjaHJvbWl1bUNsb3NlTm9Mb2NrKHNxbGl0ZTNfZmlsZSogaWQpCit7CisgICAg
Q2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4oaWQp
OworICAgIGlmICghcEZpbGUpCisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisgICAgaWYgKHBG
aWxlLT5kaXJmZCA+PSAwKSB7CisgICAgICAgIGlmIChjbG9zZShwRmlsZS0+ZGlyZmQpKSB7Cisg
ICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJybm87CisgICAgICAgICAgICByZXR1cm4g
U1FMSVRFX0lPRVJSX0RJUl9DTE9TRTsKKyAgICAgICAgfQorICAgICAgICBwRmlsZS0+ZGlyZmQg
PSAtMTsKKyAgICB9CisgICAgaWYgKHBGaWxlLT5oID49IDAgJiYgY2xvc2UocEZpbGUtPmgpKSB7
CisgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgcmV0dXJuIFNRTElU
RV9JT0VSUl9DTE9TRTsKKyAgICB9CisgICAgc3FsaXRlM19mcmVlKHBGaWxlLT5wVW51c2VkKTsK
KyAgICBtZW1zZXQocEZpbGUsIDAsIHNpemVvZihDaHJvbWl1bUZpbGUpKTsKKyAgICByZXR1cm4g
U1FMSVRFX09LOworfQorCisvLyBDbG9zZXMgYSBDaHJvbWl1bUZpbGUsIGluY2x1ZGluZyBsb2Nr
aW5nIG9wZXJhdGlvbnMuIFJldHVybnMgYSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQg
Y2hyb21pdW1DbG9zZShzcWxpdGUzX2ZpbGUqIGlkKQoreworICAgIGlmICghaWQpCisgICAgICAg
IHJldHVybiBTUUxJVEVfT0s7CisKKyAgICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRlcnBy
ZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CisgICAgY2hyb21pdW1VbmxvY2soaWQsIFNRTElU
RV9MT0NLX05PTkUpOworICAgIGlmIChwRmlsZS0+cE9wZW4gJiYgcEZpbGUtPnBPcGVuLT5uTG9j
aykgeworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgb3V0c3RhbmRpbmcgbG9ja3MsIGRvIG5vdCBh
Y3R1YWxseSBjbG9zZSB0aGUgZmlsZSBqdXN0CisgICAgICAgIC8vIHlldCBiZWNhdXNlIHRoYXQg
d291bGQgY2xlYXIgdGhvc2UgbG9ja3MuCisgICAgICAgIENocm9taXVtT3BlbkluZm8qIHBPcGVu
ID0gcEZpbGUtPnBPcGVuOworICAgICAgICBDaHJvbWl1bVVudXNlZEZkKiBwID0gcEZpbGUtPnBV
bnVzZWQ7CisgICAgICAgIHAtPnBOZXh0ID0gcE9wZW4tPnBVbnVzZWQ7CisgICAgICAgIHBPcGVu
LT5wVW51c2VkID0gcDsKKyAgICAgICAgcEZpbGUtPmggPSAtMTsKKyAgICAgICAgcEZpbGUtPnBV
bnVzZWQgPSAwOworICAgIH0KKyAgICByZWxlYXNlTG9ja0luZm8ocEZpbGUtPnBMb2NrKTsKKyAg
ICByZWxlYXNlT3BlbkluZm8ocEZpbGUtPnBPcGVuKTsKKyAgICByZXR1cm4gY2hyb21pdW1DbG9z
ZU5vTG9jayhpZCk7Cit9CisKK3N0YXRpYyBpbnQgY2hyb21pdW1DaGVja1Jlc2VydmVkTG9ja05v
b3Aoc3FsaXRlM19maWxlKiwgaW50KiBwUmVzT3V0KQoreworICAgICpwUmVzT3V0ID0gMDsKKyAg
ICByZXR1cm4gU1FMSVRFX09LOworfQorCitzdGF0aWMgaW50IGNocm9taXVtTG9ja05vb3Aoc3Fs
aXRlM19maWxlKiwgaW50KQoreworICAgIHJldHVybiBTUUxJVEVfT0s7CiB9CiAKLS8vIENocm9t
aXVtJ3MgUG9zaXggaW1wbGVtZW50YXRpb24gb2YgU1FMaXRlIFZGUwotbmFtZXNwYWNlIHsKK3N0
YXRpYyBpbnQgY2hyb21pdW1VbmxvY2tOb29wKHNxbGl0ZTNfZmlsZSosIGludCkKK3sKKyAgICBy
ZXR1cm4gU1FMSVRFX09LOworfQorCisvLyBTZWVrcyB0byB0aGUgcmVxdWVzdGVkIG9mZnNldCBh
bmQgcmVhZHMgdXAgdG8gfGNudHwgYnl0ZXMgaW50byB8cEJ1ZnwuIFJldHVybnMgbnVtYmVyIG9m
IGJ5dGVzIGFjdHVhbGx5IHJlYWQuCitzdGF0aWMgaW50IHNlZWtBbmRSZWFkKENocm9taXVtRmls
ZSogaWQsIHNxbGl0ZTNfaW50NjQgb2Zmc2V0LCB2b2lkKiBwQnVmLCBpbnQgY250KQoreworICAg
IHNxbGl0ZV9pbnQ2NCBuZXdPZmZzZXQgPSBsc2VlayhpZC0+aCwgb2Zmc2V0LCBTRUVLX1NFVCk7
CisgICAgaWYgKG5ld09mZnNldCAhPSBvZmZzZXQpIHsKKyAgICAgICAgaWQtPmxhc3RFcnJubyA9
IChuZXdPZmZzZXQgPT0gLTEpID8gZXJybm8gOiAwOworICAgICAgICByZXR1cm4gLTE7CisgICAg
fQorICAgIGludCBnb3QgPSByZWFkKGlkLT5oLCBwQnVmLCBjbnQpOworICAgIGlmIChnb3QgPCAw
KQorICAgICAgICBpZC0+bGFzdEVycm5vID0gZXJybm87CisgICAgcmV0dXJuIGdvdDsKK30KKwor
Ly8gUmVhZHMgZGF0YSBmcm9tIGZpbGUgaW50byBhIGJ1ZmZlci4gUmV0dXJucyBhIFNRTGl0ZSBl
cnJvciBjb2RlLgorc3RhdGljIGludCBjaHJvbWl1bVJlYWQoc3FsaXRlM19maWxlKiBpZCwgdm9p
ZCogcEJ1ZiwgaW50IGFtdCwgc3FsaXRlM19pbnQ2NCBvZmZzZXQpCit7CisgICAgQ2hyb21pdW1G
aWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIEFT
U0VSVChwRmlsZSk7CisKKyAgICAvLyBUaGUgYnl0ZXMgaW4gdGhlIGxvY2tpbmcgcmFuZ2Ugc2hv
dWxkIG5ldmVyIGJlIHJlYWQuCisgICAgQVNTRVJUKCFwRmlsZS0+cFVudXNlZCB8fCBvZmZzZXQg
Pj0gU1FMaXRlUGVuZGluZ0J5dGUgKyA1MTIgfHwgb2Zmc2V0ICsgYW10IDw9IFNRTGl0ZVBlbmRp
bmdCeXRlKTsKKworICAgIGludCBnb3QgPSBzZWVrQW5kUmVhZChwRmlsZSwgb2Zmc2V0LCBwQnVm
LCBhbXQpOworICAgIGlmIChnb3QgPT0gYW10KQorICAgICAgICByZXR1cm4gU1FMSVRFX09LOwor
CisgICAgaWYgKGdvdCA8IDApCisgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlJfUkVBRDsKKwor
ICAgIC8vIFVucmVhZCBwYXJ0cyBvZiB0aGUgYnVmZmVyIG11c3QgYmUgemVyby1maWxsZWQuCisg
ICAgbWVtc2V0KCYocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocEJ1ZikpW2dvdF0sIDAsIGFtdCAt
IGdvdCk7CisgICAgcEZpbGUtPmxhc3RFcnJubyA9IDA7CisgICAgcmV0dXJuIFNRTElURV9JT0VS
Ul9TSE9SVF9SRUFEOworfQorCisvLyBTZWVrcyB0byB0aGUgcmVxdWVzdGVkIG9mZnNldCBhbmQg
d3JpdGVzIHVwIHRvIHxjbnR8IGJ5dGVzLiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBhY3R1YWxs
eSB3cml0dGVuLgorc3RhdGljIGludCBzZWVrQW5kV3JpdGUoQ2hyb21pdW1GaWxlKiBpZCwgc3Fs
aXRlX2ludDY0IG9mZnNldCwgY29uc3Qgdm9pZCogcEJ1ZiwgaW50IGNudCkKK3sKKyAgICBzcWxp
dGVfaW50NjQgbmV3T2Zmc2V0ID0gbHNlZWsoaWQtPmgsIG9mZnNldCwgU0VFS19TRVQpOworICAg
IGlmIChuZXdPZmZzZXQgIT0gb2Zmc2V0KSB7CisgICAgICAgIGlkLT5sYXN0RXJybm8gPSAobmV3
T2Zmc2V0ID09IC0xKSA/IGVycm5vIDogMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAg
ICBpbnQgZ290ID0gd3JpdGUoaWQtPmgsIHBCdWYsIGNudCk7CisgICAgaWYgKGdvdCA8IDApCisg
ICAgICAgIGlkLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICByZXR1cm4gZ290OworfQorCisvLyBX
cml0ZXMgZGF0YSBmcm9tIGJ1ZmZlciBpbnRvIGEgZmlsZS4gUmV0dXJucyBhIFNRTGl0ZSBlcnJv
ciBjb2RlLgorc3RhdGljIGludCBjaHJvbWl1bVdyaXRlKHNxbGl0ZTNfZmlsZSogaWQsIGNvbnN0
IHZvaWQqIHBCdWYsIGludCBhbXQsIHNxbGl0ZTNfaW50NjQgb2Zmc2V0KQoreworICAgIENocm9t
aXVtRmlsZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAg
ICBBU1NFUlQocEZpbGUpOworICAgIEFTU0VSVChhbXQgPiAwKTsKKworICAgIC8vIFRoZSBieXRl
cyBpbiB0aGUgbG9ja2luZyByYW5nZSBzaG91bGQgbmV2ZXIgYmUgd3JpdHRlbi4KKyAgICBBU1NF
UlQoIXBGaWxlLT5wVW51c2VkIHx8IG9mZnNldCA+PSBTUUxpdGVQZW5kaW5nQnl0ZSArIDUxMiB8
fCBvZmZzZXQgKyBhbXQgPD0gU1FMaXRlUGVuZGluZ0J5dGUpOworCisgICAgaW50IHdyb3RlID0g
MDsKKyAgICB3aGlsZSAoYW10ID4gMCAmJiAod3JvdGUgPSBzZWVrQW5kV3JpdGUocEZpbGUsIG9m
ZnNldCwgcEJ1ZiwgYW10KSkgPiAwKSB7CisgICAgICAgIGFtdCAtPSB3cm90ZTsKKyAgICAgICAg
b2Zmc2V0ICs9IHdyb3RlOworICAgICAgICBwQnVmID0gJihyZWludGVycHJldF9jYXN0PGNvbnN0
IGNoYXIqPihwQnVmKSlbd3JvdGVdOworICAgIH0KKyAgICBpZiAoYW10ID4gMCkgeworICAgICAg
ICBpZiAod3JvdGUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIFNRTElURV9JT0VSUl9XUklURTsK
KyAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IDA7CisgICAgICAgIHJldHVybiBTUUxJVEVfRlVM
TDsKKyAgICB9CisgICAgcmV0dXJuIFNRTElURV9PSzsKK30KKworc3RhdGljIGludCBzeW5jV3Jh
cHBlcihpbnQgZmQsIGJvb2wgZnVsbFN5bmMpCit7CisgICAgaW50IHJjID0gMTsKKyNpZiBQTEFU
Rk9STShNQUMpCisgICAgaWYgKGZ1bGxTeW5jKQorICAgICAgICByYyA9IGZjbnRsKGZkLCBGX0ZV
TExTWU5DLCAwKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmMgPSBmc3luYyhmZCk7
CisgICAgcmV0dXJuIHJjOworfQorCisvLyBNYWtlcyBzdXJlIGFsbCB3cml0ZXMgdG8gYSBwYXJ0
aWN1bGFyIGZpbGUgYXJlIGNvbW1pdHRlZCB0byBkaXNrLiBSZXR1cm5zIGEgU1FMaXRlIGVycm9y
IGNvZGUuCitzdGF0aWMgaW50IGNocm9taXVtU3luYyhzcWxpdGUzX2ZpbGUqIGlkLCBpbnQgZmxh
Z3MpCit7CisgICAgQVNTRVJUKChmbGFncyAmIDB4MEYpID09IFNRTElURV9TWU5DX05PUk1BTCB8
fCAoZmxhZ3MgJiAweDBGKSA9PSBTUUxJVEVfU1lOQ19GVUxMKTsKKworICAgIENocm9taXVtRmls
ZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAgICBBU1NF
UlQocEZpbGUpOworCisgICAgaWYgKHN5bmNXcmFwcGVyKHBGaWxlLT5oLCAoZmxhZ3MgJiAweDBG
KSA9PSBTUUxJVEVfU1lOQ19GVUxMKSkgeworICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJy
bm87CisgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlJfRlNZTkM7CisgICAgfQorCisgICAgaWYg
KHBGaWxlLT5kaXJmZCA+PSAwKSB7CisjaWYgIVBMQVRGT1JNKE1BQykKKyAgICAgICAgaWYgKChm
bGFncyAmIDB4MEYpICE9IFNRTElURV9TWU5DX0ZVTEwpIHsKKyAgICAgICAgICAgIC8vIElnbm9y
ZSBkaXJlY3Rvcnkgc3luYyBmYWlsdXJlcywgc2VlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jdnN0
cmFjL3RrdHZpZXc/dG49MTY1Ny4KKyAgICAgICAgICAgIHN5bmNXcmFwcGVyKHBGaWxlLT5kaXJm
ZCwgZmFsc2UpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKCFjbG9zZShwRmlsZS0+
ZGlyZmQpKQorICAgICAgICAgICAgcEZpbGUtPmRpcmZkID0gLTE7CisgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IGVycm5vOworICAgICAgICAgICAgcmV0dXJu
IFNRTElURV9JT0VSUl9ESVJfQ0xPU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4g
U1FMSVRFX09LOworfQorCisvLyBUcnVuY2F0ZXMgYW4gb3BlbiBmaWxlIHRvIHRoZSBzcGVjaWZp
ZWQgc2l6ZS4gUmV0dXJucyBhIFNRTGl0ZSBlcnJvciBjb2RlLgorc3RhdGljIGludCBjaHJvbWl1
bVRydW5jYXRlKHNxbGl0ZTNfZmlsZSogaWQsIHNxbGl0ZV9pbnQ2NCBuQnl0ZSkKK3sKKyAgICBD
aHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7
CisgICAgQVNTRVJUKHBGaWxlKTsKKworICAgIGlmIChmdHJ1bmNhdGUocEZpbGUtPmgsIG5CeXRl
KSkgeworICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJybm87CisgICAgICAgIHJldHVybiBT
UUxJVEVfSU9FUlJfVFJVTkNBVEU7CisgICAgfQorCisgICAgcmV0dXJuIFNRTElURV9PSzsKK30K
KworLy8gRGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiBhIGZpbGUgaW4gYnl0ZXMuIFJldHVybnMgYSBT
UUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQgY2hyb21pdW1GaWxlU2l6ZShzcWxpdGUzX2Zp
bGUqIGlkLCBzcWxpdGVfaW50NjQqIHBTaXplKQoreworICAgIENocm9taXVtRmlsZSogcEZpbGUg
PSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAgICBBU1NFUlQocEZpbGUp
OworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGlmIChmc3RhdChwRmlsZS0+aCwgJmJ1Zikp
IHsKKyAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IGVycm5vOworICAgICAgICByZXR1cm4gU1FM
SVRFX0lPRVJSX0ZTVEFUOworICAgIH0KKyAgICAqcFNpemUgPSBidWYuc3Rfc2l6ZTsKKworICAg
IC8vIFdoZW4gb3BlbmluZyBhIHplcm8tc2l6ZSBkYXRhYmFzZSwgZmluZExvY2tJbmZvIHdyaXRl
cyBhIHNpbmdsZSBieXRlIGludG8gdGhhdCBmaWxlCisgICAgLy8gaW4gb3JkZXIgdG8gd29yayBh
cm91bmQgYSBidWcgaW4gdGhlIE9TIFggbXNkb3MgZmlsZXN5c3RlbS4gSW4gb3JkZXIgdG8gYXZv
aWQgcHJvYmxlbXMKKyAgICAvLyB3aXRoIHVwcGVyIGxheWVycywgd2UgbmVlZCB0byByZXBvcnQg
dGhpcyBmaWxlIHNpemUgYXMgemVybyBldmVuIHRob3VnaCBpdCBpcyByZWFsbHkgMS4KKyAgICAv
LyBTZWUgaHR0cDovL3d3dy5zcWxpdGUub3JnL2N2c3RyYWMvdGt0dmlldz90bj0zMjYwLgorICAg
IGlmICgqcFNpemUgPT0gMSkKKyAgICAgICAgKnBTaXplID0gMDsKKworICAgIHJldHVybiBTUUxJ
VEVfT0s7Cit9CisKK3N0YXRpYyBpbnQgY2hyb21pdW1GaWxlQ29udHJvbChzcWxpdGUzX2ZpbGUq
IGlkLCBpbnQgb3AsIHZvaWQqIHBBcmcpCit7CisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7CisK
KyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBTUUxJVEVfRkNOVExfTE9DS1NUQVRFOgorICAg
ICAgICAqcmVpbnRlcnByZXRfY2FzdDxpbnQqPihwQXJnKSA9IHBGaWxlLT5sb2NrdHlwZTsKKyAg
ICAgICAgcmV0dXJuIFNRTElURV9PSzsKKyAgICBjYXNlIFNRTElURV9MQVNUX0VSUk5POgorICAg
ICAgICAqcmVpbnRlcnByZXRfY2FzdDxpbnQqPihwQXJnKSA9IHBGaWxlLT5sYXN0RXJybm87Cisg
ICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisgICAgfQorICAgIHJldHVybiBTUUxJVEVfRVJST1I7
Cit9CisKKy8vIFNhbWUgYXMgU1FMSVRFX0RFRkFVTFRfU0VDVE9SX1NJWkUgZnJvbSBzcWxpdGUn
cyBvcy5oLgorc3RhdGljIGNvbnN0IGludCBTUUxpdGVEZWZhdWx0U2VjdG9yU2l6ZSA9IDUxMjsK
Kworc3RhdGljIGludCBjaHJvbWl1bVNlY3RvclNpemUoc3FsaXRlM19maWxlKikKK3sKKyAgICBy
ZXR1cm4gU1FMaXRlRGVmYXVsdFNlY3RvclNpemU7Cit9CisKK3N0YXRpYyBpbnQgY2hyb21pdW1E
ZXZpY2VDaGFyYWN0ZXJpc3RpY3Moc3FsaXRlM19maWxlKikKK3sKKyAgICByZXR1cm4gMDsKK30K
Kworc3RhdGljIGNvbnN0IHNxbGl0ZTNfaW9fbWV0aG9kcyBwb3NpeElvTWV0aG9kcyA9IHsKKyAg
ICAxLAorICAgIGNocm9taXVtQ2xvc2UsCisgICAgY2hyb21pdW1SZWFkLAorICAgIGNocm9taXVt
V3JpdGUsCisgICAgY2hyb21pdW1UcnVuY2F0ZSwKKyAgICBjaHJvbWl1bVN5bmMsCisgICAgY2hy
b21pdW1GaWxlU2l6ZSwKKyAgICBjaHJvbWl1bUxvY2ssCisgICAgY2hyb21pdW1VbmxvY2ssCisg
ICAgY2hyb21pdW1DaGVja1Jlc2VydmVkTG9jaywKKyAgICBjaHJvbWl1bUZpbGVDb250cm9sLAor
ICAgIGNocm9taXVtU2VjdG9yU2l6ZSwKKyAgICBjaHJvbWl1bURldmljZUNoYXJhY3RlcmlzdGlj
cworfTsKKworc3RhdGljIGNvbnN0IHNxbGl0ZTNfaW9fbWV0aG9kcyBub2xvY2tJb01ldGhvZHMg
PSB7CisgICAgMSwKKyAgICBjaHJvbWl1bUNsb3NlTm9Mb2NrLAorICAgIGNocm9taXVtUmVhZCwK
KyAgICBjaHJvbWl1bVdyaXRlLAorICAgIGNocm9taXVtVHJ1bmNhdGUsCisgICAgY2hyb21pdW1T
eW5jLAorICAgIGNocm9taXVtRmlsZVNpemUsCisgICAgY2hyb21pdW1Mb2NrTm9vcCwKKyAgICBj
aHJvbWl1bVVubG9ja05vb3AsCisgICAgY2hyb21pdW1DaGVja1Jlc2VydmVkTG9ja05vb3AsCisg
ICAgY2hyb21pdW1GaWxlQ29udHJvbCwKKyAgICBjaHJvbWl1bVNlY3RvclNpemUsCisgICAgY2hy
b21pdW1EZXZpY2VDaGFyYWN0ZXJpc3RpY3MKK307CisKKy8vIEluaXRpYWxpemVzIGEgQ2hyb21p
dW1GaWxlLiBSZXR1cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGZpbGxJbkNo
cm9taXVtRmlsZShzcWxpdGUzX3ZmcyogcFZmcywgaW50IGgsIGludCBkaXJmZCwgc3FsaXRlM19m
aWxlKiBwSWQsIGNvbnN0IGNoYXIqIHpGaWxlbmFtZSwgaW50IG5vTG9jaykKK3sKKyAgICBDaHJv
bWl1bUZpbGUqIHBOZXcgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KHBJZCk7CisK
KyAgICBBU1NFUlQoIXBOZXctPnBMb2NrKTsKKyAgICBBU1NFUlQoIXBOZXctPnBPcGVuKTsKKwor
ICAgIHBOZXctPmggPSBoOworICAgIHBOZXctPmRpcmZkID0gZGlyZmQ7CisKKyAgICBpbnQgcmMg
PSBTUUxJVEVfT0s7CisgICAgY29uc3Qgc3FsaXRlM19pb19tZXRob2RzKiBwTG9ja2luZ1N0eWxl
OworICAgIGlmIChub0xvY2spCisgICAgICAgIHBMb2NraW5nU3R5bGUgPSAmbm9sb2NrSW9NZXRo
b2RzOworICAgIGVsc2UgeworICAgICAgICBwTG9ja2luZ1N0eWxlID0gJnBvc2l4SW9NZXRob2Rz
OworICAgICAgICByYyA9IGZpbmRMb2NrSW5mbyhwTmV3LCAmcE5ldy0+cExvY2ssICZwTmV3LT5w
T3Blbik7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIC8vIElm
IGFuIGVycm9yIG9jY3VyZWQgaW4gZmluZExvY2tJbmZvKCksIGNsb3NlIHRoZSBmaWxlIGRlc2Ny
aXB0b3IKKyAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5LiBUaGlzIGNhbiBoYXBwZW4gaW4gdHdv
IHNjZW5hcmlvczoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIChhKSBBIGNhbGwg
dG8gZnN0YXQoKSBmYWlsZWQuCisgICAgICAgICAgICAvLyAgIChiKSBBIG1hbGxvYyBmYWlsZWQu
CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2NlbmFyaW8gKGIpIG1heSBvbmx5IG9j
Y3VyIGlmIHRoZSBwcm9jZXNzIGlzIGhvbGRpbmcgbm8gb3RoZXIKKyAgICAgICAgICAgIC8vIGZp
bGUgZGVzY3JpcHRvcnMgb3BlbiBvbiB0aGUgc2FtZSBmaWxlLiBJZiB0aGVyZSB3ZXJlIG90aGVy
IGZpbGUKKyAgICAgICAgICAgIC8vIGRlc2NyaXB0b3JzIG9uIHRoaXMgZmlsZSwgdGhlbiBubyBt
YWxsb2Mgd291bGQgYmUgcmVxdWlyZWQgYnkKKyAgICAgICAgICAgIC8vIGZpbmRMb2NrSW5mbygp
LiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBpdCBpcyBxdWl0ZSBzYWZlIHRvIGNsb3NlCisgICAgICAg
ICAgICAvLyBoYW5kbGUgaCAtIGFzIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBwb3NpeCBsb2Nr
cyB3aWxsIGJlIHJlbGVhc2VkCisgICAgICAgICAgICAvLyBieSBkb2luZyBzby4KKyAgICAgICAg
ICAgIC8vCisgICAgICAgICAgICAvLyBJZiBzY2VuYXJpbyAoYSkgY2F1c2VkIHRoZSBlcnJvciB0
aGVuIHRoaW5ncyBhcmUgbm90IHNvIHNhZmUuIFRoZQorICAgICAgICAgICAgLy8gaW1wbGljaXQg
YXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgaWYgZnN0YXQoKSBmYWlscywgdGhpbmdzIGFyZSBpbgor
ICAgICAgICAgICAgLy8gc3VjaCBiYWQgc2hhcGUgdGhhdCBkcm9wcGluZyBhIGxvY2sgb3IgdHdv
IGRvZXNuJ3QgbWF0dGVyIG11Y2guCisgICAgICAgICAgICBjbG9zZShoKTsKKyAgICAgICAgICAg
IGggPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBOZXctPmxhc3RFcnJubyA9IDA7Cisg
ICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBpZiAoZGlyZmQgPj0gMCkKKyAgICAg
ICAgICAgIGNsb3NlKGRpcmZkKTsKKyAgICAgICAgaWYgKGggPj0gMCkKKyAgICAgICAgICAgIGNs
b3NlKGgpOworICAgIH0gZWxzZQorICAgICAgICBwTmV3LT5wTWV0aG9kID0gcExvY2tpbmdTdHls
ZTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8vIFNlYXJjaGVzIGZvciBhbiB1bnVzZWQgZmlsZSBk
ZXNjcmlwdG9yIHRoYXQgd2FzIG9wZW5lZCBvbiB0aGUgZGF0YWJhc2UgCisvLyBmaWxlIGlkZW50
aWZpZWQgYnkgelBhdGggd2l0aCBtYXRjaGluZyBmbGFncy4gUmV0dXJucyAwIGlmIG5vdCBmb3Vu
ZC4KK3N0YXRpYyBDaHJvbWl1bVVudXNlZEZkKiBmaW5kUmV1c2FibGVGZChjb25zdCBjaGFyKiB6
UGF0aCwgaW50IGZsYWdzKQoreworICAgIENocm9taXVtVW51c2VkRmQqIHBVbnVzZWQgPSAwOwor
CisgICAgc3RydWN0IHN0YXQgc1N0YXQ7CisgICAgaWYgKCFzdGF0KHpQYXRoLCAmc1N0YXQpKSB7
CisgICAgICAgIENocm9taXVtRmlsZUlkIGlkOworICAgICAgICBpZC5kZXYgPSBzU3RhdC5zdF9k
ZXY7CisgICAgICAgIGlkLmlubyA9IHNTdGF0LnN0X2lubzsKKworICAgICAgICBDaHJvbWl1bU9w
ZW5JbmZvKiBwTyA9IDA7CisgICAgICAgIGZvciAocE8gPSBvcGVuTGlzdDsgcE8gJiYgbWVtY21w
KCZpZCwgJnBPLT5maWxlSWQsIHNpemVvZihpZCkpOyBwTyA9IHBPLT5wTmV4dCkgeyB9CisgICAg
ICAgIGlmIChwTykgeworICAgICAgICAgICAgQ2hyb21pdW1VbnVzZWRGZCoqIHBwOworICAgICAg
ICAgICAgZm9yIChwcCA9ICZwTy0+cFVudXNlZDsgKnBwICYmICgqcHApLT5mbGFncyAhPSBmbGFn
czsgcHAgPSAmKCgqcHApLT5wTmV4dCkpIHsgfQorICAgICAgICAgICAgcFVudXNlZCA9ICpwcDsK
KyAgICAgICAgICAgIGlmIChwVW51c2VkKQorICAgICAgICAgICAgICAgICpwcCA9IHBVbnVzZWQt
PnBOZXh0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwVW51c2VkOworfQogCiAvLyBP
cGVucyBhIGZpbGUuCiAvLwpAQCAtNTksMTQgKzk3MCwyNiBAQCBuYW1lc3BhY2UgewogLy8gaWQg
LSB0aGUgc3RydWN0dXJlIHRoYXQgd2lsbCBtYW5pcHVsYXRlIHRoZSBuZXdseSBvcGVuZWQgZmls
ZS4KIC8vIGRlc2lyZWRGbGFncyAtIHRoZSBkZXNpcmVkIG9wZW4gbW9kZSBmbGFncy4KIC8vIHVz
ZWRGbGFncyAtIHRoZSBhY3R1YWwgb3BlbiBtb2RlIGZsYWdzIHRoYXQgd2VyZSB1c2VkLgotaW50
IGNocm9taXVtT3BlbihzcWxpdGUzX3ZmcyogdmZzLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwKLSAg
ICAgICAgICAgICAgICAgc3FsaXRlM19maWxlKiBpZCwgaW50IGRlc2lyZWRGbGFncywgaW50KiB1
c2VkRmxhZ3MpCitzdGF0aWMgaW50IGNocm9taXVtT3BlbihzcWxpdGUzX3ZmcyogdmZzLCBjb25z
dCBjaGFyKiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZTNfZmlsZSog
aWQsIGludCBkZXNpcmVkRmxhZ3MsIGludCogdXNlZEZsYWdzKQogewotICAgIGNocm9taXVtX3Nx
bGl0ZTNfaW5pdGlhbGl6ZV91bml4X3NxbGl0ZTNfZmlsZShpZCk7CisgICAgLy8gVGhlIG1hc2sg
MHgwMDAwN0YwMCBnaXZlcyB1cyB0aGUgNyBiaXRzIHRoYXQgZGV0ZXJtaW5lIHRoZSB0eXBlIG9m
IHRoZSBmaWxlIFNRTGl0ZSBpcyB0cnlpbmcgdG8gb3Blbi4KKyAgICBpbnQgZmlsZVR5cGUgPSBk
ZXNpcmVkRmxhZ3MgJiAweDAwMDA3RjAwOworCisgICAgbWVtc2V0KGlkLCAwLCBzaXplb2YoQ2hy
b21pdW1GaWxlKSk7CisgICAgQ2hyb21pdW1GaWxlKiBjaHJvbWl1bUZpbGUgPSByZWludGVycHJl
dF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKICAgICBpbnQgZmQgPSAtMTsKLSAgICBpbnQgcmVz
dWx0ID0gY2hyb21pdW1fc3FsaXRlM19nZXRfcmV1c2FibGVfZmlsZV9oYW5kbGUoaWQsIGZpbGVO
YW1lLCBkZXNpcmVkRmxhZ3MsICZmZCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfT0spCi0g
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgaWYgKGZpbGVUeXBlID09IFNRTElURV9PUEVOX01B
SU5fREIpIHsKKyAgICAgICAgQ2hyb21pdW1VbnVzZWRGZCogdW51c2VkRmQgPSBmaW5kUmV1c2Fi
bGVGZChmaWxlTmFtZSwgZGVzaXJlZEZsYWdzKTsKKyAgICAgICAgaWYgKHVudXNlZEZkKQorICAg
ICAgICAgICAgZmQgPSB1bnVzZWRGZC0+ZmQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
dW51c2VkRmQgPSBzdGF0aWNfY2FzdDxDaHJvbWl1bVVudXNlZEZkKj4oc3FsaXRlM19tYWxsb2Mo
c2l6ZW9mKCp1bnVzZWRGZCkpKTsKKyAgICAgICAgICAgIGlmICghdW51c2VkRmQpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIFNRTElURV9OT01FTTsKKyAgICAgICAgfQorICAgICAgICBjaHJvbWl1
bUZpbGUtPnBVbnVzZWQgPSB1bnVzZWRGZDsKKyAgICB9CiAKICAgICBpZiAoZmQgPCAwKSB7CiAg
ICAgICAgIGZkID0gQ2hyb21pdW1CcmlkZ2U6OmRhdGFiYXNlT3BlbkZpbGUoZmlsZU5hbWUsIGRl
c2lyZWRGbGFncyk7CkBAIC03NiwyMyArOTk5LDI0IEBAIGludCBjaHJvbWl1bU9wZW4oc3FsaXRl
M192ZnMqIHZmcywgY29uc3QKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoZmQgPCAwKSB7Ci0g
ICAgICAgIGNocm9taXVtX3NxbGl0ZTNfZGVzdHJveV9yZXVzYWJsZV9maWxlX2hhbmRsZShpZCk7
CisgICAgICAgIHNxbGl0ZTNfZnJlZShjaHJvbWl1bUZpbGUtPnBVbnVzZWQpOwogICAgICAgICBy
ZXR1cm4gU1FMSVRFX0NBTlRPUEVOOwogICAgIH0KIAogICAgIGlmICh1c2VkRmxhZ3MpCiAgICAg
ICAgICp1c2VkRmxhZ3MgPSBkZXNpcmVkRmxhZ3M7Ci0gICAgY2hyb21pdW1fc3FsaXRlM191cGRh
dGVfcmV1c2FibGVfZmlsZV9oYW5kbGUoaWQsIGZkLCBkZXNpcmVkRmxhZ3MpOworICAgIGlmIChj
aHJvbWl1bUZpbGUtPnBVbnVzZWQpIHsKKyAgICAgICAgY2hyb21pdW1GaWxlLT5wVW51c2VkLT5m
ZCA9IGZkOworICAgICAgICBjaHJvbWl1bUZpbGUtPnBVbnVzZWQtPmZsYWdzID0gZGVzaXJlZEZs
YWdzOworICAgIH0KIAogICAgIGZjbnRsKGZkLCBGX1NFVEZELCBmY250bChmZCwgRl9HRVRGRCkg
fCBGRF9DTE9FWEVDKTsKIAotICAgIC8vIFRoZSBtYXNrIDB4MDAwMDdGMDAgZ2l2ZXMgdXMgdGhl
IDcgYml0cyB0aGF0IGRldGVybWluZSB0aGUgdHlwZSBvZiB0aGUgZmlsZSBTUUxpdGUgaXMgdHJ5
aW5nIHRvIG9wZW4uCi0gICAgaW50IGZpbGVUeXBlID0gZGVzaXJlZEZsYWdzICYgMHgwMDAwN0Yw
MDsKICAgICBpbnQgbm9Mb2NrID0gKGZpbGVUeXBlICE9IFNRTElURV9PUEVOX01BSU5fREIpOwot
ICAgIHJlc3VsdCA9IGNocm9taXVtX3NxbGl0ZTNfZmlsbF9pbl91bml4X3NxbGl0ZTNfZmlsZSh2
ZnMsIGZkLCAtMSwgaWQsIGZpbGVOYW1lLCBub0xvY2spOwotICAgIGlmIChyZXN1bHQgIT0gU1FM
SVRFX09LKQotICAgICAgICBjaHJvbWl1bV9zcWxpdGUzX2Rlc3Ryb3lfcmV1c2FibGVfZmlsZV9o
YW5kbGUoaWQpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgaW50IHJjID0gZmlsbEluQ2hyb21p
dW1GaWxlKHZmcywgZmQsIC0xLCBpZCwgZmlsZU5hbWUsIG5vTG9jayk7CisgICAgaWYgKHJjICE9
IFNRTElURV9PSykKKyAgICAgICAgc3FsaXRlM19mcmVlKGNocm9taXVtRmlsZS0+cFVudXNlZCk7
CisgICAgcmV0dXJuIHJjOwogfQogCiAvLyBEZWxldGVzIHRoZSBnaXZlbiBmaWxlLgpAQCAtMTAx
LDcgKzEwMjUsNyBAQCBpbnQgY2hyb21pdW1PcGVuKHNxbGl0ZTNfdmZzKiB2ZnMsIGNvbnN0CiAv
LyBmaWxlTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgogLy8gc3luY0RpciAtIGRldGVybWlu
ZXMgaWYgdGhlIGRpcmVjdG9yeSB0byB3aGljaCB0aGlzIGZpbGUgYmVsb25ncwogLy8gICAgICAg
ICAgIHNob3VsZCBiZSBzeW5jaGVkIGFmdGVyIHRoZSBmaWxlIGlzIGRlbGV0ZWQuCi1pbnQgY2hy
b21pdW1EZWxldGUoc3FsaXRlM192ZnMqLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgaW50IHN5bmNE
aXIpCitzdGF0aWMgaW50IGNocm9taXVtRGVsZXRlKHNxbGl0ZTNfdmZzKiwgY29uc3QgY2hhciog
ZmlsZU5hbWUsIGludCBzeW5jRGlyKQogewogICAgIHJldHVybiBDaHJvbWl1bUJyaWRnZTo6ZGF0
YWJhc2VEZWxldGVGaWxlKGZpbGVOYW1lLCBzeW5jRGlyKTsKIH0KQEAgLTExMiw3ICsxMDM2LDcg
QEAgaW50IGNocm9taXVtRGVsZXRlKHNxbGl0ZTNfdmZzKiwgY29uc3QgYwogLy8gZmlsZU5hbWUg
LSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KIC8vIGZsYWcgLSB0aGUgdHlwZSBvZiB0ZXN0IHRvIG1h
a2Ugb24gdGhpcyBmaWxlLgogLy8gcmVzIC0gdGhlIHJlc3VsdC4KLWludCBjaHJvbWl1bUFjY2Vz
cyhzcWxpdGUzX3ZmcyosIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBpbnQgZmxhZywgaW50KiByZXMp
CitzdGF0aWMgaW50IGNocm9taXVtQWNjZXNzKHNxbGl0ZTNfdmZzKiwgY29uc3QgY2hhciogZmls
ZU5hbWUsIGludCBmbGFnLCBpbnQqIHJlcykKIHsKICAgICBpbnQgYXR0ciA9IHN0YXRpY19jYXN0
PGludD4oQ2hyb21pdW1CcmlkZ2U6OmRhdGFiYXNlR2V0RmlsZUF0dHJpYnV0ZXMoZmlsZU5hbWUp
KTsKICAgICBpZiAoYXR0ciA8IDApIHsKQEAgLTEyMiw3ICsxMDQ2LDcgQEAgaW50IGNocm9taXVt
QWNjZXNzKHNxbGl0ZTNfdmZzKiwgY29uc3QgYwogCiAgICAgc3dpdGNoIChmbGFnKSB7CiAgICAg
Y2FzZSBTUUxJVEVfQUNDRVNTX0VYSVNUUzoKLSAgICAgICAgKnJlcyA9IDE7ICAgLy8gaWYgdGhl
IGZpbGUgZG9lc24ndCBleGlzdCwgYXR0ciA8IDAKKyAgICAgICAgKnJlcyA9IDE7IC8vIGlmIHRo
ZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIGF0dHIgPCAwCiAgICAgICAgIGJyZWFrOwogICAgIGNhc2Ug
U1FMSVRFX0FDQ0VTU19SRUFEV1JJVEU6CiAgICAgICAgICpyZXMgPSAoYXR0ciAmIFdfT0spICYm
IChhdHRyICYgUl9PSyk7CkBAIC0xNDMsOCArMTA2Nyw4IEBAIGludCBjaHJvbWl1bUFjY2Vzcyhz
cWxpdGUzX3ZmcyosIGNvbnN0IGMKIC8vIHJlbGF0aXZlUGF0aCAtIHRoZSByZWxhdGl2ZSBwYXRo
LgogLy8gYnVmU2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGluIGJ5dGVzLgog
Ly8gYWJzb2x1dGVQYXRoIC0gdGhlIG91dHB1dCBidWZmZXIgd2hlcmUgdGhlIGFic29sdXRlIHBh
dGggd2lsbCBiZSBzdG9yZWQuCi1pbnQgY2hyb21pdW1GdWxsUGF0aG5hbWUoc3FsaXRlM192ZnMq
IHZmcywgY29uc3QgY2hhciogcmVsYXRpdmVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAg
IGludCwgY2hhciogYWJzb2x1dGVQYXRoKQorc3RhdGljIGludCBjaHJvbWl1bUZ1bGxQYXRobmFt
ZShzcWxpdGUzX3ZmcyogdmZzLCBjb25zdCBjaGFyKiByZWxhdGl2ZVBhdGgsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGludCwgY2hhciogYWJzb2x1dGVQYXRoKQogewogICAgIC8v
IFRoZSByZW5kZXJlciBwcm9jZXNzIGRvZXNuJ3QgbmVlZCB0byBrbm93IHRoZSBhYnNvbHV0ZSBw
YXRoIG9mIHRoZSBmaWxlCiAgICAgc3FsaXRlM19zbnByaW50Zih2ZnMtPm14UGF0aG5hbWUsIGFi
c29sdXRlUGF0aCwgIiVzIiwgcmVsYXRpdmVQYXRoKTsKQEAgLTE1Miw0NCArMTA3NiwxMDUgQEAg
aW50IGNocm9taXVtRnVsbFBhdGhuYW1lKHNxbGl0ZTNfdmZzKiB2ZgogfQogCiAjaWZuZGVmIFNR
TElURV9PTUlUX0xPQURfRVhURU5TSU9OCi0vLyBSZXR1cm5zIE5VTEwsIHRodXMgZGlzYWxsb3dp
bmcgbG9hZGluZyBsaWJyYXJpZXMgaW4gdGhlIHJlbmRlcmVyIHByb2Nlc3MuCi0vLwotLy8gdmZz
IC0gcG9pbnRlciB0byB0aGUgc3FsaXRlM192ZnMgb2JqZWN0LgotLy8gZmlsZU5hbWUgLSB0aGUg
bmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZS4KLXZvaWQqIGNocm9taXVtRGxPcGVuKHNx
bGl0ZTNfdmZzKiwgY29uc3QgY2hhciopCisvLyBXZSBkaXNhbGxvdyBsb2FkaW5nIERTT3MgaW5z
aWRlIHRoZSByZW5kZXJlciBwcm9jZXNzLCBzbyB0aGUgZm9sbG93aW5nCisvLyBwcm9jZWR1cmVz
IGFyZSBuby1vcC4KK3N0YXRpYyB2b2lkKiBjaHJvbWl1bURsT3BlbihzcWxpdGUzX3ZmcyosIGNv
bnN0IGNoYXIqKQoreworICAgIHJldHVybiAwOworfQorc3RhdGljIHZvaWQgY2hyb21pdW1EbEVy
cm9yKHNxbGl0ZTNfdmZzKiwgaW50LCBjaGFyKikKK3sKK30KK3N0YXRpYyB2b2lkICgqY2hyb21p
dW1EbFN5bShzcWxpdGUzX3ZmcyosIHZvaWQqLCBjb25zdCBjaGFyKikpKCkKIHsKICAgICByZXR1
cm4gMDsKIH0KK3N0YXRpYyB2b2lkIGNocm9taXVtRGxDbG9zZShzcWxpdGUzX3ZmcyosIHZvaWQq
KQoreworfQogI2Vsc2UKICNkZWZpbmUgY2hyb21pdW1EbE9wZW4gMAorI2RlZmluZSBjaHJvbWl1
bURsRXJyb3IgMAorI2RlZmluZSBjaHJvbWl1bURsU3ltIDAKKyNkZWZpbmUgY2hyb21pdW1EbENs
b3NlIDAKICNlbmRpZiAvLyBTUUxJVEVfT01JVF9MT0FEX0VYVEVOU0lPTgogCi19IC8vIG5hbWVz
cGFjZQorLy8gR2VuZXJhdGVzIGEgc2VlZCBmb3IgU1FMaXRlJ3MgUFJORy4KK3N0YXRpYyBpbnQg
Y2hyb21pdW1SYW5kb21uZXNzKHNxbGl0ZTNfdmZzKiwgaW50IG5CdWYsIGNoYXIgKnpCdWYpCit7
CisgICAgQVNTRVJUKHN0YXRpY19jYXN0PHNpemVfdD4obkJ1ZikgPj0gKHNpemVvZih0aW1lX3Qp
ICsgc2l6ZW9mKGludCkpKTsKKworICAgIG1lbXNldCh6QnVmLCAwLCBuQnVmKTsKKyAgICBpbnQg
ZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgewor
ICAgICAgICB0aW1lX3QgdDsKKyAgICAgICAgdGltZSgmdCk7CisgICAgICAgIG1lbWNweSh6QnVm
LCAmdCwgc2l6ZW9mKHQpKTsKKyAgICAgICAgaW50IHBpZCA9IGdldHBpZCgpOworICAgICAgICBt
ZW1jcHkoJnpCdWZbc2l6ZW9mKHQpXSwgJnBpZCwgc2l6ZW9mKHBpZCkpOworICAgICAgICByZXR1
cm4gc2l6ZW9mKHQpICsgc2l6ZW9mKHBpZCk7CisgICAgfQorICAgIG5CdWYgPSByZWFkKGZkLCB6
QnVmLCBuQnVmKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIG5CdWY7Cit9CisKKy8vIFNs
ZWVwcyBmb3IgYXQgbGVhc3QgfG1pY3Jvc2Vjb25kc3wsIGFuZCByZXR1cm5zIHRoZSBhY3R1YWwK
Ky8vIGFtb3VudCBvZiB0aW1lIHNwZW50IHNsZWVwaW5nIChpbiBtaWNyb3NlY29uZHMpLgorc3Rh
dGljIGludCBjaHJvbWl1bVNsZWVwKHNxbGl0ZTNfdmZzKiwgaW50IG1pY3Jvc2Vjb25kcykKK3sK
KyNpZiBQTEFURk9STShNQUMpCisgICAgdXNsZWVwKG1pY3Jvc2Vjb25kcyk7CisgICAgcmV0dXJu
IG1pY3Jvc2Vjb25kczsKKyNlbHNlCisgICAgLy8gUm91bmQgdG8gdGhlIG5lYXJlc3Qgc2Vjb25k
LgorICAgIGludCBzZWNvbmRzID0gKG1pY3Jvc2Vjb25kcyArIDk5OTk5OSkgLyAxMDAwMDAwOwor
ICAgIHNsZWVwKHNlY29uZHMpOworICAgIHJldHVybiBzZWNvbmRzICogMTAwMDAwMDsKKyNlbmRp
ZgorfQorCisvLyBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgKFVUQykuCitzdGF0
aWMgaW50IGNocm9taXVtQ3VycmVudFRpbWUoc3FsaXRlM192ZnMqLCBkb3VibGUqIG5vdykKK3sK
KyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsOworICAgIGdldHRpbWVvZmRheSgmdGltZXZhbCwg
MCk7CisgICAgKm5vdyA9IDI0NDA1ODcuNSArIHRpbWV2YWwudHZfc2VjIC8gODY0MDAuMCArIHRp
bWV2YWwudHZfdXNlYyAvIDg2NDAwMDAwMDAwLjA7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFRo
aXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTUUxpdGUgY29yZS4KK3N0YXRpYyBpbnQgY2hy
b21pdW1HZXRMYXN0RXJyb3Ioc3FsaXRlM192ZnMqLCBpbnQsIGNoYXIqKQoreworICAgIHJldHVy
biAwOworfQorCisvLyBTYW1lIGFzIE1BWF9QQVRITkFNRSBmcm9tIHNxbGl0ZSdzIG9zX3VuaXgu
Yy4KK3N0YXRpYyBjb25zdCBpbnQgQ2hyb21pdW1NYXhQYXRobmFtZSA9IDUxMjsKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCiB2b2lkIFNRTGl0ZUZpbGVTeXN0ZW06OnJlZ2lzdGVyU1FMaXRlVkZT
KCkKIHsKLSAgICBzcWxpdGUzX3ZmcyogdW5peF92ZnMgPSBzcWxpdGUzX3Zmc19maW5kKCJ1bml4
Iik7CiAgICAgc3RhdGljIHNxbGl0ZTNfdmZzIGNocm9taXVtX3ZmcyA9IHsKICAgICAgICAgMSwK
LSAgICAgICAgdW5peF92ZnMtPnN6T3NGaWxlLAotICAgICAgICB1bml4X3Zmcy0+bXhQYXRobmFt
ZSwKKyAgICAgICAgc2l6ZW9mKENocm9taXVtRmlsZSksCisgICAgICAgIENocm9taXVtTWF4UGF0
aG5hbWUsCiAgICAgICAgIDAsCiAgICAgICAgICJjaHJvbWl1bV92ZnMiLAotICAgICAgICB1bml4
X3Zmcy0+cEFwcERhdGEsCisgICAgICAgIDAsCiAgICAgICAgIGNocm9taXVtT3BlbiwKICAgICAg
ICAgY2hyb21pdW1EZWxldGUsCiAgICAgICAgIGNocm9taXVtQWNjZXNzLAogICAgICAgICBjaHJv
bWl1bUZ1bGxQYXRobmFtZSwKICAgICAgICAgY2hyb21pdW1EbE9wZW4sCi0gICAgICAgIHVuaXhf
dmZzLT54RGxFcnJvciwKLSAgICAgICAgdW5peF92ZnMtPnhEbFN5bSwKLSAgICAgICAgdW5peF92
ZnMtPnhEbENsb3NlLAotICAgICAgICB1bml4X3Zmcy0+eFJhbmRvbW5lc3MsCi0gICAgICAgIHVu
aXhfdmZzLT54U2xlZXAsCi0gICAgICAgIHVuaXhfdmZzLT54Q3VycmVudFRpbWUsCi0gICAgICAg
IHVuaXhfdmZzLT54R2V0TGFzdEVycm9yCisgICAgICAgIGNocm9taXVtRGxFcnJvciwKKyAgICAg
ICAgY2hyb21pdW1EbFN5bSwKKyAgICAgICAgY2hyb21pdW1EbENsb3NlLAorICAgICAgICBjaHJv
bWl1bVJhbmRvbW5lc3MsCisgICAgICAgIGNocm9taXVtU2xlZXAsCisgICAgICAgIGNocm9taXVt
Q3VycmVudFRpbWUsCisgICAgICAgIGNocm9taXVtR2V0TGFzdEVycm9yCiAgICAgfTsKICAgICBz
cWxpdGUzX3Zmc19yZWdpc3RlcigmY2hyb21pdW1fdmZzLCAwKTsKIH0K
</data>
<flag name="review"
          id="57527"
          type_id="1"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68364</attachid>
            <date>2010-09-22 06:57:59 -0700</date>
            <delta_ts>2012-03-27 12:48:17 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>41833</size>
            <attacher name="Paweł Hajdan, Jr.">phajdan.jr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Nzg0NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTYgQEAKKzIwMTAtMDktMjAgIFBhd2VsIEhhamRhbiAgPHBoYWpkYW4uanJAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIE1vdmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNocm9taXVtX3ZmcyB0byB3ZWJraXQgZm9y
IFBPU0lYLgorICAgICAgICBUaGlzIGFsbG93cyB1cyB0byBsaW5rIENocm9tZSB3aXRoIHN5c3Rl
bS1wcm92aWRlZCBTUUxpdGUgb24gTGludXguCisgICAgICAgIFNlZSBhbHNvIGh0dHA6Ly9jb2Rl
Lmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyMjA4LgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDU0MTYKKworICAgICAgICBO
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwvY2hyb21pdW0vU1FMaXRlRmls
ZVN5c3RlbUNocm9taXVtUG9zaXguY3BwOgorICAgICAgICAoc3FsaXRlRXJyb3JGcm9tUG9zaXhF
cnJvcik6CisgICAgICAgIChyZWxlYXNlTG9ja0luZm8pOgorICAgICAgICAocmVsZWFzZU9wZW5J
bmZvKToKKyAgICAgICAgKGZpbmRMb2NrSW5mbyk6CisgICAgICAgIChjaHJvbWl1bUNoZWNrUmVz
ZXJ2ZWRMb2NrKToKKyAgICAgICAgKHJhbmdlTG9jayk6CisgICAgICAgIChjaHJvbWl1bUxvY2sp
OgorICAgICAgICAoY2xvc2VQZW5kaW5nRmRzKToKKyAgICAgICAgKGNocm9taXVtVW5sb2NrKToK
KyAgICAgICAgKGNocm9taXVtQ2xvc2VOb0xvY2spOgorICAgICAgICAoY2hyb21pdW1DbG9zZSk6
CisgICAgICAgIChjaHJvbWl1bUNoZWNrUmVzZXJ2ZWRMb2NrTm9vcCk6CisgICAgICAgIChjaHJv
bWl1bUxvY2tOb29wKToKKyAgICAgICAgKGNocm9taXVtVW5sb2NrTm9vcCk6CisgICAgICAgIChz
ZWVrQW5kUmVhZCk6CisgICAgICAgIChjaHJvbWl1bVJlYWQpOgorICAgICAgICAoc2Vla0FuZFdy
aXRlKToKKyAgICAgICAgKGNocm9taXVtV3JpdGUpOgorICAgICAgICAoc3luY1dyYXBwZXIpOgor
ICAgICAgICAoY2hyb21pdW1TeW5jKToKKyAgICAgICAgKGNocm9taXVtVHJ1bmNhdGUpOgorICAg
ICAgICAoY2hyb21pdW1GaWxlU2l6ZSk6CisgICAgICAgIChjaHJvbWl1bUZpbGVDb250cm9sKToK
KyAgICAgICAgKGNocm9taXVtU2VjdG9yU2l6ZSk6CisgICAgICAgIChjaHJvbWl1bURldmljZUNo
YXJhY3RlcmlzdGljcyk6CisgICAgICAgIChmaWxsSW5DaHJvbWl1bUZpbGUpOgorICAgICAgICAo
ZmluZFJldXNhYmxlRmQpOgorICAgICAgICAoY2hyb21pdW1PcGVuKToKKyAgICAgICAgKGNocm9t
aXVtRGVsZXRlKToKKyAgICAgICAgKGNocm9taXVtQWNjZXNzKToKKyAgICAgICAgKGNocm9taXVt
RnVsbFBhdGhuYW1lKToKKyAgICAgICAgKGNocm9taXVtRGxPcGVuKToKKyAgICAgICAgKGNocm9t
aXVtRGxFcnJvcik6CisgICAgICAgIChjaHJvbWl1bURsU3ltKToKKyAgICAgICAgKGNocm9taXVt
RGxDbG9zZSk6CisgICAgICAgIChjaHJvbWl1bVJhbmRvbW5lc3MpOgorICAgICAgICAoY2hyb21p
dW1TbGVlcCk6CisgICAgICAgIChjaHJvbWl1bUN1cnJlbnRUaW1lKToKKyAgICAgICAgKGNocm9t
aXVtR2V0TGFzdEVycm9yKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZUZpbGVTeXN0ZW06OnJl
Z2lzdGVyU1FMaXRlVkZTKToKKwogMjAxMC0wOS0yMCAgUGF2ZWwgUG9kaXZpbG92ICA8cG9kaXZp
bG92QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBQYXZlbCBGZWxkbWFuLgpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvY2hyb21pdW0vU1FMaXRlRmlsZVN5c3RlbUNocm9t
aXVtUG9zaXguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL2Nocm9taXVt
L1NRTGl0ZUZpbGVTeXN0ZW1DaHJvbWl1bVBvc2l4LmNwcAkocmV2aXNpb24gNjc4NDQpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3NxbC9jaHJvbWl1bS9TUUxpdGVGaWxlU3lzdGVtQ2hyb21pdW1Qb3Np
eC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDIzICszNCw5MzcgQEAKICNpbmNsdWRlICJDaHJv
bWl1bUJyaWRnZS5oIgogI2luY2x1ZGUgPHNxbGl0ZTMuaD4KIAorI2luY2x1ZGUgPGVycm5vLmg+
CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMv
c3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAj
aW5jbHVkZSA8dW5pc3RkLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCi0vLyBEZWZp
bmVkIGluIENocm9taXVtJ3MgY29kZWJhc2UgaW4gdGhpcmRfcGFydHkvc3FsaXRlL3NyYy9vc191
bml4LmMKLWV4dGVybiAiQyIgewotdm9pZCBjaHJvbWl1bV9zcWxpdGUzX2luaXRpYWxpemVfdW5p
eF9zcWxpdGUzX2ZpbGUoc3FsaXRlM19maWxlKiBmaWxlKTsKLWludCBjaHJvbWl1bV9zcWxpdGUz
X2ZpbGxfaW5fdW5peF9zcWxpdGUzX2ZpbGUoc3FsaXRlM192ZnMqIHZmcywgaW50IGZkLCBpbnQg
ZGlyZmQsIHNxbGl0ZTNfZmlsZSogZmlsZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBub0xv
Y2spOwotaW50IGNocm9taXVtX3NxbGl0ZTNfZ2V0X3JldXNhYmxlX2ZpbGVfaGFuZGxlKHNxbGl0
ZTNfZmlsZSogZmlsZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBmbGFncywgaW50KiBmZCk7
Ci12b2lkIGNocm9taXVtX3NxbGl0ZTNfdXBkYXRlX3JldXNhYmxlX2ZpbGVfaGFuZGxlKHNxbGl0
ZTNfZmlsZSogZmlsZSwgaW50IGZkLCBpbnQgZmxhZ3MpOwotdm9pZCBjaHJvbWl1bV9zcWxpdGUz
X2Rlc3Ryb3lfcmV1c2FibGVfZmlsZV9oYW5kbGUoc3FsaXRlM19maWxlKiBmaWxlKTsKKy8vIENo
cm9taXVtJ3MgUG9zaXggaW1wbGVtZW50YXRpb24gb2YgU1FMaXRlIFZGUy4KKy8vIFRoaXMgaXMg
aGVhdmlseSBiYXNlZCBvbiBTUUxpdGUncyBvc191bml4LmMsCisvLyB3aXRob3V0IHBhcnRzIHdl
IGRvbid0IG5lZWQuCisKKy8vIElkZW50aWZpZXMgYSBmaWxlIGJ5IGl0cyBkZXZpY2UgbnVtYmVy
IGFuZCBpbm9kZS4KK3N0cnVjdCBDaHJvbWl1bUZpbGVJZCB7CisgICAgZGV2X3QgZGV2OyAvLyBE
ZXZpY2UgbnVtYmVyLgorICAgIGlub190IGlubzsgLy8gSW5vZGUgbnVtYmVyLgorfTsKKworLy8g
SW5mb3JtYXRpb24gYWJvdXQgZmlsZSBsb2NrcyAob25lIHBlciBvcGVuIGlub2RlKS4gTm90ZSB0
aGF0IG1hbnkgb3BlbgorLy8gZmlsZSBkZXNjcmlwdG9ycyBtYXkgcmVmZXIgdG8gdGhlIHNhbWUg
aW5vZGUuCitzdHJ1Y3QgQ2hyb21pdW1Mb2NrSW5mbyB7CisgICAgQ2hyb21pdW1GaWxlSWQgbG9j
a0tleTsgLy8gRmlsZSBpZGVudGlmaWVyLgorICAgIGludCBjbnQ7IC8vIE51bWJlciBvZiBzaGFy
ZWQgbG9ja3MgaGVsZC4KKyAgICBpbnQgbG9ja3R5cGU7IC8vIFR5cGUgb2YgdGhlIGxvY2suCisg
ICAgaW50IG5SZWY7IC8vIFJlZmVyZW5jZSBjb3VudC4KKworICAgIC8vIERvdWJsZS1saW5rZWQg
bGlzdCBwb2ludGVycy4KKyAgICBDaHJvbWl1bUxvY2tJbmZvKiBwTmV4dDsgCisgICAgQ2hyb21p
dW1Mb2NrSW5mbyogcFByZXY7Cit9OworCisvLyBJbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgZGVz
Y3JpcHRvciB0aGF0IGNhbm5vdCBiZSBjbG9zZWQgaW1tZWRpYXRlbHkuCitzdHJ1Y3QgQ2hyb21p
dW1VbnVzZWRGZCB7CisgICAgaW50IGZkOyAvLyBGaWxlIGRlc2NyaXB0b3IuCisgICAgaW50IGZs
YWdzOyAvLyBGbGFncyB0aGlzIGZpbGUgZGVzY3JpcHRvciB3YXMgb3BlbmVkIHdpdGguCisgICAg
Q2hyb21pdW1VbnVzZWRGZCogcE5leHQ7IC8vIE5leHQgdW51c2VkIGZpbGUgZGVzY3JpcHRvciBv
biB0aGUgc2FtZSBmaWxlLgorfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gb3BlbiBpbm9k
ZS4gV2hlbiB3ZSB3YW50IHRvIGNsb3NlIGFuIGlub2RlCisvLyB0aGF0IHN0aWxsIGhhcyBsb2Nr
cywgd2UgZGVmZXIgdGhlIGNsb3NlIHVudGlsIGFsbCBsb2NrcyBhcmUgY2xlYXJlZC4KK3N0cnVj
dCBDaHJvbWl1bU9wZW5JbmZvIHsKKyAgICBDaHJvbWl1bUZpbGVJZCBmaWxlSWQ7IC8vIFRoZSBs
b29rdXAga2V5LgorICAgIGludCBuUmVmOyAvLyBSZWZlcmVuY2UgY291bnQuCisgICAgaW50IG5M
b2NrOyAvLyBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgbG9ja3MuCisgICAgQ2hyb21pdW1VbnVzZWRG
ZCogcFVudXNlZDsgLy8gTGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzIHRvIGNsb3NlLgorCisgICAg
Ly8gRG91YmxlLWxpbmtlZCBsaXN0IHBvaW50ZXJzLgorICAgIENocm9taXVtT3BlbkluZm8qIHBO
ZXh0OworICAgIENocm9taXVtT3BlbkluZm8qIHBQcmV2OworfTsKKworLy8gS2VlcCB0cmFjayBv
ZiBsb2NrcyBhbmQgaW5vZGVzIGluIGRvdWJsZS1saW5rZWQgbGlzdHMuCitzdGF0aWMgc3RydWN0
IENocm9taXVtTG9ja0luZm8qIGxvY2tMaXN0ID0gMDsKK3N0YXRpYyBzdHJ1Y3QgQ2hyb21pdW1P
cGVuSW5mbyogb3Blbkxpc3QgPSAwOworCisvLyBFeHRlbnNpb24gb2Ygc3FsaXRlM19maWxlIHNw
ZWNpZmljIHRvIHRoZSBjaHJvbWl1bSBWRlMuCitzdHJ1Y3QgQ2hyb21pdW1GaWxlIHsKKyAgICBz
cWxpdGUzX2lvX21ldGhvZHMgY29uc3QqIHBNZXRob2Q7IC8vIEltcGxlbWVudGF0aW9uIG9mIHNx
bGl0ZTNfZmlsZS4KKyAgICBDaHJvbWl1bU9wZW5JbmZvKiBwT3BlbjsgLy8gSW5mb3JtYXRpb24g
YWJvdXQgYWxsIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBmaWxlLgorICAgIENocm9t
aXVtTG9ja0luZm8qIHBMb2NrOyAvLyBJbmZvcm1hdGlvbiBhYm91dCBhbGwgbG9ja3MgZm9yIHRo
aXMgZmlsZS4KKyAgICBpbnQgaDsgLy8gRmlsZSBkZXNjcmlwdG9yLgorICAgIGludCBkaXJmZDsg
Ly8gRmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSBkaXJlY3RvcnkuCisgICAgdW5zaWduZWQg
Y2hhciBsb2NrdHlwZTsgLy8gVHlwZSBvZiB0aGUgbG9jayB1c2VkIGZvciB0aGlzIGZpbGUuCisg
ICAgaW50IGxhc3RFcnJubzsgLy8gVmFsdWUgb2YgZXJybm8gZm9yIGxhc3Qgb3BlcmF0aW9uIG9u
IHRoaXMgZmlsZS4KKyAgICBDaHJvbWl1bVVudXNlZEZkKiBwVW51c2VkOyAvLyBJbmZvcm1hdGlv
biBhYm91dCB1bnVzZWQgZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBmaWxlLgorfTsKKworLy8g
VGhlIGZvbGxvd2luZyBjb25zdGFudHMgc3BlY2lmeSB0aGUgcmFuZ2Ugb2YgYnl0ZXMgdXNlZCBm
b3IgbG9ja2luZy4KKy8vIFNRTGl0ZVNoYXJlZFNpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBh
dmFpbGFibGUgaW4gdGhlIHBvb2wgZnJvbSB3aGljaAorLy8gYSByYW5kb20gYnl0ZSBpcyBzZWxl
Y3RlZCBmb3IgYSBzaGFyZWQgbG9jay4gIFRoZSBwb29sIG9mIGJ5dGVzIGZvcgorLy8gc2hhcmVk
IGxvY2tzIGJlZ2lucyBhdCBTUUxpdGVTaGFyZWRGaXJzdEJ5dGUuIAorLy8gVGhlIHZhbHVlcyBh
cmUgdGhlIHNhbWUgYXMgdXNlZCBieSBTUUxpdGUgZm9yIGNvbXBhdGliaWxpdHkuCitzdGF0aWMg
Y29uc3Qgb2ZmX3QgU1FMaXRlUGVuZGluZ0J5dGUgPSAweDQwMDAwMDAwOworc3RhdGljIGNvbnN0
IG9mZl90IFNRTGl0ZVJlc2VydmVkQnl0ZSA9IFNRTGl0ZVBlbmRpbmdCeXRlICsgMTsKK3N0YXRp
YyBjb25zdCBvZmZfdCBTUUxpdGVTaGFyZWRGaXJzdEJ5dGUgPSBTUUxpdGVQZW5kaW5nQnl0ZSAr
IDI7CitzdGF0aWMgY29uc3Qgb2ZmX3QgU1FMaXRlU2hhcmVkU2l6ZSA9IDUxMDsKKworLy8gTWFw
cyBhIFBPU0lYIGVycm9yIGNvZGUgdG8gYW4gU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50
IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IoaW50IHBvc2l4RXJyb3IsIGludCBzcWxpdGVJT0Vy
cikKK3sKKyAgICBzd2l0Y2ggKHBvc2l4RXJyb3IpIHsKKyAgICBjYXNlIDA6IAorICAgICAgICBy
ZXR1cm4gU1FMSVRFX09LOworICAgIGNhc2UgRUFHQUlOOgorICAgIGNhc2UgRVRJTUVET1VUOgor
ICAgIGNhc2UgRUJVU1k6CisgICAgY2FzZSBFSU5UUjoKKyAgICBjYXNlIEVOT0xDSzogIAorICAg
ICAgICByZXR1cm4gU1FMSVRFX0JVU1k7CisgICAgY2FzZSBFQUNDRVM6IAorICAgICAgICAvLyBF
QUNDRVMgaXMgbGlrZSBFQUdBSU4gZHVyaW5nIGxvY2tpbmcgb3BlcmF0aW9ucy4KKyAgICAgICAg
aWYgKChzcWxpdGVJT0VyciA9PSBTUUxJVEVfSU9FUlJfTE9DSykgfHwKKyAgICAgICAgICAgIChz
cWxpdGVJT0VyciA9PSBTUUxJVEVfSU9FUlJfVU5MT0NLKSB8fAorICAgICAgICAgICAgKHNxbGl0
ZUlPRXJyID09IFNRTElURV9JT0VSUl9SRExPQ0spIHx8CisgICAgICAgICAgICAoc3FsaXRlSU9F
cnIgPT0gU1FMSVRFX0lPRVJSX0NIRUNLUkVTRVJWRURMT0NLKSkKKyAgICAgICAgICAgIHJldHVy
biBTUUxJVEVfQlVTWTsKKyAgICAgICAgcmV0dXJuIFNRTElURV9QRVJNOworICAgIGNhc2UgRVBF
Uk06IAorICAgICAgICByZXR1cm4gU1FMSVRFX1BFUk07CisgICAgY2FzZSBFREVBRExLOgorICAg
ICAgICByZXR1cm4gU1FMSVRFX0lPRVJSX0JMT0NLRUQ7CisgICAgZGVmYXVsdDogCisgICAgICAg
IHJldHVybiBzcWxpdGVJT0VycjsKKyAgICB9Cit9CisKKy8vIFJlbGVhc2VzIGEgQ2hyb21pdW1M
b2NrSW5mbyBzdHJ1Y3R1cmUgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZmluZExvY2tJbmZvKCku
CitzdGF0aWMgdm9pZCByZWxlYXNlTG9ja0luZm8oQ2hyb21pdW1Mb2NrSW5mbyogcExvY2spCit7
CisgICAgaWYgKCFwTG9jaykKKyAgICAgICAgcmV0dXJuOworCisgICAgcExvY2stPm5SZWYtLTsK
KyAgICBpZiAocExvY2stPm5SZWYgPiAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocExv
Y2stPnBQcmV2KSB7CisgICAgICAgIEFTU0VSVChwTG9jay0+cFByZXYtPnBOZXh0ID09IHBMb2Nr
KTsKKyAgICAgICAgcExvY2stPnBQcmV2LT5wTmV4dCA9IHBMb2NrLT5wTmV4dDsKKyAgICB9IGVs
c2UgeworICAgICAgICBBU1NFUlQobG9ja0xpc3QgPT0gcExvY2spOworICAgICAgICBsb2NrTGlz
dCA9IHBMb2NrLT5wTmV4dDsKKyAgICB9CisgICAgaWYgKHBMb2NrLT5wTmV4dCkgeworICAgICAg
ICBBU1NFUlQocExvY2stPnBOZXh0LT5wUHJldiA9PSBwTG9jayk7CisgICAgICAgIHBMb2NrLT5w
TmV4dC0+cFByZXYgPSBwTG9jay0+cFByZXY7CisgICAgfQorCisgICAgc3FsaXRlM19mcmVlKHBM
b2NrKTsKK30KKworLy8gUmVsZWFzZXMgYSBDaHJvbWl1bU9wZW5JbmZvIHN0cnVjdHVyZSBwcmV2
aW91c2x5IGFsbG9jYXRlZCBieSBmaW5kTG9ja0luZm8oKS4KK3N0YXRpYyB2b2lkIHJlbGVhc2VP
cGVuSW5mbyhDaHJvbWl1bU9wZW5JbmZvKiBwT3BlbikKK3sKKyAgICBpZiAoIXBPcGVuKQorICAg
ICAgICByZXR1cm47CisKKyAgICBwT3Blbi0+blJlZi0tOworICAgIGlmIChwT3Blbi0+blJlZiA+
IDApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwT3Blbi0+cFByZXYpIHsKKyAgICAgICAg
QVNTRVJUKHBPcGVuLT5wUHJldi0+cE5leHQgPT0gcE9wZW4pOworICAgICAgICBwT3Blbi0+cFBy
ZXYtPnBOZXh0ID0gcE9wZW4tPnBOZXh0OworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChv
cGVuTGlzdCA9PSBwT3Blbik7CisgICAgICAgIG9wZW5MaXN0ID0gcE9wZW4tPnBOZXh0OworICAg
IH0KKyAgICBpZiAocE9wZW4tPnBOZXh0KSB7CisgICAgICAgIEFTU0VSVChwT3Blbi0+cE5leHQt
PnBQcmV2ID09IHBPcGVuKTsKKyAgICAgICAgcE9wZW4tPnBOZXh0LT5wUHJldiA9IHBPcGVuLT5w
UHJldjsKKyAgICB9CisKKyAgICBBU1NFUlQoIXBPcGVuLT5wVW51c2VkKTsgLy8gTWFrZSBzdXJl
IHdlJ3JlIG5vdCBsZWFraW5nIG1lbW9yeSBhbmQgZmlsZSBkZXNjcmlwdG9ycy4KKworICAgIHNx
bGl0ZTNfZnJlZShwT3Blbik7Cit9CisKKy8vIExvY2F0ZXMgQ2hyb21pdW1Mb2NrSW5mbyBhbmQg
Q2hyb21pdW1PcGVuSW5mbyBmb3IgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIChjcmVhdGluZyBuZXcg
b25lcyBpZiBuZWVkZWQpLgorLy8gUmV0dXJucyBhIFNRTGl0ZSBlcnJvciBjb2RlLgorc3RhdGlj
IGludCBmaW5kTG9ja0luZm8oQ2hyb21pdW1GaWxlKiBwRmlsZSwgQ2hyb21pdW1Mb2NrSW5mbyoq
IHBwTG9jaywgQ2hyb21pdW1PcGVuSW5mbyoqIHBwT3BlbikKK3sKKyAgICBpbnQgZmQgPSBwRmls
ZS0+aDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGludCByYyA9IGZzdGF0KGZkLCAm
c3RhdGJ1Zik7CisgICAgaWYgKHJjKSB7CisgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJu
bzsKKyNpZmRlZiBFT1ZFUkZMT1cKKyAgICAgICAgaWYgKHBGaWxlLT5sYXN0RXJybm8gPT0gRU9W
RVJGTE9XKQorICAgICAgICAgICAgcmV0dXJuIFNRTElURV9OT0xGUzsKKyNlbmRpZgorICAgICAg
ICByZXR1cm4gU1FMSVRFX0lPRVJSOworICAgIH0KKworI2lmIFBMQVRGT1JNKE1BQykKKyAgICAv
LyBPbiBPUyBYIG9uIGFuIG1zZG9zL2ZhdCBmaWxlc3lzdGVtcywgdGhlIGlub2RlIG51bWJlciBp
cyByZXBvcnRlZAorICAgIC8vIGluY29ycmVjdGx5IGZvciB6ZXJvLXNpemUgZmlsZXMuIFNlZSBo
dHRwOi8vd3d3LnNxbGl0ZS5vcmcvY3ZzdHJhYy90a3R2aWV3P3RuPTMyNjAuCisgICAgLy8gVG8g
d29yayBhcm91bmQgdGhpcyBwcm9ibGVtIHdlIGFsd2F5cyBpbmNyZWFzZSB0aGUgZmlsZSBzaXpl
IHRvIDEgYnkgd3JpdGluZyBhIHNpbmdsZSBieXRlCisgICAgLy8gcHJpb3IgdG8gYWNjZXNzaW5n
IHRoZSBpbm9kZSBudW1iZXIuIFRoZSBvbmUgYnl0ZSB3cml0dGVuIGlzIGFuIEFTQ0lJICdTJyBj
aGFyYWN0ZXIgd2hpY2gKKyAgICAvLyBhbHNvIGhhcHBlbnMgdG8gYmUgdGhlIGZpcnN0IGJ5dGUg
aW4gdGhlIGhlYWRlciBvZiBldmVyeSBTUUxpdGUgZGF0YWJhc2UuICBJbiB0aGlzIHdheSwKKyAg
ICAvLyBpZiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHN1Y2ggdGhhdCBhbm90aGVyIHRocmVh
ZCBoYXMgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGZpcnN0IHBhZ2UKKyAgICAvLyBvZiB0aGUgZGF0
YWJhc2UsIG5vIGRhbWFnZSBpcyBkb25lLgorICAgIGlmICghc3RhdGJ1Zi5zdF9zaXplKSB7Cisg
ICAgICAgIHJjID0gd3JpdGUoZmQsICJTIiwgMSk7CisgICAgICAgIGlmIChyYyAhPSAxKQorICAg
ICAgICAgICAgcmV0dXJuIFNRTElURV9JT0VSUjsKKyAgICAgICAgcmMgPSBmc3RhdChmZCwgJnN0
YXRidWYpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8g
PSBlcnJubzsKKyAgICAgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlI7CisgICAgICAgIH0KKyAg
ICB9CisjZW5kaWYKKworICAgIENocm9taXVtRmlsZUlkIGZpbGVJZDsKKyAgICBtZW1zZXQoJmZp
bGVJZCwgMCwgc2l6ZW9mKGZpbGVJZCkpOworICAgIGZpbGVJZC5kZXYgPSBzdGF0YnVmLnN0X2Rl
djsKKyAgICBmaWxlSWQuaW5vID0gc3RhdGJ1Zi5zdF9pbm87CisKKyAgICBDaHJvbWl1bUxvY2tJ
bmZvKiBwTG9jayA9IDA7CisKKyAgICBpZiAocHBMb2NrKSB7CisgICAgICAgIHBMb2NrID0gbG9j
a0xpc3Q7CisgICAgICAgIHdoaWxlIChwTG9jayAmJiBtZW1jbXAoJmZpbGVJZCwgJnBMb2NrLT5s
b2NrS2V5LCBzaXplb2YoZmlsZUlkKSkpCisgICAgICAgICAgICBwTG9jayA9IHBMb2NrLT5wTmV4
dDsKKyAgICAgICAgaWYgKHBMb2NrKQorICAgICAgICAgICAgcExvY2stPm5SZWYrKzsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICBwTG9jayA9IHN0YXRpY19jYXN0PENocm9taXVtTG9ja0lu
Zm8qPihzcWxpdGUzX21hbGxvYyhzaXplb2YoKnBMb2NrKSkpOworICAgICAgICAgICAgaWYgKCFw
TG9jaykKKyAgICAgICAgICAgICAgICByZXR1cm4gU1FMSVRFX05PTUVNOworICAgICAgICAgICAg
cExvY2stPmxvY2tLZXkgPSBmaWxlSWQ7CisgICAgICAgICAgICBwTG9jay0+blJlZiA9IDE7Cisg
ICAgICAgICAgICBwTG9jay0+Y250ID0gMDsKKyAgICAgICAgICAgIHBMb2NrLT5sb2NrdHlwZSA9
IDA7CisgICAgICAgICAgICBwTG9jay0+cE5leHQgPSBsb2NrTGlzdDsKKyAgICAgICAgICAgIHBM
b2NrLT5wUHJldiA9IDA7CisgICAgICAgICAgICBpZiAobG9ja0xpc3QpCisgICAgICAgICAgICAg
ICAgbG9ja0xpc3QtPnBQcmV2ID0gcExvY2s7CisgICAgICAgICAgICBsb2NrTGlzdCA9IHBMb2Nr
OworICAgICAgICB9CisgICAgICAgICpwcExvY2sgPSBwTG9jazsKKyAgICB9CisKKyAgICBpZiAo
cHBPcGVuKSB7CisgICAgICAgIENocm9taXVtT3BlbkluZm8qIHBPcGVuID0gb3Blbkxpc3Q7Cisg
ICAgICAgIHdoaWxlIChwT3BlbiAmJiBtZW1jbXAoJmZpbGVJZCwgJnBPcGVuLT5maWxlSWQsIHNp
emVvZihmaWxlSWQpKSkKKyAgICAgICAgICAgIHBPcGVuID0gcE9wZW4tPnBOZXh0OworICAgICAg
ICBpZiAocE9wZW4pCisgICAgICAgICAgICBwT3Blbi0+blJlZisrOworICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgIHBPcGVuID0gc3RhdGljX2Nhc3Q8Q2hyb21pdW1PcGVuSW5mbyo+KHNxbGl0
ZTNfbWFsbG9jKHNpemVvZigqcE9wZW4pKSk7CisgICAgICAgICAgICBpZiAoIXBPcGVuKSB7Cisg
ICAgICAgICAgICAgICAgcmVsZWFzZUxvY2tJbmZvKHBMb2NrKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gU1FMSVRFX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KHBP
cGVuLCAwLCBzaXplb2YoKnBPcGVuKSk7CisgICAgICAgICAgICBwT3Blbi0+ZmlsZUlkID0gZmls
ZUlkOworICAgICAgICAgICAgcE9wZW4tPm5SZWYgPSAxOworICAgICAgICAgICAgcE9wZW4tPnBO
ZXh0ID0gb3Blbkxpc3Q7CisgICAgICAgICAgICBpZiAob3Blbkxpc3QpCisgICAgICAgICAgICAg
ICAgb3Blbkxpc3QtPnBQcmV2ID0gcE9wZW47CisgICAgICAgICAgICBvcGVuTGlzdCA9IHBPcGVu
OworICAgICAgICB9CisgICAgICAgICpwcE9wZW4gPSBwT3BlbjsKKyAgICB9CisKKyAgICByZXR1
cm4gcmM7Cit9CisKKy8vIENoZWNrcyBpZiB0aGVyZSBpcyBhIFJFU0VSVkVEIGxvY2sgaGVsZCBv
biB0aGUgc3BlY2lmaWVkIGZpbGUgYnkgdGhpcyBvciBhbnkgb3RoZXIgcHJvY2Vzcy4KKy8vIElm
IHRoZSBsb2NrIGlzIGhlbGQsIHNldHMgcFJlc091dCB0byBhIG5vbi16ZXJvIHZhbHVlLiBSZXR1
cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGNocm9taXVtQ2hlY2tSZXNlcnZl
ZExvY2soc3FsaXRlM19maWxlKiBpZCwgaW50KiBwUmVzT3V0KQoreworICAgIENocm9taXVtRmls
ZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAgICBBU1NF
UlQocEZpbGUpOworCisgICAgLy8gTG9vayBmb3IgbG9ja3MgaGVsZCBieSB0aGlzIHByb2Nlc3Mu
CisgICAgaW50IHJlc2VydmVkID0gMDsKKyAgICBpZiAocEZpbGUtPnBMb2NrLT5sb2NrdHlwZSA+
IFNRTElURV9MT0NLX1NIQVJFRCkKKyAgICAgICAgcmVzZXJ2ZWQgPSAxOworCisgICAgLy8gTG9v
ayBmb3IgbG9ja3MgaGVsZCBieSBvdGhlciBwcm9jZXNzZXMuCisgICAgaW50IHJjID0gU1FMSVRF
X09LOworICAgIGlmICghcmVzZXJ2ZWQpIHsKKyAgICAgICAgc3RydWN0IGZsb2NrIGxvY2s7Cisg
ICAgICAgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKyAgICAgICAgbG9jay5sX3N0YXJ0ID0g
U1FMaXRlUmVzZXJ2ZWRCeXRlOworICAgICAgICBsb2NrLmxfbGVuID0gMTsKKyAgICAgICAgbG9j
ay5sX3R5cGUgPSBGX1dSTENLOworICAgICAgICBpZiAoLTEgPT0gZmNudGwocEZpbGUtPmgsIEZf
R0VUTEssICZsb2NrKSkgeworICAgICAgICAgICAgaW50IHRFcnJubyA9IGVycm5vOworICAgICAg
ICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRFcnJubywgU1FMSVRFX0lPRVJS
X0NIRUNLUkVTRVJWRURMT0NLKTsKKyAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSB0RXJy
bm87CisgICAgICAgIH0gZWxzZSBpZiAobG9jay5sX3R5cGUgIT0gRl9VTkxDSykKKyAgICAgICAg
ICAgIHJlc2VydmVkID0gMTsKKyAgICB9CisKKyAgICAqcFJlc091dCA9IHJlc2VydmVkOworICAg
IHJldHVybiByYzsKK30KKworLy8gUGVyZm9ybXMgYSBmaWxlIGxvY2tpbmcgb3BlcmF0aW9uIG9u
IGEgcmFuZ2Ugb2YgYnl0ZXMgaW4gYSBmaWxlLgorLy8gVGhlIHxvcHwgcGFyYW1ldGVyIHNob3Vs
ZCBiZSBvbmUgb2YgRl9SRkxDSywgRl9XUkxDSyBvciBGX1VOTENLLgorLy8gUmV0dXJucyBhIFVu
aXggZXJyb3IgY29kZSwgYW5kIGFsc28gd3JpdGVzIGl0IHRvIHBFcnJjb2RlLgorc3RhdGljIGlu
dCByYW5nZUxvY2soQ2hyb21pdW1GaWxlKiBwRmlsZSwgaW50IG9wLCBpbnQqIHBFcnJjb2RlKQor
eworICAgIHN0cnVjdCBmbG9jayBsb2NrOworICAgIGxvY2subF90eXBlID0gb3A7CisgICAgbG9j
ay5sX3N0YXJ0ID0gU1FMaXRlU2hhcmVkRmlyc3RCeXRlOworICAgIGxvY2subF93aGVuY2UgPSBT
RUVLX1NFVDsKKyAgICBsb2NrLmxfbGVuID0gU1FMaXRlU2hhcmVkU2l6ZTsKKyAgICBpbnQgcmMg
PSBmY250bChwRmlsZS0+aCwgRl9TRVRMSywgJmxvY2spOworICAgICpwRXJyY29kZSA9IGVycm5v
OworICAgIHJldHVybiByYzsKK30KKworLy8gTG9ja3MgdGhlIGZpbGUgd2l0aCB0aGUgbG9jayBz
cGVjaWZpZWQgYnkgcGFyYW1ldGVyIGxvY2t0eXBlIC0gb25lCisvLyBvZiB0aGUgZm9sbG93aW5n
OgorLy8KKy8vICAgICAoMSkgU1FMSVRFX0xPQ0tfU0hBUkVECisvLyAgICAgKDIpIFNRTElURV9M
T0NLX1JFU0VSVkVECisvLyAgICAgKDMpIFNRTElURV9MT0NLX1BFTkRJTkcKKy8vICAgICAoNCkg
U1FMSVRFX0xPQ0tfRVhDTFVTSVZFCisvLworLy8gU29tZXRpbWVzIHdoZW4gcmVxdWVzdGluZyBv
bmUgbG9jayBzdGF0ZSwgYWRkaXRpb25hbCBsb2NrIHN0YXRlcworLy8gYXJlIGluc2VydGVkIGlu
IGJldHdlZW4uICBUaGUgbG9ja2luZyBtaWdodCBmYWlsIG9uIG9uZSBvZiB0aGUgbGF0ZXIKKy8v
IHRyYW5zaXRpb25zIGxlYXZpbmcgdGhlIGxvY2sgc3RhdGUgZGlmZmVyZW50IGZyb20gd2hhdCBp
dCBzdGFydGVkIGJ1dAorLy8gc3RpbGwgc2hvcnQgb2YgaXRzIGdvYWwuICBUaGUgZm9sbG93aW5n
IGNoYXJ0IHNob3dzIHRoZSBhbGxvd2VkCisvLyB0cmFuc2l0aW9ucyBhbmQgdGhlIGluc2VydGVk
IGludGVybWVkaWF0ZSBzdGF0ZXM6CisvLworLy8gICAgVU5MT0NLRUQgLT4gU0hBUkVECisvLyAg
ICBTSEFSRUQgLT4gUkVTRVJWRUQKKy8vICAgIFNIQVJFRCAtPiAoUEVORElORykgLT4gRVhDTFVT
SVZFCisvLyAgICBSRVNFUlZFRCAtPiAoUEVORElORykgLT4gRVhDTFVTSVZFCisvLyAgICBQRU5E
SU5HIC0+IEVYQ0xVU0lWRQorc3RhdGljIGludCBjaHJvbWl1bUxvY2soc3FsaXRlM19maWxlKiBp
ZCwgaW50IGxvY2t0eXBlKQoreworICAgIC8vIFRvIG9idGFpbiBhIFNIQVJFRCBsb2NrLCBhIHJl
YWQtbG9jayBpcyBvYnRhaW5lZCBvbiB0aGUgJ3BlbmRpbmcKKyAgICAvLyBieXRlJy4gIElmIHRo
aXMgaXMgc3VjY2Vzc2Z1bCwgYSByYW5kb20gYnl0ZSBmcm9tIHRoZSAnc2hhcmVkIGJ5dGUKKyAg
ICAvLyByYW5nZScgaXMgcmVhZC1sb2NrZWQgYW5kIHRoZSBsb2NrIG9uIHRoZSAncGVuZGluZyBi
eXRlJyByZWxlYXNlZC4KKyAgICAvLworICAgIC8vIEEgcHJvY2VzcyBtYXkgb25seSBvYnRhaW4g
YSBSRVNFUlZFRCBsb2NrIGFmdGVyIGl0IGhhcyBhIFNIQVJFRCBsb2NrLgorICAgIC8vIEEgUkVT
RVJWRUQgbG9jayBpcyBpbXBsZW1lbnRlZCBieSBncmFiYmluZyBhIHdyaXRlLWxvY2sgb24gdGhl
CisgICAgLy8gJ3Jlc2VydmVkIGJ5dGUnLiAKKyAgICAvLworICAgIC8vIEEgcHJvY2VzcyBtYXkg
b25seSBvYnRhaW4gYSBQRU5ESU5HIGxvY2sgYWZ0ZXIgaXQgaGFzIG9idGFpbmVkIGEKKyAgICAv
LyBTSEFSRUQgbG9jay4gQSBQRU5ESU5HIGxvY2sgaXMgaW1wbGVtZW50ZWQgYnkgb2J0YWluaW5n
IGEgd3JpdGUtbG9jaworICAgIC8vIG9uIHRoZSAncGVuZGluZyBieXRlJy4gVGhpcyBlbnN1cmVz
IHRoYXQgbm8gbmV3IFNIQVJFRCBsb2NrcyBjYW4gYmUKKyAgICAvLyBvYnRhaW5lZCwgYnV0IGV4
aXN0aW5nIFNIQVJFRCBsb2NrcyBhcmUgYWxsb3dlZCB0byBwZXJzaXN0LiBBIHByb2Nlc3MKKyAg
ICAvLyBkb2VzIG5vdCBoYXZlIHRvIG9idGFpbiBhIFJFU0VSVkVEIGxvY2sgb24gdGhlIHdheSB0
byBhIFBFTkRJTkcgbG9jay4KKyAgICAvLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGFs
Z29yaXRobSBmb3Igcm9sbGluZyBiYWNrIGEgam91cm5hbCBmaWxlCisgICAgLy8gYWZ0ZXIgYSBj
cmFzaC4KKyAgICAvLworICAgIC8vIEFuIEVYQ0xVU0lWRSBsb2NrLCBvYnRhaW5lZCBhZnRlciBh
IFBFTkRJTkcgbG9jayBpcyBoZWxkLCBpcworICAgIC8vIGltcGxlbWVudGVkIGJ5IG9idGFpbmlu
ZyBhIHdyaXRlLWxvY2sgb24gdGhlIGVudGlyZSAnc2hhcmVkIGJ5dGUKKyAgICAvLyByYW5nZScu
IFNpbmNlIGFsbCBvdGhlciBsb2NrcyByZXF1aXJlIGEgcmVhZC1sb2NrIG9uIG9uZSBvZiB0aGUg
Ynl0ZXMKKyAgICAvLyB3aXRoaW4gdGhpcyByYW5nZSwgdGhpcyBlbnN1cmVzIHRoYXQgbm8gb3Ro
ZXIgbG9ja3MgYXJlIGhlbGQgb24gdGhlCisgICAgLy8gZGF0YWJhc2UuIAorCisgICAgaW50IHJj
ID0gU1FMSVRFX09LOworICAgIHN0cnVjdCBmbG9jayBsb2NrOworICAgIGludCBzID0gMDsKKyAg
ICBpbnQgdEVycm5vOworCisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nh
c3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7CisKKyAgICBDaHJvbWl1
bUxvY2tJbmZvKiBwTG9jayA9IHBGaWxlLT5wTG9jazsKKworICAgIC8vIElmIHRoZXJlIGlzIGFs
cmVhZHkgYSBsb2NrIG9mIHRoaXMgdHlwZSBvciBtb3JlIHJlc3RyaWN0aXZlLCBkbyBub3RoaW5n
LgorICAgIGlmIChwRmlsZS0+bG9ja3R5cGUgPj0gbG9ja3R5cGUpCisgICAgICAgIHJldHVybiBT
UUxJVEVfT0s7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgbmV2ZXIgbW92ZSBmcm9tIHVubG9ja2Vk
IHRvIGFueXRoaW5nIGhpZ2hlciB0aGFuIHNoYXJlZCBsb2NrLgorICAgIEFTU0VSVChwRmlsZS0+
bG9ja3R5cGUgIT0gU1FMSVRFX0xPQ0tfTk9ORSB8fCBsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19T
SEFSRUQpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIG5ldmVyIHJlcXVlc3QgYSBwZW5kaW5nIGxv
Y2suCisgICAgQVNTRVJUKGxvY2t0eXBlICE9IFNRTElURV9MT0NLX1BFTkRJTkcpOworCisgICAg
Ly8gTWFrZSBzdXJlIGEgc2hhcmVkIGxvY2sgaXMgYWx3YXlzIGhlbGQgd2hlbiBhIFJFU0VSVkVE
IGxvY2sgaXMgcmVxdWVzdGVkLgorICAgIEFTU0VSVChsb2NrdHlwZSAhPSBTUUxJVEVfTE9DS19S
RVNFUlZFRCB8fCBwRmlsZS0+bG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfU0hBUkVEKTsKKworICAg
IC8vIElmIHNvbWUgdGhyZWFkIHVzaW5nIHRoaXMgUElEIGhhcyBhIGxvY2sgdmlhIGEgZGlmZmVy
ZW50IENocm9taXVtRmlsZQorICAgIC8vIGhhbmRsZSB0aGF0IHByZWNsdWRlcyB0aGUgcmVxdWVz
dGVkIGxvY2ssIHJldHVybiBCVVNZLgorICAgIGlmIChwRmlsZS0+bG9ja3R5cGUgIT0gcExvY2st
PmxvY2t0eXBlICYmCisgICAgICAgIChwTG9jay0+bG9ja3R5cGUgPj0gU1FMSVRFX0xPQ0tfUEVO
RElORyB8fCBsb2NrdHlwZSA+IFNRTElURV9MT0NLX1NIQVJFRCkpCisgICAgICAgIHJldHVybiBT
UUxJVEVfQlVTWTsKKworICAgIC8vIElmIGEgU0hBUkVEIGxvY2sgaXMgcmVxdWVzdGVkLCBhbmQg
c29tZSB0aHJlYWQgdXNpbmcgdGhpcyBQSUQgYWxyZWFkeQorICAgIC8vIGhhcyBhIFNIQVJFRCBv
ciBSRVNFUlZFRCBsb2NrLCB0aGVuIGp1c3QgaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMuCisg
ICAgaWYgKGxvY2t0eXBlID09IFNRTElURV9MT0NLX1NIQVJFRCAmJgorICAgICAgICAocExvY2st
PmxvY2t0eXBlID09IFNRTElURV9MT0NLX1NIQVJFRCB8fCBwTG9jay0+bG9ja3R5cGUgPT0gU1FM
SVRFX0xPQ0tfUkVTRVJWRUQpKSB7CisgICAgICAgIEFTU0VSVCghcEZpbGUtPmxvY2t0eXBlKTsK
KyAgICAgICAgQVNTRVJUKHBMb2NrLT5jbnQgPiAwKTsKKyAgICAgICAgcEZpbGUtPmxvY2t0eXBl
ID0gU1FMSVRFX0xPQ0tfU0hBUkVEOworICAgICAgICBwTG9jay0+Y250Kys7CisgICAgICAgIHBG
aWxlLT5wT3Blbi0+bkxvY2srKzsKKyAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKKyAgICB9CisK
KyAgICAvLyBBIFBFTkRJTkcgbG9jayBpcyBuZWVkZWQgYmVmb3JlIGFjcXVpcmluZyBhIFNIQVJF
RCBsb2NrIGFuZCBiZWZvcmUKKyAgICAvLyBhY3F1aXJpbmcgYW4gRVhDTFVTSVZFIGxvY2suICBG
b3IgdGhlIFNIQVJFRCBsb2NrLCB0aGUgUEVORElORyB3aWxsCisgICAgLy8gYmUgcmVsZWFzZWQu
CisgICAgbG9jay5sX2xlbiA9IDE7CisgICAgbG9jay5sX3doZW5jZSA9IFNFRUtfU0VUOworICAg
IGlmIChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQgfHwKKyAgICAgICAgKGxvY2t0eXBl
ID09IFNRTElURV9MT0NLX0VYQ0xVU0lWRSAmJiBwRmlsZS0+bG9ja3R5cGUgPCBTUUxJVEVfTE9D
S19QRU5ESU5HKSkgeworICAgICAgICBsb2NrLmxfdHlwZSA9IChsb2NrdHlwZSA9PSBTUUxJVEVf
TE9DS19TSEFSRUQgPyBGX1JETENLIDogRl9XUkxDSyk7CisgICAgICAgIGxvY2subF9zdGFydCA9
IFNRTGl0ZVBlbmRpbmdCeXRlOworICAgICAgICBzID0gZmNudGwocEZpbGUtPmgsIEZfU0VUTEss
ICZsb2NrKTsKKyAgICAgICAgaWYgKHMgPT0gLTEpIHsKKyAgICAgICAgICAgIHRFcnJubyA9IGVy
cm5vOworICAgICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRFcnJubywg
U1FMSVRFX0lPRVJSX0xPQ0spOworICAgICAgICAgICAgaWYgKChyYyAhPSBTUUxJVEVfT0spICYm
IChyYyAhPSBTUUxJVEVfQlVTWSkpCisgICAgICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9
IHRFcnJubzsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmIChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQpIHsKKyAgICAgICAgQVNTRVJUKCFw
TG9jay0+Y250KTsKKyAgICAgICAgQVNTRVJUKCFwTG9jay0+bG9ja3R5cGUpOworCisgICAgICAg
IHMgPSByYW5nZUxvY2socEZpbGUsIEZfUkRMQ0ssICZ0RXJybm8pOworCisgICAgICAgIC8vIERy
b3AgdGhlIHRlbXBvcmFyeSBQRU5ESU5HIGxvY2suCisgICAgICAgIGxvY2subF9zdGFydCA9IFNR
TGl0ZVBlbmRpbmdCeXRlOworICAgICAgICBsb2NrLmxfbGVuID0gMTsKKyAgICAgICAgbG9jay5s
X3R5cGUgPSBGX1VOTENLOworICAgICAgICBpZiAoZmNudGwocEZpbGUtPmgsIEZfU0VUTEssICZs
b2NrKSkgeworICAgICAgICAgICAgaWYgKHMgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0RXJy
bm8gPSBlcnJubzsgCisgICAgICAgICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVy
cm9yKHRFcnJubywgU1FMSVRFX0lPRVJSX1VOTE9DSyk7IAorICAgICAgICAgICAgICAgIGlmICgo
cmMgIT0gU1FMSVRFX09LKSAmJiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAg
ICAgICBwRmlsZS0+bGFzdEVycm5vID0gdEVycm5vOworICAgICAgICAgICAgICAgIHJldHVybiBy
YzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocyA9PSAtMSkgeworICAg
ICAgICAgICAgcmMgPSBzcWxpdGVFcnJvckZyb21Qb3NpeEVycm9yKHRFcnJubywgU1FMSVRFX0lP
RVJSX0xPQ0spOworICAgICAgICAgICAgaWYgKChyYyAhPSBTUUxJVEVfT0spICYmIChyYyAhPSBT
UUxJVEVfQlVTWSkpCisgICAgICAgICAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IHRFcnJubzsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IFNRTElURV9M
T0NLX1NIQVJFRDsKKyAgICAgICAgICAgIHBGaWxlLT5wT3Blbi0+bkxvY2srKzsKKyAgICAgICAg
ICAgIHBMb2NrLT5jbnQgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChsb2NrdHlwZSA9
PSBTUUxJVEVfTE9DS19FWENMVVNJVkUgJiYgcExvY2stPmNudCA+IDEpIHsKKyAgICAgICAgLy8g
V2UgYXJlIHRyeWluZyBmb3IgYW4gZXhjbHVzaXZlIGxvY2sgYnV0IGFub3RoZXIgdGhyZWFkIGlu
IHRoZQorICAgICAgICAvLyBzYW1lIHByb2Nlc3MgaXMgc3RpbGwgaG9sZGluZyBhIHNoYXJlZCBs
b2NrLgorICAgICAgICByYyA9IFNRTElURV9CVVNZOworICAgIH0gIGVsc2UgeworICAgICAgICAv
LyBUaGUgcmVxdWVzdCB3YXMgZm9yIGEgUkVTRVJWRUQgb3IgRVhDTFVTSVZFIGxvY2suICBJdCBp
cworICAgICAgICAvLyBhc3N1bWVkIHRoYXQgdGhlcmUgaXMgYSBTSEFSRUQgb3IgZ3JlYXRlciBs
b2NrIG9uIHRoZSBmaWxlCisgICAgICAgIC8vIGFscmVhZHkuCisgICAgICAgIEFTU0VSVChwRmls
ZS0+bG9ja3R5cGUpOworICAgICAgICBsb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisgICAgICAgIHN3
aXRjaCAobG9ja3R5cGUpIHsKKyAgICAgICAgY2FzZSBTUUxJVEVfTE9DS19SRVNFUlZFRDoKKyAg
ICAgICAgICAgIGxvY2subF9zdGFydCA9IFNRTGl0ZVJlc2VydmVkQnl0ZTsKKyAgICAgICAgICAg
IHMgPSBmY250bChwRmlsZS0+aCwgRl9TRVRMSywgJmxvY2spOworICAgICAgICAgICAgdEVycm5v
ID0gZXJybm87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfTE9DS19F
WENMVVNJVkU6CisgICAgICAgICAgICBzID0gcmFuZ2VMb2NrKHBGaWxlLCBGX1dSTENLLCAmdEVy
cm5vKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMgPT0gLTEpIHsK
KyAgICAgICAgICAgIHJjID0gc3FsaXRlRXJyb3JGcm9tUG9zaXhFcnJvcih0RXJybm8sIFNRTElU
RV9JT0VSUl9MT0NLKTsKKyAgICAgICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAmJiAocmMg
IT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSB0RXJy
bm87CisgICAgICAgIH0KKyAgICB9CisgIAorICAgIGlmIChyYyA9PSBTUUxJVEVfT0spIHsKKyAg
ICAgICAgcEZpbGUtPmxvY2t0eXBlID0gbG9ja3R5cGU7CisgICAgICAgIHBMb2NrLT5sb2NrdHlw
ZSA9IGxvY2t0eXBlOworICAgIH0gZWxzZSBpZiAobG9ja3R5cGUgPT0gU1FMSVRFX0xPQ0tfRVhD
TFVTSVZFKSB7CisgICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX1BFTkRJTkc7
CisgICAgICAgIHBMb2NrLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX1BFTkRJTkc7CisgICAgfQor
CisgICAgcmV0dXJuIHJjOworfQorCisvLyBDbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgZm9y
IGdpdmVuIENocm9taXVtRmlsZSBmb3Igd2hpY2ggdGhlIGNsb3NlIGhhcyBiZWVuIGRlZmVycmVk
LgorLy8gUmV0dXJucyBhIFNRTGl0ZSBlcnJvciBjb2RlLgorc3RhdGljIGludCBjbG9zZVBlbmRp
bmdGZHMoQ2hyb21pdW1GaWxlKiBwRmlsZSkKK3sKKyAgICBpbnQgcmMgPSBTUUxJVEVfT0s7Cisg
ICAgQ2hyb21pdW1PcGVuSW5mbyogcE9wZW4gPSBwRmlsZS0+cE9wZW47CisgICAgQ2hyb21pdW1V
bnVzZWRGZCogcEVycm9yID0gMDsKKyAgICBDaHJvbWl1bVVudXNlZEZkKiBwTmV4dDsKKyAgICBm
b3IgKENocm9taXVtVW51c2VkRmQqIHAgPSBwT3Blbi0+cFVudXNlZDsgcDsgcCA9IHBOZXh0KSB7
CisgICAgICAgIHBOZXh0ID0gcC0+cE5leHQ7CisgICAgICAgIGlmIChjbG9zZShwLT5mZCkpIHsK
KyAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgIHJjID0g
U1FMSVRFX0lPRVJSX0NMT1NFOworICAgICAgICAgICAgcC0+cE5leHQgPSBwRXJyb3I7CisgICAg
ICAgICAgICBwRXJyb3IgPSBwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNxbGl0ZTNf
ZnJlZShwKTsKKyAgICB9CisgICAgcE9wZW4tPnBVbnVzZWQgPSBwRXJyb3I7CisgICAgcmV0dXJu
IHJjOworfQorCisvLyBMb3dlcnMgdGhlIGxvY2tpbmcgbGV2ZWwgb24gZmlsZSBkZXNjcmlwdG9y
LgorLy8gbG9ja3R5cGUgbXVzdCBiZSBlaXRoZXIgU1FMSVRFX0xPQ0tfTk9ORSBvciBTUUxJVEVf
TE9DS19TSEFSRUQuCitzdGF0aWMgaW50IGNocm9taXVtVW5sb2NrKHNxbGl0ZTNfZmlsZSogaWQs
IGludCBsb2NrdHlwZSkKK3sKKyAgICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVpbnRlcnByZXRf
Y2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CisgICAgQVNTRVJUKHBGaWxlKTsKKyAgICBBU1NFUlQo
bG9ja3R5cGUgPD0gU1FMSVRFX0xPQ0tfU0hBUkVEKTsKKworICAgIGlmIChwRmlsZS0+bG9ja3R5
cGUgPD0gbG9ja3R5cGUpCisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisKKyAgICBDaHJvbWl1
bUxvY2tJbmZvKiBwTG9jayA9IHBGaWxlLT5wTG9jazsKKyAgICBBU1NFUlQocExvY2stPmNudCk7
CisKKyAgICBzdHJ1Y3QgZmxvY2sgbG9jazsKKyAgICBpbnQgcmMgPSBTUUxJVEVfT0s7CisgICAg
aW50IGggPSBwRmlsZS0+aDsKKyAgICBpbnQgdEVycm5vOworCisgICAgaWYgKHBGaWxlLT5sb2Nr
dHlwZSA+IFNRTElURV9MT0NLX1NIQVJFRCkgeworICAgICAgICBBU1NFUlQocExvY2stPmxvY2t0
eXBlID09IHBGaWxlLT5sb2NrdHlwZSk7CisKKyAgICAgICAgaWYgKGxvY2t0eXBlID09IFNRTElU
RV9MT0NLX1NIQVJFRCAmJiByYW5nZUxvY2socEZpbGUsIEZfUkRMQ0ssICZ0RXJybm8pID09IC0x
KSB7CisgICAgICAgICAgICByYyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5vLCBT
UUxJVEVfSU9FUlJfUkRMT0NLKTsKKyAgICAgICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAm
JiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8g
PSB0RXJybm87CisgICAgICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKQorICAgICAgICAgICAg
ICAgIHBGaWxlLT5sb2NrdHlwZSA9IGxvY2t0eXBlOworICAgICAgICAgICAgcmV0dXJuIHJjOwor
ICAgICAgICB9CisgICAgICAgIGxvY2subF90eXBlID0gRl9VTkxDSzsKKyAgICAgICAgbG9jay5s
X3doZW5jZSA9IFNFRUtfU0VUOworICAgICAgICBsb2NrLmxfc3RhcnQgPSBTUUxpdGVQZW5kaW5n
Qnl0ZTsKKyAgICAgICAgbG9jay5sX2xlbiA9IDI7CisgICAgICAgIGlmIChmY250bChoLCBGX1NF
VExLLCAmbG9jaykgIT0gLTEpCisgICAgICAgICAgICBwTG9jay0+bG9ja3R5cGUgPSBTUUxJVEVf
TE9DS19TSEFSRUQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdEVycm5vID0gZXJybm87
CisgICAgICAgICAgICByYyA9IHNxbGl0ZUVycm9yRnJvbVBvc2l4RXJyb3IodEVycm5vLCBTUUxJ
VEVfSU9FUlJfVU5MT0NLKTsKKyAgICAgICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAmJiAo
cmMgIT0gU1FMSVRFX0JVU1kpKQorICAgICAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSB0
RXJybm87CisgICAgICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKQorICAgICAgICAgICAgICAg
IHBGaWxlLT5sb2NrdHlwZSA9IGxvY2t0eXBlOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAg
ICAgICB9CisgICAgfQorICAgIGlmIChsb2NrdHlwZSA9PSBTUUxJVEVfTE9DS19OT05FKSB7Cisg
ICAgICAgIHN0cnVjdCBDaHJvbWl1bU9wZW5JbmZvICpwT3BlbjsKKworICAgICAgICBwTG9jay0+
Y250LS07CisKKyAgICAgICAgLy8gUmVsZWFzZSB0aGUgbG9jayB1c2luZyBhbiBPUyBjYWxsIG9u
bHkgd2hlbiBhbGwgdGhyZWFkcyBpbiB0aGlzIHNhbWUgcHJvY2VzcyBoYXZlIHJlbGVhc2VkIHRo
ZSBsb2NrLgorICAgICAgICBpZiAoIXBMb2NrLT5jbnQpIHsKKyAgICAgICAgICAgIGxvY2subF90
eXBlID0gRl9VTkxDSzsKKyAgICAgICAgICAgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKyAg
ICAgICAgICAgIGxvY2subF9zdGFydCA9IGxvY2subF9sZW4gPSAwTDsKKyAgICAgICAgICAgIGlm
IChmY250bChoLCBGX1NFVExLLCAmbG9jaykgIT0gLTEpCisgICAgICAgICAgICAgICAgcExvY2st
PmxvY2t0eXBlID0gU1FMSVRFX0xPQ0tfTk9ORTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAg
ICAgICAgICAgIHRFcnJubyA9IGVycm5vOworICAgICAgICAgICAgICAgIHJjID0gc3FsaXRlRXJy
b3JGcm9tUG9zaXhFcnJvcih0RXJybm8sIFNRTElURV9JT0VSUl9VTkxPQ0spOworICAgICAgICAg
ICAgICAgIGlmICgocmMgIT0gU1FMSVRFX09LKSAmJiAocmMgIT0gU1FMSVRFX0JVU1kpKQorICAg
ICAgICAgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gdEVycm5vOworICAgICAgICAgICAg
ICAgIHBMb2NrLT5sb2NrdHlwZSA9IFNRTElURV9MT0NLX05PTkU7CisgICAgICAgICAgICAgICAg
cEZpbGUtPmxvY2t0eXBlID0gU1FMSVRFX0xPQ0tfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIHBPcGVuID0gcEZpbGUtPnBPcGVuOworICAgICAgICBwT3Blbi0+bkxv
Y2stLTsKKyAgICAgICAgQVNTRVJUKHBPcGVuLT5uTG9jayA+PSAwKTsKKyAgICAgICAgaWYgKCFw
T3Blbi0+bkxvY2spIHsKKyAgICAgICAgICAgIGludCByYzIgPSBjbG9zZVBlbmRpbmdGZHMocEZp
bGUpOworICAgICAgICAgICAgaWYgKHJjID09IFNRTElURV9PSykKKyAgICAgICAgICAgICAgICBy
YyA9IHJjMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyYyA9PSBTUUxJVEVfT0spCisg
ICAgICAgIHBGaWxlLT5sb2NrdHlwZSA9IGxvY2t0eXBlOworICAgIHJldHVybiByYzsKIH0KIAot
Ly8gQ2hyb21pdW0ncyBQb3NpeCBpbXBsZW1lbnRhdGlvbiBvZiBTUUxpdGUgVkZTCi1uYW1lc3Bh
Y2UgeworLy8gQ2xvc2VzIGFsbCBmaWxlIGhhbmRsZXMgZm9yIGdpdmVuIENocm9taXVtRmlsZSBh
bmQgc2V0cyBhbGwgaXRzIGZpZWxkcyB0byAwLgorLy8gUmV0dXJucyBhIFNRTGl0ZSBlcnJvciBj
b2RlLgorc3RhdGljIGludCBjaHJvbWl1bUNsb3NlTm9Mb2NrKHNxbGl0ZTNfZmlsZSogaWQpCit7
CisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxl
Kj4oaWQpOworICAgIGlmICghcEZpbGUpCisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisgICAg
aWYgKHBGaWxlLT5kaXJmZCA+PSAwKSB7CisgICAgICAgIGlmIChjbG9zZShwRmlsZS0+ZGlyZmQp
KSB7CisgICAgICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJybm87CisgICAgICAgICAgICBy
ZXR1cm4gU1FMSVRFX0lPRVJSX0RJUl9DTE9TRTsKKyAgICAgICAgfQorICAgICAgICBwRmlsZS0+
ZGlyZmQgPSAtMTsKKyAgICB9CisgICAgaWYgKHBGaWxlLT5oID49IDAgJiYgY2xvc2UocEZpbGUt
PmgpKSB7CisgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgcmV0dXJu
IFNRTElURV9JT0VSUl9DTE9TRTsKKyAgICB9CisgICAgc3FsaXRlM19mcmVlKHBGaWxlLT5wVW51
c2VkKTsKKyAgICBtZW1zZXQocEZpbGUsIDAsIHNpemVvZihDaHJvbWl1bUZpbGUpKTsKKyAgICBy
ZXR1cm4gU1FMSVRFX09LOworfQorCisvLyBDbG9zZXMgYSBDaHJvbWl1bUZpbGUsIGluY2x1ZGlu
ZyBsb2NraW5nIG9wZXJhdGlvbnMuIFJldHVybnMgYSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRp
YyBpbnQgY2hyb21pdW1DbG9zZShzcWxpdGUzX2ZpbGUqIGlkKQoreworICAgIGlmICghaWQpCisg
ICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisKKyAgICBDaHJvbWl1bUZpbGUqIHBGaWxlID0gcmVp
bnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CisgICAgY2hyb21pdW1VbmxvY2soaWQs
IFNRTElURV9MT0NLX05PTkUpOworICAgIGlmIChwRmlsZS0+cE9wZW4gJiYgcEZpbGUtPnBPcGVu
LT5uTG9jaykgeworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgb3V0c3RhbmRpbmcgbG9ja3MsIGRv
IG5vdCBhY3R1YWxseSBjbG9zZSB0aGUgZmlsZSBqdXN0CisgICAgICAgIC8vIHlldCBiZWNhdXNl
IHRoYXQgd291bGQgY2xlYXIgdGhvc2UgbG9ja3MuCisgICAgICAgIENocm9taXVtT3BlbkluZm8q
IHBPcGVuID0gcEZpbGUtPnBPcGVuOworICAgICAgICBDaHJvbWl1bVVudXNlZEZkKiBwID0gcEZp
bGUtPnBVbnVzZWQ7CisgICAgICAgIHAtPnBOZXh0ID0gcE9wZW4tPnBVbnVzZWQ7CisgICAgICAg
IHBPcGVuLT5wVW51c2VkID0gcDsKKyAgICAgICAgcEZpbGUtPmggPSAtMTsKKyAgICAgICAgcEZp
bGUtPnBVbnVzZWQgPSAwOworICAgIH0KKyAgICByZWxlYXNlTG9ja0luZm8ocEZpbGUtPnBMb2Nr
KTsKKyAgICByZWxlYXNlT3BlbkluZm8ocEZpbGUtPnBPcGVuKTsKKyAgICByZXR1cm4gY2hyb21p
dW1DbG9zZU5vTG9jayhpZCk7Cit9CisKK3N0YXRpYyBpbnQgY2hyb21pdW1DaGVja1Jlc2VydmVk
TG9ja05vb3Aoc3FsaXRlM19maWxlKiwgaW50KiBwUmVzT3V0KQoreworICAgICpwUmVzT3V0ID0g
MDsKKyAgICByZXR1cm4gU1FMSVRFX09LOworfQorCitzdGF0aWMgaW50IGNocm9taXVtTG9ja05v
b3Aoc3FsaXRlM19maWxlKiwgaW50KQoreworICAgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKK3N0
YXRpYyBpbnQgY2hyb21pdW1VbmxvY2tOb29wKHNxbGl0ZTNfZmlsZSosIGludCkKK3sKKyAgICBy
ZXR1cm4gU1FMSVRFX09LOworfQorCisvLyBTZWVrcyB0byB0aGUgcmVxdWVzdGVkIG9mZnNldCBh
bmQgcmVhZHMgdXAgdG8gfGNudHwgYnl0ZXMgaW50byB8cEJ1ZnwuIFJldHVybnMgbnVtYmVyIG9m
IGJ5dGVzIGFjdHVhbGx5IHJlYWQuCitzdGF0aWMgaW50IHNlZWtBbmRSZWFkKENocm9taXVtRmls
ZSogaWQsIHNxbGl0ZTNfaW50NjQgb2Zmc2V0LCB2b2lkKiBwQnVmLCBpbnQgY250KQoreworICAg
IHNxbGl0ZV9pbnQ2NCBuZXdPZmZzZXQgPSBsc2VlayhpZC0+aCwgb2Zmc2V0LCBTRUVLX1NFVCk7
CisgICAgaWYgKG5ld09mZnNldCAhPSBvZmZzZXQpIHsKKyAgICAgICAgaWQtPmxhc3RFcnJubyA9
IChuZXdPZmZzZXQgPT0gLTEpID8gZXJybm8gOiAwOworICAgICAgICByZXR1cm4gLTE7CisgICAg
fQorICAgIGludCBnb3QgPSByZWFkKGlkLT5oLCBwQnVmLCBjbnQpOworICAgIGlmIChnb3QgPCAw
KQorICAgICAgICBpZC0+bGFzdEVycm5vID0gZXJybm87CisgICAgcmV0dXJuIGdvdDsKK30KKwor
Ly8gUmVhZHMgZGF0YSBmcm9tIGZpbGUgaW50byBhIGJ1ZmZlci4gUmV0dXJucyBhIFNRTGl0ZSBl
cnJvciBjb2RlLgorc3RhdGljIGludCBjaHJvbWl1bVJlYWQoc3FsaXRlM19maWxlKiBpZCwgdm9p
ZCogcEJ1ZiwgaW50IGFtdCwgc3FsaXRlM19pbnQ2NCBvZmZzZXQpCit7CisgICAgQ2hyb21pdW1G
aWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxlKj4oaWQpOworICAgIEFT
U0VSVChwRmlsZSk7CisKKyAgICAvLyBUaGUgYnl0ZXMgaW4gdGhlIGxvY2tpbmcgcmFuZ2Ugc2hv
dWxkIG5ldmVyIGJlIHJlYWQuCisgICAgQVNTRVJUKCFwRmlsZS0+cFVudXNlZCB8fCBvZmZzZXQg
Pj0gU1FMaXRlUGVuZGluZ0J5dGUgKyA1MTIgfHwgb2Zmc2V0ICsgYW10IDw9IFNRTGl0ZVBlbmRp
bmdCeXRlKTsKKworICAgIGludCBnb3QgPSBzZWVrQW5kUmVhZChwRmlsZSwgb2Zmc2V0LCBwQnVm
LCBhbXQpOworICAgIGlmIChnb3QgPT0gYW10KQorICAgICAgICByZXR1cm4gU1FMSVRFX09LOwor
CisgICAgaWYgKGdvdCA8IDApCisgICAgICAgIHJldHVybiBTUUxJVEVfSU9FUlJfUkVBRDsKKwor
ICAgIC8vIFVucmVhZCBwYXJ0cyBvZiB0aGUgYnVmZmVyIG11c3QgYmUgemVyby1maWxsZWQuCisg
ICAgbWVtc2V0KCYocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocEJ1ZikpW2dvdF0sIDAsIGFtdCAt
IGdvdCk7CisgICAgcEZpbGUtPmxhc3RFcnJubyA9IDA7CisgICAgcmV0dXJuIFNRTElURV9JT0VS
Ul9TSE9SVF9SRUFEOworfQorCisvLyBTZWVrcyB0byB0aGUgcmVxdWVzdGVkIG9mZnNldCBhbmQg
d3JpdGVzIHVwIHRvIHxjbnR8IGJ5dGVzLiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBhY3R1YWxs
eSB3cml0dGVuLgorc3RhdGljIGludCBzZWVrQW5kV3JpdGUoQ2hyb21pdW1GaWxlKiBpZCwgc3Fs
aXRlX2ludDY0IG9mZnNldCwgY29uc3Qgdm9pZCogcEJ1ZiwgaW50IGNudCkKK3sKKyAgICBzcWxp
dGVfaW50NjQgbmV3T2Zmc2V0ID0gbHNlZWsoaWQtPmgsIG9mZnNldCwgU0VFS19TRVQpOworICAg
IGlmIChuZXdPZmZzZXQgIT0gb2Zmc2V0KSB7CisgICAgICAgIGlkLT5sYXN0RXJybm8gPSAobmV3
T2Zmc2V0ID09IC0xKSA/IGVycm5vIDogMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAg
ICBpbnQgZ290ID0gd3JpdGUoaWQtPmgsIHBCdWYsIGNudCk7CisgICAgaWYgKGdvdCA8IDApCisg
ICAgICAgIGlkLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICByZXR1cm4gZ290OworfQorCisvLyBX
cml0ZXMgZGF0YSBmcm9tIGJ1ZmZlciBpbnRvIGEgZmlsZS4gUmV0dXJucyBhIFNRTGl0ZSBlcnJv
ciBjb2RlLgorc3RhdGljIGludCBjaHJvbWl1bVdyaXRlKHNxbGl0ZTNfZmlsZSogaWQsIGNvbnN0
IHZvaWQqIHBCdWYsIGludCBhbXQsIHNxbGl0ZTNfaW50NjQgb2Zmc2V0KQoreworICAgIENocm9t
aXVtRmlsZSogcEZpbGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAg
ICBBU1NFUlQocEZpbGUpOworICAgIEFTU0VSVChhbXQgPiAwKTsKKworICAgIC8vIFRoZSBieXRl
cyBpbiB0aGUgbG9ja2luZyByYW5nZSBzaG91bGQgbmV2ZXIgYmUgd3JpdHRlbi4KKyAgICBBU1NF
UlQoIXBGaWxlLT5wVW51c2VkIHx8IG9mZnNldCA+PSBTUUxpdGVQZW5kaW5nQnl0ZSArIDUxMiB8
fCBvZmZzZXQgKyBhbXQgPD0gU1FMaXRlUGVuZGluZ0J5dGUpOworCisgICAgaW50IHdyb3RlID0g
MDsKKyAgICB3aGlsZSAoYW10ID4gMCAmJiAod3JvdGUgPSBzZWVrQW5kV3JpdGUocEZpbGUsIG9m
ZnNldCwgcEJ1ZiwgYW10KSkgPiAwKSB7CisgICAgICAgIGFtdCAtPSB3cm90ZTsKKyAgICAgICAg
b2Zmc2V0ICs9IHdyb3RlOworICAgICAgICBwQnVmID0gJihyZWludGVycHJldF9jYXN0PGNvbnN0
IGNoYXIqPihwQnVmKSlbd3JvdGVdOworICAgIH0KKyAgICBpZiAoYW10ID4gMCkgeworICAgICAg
ICBpZiAod3JvdGUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIFNRTElURV9JT0VSUl9XUklURTsK
KyAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IDA7CisgICAgICAgIHJldHVybiBTUUxJVEVfRlVM
TDsKKyAgICB9CisgICAgcmV0dXJuIFNRTElURV9PSzsKK30KKworc3RhdGljIGJvb2wgc3luY1dy
YXBwZXIoaW50IGZkLCBib29sIGZ1bGxTeW5jKQoreworI2lmIFBMQVRGT1JNKE1BQykKKyAgICBi
b29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpZiAoZnVsbFN5bmMpCisgICAgICAgIHN1Y2Nlc3Mg
PSAhZmNudGwoZmQsIEZfRlVMTFNZTkMsIDApOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAg
c3VjY2VzcyA9ICFmc3luYyhmZCk7CisjZWxzZQorICAgIHJldHVybiAhZmRhdGFzeW5jKGZkKTsK
KyNlbmRpZgorfQorCisvLyBNYWtlcyBzdXJlIGFsbCB3cml0ZXMgdG8gYSBwYXJ0aWN1bGFyIGZp
bGUgYXJlIGNvbW1pdHRlZCB0byBkaXNrLiBSZXR1cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitz
dGF0aWMgaW50IGNocm9taXVtU3luYyhzcWxpdGUzX2ZpbGUqIGlkLCBpbnQgZmxhZ3MpCit7Cisg
ICAgQVNTRVJUKChmbGFncyAmIDB4MEYpID09IFNRTElURV9TWU5DX05PUk1BTCB8fCAoZmxhZ3Mg
JiAweDBGKSA9PSBTUUxJVEVfU1lOQ19GVUxMKTsKKworICAgIENocm9taXVtRmlsZSogcEZpbGUg
PSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAgICBBU1NFUlQocEZpbGUp
OworCisgICAgYm9vbCBpc0Z1bGxTeW5jID0gKChmbGFncyAmIDB4MEYpID09IFNRTElURV9TWU5D
X0ZVTEwpOworCisgICAgaWYgKHN5bmNXcmFwcGVyKHBGaWxlLT5oLCBpc0Z1bGxTeW5jKSkgewor
ICAgICAgICBwRmlsZS0+bGFzdEVycm5vID0gZXJybm87CisgICAgICAgIHJldHVybiBTUUxJVEVf
SU9FUlJfRlNZTkM7CisgICAgfQorCisgICAgaWYgKHBGaWxlLT5kaXJmZCA+PSAwKSB7CisjaWYg
IVBMQVRGT1JNKE1BQykKKyAgICAgICAgaWYgKCFpc0Z1bGxTeW5jKSB7CisgICAgICAgICAgICAv
LyBJZ25vcmUgZGlyZWN0b3J5IHN5bmMgZmFpbHVyZXMsIHNlZSBodHRwOi8vd3d3LnNxbGl0ZS5v
cmcvY3ZzdHJhYy90a3R2aWV3P3RuPTE2NTcuCisgICAgICAgICAgICBzeW5jV3JhcHBlcihwRmls
ZS0+ZGlyZmQsIGZhbHNlKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmICghY2xvc2Uo
cEZpbGUtPmRpcmZkKSkKKyAgICAgICAgICAgIHBGaWxlLT5kaXJmZCA9IC0xOworICAgICAgICBl
bHNlIHsKKyAgICAgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgICAg
IHJldHVybiBTUUxJVEVfSU9FUlJfRElSX0NMT1NFOworICAgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIFNRTElURV9PSzsKK30KKworLy8gVHJ1bmNhdGVzIGFuIG9wZW4gZmlsZSB0byB0aGUg
c3BlY2lmaWVkIHNpemUuIFJldHVybnMgYSBTUUxpdGUgZXJyb3IgY29kZS4KK3N0YXRpYyBpbnQg
Y2hyb21pdW1UcnVuY2F0ZShzcWxpdGUzX2ZpbGUqIGlkLCBzcWxpdGVfaW50NjQgbkJ5dGUpCit7
CisgICAgQ2hyb21pdW1GaWxlKiBwRmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2hyb21pdW1GaWxl
Kj4oaWQpOworICAgIEFTU0VSVChwRmlsZSk7CisKKyAgICBpZiAoZnRydW5jYXRlKHBGaWxlLT5o
LCBuQnl0ZSkpIHsKKyAgICAgICAgcEZpbGUtPmxhc3RFcnJubyA9IGVycm5vOworICAgICAgICBy
ZXR1cm4gU1FMSVRFX0lPRVJSX1RSVU5DQVRFOworICAgIH0KKworICAgIHJldHVybiBTUUxJVEVf
T0s7Cit9CisKKy8vIERldGVybWluZXMgdGhlIHNpemUgb2YgYSBmaWxlIGluIGJ5dGVzLiBSZXR1
cm5zIGEgU1FMaXRlIGVycm9yIGNvZGUuCitzdGF0aWMgaW50IGNocm9taXVtRmlsZVNpemUoc3Fs
aXRlM19maWxlKiBpZCwgc3FsaXRlX2ludDY0KiBwU2l6ZSkKK3sKKyAgICBDaHJvbWl1bUZpbGUq
IHBGaWxlID0gcmVpbnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CisgICAgQVNTRVJU
KHBGaWxlKTsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpZiAoZnN0YXQocEZpbGUtPmgs
ICZidWYpKSB7CisgICAgICAgIHBGaWxlLT5sYXN0RXJybm8gPSBlcnJubzsKKyAgICAgICAgcmV0
dXJuIFNRTElURV9JT0VSUl9GU1RBVDsKKyAgICB9CisgICAgKnBTaXplID0gYnVmLnN0X3NpemU7
CisKKyAgICAvLyBXaGVuIG9wZW5pbmcgYSB6ZXJvLXNpemUgZGF0YWJhc2UsIGZpbmRMb2NrSW5m
byB3cml0ZXMgYSBzaW5nbGUgYnl0ZSBpbnRvIHRoYXQgZmlsZQorICAgIC8vIGluIG9yZGVyIHRv
IHdvcmsgYXJvdW5kIGEgYnVnIGluIHRoZSBPUyBYIG1zZG9zIGZpbGVzeXN0ZW0uIEluIG9yZGVy
IHRvIGF2b2lkIHByb2JsZW1zCisgICAgLy8gd2l0aCB1cHBlciBsYXllcnMsIHdlIG5lZWQgdG8g
cmVwb3J0IHRoaXMgZmlsZSBzaXplIGFzIHplcm8gZXZlbiB0aG91Z2ggaXQgaXMgcmVhbGx5IDEu
CisgICAgLy8gU2VlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jdnN0cmFjL3RrdHZpZXc/dG49MzI2
MC4KKyAgICBpZiAoKnBTaXplID09IDEpCisgICAgICAgICpwU2l6ZSA9IDA7CisKKyAgICByZXR1
cm4gU1FMSVRFX09LOworfQorCitzdGF0aWMgaW50IGNocm9taXVtRmlsZUNvbnRyb2woc3FsaXRl
M19maWxlKiBpZCwgaW50IG9wLCB2b2lkKiBwQXJnKQoreworICAgIENocm9taXVtRmlsZSogcEZp
bGUgPSByZWludGVycHJldF9jYXN0PENocm9taXVtRmlsZSo+KGlkKTsKKyAgICBBU1NFUlQocEZp
bGUpOworCisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgU1FMSVRFX0ZDTlRMX0xPQ0tTVEFU
RToKKyAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8aW50Kj4ocEFyZykgPSBwRmlsZS0+bG9ja3R5
cGU7CisgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CisgICAgY2FzZSBTUUxJVEVfTEFTVF9FUlJO
TzoKKyAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8aW50Kj4ocEFyZykgPSBwRmlsZS0+bGFzdEVy
cm5vOworICAgICAgICByZXR1cm4gU1FMSVRFX09LOworICAgIH0KKyAgICByZXR1cm4gU1FMSVRF
X0VSUk9SOworfQorCisvLyBTYW1lIGFzIFNRTElURV9ERUZBVUxUX1NFQ1RPUl9TSVpFIGZyb20g
c3FsaXRlJ3Mgb3MuaC4KK3N0YXRpYyBjb25zdCBpbnQgU1FMaXRlRGVmYXVsdFNlY3RvclNpemUg
PSA1MTI7CisKK3N0YXRpYyBpbnQgY2hyb21pdW1TZWN0b3JTaXplKHNxbGl0ZTNfZmlsZSopCit7
CisgICAgcmV0dXJuIFNRTGl0ZURlZmF1bHRTZWN0b3JTaXplOworfQorCitzdGF0aWMgaW50IGNo
cm9taXVtRGV2aWNlQ2hhcmFjdGVyaXN0aWNzKHNxbGl0ZTNfZmlsZSopCit7CisgICAgcmV0dXJu
IDA7Cit9CisKK3N0YXRpYyBjb25zdCBzcWxpdGUzX2lvX21ldGhvZHMgcG9zaXhJb01ldGhvZHMg
PSB7CisgICAgMSwKKyAgICBjaHJvbWl1bUNsb3NlLAorICAgIGNocm9taXVtUmVhZCwKKyAgICBj
aHJvbWl1bVdyaXRlLAorICAgIGNocm9taXVtVHJ1bmNhdGUsCisgICAgY2hyb21pdW1TeW5jLAor
ICAgIGNocm9taXVtRmlsZVNpemUsCisgICAgY2hyb21pdW1Mb2NrLAorICAgIGNocm9taXVtVW5s
b2NrLAorICAgIGNocm9taXVtQ2hlY2tSZXNlcnZlZExvY2ssCisgICAgY2hyb21pdW1GaWxlQ29u
dHJvbCwKKyAgICBjaHJvbWl1bVNlY3RvclNpemUsCisgICAgY2hyb21pdW1EZXZpY2VDaGFyYWN0
ZXJpc3RpY3MKK307CisKK3N0YXRpYyBjb25zdCBzcWxpdGUzX2lvX21ldGhvZHMgbm9sb2NrSW9N
ZXRob2RzID0geworICAgIDEsCisgICAgY2hyb21pdW1DbG9zZU5vTG9jaywKKyAgICBjaHJvbWl1
bVJlYWQsCisgICAgY2hyb21pdW1Xcml0ZSwKKyAgICBjaHJvbWl1bVRydW5jYXRlLAorICAgIGNo
cm9taXVtU3luYywKKyAgICBjaHJvbWl1bUZpbGVTaXplLAorICAgIGNocm9taXVtTG9ja05vb3As
CisgICAgY2hyb21pdW1VbmxvY2tOb29wLAorICAgIGNocm9taXVtQ2hlY2tSZXNlcnZlZExvY2tO
b29wLAorICAgIGNocm9taXVtRmlsZUNvbnRyb2wsCisgICAgY2hyb21pdW1TZWN0b3JTaXplLAor
ICAgIGNocm9taXVtRGV2aWNlQ2hhcmFjdGVyaXN0aWNzCit9OworCisvLyBJbml0aWFsaXplcyBh
IENocm9taXVtRmlsZS4gUmV0dXJucyBhIFNRTGl0ZSBlcnJvciBjb2RlLgorc3RhdGljIGludCBm
aWxsSW5DaHJvbWl1bUZpbGUoc3FsaXRlM192ZnMqIHBWZnMsIGludCBoLCBpbnQgZGlyZmQsIHNx
bGl0ZTNfZmlsZSogcElkLCBjb25zdCBjaGFyKiB6RmlsZW5hbWUsIGludCBub0xvY2spCit7Cisg
ICAgQ2hyb21pdW1GaWxlKiBwTmV3ID0gcmVpbnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihw
SWQpOworCisgICAgQVNTRVJUKCFwTmV3LT5wTG9jayk7CisgICAgQVNTRVJUKCFwTmV3LT5wT3Bl
bik7CisKKyAgICBwTmV3LT5oID0gaDsKKyAgICBwTmV3LT5kaXJmZCA9IGRpcmZkOworCisgICAg
aW50IHJjID0gU1FMSVRFX09LOworICAgIGNvbnN0IHNxbGl0ZTNfaW9fbWV0aG9kcyogcExvY2tp
bmdTdHlsZTsKKyAgICBpZiAobm9Mb2NrKQorICAgICAgICBwTG9ja2luZ1N0eWxlID0gJm5vbG9j
a0lvTWV0aG9kczsKKyAgICBlbHNlIHsKKyAgICAgICAgcExvY2tpbmdTdHlsZSA9ICZwb3NpeElv
TWV0aG9kczsKKyAgICAgICAgcmMgPSBmaW5kTG9ja0luZm8ocE5ldywgJnBOZXctPnBMb2NrLCAm
cE5ldy0+cE9wZW4pOworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAg
ICAvLyBJZiBhbiBlcnJvciBvY2N1cmVkIGluIGZpbmRMb2NrSW5mbygpLCBjbG9zZSB0aGUgZmls
ZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAvLyBpbW1lZGlhdGVseS4gVGhpcyBjYW4gaGFwcGVu
IGluIHR3byBzY2VuYXJpb3M6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAoYSkg
QSBjYWxsIHRvIGZzdGF0KCkgZmFpbGVkLgorICAgICAgICAgICAgLy8gICAoYikgQSBtYWxsb2Mg
ZmFpbGVkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNjZW5hcmlvIChiKSBtYXkg
b25seSBvY2N1ciBpZiB0aGUgcHJvY2VzcyBpcyBob2xkaW5nIG5vIG90aGVyCisgICAgICAgICAg
ICAvLyBmaWxlIGRlc2NyaXB0b3JzIG9wZW4gb24gdGhlIHNhbWUgZmlsZS4gSWYgdGhlcmUgd2Vy
ZSBvdGhlciBmaWxlCisgICAgICAgICAgICAvLyBkZXNjcmlwdG9ycyBvbiB0aGlzIGZpbGUsIHRo
ZW4gbm8gbWFsbG9jIHdvdWxkIGJlIHJlcXVpcmVkIGJ5CisgICAgICAgICAgICAvLyBmaW5kTG9j
a0luZm8oKS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgaXQgaXMgcXVpdGUgc2FmZSB0byBjbG9zZQor
ICAgICAgICAgICAgLy8gaGFuZGxlIGggLSBhcyBpdCBpcyBndWFyYW50ZWVkIHRoYXQgbm8gcG9z
aXggbG9ja3Mgd2lsbCBiZSByZWxlYXNlZAorICAgICAgICAgICAgLy8gYnkgZG9pbmcgc28uCisg
ICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgc2NlbmFyaW8gKGEpIGNhdXNlZCB0aGUg
ZXJyb3IgdGhlbiB0aGluZ3MgYXJlIG5vdCBzbyBzYWZlLiBUaGUKKyAgICAgICAgICAgIC8vIGlt
cGxpY2l0IGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGlmIGZzdGF0KCkgZmFpbHMsIHRoaW5ncyBh
cmUgaW4KKyAgICAgICAgICAgIC8vIHN1Y2ggYmFkIHNoYXBlIHRoYXQgZHJvcHBpbmcgYSBsb2Nr
IG9yIHR3byBkb2Vzbid0IG1hdHRlciBtdWNoLgorICAgICAgICAgICAgY2xvc2UoaCk7CisgICAg
ICAgICAgICBoID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwTmV3LT5sYXN0RXJybm8g
PSAwOworICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgaWYgKGRpcmZkID49IDAp
CisgICAgICAgICAgICBjbG9zZShkaXJmZCk7CisgICAgICAgIGlmIChoID49IDApCisgICAgICAg
ICAgICBjbG9zZShoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcE5ldy0+cE1ldGhvZCA9IHBMb2Nr
aW5nU3R5bGU7CisgICAgcmV0dXJuIHJjOworfQorCisvLyBTZWFyY2hlcyBmb3IgYW4gdW51c2Vk
IGZpbGUgZGVzY3JpcHRvciB0aGF0IHdhcyBvcGVuZWQgb24gdGhlIGRhdGFiYXNlIAorLy8gZmls
ZSBpZGVudGlmaWVkIGJ5IHpQYXRoIHdpdGggbWF0Y2hpbmcgZmxhZ3MuIFJldHVybnMgMCBpZiBu
b3QgZm91bmQuCitzdGF0aWMgQ2hyb21pdW1VbnVzZWRGZCogZmluZFJldXNhYmxlRmQoY29uc3Qg
Y2hhciogelBhdGgsIGludCBmbGFncykKK3sKKyAgICBDaHJvbWl1bVVudXNlZEZkKiBwVW51c2Vk
ID0gMDsKKworICAgIHN0cnVjdCBzdGF0IHNTdGF0OworICAgIGlmICghc3RhdCh6UGF0aCwgJnNT
dGF0KSkgeworICAgICAgICBDaHJvbWl1bUZpbGVJZCBpZDsKKyAgICAgICAgaWQuZGV2ID0gc1N0
YXQuc3RfZGV2OworICAgICAgICBpZC5pbm8gPSBzU3RhdC5zdF9pbm87CisKKyAgICAgICAgQ2hy
b21pdW1PcGVuSW5mbyogcE8gPSAwOworICAgICAgICBmb3IgKHBPID0gb3Blbkxpc3Q7IHBPICYm
IG1lbWNtcCgmaWQsICZwTy0+ZmlsZUlkLCBzaXplb2YoaWQpKTsgcE8gPSBwTy0+cE5leHQpIHsg
fQorICAgICAgICBpZiAocE8pIHsKKyAgICAgICAgICAgIENocm9taXVtVW51c2VkRmQqKiBwcDsK
KyAgICAgICAgICAgIGZvciAocHAgPSAmcE8tPnBVbnVzZWQ7ICpwcCAmJiAoKnBwKS0+ZmxhZ3Mg
IT0gZmxhZ3M7IHBwID0gJigoKnBwKS0+cE5leHQpKSB7IH0KKyAgICAgICAgICAgIHBVbnVzZWQg
PSAqcHA7CisgICAgICAgICAgICBpZiAocFVudXNlZCkKKyAgICAgICAgICAgICAgICAqcHAgPSBw
VW51c2VkLT5wTmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcFVudXNlZDsKK30K
IAogLy8gT3BlbnMgYSBmaWxlLgogLy8KQEAgLTU5LDE0ICs5NzMsMjYgQEAgbmFtZXNwYWNlIHsK
IC8vIGlkIC0gdGhlIHN0cnVjdHVyZSB0aGF0IHdpbGwgbWFuaXB1bGF0ZSB0aGUgbmV3bHkgb3Bl
bmVkIGZpbGUuCiAvLyBkZXNpcmVkRmxhZ3MgLSB0aGUgZGVzaXJlZCBvcGVuIG1vZGUgZmxhZ3Mu
CiAvLyB1c2VkRmxhZ3MgLSB0aGUgYWN0dWFsIG9wZW4gbW9kZSBmbGFncyB0aGF0IHdlcmUgdXNl
ZC4KLWludCBjaHJvbWl1bU9wZW4oc3FsaXRlM192ZnMqIHZmcywgY29uc3QgY2hhciogZmlsZU5h
bWUsCi0gICAgICAgICAgICAgICAgIHNxbGl0ZTNfZmlsZSogaWQsIGludCBkZXNpcmVkRmxhZ3Ms
IGludCogdXNlZEZsYWdzKQorc3RhdGljIGludCBjaHJvbWl1bU9wZW4oc3FsaXRlM192ZnMqIHZm
cywgY29uc3QgY2hhciogZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUz
X2ZpbGUqIGlkLCBpbnQgZGVzaXJlZEZsYWdzLCBpbnQqIHVzZWRGbGFncykKIHsKLSAgICBjaHJv
bWl1bV9zcWxpdGUzX2luaXRpYWxpemVfdW5peF9zcWxpdGUzX2ZpbGUoaWQpOworICAgIC8vIFRo
ZSBtYXNrIDB4MDAwMDdGMDAgZ2l2ZXMgdXMgdGhlIDcgYml0cyB0aGF0IGRldGVybWluZSB0aGUg
dHlwZSBvZiB0aGUgZmlsZSBTUUxpdGUgaXMgdHJ5aW5nIHRvIG9wZW4uCisgICAgaW50IGZpbGVU
eXBlID0gZGVzaXJlZEZsYWdzICYgMHgwMDAwN0YwMDsKKworICAgIG1lbXNldChpZCwgMCwgc2l6
ZW9mKENocm9taXVtRmlsZSkpOworICAgIENocm9taXVtRmlsZSogY2hyb21pdW1GaWxlID0gcmVp
bnRlcnByZXRfY2FzdDxDaHJvbWl1bUZpbGUqPihpZCk7CiAgICAgaW50IGZkID0gLTE7Ci0gICAg
aW50IHJlc3VsdCA9IGNocm9taXVtX3NxbGl0ZTNfZ2V0X3JldXNhYmxlX2ZpbGVfaGFuZGxlKGlk
LCBmaWxlTmFtZSwgZGVzaXJlZEZsYWdzLCAmZmQpOwotICAgIGlmIChyZXN1bHQgIT0gU1FMSVRF
X09LKQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGlmIChmaWxlVHlwZSA9PSBTUUxJVEVf
T1BFTl9NQUlOX0RCKSB7CisgICAgICAgIENocm9taXVtVW51c2VkRmQqIHVudXNlZEZkID0gZmlu
ZFJldXNhYmxlRmQoZmlsZU5hbWUsIGRlc2lyZWRGbGFncyk7CisgICAgICAgIGlmICh1bnVzZWRG
ZCkKKyAgICAgICAgICAgIGZkID0gdW51c2VkRmQtPmZkOworICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgIHVudXNlZEZkID0gc3RhdGljX2Nhc3Q8Q2hyb21pdW1VbnVzZWRGZCo+KHNxbGl0ZTNf
bWFsbG9jKHNpemVvZigqdW51c2VkRmQpKSk7CisgICAgICAgICAgICBpZiAoIXVudXNlZEZkKQor
ICAgICAgICAgICAgICAgIHJldHVybiBTUUxJVEVfTk9NRU07CisgICAgICAgIH0KKyAgICAgICAg
Y2hyb21pdW1GaWxlLT5wVW51c2VkID0gdW51c2VkRmQ7CisgICAgfQogCiAgICAgaWYgKGZkIDwg
MCkgewogICAgICAgICBmZCA9IENocm9taXVtQnJpZGdlOjpkYXRhYmFzZU9wZW5GaWxlKGZpbGVO
YW1lLCBkZXNpcmVkRmxhZ3MpOwpAQCAtNzYsMjMgKzEwMDIsMjQgQEAgaW50IGNocm9taXVtT3Bl
bihzcWxpdGUzX3ZmcyogdmZzLCBjb25zdAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChmZCA8
IDApIHsKLSAgICAgICAgY2hyb21pdW1fc3FsaXRlM19kZXN0cm95X3JldXNhYmxlX2ZpbGVfaGFu
ZGxlKGlkKTsKKyAgICAgICAgc3FsaXRlM19mcmVlKGNocm9taXVtRmlsZS0+cFVudXNlZCk7CiAg
ICAgICAgIHJldHVybiBTUUxJVEVfQ0FOVE9QRU47CiAgICAgfQogCiAgICAgaWYgKHVzZWRGbGFn
cykKICAgICAgICAgKnVzZWRGbGFncyA9IGRlc2lyZWRGbGFnczsKLSAgICBjaHJvbWl1bV9zcWxp
dGUzX3VwZGF0ZV9yZXVzYWJsZV9maWxlX2hhbmRsZShpZCwgZmQsIGRlc2lyZWRGbGFncyk7Cisg
ICAgaWYgKGNocm9taXVtRmlsZS0+cFVudXNlZCkgeworICAgICAgICBjaHJvbWl1bUZpbGUtPnBV
bnVzZWQtPmZkID0gZmQ7CisgICAgICAgIGNocm9taXVtRmlsZS0+cFVudXNlZC0+ZmxhZ3MgPSBk
ZXNpcmVkRmxhZ3M7CisgICAgfQogCiAgICAgZmNudGwoZmQsIEZfU0VURkQsIGZjbnRsKGZkLCBG
X0dFVEZEKSB8IEZEX0NMT0VYRUMpOwogCi0gICAgLy8gVGhlIG1hc2sgMHgwMDAwN0YwMCBnaXZl
cyB1cyB0aGUgNyBiaXRzIHRoYXQgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBmaWxlIFNRTGl0
ZSBpcyB0cnlpbmcgdG8gb3Blbi4KLSAgICBpbnQgZmlsZVR5cGUgPSBkZXNpcmVkRmxhZ3MgJiAw
eDAwMDA3RjAwOwogICAgIGludCBub0xvY2sgPSAoZmlsZVR5cGUgIT0gU1FMSVRFX09QRU5fTUFJ
Tl9EQik7Ci0gICAgcmVzdWx0ID0gY2hyb21pdW1fc3FsaXRlM19maWxsX2luX3VuaXhfc3FsaXRl
M19maWxlKHZmcywgZmQsIC0xLCBpZCwgZmlsZU5hbWUsIG5vTG9jayk7Ci0gICAgaWYgKHJlc3Vs
dCAhPSBTUUxJVEVfT0spCi0gICAgICAgIGNocm9taXVtX3NxbGl0ZTNfZGVzdHJveV9yZXVzYWJs
ZV9maWxlX2hhbmRsZShpZCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpbnQgcmMgPSBmaWxs
SW5DaHJvbWl1bUZpbGUodmZzLCBmZCwgLTEsIGlkLCBmaWxlTmFtZSwgbm9Mb2NrKTsKKyAgICBp
ZiAocmMgIT0gU1FMSVRFX09LKQorICAgICAgICBzcWxpdGUzX2ZyZWUoY2hyb21pdW1GaWxlLT5w
VW51c2VkKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIC8vIERlbGV0ZXMgdGhlIGdpdmVuIGZpbGUu
CkBAIC0xMDEsNyArMTAyOCw3IEBAIGludCBjaHJvbWl1bU9wZW4oc3FsaXRlM192ZnMqIHZmcywg
Y29uc3QKIC8vIGZpbGVOYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGZpbGUuCiAvLyBzeW5jRGlyIC0g
ZGV0ZXJtaW5lcyBpZiB0aGUgZGlyZWN0b3J5IHRvIHdoaWNoIHRoaXMgZmlsZSBiZWxvbmdzCiAv
LyAgICAgICAgICAgc2hvdWxkIGJlIHN5bmNoZWQgYWZ0ZXIgdGhlIGZpbGUgaXMgZGVsZXRlZC4K
LWludCBjaHJvbWl1bURlbGV0ZShzcWxpdGUzX3ZmcyosIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBp
bnQgc3luY0RpcikKK3N0YXRpYyBpbnQgY2hyb21pdW1EZWxldGUoc3FsaXRlM192ZnMqLCBjb25z
dCBjaGFyKiBmaWxlTmFtZSwgaW50IHN5bmNEaXIpCiB7CiAgICAgcmV0dXJuIENocm9taXVtQnJp
ZGdlOjpkYXRhYmFzZURlbGV0ZUZpbGUoZmlsZU5hbWUsIHN5bmNEaXIpOwogfQpAQCAtMTEyLDcg
KzEwMzksNyBAQCBpbnQgY2hyb21pdW1EZWxldGUoc3FsaXRlM192ZnMqLCBjb25zdCBjCiAvLyBm
aWxlTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgogLy8gZmxhZyAtIHRoZSB0eXBlIG9mIHRl
c3QgdG8gbWFrZSBvbiB0aGlzIGZpbGUuCiAvLyByZXMgLSB0aGUgcmVzdWx0LgotaW50IGNocm9t
aXVtQWNjZXNzKHNxbGl0ZTNfdmZzKiwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBmbGFnLCBp
bnQqIHJlcykKK3N0YXRpYyBpbnQgY2hyb21pdW1BY2Nlc3Moc3FsaXRlM192ZnMqLCBjb25zdCBj
aGFyKiBmaWxlTmFtZSwgaW50IGZsYWcsIGludCogcmVzKQogewogICAgIGludCBhdHRyID0gc3Rh
dGljX2Nhc3Q8aW50PihDaHJvbWl1bUJyaWRnZTo6ZGF0YWJhc2VHZXRGaWxlQXR0cmlidXRlcyhm
aWxlTmFtZSkpOwogICAgIGlmIChhdHRyIDwgMCkgewpAQCAtMTIyLDcgKzEwNDksNyBAQCBpbnQg
Y2hyb21pdW1BY2Nlc3Moc3FsaXRlM192ZnMqLCBjb25zdCBjCiAKICAgICBzd2l0Y2ggKGZsYWcp
IHsKICAgICBjYXNlIFNRTElURV9BQ0NFU1NfRVhJU1RTOgotICAgICAgICAqcmVzID0gMTsgICAv
LyBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCBhdHRyIDwgMAorICAgICAgICAqcmVzID0gMTsg
Ly8gaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgYXR0ciA8IDAKICAgICAgICAgYnJlYWs7CiAg
ICAgY2FzZSBTUUxJVEVfQUNDRVNTX1JFQURXUklURToKICAgICAgICAgKnJlcyA9IChhdHRyICYg
V19PSykgJiYgKGF0dHIgJiBSX09LKTsKQEAgLTE0Myw4ICsxMDcwLDggQEAgaW50IGNocm9taXVt
QWNjZXNzKHNxbGl0ZTNfdmZzKiwgY29uc3QgYwogLy8gcmVsYXRpdmVQYXRoIC0gdGhlIHJlbGF0
aXZlIHBhdGguCiAvLyBidWZTaXplIC0gdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIgaW4g
Ynl0ZXMuCiAvLyBhYnNvbHV0ZVBhdGggLSB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgYWJz
b2x1dGUgcGF0aCB3aWxsIGJlIHN0b3JlZC4KLWludCBjaHJvbWl1bUZ1bGxQYXRobmFtZShzcWxp
dGUzX3ZmcyogdmZzLCBjb25zdCBjaGFyKiByZWxhdGl2ZVBhdGgsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgaW50LCBjaGFyKiBhYnNvbHV0ZVBhdGgpCitzdGF0aWMgaW50IGNocm9taXVtRnVs
bFBhdGhuYW1lKHNxbGl0ZTNfdmZzKiB2ZnMsIGNvbnN0IGNoYXIqIHJlbGF0aXZlUGF0aCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBjaGFyKiBhYnNvbHV0ZVBhdGgpCiB7
CiAgICAgLy8gVGhlIHJlbmRlcmVyIHByb2Nlc3MgZG9lc24ndCBuZWVkIHRvIGtub3cgdGhlIGFi
c29sdXRlIHBhdGggb2YgdGhlIGZpbGUKICAgICBzcWxpdGUzX3NucHJpbnRmKHZmcy0+bXhQYXRo
bmFtZSwgYWJzb2x1dGVQYXRoLCAiJXMiLCByZWxhdGl2ZVBhdGgpOwpAQCAtMTUyLDQ0ICsxMDc5
LDEwNyBAQCBpbnQgY2hyb21pdW1GdWxsUGF0aG5hbWUoc3FsaXRlM192ZnMqIHZmCiB9CiAKICNp
Zm5kZWYgU1FMSVRFX09NSVRfTE9BRF9FWFRFTlNJT04KLS8vIFJldHVybnMgTlVMTCwgdGh1cyBk
aXNhbGxvd2luZyBsb2FkaW5nIGxpYnJhcmllcyBpbiB0aGUgcmVuZGVyZXIgcHJvY2Vzcy4KLS8v
Ci0vLyB2ZnMgLSBwb2ludGVyIHRvIHRoZSBzcWxpdGUzX3ZmcyBvYmplY3QuCi0vLyBmaWxlTmFt
ZSAtIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBmaWxlLgotdm9pZCogY2hyb21pdW1E
bE9wZW4oc3FsaXRlM192ZnMqLCBjb25zdCBjaGFyKikKKy8vIFdlIGRpc2FsbG93IGxvYWRpbmcg
RFNPcyBpbnNpZGUgdGhlIHJlbmRlcmVyIHByb2Nlc3MsIHNvIHRoZSBmb2xsb3dpbmcgcHJvY2Vk
dXJlcyBhcmUgbm8tb3AuCitzdGF0aWMgdm9pZCogY2hyb21pdW1EbE9wZW4oc3FsaXRlM192ZnMq
LCBjb25zdCBjaGFyKikKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hyb21p
dW1EbEVycm9yKHNxbGl0ZTNfdmZzKiwgaW50LCBjaGFyKikKK3sKK30KKworc3RhdGljIHZvaWQg
KCpjaHJvbWl1bURsU3ltKHNxbGl0ZTNfdmZzKiwgdm9pZCosIGNvbnN0IGNoYXIqKSkoKQogewog
ICAgIHJldHVybiAwOwogfQorCitzdGF0aWMgdm9pZCBjaHJvbWl1bURsQ2xvc2Uoc3FsaXRlM192
ZnMqLCB2b2lkKikKK3sKK30KICNlbHNlCiAjZGVmaW5lIGNocm9taXVtRGxPcGVuIDAKKyNkZWZp
bmUgY2hyb21pdW1EbEVycm9yIDAKKyNkZWZpbmUgY2hyb21pdW1EbFN5bSAwCisjZGVmaW5lIGNo
cm9taXVtRGxDbG9zZSAwCiAjZW5kaWYgLy8gU1FMSVRFX09NSVRfTE9BRF9FWFRFTlNJT04KIAot
fSAvLyBuYW1lc3BhY2UKKy8vIEdlbmVyYXRlcyBhIHNlZWQgZm9yIFNRTGl0ZSdzIFBSTkcuCitz
dGF0aWMgaW50IGNocm9taXVtUmFuZG9tbmVzcyhzcWxpdGUzX3ZmcyosIGludCBuQnVmLCBjaGFy
ICp6QnVmKQoreworICAgIEFTU0VSVChzdGF0aWNfY2FzdDxzaXplX3Q+KG5CdWYpID49IChzaXpl
b2YodGltZV90KSArIHNpemVvZihpbnQpKSk7CisKKyAgICBtZW1zZXQoekJ1ZiwgMCwgbkJ1Zik7
CisgICAgaW50IGZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOworICAgIGlmIChm
ZCA8IDApIHsKKyAgICAgICAgdGltZV90IHQ7CisgICAgICAgIHRpbWUoJnQpOworICAgICAgICBt
ZW1jcHkoekJ1ZiwgJnQsIHNpemVvZih0KSk7CisgICAgICAgIGludCBwaWQgPSBnZXRwaWQoKTsK
KyAgICAgICAgbWVtY3B5KCZ6QnVmW3NpemVvZih0KV0sICZwaWQsIHNpemVvZihwaWQpKTsKKyAg
ICAgICAgcmV0dXJuIHNpemVvZih0KSArIHNpemVvZihwaWQpOworICAgIH0KKyAgICBuQnVmID0g
cmVhZChmZCwgekJ1ZiwgbkJ1Zik7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiBuQnVmOwor
fQorCisvLyBTbGVlcHMgZm9yIGF0IGxlYXN0IHxtaWNyb3NlY29uZHN8LCBhbmQgcmV0dXJucyB0
aGUgYWN0dWFsCisvLyBhbW91bnQgb2YgdGltZSBzcGVudCBzbGVlcGluZyAoaW4gbWljcm9zZWNv
bmRzKS4KK3N0YXRpYyBpbnQgY2hyb21pdW1TbGVlcChzcWxpdGUzX3ZmcyosIGludCBtaWNyb3Nl
Y29uZHMpCit7CisjaWYgUExBVEZPUk0oTUFDKQorICAgIHVzbGVlcChtaWNyb3NlY29uZHMpOwor
ICAgIHJldHVybiBtaWNyb3NlY29uZHM7CisjZWxzZQorICAgIC8vIFJvdW5kIHRvIHRoZSBuZWFy
ZXN0IHNlY29uZC4KKyAgICBpbnQgc2Vjb25kcyA9IChtaWNyb3NlY29uZHMgKyA5OTk5OTkpIC8g
MTAwMDAwMDsKKyAgICBzbGVlcChzZWNvbmRzKTsKKyAgICByZXR1cm4gc2Vjb25kcyAqIDEwMDAw
MDA7CisjZW5kaWYKK30KKworLy8gUmV0cmlldmVzIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIChV
VEMpLgorc3RhdGljIGludCBjaHJvbWl1bUN1cnJlbnRUaW1lKHNxbGl0ZTNfdmZzKiwgZG91Ymxl
KiBub3cpCit7CisgICAgc3RydWN0IHRpbWV2YWwgdGltZXZhbDsKKyAgICBnZXR0aW1lb2ZkYXko
JnRpbWV2YWwsIDApOworICAgICpub3cgPSAyNDQwNTg3LjUgKyB0aW1ldmFsLnR2X3NlYyAvIDg2
NDAwLjAgKyB0aW1ldmFsLnR2X3VzZWMgLyA4NjQwMDAwMDAwMC4wOworICAgIHJldHVybiAwOwor
fQorCisvLyBUaGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU1FMaXRlIGNvcmUuCitzdGF0
aWMgaW50IGNocm9taXVtR2V0TGFzdEVycm9yKHNxbGl0ZTNfdmZzKiwgaW50LCBjaGFyKikKK3sK
KyAgICByZXR1cm4gMDsKK30KKworLy8gU2FtZSBhcyBNQVhfUEFUSE5BTUUgZnJvbSBzcWxpdGUn
cyBvc191bml4LmMuCitzdGF0aWMgY29uc3QgaW50IGNocm9taXVtTWF4UGF0aG5hbWUgPSA1MTI7
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdm9pZCBTUUxpdGVGaWxlU3lzdGVtOjpyZWdpc3Rl
clNRTGl0ZVZGUygpCiB7Ci0gICAgc3FsaXRlM192ZnMqIHVuaXhfdmZzID0gc3FsaXRlM192ZnNf
ZmluZCgidW5peCIpOwogICAgIHN0YXRpYyBzcWxpdGUzX3ZmcyBjaHJvbWl1bV92ZnMgPSB7CiAg
ICAgICAgIDEsCi0gICAgICAgIHVuaXhfdmZzLT5zek9zRmlsZSwKLSAgICAgICAgdW5peF92ZnMt
Pm14UGF0aG5hbWUsCisgICAgICAgIHNpemVvZihDaHJvbWl1bUZpbGUpLAorICAgICAgICBjaHJv
bWl1bU1heFBhdGhuYW1lLAogICAgICAgICAwLAogICAgICAgICAiY2hyb21pdW1fdmZzIiwKLSAg
ICAgICAgdW5peF92ZnMtPnBBcHBEYXRhLAorICAgICAgICAwLAogICAgICAgICBjaHJvbWl1bU9w
ZW4sCiAgICAgICAgIGNocm9taXVtRGVsZXRlLAogICAgICAgICBjaHJvbWl1bUFjY2VzcywKICAg
ICAgICAgY2hyb21pdW1GdWxsUGF0aG5hbWUsCiAgICAgICAgIGNocm9taXVtRGxPcGVuLAotICAg
ICAgICB1bml4X3Zmcy0+eERsRXJyb3IsCi0gICAgICAgIHVuaXhfdmZzLT54RGxTeW0sCi0gICAg
ICAgIHVuaXhfdmZzLT54RGxDbG9zZSwKLSAgICAgICAgdW5peF92ZnMtPnhSYW5kb21uZXNzLAot
ICAgICAgICB1bml4X3Zmcy0+eFNsZWVwLAotICAgICAgICB1bml4X3Zmcy0+eEN1cnJlbnRUaW1l
LAotICAgICAgICB1bml4X3Zmcy0+eEdldExhc3RFcnJvcgorICAgICAgICBjaHJvbWl1bURsRXJy
b3IsCisgICAgICAgIGNocm9taXVtRGxTeW0sCisgICAgICAgIGNocm9taXVtRGxDbG9zZSwKKyAg
ICAgICAgY2hyb21pdW1SYW5kb21uZXNzLAorICAgICAgICBjaHJvbWl1bVNsZWVwLAorICAgICAg
ICBjaHJvbWl1bUN1cnJlbnRUaW1lLAorICAgICAgICBjaHJvbWl1bUdldExhc3RFcnJvcgogICAg
IH07CiAgICAgc3FsaXRlM192ZnNfcmVnaXN0ZXIoJmNocm9taXVtX3ZmcywgMCk7CiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68693</attachid>
            <date>2010-09-24 09:33:00 -0700</date>
            <delta_ts>2010-09-24 16:17:59 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Paweł Hajdan, Jr.">phajdan.jr</attacher>
            
              <data encoding="base64"></data>

          </attachment>
      

    </bug>

</bugzilla>