<?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>225673</bug_id>
          
          <creation_ts>2021-05-11 15:09:26 -0700</creation_ts>
          <short_desc>Factor copyImagePixel pixel conversion code into its own file</short_desc>
          <delta_ts>2021-05-12 16:52:31 -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>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sam Weinig">sam</reporter>
          <assigned_to name="Sam Weinig">sam</assigned_to>
          <cc>darin</cc>
    
    <cc>dino</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>fujii</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1759076</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-11 15:09:26 -0700</bug_when>
    <thetext>Factor copyImagePixel pixel conversion code into its own file</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759077</commentid>
    <comment_count>1</comment_count>
      <attachid>428315</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-11 15:18:28 -0700</bug_when>
    <thetext>Created attachment 428315
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759087</commentid>
    <comment_count>2</comment_count>
      <attachid>428315</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-05-11 16:00:43 -0700</bug_when>
    <thetext>Comment on attachment 428315
Patch

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

&gt; Source/WebCore/platform/graphics/PixelBufferConversion.h:44
&gt; +void convertImagePixels(const PixelBufferConversionView&amp; source, PixelBufferConversionView&amp; destination, const IntSize&amp;);

Not so clear that destination should be non-const here. I understand that the pixels are overwritten, but is that really best expressed by passing a non-const reference to the view? In every other way, the view is an in parameter, not an out parameter. And seeing it passed as a reference doesn’t really make that clear to me. It would be a huge programming error to expect the function to set fields like destination.alphaFormat.

I’m also not entirely clear why IntSize is not part of the conversion view; perhaps because it’s needed only for source and not destination? Or because it must be the same for both?

Is there a better way to express this function? Any small adjustment that could make semantics a little more obvious? Maybe it would be as simple as taking the data pointer out of the view and perhaps it would have a different name then? That certainly would make the source worse, but then you could see how the source and destination const-ness differed.

Should be able to use const uint8_t* for the source pixels.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759104</commentid>
    <comment_count>3</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-11 17:00:07 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #2)
&gt; Comment on attachment 428315 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=428315&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/PixelBufferConversion.h:44
&gt; &gt; +void convertImagePixels(const PixelBufferConversionView&amp; source, PixelBufferConversionView&amp; destination, const IntSize&amp;);
&gt; 
&gt; Not so clear that destination should be non-const here. I understand that
&gt; the pixels are overwritten, but is that really best expressed by passing a
&gt; non-const reference to the view? In every other way, the view is an in
&gt; parameter, not an out parameter. And seeing it passed as a reference doesn’t
&gt; really make that clear to me. It would be a huge programming error to expect
&gt; the function to set fields like destination.alphaFormat.
&gt; 
&gt; I’m also not entirely clear why IntSize is not part of the conversion view;
&gt; perhaps because it’s needed only for source and not destination? Or because
&gt; it must be the same for both?
&gt; 
&gt; Is there a better way to express this function? Any small adjustment that
&gt; could make semantics a little more obvious? Maybe it would be as simple as
&gt; taking the data pointer out of the view and perhaps it would have a
&gt; different name then? That certainly would make the source worse, but then
&gt; you could see how the source and destination const-ness differed.
&gt; 
&gt; Should be able to use const uint8_t* for the source pixels.

In another project I work on, I added some similar code a little while back and the way I handled this was by having two classes:

class ConstPixelBufferView;
class PixelBufferView;

Where ConstPixelBufferView had a `const uint8_t*` (actually, I used `const std::byte*) and PixelBufferView had a `uint8_t*` (or rather `std::byte*`). They implemented mostly the same, using a template base class, and that worked quite nicely. My plan was to start small here and work up to that. I want these views to eventually have a nice interface for iterating pixels and getting inset buffers.

Do you think a ConstPixelBufferConversionView for the source, and PixelBufferConversionView for the destination would make things better here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759120</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-05-11 18:03:27 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #3)
&gt; Do you think a ConstPixelBufferConversionView for the source, and
&gt; PixelBufferConversionView for the destination would make things better here?

Yes. And then both would be const&amp; parameters.

There may be some even better pattern, but if you had that pattern here I would have never have made any comment!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759136</commentid>
    <comment_count>5</comment_count>
      <attachid>428335</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-11 18:51:14 -0700</bug_when>
    <thetext>Created attachment 428335
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759160</commentid>
    <comment_count>6</comment_count>
      <attachid>428335</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-05-11 21:35:32 -0700</bug_when>
    <thetext>Comment on attachment 428335
Patch

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

&gt; Source/WebCore/platform/graphics/PixelBufferConversion.h:50
&gt; +struct PixelBufferConversionView {
&gt; +    AlphaPremultiplication alphaFormat;
&gt; +    DestinationColorSpace colorSpace;
&gt; +    PixelFormat pixelFormat;
&gt; +    unsigned bytesPerRow;
&gt; +    uint8_t* rows;
&gt; +};
&gt; +
&gt; +struct ConstPixelBufferConversionView {
&gt; +    AlphaPremultiplication alphaFormat;
&gt; +    DestinationColorSpace colorSpace;
&gt; +    PixelFormat pixelFormat;
&gt; +    unsigned bytesPerRow;
&gt; +    const uint8_t* rows;
&gt; +};

To make this less repetitive, we could make a structure:

    struct PixelBufferFormat { };

Then we could either derive the two views from it, or have a data member of that type. It would have everything except the rows pointer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759250</commentid>
    <comment_count>7</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-05-12 07:51:38 -0700</bug_when>
    <thetext>Committed r277369 (237627@main): &lt;https://commits.webkit.org/237627@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 428335.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759252</commentid>
    <comment_count>8</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-05-12 07:52:16 -0700</bug_when>
    <thetext>&lt;rdar://problem/77908051&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759260</commentid>
    <comment_count>9</comment_count>
      <attachid>428335</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-05-12 08:47:04 -0700</bug_when>
    <thetext>Comment on attachment 428335
Patch

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

&gt; Source/WebCore/platform/graphics/PixelBufferConversion.cpp:42
&gt; +template&lt;typename View&gt; static inline vImage_Buffer makeVImageBuffer(const View&amp; view, const IntSize&amp; size)

Looking over this file, I see inline a lot. And I realize that we probably haven’t discussed inline in the WebKit project enough. Here is my take on it:

Using the inline keyword to guide optimization (literal &quot;inlining&quot;):
- The inline keyword itself doesn’t guarantee inlining, nor is it typically required to make inlining possible. In the modern compilers, just having the function definition visible in the translation unit is most of what is needed to make inlining possible without a global optimization pass.
- If we find that the compiler is not inlining and we want that to improve execution speed or code size, adding the inline keyword might help, but we may find that we need the ALWAYS_INLINE keyword instead.

Using the inline keyword for correctness:
- We need to use the inline keyword when we put a non-template function into a header so that the one-definition rule is relaxed so we can include it in multiple translation units. This also making inlining possible without global optimization, as mentioned above.
- Also note that the static keyword does not need to be used in this case; using it to ask for internal linkage may be actively harmful, and affects things like the linkage of global variables defined inside the function.
- The above rules do *not* apply for functions that is in a non-header, defined inside a class definition, a function template, or marked constexpr. In all those cases we don’t need inline for correctness.

Given these considerations, if I was the programmer, I would have landed this patch without any of the inline keywords in this source file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759285</commentid>
    <comment_count>10</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-12 10:16:22 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #9)
&gt; Comment on attachment 428335 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=428335&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/PixelBufferConversion.cpp:42
&gt; &gt; +template&lt;typename View&gt; static inline vImage_Buffer makeVImageBuffer(const View&amp; view, const IntSize&amp; size)
&gt; 
&gt; Looking over this file, I see inline a lot. And I realize that we probably
&gt; haven’t discussed inline in the WebKit project enough. Here is my take on it:
&gt; 
&gt; Using the inline keyword to guide optimization (literal &quot;inlining&quot;):
&gt; - The inline keyword itself doesn’t guarantee inlining, nor is it typically
&gt; required to make inlining possible. In the modern compilers, just having the
&gt; function definition visible in the translation unit is most of what is
&gt; needed to make inlining possible without a global optimization pass.
&gt; - If we find that the compiler is not inlining and we want that to improve
&gt; execution speed or code size, adding the inline keyword might help, but we
&gt; may find that we need the ALWAYS_INLINE keyword instead.
&gt; 
&gt; Using the inline keyword for correctness:
&gt; - We need to use the inline keyword when we put a non-template function into
&gt; a header so that the one-definition rule is relaxed so we can include it in
&gt; multiple translation units. This also making inlining possible without
&gt; global optimization, as mentioned above.
&gt; - Also note that the static keyword does not need to be used in this case;
&gt; using it to ask for internal linkage may be actively harmful, and affects
&gt; things like the linkage of global variables defined inside the function.
&gt; - The above rules do *not* apply for functions that is in a non-header,
&gt; defined inside a class definition, a function template, or marked constexpr.
&gt; In all those cases we don’t need inline for correctness.
&gt; 
&gt; Given these considerations, if I was the programmer, I would have landed
&gt; this patch without any of the inline keywords in this source file.

That seems reasonable, though I always assumed compilers used the inline keyword as a hint, though I have no basis to back that up.

These seem like good rules. I copied the inline from the previous location, and didn&apos;t think about it much. I&apos;ll remove them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1759464</commentid>
    <comment_count>11</comment_count>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2021-05-12 16:52:31 -0700</bug_when>
    <thetext>Filed: Bug 225725 – [WinCairo] Some webgl/2.0.0/conformance/textures/image_bitmap_from_image_data are failing after r277369</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>428315</attachid>
            <date>2021-05-11 15:18:28 -0700</date>
            <delta_ts>2021-05-11 18:51:12 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225673-20210511151828.patch</filename>
            <type>text/plain</type>
            <size>36652</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3NzM0MSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU0IEBACisyMDIxLTA1LTExICBTYW0gV2Vp
bmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBGYWN0b3IgY29weUltYWdlUGl4ZWxz
IHBpeGVsIGNvbnZlcnNpb24gY29kZSBpbnRvIGl0cyBvd24gZmlsZQorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI1NjczCisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVtb3ZlcyB2aXJ0dWFsIEltYWdlQnVm
ZmVyQmFja2VuZDo6Y29weUltYWdlUGl4ZWxzKCkgZnVuY3Rpb24gYW5kCisgICAgICAgIG1vdmVz
IGZ1bmN0aW9uYWxpdHkgdG8gbmV3IFBpeGVsQnVmZmVyQ29udmVyc2lvbi5oL2NwcC4KKworICAg
ICAgICBNZXJnZSBVU0UoQUNDRUxFUkFURSkgY29kZSBmcm9tIEltYWdlQnVmZmVyQ0dCYWNrZW5k
IGludG8gdGhlIHNhbWUKKyAgICAgICAgZmlsZSBhbmQgZG8gc29tZSBsaWdodCBjbGVhbnVwLiAK
KyAgICAgICAgCisgICAgICAgIC0gRnVuY3Rpb24gcmVuYW1lZCB0byBjb3ZlcnQgY29udmVydElt
YWdlUGl4ZWxzIHRvIGNvbnZleSB0aGF0IGl0IGlzCisgICAgICAgICAgZG9pbmcgbW9yZSB0aGFu
IGNvcHlpbmcuCisgICAgICAgIC0gQWRkIFBpeGVsQnVmZmVyQ29udmVyc2lvblZpZXcgc3RydWN0
IHRvIGhvbGQgcGFyYW1ldGVycyBmb3IgdGhlCisgICAgICAgICAgY29udmVyc2lvbnMsIGluY2x1
ZGluZyBhIENvbG9yU3BhY2UgbWVtYmVyIHRoYXQgaXMgbm90IHlldCB1c2VkCisgICAgICAgICAg
YnV0IHdpbGwgYmUgc2hvcnRseS4KKyAgICAgICAgLSBVc2VzIGNvbnN0ZXhwciBjb25kaXRpb25h
bHMgaW4gdW5hY2NlbGVyYXRlZCBjYXNlcyB0byBob2lzdCBicmFuY2gKKyAgICAgICAgICBjaGVj
a2luZyBmb3IgcGl4ZWwgZm9ybWF0IGNvbnZlcnNpb24gcmVxdWlyZW1lbnRzIG91dHNpZGUgdGhl
IG1haW4KKyAgICAgICAgICBsb29wLgorCisgICAgICAgICogU291cmNlcy50eHQ6CisgICAgICAg
ICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL0ltYWdlQnVmZmVyQmFja2VuZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbWFn
ZUJ1ZmZlckJhY2tlbmQ6OnRvQkdSQURhdGEgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6SW1h
Z2VCdWZmZXJCYWNrZW5kOjpnZXRQaXhlbEJ1ZmZlciBjb25zdCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbWFnZUJ1ZmZlckJhY2tlbmQ6OnB1dFBpeGVsQnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6
OmNvcHlQcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkKTogRGVsZXRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OmNvcHlQcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxpZWQpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Y29weVVucHJlbXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZCk6IERlbGV0
ZWQuCisgICAgICAgIChXZWJDb3JlOjpjb3B5VW5wcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxp
ZWQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Y29weUZ1bmN0b3IpOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXJCYWNrZW5kOjpjb3B5SW1hZ2VQaXhlbHMgY29u
c3QpOiBEZWxldGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVyQmFj
a2VuZC5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BpeGVsQnVmZmVyQ29udmVyc2lv
bi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6bWFrZVZJbWFnZUJ1ZmZlcik6CisgICAg
ICAgIChXZWJDb3JlOjpjb252ZXJ0SW1hZ2VQaXhlbHNBY2NlbGVyYXRlZCk6CisgICAgICAgIChX
ZWJDb3JlOjpjb252ZXJ0U2luZ2xlUGl4ZWxQcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkKToK
KyAgICAgICAgKFdlYkNvcmU6OmNvbnZlcnRTaW5nbGVQaXhlbFByZW11bHRpcGxpZWRUb1VucHJl
bXVsdGlwbGllZCk6CisgICAgICAgIChXZWJDb3JlOjpjb252ZXJ0U2luZ2xlUGl4ZWxVbnByZW11
bHRpcGxpZWRUb1ByZW11bHRpcGxpZWQpOgorICAgICAgICAoV2ViQ29yZTo6Y29udmVydFNpbmds
ZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxpZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29udmVydEZ1bmN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Y29udmVydEltYWdlUGl4ZWxz
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9QaXhlbEJ1ZmZlckNvbnZlcnNpb24uaDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDR0JhY2tl
bmQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6bWFrZVZJbWFnZUJ1ZmZlcik6IERlbGV0ZWQuCisg
ICAgICAgIChXZWJDb3JlOjpjb3B5SW1hZ2VQaXhlbHNBY2NlbGVyYXRlZCk6IERlbGV0ZWQuCisg
ICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlckNHQmFja2VuZDo6Y29weUltYWdlUGl4ZWxzIGNv
bnN0KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZl
ckNHQmFja2VuZC5oOgorCiAyMDIxLTA1LTExICBDaHJpcyBEdW1leiAgPGNkdW1lekBhcHBsZS5j
b20+CiAKICAgICAgICAgQWRkIFNQSSB0byBzdXNwZW5kIC8gcmVzdW1lIGEgV0tXZWJWaWV3Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9Tb3VyY2VzLnR4dAkocmV2aXNpb24gMjc3MzE1KQorKysgU291cmNlL1dlYkNvcmUvU291
cmNlcy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTIwMTMsNiArMjAxMyw3IEBAIHBsYXRmb3JtL2dy
YXBoaWNzL1BhdGhUcmF2ZXJzYWxTdGF0ZS5jcHAKIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGhVdGls
aXRpZXMuY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9QYXR0ZXJuLmNwcAogcGxhdGZvcm0vZ3JhcGhp
Y3MvUGl4ZWxCdWZmZXIuY3BwCitwbGF0Zm9ybS9ncmFwaGljcy9QaXhlbEJ1ZmZlckNvbnZlcnNp
b24uY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9QbGF0Zm9ybVRpbWVSYW5nZXMuY3BwCiBwbGF0Zm9y
bS9ncmFwaGljcy9SZWdpb24uY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9SZW1vdGVHcmFwaGljc0Nv
bnRleHRHTFByb3h5QmFzZS5jcHAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDI3NzMxNSkKKysrIFNvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpA
QCAtMTQwODUsNiArMTQwODUsOCBAQAogCQlCQzA2RjI0QzA2RDE4QTdFMDA0QTZGQTMgLyogWFNM
VFByb2Nlc3Nvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBYU0xUUHJvY2Vzc29yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRo
ID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlCQzA2RjI0RDA2RDE4QTdFMDA0QTZGQTMgLyogWFNM
VFByb2Nlc3NvckxpYnhzbHQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gWFNMVFByb2Nlc3NvckxpYnhzbHQuY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJQkMwNzNCQTkw
QzM5OUIxRjAwMEY1OTc5IC8qIEZsb2F0Q29udmVyc2lvbi5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gRmxvYXRDb252ZXJzaW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCUJDMENBNzRDMjY0QUVEMEEwMDRGREM2MiAvKiBQaXhlbEJ1ZmZlckNvbnZlcnNpb24u
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCUJDMENBNzREMjY0QUVEMEEwMDRGREM2MiAvKiBQaXhlbEJ1ZmZlckNv
bnZlcnNpb24uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkMxMDEzN0IyNUMzNjI0QjAwREM3NzND
IC8qIENvbG9yTW9kZWxzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvbG9yTW9kZWxzLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDMTAxMzdFMjVDMzYzMTYwMERDNzczQyAvKiBDb2xvclRy
YW5zZmVyRnVuY3Rpb25zLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvbG9yVHJhbnNmZXJGdW5jdGlvbnMu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkMxMjRFRTQwQzI2NDFDRDAwOUUyMzQ5
IC8qIEJhclByb3AuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEJh
clByb3AuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjcwMzQsNiArMjcwMzYs
OCBAQAogCQkJCUE4RkE2RTVCMEU0Q0ZERUQwMEQ1Q0Y0OSAvKiBQYXR0ZXJuLmggKi8sCiAJCQkJ
QkM0ODM5QkIyNjQ2MTgxQTAwQTI4QjYyIC8qIFBpeGVsQnVmZmVyLmNwcCAqLywKIAkJCQlCQzQ4
MzlCQTI2NDYxODFBMDBBMjhCNjIgLyogUGl4ZWxCdWZmZXIuaCAqLywKKwkJCQlCQzBDQTc0RDI2
NEFFRDBBMDA0RkRDNjIgLyogUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmNwcCAqLywKKwkJCQlCQzBD
QTc0QzI2NEFFRDBBMDA0RkRDNjIgLyogUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmggKi8sCiAJCQkJ
QkNBNTU5MTIyNjNEQkQ3OTAwN0YxOUIzIC8qIFBpeGVsRm9ybWF0LmggKi8sCiAJCQkJNzI2RDU2
RTEyNTNBRTA0MzAwMDJFRjkwIC8qIFBsYXRmb3JtSW1hZ2UuaCAqLywKIAkJCQk3MkJBQzNBNjIz
RTE3MzI4MDA4RDc0MUMgLyogUGxhdGZvcm1JbWFnZUJ1ZmZlci5oICovLApJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VCdWZmZXJCYWNrZW5kLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlckJhY2tl
bmQuY3BwCShyZXZpc2lvbiAyNzczMTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9JbWFnZUJ1ZmZlckJhY2tlbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw3
IEBACiAKICNpbmNsdWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIlBpeGVsQnVmZmVyLmgiCisjaW5j
bHVkZSAiUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApA
QCAtOTMsMTQxICs5NCwzMyBAQCB2b2lkIEltYWdlQnVmZmVyQmFja2VuZDo6Y29udmVydFRvTHVt
aW5hCiBWZWN0b3I8dWludDhfdD4gSW1hZ2VCdWZmZXJCYWNrZW5kOjp0b0JHUkFEYXRhKHZvaWQq
IGRhdGEpIGNvbnN0CiB7CiAgICAgVmVjdG9yPHVpbnQ4X3Q+IHJlc3VsdCg0ICogbG9naWNhbFNp
emUoKS5hcmVhKCkudW5zYWZlR2V0KCkpOwotICAgIHNpemVfdCBkZXN0aW5hdGlvbkJ5dGVzUGVy
Um93ID0gbG9naWNhbFNpemUoKS53aWR0aCgpICogNDsKLSAgICBzaXplX3Qgc291cmNlQnl0ZXNQ
ZXJSb3cgPSBieXRlc1BlclJvdygpOwogCi0gICAgdWludDhfdCogc291cmNlUm93cyA9IHJlaW50
ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRhdGEpOworICAgIFBpeGVsQnVmZmVyQ29udmVyc2lvblZp
ZXcgc291cmNlOworICAgIHNvdXJjZS5hbHBoYUZvcm1hdCA9IEFscGhhUHJlbXVsdGlwbGljYXRp
b246OlByZW11bHRpcGxpZWQ7CisgICAgc291cmNlLmNvbG9yU3BhY2UgPSBEZXN0aW5hdGlvbkNv
bG9yU3BhY2U6OlNSR0I7CisgICAgc291cmNlLnBpeGVsRm9ybWF0ID0gcGl4ZWxGb3JtYXQoKTsK
KyAgICBzb3VyY2UuYnl0ZXNQZXJSb3cgPSBieXRlc1BlclJvdygpOworICAgIHNvdXJjZS5yb3dz
ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGF0YSk7CisgICAgCisgICAgUGl4ZWxCdWZm
ZXJDb252ZXJzaW9uVmlldyBkZXN0aW5hdGlvbjsKKyAgICBkZXN0aW5hdGlvbi5hbHBoYUZvcm1h
dCA9IEFscGhhUHJlbXVsdGlwbGljYXRpb246OlVucHJlbXVsdGlwbGllZDsKKyAgICBkZXN0aW5h
dGlvbi5jb2xvclNwYWNlID0gRGVzdGluYXRpb25Db2xvclNwYWNlOjpTUkdCOworICAgIGRlc3Rp
bmF0aW9uLnBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQ6OkJHUkE4OworICAgIGRlc3RpbmF0aW9u
LmJ5dGVzUGVyUm93ID0gbG9naWNhbFNpemUoKS53aWR0aCgpICogNDsKKyAgICBkZXN0aW5hdGlv
bi5yb3dzID0gcmVzdWx0LmRhdGEoKTsKIAotICAgIGNvcHlJbWFnZVBpeGVscygKLSAgICAgICAg
QWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6UHJlbXVsdGlwbGllZCwgcGl4ZWxGb3JtYXQoKSwgc291
cmNlQnl0ZXNQZXJSb3csIHNvdXJjZVJvd3MsCi0gICAgICAgIEFscGhhUHJlbXVsdGlwbGljYXRp
b246OlVucHJlbXVsdGlwbGllZCwgUGl4ZWxGb3JtYXQ6OkJHUkE4LCBkZXN0aW5hdGlvbkJ5dGVz
UGVyUm93LCByZXN1bHQuZGF0YSgpLCBsb2dpY2FsU2l6ZSgpKTsKKyAgICBjb252ZXJ0SW1hZ2VQ
aXhlbHMoc291cmNlLCBkZXN0aW5hdGlvbiwgbG9naWNhbFNpemUoKSk7CiAKICAgICByZXR1cm4g
cmVzdWx0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weVByZW11bHRpcGxpZWRUb1ByZW11
bHRpcGxpZWQoUGl4ZWxGb3JtYXQgc291cmNlUGl4ZWxGb3JtYXQsIGNvbnN0IHVpbnQ4X3QqIHNv
dXJjZVBpeGVsLCBQaXhlbEZvcm1hdCBkZXN0aW5hdGlvblBpeGVsRm9ybWF0LCB1aW50OF90KiBk
ZXN0aW5hdGlvblBpeGVsKQotewotICAgIHVpbnQ4X3QgYWxwaGEgPSBzb3VyY2VQaXhlbFszXTsK
LSAgICBpZiAoIWFscGhhKSB7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihk
ZXN0aW5hdGlvblBpeGVsKVswXSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBp
ZiAoc291cmNlUGl4ZWxGb3JtYXQgPT0gZGVzdGluYXRpb25QaXhlbEZvcm1hdCkgewotICAgICAg
ICByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGVzdGluYXRpb25QaXhlbClbMF0gPSByZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oc291cmNlUGl4ZWwpWzBdOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU3dhcCBwaXhlbCBjaGFubmVscyBCR1JBIDwtPiBSR0JB
LgotICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSBzb3VyY2VQaXhlbFsyXTsKLSAgICBkZXN0aW5h
dGlvblBpeGVsWzFdID0gc291cmNlUGl4ZWxbMV07Ci0gICAgZGVzdGluYXRpb25QaXhlbFsyXSA9
IHNvdXJjZVBpeGVsWzBdOwotICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10gPSBzb3VyY2VQaXhlbFsz
XTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlQcmVtdWx0aXBsaWVkVG9VbnByZW11bHRp
cGxpZWQoUGl4ZWxGb3JtYXQgc291cmNlUGl4ZWxGb3JtYXQsIGNvbnN0IHVpbnQ4X3QqIHNvdXJj
ZVBpeGVsLCBQaXhlbEZvcm1hdCBkZXN0aW5hdGlvblBpeGVsRm9ybWF0LCB1aW50OF90KiBkZXN0
aW5hdGlvblBpeGVsKQotewotICAgIHVpbnQ4X3QgYWxwaGEgPSBzb3VyY2VQaXhlbFszXTsKLSAg
ICBpZiAoIWFscGhhIHx8IGFscGhhID09IDI1NSkgewotICAgICAgICBjb3B5UHJlbXVsdGlwbGll
ZFRvUHJlbXVsdGlwbGllZChzb3VyY2VQaXhlbEZvcm1hdCwgc291cmNlUGl4ZWwsIGRlc3RpbmF0
aW9uUGl4ZWxGb3JtYXQsIGRlc3RpbmF0aW9uUGl4ZWwpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKHNvdXJjZVBpeGVsRm9ybWF0ID09IGRlc3RpbmF0aW9uUGl4ZWxGb3JtYXQp
IHsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFswXSA9IChzb3VyY2VQaXhlbFswXSAqIDI1NSkg
LyBhbHBoYTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IChzb3VyY2VQaXhlbFsxXSAq
IDI1NSkgLyBhbHBoYTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFsyXSA9IChzb3VyY2VQaXhl
bFsyXSAqIDI1NSkgLyBhbHBoYTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFszXSA9IGFscGhh
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU3dhcCBwaXhlbCBjaGFubmVscyBC
R1JBIDwtPiBSR0JBLgotICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291cmNlUGl4ZWxbMl0g
KiAyNTUpIC8gYWxwaGE7Ci0gICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IChzb3VyY2VQaXhlbFsx
XSAqIDI1NSkgLyBhbHBoYTsKLSAgICBkZXN0aW5hdGlvblBpeGVsWzJdID0gKHNvdXJjZVBpeGVs
WzBdICogMjU1KSAvIGFscGhhOwotICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10gPSBhbHBoYTsKLX0K
LQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlVbnByZW11bHRpcGxpZWRUb1ByZW11bHRpcGxpZWQo
UGl4ZWxGb3JtYXQgc291cmNlUGl4ZWxGb3JtYXQsIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZVBpeGVs
LCBQaXhlbEZvcm1hdCBkZXN0aW5hdGlvblBpeGVsRm9ybWF0LCB1aW50OF90KiBkZXN0aW5hdGlv
blBpeGVsKQotewotICAgIHVpbnQ4X3QgYWxwaGEgPSBzb3VyY2VQaXhlbFszXTsKLSAgICBpZiAo
IWFscGhhIHx8IGFscGhhID09IDI1NSkgewotICAgICAgICBjb3B5UHJlbXVsdGlwbGllZFRvUHJl
bXVsdGlwbGllZChzb3VyY2VQaXhlbEZvcm1hdCwgc291cmNlUGl4ZWwsIGRlc3RpbmF0aW9uUGl4
ZWxGb3JtYXQsIGRlc3RpbmF0aW9uUGl4ZWwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgaWYgKHNvdXJjZVBpeGVsRm9ybWF0ID09IGRlc3RpbmF0aW9uUGl4ZWxGb3JtYXQpIHsKLSAg
ICAgICAgZGVzdGluYXRpb25QaXhlbFswXSA9IChzb3VyY2VQaXhlbFswXSAqIGFscGhhICsgMjU0
KSAvIDI1NTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IChzb3VyY2VQaXhlbFsxXSAq
IGFscGhhICsgMjU0KSAvIDI1NTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFsyXSA9IChzb3Vy
Y2VQaXhlbFsyXSAqIGFscGhhICsgMjU0KSAvIDI1NTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhl
bFszXSA9IGFscGhhOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU3dhcCBwaXhl
bCBjaGFubmVscyBCR1JBIDwtPiBSR0JBLgotICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291
cmNlUGl4ZWxbMl0gKiBhbHBoYSArIDI1NCkgLyAyNTU7Ci0gICAgZGVzdGluYXRpb25QaXhlbFsx
XSA9IChzb3VyY2VQaXhlbFsxXSAqIGFscGhhICsgMjU0KSAvIDI1NTsKLSAgICBkZXN0aW5hdGlv
blBpeGVsWzJdID0gKHNvdXJjZVBpeGVsWzBdICogYWxwaGEgKyAyNTQpIC8gMjU1OwotICAgIGRl
c3RpbmF0aW9uUGl4ZWxbM10gPSBhbHBoYTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlV
bnByZW11bHRpcGxpZWRUb1VucHJlbXVsdGlwbGllZChQaXhlbEZvcm1hdCBzb3VyY2VQaXhlbEZv
cm1hdCwgY29uc3QgdWludDhfdCogc291cmNlUGl4ZWwsIFBpeGVsRm9ybWF0IGRlc3RpbmF0aW9u
UGl4ZWxGb3JtYXQsIHVpbnQ4X3QqIGRlc3RpbmF0aW9uUGl4ZWwpCi17Ci0gICAgaWYgKHNvdXJj
ZVBpeGVsRm9ybWF0ID09IGRlc3RpbmF0aW9uUGl4ZWxGb3JtYXQpIHsKLSAgICAgICAgcmVpbnRl
cnByZXRfY2FzdDx1aW50MzJfdCo+KGRlc3RpbmF0aW9uUGl4ZWwpWzBdID0gcmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50MzJfdCo+KHNvdXJjZVBpeGVsKVswXTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIC8vIFN3YXAgcGl4ZWwgY2hhbm5lbHMgQkdSQSA8LT4gUkdCQS4KLSAgICBk
ZXN0aW5hdGlvblBpeGVsWzBdID0gc291cmNlUGl4ZWxbMl07Ci0gICAgZGVzdGluYXRpb25QaXhl
bFsxXSA9IHNvdXJjZVBpeGVsWzFdOwotICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0gPSBzb3VyY2VQ
aXhlbFswXTsKLSAgICBkZXN0aW5hdGlvblBpeGVsWzNdID0gc291cmNlUGl4ZWxbM107Ci19Ci0K
LXRlbXBsYXRlPHZvaWQgKCpjb3B5RnVuY3RvcikoUGl4ZWxGb3JtYXQsIGNvbnN0IHVpbnQ4X3Qq
LCBQaXhlbEZvcm1hdCwgdWludDhfdCopPgotc3RhdGljIGlubGluZSB2b2lkIGNvcHlJbWFnZVBp
eGVsc1VuYWNjZWxlcmF0ZWQoCi0gICAgUGl4ZWxGb3JtYXQgc291cmNlUGl4ZWxGb3JtYXQsIHVu
c2lnbmVkIHNvdXJjZUJ5dGVzUGVyUm93LCB1aW50OF90KiBzb3VyY2VSb3dzLAotICAgIFBpeGVs
Rm9ybWF0IGRlc3RpbmF0aW9uUGl4ZWxGb3JtYXQsIHVuc2lnbmVkIGRlc3RpbmF0aW9uQnl0ZXNQ
ZXJSb3csIHVpbnQ4X3QqIGRlc3RpbmF0aW9uUm93cywgY29uc3QgSW50U2l6ZSYgc2l6ZSkKLXsK
LSAgICBzaXplX3QgYnl0ZXNQZXJSb3cgPSBzaXplLndpZHRoKCkgKiA0OwotICAgIGZvciAoaW50
IHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQoKTsgKyt5KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IHgg
PSAwOyB4IDwgYnl0ZXNQZXJSb3c7IHggKz0gNCkKLSAgICAgICAgICAgIGNvcHlGdW5jdG9yKHNv
dXJjZVBpeGVsRm9ybWF0LCAmc291cmNlUm93c1t4XSwgZGVzdGluYXRpb25QaXhlbEZvcm1hdCwg
JmRlc3RpbmF0aW9uUm93c1t4XSk7Ci0gICAgICAgIHNvdXJjZVJvd3MgKz0gc291cmNlQnl0ZXNQ
ZXJSb3c7Ci0gICAgICAgIGRlc3RpbmF0aW9uUm93cyArPSBkZXN0aW5hdGlvbkJ5dGVzUGVyUm93
OwotICAgIH0KLX0KLQotdm9pZCBJbWFnZUJ1ZmZlckJhY2tlbmQ6OmNvcHlJbWFnZVBpeGVscygK
LSAgICBBbHBoYVByZW11bHRpcGxpY2F0aW9uIHNvdXJjZUFscGhhRm9ybWF0LCBQaXhlbEZvcm1h
dCBzb3VyY2VQaXhlbEZvcm1hdCwgdW5zaWduZWQgc291cmNlQnl0ZXNQZXJSb3csIHVpbnQ4X3Qq
IHNvdXJjZVJvd3MsCi0gICAgQWxwaGFQcmVtdWx0aXBsaWNhdGlvbiBkZXN0aW5hdGlvbkFscGhh
Rm9ybWF0LCBQaXhlbEZvcm1hdCBkZXN0aW5hdGlvblBpeGVsRm9ybWF0LCB1bnNpZ25lZCBkZXN0
aW5hdGlvbkJ5dGVzUGVyUm93LCB1aW50OF90KiBkZXN0aW5hdGlvblJvd3MsIGNvbnN0IEludFNp
emUmIHNpemUpIGNvbnN0Ci17Ci0gICAgLy8gV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgZ2V0
dGluZyBvciBwdXR0aW5nIHBpeGVsIGRhdGEgd2l0aCBkZWVwIGNvbG9yIGJ1ZmZlcnMuCi0gICAg
QVNTRVJUKHNvdXJjZVBpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpSR0JBOCB8fCBzb3VyY2VQ
aXhlbEZvcm1hdCA9PSBQaXhlbEZvcm1hdDo6QkdSQTgpOwotICAgIEFTU0VSVChkZXN0aW5hdGlv
blBpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpSR0JBOCB8fCBkZXN0aW5hdGlvblBpeGVsRm9y
bWF0ID09IFBpeGVsRm9ybWF0OjpCR1JBOCk7Ci0KLSAgICBpZiAoc291cmNlQWxwaGFGb3JtYXQg
PT0gZGVzdGluYXRpb25BbHBoYUZvcm1hdCkgewotICAgICAgICBpZiAoc291cmNlQWxwaGFGb3Jt
YXQgPT0gQWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6UHJlbXVsdGlwbGllZCkKLSAgICAgICAgICAg
IGNvcHlJbWFnZVBpeGVsc1VuYWNjZWxlcmF0ZWQ8Y29weVByZW11bHRpcGxpZWRUb1ByZW11bHRp
cGxpZWQ+KHNvdXJjZVBpeGVsRm9ybWF0LCBzb3VyY2VCeXRlc1BlclJvdywgc291cmNlUm93cywg
ZGVzdGluYXRpb25QaXhlbEZvcm1hdCwgZGVzdGluYXRpb25CeXRlc1BlclJvdywgZGVzdGluYXRp
b25Sb3dzLCBzaXplKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29weUltYWdlUGl4ZWxz
VW5hY2NlbGVyYXRlZDxjb3B5VW5wcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxpZWQ+KHNvdXJj
ZVBpeGVsRm9ybWF0LCBzb3VyY2VCeXRlc1BlclJvdywgc291cmNlUm93cywgZGVzdGluYXRpb25Q
aXhlbEZvcm1hdCwgZGVzdGluYXRpb25CeXRlc1BlclJvdywgZGVzdGluYXRpb25Sb3dzLCBzaXpl
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChkZXN0aW5hdGlvbkFscGhhRm9y
bWF0ID09IEFscGhhUHJlbXVsdGlwbGljYXRpb246OlVucHJlbXVsdGlwbGllZCkgewotICAgICAg
ICBjb3B5SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkPGNvcHlQcmVtdWx0aXBsaWVkVG9VbnByZW11
bHRpcGxpZWQ+KHNvdXJjZVBpeGVsRm9ybWF0LCBzb3VyY2VCeXRlc1BlclJvdywgc291cmNlUm93
cywgZGVzdGluYXRpb25QaXhlbEZvcm1hdCwgZGVzdGluYXRpb25CeXRlc1BlclJvdywgZGVzdGlu
YXRpb25Sb3dzLCBzaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvcHlJbWFn
ZVBpeGVsc1VuYWNjZWxlcmF0ZWQ8Y29weVVucHJlbXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZD4o
c291cmNlUGl4ZWxGb3JtYXQsIHNvdXJjZUJ5dGVzUGVyUm93LCBzb3VyY2VSb3dzLCBkZXN0aW5h
dGlvblBpeGVsRm9ybWF0LCBkZXN0aW5hdGlvbkJ5dGVzUGVyUm93LCBkZXN0aW5hdGlvblJvd3Ms
IHNpemUpOwotfQotCiBPcHRpb25hbDxQaXhlbEJ1ZmZlcj4gSW1hZ2VCdWZmZXJCYWNrZW5kOjpn
ZXRQaXhlbEJ1ZmZlcihBbHBoYVByZW11bHRpcGxpY2F0aW9uIGRlc3RpbmF0aW9uQWxwaGFGb3Jt
YXQsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIHZvaWQqIGRhdGEpIGNvbnN0CiB7CiAgICAg
YXV0byBzb3VyY2VSZWN0U2NhbGVkID0gdG9CYWNrZW5kQ29vcmRpbmF0ZXMoc291cmNlUmVjdCk7
CiAKLSAgICBhdXRvIHBpeGVsQnVmZmVyID0gUGl4ZWxCdWZmZXI6OnRyeUNyZWF0ZShEZXN0aW5h
dGlvbkNvbG9yU3BhY2U6OlNSR0IsIFBpeGVsRm9ybWF0OjpSR0JBOCwgc291cmNlUmVjdFNjYWxl
ZC5zaXplKCkpOworICAgIGF1dG8gZGVzdGluYXRpb25QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0
OjpSR0JBODsKKworICAgIGF1dG8gcGl4ZWxCdWZmZXIgPSBQaXhlbEJ1ZmZlcjo6dHJ5Q3JlYXRl
KERlc3RpbmF0aW9uQ29sb3JTcGFjZTo6U1JHQiwgZGVzdGluYXRpb25QaXhlbEZvcm1hdCwgc291
cmNlUmVjdFNjYWxlZC5zaXplKCkpOwogICAgIGlmICghcGl4ZWxCdWZmZXIpCiAgICAgICAgIHJl
dHVybiBXVEY6Om51bGxvcHQ7CiAKQEAgLTI0MywyMSArMTM2LDM2IEBAIE9wdGlvbmFsPFBpeGVs
QnVmZmVyPiBJbWFnZUJ1ZmZlckJhY2tlbmQKICAgICBpZiAoZGVzdGluYXRpb25SZWN0LnNpemUo
KSAhPSBzb3VyY2VSZWN0U2NhbGVkLnNpemUoKSkKICAgICAgICAgcGl4ZWxCdWZmZXItPmRhdGEo
KS56ZXJvRmlsbCgpOwogCisgICAgdW5zaWduZWQgc291cmNlQnl0ZXNQZXJSb3cgPSBieXRlc1Bl
clJvdygpOworICAgIHVpbnQ4X3QqIHNvdXJjZVJvd3MgPSByZWludGVycHJldF9jYXN0PHVpbnQ4
X3QqPihkYXRhKSArIHNvdXJjZVJlY3RDbGlwcGVkLnkoKSAqIHNvdXJjZUJ5dGVzUGVyUm93ICsg
c291cmNlUmVjdENsaXBwZWQueCgpICogNDsKKwogICAgIHVuc2lnbmVkIGRlc3RpbmF0aW9uQnl0
ZXNQZXJSb3cgPSA0ICogc291cmNlUmVjdFNjYWxlZC53aWR0aCgpOwogICAgIHVpbnQ4X3QqIGRl
c3RpbmF0aW9uUm93cyA9IHBpeGVsQnVmZmVyLT5kYXRhKCkuZGF0YSgpICsgZGVzdGluYXRpb25S
ZWN0LnkoKSAqIGRlc3RpbmF0aW9uQnl0ZXNQZXJSb3cgKyBkZXN0aW5hdGlvblJlY3QueCgpICog
NDsKIAotICAgIHVuc2lnbmVkIHNvdXJjZUJ5dGVzUGVyUm93ID0gYnl0ZXNQZXJSb3coKTsKLSAg
ICB1aW50OF90KiBzb3VyY2VSb3dzID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGF0YSkg
KyBzb3VyY2VSZWN0Q2xpcHBlZC55KCkgKiBzb3VyY2VCeXRlc1BlclJvdyArIHNvdXJjZVJlY3RD
bGlwcGVkLngoKSAqIDQ7CisgICAgUGl4ZWxCdWZmZXJDb252ZXJzaW9uVmlldyBzb3VyY2U7Cisg
ICAgc291cmNlLmFscGhhRm9ybWF0ID0gQWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6UHJlbXVsdGlw
bGllZDsKKyAgICBzb3VyY2UuY29sb3JTcGFjZSA9IERlc3RpbmF0aW9uQ29sb3JTcGFjZTo6U1JH
QjsKKyAgICBzb3VyY2UucGl4ZWxGb3JtYXQgPSBwaXhlbEZvcm1hdCgpOworICAgIHNvdXJjZS5i
eXRlc1BlclJvdyA9IHNvdXJjZUJ5dGVzUGVyUm93OworICAgIHNvdXJjZS5yb3dzID0gc291cmNl
Um93czsKKyAgICAKKyAgICBQaXhlbEJ1ZmZlckNvbnZlcnNpb25WaWV3IGRlc3RpbmF0aW9uOwor
ICAgIGRlc3RpbmF0aW9uLmFscGhhRm9ybWF0ID0gZGVzdGluYXRpb25BbHBoYUZvcm1hdDsKKyAg
ICBkZXN0aW5hdGlvbi5jb2xvclNwYWNlID0gRGVzdGluYXRpb25Db2xvclNwYWNlOjpTUkdCOwor
ICAgIGRlc3RpbmF0aW9uLnBpeGVsRm9ybWF0ID0gZGVzdGluYXRpb25QaXhlbEZvcm1hdDsKKyAg
ICBkZXN0aW5hdGlvbi5ieXRlc1BlclJvdyA9IGRlc3RpbmF0aW9uQnl0ZXNQZXJSb3c7CisgICAg
ZGVzdGluYXRpb24ucm93cyA9IGRlc3RpbmF0aW9uUm93czsKIAotICAgIGNvcHlJbWFnZVBpeGVs
cygKLSAgICAgICAgQWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6UHJlbXVsdGlwbGllZCwgcGl4ZWxG
b3JtYXQoKSwgc291cmNlQnl0ZXNQZXJSb3csIHNvdXJjZVJvd3MsCi0gICAgICAgIGRlc3RpbmF0
aW9uQWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0OjpSR0JBOCwgZGVzdGluYXRpb25CeXRlc1BlclJv
dywgZGVzdGluYXRpb25Sb3dzLCBkZXN0aW5hdGlvblJlY3Quc2l6ZSgpKTsKKyAgICBjb252ZXJ0
SW1hZ2VQaXhlbHMoc291cmNlLCBkZXN0aW5hdGlvbiwgZGVzdGluYXRpb25SZWN0LnNpemUoKSk7
CiAKICAgICByZXR1cm4gcGl4ZWxCdWZmZXI7CiB9CiAKIHZvaWQgSW1hZ2VCdWZmZXJCYWNrZW5k
OjpwdXRQaXhlbEJ1ZmZlcihBbHBoYVByZW11bHRpcGxpY2F0aW9uIHNvdXJjZUFscGhhRm9ybWF0
LCBjb25zdCBQaXhlbEJ1ZmZlciYgcGl4ZWxCdWZmZXIsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJl
Y3QsIGNvbnN0IEludFBvaW50JiBkZXN0aW5hdGlvblBvaW50LCBBbHBoYVByZW11bHRpcGxpY2F0
aW9uIGRlc3RpbmF0aW9uQWxwaGFGb3JtYXQsIHZvaWQqIGRhdGEpCiB7CisgICAgLy8gRklYTUU6
IEFkZCBzdXBwb3J0IGZvciBub24tUkdCQTggcGl4ZWwgZm9ybWF0cy4KKyAgICBBU1NFUlQocGl4
ZWxCdWZmZXIuZm9ybWF0KCkgPT0gUGl4ZWxGb3JtYXQ6OlJHQkE4KTsKKwogICAgIGF1dG8gc291
cmNlUmVjdFNjYWxlZCA9IHRvQmFja2VuZENvb3JkaW5hdGVzKHNvdXJjZVJlY3QpOwogICAgIGF1
dG8gZGVzdGluYXRpb25Qb2ludFNjYWxlZCA9IHRvQmFja2VuZENvb3JkaW5hdGVzKGRlc3RpbmF0
aW9uUG9pbnQpOwogCkBAIC0yNzQsMTUgKzE4MiwyNyBAQCB2b2lkIEltYWdlQnVmZmVyQmFja2Vu
ZDo6cHV0UGl4ZWxCdWZmZXIoCiAgICAgZGVzdGluYXRpb25SZWN0LmludGVyc2VjdChiYWNrZW5k
UmVjdCgpKTsKICAgICBzb3VyY2VSZWN0Q2xpcHBlZC5zZXRTaXplKGRlc3RpbmF0aW9uUmVjdC5z
aXplKCkpOwogCisgICAgdW5zaWduZWQgc291cmNlQnl0ZXNQZXJSb3cgPSA0ICogcGl4ZWxCdWZm
ZXIuc2l6ZSgpLndpZHRoKCk7CisgICAgdWludDhfdCogc291cmNlUm93cyA9IHBpeGVsQnVmZmVy
LmRhdGEoKS5kYXRhKCkgKyBzb3VyY2VSZWN0Q2xpcHBlZC55KCkgKiBzb3VyY2VCeXRlc1BlclJv
dyArIHNvdXJjZVJlY3RDbGlwcGVkLngoKSAqIDQ7CisKICAgICB1bnNpZ25lZCBkZXN0aW5hdGlv
bkJ5dGVzUGVyUm93ID0gYnl0ZXNQZXJSb3coKTsKICAgICB1aW50OF90KiBkZXN0aW5hdGlvblJv
d3MgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihkYXRhKSArIGRlc3RpbmF0aW9uUmVjdC55
KCkgKiBkZXN0aW5hdGlvbkJ5dGVzUGVyUm93ICsgZGVzdGluYXRpb25SZWN0LngoKSAqIDQ7CiAK
LSAgICB1bnNpZ25lZCBzb3VyY2VCeXRlc1BlclJvdyA9IDQgKiBwaXhlbEJ1ZmZlci5zaXplKCku
d2lkdGgoKTsKLSAgICB1aW50OF90KiBzb3VyY2VSb3dzID0gcGl4ZWxCdWZmZXIuZGF0YSgpLmRh
dGEoKSArIHNvdXJjZVJlY3RDbGlwcGVkLnkoKSAqIHNvdXJjZUJ5dGVzUGVyUm93ICsgc291cmNl
UmVjdENsaXBwZWQueCgpICogNDsKKyAgICBQaXhlbEJ1ZmZlckNvbnZlcnNpb25WaWV3IHNvdXJj
ZTsKKyAgICBzb3VyY2UuYWxwaGFGb3JtYXQgPSBzb3VyY2VBbHBoYUZvcm1hdDsKKyAgICBzb3Vy
Y2UuY29sb3JTcGFjZSA9IERlc3RpbmF0aW9uQ29sb3JTcGFjZTo6U1JHQjsKKyAgICBzb3VyY2Uu
cGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdDo6UkdCQTg7CisgICAgc291cmNlLmJ5dGVzUGVyUm93
ID0gc291cmNlQnl0ZXNQZXJSb3c7CisgICAgc291cmNlLnJvd3MgPSBzb3VyY2VSb3dzOworICAg
IAorICAgIFBpeGVsQnVmZmVyQ29udmVyc2lvblZpZXcgZGVzdGluYXRpb247CisgICAgZGVzdGlu
YXRpb24uYWxwaGFGb3JtYXQgPSBkZXN0aW5hdGlvbkFscGhhRm9ybWF0OworICAgIGRlc3RpbmF0
aW9uLmNvbG9yU3BhY2UgPSBEZXN0aW5hdGlvbkNvbG9yU3BhY2U6OlNSR0I7CisgICAgZGVzdGlu
YXRpb24ucGl4ZWxGb3JtYXQgPSBwaXhlbEZvcm1hdCgpOworICAgIGRlc3RpbmF0aW9uLmJ5dGVz
UGVyUm93ID0gZGVzdGluYXRpb25CeXRlc1BlclJvdzsKKyAgICBkZXN0aW5hdGlvbi5yb3dzID0g
ZGVzdGluYXRpb25Sb3dzOwogCi0gICAgY29weUltYWdlUGl4ZWxzKAotICAgICAgICBzb3VyY2VB
bHBoYUZvcm1hdCwgUGl4ZWxGb3JtYXQ6OlJHQkE4LCBzb3VyY2VCeXRlc1BlclJvdywgc291cmNl
Um93cywKLSAgICAgICAgZGVzdGluYXRpb25BbHBoYUZvcm1hdCwgcGl4ZWxGb3JtYXQoKSwgZGVz
dGluYXRpb25CeXRlc1BlclJvdywgZGVzdGluYXRpb25Sb3dzLCBkZXN0aW5hdGlvblJlY3Quc2l6
ZSgpKTsKKyAgICBjb252ZXJ0SW1hZ2VQaXhlbHMoc291cmNlLCBkZXN0aW5hdGlvbiwgZGVzdGlu
YXRpb25SZWN0LnNpemUoKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVyQmFja2VuZC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVyQmFj
a2VuZC5oCShyZXZpc2lvbiAyNzczMTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9JbWFnZUJ1ZmZlckJhY2tlbmQuaAkod29ya2luZyBjb3B5KQpAQCAtMTQ4LDEwICsxNDgs
NiBAQCBwcm90ZWN0ZWQ6CiAgICAgSW50UmVjdCBsb2dpY2FsUmVjdCgpIGNvbnN0IHsgcmV0dXJu
IEludFJlY3QoSW50UG9pbnQ6Onplcm8oKSwgbG9naWNhbFNpemUoKSk7IH07CiAgICAgSW50UmVj
dCBiYWNrZW5kUmVjdCgpIGNvbnN0IHsgcmV0dXJuIEludFJlY3QoSW50UG9pbnQ6Onplcm8oKSwg
YmFja2VuZFNpemUoKSk7IH07CiAKLSAgICBXRUJDT1JFX0VYUE9SVCB2aXJ0dWFsIHZvaWQgY29w
eUltYWdlUGl4ZWxzKAotICAgICAgICBBbHBoYVByZW11bHRpcGxpY2F0aW9uIHNyY0FscGhhRm9y
bWF0LCBQaXhlbEZvcm1hdCBzcmNQaXhlbEZvcm1hdCwgdW5zaWduZWQgc3JjQnl0ZXNQZXJSb3cs
IHVpbnQ4X3QqIHNyY1Jvd3MsCi0gICAgICAgIEFscGhhUHJlbXVsdGlwbGljYXRpb24gZGVzdEFs
cGhhRm9ybWF0LCBQaXhlbEZvcm1hdCBkZXN0UGl4ZWxGb3JtYXQsIHVuc2lnbmVkIGRlc3RCeXRl
c1BlclJvdywgdWludDhfdCogZGVzdFJvd3MsIGNvbnN0IEludFNpemUmKSBjb25zdDsKLQogICAg
IFdFQkNPUkVfRVhQT1JUIFZlY3Rvcjx1aW50OF90PiB0b0JHUkFEYXRhKHZvaWQqIGRhdGEpIGNv
bnN0OwogCiAgICAgV0VCQ09SRV9FWFBPUlQgT3B0aW9uYWw8UGl4ZWxCdWZmZXI+IGdldFBpeGVs
QnVmZmVyKEFscGhhUHJlbXVsdGlwbGljYXRpb24gb3V0cHV0Rm9ybWF0LCBjb25zdCBJbnRSZWN0
JiBzcmNSZWN0LCB2b2lkKiBkYXRhKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1BpeGVsQnVmZmVyQ29udmVyc2lvbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmNwcAko
bm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QaXhlbEJ1
ZmZlckNvbnZlcnNpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjI2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDIxIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBpeGVsQnVmZmVyQ29udmVy
c2lvbi5oIgorCisjaW5jbHVkZSAiQWxwaGFQcmVtdWx0aXBsaWNhdGlvbi5oIgorI2luY2x1ZGUg
IkNvbG9yU3BhY2UuaCIKKyNpbmNsdWRlICJJbnRTaXplLmgiCisjaW5jbHVkZSAiUGl4ZWxGb3Jt
YXQuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFKQorI2luY2x1ZGUgPEFjY2VsZXJhdGUvQWNjZWxl
cmF0ZS5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2lmIFVTRShBQ0NFTEVS
QVRFKQorc3RhdGljIGlubGluZSB2SW1hZ2VfQnVmZmVyIG1ha2VWSW1hZ2VCdWZmZXIoY29uc3Qg
UGl4ZWxCdWZmZXJDb252ZXJzaW9uVmlldyYgdmlldywgY29uc3QgSW50U2l6ZSYgc2l6ZSkKK3sK
KyAgICB2SW1hZ2VfQnVmZmVyIHZJbWFnZUJ1ZmZlcjsKKworICAgIHZJbWFnZUJ1ZmZlci5oZWln
aHQgPSBzdGF0aWNfY2FzdDx2SW1hZ2VQaXhlbENvdW50PihzaXplLmhlaWdodCgpKTsKKyAgICB2
SW1hZ2VCdWZmZXIud2lkdGggPSBzdGF0aWNfY2FzdDx2SW1hZ2VQaXhlbENvdW50PihzaXplLndp
ZHRoKCkpOworICAgIHZJbWFnZUJ1ZmZlci5yb3dCeXRlcyA9IHZpZXcuYnl0ZXNQZXJSb3c7Cisg
ICAgdkltYWdlQnVmZmVyLmRhdGEgPSB2aWV3LnJvd3M7CisKKyAgICByZXR1cm4gdkltYWdlQnVm
ZmVyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29udmVydEltYWdlUGl4ZWxzQWNjZWxlcmF0
ZWQoY29uc3QgUGl4ZWxCdWZmZXJDb252ZXJzaW9uVmlldyYgc291cmNlLCBQaXhlbEJ1ZmZlckNv
bnZlcnNpb25WaWV3JiBkZXN0aW5hdGlvbiwgY29uc3QgSW50U2l6ZSYgZGVzdGluYXRpb25TaXpl
KQoreworICAgIGF1dG8gc291cmNlVkltYWdlQnVmZmVyID0gbWFrZVZJbWFnZUJ1ZmZlcihzb3Vy
Y2UsIGRlc3RpbmF0aW9uU2l6ZSk7CisgICAgYXV0byBkZXN0aW5hdGlvblZJbWFnZUJ1ZmZlciA9
IG1ha2VWSW1hZ2VCdWZmZXIoZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uU2l6ZSk7CisKKyAgICBp
ZiAoc291cmNlLmFscGhhRm9ybWF0ICE9IGRlc3RpbmF0aW9uLmFscGhhRm9ybWF0KSB7CisgICAg
ICAgIGlmIChkZXN0aW5hdGlvbi5hbHBoYUZvcm1hdCA9PSBBbHBoYVByZW11bHRpcGxpY2F0aW9u
OjpVbnByZW11bHRpcGxpZWQpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UucGl4ZWxGb3JtYXQg
PT0gUGl4ZWxGb3JtYXQ6OlJHQkE4KQorICAgICAgICAgICAgICAgIHZJbWFnZVVucHJlbXVsdGlw
bHlEYXRhX1JHQkE4ODg4KCZzb3VyY2VWSW1hZ2VCdWZmZXIsICZkZXN0aW5hdGlvblZJbWFnZUJ1
ZmZlciwga3ZJbWFnZU5vRmxhZ3MpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
IHZJbWFnZVVucHJlbXVsdGlwbHlEYXRhX0JHUkE4ODg4KCZzb3VyY2VWSW1hZ2VCdWZmZXIsICZk
ZXN0aW5hdGlvblZJbWFnZUJ1ZmZlciwga3ZJbWFnZU5vRmxhZ3MpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgaWYgKHNvdXJjZS5waXhlbEZvcm1hdCA9PSBQaXhlbEZvcm1hdDo6UkdC
QTgpCisgICAgICAgICAgICAgICAgdkltYWdlUHJlbXVsdGlwbHlEYXRhX1JHQkE4ODg4KCZzb3Vy
Y2VWSW1hZ2VCdWZmZXIsICZkZXN0aW5hdGlvblZJbWFnZUJ1ZmZlciwga3ZJbWFnZU5vRmxhZ3Mp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZJbWFnZVByZW11bHRpcGx5RGF0
YV9CR1JBODg4OCgmc291cmNlVkltYWdlQnVmZmVyLCAmZGVzdGluYXRpb25WSW1hZ2VCdWZmZXIs
IGt2SW1hZ2VOb0ZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZVZJbWFnZUJ1ZmZl
ciA9IGRlc3RpbmF0aW9uVkltYWdlQnVmZmVyOworICAgIH0KKworICAgIGlmIChzb3VyY2UucGl4
ZWxGb3JtYXQgIT0gZGVzdGluYXRpb24ucGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgLy8gU3dhcCBw
aXhlbCBjaGFubmVscyBCR1JBIDwtPiBSR0JBLgorICAgICAgICBjb25zdCB1aW50OF90IG1hcFs0
XSA9IHsgMiwgMSwgMCwgMyB9OworICAgICAgICB2SW1hZ2VQZXJtdXRlQ2hhbm5lbHNfQVJHQjg4
ODgoJnNvdXJjZVZJbWFnZUJ1ZmZlciwgJmRlc3RpbmF0aW9uVkltYWdlQnVmZmVyLCBtYXAsIGt2
SW1hZ2VOb0ZsYWdzKTsKKyAgICB9Cit9CisjZW5kaWYKKworZW51bSBjbGFzcyBQaXhlbEZvcm1h
dENvbnZlcnNpb24geyBOb25lLCBQZXJtdXRlIH07CisKK3RlbXBsYXRlPFBpeGVsRm9ybWF0Q29u
dmVyc2lvbiBwaXhlbEZvcm1hdENvbnZlcnNpb24+CitzdGF0aWMgaW5saW5lIHZvaWQgY29udmVy
dFNpbmdsZVBpeGVsUHJlbXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZChjb25zdCB1aW50OF90KiBz
b3VyY2VQaXhlbCwgdWludDhfdCogZGVzdGluYXRpb25QaXhlbCkKK3sKKyAgICB1aW50OF90IGFs
cGhhID0gc291cmNlUGl4ZWxbM107CisgICAgaWYgKCFhbHBoYSkgeworICAgICAgICByZWludGVy
cHJldF9jYXN0PHVpbnQzMl90Kj4oZGVzdGluYXRpb25QaXhlbClbMF0gPSAwOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgY29uc3RleHByIChwaXhlbEZvcm1hdENvbnZlcnNpb24g
PT0gUGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpOb25lKQorICAgICAgICByZWludGVycHJldF9jYXN0
PHVpbnQzMl90Kj4oZGVzdGluYXRpb25QaXhlbClbMF0gPSByZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQzMl90Kj4oc291cmNlUGl4ZWwpWzBdOworICAgIGVsc2UgeworICAgICAgICAvLyBTd2Fw
IHBpeGVsIGNoYW5uZWxzIEJHUkEgPC0+IFJHQkEuCisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxb
MF0gPSBzb3VyY2VQaXhlbFsyXTsKKyAgICAgICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IHNvdXJj
ZVBpeGVsWzFdOworICAgICAgICBkZXN0aW5hdGlvblBpeGVsWzJdID0gc291cmNlUGl4ZWxbMF07
CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10gPSBzb3VyY2VQaXhlbFszXTsKKyAgICB9Cit9
CisKK3RlbXBsYXRlPFBpeGVsRm9ybWF0Q29udmVyc2lvbiBwaXhlbEZvcm1hdENvbnZlcnNpb24+
CitzdGF0aWMgaW5saW5lIHZvaWQgY29udmVydFNpbmdsZVBpeGVsUHJlbXVsdGlwbGllZFRvVW5w
cmVtdWx0aXBsaWVkKGNvbnN0IHVpbnQ4X3QqIHNvdXJjZVBpeGVsLCB1aW50OF90KiBkZXN0aW5h
dGlvblBpeGVsKQoreworICAgIHVpbnQ4X3QgYWxwaGEgPSBzb3VyY2VQaXhlbFszXTsKKyAgICBp
ZiAoIWFscGhhIHx8IGFscGhhID09IDI1NSkgeworICAgICAgICBjb252ZXJ0U2luZ2xlUGl4ZWxQ
cmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkPHBpeGVsRm9ybWF0Q29udmVyc2lvbj4oc291cmNl
UGl4ZWwsIGRlc3RpbmF0aW9uUGl4ZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
aWYgY29uc3RleHByIChwaXhlbEZvcm1hdENvbnZlcnNpb24gPT0gUGl4ZWxGb3JtYXRDb252ZXJz
aW9uOjpOb25lKSB7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291cmNlUGl4ZWxb
MF0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMV0gPSAoc291cmNl
UGl4ZWxbMV0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0gPSAo
c291cmNlUGl4ZWxbMl0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxb
M10gPSBhbHBoYTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTd2FwIHBpeGVsIGNoYW5uZWxz
IEJHUkEgPC0+IFJHQkEuCisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291cmNlUGl4
ZWxbMl0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMV0gPSAoc291
cmNlUGl4ZWxbMV0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0g
PSAoc291cmNlUGl4ZWxbMF0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4
ZWxbM10gPSBhbHBoYTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPFBpeGVsRm9ybWF0Q29udmVyc2lv
biBwaXhlbEZvcm1hdENvbnZlcnNpb24+CitzdGF0aWMgaW5saW5lIHZvaWQgY29udmVydFNpbmds
ZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkKGNvbnN0IHVpbnQ4X3QqIHNvdXJj
ZVBpeGVsLCB1aW50OF90KiBkZXN0aW5hdGlvblBpeGVsKQoreworICAgIHVpbnQ4X3QgYWxwaGEg
PSBzb3VyY2VQaXhlbFszXTsKKyAgICBpZiAoIWFscGhhIHx8IGFscGhhID09IDI1NSkgeworICAg
ICAgICBjb252ZXJ0U2luZ2xlUGl4ZWxQcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkPHBpeGVs
Rm9ybWF0Q29udmVyc2lvbj4oc291cmNlUGl4ZWwsIGRlc3RpbmF0aW9uUGl4ZWwpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgY29uc3RleHByIChwaXhlbEZvcm1hdENvbnZlcnNp
b24gPT0gUGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpOb25lKSB7CisgICAgICAgIGRlc3RpbmF0aW9u
UGl4ZWxbMF0gPSAoc291cmNlUGl4ZWxbMF0gKiBhbHBoYSArIDI1NCkgLyAyNTU7CisgICAgICAg
IGRlc3RpbmF0aW9uUGl4ZWxbMV0gPSAoc291cmNlUGl4ZWxbMV0gKiBhbHBoYSArIDI1NCkgLyAy
NTU7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0gPSAoc291cmNlUGl4ZWxbMl0gKiBhbHBo
YSArIDI1NCkgLyAyNTU7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10gPSBhbHBoYTsKKyAg
ICB9IGVsc2UgeworICAgICAgICAvLyBTd2FwIHBpeGVsIGNoYW5uZWxzIEJHUkEgPC0+IFJHQkEu
CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291cmNlUGl4ZWxbMl0gKiBhbHBoYSAr
IDI1NCkgLyAyNTU7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMV0gPSAoc291cmNlUGl4ZWxb
MV0gKiBhbHBoYSArIDI1NCkgLyAyNTU7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0gPSAo
c291cmNlUGl4ZWxbMF0gKiBhbHBoYSArIDI1NCkgLyAyNTU7CisgICAgICAgIGRlc3RpbmF0aW9u
UGl4ZWxbM10gPSBhbHBoYTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPFBpeGVsRm9ybWF0Q29udmVy
c2lvbiBwaXhlbEZvcm1hdENvbnZlcnNpb24+CitzdGF0aWMgaW5saW5lIHZvaWQgY29udmVydFNp
bmdsZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxpZWQoY29uc3QgdWludDhfdCog
c291cmNlUGl4ZWwsIHVpbnQ4X3QqIGRlc3RpbmF0aW9uUGl4ZWwpCit7CisgICAgaWYgY29uc3Rl
eHByIChwaXhlbEZvcm1hdENvbnZlcnNpb24gPT0gUGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpOb25l
KQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGVzdGluYXRpb25QaXhlbClb
MF0gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oc291cmNlUGl4ZWwpWzBdOwor
ICAgIGVsc2UgeworICAgICAgICAvLyBTd2FwIHBpeGVsIGNoYW5uZWxzIEJHUkEgPC0+IFJHQkEu
CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSBzb3VyY2VQaXhlbFsyXTsKKyAgICAgICAg
ZGVzdGluYXRpb25QaXhlbFsxXSA9IHNvdXJjZVBpeGVsWzFdOworICAgICAgICBkZXN0aW5hdGlv
blBpeGVsWzJdID0gc291cmNlUGl4ZWxbMF07CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10g
PSBzb3VyY2VQaXhlbFszXTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHZvaWQgKCpjb252ZXJ0RnVu
Y3RvcikoY29uc3QgdWludDhfdCosIHVpbnQ4X3QqKT4KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb252
ZXJ0SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkKGNvbnN0IFBpeGVsQnVmZmVyQ29udmVyc2lvblZp
ZXcmIHNvdXJjZSwgUGl4ZWxCdWZmZXJDb252ZXJzaW9uVmlldyYgZGVzdGluYXRpb24sIGNvbnN0
IEludFNpemUmIGRlc3RpbmF0aW9uU2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90KiBzb3VyY2VS
b3dzID0gc291cmNlLnJvd3M7CisgICAgdWludDhfdCogZGVzdGluYXRpb25Sb3dzID0gZGVzdGlu
YXRpb24ucm93czsKKworICAgIHNpemVfdCBieXRlc1BlclJvdyA9IGRlc3RpbmF0aW9uU2l6ZS53
aWR0aCgpICogNDsKKyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGRlc3RpbmF0aW9uU2l6ZS5oZWln
aHQoKTsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgYnl0ZXNQZXJSb3c7
IHggKz0gNCkKKyAgICAgICAgICAgIGNvbnZlcnRGdW5jdG9yKCZzb3VyY2VSb3dzW3hdLCAmZGVz
dGluYXRpb25Sb3dzW3hdKTsKKyAgICAgICAgc291cmNlUm93cyArPSBzb3VyY2UuYnl0ZXNQZXJS
b3c7CisgICAgICAgIGRlc3RpbmF0aW9uUm93cyArPSBkZXN0aW5hdGlvbi5ieXRlc1BlclJvdzsK
KyAgICB9Cit9CisKK3ZvaWQgY29udmVydEltYWdlUGl4ZWxzKGNvbnN0IFBpeGVsQnVmZmVyQ29u
dmVyc2lvblZpZXcmIHNvdXJjZSwgUGl4ZWxCdWZmZXJDb252ZXJzaW9uVmlldyYgZGVzdGluYXRp
b24sIGNvbnN0IEludFNpemUmIGRlc3RpbmF0aW9uU2l6ZSkKK3sKKyAgICAvLyBXZSBkb24ndCBj
dXJyZW50bHkgc3VwcG9ydCBjb252ZXJ0aW5nIHBpeGVsIGRhdGEgd2l0aCBub24tOC1iaXQgYnVm
ZmVycy4KKyAgICBBU1NFUlQoc291cmNlLnBpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpSR0JB
OCB8fCBzb3VyY2UucGl4ZWxGb3JtYXQgPT0gUGl4ZWxGb3JtYXQ6OkJHUkE4KTsKKyAgICBBU1NF
UlQoZGVzdGluYXRpb24ucGl4ZWxGb3JtYXQgPT0gUGl4ZWxGb3JtYXQ6OlJHQkE4IHx8IGRlc3Rp
bmF0aW9uLnBpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpCR1JBOCk7CisKKyAgICAvLyBXZSBk
b24ndCBjdXJyZW50bHkgc3VwcG9ydCBjb252ZXJ0aW5nIHBpeGVsIGRhdGEgYmV0d2VlbiBkaWZm
ZXJlbnQgY29sb3Igc3BhY2VzLgorICAgIEFTU0VSVChzb3VyY2UuY29sb3JTcGFjZSA9PSBkZXN0
aW5hdGlvbi5jb2xvclNwYWNlKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFKQorICAgIGlmIChzb3Vy
Y2UuYWxwaGFGb3JtYXQgPT0gZGVzdGluYXRpb24uYWxwaGFGb3JtYXQgJiYgc291cmNlLnBpeGVs
Rm9ybWF0ID09IGRlc3RpbmF0aW9uLnBpeGVsRm9ybWF0KSB7CisgICAgICAgIC8vIEZJWE1FOiBD
YW4gdGhlcyBib3RoIGp1c3QgdXNlIHBlci1yb3cgbWVtY3B5PworICAgICAgICBpZiAoc291cmNl
LmFscGhhRm9ybWF0ID09IEFscGhhUHJlbXVsdGlwbGljYXRpb246OlByZW11bHRpcGxpZWQpCisg
ICAgICAgICAgICBjb252ZXJ0SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkPGNvbnZlcnRTaW5nbGVQ
aXhlbFByZW11bHRpcGxpZWRUb1ByZW11bHRpcGxpZWQ8UGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpO
b25lPj4oc291cmNlLCBkZXN0aW5hdGlvbiwgZGVzdGluYXRpb25TaXplKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgY29udmVydEltYWdlUGl4ZWxzVW5hY2NlbGVyYXRlZDxjb252ZXJ0U2lu
Z2xlUGl4ZWxVbnByZW11bHRpcGxpZWRUb1VucHJlbXVsdGlwbGllZDxQaXhlbEZvcm1hdENvbnZl
cnNpb246Ok5vbmU+Pihzb3VyY2UsIGRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblNpemUpOworICAg
IH0gZWxzZQorICAgICAgICBjb252ZXJ0SW1hZ2VQaXhlbHNBY2NlbGVyYXRlZChzb3VyY2UsIGRl
c3RpbmF0aW9uLCBkZXN0aW5hdGlvblNpemUpOworI2Vsc2UKKyAgICBpZiAoc291cmNlLmFscGhh
Rm9ybWF0ID09IGRlc3RpbmF0aW9uLmFscGhhRm9ybWF0KSB7CisgICAgICAgIGlmIChzb3VyY2Uu
cGl4ZWxGb3JtYXQgPT0gZGVzdGluYXRpb24ucGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgIGlm
IChzb3VyY2UuYWxwaGFGb3JtYXQgPT0gQWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6UHJlbXVsdGlw
bGllZCkKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkPGNv
bnZlcnRTaW5nbGVQaXhlbFByZW11bHRpcGxpZWRUb1ByZW11bHRpcGxpZWQ8UGl4ZWxGb3JtYXRD
b252ZXJzaW9uOjpOb25lPj4oc291cmNlLCBkZXN0aW5hdGlvbiwgZGVzdGluYXRpb25TaXplKTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW1hZ2VQaXhlbHNVbmFj
Y2VsZXJhdGVkPGNvbnZlcnRTaW5nbGVQaXhlbFVucHJlbXVsdGlwbGllZFRvVW5wcmVtdWx0aXBs
aWVkPFBpeGVsRm9ybWF0Q29udmVyc2lvbjo6Tm9uZT4+KHNvdXJjZSwgZGVzdGluYXRpb24sIGRl
c3RpbmF0aW9uU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZGVzdGlu
YXRpb24uYWxwaGFGb3JtYXQgPT0gQWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6VW5wcmVtdWx0aXBs
aWVkKQorICAgICAgICAgICAgICAgIGNvbnZlcnRJbWFnZVBpeGVsc1VuYWNjZWxlcmF0ZWQ8Y29u
dmVydFNpbmdsZVBpeGVsUHJlbXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZDxQaXhlbEZvcm1hdENv
bnZlcnNpb246OlBlcm11dGU+Pihzb3VyY2UsIGRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblNpemUp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnZlcnRJbWFnZVBpeGVsc1Vu
YWNjZWxlcmF0ZWQ8Y29udmVydFNpbmdsZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9VbnByZW11bHRp
cGxpZWQ8UGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpQZXJtdXRlPj4oc291cmNlLCBkZXN0aW5hdGlv
biwgZGVzdGluYXRpb25TaXplKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlm
IChzb3VyY2UucGl4ZWxGb3JtYXQgPT0gZGVzdGluYXRpb24ucGl4ZWxGb3JtYXQpIHsKKyAgICAg
ICAgICAgIGlmIChzb3VyY2UuYWxwaGFGb3JtYXQgPT0gQWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6
UHJlbXVsdGlwbGllZCkKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW1hZ2VQaXhlbHNVbmFjY2Vs
ZXJhdGVkPGNvbnZlcnRTaW5nbGVQaXhlbFByZW11bHRpcGxpZWRUb1VucHJlbXVsdGlwbGllZDxQ
aXhlbEZvcm1hdENvbnZlcnNpb246Ok5vbmU+Pihzb3VyY2UsIGRlc3RpbmF0aW9uLCBkZXN0aW5h
dGlvblNpemUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnZlcnRJbWFn
ZVBpeGVsc1VuYWNjZWxlcmF0ZWQ8Y29udmVydFNpbmdsZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9Q
cmVtdWx0aXBsaWVkPFBpeGVsRm9ybWF0Q29udmVyc2lvbjo6Tm9uZT4+KHNvdXJjZSwgZGVzdGlu
YXRpb24sIGRlc3RpbmF0aW9uU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBp
ZiAoZGVzdGluYXRpb24uYWxwaGFGb3JtYXQgPT0gQWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6VW5w
cmVtdWx0aXBsaWVkKQorICAgICAgICAgICAgICAgIGNvbnZlcnRJbWFnZVBpeGVsc1VuYWNjZWxl
cmF0ZWQ8Y29udmVydFNpbmdsZVBpeGVsUHJlbXVsdGlwbGllZFRvVW5wcmVtdWx0aXBsaWVkPFBp
eGVsRm9ybWF0Q29udmVyc2lvbjo6UGVybXV0ZT4+KHNvdXJjZSwgZGVzdGluYXRpb24sIGRlc3Rp
bmF0aW9uU2l6ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udmVydElt
YWdlUGl4ZWxzVW5hY2NlbGVyYXRlZDxjb252ZXJ0U2luZ2xlUGl4ZWxVbnByZW11bHRpcGxpZWRU
b1ByZW11bHRpcGxpZWQ8UGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpQZXJtdXRlPj4oc291cmNlLCBk
ZXN0aW5hdGlvbiwgZGVzdGluYXRpb25TaXplKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgor
fQorCit9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QaXhlbEJ1ZmZl
ckNvbnZlcnNpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9QaXhlbEJ1ZmZlckNvbnZlcnNpb24uaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QaXhlbEJ1ZmZlckNvbnZlcnNpb24uaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisg
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSW50U2l6ZTsKKworZW51bSBjbGFzcyBBbHBoYVByZW11
bHRpcGxpY2F0aW9uIDogdWludDhfdDsKK2VudW0gY2xhc3MgRGVzdGluYXRpb25Db2xvclNwYWNl
IDogdWludDhfdDsKK2VudW0gY2xhc3MgUGl4ZWxGb3JtYXQgOiB1aW50OF90OworCitzdHJ1Y3Qg
UGl4ZWxCdWZmZXJDb252ZXJzaW9uVmlldyB7CisgICAgQWxwaGFQcmVtdWx0aXBsaWNhdGlvbiBh
bHBoYUZvcm1hdDsKKyAgICBEZXN0aW5hdGlvbkNvbG9yU3BhY2UgY29sb3JTcGFjZTsKKyAgICBQ
aXhlbEZvcm1hdCBwaXhlbEZvcm1hdDsKKyAgICB1bnNpZ25lZCBieXRlc1BlclJvdzsKKyAgICB1
aW50OF90KiByb3dzOworfTsKKwordm9pZCBjb252ZXJ0SW1hZ2VQaXhlbHMoY29uc3QgUGl4ZWxC
dWZmZXJDb252ZXJzaW9uVmlldyYgc291cmNlLCBQaXhlbEJ1ZmZlckNvbnZlcnNpb25WaWV3JiBk
ZXN0aW5hdGlvbiwgY29uc3QgSW50U2l6ZSYpOworCit9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckNHQmFja2VuZC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDR0JhY2tl
bmQuY3BwCShyZXZpc2lvbiAyNzczMTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jZy9JbWFnZUJ1ZmZlckNHQmFja2VuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDEw
ICszNSw2IEBACiAjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgogI2luY2x1ZGUgIlBpeGVs
QnVmZmVyLmgiCiAjaW5jbHVkZSAiUnVudGltZUFwcGxpY2F0aW9uQ2hlY2tzLmgiCi0KLSNpZiBV
U0UoQUNDRUxFUkFURSkKLSNpbmNsdWRlIDxBY2NlbGVyYXRlL0FjY2VsZXJhdGUuaD4KLSNlbmRp
ZgogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KICNpbmNsdWRlIDxwYWwv
c3BpL2NnL0NvcmVHcmFwaGljc1NQSS5oPgogCkBAIC0yNTAsNzMgKzI0Niw2IEBAIHN0ZDo6dW5p
cXVlX3B0cjxUaHJlYWRTYWZlSW1hZ2VCdWZmZXJGbHUKICAgICByZXR1cm4gV1RGOjptYWtlVW5p
cXVlPFRocmVhZFNhZmVJbWFnZUJ1ZmZlckZsdXNoZXJDRz4oY29udGV4dCgpLnBsYXRmb3JtQ29u
dGV4dCgpKTsKIH0KIAotI2lmIFVTRShBQ0NFTEVSQVRFKQotc3RhdGljIGlubGluZSB2SW1hZ2Vf
QnVmZmVyIG1ha2VWSW1hZ2VCdWZmZXIodW5zaWduZWQgYnl0ZXNQZXJSb3csIHVpbnQ4X3QqIHJv
d3MsIGNvbnN0IEludFNpemUmIHNpemUpCi17Ci0gICAgdkltYWdlX0J1ZmZlciB2SW1hZ2VCdWZm
ZXI7Ci0KLSAgICB2SW1hZ2VCdWZmZXIuaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8dkltYWdlUGl4ZWxD
b3VudD4oc2l6ZS5oZWlnaHQoKSk7Ci0gICAgdkltYWdlQnVmZmVyLndpZHRoID0gc3RhdGljX2Nh
c3Q8dkltYWdlUGl4ZWxDb3VudD4oc2l6ZS53aWR0aCgpKTsKLSAgICB2SW1hZ2VCdWZmZXIucm93
Qnl0ZXMgPSBieXRlc1BlclJvdzsKLSAgICB2SW1hZ2VCdWZmZXIuZGF0YSA9IHJvd3M7Ci0gICAg
cmV0dXJuIHZJbWFnZUJ1ZmZlcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlJbWFnZVBp
eGVsc0FjY2VsZXJhdGVkKAotICAgIEFscGhhUHJlbXVsdGlwbGljYXRpb24gc3JjQWxwaGFGb3Jt
YXQsIFBpeGVsRm9ybWF0IHNyY1BpeGVsRm9ybWF0LCB2SW1hZ2VfQnVmZmVyJiBzcmMsCi0gICAg
QWxwaGFQcmVtdWx0aXBsaWNhdGlvbiBkZXN0QWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0IGRlc3RQ
aXhlbEZvcm1hdCwgdkltYWdlX0J1ZmZlciYgZGVzdCkKLXsKLSAgICBpZiAoc3JjQWxwaGFGb3Jt
YXQgPT0gZGVzdEFscGhhRm9ybWF0KSB7Ci0gICAgICAgIEFTU0VSVChzcmNQaXhlbEZvcm1hdCAh
PSBkZXN0UGl4ZWxGb3JtYXQpOwotICAgICAgICAvLyBUaGUgZGVzdGluYXRpb24gYWxwaGEgZm9y
bWF0IGNhbiBiZSB1bnByZW11bHRpcGxpZWQgaW4gdGhlCi0gICAgICAgIC8vIGNhc2Ugb2YgYW4g
SW1hZ2VCaXRtYXAgY3JlYXRlZCBmcm9tIGFuIEltYWdlRGF0YSB3aXRoCi0gICAgICAgIC8vIHBy
ZW11bHRpcGx5QWxwaGE9PSJub25lIi4KLQotICAgICAgICAvLyBTd2FwIHBpeGVsIGNoYW5uZWxz
IEJHUkEgPC0+IFJHQkEuCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgbWFwWzRdID0geyAyLCAxLCAw
LCAzIH07Ci0gICAgICAgIHZJbWFnZVBlcm11dGVDaGFubmVsc19BUkdCODg4OCgmc3JjLCAmZGVz
dCwgbWFwLCBrdkltYWdlTm9GbGFncyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBp
ZiAoZGVzdEFscGhhRm9ybWF0ID09IEFscGhhUHJlbXVsdGlwbGljYXRpb246OlVucHJlbXVsdGlw
bGllZCkgewotICAgICAgICBpZiAoc3JjUGl4ZWxGb3JtYXQgPT0gUGl4ZWxGb3JtYXQ6OlJHQkE4
KQotICAgICAgICAgICAgdkltYWdlVW5wcmVtdWx0aXBseURhdGFfUkdCQTg4ODgoJnNyYywgJmRl
c3QsIGt2SW1hZ2VOb0ZsYWdzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdkltYWdlVW5w
cmVtdWx0aXBseURhdGFfQkdSQTg4ODgoJnNyYywgJmRlc3QsIGt2SW1hZ2VOb0ZsYWdzKTsKLSAg
ICB9IGVsc2UgewotICAgICAgICBpZiAoc3JjUGl4ZWxGb3JtYXQgPT0gUGl4ZWxGb3JtYXQ6OlJH
QkE4KQotICAgICAgICAgICAgdkltYWdlUHJlbXVsdGlwbHlEYXRhX1JHQkE4ODg4KCZzcmMsICZk
ZXN0LCBrdkltYWdlTm9GbGFncyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZJbWFnZVBy
ZW11bHRpcGx5RGF0YV9CR1JBODg4OCgmc3JjLCAmZGVzdCwga3ZJbWFnZU5vRmxhZ3MpOwotICAg
IH0KLQotICAgIGlmIChzcmNQaXhlbEZvcm1hdCAhPSBkZXN0UGl4ZWxGb3JtYXQpIHsKLSAgICAg
ICAgLy8gU3dhcCBwaXhlbCBjaGFubmVscyBCR1JBIDwtPiBSR0JBLgotICAgICAgICBjb25zdCB1
aW50OF90IG1hcFs0XSA9IHsgMiwgMSwgMCwgMyB9OwotICAgICAgICB2SW1hZ2VQZXJtdXRlQ2hh
bm5lbHNfQVJHQjg4ODgoJmRlc3QsICZkZXN0LCBtYXAsIGt2SW1hZ2VOb0ZsYWdzKTsKLSAgICB9
Ci19Ci0KLXZvaWQgSW1hZ2VCdWZmZXJDR0JhY2tlbmQ6OmNvcHlJbWFnZVBpeGVscygKLSAgICBB
bHBoYVByZW11bHRpcGxpY2F0aW9uIHNyY0FscGhhRm9ybWF0LCBQaXhlbEZvcm1hdCBzcmNQaXhl
bEZvcm1hdCwgdW5zaWduZWQgc3JjQnl0ZXNQZXJSb3csIHVpbnQ4X3QqIHNyY1Jvd3MsCi0gICAg
QWxwaGFQcmVtdWx0aXBsaWNhdGlvbiBkZXN0QWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0IGRlc3RQ
aXhlbEZvcm1hdCwgdW5zaWduZWQgZGVzdEJ5dGVzUGVyUm93LCB1aW50OF90KiBkZXN0Um93cywg
Y29uc3QgSW50U2l6ZSYgc2l6ZSkgY29uc3QKLXsKLSAgICAvLyBXZSBkb24ndCBjdXJyZW50bHkg
c3VwcG9ydCBnZXR0aW5nIG9yIHB1dHRpbmcgcGl4ZWwgZGF0YSB3aXRoIGRlZXAgY29sb3IgYnVm
ZmVycy4KLSAgICBBU1NFUlQoc3JjUGl4ZWxGb3JtYXQgPT0gUGl4ZWxGb3JtYXQ6OlJHQkE4IHx8
IHNyY1BpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpCR1JBOCk7Ci0gICAgQVNTRVJUKGRlc3RQ
aXhlbEZvcm1hdCA9PSBQaXhlbEZvcm1hdDo6UkdCQTggfHwgZGVzdFBpeGVsRm9ybWF0ID09IFBp
eGVsRm9ybWF0OjpCR1JBOCk7Ci0KLSAgICBpZiAoc3JjQWxwaGFGb3JtYXQgPT0gZGVzdEFscGhh
Rm9ybWF0ICYmIHNyY1BpeGVsRm9ybWF0ID09IGRlc3RQaXhlbEZvcm1hdCkgewotICAgICAgICBJ
bWFnZUJ1ZmZlckJhY2tlbmQ6OmNvcHlJbWFnZVBpeGVscyhzcmNBbHBoYUZvcm1hdCwgc3JjUGl4
ZWxGb3JtYXQsIHNyY0J5dGVzUGVyUm93LCBzcmNSb3dzLCBkZXN0QWxwaGFGb3JtYXQsIGRlc3RQ
aXhlbEZvcm1hdCwgZGVzdEJ5dGVzUGVyUm93LCBkZXN0Um93cywgc2l6ZSk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICB2SW1hZ2VfQnVmZmVyIHNyYyA9IG1ha2VWSW1hZ2VCdWZmZXIo
c3JjQnl0ZXNQZXJSb3csIHNyY1Jvd3MsIHNpemUpOwotICAgIHZJbWFnZV9CdWZmZXIgZGVzdCA9
IG1ha2VWSW1hZ2VCdWZmZXIoZGVzdEJ5dGVzUGVyUm93LCBkZXN0Um93cywgc2l6ZSk7Ci0KLSAg
ICBjb3B5SW1hZ2VQaXhlbHNBY2NlbGVyYXRlZChzcmNBbHBoYUZvcm1hdCwgc3JjUGl4ZWxGb3Jt
YXQsIHNyYywgZGVzdEFscGhhRm9ybWF0LCBkZXN0UGl4ZWxGb3JtYXQsIGRlc3QpOwotfQotI2Vu
ZGlmCi0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIFVTRShDRykKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0dCYWNrZW5k
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1h
Z2VCdWZmZXJDR0JhY2tlbmQuaAkocmV2aXNpb24gMjc3MzE1KQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDR0JhY2tlbmQuaAkod29ya2luZyBjb3B5
KQpAQCAtNTQsMTIgKzU0LDYgQEAgcHJvdGVjdGVkOgogICAgIHN0YXRpYyBSZXRhaW5QdHI8Q0dD
b2xvclNwYWNlUmVmPiBjb250ZXh0Q29sb3JTcGFjZShjb25zdCBHcmFwaGljc0NvbnRleHQmKTsK
ICAgICB2b2lkIHNldHVwQ29udGV4dCgpIGNvbnN0OwogICAgIHZpcnR1YWwgUmV0YWluUHRyPENG
RGF0YVJlZj4gdG9DRkRhdGEoY29uc3QgU3RyaW5nJiBtaW1lVHlwZSwgT3B0aW9uYWw8ZG91Ymxl
PiBxdWFsaXR5LCBQcmVzZXJ2ZVJlc29sdXRpb24pIGNvbnN0OwotCi0jaWYgVVNFKEFDQ0VMRVJB
VEUpCi0gICAgdm9pZCBjb3B5SW1hZ2VQaXhlbHMoCi0gICAgICAgIEFscGhhUHJlbXVsdGlwbGlj
YXRpb24gc3JjQWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0IHNyY1BpeGVsRm9ybWF0LCB1bnNpZ25l
ZCBzcmNCeXRlc1BlclJvdywgdWludDhfdCogc3JjUm93cywKLSAgICAgICAgQWxwaGFQcmVtdWx0
aXBsaWNhdGlvbiBkZXN0QWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0IGRlc3RQaXhlbEZvcm1hdCwg
dW5zaWduZWQgZGVzdEJ5dGVzUGVyUm93LCB1aW50OF90KiBkZXN0Um93cywgY29uc3QgSW50U2l6
ZSYpIGNvbnN0IG92ZXJyaWRlOwotI2VuZGlmCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>428335</attachid>
            <date>2021-05-11 18:51:14 -0700</date>
            <delta_ts>2021-05-12 07:51:39 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225673-20210511185113.patch</filename>
            <type>text/plain</type>
            <size>40409</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3NzM0OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY5IEBACisyMDIxLTA1LTExICBTYW0gV2Vp
bmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBGYWN0b3IgY29weUltYWdlUGl4ZWxz
IHBpeGVsIGNvbnZlcnNpb24gY29kZSBpbnRvIGl0cyBvd24gZmlsZQorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI1NjczCisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgRGFyaW4gQWRsZXIuCisKKyAgICAgICAgUmVtb3ZlcyB2aXJ0dWFsIEltYWdlQnVmZmVy
QmFja2VuZDo6Y29weUltYWdlUGl4ZWxzKCkgZnVuY3Rpb24gYW5kCisgICAgICAgIG1vdmVzIGZ1
bmN0aW9uYWxpdHkgdG8gbmV3IFBpeGVsQnVmZmVyQ29udmVyc2lvbi5oL2NwcC4KKworICAgICAg
ICBNZXJnZSBVU0UoQUNDRUxFUkFURSkgY29kZSBmcm9tIEltYWdlQnVmZmVyQ0dCYWNrZW5kIGlu
dG8gdGhlIHNhbWUKKyAgICAgICAgZmlsZSBhbmQgZG8gc29tZSBsaWdodCBjbGVhbnVwLiAKKyAg
ICAgICAgCisgICAgICAgIC0gRnVuY3Rpb24gcmVuYW1lZCB0byBjb3ZlcnQgY29udmVydEltYWdl
UGl4ZWxzIHRvIGNvbnZleSB0aGF0IGl0IGlzCisgICAgICAgICAgZG9pbmcgbW9yZSB0aGFuIGNv
cHlpbmcuCisgICAgICAgIC0gQWRkIFBpeGVsQnVmZmVyQ29udmVyc2lvblZpZXcvQ29uc3RQaXhl
bEJ1ZmZlckNvbnZlcnNpb25WaWV3IHN0cnVjdHMKKyAgICAgICAgICB0byBob2xkIHBhcmFtZXRl
cnMgZm9yIHRoZSBjb252ZXJzaW9ucywgaW5jbHVkaW5nIGEgQ29sb3JTcGFjZSBtZW1iZXIKKyAg
ICAgICAgICB0aGF0IGlzIG5vdCB5ZXQgdXNlZCBidXQgd2lsbCBiZSBzaG9ydGx5LgorICAgICAg
ICAtIFVzZXMgY29uc3RleHByIGNvbmRpdGlvbmFscyBpbiB1bmFjY2VsZXJhdGVkIGNhc2VzIHRv
IGhvaXN0IGJyYW5jaAorICAgICAgICAgIGNoZWNraW5nIGZvciBwaXhlbCBmb3JtYXQgY29udmVy
c2lvbiByZXF1aXJlbWVudHMgb3V0c2lkZSB0aGUgbWFpbgorICAgICAgICAgIGxvb3AuCisKKyAg
ICAgICAgKiBTb3VyY2VzLnR4dDoKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2o6CisgICAgICAgIEFkZCBuZXcgZmlsZXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9QaXhlbEJ1ZmZlckNvbnZlcnNpb24uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6Om1ha2VWSW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6Y29udmVydEltYWdlUGl4
ZWxzQWNjZWxlcmF0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6Y29udmVydFNpbmdsZVBpeGVsUHJl
bXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZCk6CisgICAgICAgIChXZWJDb3JlOjpjb252ZXJ0U2lu
Z2xlUGl4ZWxQcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxpZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29udmVydFNpbmdsZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkKToKKyAg
ICAgICAgKFdlYkNvcmU6OmNvbnZlcnRTaW5nbGVQaXhlbFVucHJlbXVsdGlwbGllZFRvVW5wcmVt
dWx0aXBsaWVkKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbnZlcnRGdW5jdG9yKToKKyAgICAgICAg
KFdlYkNvcmU6OmNvbnZlcnRJbWFnZVBpeGVscyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmg6IEFkZGVkLgorICAgICAgICBNb3ZlIGV4aXN0aW5n
IGNvcHlJbWFnZVBpeGVscyBpbXBsZW1lbnRhdGlvbnMgaGVyZS4KKworICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVyQmFja2VuZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJ
bWFnZUJ1ZmZlckJhY2tlbmQ6OnRvQkdSQURhdGEgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6
SW1hZ2VCdWZmZXJCYWNrZW5kOjpnZXRQaXhlbEJ1ZmZlciBjb25zdCk6CisgICAgICAgIChXZWJD
b3JlOjpJbWFnZUJ1ZmZlckJhY2tlbmQ6OnB1dFBpeGVsQnVmZmVyKToKKyAgICAgICAgKFdlYkNv
cmU6OmNvcHlQcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkKTogRGVsZXRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OmNvcHlQcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxpZWQpOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6Y29weVVucHJlbXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZCk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpjb3B5VW5wcmVtdWx0aXBsaWVkVG9VbnByZW11bHRp
cGxpZWQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Y29weUZ1bmN0b3IpOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXJCYWNrZW5kOjpjb3B5SW1hZ2VQaXhlbHMg
Y29uc3QpOiBEZWxldGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVy
QmFja2VuZC5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0dC
YWNrZW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Om1ha2VWSW1hZ2VCdWZmZXIpOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6Y29weUltYWdlUGl4ZWxzQWNjZWxlcmF0ZWQpOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXJDR0JhY2tlbmQ6OmNvcHlJbWFnZVBpeGVs
cyBjb25zdCk6IERlbGV0ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VC
dWZmZXJDR0JhY2tlbmQuaDoKKyAgICAgICAgUmVtb3ZlIGV4aXN0aW5nIGNvcHlJbWFnZVBpeGVs
cygpIGltcGxlbWVudGF0aW9uIGFuZCBjYWxsIG5ldworICAgICAgICBjb252ZXJ0SW1hZ2VQaXhl
bHMoKSBpbnN0ZWFkLgorICAgICAgICAKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9maWx0
ZXJzL0ZpbHRlckVmZmVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGaWx0ZXJFZmZlY3Q6OmNv
cHlVbm11bHRpcGxpZWRSZXN1bHQpOgorICAgICAgICAoV2ViQ29yZTo6RmlsdGVyRWZmZWN0Ojpj
b3B5UHJlbXVsdGlwbGllZFJlc3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpGaWx0ZXJFZmZlY3Q6
OmNyZWF0ZVVubXVsdGlwbGllZEltYWdlUmVzdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OkZpbHRl
ckVmZmVjdDo6Y3JlYXRlUHJlbXVsdGlwbGllZEltYWdlUmVzdWx0KToKKyAgICAgICAgRml4IHBp
eGVsIGZvcm1hdCBmb3IgdGhlIFBpeGVsQnVmZmVycyB0byBtYXRjaCBleGlzdGluZyBiZWhhdmlv
cnMuCisgICAgICAgIFRoZXNlIGFyZSBub3QgYmVpbmcgdXNlZCBhdCB0aGUgbW9tZW50IGJ1dCB3
aWxsIGluIHRoZSBmdXR1cmUKKyAgICAgICAgYW5kIG5ldyBhc3NlcnQgaW4gcHV0UGl4ZWxCdWZm
ZXIgY2F1Z2h0IHRoZXNlIGJlaW5nIGluY29ycmVjdC4KKwogMjAyMS0wNS0xMSAgR2VvZmZyZXkg
R2FyZW4gIDxnZ2FyZW5AYXBwbGUuY29tPgogCiAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50
b1N0cmluZyB0cmlnZ2VycyBwYWdlIGRlbWFuZCBvbiBTcGVlZG9tZXRlcgpJbmRleDogU291cmNl
L1dlYkNvcmUvU291cmNlcy50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvU291cmNl
cy50eHQJKHJldmlzaW9uIDI3NzMxNSkKKysrIFNvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CSh3
b3JraW5nIGNvcHkpCkBAIC0yMDEzLDYgKzIwMTMsNyBAQCBwbGF0Zm9ybS9ncmFwaGljcy9QYXRo
VHJhdmVyc2FsU3RhdGUuY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9QYXRoVXRpbGl0aWVzLmNwcAog
cGxhdGZvcm0vZ3JhcGhpY3MvUGF0dGVybi5jcHAKIHBsYXRmb3JtL2dyYXBoaWNzL1BpeGVsQnVm
ZmVyLmNwcAorcGxhdGZvcm0vZ3JhcGhpY3MvUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmNwcAogcGxh
dGZvcm0vZ3JhcGhpY3MvUGxhdGZvcm1UaW1lUmFuZ2VzLmNwcAogcGxhdGZvcm0vZ3JhcGhpY3Mv
UmVnaW9uLmNwcAogcGxhdGZvcm0vZ3JhcGhpY3MvUmVtb3RlR3JhcGhpY3NDb250ZXh0R0xQcm94
eUJhc2UuY3BwCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAyNzczMTUpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTE0MDg1LDYg
KzE0MDg1LDggQEAKIAkJQkMwNkYyNEMwNkQxOEE3RTAwNEE2RkEzIC8qIFhTTFRQcm9jZXNzb3Iu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50
V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gWFNM
VFByb2Nlc3Nvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNU
YWJzID0gMDsgfTsKIAkJQkMwNkYyNEQwNkQxOEE3RTAwNEE2RkEzIC8qIFhTTFRQcm9jZXNzb3JM
aWJ4c2x0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAz
MDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IFhTTFRQcm9jZXNzb3JMaWJ4c2x0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUJDMDczQkE5MEMzOTlCMUYwMDBG
NTk3OSAvKiBGbG9hdENvbnZlcnNpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IEZsb2F0Q29udmVyc2lvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCQzBD
QTc0QzI2NEFFRDBBMDA0RkRDNjIgLyogUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFBpeGVsQnVmZmVyQ29udmVyc2lvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQlCQzBDQTc0RDI2NEFFRDBBMDA0RkRDNjIgLyogUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBpeGVsQnVmZmVyQ29udmVyc2lvbi5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDMTAxMzdCMjVDMzYyNEIwMERDNzczQyAvKiBDb2xvck1v
ZGVscy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBDb2xvck1vZGVscy5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlCQzEwMTM3RTI1QzM2MzE2MDBEQzc3M0MgLyogQ29sb3JUcmFuc2ZlckZ1bmN0
aW9ucy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBDb2xvclRyYW5zZmVyRnVuY3Rpb25zLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDMTI0RUU0MEMyNjQxQ0QwMDlFMjM0OSAvKiBCYXJQcm9w
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBCYXJQcm9wLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTI3MDM0LDYgKzI3MDM2LDggQEAKIAkJCQlB
OEZBNkU1QjBFNENGREVEMDBENUNGNDkgLyogUGF0dGVybi5oICovLAogCQkJCUJDNDgzOUJCMjY0
NjE4MUEwMEEyOEI2MiAvKiBQaXhlbEJ1ZmZlci5jcHAgKi8sCiAJCQkJQkM0ODM5QkEyNjQ2MTgx
QTAwQTI4QjYyIC8qIFBpeGVsQnVmZmVyLmggKi8sCisJCQkJQkMwQ0E3NEQyNjRBRUQwQTAwNEZE
QzYyIC8qIFBpeGVsQnVmZmVyQ29udmVyc2lvbi5jcHAgKi8sCisJCQkJQkMwQ0E3NEMyNjRBRUQw
QTAwNEZEQzYyIC8qIFBpeGVsQnVmZmVyQ29udmVyc2lvbi5oICovLAogCQkJCUJDQTU1OTEyMjYz
REJENzkwMDdGMTlCMyAvKiBQaXhlbEZvcm1hdC5oICovLAogCQkJCTcyNkQ1NkUxMjUzQUUwNDMw
MDAyRUY5MCAvKiBQbGF0Zm9ybUltYWdlLmggKi8sCiAJCQkJNzJCQUMzQTYyM0UxNzMyODAwOEQ3
NDFDIC8qIFBsYXRmb3JtSW1hZ2VCdWZmZXIuaCAqLywKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVyQmFja2VuZC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VCdWZmZXJCYWNrZW5kLmNwcAkocmV2
aXNpb24gMjc3MzE1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VC
dWZmZXJCYWNrZW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5j
bHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJQaXhlbEJ1ZmZlci5oIgorI2luY2x1ZGUgIlBpeGVs
QnVmZmVyQ29udmVyc2lvbi5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTkzLDE0MSAr
OTQsMzMgQEAgdm9pZCBJbWFnZUJ1ZmZlckJhY2tlbmQ6OmNvbnZlcnRUb0x1bWluYQogVmVjdG9y
PHVpbnQ4X3Q+IEltYWdlQnVmZmVyQmFja2VuZDo6dG9CR1JBRGF0YSh2b2lkKiBkYXRhKSBjb25z
dAogewogICAgIFZlY3Rvcjx1aW50OF90PiByZXN1bHQoNCAqIGxvZ2ljYWxTaXplKCkuYXJlYSgp
LnVuc2FmZUdldCgpKTsKLSAgICBzaXplX3QgZGVzdGluYXRpb25CeXRlc1BlclJvdyA9IGxvZ2lj
YWxTaXplKCkud2lkdGgoKSAqIDQ7Ci0gICAgc2l6ZV90IHNvdXJjZUJ5dGVzUGVyUm93ID0gYnl0
ZXNQZXJSb3coKTsKIAotICAgIHVpbnQ4X3QqIHNvdXJjZVJvd3MgPSByZWludGVycHJldF9jYXN0
PHVpbnQ4X3QqPihkYXRhKTsKKyAgICBDb25zdFBpeGVsQnVmZmVyQ29udmVyc2lvblZpZXcgc291
cmNlOworICAgIHNvdXJjZS5hbHBoYUZvcm1hdCA9IEFscGhhUHJlbXVsdGlwbGljYXRpb246OlBy
ZW11bHRpcGxpZWQ7CisgICAgc291cmNlLmNvbG9yU3BhY2UgPSBEZXN0aW5hdGlvbkNvbG9yU3Bh
Y2U6OlNSR0I7CisgICAgc291cmNlLnBpeGVsRm9ybWF0ID0gcGl4ZWxGb3JtYXQoKTsKKyAgICBz
b3VyY2UuYnl0ZXNQZXJSb3cgPSBieXRlc1BlclJvdygpOworICAgIHNvdXJjZS5yb3dzID0gcmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSk7CisgICAgCisgICAgUGl4ZWxCdWZm
ZXJDb252ZXJzaW9uVmlldyBkZXN0aW5hdGlvbjsKKyAgICBkZXN0aW5hdGlvbi5hbHBoYUZvcm1h
dCA9IEFscGhhUHJlbXVsdGlwbGljYXRpb246OlVucHJlbXVsdGlwbGllZDsKKyAgICBkZXN0aW5h
dGlvbi5jb2xvclNwYWNlID0gRGVzdGluYXRpb25Db2xvclNwYWNlOjpTUkdCOworICAgIGRlc3Rp
bmF0aW9uLnBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQ6OkJHUkE4OworICAgIGRlc3RpbmF0aW9u
LmJ5dGVzUGVyUm93ID0gbG9naWNhbFNpemUoKS53aWR0aCgpICogNDsKKyAgICBkZXN0aW5hdGlv
bi5yb3dzID0gcmVzdWx0LmRhdGEoKTsKIAotICAgIGNvcHlJbWFnZVBpeGVscygKLSAgICAgICAg
QWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6UHJlbXVsdGlwbGllZCwgcGl4ZWxGb3JtYXQoKSwgc291
cmNlQnl0ZXNQZXJSb3csIHNvdXJjZVJvd3MsCi0gICAgICAgIEFscGhhUHJlbXVsdGlwbGljYXRp
b246OlVucHJlbXVsdGlwbGllZCwgUGl4ZWxGb3JtYXQ6OkJHUkE4LCBkZXN0aW5hdGlvbkJ5dGVz
UGVyUm93LCByZXN1bHQuZGF0YSgpLCBsb2dpY2FsU2l6ZSgpKTsKKyAgICBjb252ZXJ0SW1hZ2VQ
aXhlbHMoc291cmNlLCBkZXN0aW5hdGlvbiwgbG9naWNhbFNpemUoKSk7CiAKICAgICByZXR1cm4g
cmVzdWx0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weVByZW11bHRpcGxpZWRUb1ByZW11
bHRpcGxpZWQoUGl4ZWxGb3JtYXQgc291cmNlUGl4ZWxGb3JtYXQsIGNvbnN0IHVpbnQ4X3QqIHNv
dXJjZVBpeGVsLCBQaXhlbEZvcm1hdCBkZXN0aW5hdGlvblBpeGVsRm9ybWF0LCB1aW50OF90KiBk
ZXN0aW5hdGlvblBpeGVsKQotewotICAgIHVpbnQ4X3QgYWxwaGEgPSBzb3VyY2VQaXhlbFszXTsK
LSAgICBpZiAoIWFscGhhKSB7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihk
ZXN0aW5hdGlvblBpeGVsKVswXSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBp
ZiAoc291cmNlUGl4ZWxGb3JtYXQgPT0gZGVzdGluYXRpb25QaXhlbEZvcm1hdCkgewotICAgICAg
ICByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGVzdGluYXRpb25QaXhlbClbMF0gPSByZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oc291cmNlUGl4ZWwpWzBdOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU3dhcCBwaXhlbCBjaGFubmVscyBCR1JBIDwtPiBSR0JB
LgotICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSBzb3VyY2VQaXhlbFsyXTsKLSAgICBkZXN0aW5h
dGlvblBpeGVsWzFdID0gc291cmNlUGl4ZWxbMV07Ci0gICAgZGVzdGluYXRpb25QaXhlbFsyXSA9
IHNvdXJjZVBpeGVsWzBdOwotICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10gPSBzb3VyY2VQaXhlbFsz
XTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlQcmVtdWx0aXBsaWVkVG9VbnByZW11bHRp
cGxpZWQoUGl4ZWxGb3JtYXQgc291cmNlUGl4ZWxGb3JtYXQsIGNvbnN0IHVpbnQ4X3QqIHNvdXJj
ZVBpeGVsLCBQaXhlbEZvcm1hdCBkZXN0aW5hdGlvblBpeGVsRm9ybWF0LCB1aW50OF90KiBkZXN0
aW5hdGlvblBpeGVsKQotewotICAgIHVpbnQ4X3QgYWxwaGEgPSBzb3VyY2VQaXhlbFszXTsKLSAg
ICBpZiAoIWFscGhhIHx8IGFscGhhID09IDI1NSkgewotICAgICAgICBjb3B5UHJlbXVsdGlwbGll
ZFRvUHJlbXVsdGlwbGllZChzb3VyY2VQaXhlbEZvcm1hdCwgc291cmNlUGl4ZWwsIGRlc3RpbmF0
aW9uUGl4ZWxGb3JtYXQsIGRlc3RpbmF0aW9uUGl4ZWwpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKHNvdXJjZVBpeGVsRm9ybWF0ID09IGRlc3RpbmF0aW9uUGl4ZWxGb3JtYXQp
IHsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFswXSA9IChzb3VyY2VQaXhlbFswXSAqIDI1NSkg
LyBhbHBoYTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IChzb3VyY2VQaXhlbFsxXSAq
IDI1NSkgLyBhbHBoYTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFsyXSA9IChzb3VyY2VQaXhl
bFsyXSAqIDI1NSkgLyBhbHBoYTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFszXSA9IGFscGhh
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU3dhcCBwaXhlbCBjaGFubmVscyBC
R1JBIDwtPiBSR0JBLgotICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291cmNlUGl4ZWxbMl0g
KiAyNTUpIC8gYWxwaGE7Ci0gICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IChzb3VyY2VQaXhlbFsx
XSAqIDI1NSkgLyBhbHBoYTsKLSAgICBkZXN0aW5hdGlvblBpeGVsWzJdID0gKHNvdXJjZVBpeGVs
WzBdICogMjU1KSAvIGFscGhhOwotICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10gPSBhbHBoYTsKLX0K
LQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlVbnByZW11bHRpcGxpZWRUb1ByZW11bHRpcGxpZWQo
UGl4ZWxGb3JtYXQgc291cmNlUGl4ZWxGb3JtYXQsIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZVBpeGVs
LCBQaXhlbEZvcm1hdCBkZXN0aW5hdGlvblBpeGVsRm9ybWF0LCB1aW50OF90KiBkZXN0aW5hdGlv
blBpeGVsKQotewotICAgIHVpbnQ4X3QgYWxwaGEgPSBzb3VyY2VQaXhlbFszXTsKLSAgICBpZiAo
IWFscGhhIHx8IGFscGhhID09IDI1NSkgewotICAgICAgICBjb3B5UHJlbXVsdGlwbGllZFRvUHJl
bXVsdGlwbGllZChzb3VyY2VQaXhlbEZvcm1hdCwgc291cmNlUGl4ZWwsIGRlc3RpbmF0aW9uUGl4
ZWxGb3JtYXQsIGRlc3RpbmF0aW9uUGl4ZWwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgaWYgKHNvdXJjZVBpeGVsRm9ybWF0ID09IGRlc3RpbmF0aW9uUGl4ZWxGb3JtYXQpIHsKLSAg
ICAgICAgZGVzdGluYXRpb25QaXhlbFswXSA9IChzb3VyY2VQaXhlbFswXSAqIGFscGhhICsgMjU0
KSAvIDI1NTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IChzb3VyY2VQaXhlbFsxXSAq
IGFscGhhICsgMjU0KSAvIDI1NTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhlbFsyXSA9IChzb3Vy
Y2VQaXhlbFsyXSAqIGFscGhhICsgMjU0KSAvIDI1NTsKLSAgICAgICAgZGVzdGluYXRpb25QaXhl
bFszXSA9IGFscGhhOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU3dhcCBwaXhl
bCBjaGFubmVscyBCR1JBIDwtPiBSR0JBLgotICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291
cmNlUGl4ZWxbMl0gKiBhbHBoYSArIDI1NCkgLyAyNTU7Ci0gICAgZGVzdGluYXRpb25QaXhlbFsx
XSA9IChzb3VyY2VQaXhlbFsxXSAqIGFscGhhICsgMjU0KSAvIDI1NTsKLSAgICBkZXN0aW5hdGlv
blBpeGVsWzJdID0gKHNvdXJjZVBpeGVsWzBdICogYWxwaGEgKyAyNTQpIC8gMjU1OwotICAgIGRl
c3RpbmF0aW9uUGl4ZWxbM10gPSBhbHBoYTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlV
bnByZW11bHRpcGxpZWRUb1VucHJlbXVsdGlwbGllZChQaXhlbEZvcm1hdCBzb3VyY2VQaXhlbEZv
cm1hdCwgY29uc3QgdWludDhfdCogc291cmNlUGl4ZWwsIFBpeGVsRm9ybWF0IGRlc3RpbmF0aW9u
UGl4ZWxGb3JtYXQsIHVpbnQ4X3QqIGRlc3RpbmF0aW9uUGl4ZWwpCi17Ci0gICAgaWYgKHNvdXJj
ZVBpeGVsRm9ybWF0ID09IGRlc3RpbmF0aW9uUGl4ZWxGb3JtYXQpIHsKLSAgICAgICAgcmVpbnRl
cnByZXRfY2FzdDx1aW50MzJfdCo+KGRlc3RpbmF0aW9uUGl4ZWwpWzBdID0gcmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50MzJfdCo+KHNvdXJjZVBpeGVsKVswXTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIC8vIFN3YXAgcGl4ZWwgY2hhbm5lbHMgQkdSQSA8LT4gUkdCQS4KLSAgICBk
ZXN0aW5hdGlvblBpeGVsWzBdID0gc291cmNlUGl4ZWxbMl07Ci0gICAgZGVzdGluYXRpb25QaXhl
bFsxXSA9IHNvdXJjZVBpeGVsWzFdOwotICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0gPSBzb3VyY2VQ
aXhlbFswXTsKLSAgICBkZXN0aW5hdGlvblBpeGVsWzNdID0gc291cmNlUGl4ZWxbM107Ci19Ci0K
LXRlbXBsYXRlPHZvaWQgKCpjb3B5RnVuY3RvcikoUGl4ZWxGb3JtYXQsIGNvbnN0IHVpbnQ4X3Qq
LCBQaXhlbEZvcm1hdCwgdWludDhfdCopPgotc3RhdGljIGlubGluZSB2b2lkIGNvcHlJbWFnZVBp
eGVsc1VuYWNjZWxlcmF0ZWQoCi0gICAgUGl4ZWxGb3JtYXQgc291cmNlUGl4ZWxGb3JtYXQsIHVu
c2lnbmVkIHNvdXJjZUJ5dGVzUGVyUm93LCB1aW50OF90KiBzb3VyY2VSb3dzLAotICAgIFBpeGVs
Rm9ybWF0IGRlc3RpbmF0aW9uUGl4ZWxGb3JtYXQsIHVuc2lnbmVkIGRlc3RpbmF0aW9uQnl0ZXNQ
ZXJSb3csIHVpbnQ4X3QqIGRlc3RpbmF0aW9uUm93cywgY29uc3QgSW50U2l6ZSYgc2l6ZSkKLXsK
LSAgICBzaXplX3QgYnl0ZXNQZXJSb3cgPSBzaXplLndpZHRoKCkgKiA0OwotICAgIGZvciAoaW50
IHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQoKTsgKyt5KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IHgg
PSAwOyB4IDwgYnl0ZXNQZXJSb3c7IHggKz0gNCkKLSAgICAgICAgICAgIGNvcHlGdW5jdG9yKHNv
dXJjZVBpeGVsRm9ybWF0LCAmc291cmNlUm93c1t4XSwgZGVzdGluYXRpb25QaXhlbEZvcm1hdCwg
JmRlc3RpbmF0aW9uUm93c1t4XSk7Ci0gICAgICAgIHNvdXJjZVJvd3MgKz0gc291cmNlQnl0ZXNQ
ZXJSb3c7Ci0gICAgICAgIGRlc3RpbmF0aW9uUm93cyArPSBkZXN0aW5hdGlvbkJ5dGVzUGVyUm93
OwotICAgIH0KLX0KLQotdm9pZCBJbWFnZUJ1ZmZlckJhY2tlbmQ6OmNvcHlJbWFnZVBpeGVscygK
LSAgICBBbHBoYVByZW11bHRpcGxpY2F0aW9uIHNvdXJjZUFscGhhRm9ybWF0LCBQaXhlbEZvcm1h
dCBzb3VyY2VQaXhlbEZvcm1hdCwgdW5zaWduZWQgc291cmNlQnl0ZXNQZXJSb3csIHVpbnQ4X3Qq
IHNvdXJjZVJvd3MsCi0gICAgQWxwaGFQcmVtdWx0aXBsaWNhdGlvbiBkZXN0aW5hdGlvbkFscGhh
Rm9ybWF0LCBQaXhlbEZvcm1hdCBkZXN0aW5hdGlvblBpeGVsRm9ybWF0LCB1bnNpZ25lZCBkZXN0
aW5hdGlvbkJ5dGVzUGVyUm93LCB1aW50OF90KiBkZXN0aW5hdGlvblJvd3MsIGNvbnN0IEludFNp
emUmIHNpemUpIGNvbnN0Ci17Ci0gICAgLy8gV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgZ2V0
dGluZyBvciBwdXR0aW5nIHBpeGVsIGRhdGEgd2l0aCBkZWVwIGNvbG9yIGJ1ZmZlcnMuCi0gICAg
QVNTRVJUKHNvdXJjZVBpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpSR0JBOCB8fCBzb3VyY2VQ
aXhlbEZvcm1hdCA9PSBQaXhlbEZvcm1hdDo6QkdSQTgpOwotICAgIEFTU0VSVChkZXN0aW5hdGlv
blBpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpSR0JBOCB8fCBkZXN0aW5hdGlvblBpeGVsRm9y
bWF0ID09IFBpeGVsRm9ybWF0OjpCR1JBOCk7Ci0KLSAgICBpZiAoc291cmNlQWxwaGFGb3JtYXQg
PT0gZGVzdGluYXRpb25BbHBoYUZvcm1hdCkgewotICAgICAgICBpZiAoc291cmNlQWxwaGFGb3Jt
YXQgPT0gQWxwaGFQcmVtdWx0aXBsaWNhdGlvbjo6UHJlbXVsdGlwbGllZCkKLSAgICAgICAgICAg
IGNvcHlJbWFnZVBpeGVsc1VuYWNjZWxlcmF0ZWQ8Y29weVByZW11bHRpcGxpZWRUb1ByZW11bHRp
cGxpZWQ+KHNvdXJjZVBpeGVsRm9ybWF0LCBzb3VyY2VCeXRlc1BlclJvdywgc291cmNlUm93cywg
ZGVzdGluYXRpb25QaXhlbEZvcm1hdCwgZGVzdGluYXRpb25CeXRlc1BlclJvdywgZGVzdGluYXRp
b25Sb3dzLCBzaXplKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29weUltYWdlUGl4ZWxz
VW5hY2NlbGVyYXRlZDxjb3B5VW5wcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxpZWQ+KHNvdXJj
ZVBpeGVsRm9ybWF0LCBzb3VyY2VCeXRlc1BlclJvdywgc291cmNlUm93cywgZGVzdGluYXRpb25Q
aXhlbEZvcm1hdCwgZGVzdGluYXRpb25CeXRlc1BlclJvdywgZGVzdGluYXRpb25Sb3dzLCBzaXpl
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChkZXN0aW5hdGlvbkFscGhhRm9y
bWF0ID09IEFscGhhUHJlbXVsdGlwbGljYXRpb246OlVucHJlbXVsdGlwbGllZCkgewotICAgICAg
ICBjb3B5SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkPGNvcHlQcmVtdWx0aXBsaWVkVG9VbnByZW11
bHRpcGxpZWQ+KHNvdXJjZVBpeGVsRm9ybWF0LCBzb3VyY2VCeXRlc1BlclJvdywgc291cmNlUm93
cywgZGVzdGluYXRpb25QaXhlbEZvcm1hdCwgZGVzdGluYXRpb25CeXRlc1BlclJvdywgZGVzdGlu
YXRpb25Sb3dzLCBzaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvcHlJbWFn
ZVBpeGVsc1VuYWNjZWxlcmF0ZWQ8Y29weVVucHJlbXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZD4o
c291cmNlUGl4ZWxGb3JtYXQsIHNvdXJjZUJ5dGVzUGVyUm93LCBzb3VyY2VSb3dzLCBkZXN0aW5h
dGlvblBpeGVsRm9ybWF0LCBkZXN0aW5hdGlvbkJ5dGVzUGVyUm93LCBkZXN0aW5hdGlvblJvd3Ms
IHNpemUpOwotfQotCiBPcHRpb25hbDxQaXhlbEJ1ZmZlcj4gSW1hZ2VCdWZmZXJCYWNrZW5kOjpn
ZXRQaXhlbEJ1ZmZlcihBbHBoYVByZW11bHRpcGxpY2F0aW9uIGRlc3RpbmF0aW9uQWxwaGFGb3Jt
YXQsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIHZvaWQqIGRhdGEpIGNvbnN0CiB7CiAgICAg
YXV0byBzb3VyY2VSZWN0U2NhbGVkID0gdG9CYWNrZW5kQ29vcmRpbmF0ZXMoc291cmNlUmVjdCk7
CiAKLSAgICBhdXRvIHBpeGVsQnVmZmVyID0gUGl4ZWxCdWZmZXI6OnRyeUNyZWF0ZShEZXN0aW5h
dGlvbkNvbG9yU3BhY2U6OlNSR0IsIFBpeGVsRm9ybWF0OjpSR0JBOCwgc291cmNlUmVjdFNjYWxl
ZC5zaXplKCkpOworICAgIGF1dG8gZGVzdGluYXRpb25QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0
OjpSR0JBODsKKworICAgIGF1dG8gcGl4ZWxCdWZmZXIgPSBQaXhlbEJ1ZmZlcjo6dHJ5Q3JlYXRl
KERlc3RpbmF0aW9uQ29sb3JTcGFjZTo6U1JHQiwgZGVzdGluYXRpb25QaXhlbEZvcm1hdCwgc291
cmNlUmVjdFNjYWxlZC5zaXplKCkpOwogICAgIGlmICghcGl4ZWxCdWZmZXIpCiAgICAgICAgIHJl
dHVybiBXVEY6Om51bGxvcHQ7CiAKQEAgLTI0MywyMSArMTM2LDM2IEBAIE9wdGlvbmFsPFBpeGVs
QnVmZmVyPiBJbWFnZUJ1ZmZlckJhY2tlbmQKICAgICBpZiAoZGVzdGluYXRpb25SZWN0LnNpemUo
KSAhPSBzb3VyY2VSZWN0U2NhbGVkLnNpemUoKSkKICAgICAgICAgcGl4ZWxCdWZmZXItPmRhdGEo
KS56ZXJvRmlsbCgpOwogCisgICAgdW5zaWduZWQgc291cmNlQnl0ZXNQZXJSb3cgPSBieXRlc1Bl
clJvdygpOworICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZVJvd3MgPSByZWludGVycHJldF9jYXN0
PHVpbnQ4X3QqPihkYXRhKSArIHNvdXJjZVJlY3RDbGlwcGVkLnkoKSAqIHNvdXJjZUJ5dGVzUGVy
Um93ICsgc291cmNlUmVjdENsaXBwZWQueCgpICogNDsKKwogICAgIHVuc2lnbmVkIGRlc3RpbmF0
aW9uQnl0ZXNQZXJSb3cgPSA0ICogc291cmNlUmVjdFNjYWxlZC53aWR0aCgpOwogICAgIHVpbnQ4
X3QqIGRlc3RpbmF0aW9uUm93cyA9IHBpeGVsQnVmZmVyLT5kYXRhKCkuZGF0YSgpICsgZGVzdGlu
YXRpb25SZWN0LnkoKSAqIGRlc3RpbmF0aW9uQnl0ZXNQZXJSb3cgKyBkZXN0aW5hdGlvblJlY3Qu
eCgpICogNDsKIAotICAgIHVuc2lnbmVkIHNvdXJjZUJ5dGVzUGVyUm93ID0gYnl0ZXNQZXJSb3co
KTsKLSAgICB1aW50OF90KiBzb3VyY2VSb3dzID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4o
ZGF0YSkgKyBzb3VyY2VSZWN0Q2xpcHBlZC55KCkgKiBzb3VyY2VCeXRlc1BlclJvdyArIHNvdXJj
ZVJlY3RDbGlwcGVkLngoKSAqIDQ7CisgICAgQ29uc3RQaXhlbEJ1ZmZlckNvbnZlcnNpb25WaWV3
IHNvdXJjZTsKKyAgICBzb3VyY2UuYWxwaGFGb3JtYXQgPSBBbHBoYVByZW11bHRpcGxpY2F0aW9u
OjpQcmVtdWx0aXBsaWVkOworICAgIHNvdXJjZS5jb2xvclNwYWNlID0gRGVzdGluYXRpb25Db2xv
clNwYWNlOjpTUkdCOworICAgIHNvdXJjZS5waXhlbEZvcm1hdCA9IHBpeGVsRm9ybWF0KCk7Cisg
ICAgc291cmNlLmJ5dGVzUGVyUm93ID0gc291cmNlQnl0ZXNQZXJSb3c7CisgICAgc291cmNlLnJv
d3MgPSBzb3VyY2VSb3dzOworICAgIAorICAgIFBpeGVsQnVmZmVyQ29udmVyc2lvblZpZXcgZGVz
dGluYXRpb247CisgICAgZGVzdGluYXRpb24uYWxwaGFGb3JtYXQgPSBkZXN0aW5hdGlvbkFscGhh
Rm9ybWF0OworICAgIGRlc3RpbmF0aW9uLmNvbG9yU3BhY2UgPSBEZXN0aW5hdGlvbkNvbG9yU3Bh
Y2U6OlNSR0I7CisgICAgZGVzdGluYXRpb24ucGl4ZWxGb3JtYXQgPSBkZXN0aW5hdGlvblBpeGVs
Rm9ybWF0OworICAgIGRlc3RpbmF0aW9uLmJ5dGVzUGVyUm93ID0gZGVzdGluYXRpb25CeXRlc1Bl
clJvdzsKKyAgICBkZXN0aW5hdGlvbi5yb3dzID0gZGVzdGluYXRpb25Sb3dzOwogCi0gICAgY29w
eUltYWdlUGl4ZWxzKAotICAgICAgICBBbHBoYVByZW11bHRpcGxpY2F0aW9uOjpQcmVtdWx0aXBs
aWVkLCBwaXhlbEZvcm1hdCgpLCBzb3VyY2VCeXRlc1BlclJvdywgc291cmNlUm93cywKLSAgICAg
ICAgZGVzdGluYXRpb25BbHBoYUZvcm1hdCwgUGl4ZWxGb3JtYXQ6OlJHQkE4LCBkZXN0aW5hdGlv
bkJ5dGVzUGVyUm93LCBkZXN0aW5hdGlvblJvd3MsIGRlc3RpbmF0aW9uUmVjdC5zaXplKCkpOwor
ICAgIGNvbnZlcnRJbWFnZVBpeGVscyhzb3VyY2UsIGRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblJl
Y3Quc2l6ZSgpKTsKIAogICAgIHJldHVybiBwaXhlbEJ1ZmZlcjsKIH0KIAogdm9pZCBJbWFnZUJ1
ZmZlckJhY2tlbmQ6OnB1dFBpeGVsQnVmZmVyKEFscGhhUHJlbXVsdGlwbGljYXRpb24gc291cmNl
QWxwaGFGb3JtYXQsIGNvbnN0IFBpeGVsQnVmZmVyJiBwaXhlbEJ1ZmZlciwgY29uc3QgSW50UmVj
dCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RpbmF0aW9uUG9pbnQsIEFscGhhUHJl
bXVsdGlwbGljYXRpb24gZGVzdGluYXRpb25BbHBoYUZvcm1hdCwgdm9pZCogZGF0YSkKIHsKKyAg
ICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIG5vbi1SR0JBOCBwaXhlbCBmb3JtYXRzLgorICAg
IEFTU0VSVChwaXhlbEJ1ZmZlci5mb3JtYXQoKSA9PSBQaXhlbEZvcm1hdDo6UkdCQTgpOworCiAg
ICAgYXV0byBzb3VyY2VSZWN0U2NhbGVkID0gdG9CYWNrZW5kQ29vcmRpbmF0ZXMoc291cmNlUmVj
dCk7CiAgICAgYXV0byBkZXN0aW5hdGlvblBvaW50U2NhbGVkID0gdG9CYWNrZW5kQ29vcmRpbmF0
ZXMoZGVzdGluYXRpb25Qb2ludCk7CiAKQEAgLTI3NCwxNSArMTgyLDI3IEBAIHZvaWQgSW1hZ2VC
dWZmZXJCYWNrZW5kOjpwdXRQaXhlbEJ1ZmZlcigKICAgICBkZXN0aW5hdGlvblJlY3QuaW50ZXJz
ZWN0KGJhY2tlbmRSZWN0KCkpOwogICAgIHNvdXJjZVJlY3RDbGlwcGVkLnNldFNpemUoZGVzdGlu
YXRpb25SZWN0LnNpemUoKSk7CiAKKyAgICB1bnNpZ25lZCBzb3VyY2VCeXRlc1BlclJvdyA9IDQg
KiBwaXhlbEJ1ZmZlci5zaXplKCkud2lkdGgoKTsKKyAgICBjb25zdCB1aW50OF90KiBzb3VyY2VS
b3dzID0gcGl4ZWxCdWZmZXIuZGF0YSgpLmRhdGEoKSArIHNvdXJjZVJlY3RDbGlwcGVkLnkoKSAq
IHNvdXJjZUJ5dGVzUGVyUm93ICsgc291cmNlUmVjdENsaXBwZWQueCgpICogNDsKKwogICAgIHVu
c2lnbmVkIGRlc3RpbmF0aW9uQnl0ZXNQZXJSb3cgPSBieXRlc1BlclJvdygpOwogICAgIHVpbnQ4
X3QqIGRlc3RpbmF0aW9uUm93cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRhdGEpICsg
ZGVzdGluYXRpb25SZWN0LnkoKSAqIGRlc3RpbmF0aW9uQnl0ZXNQZXJSb3cgKyBkZXN0aW5hdGlv
blJlY3QueCgpICogNDsKIAotICAgIHVuc2lnbmVkIHNvdXJjZUJ5dGVzUGVyUm93ID0gNCAqIHBp
eGVsQnVmZmVyLnNpemUoKS53aWR0aCgpOwotICAgIHVpbnQ4X3QqIHNvdXJjZVJvd3MgPSBwaXhl
bEJ1ZmZlci5kYXRhKCkuZGF0YSgpICsgc291cmNlUmVjdENsaXBwZWQueSgpICogc291cmNlQnl0
ZXNQZXJSb3cgKyBzb3VyY2VSZWN0Q2xpcHBlZC54KCkgKiA0OworICAgIENvbnN0UGl4ZWxCdWZm
ZXJDb252ZXJzaW9uVmlldyBzb3VyY2U7CisgICAgc291cmNlLmFscGhhRm9ybWF0ID0gc291cmNl
QWxwaGFGb3JtYXQ7CisgICAgc291cmNlLmNvbG9yU3BhY2UgPSBEZXN0aW5hdGlvbkNvbG9yU3Bh
Y2U6OlNSR0I7CisgICAgc291cmNlLnBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQ6OlJHQkE4Owor
ICAgIHNvdXJjZS5ieXRlc1BlclJvdyA9IHNvdXJjZUJ5dGVzUGVyUm93OworICAgIHNvdXJjZS5y
b3dzID0gc291cmNlUm93czsKKyAgICAKKyAgICBQaXhlbEJ1ZmZlckNvbnZlcnNpb25WaWV3IGRl
c3RpbmF0aW9uOworICAgIGRlc3RpbmF0aW9uLmFscGhhRm9ybWF0ID0gZGVzdGluYXRpb25BbHBo
YUZvcm1hdDsKKyAgICBkZXN0aW5hdGlvbi5jb2xvclNwYWNlID0gRGVzdGluYXRpb25Db2xvclNw
YWNlOjpTUkdCOworICAgIGRlc3RpbmF0aW9uLnBpeGVsRm9ybWF0ID0gcGl4ZWxGb3JtYXQoKTsK
KyAgICBkZXN0aW5hdGlvbi5ieXRlc1BlclJvdyA9IGRlc3RpbmF0aW9uQnl0ZXNQZXJSb3c7Cisg
ICAgZGVzdGluYXRpb24ucm93cyA9IGRlc3RpbmF0aW9uUm93czsKIAotICAgIGNvcHlJbWFnZVBp
eGVscygKLSAgICAgICAgc291cmNlQWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0OjpSR0JBOCwgc291
cmNlQnl0ZXNQZXJSb3csIHNvdXJjZVJvd3MsCi0gICAgICAgIGRlc3RpbmF0aW9uQWxwaGFGb3Jt
YXQsIHBpeGVsRm9ybWF0KCksIGRlc3RpbmF0aW9uQnl0ZXNQZXJSb3csIGRlc3RpbmF0aW9uUm93
cywgZGVzdGluYXRpb25SZWN0LnNpemUoKSk7CisgICAgY29udmVydEltYWdlUGl4ZWxzKHNvdXJj
ZSwgZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uUmVjdC5zaXplKCkpOwogfQogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9JbWFn
ZUJ1ZmZlckJhY2tlbmQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9JbWFnZUJ1ZmZlckJhY2tlbmQuaAkocmV2aXNpb24gMjc3MzE1KQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VCdWZmZXJCYWNrZW5kLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTE0OCwxMCArMTQ4LDYgQEAgcHJvdGVjdGVkOgogICAgIEludFJlY3QgbG9naWNh
bFJlY3QoKSBjb25zdCB7IHJldHVybiBJbnRSZWN0KEludFBvaW50Ojp6ZXJvKCksIGxvZ2ljYWxT
aXplKCkpOyB9OwogICAgIEludFJlY3QgYmFja2VuZFJlY3QoKSBjb25zdCB7IHJldHVybiBJbnRS
ZWN0KEludFBvaW50Ojp6ZXJvKCksIGJhY2tlbmRTaXplKCkpOyB9OwogCi0gICAgV0VCQ09SRV9F
WFBPUlQgdmlydHVhbCB2b2lkIGNvcHlJbWFnZVBpeGVscygKLSAgICAgICAgQWxwaGFQcmVtdWx0
aXBsaWNhdGlvbiBzcmNBbHBoYUZvcm1hdCwgUGl4ZWxGb3JtYXQgc3JjUGl4ZWxGb3JtYXQsIHVu
c2lnbmVkIHNyY0J5dGVzUGVyUm93LCB1aW50OF90KiBzcmNSb3dzLAotICAgICAgICBBbHBoYVBy
ZW11bHRpcGxpY2F0aW9uIGRlc3RBbHBoYUZvcm1hdCwgUGl4ZWxGb3JtYXQgZGVzdFBpeGVsRm9y
bWF0LCB1bnNpZ25lZCBkZXN0Qnl0ZXNQZXJSb3csIHVpbnQ4X3QqIGRlc3RSb3dzLCBjb25zdCBJ
bnRTaXplJikgY29uc3Q7Ci0KICAgICBXRUJDT1JFX0VYUE9SVCBWZWN0b3I8dWludDhfdD4gdG9C
R1JBRGF0YSh2b2lkKiBkYXRhKSBjb25zdDsKIAogICAgIFdFQkNPUkVfRVhQT1JUIE9wdGlvbmFs
PFBpeGVsQnVmZmVyPiBnZXRQaXhlbEJ1ZmZlcihBbHBoYVByZW11bHRpcGxpY2F0aW9uIG91dHB1
dEZvcm1hdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgdm9pZCogZGF0YSkgY29uc3Q7CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QaXhlbEJ1ZmZlckNvbnZlcnNpb24u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BpeGVs
QnVmZmVyQ29udmVyc2lvbi5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJQaXhlbEJ1ZmZlckNvbnZlcnNpb24uaCIKKworI2luY2x1ZGUgIkFscGhhUHJlbXVsdGlw
bGljYXRpb24uaCIKKyNpbmNsdWRlICJDb2xvclNwYWNlLmgiCisjaW5jbHVkZSAiSW50U2l6ZS5o
IgorI2luY2x1ZGUgIlBpeGVsRm9ybWF0LmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURSkKKyNpbmNs
dWRlIDxBY2NlbGVyYXRlL0FjY2VsZXJhdGUuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKKyNpZiBVU0UoQUNDRUxFUkFURSkKKwordGVtcGxhdGU8dHlwZW5hbWUgVmlldz4gc3Rh
dGljIGlubGluZSB2SW1hZ2VfQnVmZmVyIG1ha2VWSW1hZ2VCdWZmZXIoY29uc3QgVmlldyYgdmll
dywgY29uc3QgSW50U2l6ZSYgc2l6ZSkKK3sKKyAgICB2SW1hZ2VfQnVmZmVyIHZJbWFnZUJ1ZmZl
cjsKKworICAgIHZJbWFnZUJ1ZmZlci5oZWlnaHQgPSBzdGF0aWNfY2FzdDx2SW1hZ2VQaXhlbENv
dW50PihzaXplLmhlaWdodCgpKTsKKyAgICB2SW1hZ2VCdWZmZXIud2lkdGggPSBzdGF0aWNfY2Fz
dDx2SW1hZ2VQaXhlbENvdW50PihzaXplLndpZHRoKCkpOworICAgIHZJbWFnZUJ1ZmZlci5yb3dC
eXRlcyA9IHZpZXcuYnl0ZXNQZXJSb3c7CisgICAgdkltYWdlQnVmZmVyLmRhdGEgPSBjb25zdF9j
YXN0PHVpbnQ4X3QqPih2aWV3LnJvd3MpOworCisgICAgcmV0dXJuIHZJbWFnZUJ1ZmZlcjsKK30K
Kworc3RhdGljIGlubGluZSB2b2lkIGNvbnZlcnRJbWFnZVBpeGVsc0FjY2VsZXJhdGVkKGNvbnN0
IENvbnN0UGl4ZWxCdWZmZXJDb252ZXJzaW9uVmlldyYgc291cmNlLCBjb25zdCBQaXhlbEJ1ZmZl
ckNvbnZlcnNpb25WaWV3JiBkZXN0aW5hdGlvbiwgY29uc3QgSW50U2l6ZSYgZGVzdGluYXRpb25T
aXplKQoreworICAgIGF1dG8gc291cmNlVkltYWdlQnVmZmVyID0gbWFrZVZJbWFnZUJ1ZmZlcihz
b3VyY2UsIGRlc3RpbmF0aW9uU2l6ZSk7CisgICAgYXV0byBkZXN0aW5hdGlvblZJbWFnZUJ1ZmZl
ciA9IG1ha2VWSW1hZ2VCdWZmZXIoZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uU2l6ZSk7CisKKyAg
ICBpZiAoc291cmNlLmFscGhhRm9ybWF0ICE9IGRlc3RpbmF0aW9uLmFscGhhRm9ybWF0KSB7Cisg
ICAgICAgIGlmIChkZXN0aW5hdGlvbi5hbHBoYUZvcm1hdCA9PSBBbHBoYVByZW11bHRpcGxpY2F0
aW9uOjpVbnByZW11bHRpcGxpZWQpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UucGl4ZWxGb3Jt
YXQgPT0gUGl4ZWxGb3JtYXQ6OlJHQkE4KQorICAgICAgICAgICAgICAgIHZJbWFnZVVucHJlbXVs
dGlwbHlEYXRhX1JHQkE4ODg4KCZzb3VyY2VWSW1hZ2VCdWZmZXIsICZkZXN0aW5hdGlvblZJbWFn
ZUJ1ZmZlciwga3ZJbWFnZU5vRmxhZ3MpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIHZJbWFnZVVucHJlbXVsdGlwbHlEYXRhX0JHUkE4ODg4KCZzb3VyY2VWSW1hZ2VCdWZmZXIs
ICZkZXN0aW5hdGlvblZJbWFnZUJ1ZmZlciwga3ZJbWFnZU5vRmxhZ3MpOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgaWYgKHNvdXJjZS5waXhlbEZvcm1hdCA9PSBQaXhlbEZvcm1hdDo6
UkdCQTgpCisgICAgICAgICAgICAgICAgdkltYWdlUHJlbXVsdGlwbHlEYXRhX1JHQkE4ODg4KCZz
b3VyY2VWSW1hZ2VCdWZmZXIsICZkZXN0aW5hdGlvblZJbWFnZUJ1ZmZlciwga3ZJbWFnZU5vRmxh
Z3MpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZJbWFnZVByZW11bHRpcGx5
RGF0YV9CR1JBODg4OCgmc291cmNlVkltYWdlQnVmZmVyLCAmZGVzdGluYXRpb25WSW1hZ2VCdWZm
ZXIsIGt2SW1hZ2VOb0ZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZVZJbWFnZUJ1
ZmZlciA9IGRlc3RpbmF0aW9uVkltYWdlQnVmZmVyOworICAgIH0KKworICAgIGlmIChzb3VyY2Uu
cGl4ZWxGb3JtYXQgIT0gZGVzdGluYXRpb24ucGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgLy8gU3dh
cCBwaXhlbCBjaGFubmVscyBCR1JBIDwtPiBSR0JBLgorICAgICAgICBjb25zdCB1aW50OF90IG1h
cFs0XSA9IHsgMiwgMSwgMCwgMyB9OworICAgICAgICB2SW1hZ2VQZXJtdXRlQ2hhbm5lbHNfQVJH
Qjg4ODgoJnNvdXJjZVZJbWFnZUJ1ZmZlciwgJmRlc3RpbmF0aW9uVkltYWdlQnVmZmVyLCBtYXAs
IGt2SW1hZ2VOb0ZsYWdzKTsKKyAgICB9Cit9CisjZW5kaWYKKworZW51bSBjbGFzcyBQaXhlbEZv
cm1hdENvbnZlcnNpb24geyBOb25lLCBQZXJtdXRlIH07CisKK3RlbXBsYXRlPFBpeGVsRm9ybWF0
Q29udmVyc2lvbiBwaXhlbEZvcm1hdENvbnZlcnNpb24+CitzdGF0aWMgaW5saW5lIHZvaWQgY29u
dmVydFNpbmdsZVBpeGVsUHJlbXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZChjb25zdCB1aW50OF90
KiBzb3VyY2VQaXhlbCwgdWludDhfdCogZGVzdGluYXRpb25QaXhlbCkKK3sKKyAgICB1aW50OF90
IGFscGhhID0gc291cmNlUGl4ZWxbM107CisgICAgaWYgKCFhbHBoYSkgeworICAgICAgICByZWlu
dGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGVzdGluYXRpb25QaXhlbClbMF0gPSAwOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgY29uc3RleHByIChwaXhlbEZvcm1hdENvbnZlcnNp
b24gPT0gUGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpOb25lKQorICAgICAgICByZWludGVycHJldF9j
YXN0PHVpbnQzMl90Kj4oZGVzdGluYXRpb25QaXhlbClbMF0gPSByZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQzMl90Kj4oc291cmNlUGl4ZWwpWzBdOworICAgIGVsc2UgeworICAgICAgICAvLyBT
d2FwIHBpeGVsIGNoYW5uZWxzIEJHUkEgPC0+IFJHQkEuCisgICAgICAgIGRlc3RpbmF0aW9uUGl4
ZWxbMF0gPSBzb3VyY2VQaXhlbFsyXTsKKyAgICAgICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IHNv
dXJjZVBpeGVsWzFdOworICAgICAgICBkZXN0aW5hdGlvblBpeGVsWzJdID0gc291cmNlUGl4ZWxb
MF07CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10gPSBzb3VyY2VQaXhlbFszXTsKKyAgICB9
Cit9CisKK3RlbXBsYXRlPFBpeGVsRm9ybWF0Q29udmVyc2lvbiBwaXhlbEZvcm1hdENvbnZlcnNp
b24+CitzdGF0aWMgaW5saW5lIHZvaWQgY29udmVydFNpbmdsZVBpeGVsUHJlbXVsdGlwbGllZFRv
VW5wcmVtdWx0aXBsaWVkKGNvbnN0IHVpbnQ4X3QqIHNvdXJjZVBpeGVsLCB1aW50OF90KiBkZXN0
aW5hdGlvblBpeGVsKQoreworICAgIHVpbnQ4X3QgYWxwaGEgPSBzb3VyY2VQaXhlbFszXTsKKyAg
ICBpZiAoIWFscGhhIHx8IGFscGhhID09IDI1NSkgeworICAgICAgICBjb252ZXJ0U2luZ2xlUGl4
ZWxQcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkPHBpeGVsRm9ybWF0Q29udmVyc2lvbj4oc291
cmNlUGl4ZWwsIGRlc3RpbmF0aW9uUGl4ZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgY29uc3RleHByIChwaXhlbEZvcm1hdENvbnZlcnNpb24gPT0gUGl4ZWxGb3JtYXRDb252
ZXJzaW9uOjpOb25lKSB7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291cmNlUGl4
ZWxbMF0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMV0gPSAoc291
cmNlUGl4ZWxbMV0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0g
PSAoc291cmNlUGl4ZWxbMl0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4
ZWxbM10gPSBhbHBoYTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTd2FwIHBpeGVsIGNoYW5u
ZWxzIEJHUkEgPC0+IFJHQkEuCisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291cmNl
UGl4ZWxbMl0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMV0gPSAo
c291cmNlUGl4ZWxbMV0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxb
Ml0gPSAoc291cmNlUGl4ZWxbMF0gKiAyNTUpIC8gYWxwaGE7CisgICAgICAgIGRlc3RpbmF0aW9u
UGl4ZWxbM10gPSBhbHBoYTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPFBpeGVsRm9ybWF0Q29udmVy
c2lvbiBwaXhlbEZvcm1hdENvbnZlcnNpb24+CitzdGF0aWMgaW5saW5lIHZvaWQgY29udmVydFNp
bmdsZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkKGNvbnN0IHVpbnQ4X3QqIHNv
dXJjZVBpeGVsLCB1aW50OF90KiBkZXN0aW5hdGlvblBpeGVsKQoreworICAgIHVpbnQ4X3QgYWxw
aGEgPSBzb3VyY2VQaXhlbFszXTsKKyAgICBpZiAoIWFscGhhIHx8IGFscGhhID09IDI1NSkgewor
ICAgICAgICBjb252ZXJ0U2luZ2xlUGl4ZWxQcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkPHBp
eGVsRm9ybWF0Q29udmVyc2lvbj4oc291cmNlUGl4ZWwsIGRlc3RpbmF0aW9uUGl4ZWwpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgY29uc3RleHByIChwaXhlbEZvcm1hdENvbnZl
cnNpb24gPT0gUGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpOb25lKSB7CisgICAgICAgIGRlc3RpbmF0
aW9uUGl4ZWxbMF0gPSAoc291cmNlUGl4ZWxbMF0gKiBhbHBoYSArIDI1NCkgLyAyNTU7CisgICAg
ICAgIGRlc3RpbmF0aW9uUGl4ZWxbMV0gPSAoc291cmNlUGl4ZWxbMV0gKiBhbHBoYSArIDI1NCkg
LyAyNTU7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0gPSAoc291cmNlUGl4ZWxbMl0gKiBh
bHBoYSArIDI1NCkgLyAyNTU7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbM10gPSBhbHBoYTsK
KyAgICB9IGVsc2UgeworICAgICAgICAvLyBTd2FwIHBpeGVsIGNoYW5uZWxzIEJHUkEgPC0+IFJH
QkEuCisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSAoc291cmNlUGl4ZWxbMl0gKiBhbHBo
YSArIDI1NCkgLyAyNTU7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMV0gPSAoc291cmNlUGl4
ZWxbMV0gKiBhbHBoYSArIDI1NCkgLyAyNTU7CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMl0g
PSAoc291cmNlUGl4ZWxbMF0gKiBhbHBoYSArIDI1NCkgLyAyNTU7CisgICAgICAgIGRlc3RpbmF0
aW9uUGl4ZWxbM10gPSBhbHBoYTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPFBpeGVsRm9ybWF0Q29u
dmVyc2lvbiBwaXhlbEZvcm1hdENvbnZlcnNpb24+CitzdGF0aWMgaW5saW5lIHZvaWQgY29udmVy
dFNpbmdsZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9VbnByZW11bHRpcGxpZWQoY29uc3QgdWludDhf
dCogc291cmNlUGl4ZWwsIHVpbnQ4X3QqIGRlc3RpbmF0aW9uUGl4ZWwpCit7CisgICAgaWYgY29u
c3RleHByIChwaXhlbEZvcm1hdENvbnZlcnNpb24gPT0gUGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpO
b25lKQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGVzdGluYXRpb25QaXhl
bClbMF0gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oc291cmNlUGl4ZWwpWzBd
OworICAgIGVsc2UgeworICAgICAgICAvLyBTd2FwIHBpeGVsIGNoYW5uZWxzIEJHUkEgPC0+IFJH
QkEuCisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxbMF0gPSBzb3VyY2VQaXhlbFsyXTsKKyAgICAg
ICAgZGVzdGluYXRpb25QaXhlbFsxXSA9IHNvdXJjZVBpeGVsWzFdOworICAgICAgICBkZXN0aW5h
dGlvblBpeGVsWzJdID0gc291cmNlUGl4ZWxbMF07CisgICAgICAgIGRlc3RpbmF0aW9uUGl4ZWxb
M10gPSBzb3VyY2VQaXhlbFszXTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHZvaWQgKCpjb252ZXJ0
RnVuY3RvcikoY29uc3QgdWludDhfdCosIHVpbnQ4X3QqKT4KK3N0YXRpYyBpbmxpbmUgdm9pZCBj
b252ZXJ0SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkKGNvbnN0IENvbnN0UGl4ZWxCdWZmZXJDb252
ZXJzaW9uVmlldyYgc291cmNlLCBjb25zdCBQaXhlbEJ1ZmZlckNvbnZlcnNpb25WaWV3JiBkZXN0
aW5hdGlvbiwgY29uc3QgSW50U2l6ZSYgZGVzdGluYXRpb25TaXplKQoreworICAgIGNvbnN0IHVp
bnQ4X3QqIHNvdXJjZVJvd3MgPSBzb3VyY2Uucm93czsKKyAgICB1aW50OF90KiBkZXN0aW5hdGlv
blJvd3MgPSBkZXN0aW5hdGlvbi5yb3dzOworCisgICAgc2l6ZV90IGJ5dGVzUGVyUm93ID0gZGVz
dGluYXRpb25TaXplLndpZHRoKCkgKiA0OworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgZGVzdGlu
YXRpb25TaXplLmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHgg
PCBieXRlc1BlclJvdzsgeCArPSA0KQorICAgICAgICAgICAgY29udmVydEZ1bmN0b3IoJnNvdXJj
ZVJvd3NbeF0sICZkZXN0aW5hdGlvblJvd3NbeF0pOworICAgICAgICBzb3VyY2VSb3dzICs9IHNv
dXJjZS5ieXRlc1BlclJvdzsKKyAgICAgICAgZGVzdGluYXRpb25Sb3dzICs9IGRlc3RpbmF0aW9u
LmJ5dGVzUGVyUm93OworICAgIH0KK30KKwordm9pZCBjb252ZXJ0SW1hZ2VQaXhlbHMoY29uc3Qg
Q29uc3RQaXhlbEJ1ZmZlckNvbnZlcnNpb25WaWV3JiBzb3VyY2UsIGNvbnN0IFBpeGVsQnVmZmVy
Q29udmVyc2lvblZpZXcmIGRlc3RpbmF0aW9uLCBjb25zdCBJbnRTaXplJiBkZXN0aW5hdGlvblNp
emUpCit7CisgICAgLy8gV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgY29udmVydGluZyBwaXhl
bCBkYXRhIHdpdGggbm9uLTgtYml0IGJ1ZmZlcnMuCisgICAgQVNTRVJUKHNvdXJjZS5waXhlbEZv
cm1hdCA9PSBQaXhlbEZvcm1hdDo6UkdCQTggfHwgc291cmNlLnBpeGVsRm9ybWF0ID09IFBpeGVs
Rm9ybWF0OjpCR1JBOCk7CisgICAgQVNTRVJUKGRlc3RpbmF0aW9uLnBpeGVsRm9ybWF0ID09IFBp
eGVsRm9ybWF0OjpSR0JBOCB8fCBkZXN0aW5hdGlvbi5waXhlbEZvcm1hdCA9PSBQaXhlbEZvcm1h
dDo6QkdSQTgpOworCisgICAgLy8gV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgY29udmVydGlu
ZyBwaXhlbCBkYXRhIGJldHdlZW4gZGlmZmVyZW50IGNvbG9yIHNwYWNlcy4KKyAgICBBU1NFUlQo
c291cmNlLmNvbG9yU3BhY2UgPT0gZGVzdGluYXRpb24uY29sb3JTcGFjZSk7CisKKyNpZiBVU0Uo
QUNDRUxFUkFURSkKKyAgICBpZiAoc291cmNlLmFscGhhRm9ybWF0ID09IGRlc3RpbmF0aW9uLmFs
cGhhRm9ybWF0ICYmIHNvdXJjZS5waXhlbEZvcm1hdCA9PSBkZXN0aW5hdGlvbi5waXhlbEZvcm1h
dCkgeworICAgICAgICAvLyBGSVhNRTogQ2FuIHRoZXMgYm90aCBqdXN0IHVzZSBwZXItcm93IG1l
bWNweT8KKyAgICAgICAgaWYgKHNvdXJjZS5hbHBoYUZvcm1hdCA9PSBBbHBoYVByZW11bHRpcGxp
Y2F0aW9uOjpQcmVtdWx0aXBsaWVkKQorICAgICAgICAgICAgY29udmVydEltYWdlUGl4ZWxzVW5h
Y2NlbGVyYXRlZDxjb252ZXJ0U2luZ2xlUGl4ZWxQcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVk
PFBpeGVsRm9ybWF0Q29udmVyc2lvbjo6Tm9uZT4+KHNvdXJjZSwgZGVzdGluYXRpb24sIGRlc3Rp
bmF0aW9uU2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbnZlcnRJbWFnZVBpeGVs
c1VuYWNjZWxlcmF0ZWQ8Y29udmVydFNpbmdsZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9VbnByZW11
bHRpcGxpZWQ8UGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpOb25lPj4oc291cmNlLCBkZXN0aW5hdGlv
biwgZGVzdGluYXRpb25TaXplKTsKKyAgICB9IGVsc2UKKyAgICAgICAgY29udmVydEltYWdlUGl4
ZWxzQWNjZWxlcmF0ZWQoc291cmNlLCBkZXN0aW5hdGlvbiwgZGVzdGluYXRpb25TaXplKTsKKyNl
bHNlCisgICAgaWYgKHNvdXJjZS5hbHBoYUZvcm1hdCA9PSBkZXN0aW5hdGlvbi5hbHBoYUZvcm1h
dCkgeworICAgICAgICBpZiAoc291cmNlLnBpeGVsRm9ybWF0ID09IGRlc3RpbmF0aW9uLnBpeGVs
Rm9ybWF0KSB7CisgICAgICAgICAgICBpZiAoc291cmNlLmFscGhhRm9ybWF0ID09IEFscGhhUHJl
bXVsdGlwbGljYXRpb246OlByZW11bHRpcGxpZWQpCisgICAgICAgICAgICAgICAgY29udmVydElt
YWdlUGl4ZWxzVW5hY2NlbGVyYXRlZDxjb252ZXJ0U2luZ2xlUGl4ZWxQcmVtdWx0aXBsaWVkVG9Q
cmVtdWx0aXBsaWVkPFBpeGVsRm9ybWF0Q29udmVyc2lvbjo6Tm9uZT4+KHNvdXJjZSwgZGVzdGlu
YXRpb24sIGRlc3RpbmF0aW9uU2l6ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgY29udmVydEltYWdlUGl4ZWxzVW5hY2NlbGVyYXRlZDxjb252ZXJ0U2luZ2xlUGl4ZWxVbnBy
ZW11bHRpcGxpZWRUb1VucHJlbXVsdGlwbGllZDxQaXhlbEZvcm1hdENvbnZlcnNpb246Ok5vbmU+
Pihzb3VyY2UsIGRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblNpemUpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmFscGhhRm9ybWF0ID09IEFscGhhUHJlbXVs
dGlwbGljYXRpb246OlVucHJlbXVsdGlwbGllZCkKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW1h
Z2VQaXhlbHNVbmFjY2VsZXJhdGVkPGNvbnZlcnRTaW5nbGVQaXhlbFByZW11bHRpcGxpZWRUb1By
ZW11bHRpcGxpZWQ8UGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpQZXJtdXRlPj4oc291cmNlLCBkZXN0
aW5hdGlvbiwgZGVzdGluYXRpb25TaXplKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICBjb252ZXJ0SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkPGNvbnZlcnRTaW5nbGVQaXhlbFVu
cHJlbXVsdGlwbGllZFRvVW5wcmVtdWx0aXBsaWVkPFBpeGVsRm9ybWF0Q29udmVyc2lvbjo6UGVy
bXV0ZT4+KHNvdXJjZSwgZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uU2l6ZSk7CisgICAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc291cmNlLnBpeGVsRm9ybWF0ID09IGRlc3RpbmF0
aW9uLnBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICBpZiAoc291cmNlLmFscGhhRm9ybWF0ID09
IEFscGhhUHJlbXVsdGlwbGljYXRpb246OlByZW11bHRpcGxpZWQpCisgICAgICAgICAgICAgICAg
Y29udmVydEltYWdlUGl4ZWxzVW5hY2NlbGVyYXRlZDxjb252ZXJ0U2luZ2xlUGl4ZWxQcmVtdWx0
aXBsaWVkVG9VbnByZW11bHRpcGxpZWQ8UGl4ZWxGb3JtYXRDb252ZXJzaW9uOjpOb25lPj4oc291
cmNlLCBkZXN0aW5hdGlvbiwgZGVzdGluYXRpb25TaXplKTsKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICBjb252ZXJ0SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkPGNvbnZlcnRTaW5n
bGVQaXhlbFVucHJlbXVsdGlwbGllZFRvUHJlbXVsdGlwbGllZDxQaXhlbEZvcm1hdENvbnZlcnNp
b246Ok5vbmU+Pihzb3VyY2UsIGRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblNpemUpOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmFscGhhRm9ybWF0ID09IEFs
cGhhUHJlbXVsdGlwbGljYXRpb246OlVucHJlbXVsdGlwbGllZCkKKyAgICAgICAgICAgICAgICBj
b252ZXJ0SW1hZ2VQaXhlbHNVbmFjY2VsZXJhdGVkPGNvbnZlcnRTaW5nbGVQaXhlbFByZW11bHRp
cGxpZWRUb1VucHJlbXVsdGlwbGllZDxQaXhlbEZvcm1hdENvbnZlcnNpb246OlBlcm11dGU+Pihz
b3VyY2UsIGRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblNpemUpOworICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgIGNvbnZlcnRJbWFnZVBpeGVsc1VuYWNjZWxlcmF0ZWQ8Y29udmVydFNp
bmdsZVBpeGVsVW5wcmVtdWx0aXBsaWVkVG9QcmVtdWx0aXBsaWVkPFBpeGVsRm9ybWF0Q29udmVy
c2lvbjo6UGVybXV0ZT4+KHNvdXJjZSwgZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uU2l6ZSk7Cisg
ICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGl4ZWxCdWZmZXJDb252ZXJzaW9uLmgJKG5v
bmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGl4ZWxCdWZm
ZXJDb252ZXJzaW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAyMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisg
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNwcmFnbWEgb25jZQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFNpemU7
CisKK2VudW0gY2xhc3MgQWxwaGFQcmVtdWx0aXBsaWNhdGlvbiA6IHVpbnQ4X3Q7CitlbnVtIGNs
YXNzIERlc3RpbmF0aW9uQ29sb3JTcGFjZSA6IHVpbnQ4X3Q7CitlbnVtIGNsYXNzIFBpeGVsRm9y
bWF0IDogdWludDhfdDsKKworc3RydWN0IFBpeGVsQnVmZmVyQ29udmVyc2lvblZpZXcgeworICAg
IEFscGhhUHJlbXVsdGlwbGljYXRpb24gYWxwaGFGb3JtYXQ7CisgICAgRGVzdGluYXRpb25Db2xv
clNwYWNlIGNvbG9yU3BhY2U7CisgICAgUGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQ7CisgICAgdW5z
aWduZWQgYnl0ZXNQZXJSb3c7CisgICAgdWludDhfdCogcm93czsKK307CisKK3N0cnVjdCBDb25z
dFBpeGVsQnVmZmVyQ29udmVyc2lvblZpZXcgeworICAgIEFscGhhUHJlbXVsdGlwbGljYXRpb24g
YWxwaGFGb3JtYXQ7CisgICAgRGVzdGluYXRpb25Db2xvclNwYWNlIGNvbG9yU3BhY2U7CisgICAg
UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQ7CisgICAgdW5zaWduZWQgYnl0ZXNQZXJSb3c7CisgICAg
Y29uc3QgdWludDhfdCogcm93czsKK307CisKK3ZvaWQgY29udmVydEltYWdlUGl4ZWxzKGNvbnN0
IENvbnN0UGl4ZWxCdWZmZXJDb252ZXJzaW9uVmlldyYgc291cmNlLCBjb25zdCBQaXhlbEJ1ZmZl
ckNvbnZlcnNpb25WaWV3JiBkZXN0aW5hdGlvbiwgY29uc3QgSW50U2l6ZSYpOworCit9CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckNHQmFja2Vu
ZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cv
SW1hZ2VCdWZmZXJDR0JhY2tlbmQuY3BwCShyZXZpc2lvbiAyNzczMTUpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckNHQmFja2VuZC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTM1LDEwICszNSw2IEBACiAjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5o
IgogI2luY2x1ZGUgIlBpeGVsQnVmZmVyLmgiCiAjaW5jbHVkZSAiUnVudGltZUFwcGxpY2F0aW9u
Q2hlY2tzLmgiCi0KLSNpZiBVU0UoQUNDRUxFUkFURSkKLSNpbmNsdWRlIDxBY2NlbGVyYXRlL0Fj
Y2VsZXJhdGUuaD4KLSNlbmRpZgogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3Mu
aD4KICNpbmNsdWRlIDxwYWwvc3BpL2NnL0NvcmVHcmFwaGljc1NQSS5oPgogCkBAIC0yNTAsNzMg
KzI0Niw2IEBAIHN0ZDo6dW5pcXVlX3B0cjxUaHJlYWRTYWZlSW1hZ2VCdWZmZXJGbHUKICAgICBy
ZXR1cm4gV1RGOjptYWtlVW5pcXVlPFRocmVhZFNhZmVJbWFnZUJ1ZmZlckZsdXNoZXJDRz4oY29u
dGV4dCgpLnBsYXRmb3JtQ29udGV4dCgpKTsKIH0KIAotI2lmIFVTRShBQ0NFTEVSQVRFKQotc3Rh
dGljIGlubGluZSB2SW1hZ2VfQnVmZmVyIG1ha2VWSW1hZ2VCdWZmZXIodW5zaWduZWQgYnl0ZXNQ
ZXJSb3csIHVpbnQ4X3QqIHJvd3MsIGNvbnN0IEludFNpemUmIHNpemUpCi17Ci0gICAgdkltYWdl
X0J1ZmZlciB2SW1hZ2VCdWZmZXI7Ci0KLSAgICB2SW1hZ2VCdWZmZXIuaGVpZ2h0ID0gc3RhdGlj
X2Nhc3Q8dkltYWdlUGl4ZWxDb3VudD4oc2l6ZS5oZWlnaHQoKSk7Ci0gICAgdkltYWdlQnVmZmVy
LndpZHRoID0gc3RhdGljX2Nhc3Q8dkltYWdlUGl4ZWxDb3VudD4oc2l6ZS53aWR0aCgpKTsKLSAg
ICB2SW1hZ2VCdWZmZXIucm93Qnl0ZXMgPSBieXRlc1BlclJvdzsKLSAgICB2SW1hZ2VCdWZmZXIu
ZGF0YSA9IHJvd3M7Ci0gICAgcmV0dXJuIHZJbWFnZUJ1ZmZlcjsKLX0KLQotc3RhdGljIGlubGlu
ZSB2b2lkIGNvcHlJbWFnZVBpeGVsc0FjY2VsZXJhdGVkKAotICAgIEFscGhhUHJlbXVsdGlwbGlj
YXRpb24gc3JjQWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0IHNyY1BpeGVsRm9ybWF0LCB2SW1hZ2Vf
QnVmZmVyJiBzcmMsCi0gICAgQWxwaGFQcmVtdWx0aXBsaWNhdGlvbiBkZXN0QWxwaGFGb3JtYXQs
IFBpeGVsRm9ybWF0IGRlc3RQaXhlbEZvcm1hdCwgdkltYWdlX0J1ZmZlciYgZGVzdCkKLXsKLSAg
ICBpZiAoc3JjQWxwaGFGb3JtYXQgPT0gZGVzdEFscGhhRm9ybWF0KSB7Ci0gICAgICAgIEFTU0VS
VChzcmNQaXhlbEZvcm1hdCAhPSBkZXN0UGl4ZWxGb3JtYXQpOwotICAgICAgICAvLyBUaGUgZGVz
dGluYXRpb24gYWxwaGEgZm9ybWF0IGNhbiBiZSB1bnByZW11bHRpcGxpZWQgaW4gdGhlCi0gICAg
ICAgIC8vIGNhc2Ugb2YgYW4gSW1hZ2VCaXRtYXAgY3JlYXRlZCBmcm9tIGFuIEltYWdlRGF0YSB3
aXRoCi0gICAgICAgIC8vIHByZW11bHRpcGx5QWxwaGE9PSJub25lIi4KLQotICAgICAgICAvLyBT
d2FwIHBpeGVsIGNoYW5uZWxzIEJHUkEgPC0+IFJHQkEuCi0gICAgICAgIGNvbnN0IHVpbnQ4X3Qg
bWFwWzRdID0geyAyLCAxLCAwLCAzIH07Ci0gICAgICAgIHZJbWFnZVBlcm11dGVDaGFubmVsc19B
UkdCODg4OCgmc3JjLCAmZGVzdCwgbWFwLCBrdkltYWdlTm9GbGFncyk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBpZiAoZGVzdEFscGhhRm9ybWF0ID09IEFscGhhUHJlbXVsdGlwbGlj
YXRpb246OlVucHJlbXVsdGlwbGllZCkgewotICAgICAgICBpZiAoc3JjUGl4ZWxGb3JtYXQgPT0g
UGl4ZWxGb3JtYXQ6OlJHQkE4KQotICAgICAgICAgICAgdkltYWdlVW5wcmVtdWx0aXBseURhdGFf
UkdCQTg4ODgoJnNyYywgJmRlc3QsIGt2SW1hZ2VOb0ZsYWdzKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgdkltYWdlVW5wcmVtdWx0aXBseURhdGFfQkdSQTg4ODgoJnNyYywgJmRlc3QsIGt2
SW1hZ2VOb0ZsYWdzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoc3JjUGl4ZWxGb3JtYXQg
PT0gUGl4ZWxGb3JtYXQ6OlJHQkE4KQotICAgICAgICAgICAgdkltYWdlUHJlbXVsdGlwbHlEYXRh
X1JHQkE4ODg4KCZzcmMsICZkZXN0LCBrdkltYWdlTm9GbGFncyk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIHZJbWFnZVByZW11bHRpcGx5RGF0YV9CR1JBODg4OCgmc3JjLCAmZGVzdCwga3ZJ
bWFnZU5vRmxhZ3MpOwotICAgIH0KLQotICAgIGlmIChzcmNQaXhlbEZvcm1hdCAhPSBkZXN0UGl4
ZWxGb3JtYXQpIHsKLSAgICAgICAgLy8gU3dhcCBwaXhlbCBjaGFubmVscyBCR1JBIDwtPiBSR0JB
LgotICAgICAgICBjb25zdCB1aW50OF90IG1hcFs0XSA9IHsgMiwgMSwgMCwgMyB9OwotICAgICAg
ICB2SW1hZ2VQZXJtdXRlQ2hhbm5lbHNfQVJHQjg4ODgoJmRlc3QsICZkZXN0LCBtYXAsIGt2SW1h
Z2VOb0ZsYWdzKTsKLSAgICB9Ci19Ci0KLXZvaWQgSW1hZ2VCdWZmZXJDR0JhY2tlbmQ6OmNvcHlJ
bWFnZVBpeGVscygKLSAgICBBbHBoYVByZW11bHRpcGxpY2F0aW9uIHNyY0FscGhhRm9ybWF0LCBQ
aXhlbEZvcm1hdCBzcmNQaXhlbEZvcm1hdCwgdW5zaWduZWQgc3JjQnl0ZXNQZXJSb3csIHVpbnQ4
X3QqIHNyY1Jvd3MsCi0gICAgQWxwaGFQcmVtdWx0aXBsaWNhdGlvbiBkZXN0QWxwaGFGb3JtYXQs
IFBpeGVsRm9ybWF0IGRlc3RQaXhlbEZvcm1hdCwgdW5zaWduZWQgZGVzdEJ5dGVzUGVyUm93LCB1
aW50OF90KiBkZXN0Um93cywgY29uc3QgSW50U2l6ZSYgc2l6ZSkgY29uc3QKLXsKLSAgICAvLyBX
ZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBnZXR0aW5nIG9yIHB1dHRpbmcgcGl4ZWwgZGF0YSB3
aXRoIGRlZXAgY29sb3IgYnVmZmVycy4KLSAgICBBU1NFUlQoc3JjUGl4ZWxGb3JtYXQgPT0gUGl4
ZWxGb3JtYXQ6OlJHQkE4IHx8IHNyY1BpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpCR1JBOCk7
Ci0gICAgQVNTRVJUKGRlc3RQaXhlbEZvcm1hdCA9PSBQaXhlbEZvcm1hdDo6UkdCQTggfHwgZGVz
dFBpeGVsRm9ybWF0ID09IFBpeGVsRm9ybWF0OjpCR1JBOCk7Ci0KLSAgICBpZiAoc3JjQWxwaGFG
b3JtYXQgPT0gZGVzdEFscGhhRm9ybWF0ICYmIHNyY1BpeGVsRm9ybWF0ID09IGRlc3RQaXhlbEZv
cm1hdCkgewotICAgICAgICBJbWFnZUJ1ZmZlckJhY2tlbmQ6OmNvcHlJbWFnZVBpeGVscyhzcmNB
bHBoYUZvcm1hdCwgc3JjUGl4ZWxGb3JtYXQsIHNyY0J5dGVzUGVyUm93LCBzcmNSb3dzLCBkZXN0
QWxwaGFGb3JtYXQsIGRlc3RQaXhlbEZvcm1hdCwgZGVzdEJ5dGVzUGVyUm93LCBkZXN0Um93cywg
c2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2SW1hZ2VfQnVmZmVyIHNyYyA9
IG1ha2VWSW1hZ2VCdWZmZXIoc3JjQnl0ZXNQZXJSb3csIHNyY1Jvd3MsIHNpemUpOwotICAgIHZJ
bWFnZV9CdWZmZXIgZGVzdCA9IG1ha2VWSW1hZ2VCdWZmZXIoZGVzdEJ5dGVzUGVyUm93LCBkZXN0
Um93cywgc2l6ZSk7Ci0KLSAgICBjb3B5SW1hZ2VQaXhlbHNBY2NlbGVyYXRlZChzcmNBbHBoYUZv
cm1hdCwgc3JjUGl4ZWxGb3JtYXQsIHNyYywgZGVzdEFscGhhRm9ybWF0LCBkZXN0UGl4ZWxGb3Jt
YXQsIGRlc3QpOwotfQotI2VuZGlmCi0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlm
IC8vIFVTRShDRykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0lt
YWdlQnVmZmVyQ0dCYWNrZW5kLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDR0JhY2tlbmQuaAkocmV2aXNpb24gMjc3MzE1KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDR0JhY2tl
bmQuaAkod29ya2luZyBjb3B5KQpAQCAtNTQsMTIgKzU0LDYgQEAgcHJvdGVjdGVkOgogICAgIHN0
YXRpYyBSZXRhaW5QdHI8Q0dDb2xvclNwYWNlUmVmPiBjb250ZXh0Q29sb3JTcGFjZShjb25zdCBH
cmFwaGljc0NvbnRleHQmKTsKICAgICB2b2lkIHNldHVwQ29udGV4dCgpIGNvbnN0OwogICAgIHZp
cnR1YWwgUmV0YWluUHRyPENGRGF0YVJlZj4gdG9DRkRhdGEoY29uc3QgU3RyaW5nJiBtaW1lVHlw
ZSwgT3B0aW9uYWw8ZG91YmxlPiBxdWFsaXR5LCBQcmVzZXJ2ZVJlc29sdXRpb24pIGNvbnN0Owot
Ci0jaWYgVVNFKEFDQ0VMRVJBVEUpCi0gICAgdm9pZCBjb3B5SW1hZ2VQaXhlbHMoCi0gICAgICAg
IEFscGhhUHJlbXVsdGlwbGljYXRpb24gc3JjQWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0IHNyY1Bp
eGVsRm9ybWF0LCB1bnNpZ25lZCBzcmNCeXRlc1BlclJvdywgdWludDhfdCogc3JjUm93cywKLSAg
ICAgICAgQWxwaGFQcmVtdWx0aXBsaWNhdGlvbiBkZXN0QWxwaGFGb3JtYXQsIFBpeGVsRm9ybWF0
IGRlc3RQaXhlbEZvcm1hdCwgdW5zaWduZWQgZGVzdEJ5dGVzUGVyUm93LCB1aW50OF90KiBkZXN0
Um93cywgY29uc3QgSW50U2l6ZSYpIGNvbnN0IG92ZXJyaWRlOwotI2VuZGlmCiB9OwogCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9maWx0ZXJzL0ZpbHRlckVmZmVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GaWx0ZXJFZmZlY3QuY3BwCShyZXZpc2lvbiAyNzcz
MTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZpbHRlckVm
ZmVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUwNSw3ICs1MDUsNyBAQCB2b2lkIEZpbHRlckVm
ZmVjdDo6Y29weVVubXVsdGlwbGllZFJlc3VsCiAgICAgICAgICAgICBJbnRTaXplIGlucHV0U2l6
ZShtX2Fic29sdXRlUGFpbnRSZWN0LnNpemUoKSk7CiAgICAgICAgICAgICBBU1NFUlQoIUltYWdl
QnVmZmVyOjpzaXplTmVlZHNDbGFtcGluZyhpbnB1dFNpemUpKTsKICAgICAgICAgICAgIGlucHV0
U2l6ZS5zY2FsZShtX2ZpbHRlci5maWx0ZXJTY2FsZSgpKTsKLSAgICAgICAgICAgIG1fdW5tdWx0
aXBsaWVkSW1hZ2VSZXN1bHQgPSBQaXhlbEJ1ZmZlcjo6dHJ5Q3JlYXRlKERlc3RpbmF0aW9uQ29s
b3JTcGFjZTo6U1JHQiwgUGl4ZWxGb3JtYXQ6OkJHUkE4LCBpbnB1dFNpemUpOworICAgICAgICAg
ICAgbV91bm11bHRpcGxpZWRJbWFnZVJlc3VsdCA9IFBpeGVsQnVmZmVyOjp0cnlDcmVhdGUoRGVz
dGluYXRpb25Db2xvclNwYWNlOjpTUkdCLCBQaXhlbEZvcm1hdDo6UkdCQTgsIGlucHV0U2l6ZSk7
CiAgICAgICAgICAgICBpZiAoIW1fdW5tdWx0aXBsaWVkSW1hZ2VSZXN1bHQpCiAgICAgICAgICAg
ICAgICAgcmV0dXJuOwogICAgICAgICAgICAgY29weVVucHJlbXVsdGlwbHlpbmdBbHBoYShtX3By
ZW11bHRpcGxpZWRJbWFnZVJlc3VsdC0+ZGF0YSgpLCBtX3VubXVsdGlwbGllZEltYWdlUmVzdWx0
LT5kYXRhKCksIGlucHV0U2l6ZSk7CkBAIC01MzgsNyArNTM4LDcgQEAgdm9pZCBGaWx0ZXJFZmZl
Y3Q6OmNvcHlQcmVtdWx0aXBsaWVkUmVzdQogICAgICAgICAgICAgSW50U2l6ZSBpbnB1dFNpemUo
bV9hYnNvbHV0ZVBhaW50UmVjdC5zaXplKCkpOwogICAgICAgICAgICAgQVNTRVJUKCFJbWFnZUJ1
ZmZlcjo6c2l6ZU5lZWRzQ2xhbXBpbmcoaW5wdXRTaXplKSk7CiAgICAgICAgICAgICBpbnB1dFNp
emUuc2NhbGUobV9maWx0ZXIuZmlsdGVyU2NhbGUoKSk7Ci0gICAgICAgICAgICBtX3ByZW11bHRp
cGxpZWRJbWFnZVJlc3VsdCA9IFBpeGVsQnVmZmVyOjp0cnlDcmVhdGUoRGVzdGluYXRpb25Db2xv
clNwYWNlOjpTUkdCLCBQaXhlbEZvcm1hdDo6QkdSQTgsIGlucHV0U2l6ZSk7CisgICAgICAgICAg
ICBtX3ByZW11bHRpcGxpZWRJbWFnZVJlc3VsdCA9IFBpeGVsQnVmZmVyOjp0cnlDcmVhdGUoRGVz
dGluYXRpb25Db2xvclNwYWNlOjpTUkdCLCBQaXhlbEZvcm1hdDo6UkdCQTgsIGlucHV0U2l6ZSk7
CiAgICAgICAgICAgICBpZiAoIW1fcHJlbXVsdGlwbGllZEltYWdlUmVzdWx0KQogICAgICAgICAg
ICAgICAgIHJldHVybjsKICAgICAgICAgICAgIGNvcHlQcmVtdWx0aXBseWluZ0FscGhhKG1fdW5t
dWx0aXBsaWVkSW1hZ2VSZXN1bHQtPmRhdGEoKSwgbV9wcmVtdWx0aXBsaWVkSW1hZ2VSZXN1bHQt
PmRhdGEoKSwgaW5wdXRTaXplKTsKQEAgLTU4MCw3ICs1ODAsNyBAQCBPcHRpb25hbDxQaXhlbEJ1
ZmZlcj4mIEZpbHRlckVmZmVjdDo6Y3JlCiAgICAgSW50U2l6ZSByZXN1bHRTaXplKG1fYWJzb2x1
dGVQYWludFJlY3Quc2l6ZSgpKTsKICAgICBBU1NFUlQoIUltYWdlQnVmZmVyOjpzaXplTmVlZHND
bGFtcGluZyhyZXN1bHRTaXplKSk7CiAgICAgcmVzdWx0U2l6ZS5zY2FsZShtX2ZpbHRlci5maWx0
ZXJTY2FsZSgpKTsKLSAgICBtX3VubXVsdGlwbGllZEltYWdlUmVzdWx0ID0gUGl4ZWxCdWZmZXI6
OnRyeUNyZWF0ZShEZXN0aW5hdGlvbkNvbG9yU3BhY2U6OlNSR0IsIFBpeGVsRm9ybWF0OjpCR1JB
OCwgcmVzdWx0U2l6ZSk7CisgICAgbV91bm11bHRpcGxpZWRJbWFnZVJlc3VsdCA9IFBpeGVsQnVm
ZmVyOjp0cnlDcmVhdGUoRGVzdGluYXRpb25Db2xvclNwYWNlOjpTUkdCLCBQaXhlbEZvcm1hdDo6
UkdCQTgsIHJlc3VsdFNpemUpOwogICAgIHJldHVybiBtX3VubXVsdGlwbGllZEltYWdlUmVzdWx0
OwogfQogCkBAIC01OTgsNyArNTk4LDcgQEAgT3B0aW9uYWw8UGl4ZWxCdWZmZXI+JiBGaWx0ZXJF
ZmZlY3Q6OmNyZQogICAgIEludFNpemUgcmVzdWx0U2l6ZShtX2Fic29sdXRlUGFpbnRSZWN0LnNp
emUoKSk7CiAgICAgQVNTRVJUKCFJbWFnZUJ1ZmZlcjo6c2l6ZU5lZWRzQ2xhbXBpbmcocmVzdWx0
U2l6ZSkpOwogICAgIHJlc3VsdFNpemUuc2NhbGUobV9maWx0ZXIuZmlsdGVyU2NhbGUoKSk7Ci0g
ICAgbV9wcmVtdWx0aXBsaWVkSW1hZ2VSZXN1bHQgPSBQaXhlbEJ1ZmZlcjo6dHJ5Q3JlYXRlKERl
c3RpbmF0aW9uQ29sb3JTcGFjZTo6U1JHQiwgUGl4ZWxGb3JtYXQ6OkJHUkE4LCByZXN1bHRTaXpl
KTsKKyAgICBtX3ByZW11bHRpcGxpZWRJbWFnZVJlc3VsdCA9IFBpeGVsQnVmZmVyOjp0cnlDcmVh
dGUoRGVzdGluYXRpb25Db2xvclNwYWNlOjpTUkdCLCBQaXhlbEZvcm1hdDo6UkdCQTgsIHJlc3Vs
dFNpemUpOwogICAgIHJldHVybiBtX3ByZW11bHRpcGxpZWRJbWFnZVJlc3VsdDsKIH0KIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>