<?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>79193</bug_id>
          
          <creation_ts>2012-02-21 21:52:11 -0800</creation_ts>
          <short_desc>[EFL] Implements FileSystem on EFL port</short_desc>
          <delta_ts>2013-06-06 22:18:36 -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>WebKit EFL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>91078</dependson>
    
    <dependson>91185</dependson>
    
    <dependson>91187</dependson>
    
    <dependson>98344</dependson>
    
    <dependson>99162</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dongwoo Joshua Im (dwim)">dw.im</reporter>
          <assigned_to name="Dongwoo Joshua Im (dwim)">dw.im</assigned_to>
          <cc>cdumez</cc>
    
    <cc>donggwan.kim</cc>
    
    <cc>ericu</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>jye.kang</cc>
    
    <cc>jye.kang</cc>
    
    <cc>kenneth</cc>
    
    <cc>kihong.kwon</cc>
    
    <cc>kinuko</cc>
    
    <cc>levin+threading</cc>
    
    <cc>lucas.de.marchi</cc>
    
    <cc>naginenis</cc>
    
    <cc>rakuco</cc>
    
    <cc>s.choi</cc>
    
    <cc>sw0524.lee</cc>
    
    <cc>tmpsantos</cc>
    
    <cc>tzik</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>561596</commentid>
    <comment_count>0</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-02-21 21:52:11 -0800</bug_when>
    <thetext>Below two File API are needed to be implemented on EFL port.

* File API: Writer - http://www.w3.org/TR/file-writer-api/
* File API: Directories and System - http://dev.w3.org/2009/dap/file-system/file-dir-sys.html

I&apos;m working on this patch now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>714325</commentid>
    <comment_count>1</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2012-09-07 02:44:02 -0700</bug_when>
    <thetext>Any news on this? This bug has been open for a long time...
Someone else can take over if you don&apos;t have time to work on this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>714346</commentid>
    <comment_count>2</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-09-07 03:14:45 -0700</bug_when>
    <thetext>Oh, 
I think I can upload the first patch in the week after next week.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>724141</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2012-09-19 21:53:27 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Oh, 
&gt; I think I can upload the first patch in the week after next week.

Any news on this? It&apos;s been 2 weeks. As I said, we are happy to work on this if you don&apos;t have time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725066</commentid>
    <comment_count>4</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-09-20 18:46:29 -0700</bug_when>
    <thetext>I&apos;ve been long business trip. ;)
Now, I have some time to make a patch for this.

Actually, I&apos;ve already implemented this feature in our local repository,
so I don&apos;t think it will take much time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725437</commentid>
    <comment_count>5</comment_count>
      <attachid>165121</attachid>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-09-21 05:33:20 -0700</bug_when>
    <thetext>Created attachment 165121
First patch

This is my first patch to implement the File System API on EFL port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725441</commentid>
    <comment_count>6</comment_count>
      <attachid>165121</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2012-09-21 05:39:47 -0700</bug_when>
    <thetext>Comment on attachment 165121
First patch

if you don&apos;t unskip any test case, how do we know your patch works?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725455</commentid>
    <comment_count>7</comment_count>
      <attachid>165121</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-09-21 06:04:14 -0700</bug_when>
    <thetext>Comment on attachment 165121
First patch

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

This is a huge patch backed by no tests whatsoever. Can it be split into minor patches with actual tests?

&gt; Source/WebCore/ChangeLog:17
&gt; +        (WebCore::AsyncFileSystem::deleteFileSystem):
&gt; +        (WebCore::LocalFileSystem::deleteFileSystem):

No comment why you changed the RefPtr to an OwnPtr

&gt; Source/WebCore/platform/efl/AsyncFileSystemCallbacksEfl.cpp:138
&gt; +void AsyncFileSystemCallbacksEfl::didReadDirectoryEntries(bool hasMore)
&gt; +{
&gt; +    if (hasMore)
&gt; +        ASSERT_NOT_REACHED();

Why does it have the argument then?

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:52
&gt; +    storageIdentifier = storageIdentifier + &quot;:&quot;;

+ &apos;:&apos;

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:56
&gt; +    rootURL.append(&quot;filesystem:&quot;);

appendLiteral

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:60
&gt; +    rootURL.append(typeString + &quot;/&quot; + identifier + &quot;/&quot;);

&apos;/&apos; should be faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725459</commentid>
    <comment_count>8</comment_count>
      <attachid>165121</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2012-09-21 06:11:51 -0700</bug_when>
    <thetext>Comment on attachment 165121
First patch

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

&gt; Source/WebCore/platform/efl/AsyncFileSystemCallbacksEfl.cpp:137
&gt; +    if (hasMore)

ASSERT(!hasMore) ?

&gt; Source/WebCore/platform/efl/AsyncFileSystemCallbacksEfl.cpp:141
&gt; +    for (Vector&lt;DirectoryEntry&gt;::iterator it = m_directoryEntries.begin(); it != end; ++it)

Coding style says we should prefer indexes over iterators to improve readability.

&gt; Source/WebCore/platform/efl/AsyncFileSystemCallbacksEfl.h:68
&gt; +        DirectoryEntry() : isDirectory(false) { }

How about a constructor which sets the name and isDirectory members?

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:51
&gt; +    String storageIdentifier = identifier;

Please use StringBuilder (http://trac.webkit.org/wiki/EfficientStrings)

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:56
&gt; +    rootURL.append(&quot;filesystem:&quot;);

appendLiteral()

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:59
&gt; +        rootURL.append(&quot;/&quot;);

append(&apos;/&apos;)

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:63
&gt; +        makeAllDirectories(rootURL.toString().substring(11));

Maybe a comment to explain why the substring?

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:242
&gt; +    if (removeDirectoryEntries(path))

This is not really async, we should probably use EIO at some point.

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:288
&gt; +    PlatformFileHandle handle;

Why 2 lines?

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:434
&gt; +    if (!virtualPath.string().startsWith(&quot;filesystem:&quot;))

!virtualPath.protocolIs(&quot;filesystem&quot;) ?

&gt; Source/WebCore/platform/efl/AsyncFileSystemTaskControllerEfl.cpp:39
&gt; +    else

I would put { } since it is on several lines.

&gt; Source/WebCore/platform/efl/AsyncFileSystemTaskControllerEfl.cpp:56
&gt; +    else

Ditto.

&gt; Source/WebCore/platform/efl/AsyncFileSystemTaskControllerEfl.cpp:70
&gt; +    else

Ditto.

&gt; Source/WebCore/platform/efl/AsyncFileSystemTaskControllerEfl.cpp:88
&gt; +#if ENABLE(WORKERS)

Ditto.

&gt; Source/WebCore/platform/efl/AsyncFileSystemTaskControllerEfl.h:45
&gt; +    String uniqueMode();

const?

&gt; Source/WebCore/platform/efl/AsyncFileSystemTaskControllerEfl.h:52
&gt; +    FileSystemSynchronousType synchronousType() { return m_synchronousType; }

const?

&gt; Source/WebCore/platform/efl/AsyncFileWriterEfl.cpp:46
&gt; +    int bytesWritten;

Please define this in the scope where it is needed.

&gt; Source/WebCore/platform/efl/AsyncFileWriterEfl.cpp:47
&gt; +    PlatformFileHandle handle;

Why 2 lines?

&gt; Source/WebCore/platform/efl/AsyncFileWriterEfl.cpp:52
&gt; +        for (int i = 0; i &lt; blobStorage-&gt;items().size(); i++) {

1. We should probably cache blobStorage-&gt;items() and blobStorage-&gt;items().size() to avoid calling them at each iteration.
2. Also, shouldn&apos;t we use size_t instead of int? 
3. Please use preincrement ++i

&gt; Source/WebCore/platform/efl/AsyncFileWriterEfl.cpp:92
&gt; +    PlatformFileHandle handle;

Why on 2 lines?

&gt; Source/WebCore/platform/posix/FileSystemPOSIX.cpp:291
&gt; +        return false;

Shouldn&apos;t you close srcFile before returning?

&gt; Source/WebCore/platform/posix/FileSystemPOSIX.cpp:293
&gt; +    int readSize;

Can be defined inside the loop condition

&gt; Source/WebCore/platform/posix/FileSystemPOSIX.cpp:294
&gt; +    int writeSize;

Can be defined inside the if condition

&gt; Source/WebCore/platform/posix/FileSystemPOSIX.cpp:298
&gt; +            return false;

Shouldn&apos;t you close the files before returning?

&gt; Source/WebCore/platform/posix/FileSystemPOSIX.cpp:305
&gt; +bool removeDirectory(const String&amp; path)

The function to remove a file is called deleteFile(), shouldn&apos;t we call this one deleteDirectory() for consistency?

&gt; Source/WebCore/platform/posix/FileSystemPOSIX.cpp:321
&gt; +        String absolutePath = pathByAppendingComponent(path, String(directoryEntry-&gt;d_name));

String::fromUTF8(directoryEntry-&gt;d_name) otherwise it only works for ascii.

&gt; Source/WebCore/platform/posix/FileSystemPOSIX.cpp:324
&gt; +            return false;

Shouldn&apos;t you close the directory before returning?

&gt; Source/WebCore/platform/posix/FileSystemPOSIX.cpp:333
&gt; +            return false;

You&apos;re returning without closing the directory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725463</commentid>
    <comment_count>9</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-09-21 06:16:16 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 165121 [details])
&gt; if you don&apos;t unskip any test case, how do we know your patch works?

Actually, I&apos;ve run the sample tests on HTML5Rocks sites.
 - http://www.html5rocks.com/en/tutorials/file/filesystem/

And, I cannot find &quot;Layouttest/fast/filesystem&quot; in both Skipped and TestExpectations files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725464</commentid>
    <comment_count>10</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-09-21 06:16:53 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 165121 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=165121&amp;action=review
&gt; 
&gt; This is a huge patch backed by no tests whatsoever. Can it be split into minor patches with actual tests?
&gt; 

I will try to split this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725465</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2012-09-21 06:19:49 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #6)
&gt; &gt; (From update of attachment 165121 [details] [details])
&gt; &gt; if you don&apos;t unskip any test case, how do we know your patch works?
&gt; 
&gt; Actually, I&apos;ve run the sample tests on HTML5Rocks sites.
&gt;  - http://www.html5rocks.com/en/tutorials/file/filesystem/
&gt; 
&gt; And, I cannot find &quot;Layouttest/fast/filesystem&quot; in both Skipped and TestExpectations files.

$ git grep filesystem LayoutTests/platform/efl*
LayoutTests/platform/efl/Skipped:http/tests/security/contentSecurityPolicy/filesystem-urls-match-self.html
LayoutTests/platform/efl/TestExpectations:webkit.org/b/68591 fast/filesystem
LayoutTests/platform/efl/TestExpectations:webkit.org/b/68591 fast/mutation/filesystem-callback-delivery.html
LayoutTests/platform/efl/TestExpectations:webkit.org/b/68591 http/tests/filesystem
LayoutTests/platform/efl/TestExpectations:webkit.org/b/68591 http/tests/security/filesystem-iframe-from-remote.html
LayoutTests/platform/efl/TestExpectations:webkit.org/b/68591 http/tests/security/mixedContent/filesystem-url-in-iframe.html
LayoutTests/platform/efl/TestExpectations:webkit.org/b/68591 http/tests/inspector/filesystem</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725503</commentid>
    <comment_count>12</comment_count>
      <attachid>165121</attachid>
    <who name="Taiju Tsuiki">tzik</who>
    <bug_when>2012-09-21 07:25:53 -0700</bug_when>
    <thetext>Comment on attachment 165121
First patch

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

&gt; Source/WebCore/platform/efl/AsyncFileSystemEfl.cpp:173
&gt; +    if (link(sourcePath.utf8().data(), destinationPath.utf8().data()) == -1)

Does it make hard link?
If we copy A to B and write something to A, should B also be overwritten?

&gt; Source/WebCore/platform/efl/AsyncFileWriterEfl.cpp:48
&gt; +    handle = openFile(path, OpenForWrite);

position seems not to be used. Maybe, we need seekFile here.

&gt; Source/WebCore/platform/efl/AsyncFileWriterEfl.cpp:65
&gt; +                if (copyFile(blobItem.path, path))

Does this write to correct position? Looks like writing from head of the file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726328</commentid>
    <comment_count>13</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-09-23 18:16:03 -0700</bug_when>
    <thetext>Wow..
Huge patch, and huge comments! ;-)

My first task might be split this patch into 2 or 3 patches.
I will apply those comments below into the new patches.
(And, for sure, I will leave &apos;done&apos; comments here, also.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726487</commentid>
    <comment_count>14</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-09-24 02:33:35 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 165121 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=165121&amp;action=review
&gt; 
&gt; This is a huge patch backed by no tests whatsoever. Can it be split into minor patches with actual tests?
&gt; 

How about this?

To easy review, I will upload a skeleton code for the first patch, such as https://bugs.webkit.org/show_bug.cgi?id=91187 which I uploaded before.
First patch will be uploaded without enabling no new test cases.

Then, I will add some implementation as another patch with enabling test cases for that.
I will try to make the patches in proper size to review at once.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726489</commentid>
    <comment_count>15</comment_count>
    <who name="Gyuyoung Kim">gyuyoung.kim</who>
    <bug_when>2012-09-24 02:37:22 -0700</bug_when>
    <thetext>If you follow efl patch contribution style(e.g public API with unit test, public file with installation and so on.), I prefer to split huge patch into smaller one personally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>730239</commentid>
    <comment_count>16</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-09-27 22:13:14 -0700</bug_when>
    <thetext>I&apos;ve upload a skeleton code at https://bugs.webkit.org/show_bug.cgi?id=91187.
Please review this patch first.

Real implementation patches will follow this patch, in proper size to easy review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734857</commentid>
    <comment_count>17</comment_count>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2012-10-04 11:20:50 -0700</bug_when>
    <thetext>(Reposting this from bug #58443)

For what it&apos;s worth, the File API: Directories and System specification[1] is being considered for a move to the Note track[2].

Translated, it means the work on this particular specification will probably cease. There are already considerations of a similar but simplified approach though[3][4].

[1] http://dev.w3.org/2009/dap/file-system/file-dir-sys.html
[2] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0791.html
[3] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0823.html
[4] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0827.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736446</commentid>
    <comment_count>18</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-10-07 17:17:04 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; (Reposting this from bug #58443)
&gt; 
&gt; For what it&apos;s worth, the File API: Directories and System specification[1] is being considered for a move to the Note track[2].
&gt; 
&gt; Translated, it means the work on this particular specification will probably cease. There are already considerations of a similar but simplified approach though[3][4].
&gt; 
&gt; [1] http://dev.w3.org/2009/dap/file-system/file-dir-sys.html
&gt; [2] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0791.html
&gt; [3] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0823.html
&gt; [4] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0827.html

I don&apos;t think it is worthless.

Because, there are already some web applications use this File System API to read/write files.
And, there is no other way to do this kind of things until new file system spec is  announced.

So, I think still it is valuable to implement this File System API in WebKit.

What do you think?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736588</commentid>
    <comment_count>19</comment_count>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2012-10-08 02:14:24 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #17)
&gt; &gt; (Reposting this from bug #58443)
&gt; &gt; 
&gt; &gt; For what it&apos;s worth, the File API: Directories and System specification[1] is being considered for a move to the Note track[2].
&gt; &gt; 
&gt; &gt; Translated, it means the work on this particular specification will probably cease. There are already considerations of a similar but simplified approach though[3][4].
&gt; &gt; 
&gt; &gt; [1] http://dev.w3.org/2009/dap/file-system/file-dir-sys.html
&gt; &gt; [2] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0791.html
&gt; &gt; [3] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0823.html
&gt; &gt; [4] http://lists.w3.org/Archives/Public/public-webapps/2012JulSep/0827.html
&gt; 
&gt; I don&apos;t think it is worthless.
&gt; 
&gt; Because, there are already some web applications use this File System API to read/write files.
&gt; And, there is no other way to do this kind of things until new file system spec is  announced.
&gt; 
&gt; So, I think still it is valuable to implement this File System API in WebKit.
&gt; 
&gt; What do you think?

To sum up a bit longer answer that&apos;s at https://bugs.webkit.org/show_bug.cgi?id=58443#c52 - it&apos;s definitely not worthless. (Let&apos;s try to keep any further discussion of this in one thread, please - simplifies everyone&apos;s work.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>758555</commentid>
    <comment_count>20</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2012-11-05 08:28:32 -0800</bug_when>
    <thetext>Any update on this? There hasn&apos;t seem to be much progress recently.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759530</commentid>
    <comment_count>21</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-11-06 04:41:50 -0800</bug_when>
    <thetext>(In reply to comment #20)
&gt; Any update on this? There hasn&apos;t seem to be much progress recently.

Ye.. little progress, but not much, though.

I don&apos;t have much time to concentrate to File System currently,
that&apos;s why this bug is still delayed.

Do you have any plan to use this feature in the near future?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759534</commentid>
    <comment_count>22</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2012-11-06 04:46:43 -0800</bug_when>
    <thetext>(In reply to comment #21)
&gt; (In reply to comment #20)
&gt; &gt; Any update on this? There hasn&apos;t seem to be much progress recently.
&gt; 
&gt; Ye.. little progress, but not much, though.
&gt; 
&gt; I don&apos;t have much time to concentrate to File System currently,
&gt; that&apos;s why this bug is still delayed.
&gt; 
&gt; Do you have any plan to use this feature in the near future?

Well, this is an important API so we would like it upstream sooner rather than later. We were planning to work on this but since you have a patch I think it is better you upstream it first before we make contributions to this area.

Personally, I think it would be nice to use eio library for AsyncFileSystem instead of faking asynchronism. I would like to work on that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>759579</commentid>
    <comment_count>23</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-11-06 05:59:11 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; (In reply to comment #21)
&gt; &gt; (In reply to comment #20)
&gt; &gt; &gt; Any update on this? There hasn&apos;t seem to be much progress recently.
&gt; &gt; 
&gt; &gt; Ye.. little progress, but not much, though.
&gt; &gt; 
&gt; &gt; I don&apos;t have much time to concentrate to File System currently,
&gt; &gt; that&apos;s why this bug is still delayed.
&gt; &gt; 
&gt; &gt; Do you have any plan to use this feature in the near future?
&gt; 
&gt; Well, this is an important API so we would like it upstream sooner rather than later. We were planning to work on this but since you have a patch I think it is better you upstream it first before we make contributions to this area.
&gt; 
&gt; Personally, I think it would be nice to use eio library for AsyncFileSystem instead of faking asynchronism. I would like to work on that.

The FileSystem is pretty much dead (talk to Wayne). I think that indexedDB was said to cover most of the same use cases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>760224</commentid>
    <comment_count>24</comment_count>
    <who name="Dongwoo Joshua Im (dwim)">dw.im</who>
    <bug_when>2012-11-06 17:12:52 -0800</bug_when>
    <thetext>(In reply to comment #23)
&gt; The FileSystem is pretty much dead (talk to Wayne). I think that indexedDB was said to cover most of the same use cases.

We already discussed about this issue with Zan Dobersek on https://bugs.webkit.org/show_bug.cgi?id=79193#c17, 
https://bugs.webkit.org/show_bug.cgi?id=79193#c19, 
and https://bugs.webkit.org/show_bug.cgi?id=58443#c52.

It seems there are some number of proposals which can replace the File System API.

But, I still think this implementation could be valuable because there are already some web applications use this File System API to read/write files, and there is no other way to do this kind of things until new file system spec is  announced.

What do you think, Kenneth?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>760437</commentid>
    <comment_count>25</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-11-07 00:36:12 -0800</bug_when>
    <thetext>(In reply to comment #24)
&gt; (In reply to comment #23)
&gt; &gt; The FileSystem is pretty much dead (talk to Wayne). I think that indexedDB was said to cover most of the same use cases.
&gt; 
&gt; We already discussed about this issue with Zan Dobersek on https://bugs.webkit.org/show_bug.cgi?id=79193#c17, 
&gt; https://bugs.webkit.org/show_bug.cgi?id=79193#c19, 
&gt; and https://bugs.webkit.org/show_bug.cgi?id=58443#c52.
&gt; 
&gt; It seems there are some number of proposals which can replace the File System API.
&gt; 
&gt; But, I still think this implementation could be valuable because there are already some web applications use this File System API to read/write files, and there is no other way to do this kind of things until new file system spec is  announced.
&gt; 
&gt; What do you think, Kenneth?

I think that people are backing away from this, and then we should as well, or otherwise the web becomes a very fragmented place.

FileSystem is a bad name because it only allows you to create files in a sandbox, and apparently indexedDB does more or less the same - I think that was the conclusion from this years W3C TPAC meeting, but I wasn&apos;t there myself.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>760439</commentid>
    <comment_count>26</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-11-07 00:39:06 -0800</bug_when>
    <thetext>More info: https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/

If apps can&apos;t migrate to indexedDB, there is a polyfill (using indexedDB) here: http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>760463</commentid>
    <comment_count>27</comment_count>
    <who name="Kinuko Yasuda">kinuko</who>
    <bug_when>2012-11-07 01:26:50 -0800</bug_when>
    <thetext>(In reply to comment #26)
&gt; More info: https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
&gt; 
&gt; If apps can&apos;t migrate to indexedDB, there is a polyfill (using indexedDB) here: http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api

I wouldn&apos;t strongly object, but to clarify: 1) the TPAC&apos;s voting results seem to indicate the community still supports further iteration as there&apos;s some interest in a (but not the current) &apos;file system&apos; API. 2) IndexedDB could cover most usage but in general it&apos;s not designed to store huge mutable data, so we should keep watching if it (the spec and possible implementation) could really cover such scenario well.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>165121</attachid>
            <date>2012-09-21 05:33:20 -0700</date>
            <delta_ts>2012-10-03 18:20:57 -0700</delta_ts>
            <desc>First patch</desc>
            <filename>patch_0921_05</filename>
            <type>text/plain</type>
            <size>61042</size>
            <attacher name="Dongwoo Joshua Im (dwim)">dw.im</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNv
cmUvQ01ha2VMaXN0cy50eHQKaW5kZXggNGIwMjUwNi4uZWQ2YmQ1OSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTE0NCw2ICsxNDQsNyBAQCBTRVQoV2ViQ29yZV9JRExfRklMRVMKICAgICBNb2R1
bGVzL2JhdHRlcnkvQmF0dGVyeU1hbmFnZXIuaWRsCiAgICAgTW9kdWxlcy9iYXR0ZXJ5L05hdmln
YXRvckJhdHRlcnkuaWRsCiAKKyAgICBNb2R1bGVzL2ZpbGVzeXN0ZW0vRGF0YVRyYW5zZmVySXRl
bUZpbGVTeXN0ZW0uaWRsCiAgICAgTW9kdWxlcy9maWxlc3lzdGVtL0RpcmVjdG9yeUVudHJ5Lmlk
bAogICAgIE1vZHVsZXMvZmlsZXN5c3RlbS9EaXJlY3RvcnlFbnRyeVN5bmMuaWRsCiAgICAgTW9k
dWxlcy9maWxlc3lzdGVtL0RpcmVjdG9yeVJlYWRlci5pZGwKQEAgLTE2NSw2ICsxNjYsNyBAQCBT
RVQoV2ViQ29yZV9JRExfRklMRVMKICAgICBNb2R1bGVzL2ZpbGVzeXN0ZW0vRmlsZVdyaXRlckNh
bGxiYWNrLmlkbAogICAgIE1vZHVsZXMvZmlsZXN5c3RlbS9GaWxlV3JpdGVyLmlkbAogICAgIE1v
ZHVsZXMvZmlsZXN5c3RlbS9GaWxlV3JpdGVyU3luYy5pZGwKKyAgICBNb2R1bGVzL2ZpbGVzeXN0
ZW0vSFRNTElucHV0RWxlbWVudEZpbGVTeXN0ZW0uaWRsCiAgICAgTW9kdWxlcy9maWxlc3lzdGVt
L01ldGFkYXRhLmlkbAogICAgIE1vZHVsZXMvZmlsZXN5c3RlbS9NZXRhZGF0YUNhbGxiYWNrLmlk
bAogICAgIE1vZHVsZXMvZmlsZXN5c3RlbS9Xb3JrZXJDb250ZXh0RmlsZVN5c3RlbS5pZGwKQEAg
LTc5MSw2ICs3OTMsNyBAQCBTRVQoV2ViQ29yZV9TT1VSQ0VTCiAgICAgTW9kdWxlcy9maWxlc3lz
dGVtL0ZpbGVXcml0ZXIuY3BwCiAgICAgTW9kdWxlcy9maWxlc3lzdGVtL0ZpbGVXcml0ZXJCYXNl
LmNwcAogICAgIE1vZHVsZXMvZmlsZXN5c3RlbS9GaWxlV3JpdGVyU3luYy5jcHAKKyAgICBNb2R1
bGVzL2ZpbGVzeXN0ZW0vSFRNTElucHV0RWxlbWVudEZpbGVTeXN0ZW0uY3BwCiAgICAgTW9kdWxl
cy9maWxlc3lzdGVtL0xvY2FsRmlsZVN5c3RlbS5jcHAKICAgICBNb2R1bGVzL2ZpbGVzeXN0ZW0v
V29ya2VyQ29udGV4dEZpbGVTeXN0ZW0uY3BwCiAgICAgCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZTBmN2QyZC4u
N2EwNWVmNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMyIEBACisyMDEyLTA5LTIxICBEb25nd29v
IEpvc2h1YSBJbSAgPGR3LmltQHNhbXN1bmcuY29tPgorCisgICAgICAgIFtFRkxdIEltcGxlbWVu
dHMgRmlsZVN5c3RlbSBvbiBFRkwgcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NzkxOTMKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBGaWxl
IFN5c3RlbSBBUEkgb24gRUZMIHBvcnQsCisgICAgICAgIHJlZ2FyZGluZyB0aGUgdHdvIHNwZWNp
ZmljYXRpb24gYmVsb3cuCisgICAgICAgIEZpbGUgQVBJOiBXcml0ZXIgLSBodHRwOi8vd3d3Lncz
Lm9yZy9UUi9maWxlLXdyaXRlci1hcGkvCisgICAgICAgIEZpbGUgQVBJOiBEaXJlY3RvcmllcyBh
bmQgU3lzdGVtIC0gaHR0cDovL3d3dy53My5vcmcvVFIvZmlsZS1zeXN0ZW0tYXBpLworCisgICAg
ICAgIFRlc3RlZCBieSBleGlzdGluZyBmaWxlc3lzdGVtIHRlc3RzLgorCisgICAgICAgICogcGxh
dGZvcm0vZWZsL0FzeW5jRmlsZVN5c3RlbUVmbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBc3lu
Y0ZpbGVTeXN0ZW06OmRlbGV0ZUZpbGVTeXN0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxG
aWxlU3lzdGVtOjpkZWxldGVGaWxlU3lzdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZUZp
bGVBc3luYyk6IENyZWF0ZSBhIGZpbGUgYXN5bmNocm9ub3NseSBpbnRvIHRoZSBmaWxlIHN5c3Rl
bSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAoV2ViQ29yZTo6QXN5bmNGaWxlU3lzdGVt
RWZsOjpjcmVhdGVGaWxlKTogQ3JlYXRlIGEgZmlsZSBpbnRvIHRoZSBmaWxlIHN5c3RlbSB3aXRo
IHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlRGlyZWN0b3J5QXN5bmMp
OiBDcmVhdGUgYSBkaXJlY3RvcnkgYXN5bmNocm9ub3NseSBpbnRvIHRoZSBmaWxlIHN5c3RlbSB3
aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAoV2ViQ29yZTo6QXN5bmNGaWxlU3lzdGVtRWZs
OjpjcmVhdGVEaXJlY3RvcnkpOiBDcmVhdGUgYSBkaXJlY3RvcnkgaW50byB0aGUgZmlsZSBzeXN0
ZW0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKFdlYkNvcmU6OkFzeW5jRmlsZVN5c3Rl
bUVmbDo6Y3JlYXRlU25hcHNob3RGaWxlQW5kUmVhZE1ldGFkYXRhKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmwuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6QXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmw6OkFzeW5jRmlsZVN5c3Rl
bVRhc2tDb250cm9sbGVyRWZsKTogQ29uc3RydWN0b3IuCisgICAgICAgIChXZWJDb3JlOjpBc3lu
Y0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbDo6dW5pcXVlTW9kZSk6IFJldHVybiBhIHN0cmlu
ZyB3aGljaCBjYW4gc2hvdyBjdXJyZW50IHRocmVhZCBpcyB3b3JrZXIgb3Igbm90LgorICAgICAg
ICAoV2ViQ29yZTo6QXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmw6OnBvc3RUYXNrVG9N
YWluVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkFzeW5jRmlsZVN5c3RlbVRhc2tDb250cm9s
bGVyRWZsOjpwb3N0Q2FsbGJhY2tUYXNrKToKKyAgICAgICAgKFdlYkNvcmU6OkFzeW5jRmlsZVN5
c3RlbVRhc2tDb250cm9sbGVyRWZsOjp3YWl0Rm9yVGFza1RvQ29tcGxldGUpOgorCiAyMDEyLTA5
LTIwICBBbGxhbiBTYW5kZmVsZCBKZW5zZW4gIDxhbGxhbi5qZW5zZW5Abm9raWEuY29tPgogCiAg
ICAgICAgIFtUb3VjaEFkanVzdG1lbnRdIFNpbXBsaWZ5IGFuZCBpbXByb3ZlIGh5YnJpZCBkaXN0
YW5jZSBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvZmlsZXN5
c3RlbS9Mb2NhbEZpbGVTeXN0ZW0uY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9maWxlc3lz
dGVtL0xvY2FsRmlsZVN5c3RlbS5jcHAKaW5kZXggMTllMmYxNS4uZTEwNjRhYiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9maWxlc3lzdGVtL0xvY2FsRmlsZVN5c3RlbS5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9maWxlc3lzdGVtL0xvY2FsRmlsZVN5c3RlbS5j
cHAKQEAgLTc3LDYgKzc3LDcgQEAgU3RyaW5nIExvY2FsRmlsZVN5c3RlbTo6ZmlsZVN5c3RlbUJh
c2VQYXRoKCkgY29uc3QKICAgICByZXR1cm4gbV9iYXNlUGF0aDsKIH0KIAorI2lmICFQTEFURk9S
TShFRkwpCiAvLyBGSVhNRTogQWRkIEZpbGVTeXN0ZW1UeXBlIHBhcmFtZXRlci4KIHN0YXRpYyB2
b2lkIG9wZW5GaWxlU3lzdGVtKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBjb25zdCBTdHJpbmcm
IGJhc2VQYXRoLCBjb25zdCBTdHJpbmcmIGlkZW50aWZpZXIsIGJvb2wgY3JlYXRlLCBQYXNzT3du
UHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQogewpAQCAtMTAxLDExICsx
MDIsMTIgQEAgdm9pZCBMb2NhbEZpbGVTeXN0ZW06OnJlcXVlc3RGaWxlU3lzdGVtKFNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQsIEZpbGVTeXMKICAgICBjb250ZXh0LT5wb3N0VGFzayhj
cmVhdGVDYWxsYmFja1Rhc2soJm9wZW5GaWxlU3lzdGVtLCBmaWxlU3lzdGVtQmFzZVBhdGgoKSwg
Y29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKS0+ZGF0YWJhc2VJZGVudGlmaWVyKCksIHRydWUsIGNh
bGxiYWNrcykpOwogfQogCi12b2lkIExvY2FsRmlsZVN5c3RlbTo6ZGVsZXRlRmlsZVN5c3RlbShT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0LCBGaWxlU3lzdGVtVHlwZSB0eXBlLCBQYXNz
UmVmUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQordm9pZCBMb2NhbEZp
bGVTeXN0ZW06OmRlbGV0ZUZpbGVTeXN0ZW0oU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4
dCwgRmlsZVN5c3RlbVR5cGUgdHlwZSwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFj
a3M+IGNhbGxiYWNrcykKIHsKICAgICAvLyBBc3luY0ZpbGVTeXN0ZW06OmRlbGV0ZUZpbGVTeXN0
ZW0gY2FsbHMgY2FsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZSBtZXRob2QgbmVlZHMgdG8g
YmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5LgogICAgIGNvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNh
bGxiYWNrVGFzaygmZGVsZXRlRmlsZVN5c3RlbSwgZmlsZXN5c3RlbUJhc2VQYXRoKCksIGNvbnRl
eHQtPnNlY3VyaXR5T3JpZ2luKCktPmRhdGFiYXNlSWRlbnRpZmllcigpLCB0eXBlLCBjYWxsYmFj
a3MpOwogfQorI2VuZGlmIC8vICFQTEFURk9STShFRkwpCiAKIH0gLy8gbmFtZXNwYWNlCiAKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1BsYXRmb3JtRWZsLmNtYWtlIGIvU291cmNlL1dlYkNv
cmUvUGxhdGZvcm1FZmwuY21ha2UKaW5kZXggNzBkNjhkNy4uZjA0ZTI3ZiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvUGxhdGZvcm1FZmwuY21ha2UKKysrIGIvU291cmNlL1dlYkNvcmUvUGxh
dGZvcm1FZmwuY21ha2UKQEAgLTMyOSwzICszMjksMTIgQEAgSUYgKEVOQUJMRV9XRUJfQVVESU8p
CiAgIEFERF9ERUZJTklUSU9OUygtRFVOSU5TVEFMTEVEX0FVRElPX1JFU09VUkNFU19ESVI9IiR7
V0VCQ09SRV9ESVJ9L3BsYXRmb3JtL2F1ZGlvL3Jlc291cmNlcyIpCiBFTkRJRiAoKQogCitJRiAo
RU5BQkxFX0ZJTEVfU1lTVEVNKQorICBMSVNUKEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKKyAgICBw
bGF0Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsLmNwcAorICAgIHBsYXRmb3Jt
L2VmbC9Bc3luY0ZpbGVTeXN0ZW1FZmwuY3BwCisgICAgcGxhdGZvcm0vZWZsL0FzeW5jRmlsZVN5
c3RlbVRhc2tDb250cm9sbGVyRWZsLmNwcAorICAgIHBsYXRmb3JtL2VmbC9Bc3luY0ZpbGVXcml0
ZXJDbGllbnRFZmwuY3BwCisgICAgcGxhdGZvcm0vZWZsL0FzeW5jRmlsZVdyaXRlckVmbC5jcHAK
KyAgKQorRU5ESUYgKCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0FzeW5j
RmlsZVN5c3RlbS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9Bc3luY0ZpbGVTeXN0ZW0u
Y3BwCmluZGV4IDI5ZjFlMjMuLmVlN2NlMDIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL0FzeW5jRmlsZVN5c3RlbS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
QXN5bmNGaWxlU3lzdGVtLmNwcApAQCAtMzksNyArMzksNyBAQAogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKLSNpZiAhUExBVEZPUk0oQ0hST01JVU0pICYmICFQTEFURk9STShHVEspICYmICFQTEFU
Rk9STShCTEFDS0JFUlJZKQorI2lmICFQTEFURk9STShDSFJPTUlVTSkgJiYgIVBMQVRGT1JNKEdU
SykgJiYgIVBMQVRGT1JNKEJMQUNLQkVSUlkpICYmICFQTEFURk9STShFRkwpCiBib29sIEFzeW5j
RmlsZVN5c3RlbTo6aXNBdmFpbGFibGUoKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9GaWxlU3lzdGVtLmggYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9GaWxlU3lzdGVtLmgKaW5kZXggOTQzY2M3Yi4uMjFiZTZlYSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRmlsZVN5c3RlbS5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL0ZpbGVTeXN0ZW0uaApAQCAtMjI5LDYgKzIyOSwxMSBAQCBTdHJpbmcg
cm9hbWluZ1VzZXJTcGVjaWZpY1N0b3JhZ2VEaXJlY3RvcnkoKTsKIGJvb2wgc2FmZUNyZWF0ZUZp
bGUoY29uc3QgU3RyaW5nJiwgQ0ZEYXRhUmVmKTsKICNlbmRpZgogCisjaWYgUExBVEZPUk0oRUZM
KQorYm9vbCBjb3B5RmlsZShjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmKTsKK2Jvb2wgcmVt
b3ZlRGlyZWN0b3J5KGNvbnN0IFN0cmluZyYgcGF0aCk7CisjZW5kaWYKKwogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gRmlsZVN5c3RlbV9oCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9Bc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmwuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjZWQ1NDEKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtQ2FsbGJh
Y2tzRWZsLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBT
YW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQXN5
bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsLmgiCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisK
KyNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW1FZmwuaCIKKyNpbmNsdWRlICJBc3luY0ZpbGVXcml0
ZXIuaCIKKyNpbmNsdWRlICJDcm9zc1RocmVhZFRhc2suaCIKKyNpbmNsdWRlICJGaWxlTWV0YWRh
dGEuaCIKKworI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCit0ZW1wbGF0ZTw+IHN0cnVjdCBDcm9zc1RocmVhZENvcGllckJhc2U8ZmFsc2UsIGZh
bHNlLCBGaWxlTWV0YWRhdGE+IHsKKyAgICB0eXBlZGVmIEZpbGVNZXRhZGF0YSBUeXBlOworICAg
IHN0YXRpYyBGaWxlTWV0YWRhdGEgY29weShjb25zdCBGaWxlTWV0YWRhdGEmKTsKK307CisKK0Ny
b3NzVGhyZWFkQ29waWVyQmFzZTxmYWxzZSwgZmFsc2UsIEZpbGVNZXRhZGF0YT46OlR5cGUgQ3Jv
c3NUaHJlYWRDb3BpZXJCYXNlPGZhbHNlLCBmYWxzZSwgRmlsZU1ldGFkYXRhPjo6Y29weShjb25z
dCBGaWxlTWV0YWRhdGEmIG9yaWdpbmFsKQoreworICAgIEZpbGVNZXRhZGF0YSBtZXRhZGF0YTsK
KyAgICBtZXRhZGF0YS5tb2RpZmljYXRpb25UaW1lID0gb3JpZ2luYWwubW9kaWZpY2F0aW9uVGlt
ZTsKKyAgICBtZXRhZGF0YS5sZW5ndGggPSBvcmlnaW5hbC5sZW5ndGg7CisgICAgbWV0YWRhdGEu
dHlwZSA9IG9yaWdpbmFsLnR5cGU7CisgICAgbWV0YWRhdGEucGxhdGZvcm1QYXRoID0gb3JpZ2lu
YWwucGxhdGZvcm1QYXRoOworICAgIHJldHVybiBtZXRhZGF0YTsKK30KKworc3RhdGljIHZvaWQg
cGVyZm9ybURpZFN1Y2NlZWRDYWxsYmFjayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc093
blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcykKK3sKKyAgICBjYWxsYmFj
a3MtPmRpZFN1Y2NlZWQoKTsKK30KKworc3RhdGljIHZvaWQgcGVyZm9ybURpZE9wZW5GaWxlU3lz
dGVtQ2FsbGJhY2soU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NPd25QdHI8QXN5bmNGaWxl
U3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgS1VS
TCYgcm9vdFVSTCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW0+IGZpbGVTeXN0ZW0pCit7Cisg
ICAgY2FsbGJhY2tzLT5kaWRPcGVuRmlsZVN5c3RlbShuYW1lLCByb290VVJMLCBmaWxlU3lzdGVt
KTsKK30KKworc3RhdGljIHZvaWQgcGVyZm9ybURpZFJlYWRNZXRhZGF0YUNhbGxiYWNrKFNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4g
Y2FsbGJhY2tzLCBjb25zdCBGaWxlTWV0YWRhdGEmIG1ldGFkYXRhKQoreworICAgIGNhbGxiYWNr
cy0+ZGlkUmVhZE1ldGFkYXRhKG1ldGFkYXRhKTsKK30KKworc3RhdGljIHZvaWQgcGVyZm9ybURp
ZFJlYWREaXJlY3RvcnlFbnRyeUNhbGxiYWNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBBc3lu
Y0ZpbGVTeXN0ZW1DYWxsYmFja3MqIGNhbGxiYWNrcywgY29uc3QgU3RyaW5nJiBuYW1lLCBib29s
IGlzRGlyZWN0b3J5KQoreworICAgIGNhbGxiYWNrcy0+ZGlkUmVhZERpcmVjdG9yeUVudHJ5KG5h
bWUsIGlzRGlyZWN0b3J5KTsKK30KKworc3RhdGljIHZvaWQgcGVyZm9ybURpZFJlYWREaXJlY3Rv
cnlFbnRyaWVzQ2FsbGJhY2soU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEFzeW5jRmlsZVN5c3Rl
bUNhbGxiYWNrcyogY2FsbGJhY2tzKQoreworICAgIGNhbGxiYWNrcy0+ZGlkUmVhZERpcmVjdG9y
eUVudHJpZXModHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZvcm1EaWRSZWFkRGlyZWN0b3J5
RW50cmllc0FuZEZpbmlzaGVkQ2FsbGJhY2soU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NP
d25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MpCit7CisgICAgY2FsbGJh
Y2tzLT5kaWRSZWFkRGlyZWN0b3J5RW50cmllcyhmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBl
cmZvcm1EaWRDcmVhdGVGaWxlV3JpdGVyQ2FsbGJhY2soU2NyaXB0RXhlY3V0aW9uQ29udGV4dCos
IFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFBhc3NPd25Q
dHI8QXN5bmNGaWxlV3JpdGVyPiB3cml0ZXIsIGxvbmcgbG9uZyBsZW5ndGgpCit7CisgICAgY2Fs
bGJhY2tzLT5kaWRDcmVhdGVGaWxlV3JpdGVyKHdyaXRlciwgbGVuZ3RoKTsKK30KKworc3RhdGlj
IHZvaWQgcGVyZm9ybURpZEZhaWxDYWxsYmFjayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFz
c093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcywgaW50IGNvZGUpCit7
CisgICAgY2FsbGJhY2tzLT5kaWRGYWlsKGNvZGUpOworfQorCitBc3luY0ZpbGVTeXN0ZW1DYWxs
YmFja3NFZmw6OkFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbChTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiBjb250ZXh0LCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJh
Y2tzLCBGaWxlU3lzdGVtU3luY2hyb25vdXNUeXBlIHN5bmNocm9ub3VzVHlwZSkKKyAgICA6IG1f
dGFza0NvbnRyb2xsZXIoQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmw6OmNyZWF0ZShj
b250ZXh0LCBzeW5jaHJvbm91c1R5cGUpKQorICAgICwgbV9jYWxsYmFja3MoY2FsbGJhY2tzKQor
ICAgICwgbV9zeW5jaHJvbm91c1R5cGUoc3luY2hyb25vdXNUeXBlKQorICAgICwgbV90YXNrTW9k
ZShTdHJpbmcoKSkKK3sKK30KKworQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsOjpBc3luY0Zp
bGVTeXN0ZW1DYWxsYmFja3NFZmwoQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmwqIHRh
c2tDb250cm9sbGVyLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJh
Y2tzLCBjb25zdCBTdHJpbmcmIG1vZGUpCisgICAgOiBtX3Rhc2tDb250cm9sbGVyKHRhc2tDb250
cm9sbGVyKQorICAgICwgbV9jYWxsYmFja3MoY2FsbGJhY2tzKQorICAgICwgbV9zeW5jaHJvbm91
c1R5cGUoQXN5bmNocm9ub3VzRmlsZVN5c3RlbSkKKyAgICAsIG1fdGFza01vZGUobW9kZSkKK3sK
K30KKwordm9pZCBBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw6OmRpZFN1Y2NlZWQoKQorewor
ICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RDYWxsYmFja1Rhc2soY3JlYXRlQ2FsbGJhY2tUYXNr
KCZwZXJmb3JtRGlkU3VjY2VlZENhbGxiYWNrLCBtX2NhbGxiYWNrcy5yZWxlYXNlKCkpLCBtX3Rh
c2tNb2RlKTsKK30KKwordm9pZCBBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw6OmRpZE9wZW5G
aWxlU3lzdGVtKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgS1VSTCYgcm9vdFVSTCwgUGFzc093
blB0cjxBc3luY0ZpbGVTeXN0ZW0+IGZpbGVTeXN0ZW0pCit7CisgICAgQXN5bmNGaWxlU3lzdGVt
RWZsKiBmaWxlU3lzdGVtRWZsID0gc3RhdGljX2Nhc3Q8QXN5bmNGaWxlU3lzdGVtRWZsKj4oZmls
ZVN5c3RlbS5nZXQoKSk7CisKKyAgICBTdHJpbmcgbW9kZSA9IG1fdGFza0NvbnRyb2xsZXItPnVu
aXF1ZU1vZGUoKTsKKyAgICBtX3Rhc2tDb250cm9sbGVyLT5zZXRDdXJyZW50VGFza01vZGUobW9k
ZSk7CisgICAgbV90YXNrQ29udHJvbGxlci0+cG9zdENhbGxiYWNrVGFzayhjcmVhdGVDYWxsYmFj
a1Rhc2soJnBlcmZvcm1EaWRPcGVuRmlsZVN5c3RlbUNhbGxiYWNrLCBtX2NhbGxiYWNrcy5yZWxl
YXNlKCksIG5hbWUsIHJvb3RVUkwsIGZpbGVTeXN0ZW0pLCBtb2RlKTsKKyAgICBmaWxlU3lzdGVt
RWZsLT5zZXRUYXNrQ29udHJvbGxlcihtX3Rhc2tDb250cm9sbGVyLnJlbGVhc2UoKSk7CisgICAg
ZmlsZVN5c3RlbUVmbC0+d2FpdEZvck9wZXJhdGlvblRvQ29tcGxldGUoKTsKK30KKwordm9pZCBB
c3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw6OmRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlTWV0
YWRhdGEmIG1ldGFkYXRhKQoreworICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RDYWxsYmFja1Rh
c2soY3JlYXRlQ2FsbGJhY2tUYXNrKCZwZXJmb3JtRGlkUmVhZE1ldGFkYXRhQ2FsbGJhY2ssIG1f
Y2FsbGJhY2tzLnJlbGVhc2UoKSwgbWV0YWRhdGEpLCBtX3Rhc2tNb2RlKTsKK30KKwordm9pZCBB
c3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw6OmRpZFJlYWREaXJlY3RvcnlFbnRyeShjb25zdCBT
dHJpbmcmIG5hbWUsIGJvb2wgaXNEaXJlY3RvcnkpCit7CisgICAgRGlyZWN0b3J5RW50cnkgZGly
ZWN0b3J5RW50cnk7CisgICAgZGlyZWN0b3J5RW50cnkubmFtZSA9IG5hbWU7CisgICAgZGlyZWN0
b3J5RW50cnkuaXNEaXJlY3RvcnkgPSBpc0RpcmVjdG9yeTsKKyAgICBtX2RpcmVjdG9yeUVudHJp
ZXMuYXBwZW5kKGRpcmVjdG9yeUVudHJ5KTsKK30KKwordm9pZCBBc3luY0ZpbGVTeXN0ZW1DYWxs
YmFja3NFZmw6OmRpZFJlYWREaXJlY3RvcnlFbnRyaWVzKGJvb2wgaGFzTW9yZSkKK3sKKyAgICBp
ZiAoaGFzTW9yZSkKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICBWZWN0b3I8
RGlyZWN0b3J5RW50cnk+OjppdGVyYXRvciBlbmQgPSBtX2RpcmVjdG9yeUVudHJpZXMuZW5kKCk7
CisgICAgZm9yIChWZWN0b3I8RGlyZWN0b3J5RW50cnk+OjppdGVyYXRvciBpdCA9IG1fZGlyZWN0
b3J5RW50cmllcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIG1fY2FsbGJhY2tz
LT5kaWRSZWFkRGlyZWN0b3J5RW50cnkoaXQtPm5hbWUsIGl0LT5pc0RpcmVjdG9yeSk7CisKKyAg
ICBtX2RpcmVjdG9yeUVudHJpZXMuY2xlYXIoKTsKKworICAgIG1fdGFza0NvbnRyb2xsZXItPnBv
c3RDYWxsYmFja1Rhc2soY3JlYXRlQ2FsbGJhY2tUYXNrKCZwZXJmb3JtRGlkUmVhZERpcmVjdG9y
eUVudHJpZXNBbmRGaW5pc2hlZENhbGxiYWNrLCBtX2NhbGxiYWNrcy5yZWxlYXNlKCkpLCBtX3Rh
c2tNb2RlKTsKK30KKwordm9pZCBBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw6OmRpZENyZWF0
ZUZpbGVXcml0ZXIoUGFzc093blB0cjxBc3luY0ZpbGVXcml0ZXI+IHdyaXRlciwgbG9uZyBsb25n
IGxlbmd0aCkKK3sKKyAgICBtX3Rhc2tDb250cm9sbGVyLT5wb3N0Q2FsbGJhY2tUYXNrKGNyZWF0
ZUNhbGxiYWNrVGFzaygmcGVyZm9ybURpZENyZWF0ZUZpbGVXcml0ZXJDYWxsYmFjaywgbV9jYWxs
YmFja3MucmVsZWFzZSgpLCB3cml0ZXIsIGxlbmd0aCksIG1fdGFza01vZGUpOworfQorCit2b2lk
IEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbDo6ZGlkRmFpbChpbnQgY29kZSkKK3sKKyAgICBt
X3Rhc2tDb250cm9sbGVyLT5wb3N0Q2FsbGJhY2tUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmcGVy
Zm9ybURpZEZhaWxDYWxsYmFjaywgbV9jYWxsYmFja3MucmVsZWFzZSgpLCBjb2RlKSwgbV90YXNr
TW9kZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShG
SUxFX1NZU1RFTSkKKwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZsL0Fz
eW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZs
L0FzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4
IDAwMDAwMDAuLjVhZWRmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsLmgKQEAgLTAsMCArMSw3OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVm
IEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbF9oCisjZGVmaW5lIEFzeW5jRmlsZVN5c3RlbUNh
bGxiYWNrc0VmbF9oCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3lu
Y0ZpbGVTeXN0ZW1DYWxsYmFja3MuaCIKKyNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW1UYXNrQ29u
dHJvbGxlckVmbC5oIgorI2luY2x1ZGUgIkZpbGVTeXN0ZW1UeXBlLmgiCisjaW5jbHVkZSAiU2Ny
aXB0RXhlY3V0aW9uQ29udGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsIDog
cHVibGljIEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcyB7CitwdWJsaWM6CisgICAgc3RhdGljIFBh
c3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsPiBjcmVhdGUoU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCogY29udGV4dCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+
IGNhbGxiYWNrcywgRmlsZVN5c3RlbVN5bmNocm9ub3VzVHlwZSBzeW5jaHJvbm91c1R5cGUpCisg
ICAgeworICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNr
c0VmbChjb250ZXh0LCBjYWxsYmFja3MsIHN5bmNocm9ub3VzVHlwZSkpOworICAgIH0KKworICAg
IHN0YXRpYyBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbD4gY3JlYXRlKEFz
eW5jRmlsZVN5c3RlbVRhc2tDb250cm9sbGVyRWZsKiB0YXNrQ29udHJvbGxlciwgUGFzc093blB0
cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcywgY29uc3QgU3RyaW5nJiBtb2Rl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBBc3luY0ZpbGVTeXN0ZW1DYWxs
YmFja3NFZmwodGFza0NvbnRyb2xsZXIsIGNhbGxiYWNrcywgbW9kZSkpOworICAgIH0KKworCisg
ICAgdmlydHVhbCB2b2lkIGRpZFN1Y2NlZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkT3BlbkZp
bGVTeXN0ZW0oY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBLVVJMJiByb290VVJMLCBQYXNzT3du
UHRyPEFzeW5jRmlsZVN5c3RlbT4pOworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkTWV0YWRhdGEo
Y29uc3QgRmlsZU1ldGFkYXRhJik7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWREaXJlY3RvcnlF
bnRyeShjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgaXNEaXJlY3RvcnkpOworICAgIHZpcnR1YWwg
dm9pZCBkaWRSZWFkRGlyZWN0b3J5RW50cmllcyhib29sIGhhc01vcmUpOworICAgIHZpcnR1YWwg
dm9pZCBkaWRDcmVhdGVGaWxlV3JpdGVyKFBhc3NPd25QdHI8QXN5bmNGaWxlV3JpdGVyPiwgbG9u
ZyBsb25nIGxlbmd0aCk7CisgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwoaW50IGNvZGUpOworCitw
cml2YXRlOgorICAgIEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbChTY3JpcHRFeGVjdXRpb25D
b250ZXh0KiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+LCBGaWxlU3lzdGVt
U3luY2hyb25vdXNUeXBlKTsKKyAgICBBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmwoQXN5bmNG
aWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmwqLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNh
bGxiYWNrcz4sIGNvbnN0IFN0cmluZyYpOworCisgICAgUmVmUHRyPEFzeW5jRmlsZVN5c3RlbVRh
c2tDb250cm9sbGVyRWZsPiBtX3Rhc2tDb250cm9sbGVyOworICAgIE93blB0cjxBc3luY0ZpbGVT
eXN0ZW1DYWxsYmFja3M+IG1fY2FsbGJhY2tzOworICAgIEZpbGVTeXN0ZW1TeW5jaHJvbm91c1R5
cGUgbV9zeW5jaHJvbm91c1R5cGU7CisgICAgU3RyaW5nIG1fdGFza01vZGU7CisKKyAgICBzdHJ1
Y3QgRGlyZWN0b3J5RW50cnkgeworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgYm9vbCBp
c0RpcmVjdG9yeTsKKworICAgICAgICBEaXJlY3RvcnlFbnRyeSgpIDogaXNEaXJlY3RvcnkoZmFs
c2UpIHsgfQorICAgIH07CisKKyAgICBWZWN0b3I8RGlyZWN0b3J5RW50cnk+IG1fZGlyZWN0b3J5
RW50cmllczsKK307CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9T
WVNURU0pCisKKyNlbmRpZiAvLyBBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmxfaAorCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtRWZsLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9Bc3luY0ZpbGVTeXN0ZW1FZmwuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDcyYTYKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtRWZsLmNwcApA
QCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0
cm9uaWNzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQXN5bmNGaWxlU3lzdGVt
RWZsLmgiCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0ZpbGVT
eXN0ZW1DYWxsYmFja3NFZmwuaCIKKyNpbmNsdWRlICJBc3luY0ZpbGVXcml0ZXJFZmwuaCIKKyNp
bmNsdWRlICJDcm9zc1RocmVhZFRhc2suaCIKKyNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCisj
aW5jbHVkZSAiRmlsZUVycm9yLmgiCisjaW5jbHVkZSAiRmlsZU1ldGFkYXRhLmgiCisjaW5jbHVk
ZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIkxvY2FsRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRl
ICJkaXJlbnQuaCIKKyNpbmNsdWRlICJzeXMvc3RhdC5oIgorI2luY2x1ZGUgInN5cy90eXBlcy5o
IgorI2luY2x1ZGUgInRpbWUuaCIKKyNpbmNsdWRlICJ1bmlzdGQuaCIKKyNpbmNsdWRlIDx3dGYv
dGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgb3BlbkZpbGVTeXN0ZW0oU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCwgY29uc3QgU3RyaW5nJiBiYXNlUGF0aCwgY29uc3Qg
U3RyaW5nJiBpZGVudGlmaWVyLCBGaWxlU3lzdGVtVHlwZSB0eXBlLCBib29sIGNyZWF0ZSwgUGFz
c093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcywgRmlsZVN5c3RlbVN5
bmNocm9ub3VzVHlwZSBzeW5jaHJvbm91c1R5cGUpCit7CisgICAgU3RyaW5nIHR5cGVTdHJpbmcg
PSAodHlwZSA9PSBGaWxlU3lzdGVtVHlwZVBlcnNpc3RlbnQpID8gIlBlcnNpc3RlbnQiIDogIlRl
bXBvcmFyeSI7CisKKyAgICBTdHJpbmcgc3RvcmFnZUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwor
ICAgIHN0b3JhZ2VJZGVudGlmaWVyID0gc3RvcmFnZUlkZW50aWZpZXIgKyAiOiI7CisgICAgc3Rv
cmFnZUlkZW50aWZpZXIgPSBzdG9yYWdlSWRlbnRpZmllciArIHR5cGVTdHJpbmc7CisKKyAgICBT
dHJpbmdCdWlsZGVyIHJvb3RVUkw7CisgICAgcm9vdFVSTC5hcHBlbmQoImZpbGVzeXN0ZW06Iik7
CisgICAgcm9vdFVSTC5hcHBlbmQoYmFzZVBhdGgpOworICAgIGlmICghYmFzZVBhdGguZW5kc1dp
dGgoIi8iKSkKKyAgICAgICAgcm9vdFVSTC5hcHBlbmQoIi8iKTsKKyAgICByb290VVJMLmFwcGVu
ZCh0eXBlU3RyaW5nICsgIi8iICsgaWRlbnRpZmllciArICIvIik7CisKKyAgICBpZiAoY3JlYXRl
KQorICAgICAgICBtYWtlQWxsRGlyZWN0b3JpZXMocm9vdFVSTC50b1N0cmluZygpLnN1YnN0cmlu
ZygxMSkpOworCisgICAgQXN5bmNGaWxlU3lzdGVtOjpvcGVuRmlsZVN5c3RlbShyb290VVJMLnRv
U3RyaW5nKCksIHN0b3JhZ2VJZGVudGlmaWVyLCBjcmVhdGUsIEFzeW5jRmlsZVN5c3RlbUNhbGxi
YWNrc0VmbDo6Y3JlYXRlKGNvbnRleHQsIGNhbGxiYWNrcywgc3luY2hyb25vdXNUeXBlKSk7Cit9
CisKK2Jvb2wgQXN5bmNGaWxlU3lzdGVtOjppc0F2YWlsYWJsZSgpCit7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK1Bhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPiBBc3luY0ZpbGVTeXN0ZW06OmNy
ZWF0ZSgpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBBc3luY0ZpbGVTeXN0ZW1FZmwoKSk7
Cit9CisKKy8vIEZJWE1FOiBBZGQgRmlsZVN5c3RlbVR5cGUgcGFyYW1ldGVyLgordm9pZCBBc3lu
Y0ZpbGVTeXN0ZW06Om9wZW5GaWxlU3lzdGVtKGNvbnN0IFN0cmluZyYgYmFzZVBhdGgsIGNvbnN0
IFN0cmluZyYgc3RvcmFnZUlkZW50aWZpZXIsIGJvb2wsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lz
dGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MpCit7CisgICAgaWYgKGJhc2VQYXRoLmlzRW1wdHkoKSkg
eworICAgICAgICBjYWxsYmFja3MtPmRpZEZhaWwoRmlsZUVycm9yOjpTRUNVUklUWV9FUlIpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2FsbGJhY2tzLT5kaWRPcGVuRmlsZVN5c3Rl
bShzdG9yYWdlSWRlbnRpZmllciwgS1VSTChQYXJzZWRVUkxTdHJpbmcsIGJhc2VQYXRoKSwgQXN5
bmNGaWxlU3lzdGVtOjpjcmVhdGUoKSk7Cit9CisKK3ZvaWQgQXN5bmNGaWxlU3lzdGVtOjpkZWxl
dGVGaWxlU3lzdGVtKGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmluZyYsIEZpbGVTeXN0ZW1UeXBl
LCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQoreworICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgY2FsbGJhY2tzLT5kaWRGYWlsKE5PVF9TVVBQT1JURURf
RVJSKTsKK30KKwordm9pZCBMb2NhbEZpbGVTeXN0ZW06OmRlbGV0ZUZpbGVTeXN0ZW0oU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTeXN0ZW1UeXBlLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5
c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAg
Y2FsbGJhY2tzLT5kaWRGYWlsKE5PVF9TVVBQT1JURURfRVJSKTsKK30KKwordm9pZCBMb2NhbEZp
bGVTeXN0ZW06OnJlcXVlc3RGaWxlU3lzdGVtKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRl
eHQsIEZpbGVTeXN0ZW1UeXBlIHR5cGUsIGxvbmcgbG9uZywgUGFzc093blB0cjxBc3luY0ZpbGVT
eXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcywgRmlsZVN5c3RlbVN5bmNocm9ub3VzVHlwZSBzeW5j
aHJvbm91c1R5cGUpCit7CisgICAgb3BlbkZpbGVTeXN0ZW0oY29udGV4dCwgZmlsZVN5c3RlbUJh
c2VQYXRoKCksIGNvbnRleHQtPnNlY3VyaXR5T3JpZ2luKCktPmRhdGFiYXNlSWRlbnRpZmllcigp
LCB0eXBlLCB0cnVlLCBjYWxsYmFja3MsIHN5bmNocm9ub3VzVHlwZSk7Cit9CisKK3ZvaWQgTG9j
YWxGaWxlU3lzdGVtOjpyZWFkRmlsZVN5c3RlbShTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250
ZXh0LCBGaWxlU3lzdGVtVHlwZSB0eXBlLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxi
YWNrcz4gY2FsbGJhY2tzLCBGaWxlU3lzdGVtU3luY2hyb25vdXNUeXBlIHN5bmNocm9ub3VzVHlw
ZSkKK3sKKyAgICBvcGVuRmlsZVN5c3RlbShjb250ZXh0LCBmaWxlU3lzdGVtQmFzZVBhdGgoKSwg
Y29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKS0+ZGF0YWJhc2VJZGVudGlmaWVyKCksIHR5cGUsIGZh
bHNlLCBjYWxsYmFja3MsIHN5bmNocm9ub3VzVHlwZSk7Cit9CisKK0FzeW5jRmlsZVN5c3RlbUVm
bDo6QXN5bmNGaWxlU3lzdGVtRWZsKCkKKyAgICA6IEFzeW5jRmlsZVN5c3RlbSgpCisgICAgLCBt
X2xvY2FsRmlsZVN5c3RlbUJhc2VQYXRoKExvY2FsRmlsZVN5c3RlbTo6bG9jYWxGaWxlU3lzdGVt
KCkuZmlsZVN5c3RlbUJhc2VQYXRoKCkpCit7Cit9CisKK0FzeW5jRmlsZVN5c3RlbUVmbDo6fkFz
eW5jRmlsZVN5c3RlbUVmbCgpCit7Cit9CisKK3ZvaWQgQXN5bmNGaWxlU3lzdGVtRWZsOjpzdG9w
KCkKK3sKK30KKworYm9vbCBBc3luY0ZpbGVTeXN0ZW1FZmw6Omhhc1BlbmRpbmdBY3Rpdml0eSgp
Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFzeW5jRmlsZVN5c3RlbUVmbDo6d2Fp
dEZvck9wZXJhdGlvblRvQ29tcGxldGUoKQoreworICAgIHJldHVybiBtX3Rhc2tDb250cm9sbGVy
LT53YWl0Rm9yVGFza1RvQ29tcGxldGUoKTsKK30KKworc3RhdGljIHZvaWQgbW92ZUFzeW5jKFNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNr
c0VmbD4gaGVscGVyQ2FsbGJhY2tzLCBjb25zdCBTdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IFN0
cmluZyYgZGVzdGluYXRpb25QYXRoKQoreworICAgIGlmICghZmlsZUV4aXN0cyhzb3VyY2VQYXRo
KSkgeworICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZEZhaWwoRmlsZUVycm9yOjpOT1RfRk9V
TkRfRVJSKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChkZXN0aW5hdGlvblBh
dGguaXNFbXB0eSgpKSB7CisgICAgICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlkRmFpbChGaWxlRXJy
b3I6OlNFQ1VSSVRZX0VSUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocmVu
YW1lKHNvdXJjZVBhdGgudXRmOCgpLmRhdGEoKSwgZGVzdGluYXRpb25QYXRoLnV0ZjgoKS5kYXRh
KCkpID09IC0xKQorICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZEZhaWwoRmlsZUVycm9yOjpO
T1RfRk9VTkRfRVJSKTsKKyAgICBlbHNlCisgICAgICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlkU3Vj
Y2VlZCgpOworfQorCit2b2lkIEFzeW5jRmlsZVN5c3RlbUVmbDo6bW92ZShjb25zdCBLVVJMJiBz
cmNQYXRoLCBjb25zdCBLVVJMJiBkZXN0UGF0aCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1D
YWxsYmFja3M+IGNhbGxiYWNrcykKK3sKKyAgICBTdHJpbmcgc291cmNlRmlsZVN5c3RlbVBhdGgg
PSB2aXJ0dWFsUGF0aFRvRmlsZVN5c3RlbVBhdGgoc3JjUGF0aCk7CisgICAgU3RyaW5nIGRlc3Rp
bmF0aW9uRmlsZVN5c3RlbVBhdGggPSB2aXJ0dWFsUGF0aFRvRmlsZVN5c3RlbVBhdGgoZGVzdFBh
dGgpOworICAgIFN0cmluZyBtb2RlID0gbV90YXNrQ29udHJvbGxlci0+dW5pcXVlTW9kZSgpOwor
ICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNr
VGFzaygmbW92ZUFzeW5jLCBBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw6OmNyZWF0ZShtX3Rh
c2tDb250cm9sbGVyLmdldCgpLCBjYWxsYmFja3MsIG1vZGUpLCBzb3VyY2VGaWxlU3lzdGVtUGF0
aCwgZGVzdGluYXRpb25GaWxlU3lzdGVtUGF0aCkpOworfQorCitzdGF0aWMgdm9pZCBjb3B5QXN5
bmMoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2Fs
bGJhY2tzRWZsPiBoZWxwZXJDYWxsYmFja3MsIGNvbnN0IFN0cmluZyYgc291cmNlUGF0aCwgY29u
c3QgU3RyaW5nJiBkZXN0aW5hdGlvblBhdGgpCit7CisgICAgaWYgKCFmaWxlRXhpc3RzKHNvdXJj
ZVBhdGgpKSB7CisgICAgICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlkRmFpbChGaWxlRXJyb3I6Ok5P
VF9GT1VORF9FUlIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGRlc3RpbmF0
aW9uUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaGVscGVyQ2FsbGJhY2tzLT5kaWRGYWlsKEZp
bGVFcnJvcjo6U0VDVVJJVFlfRVJSKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlm
IChsaW5rKHNvdXJjZVBhdGgudXRmOCgpLmRhdGEoKSwgZGVzdGluYXRpb25QYXRoLnV0ZjgoKS5k
YXRhKCkpID09IC0xKQorICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZEZhaWwoRmlsZUVycm9y
OjpOT1RfRk9VTkRfRVJSKTsKKyAgICBlbHNlCisgICAgICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlk
U3VjY2VlZCgpOworfQorCit2b2lkIEFzeW5jRmlsZVN5c3RlbUVmbDo6Y29weShjb25zdCBLVVJM
JiBzcmNQYXRoLCBjb25zdCBLVVJMJiBkZXN0UGF0aCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0
ZW1DYWxsYmFja3M+IGNhbGxiYWNrcykKK3sKKyAgICBTdHJpbmcgc291cmNlRmlsZVN5c3RlbVBh
dGggPSB2aXJ0dWFsUGF0aFRvRmlsZVN5c3RlbVBhdGgoc3JjUGF0aCk7CisgICAgU3RyaW5nIGRl
c3RpbmF0aW9uRmlsZVN5c3RlbVBhdGggPSB2aXJ0dWFsUGF0aFRvRmlsZVN5c3RlbVBhdGgoZGVz
dFBhdGgpOworICAgIFN0cmluZyBtb2RlID0gbV90YXNrQ29udHJvbGxlci0+dW5pcXVlTW9kZSgp
OworICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxi
YWNrVGFzaygmY29weUFzeW5jLCBBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw6OmNyZWF0ZSht
X3Rhc2tDb250cm9sbGVyLmdldCgpLCBjYWxsYmFja3MsIG1vZGUpLCBzb3VyY2VGaWxlU3lzdGVt
UGF0aCwgZGVzdGluYXRpb25GaWxlU3lzdGVtUGF0aCkpOworfQorCitzdGF0aWMgdm9pZCByZW1v
dmVBc3luYyhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0
ZW1DYWxsYmFja3NFZmw+IGhlbHBlckNhbGxiYWNrcywgY29uc3QgU3RyaW5nJiBwYXRoKQorewor
ICAgIGlmIChkZWxldGVGaWxlKHBhdGgpKQorICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZFN1
Y2NlZWQoKTsKKyAgICBlbHNlCisgICAgICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlkRmFpbChGaWxl
RXJyb3I6Ok5PVF9GT1VORF9FUlIpOworfQorCit2b2lkIEFzeW5jRmlsZVN5c3RlbUVmbDo6cmVt
b3ZlKGNvbnN0IEtVUkwmIHBhdGgsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tz
PiBjYWxsYmFja3MpCit7CisgICAgU3RyaW5nIGZpbGVTeXN0ZW1QYXRoID0gdmlydHVhbFBhdGhU
b0ZpbGVTeXN0ZW1QYXRoKHBhdGgpOworICAgIFN0cmluZyBtb2RlID0gbV90YXNrQ29udHJvbGxl
ci0+dW5pcXVlTW9kZSgpOworICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RUYXNrVG9NYWluVGhy
ZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmcmVtb3ZlQXN5bmMsIEFzeW5jRmlsZVN5c3RlbUNhbGxi
YWNrc0VmbDo6Y3JlYXRlKG1fdGFza0NvbnRyb2xsZXIuZ2V0KCksIGNhbGxiYWNrcywgbW9kZSks
IGZpbGVTeXN0ZW1QYXRoKSk7Cit9CisKK3N0YXRpYyBib29sIHJlbW92ZURpcmVjdG9yeUVudHJp
ZXMoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIGlmICghZmlsZUV4aXN0cyhwYXRoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCByZXN1bHQ7CisgICAgRElSKiBkaXJlY3Rv
cnkgPSBvcGVuZGlyKHBhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgaWYgKCFkaXJlY3RvcnkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0cnVjdCBkaXJlbnQqIGRpcmVjdG9yeUVudHJ5
OworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBjaGFyIGFic29sdXRlUGF0aFsxMjA0XTsKKwor
ICAgIHdoaWxlICgoZGlyZWN0b3J5RW50cnkgPSByZWFkZGlyKGRpcmVjdG9yeSkpKSB7CisgICAg
ICAgIGlmICghc3RyY21wKGRpcmVjdG9yeUVudHJ5LT5kX25hbWUsICIuIikgfHwgIXN0cmNtcChk
aXJlY3RvcnlFbnRyeS0+ZF9uYW1lLCAiLi4iKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGludCBzaXplID0gc25wcmludGYoYWJzb2x1dGVQYXRoLCAxMDI0LCAiJXMvJXMiLCBw
YXRoLnV0ZjgoKS5kYXRhKCksIGRpcmVjdG9yeUVudHJ5LT5kX25hbWUpOworICAgICAgICBhYnNv
bHV0ZVBhdGhbc2l6ZV0gPSAnXDAnOworCisgICAgICAgIGlmIChsc3RhdChhYnNvbHV0ZVBhdGgs
ICZidWYpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChT
X0lTRElSKGJ1Zi5zdF9tb2RlKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlbW92ZURpcmVjdG9y
eUVudHJpZXMoU3RyaW5nKGFic29sdXRlUGF0aCkpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICByZXN1bHQgPSBkZWxldGVGaWxlKGFic29sdXRlUGF0aCk7CisKKyAgICAgICAgaWYgKCFyZXN1
bHQpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2xvc2VkaXIoZGly
ZWN0b3J5KTsKKworICAgIHJldHVybiBkZWxldGVFbXB0eURpcmVjdG9yeShwYXRoKTsKK30KKwor
c3RhdGljIHZvaWQgcmVtb3ZlUmVjdXJzaXZlbHlBc3luYyhTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw+IGhlbHBlckNhbGxiYWNr
cywgY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIGlmIChyZW1vdmVEaXJlY3RvcnlFbnRyaWVz
KHBhdGgpKQorICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZFN1Y2NlZWQoKTsKKyAgICBlbHNl
CisgICAgICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlkRmFpbChGaWxlRXJyb3I6Ok5PVF9GT1VORF9F
UlIpOworfQorCit2b2lkIEFzeW5jRmlsZVN5c3RlbUVmbDo6cmVtb3ZlUmVjdXJzaXZlbHkoY29u
c3QgS1VSTCYgcGF0aCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxi
YWNrcykKK3sKKyAgICBTdHJpbmcgZmlsZVN5c3RlbVBhdGggPSB2aXJ0dWFsUGF0aFRvRmlsZVN5
c3RlbVBhdGgocGF0aCk7CisgICAgU3RyaW5nIG1vZGUgPSBtX3Rhc2tDb250cm9sbGVyLT51bmlx
dWVNb2RlKCk7CisgICAgbV90YXNrQ29udHJvbGxlci0+cG9zdFRhc2tUb01haW5UaHJlYWQoY3Jl
YXRlQ2FsbGJhY2tUYXNrKCZyZW1vdmVSZWN1cnNpdmVseUFzeW5jLCBBc3luY0ZpbGVTeXN0ZW1D
YWxsYmFja3NFZmw6OmNyZWF0ZShtX3Rhc2tDb250cm9sbGVyLmdldCgpLCBjYWxsYmFja3MsIG1v
ZGUpLCBmaWxlU3lzdGVtUGF0aCkpOworfQorCitzdGF0aWMgdm9pZCByZWFkTWV0YWRhdGFBc3lu
YyhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxs
YmFja3NFZmw+IGhlbHBlckNhbGxiYWNrcywgY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIGlm
ICghZmlsZUV4aXN0cyhwYXRoKSkgeworICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZEZhaWwo
RmlsZUVycm9yOjpOT1RfRk9VTkRfRVJSKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBGaWxlTWV0YWRhdGEgbWV0YWRhdGE7CisKKyAgICBpZiAo
bHN0YXQocGF0aC51dGY4KCkuZGF0YSgpLCAmYnVmKSA9PSAtMSkgeworICAgICAgICBoZWxwZXJD
YWxsYmFja3MtPmRpZEZhaWwoRmlsZUVycm9yOjpOT1RfUkVBREFCTEVfRVJSKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIG1ldGFkYXRhLnR5cGUgPSBTX0lTRElSKGJ1Zi5zdF9tb2Rl
KSA/IEZpbGVNZXRhZGF0YTo6VHlwZURpcmVjdG9yeSA6IEZpbGVNZXRhZGF0YTo6VHlwZUZpbGU7
CisgICAgbWV0YWRhdGEubW9kaWZpY2F0aW9uVGltZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oYnVm
LnN0X210aW1lKTsKKyAgICBtZXRhZGF0YS5sZW5ndGggPSBzdGF0aWNfY2FzdDxsb25nIGxvbmc+
KGJ1Zi5zdF9zaXplKTsKKyAgICBtZXRhZGF0YS5wbGF0Zm9ybVBhdGggPSBwYXRoOworCisgICAg
aGVscGVyQ2FsbGJhY2tzLT5kaWRSZWFkTWV0YWRhdGEobWV0YWRhdGEpOworfQorCit2b2lkIEFz
eW5jRmlsZVN5c3RlbUVmbDo6cmVhZE1ldGFkYXRhKGNvbnN0IEtVUkwmIHBhdGgsIFBhc3NPd25Q
dHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MpCit7CisgICAgU3RyaW5nIGZp
bGVTeXN0ZW1QYXRoID0gdmlydHVhbFBhdGhUb0ZpbGVTeXN0ZW1QYXRoKHBhdGgpOworICAgIFN0
cmluZyBtb2RlID0gbV90YXNrQ29udHJvbGxlci0+dW5pcXVlTW9kZSgpOworICAgIG1fdGFza0Nv
bnRyb2xsZXItPnBvc3RUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmcmVhZE1l
dGFkYXRhQXN5bmMsIEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbDo6Y3JlYXRlKG1fdGFza0Nv
bnRyb2xsZXIuZ2V0KCksIGNhbGxiYWNrcywgbW9kZSksIGZpbGVTeXN0ZW1QYXRoKSk7Cit9CisK
Kworc3RhdGljIHZvaWQgY3JlYXRlRmlsZUFzeW5jKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQ
YXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbD4gaGVscGVyQ2FsbGJhY2tzLCBj
b25zdCBTdHJpbmcmIHBhdGgsIGJvb2wpCit7CisgICAgUGxhdGZvcm1GaWxlSGFuZGxlIGhhbmRs
ZTsKKyAgICBoYW5kbGUgPSBvcGVuRmlsZShwYXRoLCBPcGVuRm9yV3JpdGUpOworCisgICAgaWYg
KGhhbmRsZSAhPSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlKSB7CisgICAgICAgIGNsb3NlRmls
ZShoYW5kbGUpOworICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZFN1Y2NlZWQoKTsKKyAgICB9
IGVsc2UKKyAgICAgICAgaGVscGVyQ2FsbGJhY2tzLT5kaWRGYWlsKEZpbGVFcnJvcjo6Tk9UX0ZP
VU5EX0VSUik7Cit9CisKK3ZvaWQgQXN5bmNGaWxlU3lzdGVtRWZsOjpjcmVhdGVGaWxlKGNvbnN0
IEtVUkwmIHBhdGgsIGJvb2wgZXhjbHVzaXZlLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNh
bGxiYWNrcz4gY2FsbGJhY2tzKQoreworICAgIFN0cmluZyBmaWxlU3lzdGVtUGF0aCA9IHZpcnR1
YWxQYXRoVG9GaWxlU3lzdGVtUGF0aChwYXRoKTsKKyAgICBTdHJpbmcgbW9kZSA9IG1fdGFza0Nv
bnRyb2xsZXItPnVuaXF1ZU1vZGUoKTsKKyAgICBtX3Rhc2tDb250cm9sbGVyLT5wb3N0VGFza1Rv
TWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmNyZWF0ZUZpbGVBc3luYywgQXN5bmNGaWxl
U3lzdGVtQ2FsbGJhY2tzRWZsOjpjcmVhdGUobV90YXNrQ29udHJvbGxlci5nZXQoKSwgY2FsbGJh
Y2tzLCBtb2RlKSwgZmlsZVN5c3RlbVBhdGgsIGV4Y2x1c2l2ZSkpOworfQorCitzdGF0aWMgdm9p
ZCBjcmVhdGVEaXJlY3RvcnlBc3luYyhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc093blB0
cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3NFZmw+IGhlbHBlckNhbGxiYWNrcywgY29uc3QgU3Ry
aW5nJiBwYXRoLCBib29sKQoreworICAgIGlmIChtYWtlQWxsRGlyZWN0b3JpZXMocGF0aCkpCisg
ICAgICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlkU3VjY2VlZCgpOworICAgIGVsc2UKKyAgICAgICAg
aGVscGVyQ2FsbGJhY2tzLT5kaWRGYWlsKEZpbGVFcnJvcjo6Tk9UX0ZPVU5EX0VSUik7Cit9CisK
K3ZvaWQgQXN5bmNGaWxlU3lzdGVtRWZsOjpjcmVhdGVEaXJlY3RvcnkoY29uc3QgS1VSTCYgcGF0
aCwgYm9vbCBleGNsdXNpdmUsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBj
YWxsYmFja3MpCit7CisgICAgU3RyaW5nIGZpbGVTeXN0ZW1QYXRoID0gdmlydHVhbFBhdGhUb0Zp
bGVTeXN0ZW1QYXRoKHBhdGgpOworICAgIFN0cmluZyBtb2RlID0gbV90YXNrQ29udHJvbGxlci0+
dW5pcXVlTW9kZSgpOworICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RUYXNrVG9NYWluVGhyZWFk
KGNyZWF0ZUNhbGxiYWNrVGFzaygmY3JlYXRlRGlyZWN0b3J5QXN5bmMsIEFzeW5jRmlsZVN5c3Rl
bUNhbGxiYWNrc0VmbDo6Y3JlYXRlKG1fdGFza0NvbnRyb2xsZXIuZ2V0KCksIGNhbGxiYWNrcywg
bW9kZSksIGZpbGVTeXN0ZW1QYXRoLCBleGNsdXNpdmUpKTsKK30KKworc3RhdGljIHZvaWQgb2Jq
ZWN0RXhpc3RzQXN5bmMoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NPd25QdHI8QXN5bmNG
aWxlU3lzdGVtQ2FsbGJhY2tzRWZsPiBoZWxwZXJDYWxsYmFja3MsIGNvbnN0IFN0cmluZyYgcGF0
aCwgRmlsZU1ldGFkYXRhOjpUeXBlIHR5cGUpCit7CisgICAgaWYgKCFmaWxlRXhpc3RzKHBhdGgp
KSB7CisgICAgICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlkRmFpbChGaWxlRXJyb3I6Ok5PVF9GT1VO
RF9FUlIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IHN0YXQgYnVmOwor
ICAgIGlmIChsc3RhdChwYXRoLnV0ZjgoKS5kYXRhKCksICZidWYpID09IC0xKSB7CisgICAgICAg
IGhlbHBlckNhbGxiYWNrcy0+ZGlkRmFpbChGaWxlRXJyb3I6Ok5PVF9SRUFEQUJMRV9FUlIpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKFNfSVNESVIoYnVmLnN0X21vZGUpICYm
ICh0eXBlICE9RmlsZU1ldGFkYXRhOjpUeXBlRGlyZWN0b3J5KSkKKyAgICAgICAgaGVscGVyQ2Fs
bGJhY2tzLT5kaWRGYWlsKEZpbGVFcnJvcjo6VFlQRV9NSVNNQVRDSF9FUlIpOworICAgIGVsc2Ug
aWYgKCFTX0lTRElSKGJ1Zi5zdF9tb2RlKSAmJiAodHlwZSAhPUZpbGVNZXRhZGF0YTo6VHlwZUZp
bGUpKQorICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZEZhaWwoRmlsZUVycm9yOjpUWVBFX01J
U01BVENIX0VSUik7CisgICAgZWxzZQorICAgICAgICBoZWxwZXJDYWxsYmFja3MtPmRpZFN1Y2Nl
ZWQoKTsKK30KKwordm9pZCBBc3luY0ZpbGVTeXN0ZW1FZmw6OmZpbGVFeGlzdHMoY29uc3QgS1VS
TCYgcGF0aCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcykK
K3sKKyAgICBTdHJpbmcgZmlsZVN5c3RlbVBhdGggPSB2aXJ0dWFsUGF0aFRvRmlsZVN5c3RlbVBh
dGgocGF0aCk7CisgICAgU3RyaW5nIG1vZGUgPSBtX3Rhc2tDb250cm9sbGVyLT51bmlxdWVNb2Rl
KCk7CisgICAgbV90YXNrQ29udHJvbGxlci0+cG9zdFRhc2tUb01haW5UaHJlYWQoY3JlYXRlQ2Fs
bGJhY2tUYXNrKCZvYmplY3RFeGlzdHNBc3luYywgQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZs
OjpjcmVhdGUobV90YXNrQ29udHJvbGxlci5nZXQoKSwgY2FsbGJhY2tzLCBtb2RlKSwgZmlsZVN5
c3RlbVBhdGgsIEZpbGVNZXRhZGF0YTo6VHlwZUZpbGUpKTsKK30KKworCit2b2lkIEFzeW5jRmls
ZVN5c3RlbUVmbDo6ZGlyZWN0b3J5RXhpc3RzKGNvbnN0IEtVUkwmIHBhdGgsIFBhc3NPd25QdHI8
QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MpCit7CisgICAgU3RyaW5nIGZpbGVT
eXN0ZW1QYXRoID0gdmlydHVhbFBhdGhUb0ZpbGVTeXN0ZW1QYXRoKHBhdGgpOworICAgIFN0cmlu
ZyBtb2RlID0gbV90YXNrQ29udHJvbGxlci0+dW5pcXVlTW9kZSgpOworICAgIG1fdGFza0NvbnRy
b2xsZXItPnBvc3RUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmb2JqZWN0RXhp
c3RzQXN5bmMsIEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrc0VmbDo6Y3JlYXRlKG1fdGFza0NvbnRy
b2xsZXIuZ2V0KCksIGNhbGxiYWNrcywgbW9kZSksIGZpbGVTeXN0ZW1QYXRoLCBGaWxlTWV0YWRh
dGE6OlR5cGVEaXJlY3RvcnkpKTsKK30KKworc3RhdGljIHZvaWQgcmVhZERpcmVjdG9yeUFzeW5j
KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxi
YWNrc0VmbD4gY2FsbGJhY2tzLCBjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgaWYgKCFmaWxl
RXhpc3RzKHBhdGgpKSB7CisgICAgICAgIGNhbGxiYWNrcy0+ZGlkRmFpbChGaWxlRXJyb3I6Ok5P
VF9GT1VORF9FUlIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRElSKiBkaXJlY3Rv
cnkgPSBvcGVuZGlyKHBhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgaWYgKCFkaXJlY3RvcnkpIHsK
KyAgICAgICAgY2FsbGJhY2tzLT5kaWRGYWlsKEZpbGVFcnJvcjo6Tk9UX0ZPVU5EX0VSUik7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgZGlyZW50KiBkaXJlY3RvcnlFbnRy
eTsKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgYm9vbCBpc0VudHJ5RGlyZWN0b3J5OworICAg
IGNoYXIgYWJzb2x1dGVQYXRoWzEyMDRdOworCisgICAgd2hpbGUgKChkaXJlY3RvcnlFbnRyeSA9
IHJlYWRkaXIoZGlyZWN0b3J5KSkpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoZGlyZWN0b3J5RW50
cnktPmRfbmFtZSwgIi4iKSB8fCAhc3RyY21wKGRpcmVjdG9yeUVudHJ5LT5kX25hbWUsICIuLiIp
KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaW50IHNpemUgPSBzbnByaW50Zihh
YnNvbHV0ZVBhdGgsIDEwMjQsICIlcyVzIiwgcGF0aC51dGY4KCkuZGF0YSgpLCBkaXJlY3RvcnlF
bnRyeS0+ZF9uYW1lKTsKKyAgICAgICAgYWJzb2x1dGVQYXRoW3NpemVdID0gJ1wwJzsKKworICAg
ICAgICBpZiAobHN0YXQoYWJzb2x1dGVQYXRoLCAmYnVmKSA9PSAtMSkgeworICAgICAgICAgICAg
Y2FsbGJhY2tzLT5kaWRGYWlsKEZpbGVFcnJvcjo6Tk9UX1JFQURBQkxFX0VSUik7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoU19JU0RJUihidWYuc3RfbW9k
ZSkpCisgICAgICAgICAgICBpc0VudHJ5RGlyZWN0b3J5ID0gdHJ1ZTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgaXNFbnRyeURpcmVjdG9yeSA9IGZhbHNlOworCisgICAgICAgIGNhbGxiYWNr
cy0+ZGlkUmVhZERpcmVjdG9yeUVudHJ5KFN0cmluZyhkaXJlY3RvcnlFbnRyeS0+ZF9uYW1lKSwg
aXNFbnRyeURpcmVjdG9yeSk7CisgICAgfQorCisgICAgY2xvc2VkaXIoZGlyZWN0b3J5KTsKKwor
ICAgIGNhbGxiYWNrcy0+ZGlkUmVhZERpcmVjdG9yeUVudHJpZXMoZmFsc2UpOworfQorCit2b2lk
IEFzeW5jRmlsZVN5c3RlbUVmbDo6cmVhZERpcmVjdG9yeShjb25zdCBLVVJMJiBwYXRoLCBQYXNz
T3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQoreworICAgIFN0cmlu
ZyBmaWxlU3lzdGVtUGF0aCA9IHZpcnR1YWxQYXRoVG9GaWxlU3lzdGVtUGF0aChwYXRoKTsKKyAg
ICBTdHJpbmcgbW9kZSA9IG1fdGFza0NvbnRyb2xsZXItPnVuaXF1ZU1vZGUoKTsKKyAgICBtX3Rh
c2tDb250cm9sbGVyLT5wb3N0VGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnJl
YWREaXJlY3RvcnlBc3luYywgQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsOjpjcmVhdGUobV90
YXNrQ29udHJvbGxlci5nZXQoKSwgY2FsbGJhY2tzLCBtb2RlKSwgZmlsZVN5c3RlbVBhdGgpKTsK
K30KKworc3RhdGljIHZvaWQgY3JlYXRlV3JpdGVyQXN5bmMoU2NyaXB0RXhlY3V0aW9uQ29udGV4
dCosIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzRWZsPiBoZWxwZXJDYWxsYmFj
a3MsIEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIEFz
eW5jRmlsZVN5c3RlbVRhc2tDb250cm9sbGVyRWZsKiB0YXNrQ29udHJvbGxlcikKK3sKKyAgICBs
b25nIGxvbmcgZmlsZVNpemUgPSAwOworICAgIGdldEZpbGVTaXplKHBhdGgsIGZpbGVTaXplKTsK
KworICAgIGhlbHBlckNhbGxiYWNrcy0+ZGlkQ3JlYXRlRmlsZVdyaXRlcihBc3luY0ZpbGVXcml0
ZXJFZmw6OmNyZWF0ZShjbGllbnQsIHBhdGgsIHRhc2tDb250cm9sbGVyKSwgZmlsZVNpemUpOwor
fQorCit2b2lkIEFzeW5jRmlsZVN5c3RlbUVmbDo6Y3JlYXRlV3JpdGVyKEFzeW5jRmlsZVdyaXRl
ckNsaWVudCogY2xpZW50LCBjb25zdCBLVVJMJiBwYXRoLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5
c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQoreworICAgIFN0cmluZyBmaWxlU3lzdGVtUGF0aCA9
IHZpcnR1YWxQYXRoVG9GaWxlU3lzdGVtUGF0aChwYXRoKTsKKyAgICBTdHJpbmcgbW9kZSA9IG1f
dGFza0NvbnRyb2xsZXItPnVuaXF1ZU1vZGUoKTsKKyAgICBtX3Rhc2tDb250cm9sbGVyLT5zZXRD
dXJyZW50VGFza01vZGUobW9kZSk7CisgICAgbV90YXNrQ29udHJvbGxlci0+cG9zdFRhc2tUb01h
aW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZjcmVhdGVXcml0ZXJBc3luYywgQXN5bmNGaWxl
U3lzdGVtQ2FsbGJhY2tzRWZsOjpjcmVhdGUobV90YXNrQ29udHJvbGxlci5nZXQoKSwgY2FsbGJh
Y2tzLCBtb2RlKSwgQWxsb3dDcm9zc1RocmVhZEFjY2VzcyhjbGllbnQpLCBmaWxlU3lzdGVtUGF0
aCwgQWxsb3dDcm9zc1RocmVhZEFjY2VzcyhtX3Rhc2tDb250cm9sbGVyLmdldCgpKSkpOworfQor
Cit2b2lkIEFzeW5jRmlsZVN5c3RlbUVmbDo6Y3JlYXRlU25hcHNob3RGaWxlQW5kUmVhZE1ldGFk
YXRhKGNvbnN0IEtVUkwmLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4pCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBBc3luY0ZpbGVTeXN0ZW1FZmw6OnNl
dFRhc2tDb250cm9sbGVyKFBhc3NSZWZQdHI8QXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJF
Zmw+IHRhc2tDb250cm9sbGVyKQoreworICAgIG1fdGFza0NvbnRyb2xsZXIgPSB0YXNrQ29udHJv
bGxlcjsKK30KKworU3RyaW5nIEFzeW5jRmlsZVN5c3RlbUVmbDo6dmlydHVhbFBhdGhUb0ZpbGVT
eXN0ZW1QYXRoKGNvbnN0IEtVUkwmIHZpcnR1YWxQYXRoKQoreworICAgIGlmICghdmlydHVhbFBh
dGguc3RyaW5nKCkuc3RhcnRzV2l0aCgiZmlsZXN5c3RlbToiKSkKKyAgICAgICAgcmV0dXJuIHZp
cnR1YWxQYXRoLnN0cmluZygpOworCisgICAgcmV0dXJuIHZpcnR1YWxQYXRoLnN0cmluZygpLnN1
YnN0cmluZygxMSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtRWZsLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtRWZsLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzNjJhMgotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9Bc3luY0ZpbGVTeXN0ZW1FZmwuaApAQCAtMCww
ICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MK
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICov
CisKKyNpZm5kZWYgIEFzeW5jRmlsZVN5c3RlbUVmbF9oCisjZGVmaW5lICBBc3luY0ZpbGVTeXN0
ZW1FZmxfaAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5jbHVkZSAiQXN5bmNGaWxl
U3lzdGVtLmgiCisKKyNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbC5o
IgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Y2xhc3MgQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzOworCitjbGFzcyBBc3luY0ZpbGVTeXN0ZW1F
ZmwgOiBwdWJsaWMgQXN5bmNGaWxlU3lzdGVtIHsKK3B1YmxpYzoKKyAgICBBc3luY0ZpbGVTeXN0
ZW1FZmwoKTsKKyAgICB2aXJ0dWFsIH5Bc3luY0ZpbGVTeXN0ZW1FZmwoKTsKKworICAgIHZvaWQg
c3RvcCgpOworICAgIGJvb2wgaGFzUGVuZGluZ0FjdGl2aXR5KCk7CisgICAgYm9vbCB3YWl0Rm9y
T3BlcmF0aW9uVG9Db21wbGV0ZSgpOworCisgICAgdmlydHVhbCB2b2lkIG1vdmUoY29uc3QgS1VS
TCYgc291cmNlUGF0aCwgY29uc3QgS1VSTCYgZGVzdGluYXRpb25QYXRoLCBQYXNzT3duUHRyPEFz
eW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4pOworICAgIHZpcnR1YWwgdm9pZCBjb3B5KGNvbnN0IEtV
UkwmIHNvdXJjZVBhdGgsIGNvbnN0IEtVUkwmIGRlc3RpbmF0aW9uUGF0aCwgUGFzc093blB0cjxB
c3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+KTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKGNvbnN0
IEtVUkwmIHBhdGgsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPik7CisgICAg
dmlydHVhbCB2b2lkIHJlbW92ZVJlY3Vyc2l2ZWx5KGNvbnN0IEtVUkwmIHBhdGgsIFBhc3NPd25Q
dHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPik7CisgICAgdmlydHVhbCB2b2lkIHJlYWRNZXRh
ZGF0YShjb25zdCBLVVJMJiBwYXRoLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNr
cz4pOworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVGaWxlKGNvbnN0IEtVUkwmIHBhdGgsIGJvb2wg
ZXhjbHVzaXZlLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4pOworICAgIHZp
cnR1YWwgdm9pZCBjcmVhdGVEaXJlY3RvcnkoY29uc3QgS1VSTCYgcGF0aCwgYm9vbCBleGNsdXNp
dmUsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPik7CisgICAgdmlydHVhbCB2
b2lkIGZpbGVFeGlzdHMoY29uc3QgS1VSTCYgcGF0aCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0
ZW1DYWxsYmFja3M+KTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlyZWN0b3J5RXhpc3RzKGNvbnN0IEtV
UkwmIHBhdGgsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPik7CisgICAgdmly
dHVhbCB2b2lkIHJlYWREaXJlY3RvcnkoY29uc3QgS1VSTCYgcGF0aCwgUGFzc093blB0cjxBc3lu
Y0ZpbGVTeXN0ZW1DYWxsYmFja3M+KTsKKyAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlV3JpdGVyKEFz
eW5jRmlsZVdyaXRlckNsaWVudCosIGNvbnN0IEtVUkwmIHBhdGgsIFBhc3NPd25QdHI8QXN5bmNG
aWxlU3lzdGVtQ2FsbGJhY2tzPik7CisgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVNuYXBzaG90Rmls
ZUFuZFJlYWRNZXRhZGF0YShjb25zdCBLVVJMJiBwYXRoLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5
c3RlbUNhbGxiYWNrcz4pOworCisgICAgdm9pZCBzZXRUYXNrQ29udHJvbGxlcihQYXNzUmVmUHRy
PEFzeW5jRmlsZVN5c3RlbVRhc2tDb250cm9sbGVyRWZsPik7CisKK3ByaXZhdGU6CisgICAgU3Ry
aW5nIHZpcnR1YWxQYXRoVG9GaWxlU3lzdGVtUGF0aChjb25zdCBLVVJMJik7CisgICAgU3RyaW5n
IG1fbG9jYWxGaWxlU3lzdGVtQmFzZVBhdGg7CisgICAgUmVmUHRyPEFzeW5jRmlsZVN5c3RlbVRh
c2tDb250cm9sbGVyRWZsPiBtX3Rhc2tDb250cm9sbGVyOworfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYKKworI2VuZGlmIC8vICBBc3luY0ZpbGVTeXN0ZW1FZmxfaApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZsL0FzeW5jRmlsZVN5c3RlbVRhc2tD
b250cm9sbGVyRWZsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9Bc3luY0ZpbGVT
eXN0ZW1UYXNrQ29udHJvbGxlckVmbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAw
MDAwMC4uYzc3YzdmZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2VmbC9Bc3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbC5jcHAKQEAgLTAsMCArMSwxMjkg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFzeW5jRmlsZVN5c3RlbVRhc2tDb250cm9sbGVy
RWZsLmgiCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJOb3RJbXBsZW1l
bnRlZC5oIgorI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitBc3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbDo6QXN5bmNGaWxlU3lzdGVtVGFz
a0NvbnRyb2xsZXJFZmwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCwgRmlsZVN5c3Rl
bVN5bmNocm9ub3VzVHlwZSBzeW5jaHJvbm91c1R5cGUpCisgICAgOiBtX2NvbnRleHQoY29udGV4
dCkKKyAgICAsIG1fc3luY2hyb25vdXNUeXBlKHN5bmNocm9ub3VzVHlwZSkKKyAgICAsIG1fY3Vy
cmVudFRhc2tNb2RlKFN0cmluZygpKQorICAgICwgbV9pc1RocmVhZFN0b3BwaW5nKGZhbHNlKQor
eworICAgIGlmIChtX2NvbnRleHQtPmlzRG9jdW1lbnQoKSkKKyAgICAgICAgbV93b3JrZXJMb2Fk
ZXJQcm94eSA9IDA7CisgICAgZWxzZQorI2lmIEVOQUJMRShXT1JLRVJTKQorICAgICAgICBub3RJ
bXBsZW1lbnRlZCgpOworI2Vsc2UKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisjZW5k
aWYKK30KKworQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmw6On5Bc3luY0ZpbGVTeXN0
ZW1UYXNrQ29udHJvbGxlckVmbCgpCit7Cit9CisKK1N0cmluZyBBc3luY0ZpbGVTeXN0ZW1UYXNr
Q29udHJvbGxlckVmbDo6dW5pcXVlTW9kZSgpCit7CisgICAgU3RyaW5nIHVuaXF1ZU1vZGU7Cisg
ICAgaWYgKG1fY29udGV4dC0+aXNEb2N1bWVudCgpKQorICAgICAgICB1bmlxdWVNb2RlID0gU3Ry
aW5nKCk7CisgICAgZWxzZQorI2lmIEVOQUJMRShXT1JLRVJTKQorICAgICAgICBub3RJbXBsZW1l
bnRlZCgpOworI2Vsc2UKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisjZW5kaWYKKwor
ICAgIHJldHVybiB1bmlxdWVNb2RlOworfQorCit2b2lkIEFzeW5jRmlsZVN5c3RlbVRhc2tDb250
cm9sbGVyRWZsOjpwb3N0VGFza1RvTWFpblRocmVhZChQYXNzT3duUHRyPFNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQ6OlRhc2s+IHRhc2spCit7CisgICAgaWYgKG1fY29udGV4dC0+aXNEb2N1bWVudCgp
KQorICAgICAgICBtX2NvbnRleHQtPnBvc3RUYXNrKHRhc2spOworICAgIGVsc2UKKyNpZiBFTkFC
TEUoV09SS0VSUykKKyAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKKyNlbHNlCisgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworI2VuZGlmCit9CisKK3ZvaWQgQXN5bmNGaWxlU3lzdGVtVGFz
a0NvbnRyb2xsZXJFZmw6OnNldEN1cnJlbnRUYXNrTW9kZShjb25zdCBTdHJpbmcmIHRhc2tNb2Rl
KQoreworICAgIG1fY3VycmVudFRhc2tNb2RlID0gdGFza01vZGU7Cit9CisKK3ZvaWQgQXN5bmNG
aWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmw6OnBvc3RDYWxsYmFja1Rhc2soUGFzc093blB0cjxT
Y3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrLCBjb25zdCBTdHJpbmcmIG1vZGUpCit7
CisgICAgaWYgKG1fY29udGV4dC0+aXNEb2N1bWVudCgpKQorICAgICAgICBtX2NvbnRleHQtPnBv
c3RUYXNrKHRhc2spOworICAgIGVsc2UKKyNpZiBFTkFCTEUoV09SS0VSUykKKyAgICAgICAgbm90
SW1wbGVtZW50ZWQoKTsKKyNlbHNlCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworI2Vu
ZGlmCit9CisKK2Jvb2wgQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmw6OndhaXRGb3JU
YXNrVG9Db21wbGV0ZSgpCit7CisgICAgaWYgKG1fY29udGV4dC0+aXNEb2N1bWVudCgpKSB7Cisg
ICAgICAgIEFTU0VSVChtX3N5bmNocm9ub3VzVHlwZSA9PSBBc3luY2hyb25vdXNGaWxlU3lzdGVt
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmIEVOQUJMRShXT1JLRVJTKQor
ICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBB
c3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbDo6dGhyZWFkU3RvcHBpbmcoKQoreworfQor
CitBc3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbDo6T2JzZXJ2ZXI6Ok9ic2VydmVyKFdv
cmtlckNvbnRleHQqIGNvbnRleHQsIEFzeW5jRmlsZVN5c3RlbVRhc2tDb250cm9sbGVyRWZsKiB0
YXNrQ29udHJvbGxlcikKKyAgICA6IFdvcmtlckNvbnRleHQ6Ok9ic2VydmVyKGNvbnRleHQpCisg
ICAgLCBtX3Rhc2tDb250cm9sbGVyKHRhc2tDb250cm9sbGVyKQoreworfQorCit2b2lkIEFzeW5j
RmlsZVN5c3RlbVRhc2tDb250cm9sbGVyRWZsOjpPYnNlcnZlcjo6bm90aWZ5U3RvcCgpCit7Cit9
CisKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lT
VEVNKQorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5bmNGaWxl
U3lzdGVtVGFza0NvbnRyb2xsZXJFZmwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9B
c3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1Cmlu
ZGV4IDAwMDAwMDAuLmRjNTFiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9lZmwvQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmwuaApAQCAtMCwwICsx
LDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisK
KyNpZm5kZWYgQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmxfaAorI2RlZmluZSBBc3lu
Y0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbF9oCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0p
CisKKyNpbmNsdWRlICJGaWxlU3lzdGVtVHlwZS5oIgorI2luY2x1ZGUgIlNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiV29ya2Vy
TG9hZGVyUHJveHkuaCIKKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0
Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBc3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxl
ckVmbCA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxBc3luY0ZpbGVTeXN0ZW1UYXNrQ29u
dHJvbGxlckVmbD4geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEFzeW5jRmlsZVN5
c3RlbVRhc2tDb250cm9sbGVyRWZsPiBjcmVhdGUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29u
dGV4dCwgRmlsZVN5c3RlbVN5bmNocm9ub3VzVHlwZSBzeW5jaHJvbm91c1R5cGUpCisgICAgewor
ICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEFzeW5jRmlsZVN5c3RlbVRhc2tDb250cm9sbGVy
RWZsKGNvbnRleHQsIHN5bmNocm9ub3VzVHlwZSkpOworICAgIH0KKworICAgIH5Bc3luY0ZpbGVT
eXN0ZW1UYXNrQ29udHJvbGxlckVmbCgpOworCisgICAgU3RyaW5nIHVuaXF1ZU1vZGUoKTsKKwor
ICAgIHZvaWQgcG9zdFRhc2tUb01haW5UaHJlYWQoUGFzc093blB0cjxTY3JpcHRFeGVjdXRpb25D
b250ZXh0OjpUYXNrPik7CisgICAgdm9pZCBzZXRDdXJyZW50VGFza01vZGUoY29uc3QgU3RyaW5n
Jik7CisgICAgdm9pZCBwb3N0Q2FsbGJhY2tUYXNrKFBhc3NPd25QdHI8U2NyaXB0RXhlY3V0aW9u
Q29udGV4dDo6VGFzaz4sIGNvbnN0IFN0cmluZyYpOworICAgIGJvb2wgd2FpdEZvclRhc2tUb0Nv
bXBsZXRlKCk7CisKKyAgICBGaWxlU3lzdGVtU3luY2hyb25vdXNUeXBlIHN5bmNocm9ub3VzVHlw
ZSgpIHsgcmV0dXJuIG1fc3luY2hyb25vdXNUeXBlOyB9CisKKyAgICB2b2lkIHRocmVhZFN0b3Bw
aW5nKCk7CisKK3ByaXZhdGU6CisgICAgQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmwo
U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTeXN0ZW1TeW5jaHJvbm91c1R5cGUpOworCisg
ICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogbV9jb250ZXh0OworICAgIEZpbGVTeXN0ZW1TeW5j
aHJvbm91c1R5cGUgbV9zeW5jaHJvbm91c1R5cGU7CisgICAgU3RyaW5nIG1fY3VycmVudFRhc2tN
b2RlOworICAgIGJvb2wgbV9pc1RocmVhZFN0b3BwaW5nOworCisgICAgTXV0ZXggbV9tdXRleDsK
KworI2lmIEVOQUJMRShXT1JLRVJTKQorICAgIGNsYXNzIE9ic2VydmVyIDogcHVibGljIFdvcmtl
ckNvbnRleHQ6Ok9ic2VydmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBQYXNzT3du
UHRyPE9ic2VydmVyPiBjcmVhdGUoV29ya2VyQ29udGV4dCogY29udGV4dCwgQXN5bmNGaWxlU3lz
dGVtVGFza0NvbnRyb2xsZXJFZmwqIHRhc2tDb250cm9sbGVyKQorICAgICAgICB7CisgICAgICAg
ICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE9ic2VydmVyKGNvbnRleHQsIHRhc2tDb250cm9sbGVy
KSk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U3RvcCgpOworCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgT2JzZXJ2ZXIoV29ya2VyQ29udGV4dCosIEFzeW5jRmlsZVN5
c3RlbVRhc2tDb250cm9sbGVyRWZsKik7CisKKyAgICAgICAgUmVmUHRyPEFzeW5jRmlsZVN5c3Rl
bVRhc2tDb250cm9sbGVyRWZsPiBtX3Rhc2tDb250cm9sbGVyOworICAgIH07CisKKyAgICBXb3Jr
ZXJMb2FkZXJQcm94eSogbV93b3JrZXJMb2FkZXJQcm94eTsKKyAgICBPd25QdHI8T2JzZXJ2ZXI+
IG1fd29ya2VyT2JzZXJ2ZXI7CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRp
ZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNlbmRpZiAvLyBBc3luY0ZpbGVTeXN0ZW1DYWxs
YmFja3NFZmxfaAorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5
bmNGaWxlV3JpdGVyQ2xpZW50RWZsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9B
c3luY0ZpbGVXcml0ZXJDbGllbnRFZmwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAw
MDAwMDAuLjlkMDg1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9lZmwvQXN5bmNGaWxlV3JpdGVyQ2xpZW50RWZsLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisg
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBz
ZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJBc3luY0ZpbGVXcml0ZXJDbGllbnRFZmwuaCIKKworI2lmIEVO
QUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIkNyb3NzVGhyZWFkVGFzay5oIgorI2luY2x1
ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgcGVyZm9y
bURpZFdyaXRlQ2FsbGJhY2soU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEFzeW5jRmlsZVdyaXRl
ckNsaWVudCogY2xpZW50LCBsb25nIGxvbmcgYnl0ZXMsIGJvb2wgY29tcGxldGUpCit7CisgICAg
Y2xpZW50LT5kaWRXcml0ZShieXRlcywgY29tcGxldGUpOworfQorCitzdGF0aWMgdm9pZCBwZXJm
b3JtRGlkVHJ1bmNhdGVDYWxsYmFjayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgQXN5bmNGaWxl
V3JpdGVyQ2xpZW50KiBjbGllbnQpCit7CisgICAgY2xpZW50LT5kaWRUcnVuY2F0ZSgpOworfQor
CitzdGF0aWMgdm9pZCBwZXJmb3JtRGlkRmFpbENhbGxiYWNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQqLCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwgRmlsZUVycm9yOjpFcnJvckNvZGUg
Y29kZSkKK3sKKyAgICBjbGllbnQtPmRpZEZhaWwoY29kZSk7Cit9CisKK0FzeW5jRmlsZVdyaXRl
ckNsaWVudEVmbDo6QXN5bmNGaWxlV3JpdGVyQ2xpZW50RWZsKEFzeW5jRmlsZVN5c3RlbVRhc2tD
b250cm9sbGVyRWZsKiB0YXNrQ29udHJvbGxlciwgQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGll
bnQsIGNvbnN0IFN0cmluZyYgbW9kZSkKKyAgICA6IG1fdGFza0NvbnRyb2xsZXIodGFza0NvbnRy
b2xsZXIpCisgICAgLCBtX2NsaWVudChjbGllbnQpCisgICAgLCBtX3Rhc2tNb2RlKG1vZGUpCit7
CisgICAgbV90YXNrQ29udHJvbGxlci0+c2V0Q3VycmVudFRhc2tNb2RlKG1fdGFza01vZGUpOwor
fQorCit2b2lkIEFzeW5jRmlsZVdyaXRlckNsaWVudEVmbDo6ZGlkV3JpdGUobG9uZyBsb25nIGJ5
dGVzLCBib29sIGNvbXBsZXRlKQoreworICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RDYWxsYmFj
a1Rhc2soY3JlYXRlQ2FsbGJhY2tUYXNrKCZwZXJmb3JtRGlkV3JpdGVDYWxsYmFjaywgQWxsb3dD
cm9zc1RocmVhZEFjY2VzcyhtX2NsaWVudCksIGJ5dGVzLCBjb21wbGV0ZSksIG1fdGFza01vZGUp
OworfQorCit2b2lkIEFzeW5jRmlsZVdyaXRlckNsaWVudEVmbDo6ZGlkVHJ1bmNhdGUoKQorewor
ICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RDYWxsYmFja1Rhc2soY3JlYXRlQ2FsbGJhY2tUYXNr
KCZwZXJmb3JtRGlkVHJ1bmNhdGVDYWxsYmFjaywgQWxsb3dDcm9zc1RocmVhZEFjY2VzcyhtX2Ns
aWVudCkpLCBtX3Rhc2tNb2RlKTsKK30KKwordm9pZCBBc3luY0ZpbGVXcml0ZXJDbGllbnRFZmw6
OmRpZEZhaWwoRmlsZUVycm9yOjpFcnJvckNvZGUgY29kZSkKK3sKKyAgICBtX3Rhc2tDb250cm9s
bGVyLT5wb3N0Q2FsbGJhY2tUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmcGVyZm9ybURpZEZhaWxD
YWxsYmFjaywgQWxsb3dDcm9zc1RocmVhZEFjY2VzcyhtX2NsaWVudCksIGNvZGUpLCBtX3Rhc2tN
b2RlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKEZJ
TEVfU1lTVEVNKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZsL0FzeW5j
RmlsZVdyaXRlckNsaWVudEVmbC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZsL0FzeW5j
RmlsZVdyaXRlckNsaWVudEVmbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAu
LjZmMDE1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwv
QXN5bmNGaWxlV3JpdGVyQ2xpZW50RWZsLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEFzeW5jRmlsZVdy
aXRlckNsaWVudEVmbF9oCisjZGVmaW5lIEFzeW5jRmlsZVdyaXRlckNsaWVudEVmbF9oCisKKyNp
ZiBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW1UYXNrQ29u
dHJvbGxlckVmbC5oIgorI2luY2x1ZGUgIkFzeW5jRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1
ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQXN5
bmNGaWxlV3JpdGVyQ2xpZW50RWZsIDogcHVibGljIEFzeW5jRmlsZVdyaXRlckNsaWVudCB7Citw
dWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25QdHI8QXN5bmNGaWxlV3JpdGVyQ2xpZW50RWZsPiBj
cmVhdGUoQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmwqIHRhc2tDb250cm9sbGVyLCBB
c3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwgY29uc3QgU3RyaW5nJiBtb2RlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBBc3luY0ZpbGVXcml0ZXJDbGllbnRFZmwodGFz
a0NvbnRyb2xsZXIsIGNsaWVudCwgbW9kZSkpOworICAgIH0KKworICAgIHZvaWQgZGlkV3JpdGUo
bG9uZyBsb25nIGJ5dGVzLCBib29sIGNvbXBsZXRlKTsKKyAgICB2b2lkIGRpZFRydW5jYXRlKCk7
CisgICAgdm9pZCBkaWRGYWlsKEZpbGVFcnJvcjo6RXJyb3JDb2RlKTsKKworcHJpdmF0ZToKKyAg
ICBBc3luY0ZpbGVXcml0ZXJDbGllbnRFZmwoQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJF
ZmwqLCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqLCBjb25zdCBTdHJpbmcmKTsKKworICAgIFJlZlB0
cjxBc3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbD4gbV90YXNrQ29udHJvbGxlcjsKKyAg
ICBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIG1fY2xpZW50OworICAgIFN0cmluZyBtX3Rhc2tNb2Rl
OworfTsKKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkK
KworI2VuZGlmIC8vIEFzeW5jRmlsZVdyaXRlckNsaWVudEVmbF9oCisKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9Bc3luY0ZpbGVXcml0ZXJFZmwuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZWZsL0FzeW5jRmlsZVdyaXRlckVmbC5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTMyYTczZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9Bc3luY0ZpbGVXcml0ZXJFZmwuY3BwCkBAIC0wLDAgKzEs
MTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBc3luY0ZpbGVXcml0ZXJFZmwuaCIKKwor
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisK
KyNpbmNsdWRlICJBc3luY0ZpbGVXcml0ZXJDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJCbG9iLmgi
CisjaW5jbHVkZSAiQmxvYlJlZ2lzdHJ5SW1wbC5oIgorI2luY2x1ZGUgIkNyb3NzVGhyZWFkVGFz
ay5oIgorI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5n
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQXN5bmNGaWxlV3JpdGVyRWZsOjpBc3luY0Zp
bGVXcml0ZXJFZmwoQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGllbnQsIGNvbnN0IFN0cmluZyYg
cGF0aCwgQXN5bmNGaWxlU3lzdGVtVGFza0NvbnRyb2xsZXJFZmwqIHRhc2tDb250cm9sbGVyKQor
ICAgIDogbV9jbGllbnQoY2xpZW50KQorICAgICwgbV9wYXRoKHBhdGgpCisgICAgLCBtX3Rhc2tD
b250cm9sbGVyKHRhc2tDb250cm9sbGVyKQoreworfQorCitzdGF0aWMgdm9pZCB3cml0ZUFzeW5j
KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzT3duUHRyPEFzeW5jRmlsZVdyaXRlckNsaWVu
dEVmbD4gaGVscGVyQ2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIGxvbmcgbG9uZyBwb3NpdGlv
biwgQmxvYiogZGF0YSkKK3sKKyAgICBpbnQgYnl0ZXNXcml0dGVuOworICAgIFBsYXRmb3JtRmls
ZUhhbmRsZSBoYW5kbGU7CisgICAgaGFuZGxlID0gb3BlbkZpbGUocGF0aCwgT3BlbkZvcldyaXRl
KTsKKworICAgIFJlZlB0cjxCbG9iU3RvcmFnZURhdGE+IGJsb2JTdG9yYWdlID0gc3RhdGljX2Nh
c3Q8QmxvYlJlZ2lzdHJ5SW1wbCY+KGJsb2JSZWdpc3RyeSgpKS5nZXRCbG9iRGF0YUZyb21VUkwo
ZGF0YS0+dXJsKCkpOworICAgIGlmIChibG9iU3RvcmFnZSkgeworICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGJsb2JTdG9yYWdlLT5pdGVtcygpLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAg
ICBjb25zdCBCbG9iRGF0YUl0ZW0mIGJsb2JJdGVtID0gYmxvYlN0b3JhZ2UtPml0ZW1zKClbaV07
CisgICAgICAgICAgICBpZiAoYmxvYkl0ZW0udHlwZSA9PSBCbG9iRGF0YUl0ZW06OkRhdGEpIHsK
KyAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSAwOworICAgICAgICAgICAgICAgIGJ5dGVz
V3JpdHRlbiA9IHdyaXRlVG9GaWxlKGhhbmRsZSwgYmxvYkl0ZW0uZGF0YS0+ZGF0YSgpLCBibG9i
SXRlbS5kYXRhLT5sZW5ndGgoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNXcml0dGVu
IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaGVscGVyQ2xpZW50LT5kaWRGYWlsKEZpbGVFcnJv
cjo6U0VDVVJJVFlfRVJSKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgIGhlbHBlckNsaWVudC0+ZGlkV3JpdGUoYnl0ZXNXcml0dGVuLCAoaSArIDEgPT0gYmxvYlN0
b3JhZ2UtPml0ZW1zKCkuc2l6ZSgpKSA/IHRydWUgOiBmYWxzZSk7CisgICAgICAgICAgICB9IGVs
c2UgaWYgKGJsb2JJdGVtLnR5cGUgPT0gQmxvYkRhdGFJdGVtOjpGaWxlKSB7CisgICAgICAgICAg
ICAgICAgY2xvc2VGaWxlKGhhbmRsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29weUZpbGUo
YmxvYkl0ZW0ucGF0aCwgcGF0aCkpCisgICAgICAgICAgICAgICAgICAgIGhlbHBlckNsaWVudC0+
ZGlkV3JpdGUoYmxvYkl0ZW0ubGVuZ3RoLCAoaSArIDEgPT0gYmxvYlN0b3JhZ2UtPml0ZW1zKCku
c2l6ZSgpKSA/IHRydWUgOiBmYWxzZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgICAgICAgICBoZWxwZXJDbGllbnQtPmRpZEZhaWwoRmlsZUVycm9yOjpTRUNVUklUWV9FUlIp
OworICAgICAgICAgICAgfSBlbHNlIGlmIChibG9iSXRlbS50eXBlID09IEJsb2JEYXRhSXRlbTo6
QmxvYikgeworICAgICAgICAgICAgICAgIExPR19FUlJPUigiW3dyaXRlQXN5bmNdIGRhdGEgaXRl
bSBpcyBibG9iIik7CisgICAgICAgICAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNsb3NlRmlsZShoYW5kbGUpOworfQorCit2
b2lkIEFzeW5jRmlsZVdyaXRlckVmbDo6d3JpdGUobG9uZyBsb25nIHBvc2l0aW9uLCBCbG9iKiBk
YXRhKQoreworICAgIFN0cmluZyBtb2RlID0gbV90YXNrQ29udHJvbGxlci0+dW5pcXVlTW9kZSgp
OworICAgIG1fdGFza0NvbnRyb2xsZXItPnBvc3RUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxi
YWNrVGFzaygmd3JpdGVBc3luYywgQXN5bmNGaWxlV3JpdGVyQ2xpZW50RWZsOjpjcmVhdGUobV90
YXNrQ29udHJvbGxlci5nZXQoKSwgbV9jbGllbnQsIG1vZGUpLCBtX3BhdGgsIHBvc2l0aW9uLCBB
bGxvd0Nyb3NzVGhyZWFkQWNjZXNzKGRhdGEpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRydW5jYXRl
QXN5bmMoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NPd25QdHI8QXN5bmNGaWxlV3JpdGVy
Q2xpZW50RWZsPiBoZWxwZXJDbGllbnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nIGxl
bmd0aCkKK3sKKyAgICBpZiAoIWZpbGVFeGlzdHMocGF0aCkpIHsKKyAgICAgICAgaGVscGVyQ2xp
ZW50LT5kaWRGYWlsKEZpbGVFcnJvcjo6Tk9UX0ZPVU5EX0VSUik7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBQbGF0Zm9ybUZpbGVIYW5kbGUgaGFuZGxlOworICAgIGhhbmRsZSA9IG9w
ZW5GaWxlKHBhdGgsIE9wZW5Gb3JXcml0ZSk7CisKKyAgICBpZiAodHJ1bmNhdGVGaWxlKGhhbmRs
ZSwgbGVuZ3RoKSkKKyAgICAgICAgaGVscGVyQ2xpZW50LT5kaWRUcnVuY2F0ZSgpOworICAgIGVs
c2UKKyAgICAgICAgaGVscGVyQ2xpZW50LT5kaWRGYWlsKEZpbGVFcnJvcjo6U0VDVVJJVFlfRVJS
KTsKKworICAgIGNsb3NlRmlsZShoYW5kbGUpOworfQorCit2b2lkIEFzeW5jRmlsZVdyaXRlckVm
bDo6dHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0aCkKK3sKKyAgICBTdHJpbmcgbW9kZSA9IG1fdGFz
a0NvbnRyb2xsZXItPnVuaXF1ZU1vZGUoKTsKKyAgICBtX3Rhc2tDb250cm9sbGVyLT5wb3N0VGFz
a1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnRydW5jYXRlQXN5bmMsIEFzeW5jRmls
ZVdyaXRlckNsaWVudEVmbDo6Y3JlYXRlKG1fdGFza0NvbnRyb2xsZXIuZ2V0KCksIG1fY2xpZW50
LCBtb2RlKSwgbV9wYXRoLCBsZW5ndGgpKTsKK30KKwordm9pZCBBc3luY0ZpbGVXcml0ZXJFZmw6
OmFib3J0KCkKK3sKK30KKworYm9vbCBBc3luY0ZpbGVXcml0ZXJFZmw6OndhaXRGb3JPcGVyYXRp
b25Ub0NvbXBsZXRlKCkKK3sKKyAgICBpZiAobV90YXNrQ29udHJvbGxlci0+c3luY2hyb25vdXNU
eXBlKCkgPT0gU3luY2hyb25vdXNGaWxlU3lzdGVtKQorICAgICAgICByZXR1cm4gbV90YXNrQ29u
dHJvbGxlci0+d2FpdEZvclRhc2tUb0NvbXBsZXRlKCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RF
TSkKKwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZsL0FzeW5jRmlsZVdy
aXRlckVmbC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZsL0FzeW5jRmlsZVdyaXRlckVm
bC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkNGNmZDYKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvQXN5bmNGaWxlV3JpdGVyRWZs
LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVs
ZWN0cm9uaWNzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICoKKyAqLworCisjaWZuZGVmIEFzeW5jRmlsZVdyaXRlckVmbF9oCisjZGVmaW5lIEFzeW5j
RmlsZVdyaXRlckVmbF9oCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJB
c3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbC5oIgorI2luY2x1ZGUgIkFzeW5jRmlsZVdy
aXRlci5oIgorI2luY2x1ZGUgIkFzeW5jRmlsZVdyaXRlckNsaWVudEVmbC5oIgorI2luY2x1ZGUg
PHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQXN5bmNG
aWxlV3JpdGVyQ2xpZW50OworCitjbGFzcyBBc3luY0ZpbGVXcml0ZXJFZmwgOiBwdWJsaWMgQXN5
bmNGaWxlV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxBc3luY0ZpbGVX
cml0ZXJFZmw+IGNyZWF0ZShBc3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwgY29uc3QgU3Ry
aW5nJiBwYXRoLCBBc3luY0ZpbGVTeXN0ZW1UYXNrQ29udHJvbGxlckVmbCogdGFza0NvbnRyb2xs
ZXIpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IEFzeW5jRmlsZVdyaXRlckVm
bChjbGllbnQsIHBhdGgsIHRhc2tDb250cm9sbGVyKSk7CisgICAgfQorCisgICAgdm9pZCB3cml0
ZShsb25nIGxvbmcgcG9zaXRpb24sIEJsb2IqIGRhdGEpOworICAgIHZvaWQgdHJ1bmNhdGUobG9u
ZyBsb25nIGxlbmd0aCk7CisgICAgdm9pZCBhYm9ydCgpOworCisgICAgYm9vbCB3YWl0Rm9yT3Bl
cmF0aW9uVG9Db21wbGV0ZSgpOworCitwcml2YXRlOgorICAgIEFzeW5jRmlsZVdyaXRlckVmbChB
c3luY0ZpbGVXcml0ZXJDbGllbnQqLCBjb25zdCBTdHJpbmcmIHBhdGgsIEFzeW5jRmlsZVN5c3Rl
bVRhc2tDb250cm9sbGVyRWZsKik7CisKKyAgICBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIG1fY2xp
ZW50OworICAgIFN0cmluZyBtX3BhdGg7CisgICAgUmVmUHRyPEFzeW5jRmlsZVN5c3RlbVRhc2tD
b250cm9sbGVyRWZsPiBtX3Rhc2tDb250cm9sbGVyOworCit9OworCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNlbmRpZiAvLyBBc3lu
Y0ZpbGVXcml0ZXJFZmxfaAorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9w
b3NpeC9GaWxlU3lzdGVtUE9TSVguY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vcG9zaXgv
RmlsZVN5c3RlbVBPU0lYLmNwcAppbmRleCA4YWNjMGIwLi41NjkyYzJjIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9wb3NpeC9GaWxlU3lzdGVtUE9TSVguY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL3Bvc2l4L0ZpbGVTeXN0ZW1QT1NJWC5jcHAKQEAgLTI3Myw2
ICsyNzMsNzIgQEAgVmVjdG9yPFN0cmluZz4gbGlzdERpcmVjdG9yeShjb25zdCBTdHJpbmcmIHBh
dGgsIGNvbnN0IFN0cmluZyYgZmlsdGVyKQogfQogI2VuZGlmCiAKKyNpZiBQTEFURk9STShFRkwp
Citib29sIGNvcHlGaWxlKGNvbnN0IFN0cmluZyYgc291cmNlUGF0aCwgY29uc3QgU3RyaW5nJiBk
ZXN0aW5hdGlvblBhdGgpCit7CisgICAgaWYgKCFmaWxlRXhpc3RzKHNvdXJjZVBhdGgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZGVzdGluYXRpb25QYXRoLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUGxhdGZvcm1GaWxlSGFuZGxlIHNyY0ZpbGUg
PSBvcGVuRmlsZShzb3VyY2VQYXRoLCBPcGVuRm9yUmVhZCk7CisgICAgaWYgKHNyY0ZpbGUgPT0g
aW52YWxpZFBsYXRmb3JtRmlsZUhhbmRsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
UGxhdGZvcm1GaWxlSGFuZGxlIGRzdEZpbGUgPSBvcGVuRmlsZShkZXN0aW5hdGlvblBhdGgsIE9w
ZW5Gb3JXcml0ZSk7CisgICAgaWYgKGRzdEZpbGUgPT0gaW52YWxpZFBsYXRmb3JtRmlsZUhhbmRs
ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50IHJlYWRTaXplOworICAgIGludCB3
cml0ZVNpemU7CisgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgd2hpbGUgKChyZWFkU2l6ZSA9
IHJlYWQoc3JjRmlsZSwgYnVmZmVyLCAxMDI0KSkgPiAwKSB7CisgICAgICAgIGlmICgod3JpdGVT
aXplID0gd3JpdGUoZHN0RmlsZSwgYnVmZmVyLCByZWFkU2l6ZSkpID09IC0xKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNsb3NlRmlsZShzcmNGaWxlKTsKKyAgICBj
bG9zZUZpbGUoZHN0RmlsZSk7Cit9CisKK2Jvb2wgcmVtb3ZlRGlyZWN0b3J5KGNvbnN0IFN0cmlu
ZyYgcGF0aCkKK3sKKyAgICBpZiAoIWZpbGVFeGlzdHMocGF0aCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIERJUiogZGlyZWN0b3J5ID0gb3BlbmRpcihwYXRoLnV0ZjgoKS5kYXRhKCkp
OworICAgIGlmICghZGlyZWN0b3J5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBzdHJ1
Y3QgZGlyZW50KiBkaXJlY3RvcnlFbnRyeTsKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisKKyAgICB3
aGlsZSAoKGRpcmVjdG9yeUVudHJ5ID0gcmVhZGRpcihkaXJlY3RvcnkpKSkgeworICAgICAgICBp
ZiAoIXN0cmNtcChkaXJlY3RvcnlFbnRyeS0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAoZGlyZWN0
b3J5RW50cnktPmRfbmFtZSwgIi4uIikpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICBTdHJpbmcgYWJzb2x1dGVQYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGgsIFN0
cmluZyhkaXJlY3RvcnlFbnRyeS0+ZF9uYW1lKSk7CisKKyAgICAgICAgaWYgKGxzdGF0KGFic29s
dXRlUGF0aC51dGY4KCkuZGF0YSgpLCAmYnVmKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgICAgICBib29sIHJlc3VsdDsKKyAgICAgICAgaWYgKFNfSVNESVIoYnVmLnN0
X21vZGUpKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVtb3ZlRGlyZWN0b3J5KGFic29sdXRlUGF0
aCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IGRlbGV0ZUZpbGUoYWJzb2x1
dGVQYXRoKTsKKworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisgICAgY2xvc2VkaXIoZGlyZWN0b3J5KTsKKworICAgIHJldHVybiBkZWxldGVF
bXB0eURpcmVjdG9yeShwYXRoKTsKK30KKyNlbmRpZiAvLyBQTEFURk9STShFRkwpCisKKwogI2lm
ICFQTEFURk9STShNQUMpCiBTdHJpbmcgb3BlblRlbXBvcmFyeUZpbGUoY29uc3QgU3RyaW5nJiBw
cmVmaXgsIFBsYXRmb3JtRmlsZUhhbmRsZSYgaGFuZGxlKQogewpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9QbGF0Zm9ybUVmbC5jbWFrZSBiL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1FZmwuY21h
a2UKaW5kZXggODBkMWMwNy4uYWFiNTk3ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9QbGF0
Zm9ybUVmbC5jbWFrZQorKysgYi9Tb3VyY2UvV2ViS2l0L1BsYXRmb3JtRWZsLmNtYWtlCkBAIC0z
LDYgKzMsNyBAQCBMSVNUKEFQUEVORCBXZWJLaXRfSU5DTFVERV9ESVJFQ1RPUklFUwogICAgICIk
e1dFQktJVF9ESVJ9L2VmbC9ld2siCiAgICAgIiR7V0VCS0lUX0RJUn0vZWZsL1dlYkNvcmVTdXBw
b3J0IgogICAgICIke0pBVkFTQ1JJUFRDT1JFX0RJUn0vRm9yd2FyZGluZ0hlYWRlcnMiCisgICAg
IiR7V0VCQ09SRV9ESVJ9L01vZHVsZXMvZmlsZXN5c3RlbSIKICAgICAiJHtXRUJDT1JFX0RJUn0v
cGxhdGZvcm0vZWZsIgogICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9ncmFwaGljcy9jYWly
byIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vZ3JhcGhpY3MvZWZsIgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9lZmwvZXdrL2V3a19tYWluLmNwcCBiL1NvdXJjZS9XZWJLaXQvZWZs
L2V3ay9ld2tfbWFpbi5jcHAKaW5kZXggZWZhMzM5OC4uZDE0OWE4NCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9lZmwvZXdrL2V3a19tYWluLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2VmbC9l
d2svZXdrX21haW4uY3BwCkBAIC0xNjMsMTAgKzE2MywxMiBAQCBFaW5hX0Jvb2wgX2V3a19pbml0
X2JvZHkodm9pZCkKICAgICBTdHJpbmcgbG9jYWxTdG9yYWdlRGlyZWN0b3J5ID0gU3RyaW5nOjpm
cm9tVVRGOChlZnJlZXRfZGF0YV9ob21lX2dldCgpKSArICIvV2ViS2l0RWZsL0xvY2FsU3RvcmFn
ZSI7CiAgICAgU3RyaW5nIHdlYkRhdGFiYXNlRGlyZWN0b3J5ID0gU3RyaW5nOjpmcm9tVVRGOChl
ZnJlZXRfY2FjaGVfaG9tZV9nZXQoKSkgKyAiL1dlYktpdEVmbC9EYXRhYmFzZXMiOwogICAgIFN0
cmluZyBhcHBsaWNhdGlvbkNhY2hlRGlyZWN0b3J5ID0gU3RyaW5nOjpmcm9tVVRGOChlZnJlZXRf
Y2FjaGVfaG9tZV9nZXQoKSkgKyAiL1dlYktpdEVmbC9BcHBsaWNhdGlvbnMiOworICAgIFN0cmlu
ZyBmaWxlU3lzdGVtRGlyZWN0b3J5ID0gU3RyaW5nOjpmcm9tVVRGOChlZnJlZXRfY2FjaGVfaG9t
ZV9nZXQoKSkgKyAiL1dlYktpdEVmbC9GaWxlU3lzdGVtIjsKIAogICAgIGV3a19zZXR0aW5nc19s
b2NhbF9zdG9yYWdlX3BhdGhfc2V0KGxvY2FsU3RvcmFnZURpcmVjdG9yeS51dGY4KCkuZGF0YSgp
KTsKICAgICBld2tfc2V0dGluZ3Nfd2ViX2RhdGFiYXNlX3BhdGhfc2V0KHdlYkRhdGFiYXNlRGly
ZWN0b3J5LnV0ZjgoKS5kYXRhKCkpOwogICAgIGV3a19zZXR0aW5nc19hcHBsaWNhdGlvbl9jYWNo
ZV9wYXRoX3NldChhcHBsaWNhdGlvbkNhY2hlRGlyZWN0b3J5LnV0ZjgoKS5kYXRhKCkpOworICAg
IGV3a19zZXR0aW5nc19maWxlX3N5c3RlbV9wYXRoX3NldChmaWxlU3lzdGVtRGlyZWN0b3J5LnV0
ZjgoKS5kYXRhKCkpOwogCiAgICAgZXdrX25ldHdvcmtfdGxzX2NlcnRpZmljYXRlX2NoZWNrX3Nl
dChmYWxzZSk7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvZWZsL2V3ay9ld2tfc2V0dGlu
Z3MuY3BwIGIvU291cmNlL1dlYktpdC9lZmwvZXdrL2V3a19zZXR0aW5ncy5jcHAKaW5kZXggZjEw
NTIzZC4uYTRmY2ZjYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9lZmwvZXdrL2V3a19zZXR0
aW5ncy5jcHAKKysrIGIvU291cmNlL1dlYktpdC9lZmwvZXdrL2V3a19zZXR0aW5ncy5jcHAKQEAg
LTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIkludFNpemUuaCIK
ICNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiTG9jYWxGaWxlU3lzdGVtLmgiCiAjaW5jbHVk
ZSAiTWVtb3J5Q2FjaGUuaCIKICNpbmNsdWRlICJQYWdlQ2FjaGUuaCIKICNpbmNsdWRlICJSdW50
aW1lRW5hYmxlZEZlYXR1cmVzLmgiCkBAIC02MSw2ICs2Miw4IEBAIHN0YXRpYyBjb25zdCBjaGFy
KiBfZXdrX2ljb25fZGF0YWJhc2VfcGF0aCA9IDA7CiAKIHN0YXRpYyBjb25zdCBjaGFyKiBzX3dl
YkRhdGFiYXNlUGF0aCA9IDA7CiBzdGF0aWMgY29uc3QgY2hhciogc19sb2NhbFN0b3JhZ2VQYXRo
ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyKiBzX2ZpbGVTeXN0ZW1QYXRoID0gMDsKKwogc3RhdGlj
IHVpbnQ2NF90IHNfd2ViRGF0YWJhc2VRdW90YSA9IDEgKiAxMDI0ICogMTAyNDsgLy8gMU1CLgog
CiBzdGF0aWMgV1RGOjpTdHJpbmcgX2V3a19zZXR0aW5nc193ZWJraXRfcGxhdGZvcm1fZ2V0KCkK
QEAgLTE0NSw2ICsxNDgsMTkgQEAgY29uc3QgY2hhciogZXdrX3NldHRpbmdzX3dlYl9kYXRhYmFz
ZV9wYXRoX2dldCh2b2lkKQogICAgIHJldHVybiBzX3dlYkRhdGFiYXNlUGF0aDsKIH0KIAordm9p
ZCBld2tfc2V0dGluZ3NfZmlsZV9zeXN0ZW1fcGF0aF9zZXQoY29uc3QgY2hhciogcGF0aCkKK3sK
KyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisgICAgV2ViQ29yZTo6TG9jYWxGaWxlU3lzdGVtOjpp
bml0aWFsaXplTG9jYWxGaWxlU3lzdGVtKFdURjo6U3RyaW5nOjpmcm9tVVRGOChwYXRoKSk7Cisg
ICAgZWluYV9zdHJpbmdzaGFyZV9yZXBsYWNlKCZzX2ZpbGVTeXN0ZW1QYXRoLCBwYXRoKTsKKyNl
bmRpZgorfQorCitjb25zdCBjaGFyKiBld2tfc2V0dGluZ3NfZmlsZV9zeXN0ZW1fcGF0aF9nZXQo
dm9pZCkKK3sKKyAgICByZXR1cm4gc19maWxlU3lzdGVtUGF0aDsKK30KKwogRWluYV9Cb29sIGV3
a19zZXR0aW5nc19pY29uX2RhdGFiYXNlX3BhdGhfc2V0KGNvbnN0IGNoYXIqIGRpcmVjdG9yeSkK
IHsKICAgICBXZWJDb3JlOjpJY29uRGF0YWJhc2U6OmRlbGF5RGF0YWJhc2VDbGVhbnVwKCk7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2VmbC9ld2svZXdrX3NldHRpbmdzLmggYi9Tb3VyY2Uv
V2ViS2l0L2VmbC9ld2svZXdrX3NldHRpbmdzLmgKaW5kZXggZmI3OTI3OS4uNzU2MmE5YiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdC9lZmwvZXdrL2V3a19zZXR0aW5ncy5oCisrKyBiL1NvdXJj
ZS9XZWJLaXQvZWZsL2V3ay9ld2tfc2V0dGluZ3MuaApAQCAtOTMsNiArOTMsMjcgQEAgRUFQSSB2
b2lkIGV3a19zZXR0aW5nc19sb2NhbF9zdG9yYWdlX3BhdGhfc2V0KGNvbnN0IGNoYXIqIHBhdGgp
OwogRUFQSSBjb25zdCBjaGFyKiBld2tfc2V0dGluZ3NfbG9jYWxfc3RvcmFnZV9wYXRoX2dldCh2
b2lkKTsKIAogLyoqCisgKiBTZXRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hl
cmUgV2ViS2l0IHdpbGwgd3JpdGUgZm9yCisgKiB0aGUgSFRNTDUgZmlsZSBzeXN0ZW0gQVBJLgor
ICoKKyAqIEBwYXJhbSBwYXRoIHRoZSBuZXcgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IHBhdGgKKyAq
LworRUFQSSB2b2lkIGV3a19zZXR0aW5nc19maWxlX3N5c3RlbV9wYXRoX3NldChjb25zdCBjaGFy
KiBwYXRoKTsKKworLyoqCisgKiBSZXR1cm5zIGRpcmVjdG9yeSdzIHBhdGggd2hlcmUgdGhlIEhU
TUw1IGZpbGUgc3lzdGVtIEFQSSBpcyBzdG9yZWQuCisgKgorICogVGhpcyBpcyBndWFyYW50ZWVk
IHRvIGJlIGVpbmEtc3RyaW5nc2hhcmVkLCBzbyB3aGVuZXZlciBwb3NzaWJsZQorICogc2F2ZSB5
b3Vyc2VsZiBzb21lIGNwdSBjeWNsZXMgYW5kIHVzZSBlaW5hX3N0cmluZ3NoYXJlX3JlZigpCisg
KiBpbnN0ZWFkIG9mIGVpbmFfc3RyaW5nc2hhcmVfYWRkKCkgb3Igc3RyZHVwKCkuCisgKgorICog
QHJldHVybiBmaWxlIHN5c3RlbSBwYXRoIG9yIEBjIE5VTEwsIG9uIGVycm9ycy4KKyAqCisgKiBA
c2VlIGV3a19zZXR0aW5nc19maWxlX3N5c3RlbV9wYXRoX3NldCgpCisgKi8KK0VBUEkgY29uc3Qg
Y2hhciogZXdrX3NldHRpbmdzX2ZpbGVfc3lzdGVtX3BhdGhfZ2V0KHZvaWQpOworCisvKioKICAq
IFJlbW92ZXMgQGIgYWxsIEhUTUwgNSBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlcy4KICAqLwogRUFQ
SSB2b2lkIGV3a19zZXR0aW5nc19sb2NhbF9zdG9yYWdlX2RhdGFiYXNlX2NsZWFyKCk7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>