<?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>217685</bug_id>
          
          <creation_ts>2020-10-13 17:07:10 -0700</creation_ts>
          <short_desc>Cache JS arguments in AudioWorkletProcessor::process() for performance</short_desc>
          <delta_ts>2020-10-15 16:42:26 -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>Web Audio</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>
          
          <blocked>217058</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Dumez">cdumez</reporter>
          <assigned_to name="Chris Dumez">cdumez</assigned_to>
          <cc>cdumez</cc>
    
    <cc>darin</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>ggaren</cc>
    
    <cc>glenn</cc>
    
    <cc>jer.noble</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>philipj</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
    
    <cc>sergio</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1697510</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 17:07:10 -0700</bug_when>
    <thetext>Cache JS arguments in AudioWorkletProcessor::process() for performance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697523</commentid>
    <comment_count>1</comment_count>
      <attachid>411282</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 17:19:18 -0700</bug_when>
    <thetext>Created attachment 411282
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697554</commentid>
    <comment_count>2</comment_count>
      <attachid>411286</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 17:44:25 -0700</bug_when>
    <thetext>Created attachment 411286
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697568</commentid>
    <comment_count>3</comment_count>
      <attachid>411286</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-10-13 18:01:07 -0700</bug_when>
    <thetext>Comment on attachment 411286
Patch

I don’t understand why all these jsCast are safe. What guarantees the objects have the correct type?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697569</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 18:04:30 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #3)
&gt; Comment on attachment 411286 [details]
&gt; Patch
&gt; 
&gt; I don’t understand why all these jsCast are safe. What guarantees the
&gt; objects have the correct type?

We construct those arrays ourselves and freeze before passing them to JavaScript. Since those are frozen arrays, the JS cannot modify them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697571</commentid>
    <comment_count>5</comment_count>
      <attachid>411286</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-10-13 18:11:29 -0700</bug_when>
    <thetext>Comment on attachment 411286
Patch

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

&gt; Source/WebCore/ChangeLog:8
&gt; +        Cache JS arguments in AudioWorkletProcessor::process() for performance.

Got any numbers?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697596</commentid>
    <comment_count>6</comment_count>
      <attachid>411286</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2020-10-13 20:18:18 -0700</bug_when>
    <thetext>Comment on attachment 411286
Patch

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

&gt; Source/WebCore/Modules/webaudio/AudioWorkletProcessor.h:73
&gt; +    JSC::Strong&lt;JSC::JSArray&gt; m_jsInputs;
&gt; +    JSC::Strong&lt;JSC::JSArray&gt; m_jsOutputs;
&gt; +    JSC::Strong&lt;JSC::JSObject&gt; m_jsParamValues;

Is the AudioWorkletProcessor in scope in JavaScript somewhere in the worklet? If so, I believe that &quot;Array.prototype.customProperty = audioWorkletProcessor&quot; would be a retain cycle.

Since this is just a cache, one alternative is to use JSC::Weak.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697598</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 20:36:05 -0700</bug_when>
    <thetext>(In reply to Geoffrey Garen from comment #6)
&gt; Comment on attachment 411286 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=411286&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/AudioWorkletProcessor.h:73
&gt; &gt; +    JSC::Strong&lt;JSC::JSArray&gt; m_jsInputs;
&gt; &gt; +    JSC::Strong&lt;JSC::JSArray&gt; m_jsOutputs;
&gt; &gt; +    JSC::Strong&lt;JSC::JSObject&gt; m_jsParamValues;
&gt; 
&gt; Is the AudioWorkletProcessor in scope in JavaScript somewhere in the
&gt; worklet? If so, I believe that &quot;Array.prototype.customProperty =
&gt; audioWorkletProcessor&quot; would be a retain cycle.

Yes, the processor is an object in JS. This is actually the process we call the process() function on in JS. I had thought about this potential leak issue but thought it could not happen because the arrays are frozen. I had not thought about setting a property on the prototype.

&gt; Since this is just a cache, one alternative is to use JSC::Weak.

I did not use Weak because I don’t think it would work. What keeps the JS arrays alive if they are weak? There are constructed in c++ side and only passed in argument to the JS process() function. It is not expected or even common that the JS side will hold on to these arrays in between process() function calls. Do I need some kind of visitor maybe?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697599</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 20:39:01 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #5)
&gt; Comment on attachment 411286 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=411286&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:8
&gt; &gt; +        Cache JS arguments in AudioWorkletProcessor::process() for performance.
&gt; 
&gt; Got any numbers?

I checked that the cache is used most of the time since the topology rarely changes. As such, this avoids a lot of JS object allocations (since the process() function is called super frequently to process audio). Besides avoiding bad peaks of memory usage, this also means less GC. 

I don’t have actual CPU time numbers yet. I can probably get some tomorrow. I was personally satisfied with avoiding some many JS object allocations in the common case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697600</commentid>
    <comment_count>9</comment_count>
      <attachid>411286</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-10-13 20:49:09 -0700</bug_when>
    <thetext>Comment on attachment 411286
Patch

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

&gt;&gt;&gt; Source/WebCore/Modules/webaudio/AudioWorkletProcessor.h:73
&gt;&gt;&gt; +    JSC::Strong&lt;JSC::JSObject&gt; m_jsParamValues;
&gt;&gt; 
&gt;&gt; Is the AudioWorkletProcessor in scope in JavaScript somewhere in the worklet? If so, I believe that &quot;Array.prototype.customProperty = audioWorkletProcessor&quot; would be a retain cycle.
&gt;&gt; 
&gt;&gt; Since this is just a cache, one alternative is to use JSC::Weak.
&gt; 
&gt; Yes, the processor is an object in JS. This is actually the process we call the process() function on in JS. I had thought about this potential leak issue but thought it could not happen because the arrays are frozen. I had not thought about setting a property on the prototype.

It is possible that this causes leaks even if this is frozen. For example,

let map = new WeakMap;
map.set(frozenArray, wrapperOfAudioWorkletProcessor);

then, cyclic reference is created.
I recommend using JSC::Weak, or JSValueInWrappedObject.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697601</commentid>
    <comment_count>10</comment_count>
      <attachid>411286</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 20:51:10 -0700</bug_when>
    <thetext>Comment on attachment 411286
Patch

Ok. I will look into using JSValueInWrappedObject tomorrow. I see that it has a visit() function, I guess this is what I need to do to keep those arrays alive.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697603</commentid>
    <comment_count>11</comment_count>
      <attachid>411297</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 21:18:37 -0700</bug_when>
    <thetext>Created attachment 411297
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697604</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-13 21:19:30 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #10)
&gt; Comment on attachment 411286 [details]
&gt; Patch
&gt; 
&gt; Ok. I will look into using JSValueInWrappedObject tomorrow. I see that it
&gt; has a visit() function, I guess this is what I need to do to keep those
&gt; arrays alive.

JSValueInWrappedObject is great, was super easy to use. I used to know about this class and then forgot about it. The latest patch iteration uses it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697721</commentid>
    <comment_count>13</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-14 08:33:56 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #8)
&gt; (In reply to Sam Weinig from comment #5)
&gt; &gt; Comment on attachment 411286 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=411286&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/ChangeLog:8
&gt; &gt; &gt; +        Cache JS arguments in AudioWorkletProcessor::process() for performance.
&gt; &gt; 
&gt; &gt; Got any numbers?
&gt; 
&gt; I checked that the cache is used most of the time since the topology rarely
&gt; changes. As such, this avoids a lot of JS object allocations (since the
&gt; process() function is called super frequently to process audio). Besides
&gt; avoiding bad peaks of memory usage, this also means less GC. 
&gt; 
&gt; I don’t have actual CPU time numbers yet. I can probably get some tomorrow.
&gt; I was personally satisfied with avoiding some many JS object allocations in
&gt; the common case.

I tweaked imported/w3c/web-platform-tests/webaudio/the-audio-api/the-audioworklet-interface/simple-input-output.https.html to turn it into a perf test. I basically made the buffer very large and checked how long it takes to process the buffer. Note that the test has a fairly simple but common topology.

Without optimization: ~23 seconds
With optimization: ~15 seconds</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1697797</commentid>
    <comment_count>14</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-10-14 11:27:26 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #12)
&gt; JSValueInWrappedObject is great, was super easy to use. I used to know about
&gt; this class and then forgot about it. The latest patch iteration uses it.

One small editorial comment: When I originally added JSValueInWrappedObject, I also came up with a testing technique for verifying that reference cycles were not keeping objects alive. I suggest we add tests like that for these references.

Let me know if you need a pointer to those tests so you can see the techniques they use.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1698225</commentid>
    <comment_count>15</comment_count>
      <attachid>411297</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-15 12:33:04 -0700</bug_when>
    <thetext>Comment on attachment 411297
Patch

Ping review? I think the performance results are pretty compelling and I have stopped using JSC::Strong.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1698362</commentid>
    <comment_count>16</comment_count>
      <attachid>411297</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2020-10-15 16:38:51 -0700</bug_when>
    <thetext>Comment on attachment 411297
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1698363</commentid>
    <comment_count>17</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-10-15 16:41:57 -0700</bug_when>
    <thetext>Committed r268560: &lt;https://trac.webkit.org/changeset/268560&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 411297.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1698364</commentid>
    <comment_count>18</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-10-15 16:42:26 -0700</bug_when>
    <thetext>&lt;rdar://problem/70357674&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>411282</attachid>
            <date>2020-10-13 17:19:18 -0700</date>
            <delta_ts>2020-10-13 17:52:03 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-217685-20201013171917.patch</filename>
            <type>text/plain</type>
            <size>11690</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjY4NDI0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYjc1ODFmOTBmNGI0Mzhj
YjliYTA4NTc1YTE5ZWQ5MjI5Y2NiZjllMi4uOWI5YWZjNGU0MGRmOWFlYzRlNzMxOTA0Y2MyOTk5
NzQzYzA4NGFiMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5IEBACisyMDIwLTEwLTEzICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgQ2FjaGUgSlMgYXJndW1lbnRz
IGluIEF1ZGlvV29ya2xldFByb2Nlc3Nvcjo6cHJvY2VzcygpIGZvciBwZXJmb3JtYW5jZQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE3Njg1CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2FjaGUgSlMgYXJn
dW1lbnRzIGluIEF1ZGlvV29ya2xldFByb2Nlc3Nvcjo6cHJvY2VzcygpIGZvciBwZXJmb3JtYW5j
ZS4KKyAgICAgICAgQmxpbmsgaGFzIHRoZSBzYW1lIG9wdGltaXphdGlvbiBoZXJlOgorICAgICAg
ICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJvbWl1bS9jaHJvbWl1bS9ibG9iL21hc3Rlci90aGly
ZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3dlYmF1ZGlvL2F1ZGlvX3dvcmtsZXRfcHJv
Y2Vzc29yLmNjCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBubyBXZWItZmFjaW5nIGJlaGF2aW9y
IGNoYW5nZS4KKworICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vQXVkaW9Xb3JrbGV0UHJvY2Vz
c29yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmJ1c0NoYW5uZWxDb3VudCk6CisgICAgICAgIChX
ZWJDb3JlOjpjb25zdHJ1Y3RGcm96ZW5KU0FycmF5KToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlE
YXRhRnJvbUpTQXJyYXlUb0J1c2VzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlEYXRhRnJvbUJ1
c2VzVG9KU0FycmF5KToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlEYXRhRnJvbVBhcmFtZXRlck1h
cFRvSlNPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6YnVzVG9wb2xvZ3lNYXRjaGVzSlNBcnJh
eSk6CisgICAgICAgIChXZWJDb3JlOjpwYXJhbWV0ZXJNYXBUb3BvbG9neU1hdGNoZXNKU09iamVj
dCk6CisgICAgICAgIChXZWJDb3JlOjp6ZXJvSlNBcnJheSk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb1dvcmtsZXRQcm9jZXNzb3I6OmJ1aWxkSlNBcmd1bWVudHMpOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9Xb3JrbGV0UHJvY2Vzc29yOjpwcm9jZXNzKToKKyAgICAgICAgKiBNb2R1bGVzL3dl
YmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5oOgorCiAyMDIwLTEwLTEzICBDaHJpcyBEdW1l
eiAgPGNkdW1lekBhcHBsZS5jb20+CiAKICAgICAgICAgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRv
IGNyZWF0ZSBhbiBBdWRpb1dvcmtsZXROb2RlIGZvciBhIGNvbnRleHQgdGhhdCBoYXMgZmluaXNo
ZWQgcmVuZGVyaW5nCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlv
L0F1ZGlvV29ya2xldFByb2Nlc3Nvci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1
ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5jcHAKaW5kZXggYTIyMzE1MTJiYjFhZDg1NjlkMDIw
MTJlZjAyODIyZGM3NWZlMWZhNC4uZjQ5NWE3MWZlMWI0OTE4MjA0NThmYmI4NjcyNjkzNDkxM2Yz
MzJlNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb1dv
cmtsZXRQcm9jZXNzb3IuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8v
QXVkaW9Xb3JrbGV0UHJvY2Vzc29yLmNwcApAQCAtNDUsNiArNDUsMTYgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSlNDOwogCitzdGF0aWMgdW5zaWduZWQgYnVzQ2hh
bm5lbENvdW50KGNvbnN0IEF1ZGlvQnVzJiBidXMpCit7CisgICAgcmV0dXJuIGJ1cy5udW1iZXJP
ZkNoYW5uZWxzKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBidXNDaGFubmVsQ291bnQoY29uc3Qg
QXVkaW9CdXMqIGJ1cykKK3sKKyAgICByZXR1cm4gYnVzID8gYnVzQ2hhbm5lbENvdW50KCpidXMp
IDogMDsKK30KKwogc3RhdGljIEpTRmxvYXQzMkFycmF5KiBjb25zdHJ1Y3RKU0Zsb2F0MzJBcnJh
eShKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCB1bnNpZ25lZCBsZW5ndGgsIGNvbnN0IGZs
b2F0KiBkYXRhID0gbnVsbHB0cikKIHsKICAgICBhdXRvKiBqc0FycmF5ID0gSlNGbG9hdDMyQXJy
YXk6OmNyZWF0ZSgmZ2xvYmFsT2JqZWN0LCBnbG9iYWxPYmplY3QudHlwZWRBcnJheVN0cnVjdHVy
ZShUeXBlRmxvYXQzMiksIGxlbmd0aCk7CkBAIC03Miw3ICs4Miw3IEBAIHN0YXRpYyBKU09iamVj
dCogY29uc3RydWN0RnJvemVuS2V5VmFsdWVPYmplY3QoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCYg
Z2xvYmFsT2JqCiBlbnVtIGNsYXNzIFNob3VsZFBvcHVsYXRlV2l0aEJ1c0RhdGEgOiBib29sIHsg
Tm8sIFllcyB9Owogc3RhdGljIEpTQXJyYXkqIGNvbnN0cnVjdEZyb3plbkpTQXJyYXkoVk0mIHZt
LCBKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBKU0M6OlRocm93U2NvcGUmIHNjb3BlLCBB
dWRpb0J1cyogYnVzLCBTaG91bGRQb3B1bGF0ZVdpdGhCdXNEYXRhIHNob3VsZFBvcHVsYXRlV2l0
aEJ1c0RhdGEpCiB7Ci0gICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IGJ1cyA/IGJ1cy0+
bnVtYmVyT2ZDaGFubmVscygpIDogMDsKKyAgICB1bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzID0g
YnVzQ2hhbm5lbENvdW50KGJ1cyk7CiAgICAgYXV0byogY2hhbm5lbHNEYXRhID0gSlNBcnJheTo6
Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3Qub3JpZ2luYWxBcnJheVN0cnVjdHVyZUZvckluZGV4aW5n
VHlwZShBcnJheVdpdGhDb250aWd1b3VzKSwgbnVtYmVyT2ZDaGFubmVscyk7CiAgICAgZm9yICh1
bnNpZ25lZCBqID0gMDsgaiA8IG51bWJlck9mQ2hhbm5lbHM7ICsraikgewogICAgICAgICBhdXRv
KiBjaGFubmVsID0gYnVzLT5jaGFubmVsKGopOwpAQCAtOTUsNyArMTA1LDcgQEAgc3RhdGljIEpT
QXJyYXkqIGNvbnN0cnVjdEZyb3plbkpTQXJyYXkoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCYgZ2xv
YmFsT2JqZWN0LCBjb24KICAgICByZXR1cm4gYXJyYXk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlE
YXRhRnJvbUpTQXJyYXlUb0J1c2VzKEpTR2xvYmFsT2JqZWN0JiBnbG9iYWxPYmplY3QsIEpTQXJy
YXkmIGpzQXJyYXksIFZlY3RvcjxSZWY8QXVkaW9CdXM+PiYgYnVzZXMpCitzdGF0aWMgdm9pZCBj
b3B5RGF0YUZyb21KU0FycmF5VG9CdXNlcyhKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBj
b25zdCBKU0FycmF5JiBqc0FycmF5LCBWZWN0b3I8UmVmPEF1ZGlvQnVzPj4mIGJ1c2VzKQogewog
ICAgIC8vIFdlIGNhbiBzYWZlbHkgbWFrZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgc3RydWN0dXJl
IG9mIHRoZSBKU0FycmF5IHNpbmNlIHdlIHVzZSBmcm96ZW4gYXJyYXlzLgogICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBidXNlcy5zaXplKCk7ICsraSkgewpAQCAtMTEyLDYgKzEyMiw4MiBA
QCBzdGF0aWMgdm9pZCBjb3B5RGF0YUZyb21KU0FycmF5VG9CdXNlcyhKU0dsb2JhbE9iamVjdCYg
Z2xvYmFsT2JqZWN0LCBKU0FycmF5JiBqcwogICAgIH0KIH0KIAorc3RhdGljIHZvaWQgY29weURh
dGFGcm9tQnVzZXNUb0pTQXJyYXkoSlNHbG9iYWxPYmplY3QmIGdsb2JhbE9iamVjdCwgY29uc3Qg
VmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+JiBidXNlcywgSlNBcnJheSYganNBcnJheSkKK3sKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYnVzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAg
YXV0byYgYnVzID0gYnVzZXNbaV07CisgICAgICAgIGF1dG8qIGNoYW5uZWxzQXJyYXkgPSBqc0Nh
c3Q8SlNBcnJheSo+KGpzQXJyYXkuZ2V0SW5kZXgoJmdsb2JhbE9iamVjdCwgaSkpOworICAgICAg
ICBhdXRvIG51bWJlck9mQ2hhbm5lbHMgPSBidXNDaGFubmVsQ291bnQoYnVzLmdldCgpKTsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IG51bWJlck9mQ2hhbm5lbHM7ICsraikgewor
ICAgICAgICAgICAgYXV0byogY2hhbm5lbCA9IGJ1cy0+Y2hhbm5lbChqKTsKKyAgICAgICAgICAg
IGF1dG8qIGpzQ2hhbm5lbERhdGEgPSBqc0Nhc3Q8SlNGbG9hdDMyQXJyYXkqPihjaGFubmVsc0Fy
cmF5LT5nZXRJbmRleCgmZ2xvYmFsT2JqZWN0LCBqKSk7CisgICAgICAgICAgICBBU1NFUlQoanND
aGFubmVsRGF0YS0+bGVuZ3RoKCkgPT0gY2hhbm5lbC0+bGVuZ3RoKCkpOworICAgICAgICAgICAg
bWVtY3B5KGpzQ2hhbm5lbERhdGEtPnR5cGVkVmVjdG9yKCksIGNoYW5uZWwtPm11dGFibGVEYXRh
KCksIHNpemVvZihmbG9hdCkgKiBjaGFubmVsLT5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICB9
Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlEYXRhRnJvbVBhcmFtZXRlck1hcFRvSlNPYmplY3QoVk0m
IHZtLCBKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBjb25zdCBIYXNoTWFwPFN0cmluZywg
c3RkOjp1bmlxdWVfcHRyPEF1ZGlvRmxvYXRBcnJheT4+JiBwYXJhbVZhbHVlc01hcCwgSlNPYmpl
Y3QmIGpzT2JqZWN0KQoreworICAgIGZvciAoYXV0byYgcGFpciA6IHBhcmFtVmFsdWVzTWFwKSB7
CisgICAgICAgIGF1dG8qIGpzVHlwZWRBcnJheSA9IGpzQ2FzdDxKU0Zsb2F0MzJBcnJheSo+KGpz
T2JqZWN0LmdldCgmZ2xvYmFsT2JqZWN0LCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKHZtLCBwYWly
LmtleSkpKTsKKyAgICAgICAgQVNTRVJUKHBhaXIudmFsdWUtPnNpemUoKSA+PSBqc1R5cGVkQXJy
YXktPmxlbmd0aCgpKTsKKyAgICAgICAgbWVtY3B5KGpzVHlwZWRBcnJheS0+dHlwZWRWZWN0b3Io
KSwgcGFpci52YWx1ZS0+ZGF0YSgpLCBzaXplb2YoZmxvYXQpICoganNUeXBlZEFycmF5LT5sZW5n
dGgoKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIGJvb2wgYnVz
VG9wb2xvZ3lNYXRjaGVzSlNBcnJheShKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBjb25z
dCBWZWN0b3I8VD4mIGJ1c2VzLCBKU0FycmF5KiBqc0FycmF5KQoreworICAgIGlmICghanNBcnJh
eSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShqc0Fy
cmF5LT5sZW5ndGgoKSA9PSBidXNlcy5zaXplKCksICJOdW1iZXIgb2YgaW5wdXRzL291dHB1dHMg
Y2Fubm90IGNoYW5nZSBhZnRlciBjb25zdHJ1Y3Rpb24iKTsKKworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBidXNlcy5zaXplKCk7ICsraSkgeworICAgICAgICBhdXRvJiBidXMgPSBidXNl
c1tpXTsKKyAgICAgICAgYXV0byogY2hhbm5lbHNBcnJheSA9IGpzQ2FzdDxKU0FycmF5Kj4oanNB
cnJheS0+Z2V0SW5kZXgoJmdsb2JhbE9iamVjdCwgaSkpOworICAgICAgICB1bnNpZ25lZCBudW1i
ZXJPZkNoYW5uZWxzID0gYnVzQ2hhbm5lbENvdW50KGJ1cy5nZXQoKSk7CisgICAgICAgIGlmIChj
aGFubmVsc0FycmF5LT5sZW5ndGgoKSAhPSBudW1iZXJPZkNoYW5uZWxzKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBudW1iZXJP
ZkNoYW5uZWxzOyArK2opIHsKKyAgICAgICAgICAgIGF1dG8qIGNoYW5uZWwgPSBidXMtPmNoYW5u
ZWwoaik7CisgICAgICAgICAgICBhdXRvKiBqc0NoYW5uZWxEYXRhID0ganNDYXN0PEpTRmxvYXQz
MkFycmF5Kj4oY2hhbm5lbHNBcnJheS0+Z2V0SW5kZXgoJmdsb2JhbE9iamVjdCwgaikpOworICAg
ICAgICAgICAgaWYgKGpzQ2hhbm5lbERhdGEtPmxlbmd0aCgpICE9IGNoYW5uZWwtPmxlbmd0aCgp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBwYXJhbWV0ZXJNYXBUb3BvbG9neU1hdGNo
ZXNKU09iamVjdChWTSYgdm0sIEpTR2xvYmFsT2JqZWN0JiBnbG9iYWxPYmplY3QsIGNvbnN0IEhh
c2hNYXA8U3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9GbG9hdEFycmF5Pj4mIHBhcmFtVmFs
dWVzTWFwLCBKU09iamVjdCoganNPYmplY3QpCit7CisgICAgaWYgKCFqc09iamVjdCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChhdXRvJiBwYWlyIDogcGFyYW1WYWx1ZXNNYXAp
IHsKKyAgICAgICAgYXV0byoganNUeXBlZEFycmF5ID0ganNDYXN0PEpTRmxvYXQzMkFycmF5Kj4o
anNPYmplY3QtPmdldCgmZ2xvYmFsT2JqZWN0LCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKHZtLCBw
YWlyLmtleSkpKTsKKyAgICAgICAgdW5zaWduZWQgZXhwZWN0ZWRMZW5ndGggPSBwYWlyLnZhbHVl
LT5jb250YWluc0NvbnN0YW50VmFsdWUoKSA/IDEgOiBwYWlyLnZhbHVlLT5zaXplKCk7CisgICAg
ICAgIGlmIChqc1R5cGVkQXJyYXktPmxlbmd0aCgpICE9IGV4cGVjdGVkTGVuZ3RoKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0
aWMgdm9pZCB6ZXJvSlNBcnJheShKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBKU0FycmF5
JiBqc0FycmF5KQoreworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGJ1c0NvdW50ID0ganNBcnJh
eS5sZW5ndGgoKTsgaSA8IGJ1c0NvdW50OyArK2kpIHsKKyAgICAgICAgYXV0byogY2hhbm5lbHNB
cnJheSA9IGpzQ2FzdDxKU0FycmF5Kj4oanNBcnJheS5nZXRJbmRleCgmZ2xvYmFsT2JqZWN0LCBp
KSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxz
QXJyYXktPmxlbmd0aCgpOyBqIDwgY2hhbm5lbENvdW50OyArK2opIHsKKyAgICAgICAgICAgIGF1
dG8qIGpzQ2hhbm5lbERhdGEgPSBqc0Nhc3Q8SlNGbG9hdDMyQXJyYXkqPihjaGFubmVsc0FycmF5
LT5nZXRJbmRleCgmZ2xvYmFsT2JqZWN0LCBqKSk7CisgICAgICAgICAgICBtZW1zZXQoanNDaGFu
bmVsRGF0YS0+dHlwZWRWZWN0b3IoKSwgMCwgc2l6ZW9mKGZsb2F0KSAqIGpzQ2hhbm5lbERhdGEt
Pmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogRXhjZXB0aW9uT3I8UmVmPEF1ZGlv
V29ya2xldFByb2Nlc3Nvcj4+IEF1ZGlvV29ya2xldFByb2Nlc3Nvcjo6Y3JlYXRlKFNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQmIGNvbnRleHQpCiB7CiAgICAgYXV0byBjb25zdHJ1Y3Rpb25EYXRhID0g
ZG93bmNhc3Q8QXVkaW9Xb3JrbGV0R2xvYmFsU2NvcGU+KGNvbnRleHQpLnRha2VQZW5kaW5nUHJv
Y2Vzc29yQ29uc3RydWN0aW9uRGF0YSgpOwpAQCAtMTMwLDYgKzIxNiwyOCBAQCBBdWRpb1dvcmts
ZXRQcm9jZXNzb3I6OkF1ZGlvV29ya2xldFByb2Nlc3Nvcihjb25zdCBBdWRpb1dvcmtsZXRQcm9j
ZXNzb3JDb25zdHJ1YwogICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwogfQogCit2b2lkIEF1
ZGlvV29ya2xldFByb2Nlc3Nvcjo6YnVpbGRKU0FyZ3VtZW50cyhWTSYgdm0sIEpTR2xvYmFsT2Jq
ZWN0JiBnbG9iYWxPYmplY3QsIE1hcmtlZEFyZ3VtZW50QnVmZmVyJiBhcmdzLCBjb25zdCBWZWN0
b3I8UmVmUHRyPEF1ZGlvQnVzPj4mIGlucHV0cywgVmVjdG9yPFJlZjxBdWRpb0J1cz4+JiBvdXRw
dXRzLCBjb25zdCBIYXNoTWFwPFN0cmluZywgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvRmxvYXRBcnJh
eT4+JiBwYXJhbVZhbHVlc01hcCkKK3sKKyAgICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywg
d2UgY2FjaGUgdGhlIGFycmF5cyBwYXNzZWQgdG8gSlMgYW5kIHJlY29uc3RydWN0IHRoZW0gb25s
eSB3aGVuIHRoZSB0b3BvbG9neSBjaGFuZ2VzLgorICAgIGlmIChidXNUb3BvbG9neU1hdGNoZXNK
U0FycmF5KGdsb2JhbE9iamVjdCwgaW5wdXRzLCBtX2pzSW5wdXRzLmdldCgpKSkKKyAgICAgICAg
Y29weURhdGFGcm9tQnVzZXNUb0pTQXJyYXkoZ2xvYmFsT2JqZWN0LCBpbnB1dHMsICptX2pzSW5w
dXRzLmdldCgpKTsKKyAgICBlbHNlCisgICAgICAgIG1fanNJbnB1dHMuc2V0KHZtLCBjb25zdHJ1
Y3RGcm96ZW5KU0FycmF5KHZtLCBnbG9iYWxPYmplY3QsIGlucHV0cywgU2hvdWxkUG9wdWxhdGVX
aXRoQnVzRGF0YTo6WWVzKSk7CisgICAgYXJncy5hcHBlbmQobV9qc0lucHV0cy5nZXQoKSk7CisK
KyAgICBpZiAoYnVzVG9wb2xvZ3lNYXRjaGVzSlNBcnJheShnbG9iYWxPYmplY3QsIG91dHB1dHMs
IG1fanNPdXRwdXRzLmdldCgpKSkKKyAgICAgICAgemVyb0pTQXJyYXkoZ2xvYmFsT2JqZWN0LCAq
bV9qc091dHB1dHMuZ2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgbV9qc091dHB1dHMuc2V0KHZt
LCBjb25zdHJ1Y3RGcm96ZW5KU0FycmF5KHZtLCBnbG9iYWxPYmplY3QsIG91dHB1dHMsIFNob3Vs
ZFBvcHVsYXRlV2l0aEJ1c0RhdGE6Ok5vKSk7CisgICAgYXJncy5hcHBlbmQobV9qc091dHB1dHMu
Z2V0KCkpOworCisgICAgaWYgKHBhcmFtZXRlck1hcFRvcG9sb2d5TWF0Y2hlc0pTT2JqZWN0KHZt
LCBnbG9iYWxPYmplY3QsIHBhcmFtVmFsdWVzTWFwLCBtX2pzUGFyYW1WYWx1ZXMuZ2V0KCkpKQor
ICAgICAgICBjb3B5RGF0YUZyb21QYXJhbWV0ZXJNYXBUb0pTT2JqZWN0KHZtLCBnbG9iYWxPYmpl
Y3QsIHBhcmFtVmFsdWVzTWFwLCAqbV9qc1BhcmFtVmFsdWVzLmdldCgpKTsKKyAgICBlbHNlCisg
ICAgICAgIG1fanNQYXJhbVZhbHVlcy5zZXQodm0sIGNvbnN0cnVjdEZyb3plbktleVZhbHVlT2Jq
ZWN0KHZtLCBnbG9iYWxPYmplY3QsIHBhcmFtVmFsdWVzTWFwKSk7CisgICAgYXJncy5hcHBlbmQo
bV9qc1BhcmFtVmFsdWVzLmdldCgpKTsKK30KKwogYm9vbCBBdWRpb1dvcmtsZXRQcm9jZXNzb3I6
OnByb2Nlc3MoY29uc3QgVmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+JiBpbnB1dHMsIFZlY3RvcjxS
ZWY8QXVkaW9CdXM+PiYgb3V0cHV0cywgY29uc3QgSGFzaE1hcDxTdHJpbmcsIHN0ZDo6dW5pcXVl
X3B0cjxBdWRpb0Zsb2F0QXJyYXk+PiYgcGFyYW1WYWx1ZXNNYXAsIGJvb2wmIHRocmV3RXhjZXB0
aW9uKQogewogICAgIEFTU0VSVChtX3Byb2Nlc3NDYWxsYmFjayk7CkBAIC0xNDEsMTIgKzI0OSw3
IEBAIGJvb2wgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yOjpwcm9jZXNzKGNvbnN0IFZlY3RvcjxSZWZQ
dHI8QXVkaW9CdXM+PiYgaW5wdXRzLCBWZWN0CiAgICAgSlNMb2NrSG9sZGVyIGxvY2sodm0pOwog
CiAgICAgTWFya2VkQXJndW1lbnRCdWZmZXIgYXJnczsKLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxk
IGNvbnNpZGVyIGNhY2hpbmcgdGhlIEpTQXJyYXlzICYgSlNPYmplY3QgYW5kIG9ubHkgdXBkYXRl
IHRoZWlyIGl0ZW1zCi0gICAgLy8gZXZlcnkgdGltZSBwcm9jZXNzKCkgaXMgY2FsbGVkLCBmb3Ig
cGVyZm9ybWFuY2UgcmVhc29ucy4KLSAgICBhcmdzLmFwcGVuZChjb25zdHJ1Y3RGcm96ZW5KU0Fy
cmF5KHZtLCBnbG9iYWxPYmplY3QsIGlucHV0cywgU2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YTo6
WWVzKSk7Ci0gICAgYXV0byogb3VwdXRKU0FycmF5ID0gY29uc3RydWN0RnJvemVuSlNBcnJheSh2
bSwgZ2xvYmFsT2JqZWN0LCBvdXRwdXRzLCBTaG91bGRQb3B1bGF0ZVdpdGhCdXNEYXRhOjpObyk7
Ci0gICAgYXJncy5hcHBlbmQob3VwdXRKU0FycmF5KTsKLSAgICBhcmdzLmFwcGVuZChjb25zdHJ1
Y3RGcm96ZW5LZXlWYWx1ZU9iamVjdCh2bSwgZ2xvYmFsT2JqZWN0LCBwYXJhbVZhbHVlc01hcCkp
OworICAgIGJ1aWxkSlNBcmd1bWVudHModm0sIGdsb2JhbE9iamVjdCwgYXJncywgaW5wdXRzLCBv
dXRwdXRzLCBwYXJhbVZhbHVlc01hcCk7CiAKICAgICBOYWtlZFB0cjxKU0M6OkV4Y2VwdGlvbj4g
cmV0dXJuZWRFeGNlcHRpb247CiAgICAgYXV0byByZXN1bHQgPSBtX3Byb2Nlc3NDYWxsYmFjay0+
aW52b2tlQ2FsbGJhY2soanNVbmRlZmluZWQoKSwgYXJncywgSlNDYWxsYmFja0RhdGE6OkNhbGxi
YWNrVHlwZTo6T2JqZWN0LCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKHZtLCAicHJvY2VzcyIpLCBy
ZXR1cm5lZEV4Y2VwdGlvbik7CkBAIC0xNTYsNyArMjU5LDcgQEAgYm9vbCBBdWRpb1dvcmtsZXRQ
cm9jZXNzb3I6OnByb2Nlc3MoY29uc3QgVmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+JiBpbnB1dHMs
IFZlY3QKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGNvcHlEYXRhRnJvbUpT
QXJyYXlUb0J1c2VzKGdsb2JhbE9iamVjdCwgKm91cHV0SlNBcnJheSwgb3V0cHV0cyk7CisgICAg
Y29weURhdGFGcm9tSlNBcnJheVRvQnVzZXMoZ2xvYmFsT2JqZWN0LCAqbV9qc091dHB1dHMuZ2V0
KCksIG91dHB1dHMpOwogCiAgICAgcmV0dXJuIHJlc3VsdC50b0Jvb2xlYW4oJmdsb2JhbE9iamVj
dCk7CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlv
V29ya2xldFByb2Nlc3Nvci5oIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRp
b1dvcmtsZXRQcm9jZXNzb3IuaAppbmRleCA3YjM4ZmYyMTVjMTRhNmM5NTFjZmE3OTRmMjhmNzky
MDYxNjk2M2IwLi5iYjA3MWU0OTQ1MGNhYzJhMGE2OWYxNDA0MWQ5NTZiYTU0NDQ3OGY1IDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nl
c3Nvci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Xb3JrbGV0
UHJvY2Vzc29yLmgKQEAgLTMxLDEwICszMSwxNiBAQAogI2lmIEVOQUJMRShXRUJfQVVESU8pCiAj
aW5jbHVkZSAiQXVkaW9BcnJheS5oIgogI2luY2x1ZGUgIkV4Y2VwdGlvbk9yLmgiCisjaW5jbHVk
ZSA8SmF2YXNjcmlwdENvcmUvU3Ryb25nLmg+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KICNp
bmNsdWRlIDx3dGYvUmVmLmg+CiAjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+
CiAKK25hbWVzcGFjZSBKU0MgeworY2xhc3MgSlNBcnJheTsKK2NsYXNzIE1hcmtlZEFyZ3VtZW50
QnVmZmVyOworfQorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIEF1ZGlvQnVzOwpAQCAt
NTcsMTAgKzYzLDE0IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICBleHBsaWNpdCBBdWRpb1dv
cmtsZXRQcm9jZXNzb3IoY29uc3QgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yQ29uc3RydWN0aW9uRGF0
YSYpOworICAgIHZvaWQgYnVpbGRKU0FyZ3VtZW50cyhKU0M6OlZNJiwgSlNDOjpKU0dsb2JhbE9i
amVjdCYsIEpTQzo6TWFya2VkQXJndW1lbnRCdWZmZXImLCBjb25zdCBWZWN0b3I8UmVmUHRyPEF1
ZGlvQnVzPj4mIGlucHV0cywgVmVjdG9yPFJlZjxBdWRpb0J1cz4+JiBvdXRwdXRzLCBjb25zdCBI
YXNoTWFwPFN0cmluZywgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvRmxvYXRBcnJheT4+JiBwYXJhbVZh
bHVlc01hcCk7CiAKICAgICBTdHJpbmcgbV9uYW1lOwogICAgIFJlZjxNZXNzYWdlUG9ydD4gbV9w
b3J0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxKU0NhbGxiYWNrRGF0YVN0cm9uZz4gbV9wcm9jZXNz
Q2FsbGJhY2s7CisgICAgSlNDOjpTdHJvbmc8SlNDOjpKU0FycmF5PiBtX2pzSW5wdXRzOworICAg
IEpTQzo6U3Ryb25nPEpTQzo6SlNBcnJheT4gbV9qc091dHB1dHM7CisgICAgSlNDOjpTdHJvbmc8
SlNDOjpKU09iamVjdD4gbV9qc1BhcmFtVmFsdWVzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQo=
</data>
<flag name="commit-queue"
          id="427448"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>411286</attachid>
            <date>2020-10-13 17:44:25 -0700</date>
            <delta_ts>2020-10-13 21:18:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-217685-20201013174424.patch</filename>
            <type>text/plain</type>
            <size>12590</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjY4NDI0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYjc1ODFmOTBmNGI0Mzhj
YjliYTA4NTc1YTE5ZWQ5MjI5Y2NiZjllMi4uOWI5YWZjNGU0MGRmOWFlYzRlNzMxOTA0Y2MyOTk5
NzQzYzA4NGFiMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5IEBACisyMDIwLTEwLTEzICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgQ2FjaGUgSlMgYXJndW1lbnRz
IGluIEF1ZGlvV29ya2xldFByb2Nlc3Nvcjo6cHJvY2VzcygpIGZvciBwZXJmb3JtYW5jZQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE3Njg1CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2FjaGUgSlMgYXJn
dW1lbnRzIGluIEF1ZGlvV29ya2xldFByb2Nlc3Nvcjo6cHJvY2VzcygpIGZvciBwZXJmb3JtYW5j
ZS4KKyAgICAgICAgQmxpbmsgaGFzIHRoZSBzYW1lIG9wdGltaXphdGlvbiBoZXJlOgorICAgICAg
ICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJvbWl1bS9jaHJvbWl1bS9ibG9iL21hc3Rlci90aGly
ZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3dlYmF1ZGlvL2F1ZGlvX3dvcmtsZXRfcHJv
Y2Vzc29yLmNjCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBubyBXZWItZmFjaW5nIGJlaGF2aW9y
IGNoYW5nZS4KKworICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vQXVkaW9Xb3JrbGV0UHJvY2Vz
c29yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmJ1c0NoYW5uZWxDb3VudCk6CisgICAgICAgIChX
ZWJDb3JlOjpjb25zdHJ1Y3RGcm96ZW5KU0FycmF5KToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlE
YXRhRnJvbUpTQXJyYXlUb0J1c2VzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlEYXRhRnJvbUJ1
c2VzVG9KU0FycmF5KToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlEYXRhRnJvbVBhcmFtZXRlck1h
cFRvSlNPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6YnVzVG9wb2xvZ3lNYXRjaGVzSlNBcnJh
eSk6CisgICAgICAgIChXZWJDb3JlOjpwYXJhbWV0ZXJNYXBUb3BvbG9neU1hdGNoZXNKU09iamVj
dCk6CisgICAgICAgIChXZWJDb3JlOjp6ZXJvSlNBcnJheSk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb1dvcmtsZXRQcm9jZXNzb3I6OmJ1aWxkSlNBcmd1bWVudHMpOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9Xb3JrbGV0UHJvY2Vzc29yOjpwcm9jZXNzKToKKyAgICAgICAgKiBNb2R1bGVzL3dl
YmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5oOgorCiAyMDIwLTEwLTEzICBDaHJpcyBEdW1l
eiAgPGNkdW1lekBhcHBsZS5jb20+CiAKICAgICAgICAgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRv
IGNyZWF0ZSBhbiBBdWRpb1dvcmtsZXROb2RlIGZvciBhIGNvbnRleHQgdGhhdCBoYXMgZmluaXNo
ZWQgcmVuZGVyaW5nCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlv
L0F1ZGlvV29ya2xldFByb2Nlc3Nvci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1
ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5jcHAKaW5kZXggYTIyMzE1MTJiYjFhZDg1NjlkMDIw
MTJlZjAyODIyZGM3NWZlMWZhNC4uNDMwMGI1YmVjMjEyM2VhY2I4N2ViOGU4OGE3Njk2MGJmYTY1
OGJhNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb1dv
cmtsZXRQcm9jZXNzb3IuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8v
QXVkaW9Xb3JrbGV0UHJvY2Vzc29yLmNwcApAQCAtNDUsNiArNDUsMjUgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSlNDOwogCitzdGF0aWMgdW5zaWduZWQgYnVzQ2hh
bm5lbENvdW50KGNvbnN0IEF1ZGlvQnVzJiBidXMpCit7CisgICAgcmV0dXJuIGJ1cy5udW1iZXJP
ZkNoYW5uZWxzKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBidXNDaGFubmVsQ291bnQoY29uc3Qg
QXVkaW9CdXMqIGJ1cykKK3sKKyAgICByZXR1cm4gYnVzID8gYnVzQ2hhbm5lbENvdW50KCpidXMp
IDogMDsKK30KKworc3RhdGljIHZvaWQgZm9yRWFjaENoYW5uZWxEYXRhSlNBcnJheShKU0dsb2Jh
bE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBKU0FycmF5JiBqc0FycmF5LCBjb25zdCBGdW5jdGlvbjx2
b2lkKHVuc2lnbmVkIGJ1c0luZGV4LCB1bnNpZ25lZCBjaGFubmVsSW5kZXgsIEpTRmxvYXQzMkFy
cmF5JiBjaGFubmVsRGF0YSk+JiBhcHBseSkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGJ1c0luZGV4
ID0gMCwgYnVzQ291bnQgPSBqc0FycmF5Lmxlbmd0aCgpOyBidXNJbmRleCA8IGJ1c0NvdW50OyAr
K2J1c0luZGV4KSB7CisgICAgICAgIGF1dG8qIGNoYW5uZWxzQXJyYXkgPSBqc0Nhc3Q8SlNBcnJh
eSo+KGpzQXJyYXkuZ2V0SW5kZXgoJmdsb2JhbE9iamVjdCwgYnVzSW5kZXgpKTsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBjaGFubmVsSW5kZXggPSAwLCBjaGFubmVsQ291bnQgPSBjaGFubmVsc0Fy
cmF5LT5sZW5ndGgoKTsgY2hhbm5lbEluZGV4IDwgY2hhbm5lbENvdW50OyArK2NoYW5uZWxJbmRl
eCkKKyAgICAgICAgICAgIGFwcGx5KGJ1c0luZGV4LCBjaGFubmVsSW5kZXgsICpqc0Nhc3Q8SlNG
bG9hdDMyQXJyYXkqPihjaGFubmVsc0FycmF5LT5nZXRJbmRleCgmZ2xvYmFsT2JqZWN0LCBjaGFu
bmVsSW5kZXgpKSk7CisgICAgfQorfQorCiBzdGF0aWMgSlNGbG9hdDMyQXJyYXkqIGNvbnN0cnVj
dEpTRmxvYXQzMkFycmF5KEpTR2xvYmFsT2JqZWN0JiBnbG9iYWxPYmplY3QsIHVuc2lnbmVkIGxl
bmd0aCwgY29uc3QgZmxvYXQqIGRhdGEgPSBudWxscHRyKQogewogICAgIGF1dG8qIGpzQXJyYXkg
PSBKU0Zsb2F0MzJBcnJheTo6Y3JlYXRlKCZnbG9iYWxPYmplY3QsIGdsb2JhbE9iamVjdC50eXBl
ZEFycmF5U3RydWN0dXJlKFR5cGVGbG9hdDMyKSwgbGVuZ3RoKTsKQEAgLTcwLDkgKzg5LDExIEBA
IHN0YXRpYyBKU09iamVjdCogY29uc3RydWN0RnJvemVuS2V5VmFsdWVPYmplY3QoVk0mIHZtLCBK
U0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqCiB9CiAKIGVudW0gY2xhc3MgU2hvdWxkUG9wdWxhdGVX
aXRoQnVzRGF0YSA6IGJvb2wgeyBObywgWWVzIH07Ci1zdGF0aWMgSlNBcnJheSogY29uc3RydWN0
RnJvemVuSlNBcnJheShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0JiBnbG9iYWxPYmplY3QsIEpTQzo6
VGhyb3dTY29wZSYgc2NvcGUsIEF1ZGlvQnVzKiBidXMsIFNob3VsZFBvcHVsYXRlV2l0aEJ1c0Rh
dGEgc2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YSkKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citz
dGF0aWMgSlNBcnJheSogY29uc3RydWN0RnJvemVuSlNBcnJheShWTSYgdm0sIEpTR2xvYmFsT2Jq
ZWN0JiBnbG9iYWxPYmplY3QsIEpTQzo6VGhyb3dTY29wZSYgc2NvcGUsIGNvbnN0IFQmIGJ1cywg
U2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YSBzaG91bGRQb3B1bGF0ZVdpdGhCdXNEYXRhKQogewot
ICAgIHVuc2lnbmVkIG51bWJlck9mQ2hhbm5lbHMgPSBidXMgPyBidXMtPm51bWJlck9mQ2hhbm5l
bHMoKSA6IDA7CisgICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IGJ1c0NoYW5uZWxDb3Vu
dChidXMuZ2V0KCkpOwogICAgIGF1dG8qIGNoYW5uZWxzRGF0YSA9IEpTQXJyYXk6OmNyZWF0ZSh2
bSwgZ2xvYmFsT2JqZWN0Lm9yaWdpbmFsQXJyYXlTdHJ1Y3R1cmVGb3JJbmRleGluZ1R5cGUoQXJy
YXlXaXRoQ29udGlndW91cyksIG51bWJlck9mQ2hhbm5lbHMpOwogICAgIGZvciAodW5zaWduZWQg
aiA9IDA7IGogPCBudW1iZXJPZkNoYW5uZWxzOyArK2opIHsKICAgICAgICAgYXV0byogY2hhbm5l
bCA9IGJ1cy0+Y2hhbm5lbChqKTsKQEAgLTg5LDEzICsxMTAsMTMgQEAgc3RhdGljIEpTQXJyYXkq
IGNvbnN0cnVjdEZyb3plbkpTQXJyYXkoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2Jq
ZWN0LCBjb24KICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CiAgICAg
YXV0byogYXJyYXkgPSBKU0FycmF5OjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdC5vcmlnaW5hbEFy
cmF5U3RydWN0dXJlRm9ySW5kZXhpbmdUeXBlKEFycmF5V2l0aENvbnRpZ3VvdXMpLCBidXNlcy5z
aXplKCkpOwogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBidXNlcy5zaXplKCk7ICsraSkK
LSAgICAgICAgYXJyYXktPnNldEluZGV4UXVpY2tseSh2bSwgaSwgY29uc3RydWN0RnJvemVuSlNB
cnJheSh2bSwgZ2xvYmFsT2JqZWN0LCBzY29wZSwgV1RGOjpnZXRQdHIoYnVzZXNbaV0pLCBzaG91
bGRQb3B1bGF0ZVdpdGhCdXNEYXRhKSk7CisgICAgICAgIGFycmF5LT5zZXRJbmRleFF1aWNrbHko
dm0sIGksIGNvbnN0cnVjdEZyb3plbkpTQXJyYXkodm0sIGdsb2JhbE9iamVjdCwgc2NvcGUsIGJ1
c2VzW2ldLCBzaG91bGRQb3B1bGF0ZVdpdGhCdXNEYXRhKSk7CiAgICAgSlNDOjpvYmplY3RDb25z
dHJ1Y3RvckZyZWV6ZSgmZ2xvYmFsT2JqZWN0LCBhcnJheSk7CiAgICAgRVhDRVBUSU9OX0FTU0VS
VCghc2NvcGUuZXhjZXB0aW9uKCkpOwogICAgIHJldHVybiBhcnJheTsKIH0KIAotc3RhdGljIHZv
aWQgY29weURhdGFGcm9tSlNBcnJheVRvQnVzZXMoSlNHbG9iYWxPYmplY3QmIGdsb2JhbE9iamVj
dCwgSlNBcnJheSYganNBcnJheSwgVmVjdG9yPFJlZjxBdWRpb0J1cz4+JiBidXNlcykKK3N0YXRp
YyB2b2lkIGNvcHlEYXRhRnJvbUpTQXJyYXlUb0J1c2VzKEpTR2xvYmFsT2JqZWN0JiBnbG9iYWxP
YmplY3QsIGNvbnN0IEpTQXJyYXkmIGpzQXJyYXksIFZlY3RvcjxSZWY8QXVkaW9CdXM+PiYgYnVz
ZXMpCiB7CiAgICAgLy8gV2UgY2FuIHNhZmVseSBtYWtlIGFzc3VtcHRpb25zIGFib3V0IHRoZSBz
dHJ1Y3R1cmUgb2YgdGhlIEpTQXJyYXkgc2luY2Ugd2UgdXNlIGZyb3plbiBhcnJheXMuCiAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGJ1c2VzLnNpemUoKTsgKytpKSB7CkBAIC0xMTIsNiAr
MTMzLDcyIEBAIHN0YXRpYyB2b2lkIGNvcHlEYXRhRnJvbUpTQXJyYXlUb0J1c2VzKEpTR2xvYmFs
T2JqZWN0JiBnbG9iYWxPYmplY3QsIEpTQXJyYXkmIGpzCiAgICAgfQogfQogCitzdGF0aWMgdm9p
ZCBjb3B5RGF0YUZyb21CdXNlc1RvSlNBcnJheShKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0
LCBjb25zdCBWZWN0b3I8UmVmUHRyPEF1ZGlvQnVzPj4mIGJ1c2VzLCBKU0FycmF5JiBqc0FycmF5
KQoreworICAgIGZvckVhY2hDaGFubmVsRGF0YUpTQXJyYXkoZ2xvYmFsT2JqZWN0LCBqc0FycmF5
LCBbJl0odW5zaWduZWQgYnVzSW5kZXgsIHVuc2lnbmVkIGNoYW5uZWxJbmRleCwgSlNGbG9hdDMy
QXJyYXkmIGNoYW5uZWxEYXRhKSB7CisgICAgICAgIGF1dG8qIGNoYW5uZWwgPSBidXNlc1tidXNJ
bmRleF0tPmNoYW5uZWwoY2hhbm5lbEluZGV4KTsKKyAgICAgICAgQVNTRVJUKGNoYW5uZWxEYXRh
Lmxlbmd0aCgpID09IGNoYW5uZWwtPmxlbmd0aCgpKTsKKyAgICAgICAgbWVtY3B5KGNoYW5uZWxE
YXRhLnR5cGVkVmVjdG9yKCksIGNoYW5uZWwtPm11dGFibGVEYXRhKCksIHNpemVvZihmbG9hdCkg
KiBjaGFubmVsLT5sZW5ndGgoKSk7CisgICAgfSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlEYXRh
RnJvbVBhcmFtZXRlck1hcFRvSlNPYmplY3QoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCYgZ2xvYmFs
T2JqZWN0LCBjb25zdCBIYXNoTWFwPFN0cmluZywgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvRmxvYXRB
cnJheT4+JiBwYXJhbVZhbHVlc01hcCwgSlNPYmplY3QmIGpzT2JqZWN0KQoreworICAgIGZvciAo
YXV0byYgcGFpciA6IHBhcmFtVmFsdWVzTWFwKSB7CisgICAgICAgIGF1dG8qIGpzVHlwZWRBcnJh
eSA9IGpzQ2FzdDxKU0Zsb2F0MzJBcnJheSo+KGpzT2JqZWN0LmdldCgmZ2xvYmFsT2JqZWN0LCBJ
ZGVudGlmaWVyOjpmcm9tU3RyaW5nKHZtLCBwYWlyLmtleSkpKTsKKyAgICAgICAgQVNTRVJUKHBh
aXIudmFsdWUtPnNpemUoKSA+PSBqc1R5cGVkQXJyYXktPmxlbmd0aCgpKTsKKyAgICAgICAgbWVt
Y3B5KGpzVHlwZWRBcnJheS0+dHlwZWRWZWN0b3IoKSwgcGFpci52YWx1ZS0+ZGF0YSgpLCBzaXpl
b2YoZmxvYXQpICoganNUeXBlZEFycmF5LT5sZW5ndGgoKSk7CisgICAgfQorfQorCit0ZW1wbGF0
ZTx0eXBlbmFtZSBUPgorc3RhdGljIGJvb2wgYnVzVG9wb2xvZ3lNYXRjaGVzSlNBcnJheShKU0ds
b2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBjb25zdCBWZWN0b3I8VD4mIGJ1c2VzLCBKU0FycmF5
KiBqc0FycmF5KQoreworICAgIGlmICghanNBcnJheSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShqc0FycmF5LT5sZW5ndGgoKSA9PSBidXNlcy5zaXpl
KCksICJOdW1iZXIgb2YgaW5wdXRzL291dHB1dHMgY2Fubm90IGNoYW5nZSBhZnRlciBjb25zdHJ1
Y3Rpb24iKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBidXNlcy5zaXplKCk7ICsr
aSkgeworICAgICAgICBhdXRvJiBidXMgPSBidXNlc1tpXTsKKyAgICAgICAgYXV0byogY2hhbm5l
bHNBcnJheSA9IGpzQ2FzdDxKU0FycmF5Kj4oanNBcnJheS0+Z2V0SW5kZXgoJmdsb2JhbE9iamVj
dCwgaSkpOworICAgICAgICB1bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzID0gYnVzQ2hhbm5lbENv
dW50KGJ1cy5nZXQoKSk7CisgICAgICAgIGlmIChjaGFubmVsc0FycmF5LT5sZW5ndGgoKSAhPSBu
dW1iZXJPZkNoYW5uZWxzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZv
ciAodW5zaWduZWQgaiA9IDA7IGogPCBudW1iZXJPZkNoYW5uZWxzOyArK2opIHsKKyAgICAgICAg
ICAgIGF1dG8qIGNoYW5uZWwgPSBidXMtPmNoYW5uZWwoaik7CisgICAgICAgICAgICBhdXRvKiBq
c0NoYW5uZWxEYXRhID0ganNDYXN0PEpTRmxvYXQzMkFycmF5Kj4oY2hhbm5lbHNBcnJheS0+Z2V0
SW5kZXgoJmdsb2JhbE9iamVjdCwgaikpOworICAgICAgICAgICAgaWYgKGpzQ2hhbm5lbERhdGEt
Pmxlbmd0aCgpICE9IGNoYW5uZWwtPmxlbmd0aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMg
Ym9vbCBwYXJhbWV0ZXJNYXBUb3BvbG9neU1hdGNoZXNKU09iamVjdChWTSYgdm0sIEpTR2xvYmFs
T2JqZWN0JiBnbG9iYWxPYmplY3QsIGNvbnN0IEhhc2hNYXA8U3RyaW5nLCBzdGQ6OnVuaXF1ZV9w
dHI8QXVkaW9GbG9hdEFycmF5Pj4mIHBhcmFtVmFsdWVzTWFwLCBKU09iamVjdCoganNPYmplY3Qp
Cit7CisgICAgaWYgKCFqc09iamVjdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9y
IChhdXRvJiBwYWlyIDogcGFyYW1WYWx1ZXNNYXApIHsKKyAgICAgICAgYXV0byoganNUeXBlZEFy
cmF5ID0ganNDYXN0PEpTRmxvYXQzMkFycmF5Kj4oanNPYmplY3QtPmdldCgmZ2xvYmFsT2JqZWN0
LCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKHZtLCBwYWlyLmtleSkpKTsKKyAgICAgICAgdW5zaWdu
ZWQgZXhwZWN0ZWRMZW5ndGggPSBwYWlyLnZhbHVlLT5jb250YWluc0NvbnN0YW50VmFsdWUoKSA/
IDEgOiBwYWlyLnZhbHVlLT5zaXplKCk7CisgICAgICAgIGlmIChqc1R5cGVkQXJyYXktPmxlbmd0
aCgpICE9IGV4cGVjdGVkTGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCB6ZXJvSlNBcnJheShKU0dsb2Jh
bE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBKU0FycmF5JiBqc0FycmF5KQoreworICAgIGZvckVhY2hD
aGFubmVsRGF0YUpTQXJyYXkoZ2xvYmFsT2JqZWN0LCBqc0FycmF5LCBbXSh1bnNpZ25lZCwgdW5z
aWduZWQsIEpTRmxvYXQzMkFycmF5JiBjaGFubmVsRGF0YSkgeworICAgICAgICBtZW1zZXQoY2hh
bm5lbERhdGEudHlwZWRWZWN0b3IoKSwgMCwgc2l6ZW9mKGZsb2F0KSAqIGNoYW5uZWxEYXRhLmxl
bmd0aCgpKTsKKyAgICB9KTsKK30KKwogRXhjZXB0aW9uT3I8UmVmPEF1ZGlvV29ya2xldFByb2Nl
c3Nvcj4+IEF1ZGlvV29ya2xldFByb2Nlc3Nvcjo6Y3JlYXRlKFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQmIGNvbnRleHQpCiB7CiAgICAgYXV0byBjb25zdHJ1Y3Rpb25EYXRhID0gZG93bmNhc3Q8QXVk
aW9Xb3JrbGV0R2xvYmFsU2NvcGU+KGNvbnRleHQpLnRha2VQZW5kaW5nUHJvY2Vzc29yQ29uc3Ry
dWN0aW9uRGF0YSgpOwpAQCAtMTMwLDYgKzIxNywyOCBAQCBBdWRpb1dvcmtsZXRQcm9jZXNzb3I6
OkF1ZGlvV29ya2xldFByb2Nlc3Nvcihjb25zdCBBdWRpb1dvcmtsZXRQcm9jZXNzb3JDb25zdHJ1
YwogICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwogfQogCit2b2lkIEF1ZGlvV29ya2xldFBy
b2Nlc3Nvcjo6YnVpbGRKU0FyZ3VtZW50cyhWTSYgdm0sIEpTR2xvYmFsT2JqZWN0JiBnbG9iYWxP
YmplY3QsIE1hcmtlZEFyZ3VtZW50QnVmZmVyJiBhcmdzLCBjb25zdCBWZWN0b3I8UmVmUHRyPEF1
ZGlvQnVzPj4mIGlucHV0cywgVmVjdG9yPFJlZjxBdWRpb0J1cz4+JiBvdXRwdXRzLCBjb25zdCBI
YXNoTWFwPFN0cmluZywgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvRmxvYXRBcnJheT4+JiBwYXJhbVZh
bHVlc01hcCkKK3sKKyAgICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgd2UgY2FjaGUgdGhl
IGFycmF5cyBwYXNzZWQgdG8gSlMgYW5kIHJlY29uc3RydWN0IHRoZW0gb25seSB3aGVuIHRoZSB0
b3BvbG9neSBjaGFuZ2VzLgorICAgIGlmIChidXNUb3BvbG9neU1hdGNoZXNKU0FycmF5KGdsb2Jh
bE9iamVjdCwgaW5wdXRzLCBtX2pzSW5wdXRzLmdldCgpKSkKKyAgICAgICAgY29weURhdGFGcm9t
QnVzZXNUb0pTQXJyYXkoZ2xvYmFsT2JqZWN0LCBpbnB1dHMsICptX2pzSW5wdXRzLmdldCgpKTsK
KyAgICBlbHNlCisgICAgICAgIG1fanNJbnB1dHMuc2V0KHZtLCBjb25zdHJ1Y3RGcm96ZW5KU0Fy
cmF5KHZtLCBnbG9iYWxPYmplY3QsIGlucHV0cywgU2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YTo6
WWVzKSk7CisgICAgYXJncy5hcHBlbmQobV9qc0lucHV0cy5nZXQoKSk7CisKKyAgICBpZiAoYnVz
VG9wb2xvZ3lNYXRjaGVzSlNBcnJheShnbG9iYWxPYmplY3QsIG91dHB1dHMsIG1fanNPdXRwdXRz
LmdldCgpKSkKKyAgICAgICAgemVyb0pTQXJyYXkoZ2xvYmFsT2JqZWN0LCAqbV9qc091dHB1dHMu
Z2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgbV9qc091dHB1dHMuc2V0KHZtLCBjb25zdHJ1Y3RG
cm96ZW5KU0FycmF5KHZtLCBnbG9iYWxPYmplY3QsIG91dHB1dHMsIFNob3VsZFBvcHVsYXRlV2l0
aEJ1c0RhdGE6Ok5vKSk7CisgICAgYXJncy5hcHBlbmQobV9qc091dHB1dHMuZ2V0KCkpOworCisg
ICAgaWYgKHBhcmFtZXRlck1hcFRvcG9sb2d5TWF0Y2hlc0pTT2JqZWN0KHZtLCBnbG9iYWxPYmpl
Y3QsIHBhcmFtVmFsdWVzTWFwLCBtX2pzUGFyYW1WYWx1ZXMuZ2V0KCkpKQorICAgICAgICBjb3B5
RGF0YUZyb21QYXJhbWV0ZXJNYXBUb0pTT2JqZWN0KHZtLCBnbG9iYWxPYmplY3QsIHBhcmFtVmFs
dWVzTWFwLCAqbV9qc1BhcmFtVmFsdWVzLmdldCgpKTsKKyAgICBlbHNlCisgICAgICAgIG1fanNQ
YXJhbVZhbHVlcy5zZXQodm0sIGNvbnN0cnVjdEZyb3plbktleVZhbHVlT2JqZWN0KHZtLCBnbG9i
YWxPYmplY3QsIHBhcmFtVmFsdWVzTWFwKSk7CisgICAgYXJncy5hcHBlbmQobV9qc1BhcmFtVmFs
dWVzLmdldCgpKTsKK30KKwogYm9vbCBBdWRpb1dvcmtsZXRQcm9jZXNzb3I6OnByb2Nlc3MoY29u
c3QgVmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+JiBpbnB1dHMsIFZlY3RvcjxSZWY8QXVkaW9CdXM+
PiYgb3V0cHV0cywgY29uc3QgSGFzaE1hcDxTdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb0Zs
b2F0QXJyYXk+PiYgcGFyYW1WYWx1ZXNNYXAsIGJvb2wmIHRocmV3RXhjZXB0aW9uKQogewogICAg
IEFTU0VSVChtX3Byb2Nlc3NDYWxsYmFjayk7CkBAIC0xNDEsMTIgKzI1MCw3IEBAIGJvb2wgQXVk
aW9Xb3JrbGV0UHJvY2Vzc29yOjpwcm9jZXNzKGNvbnN0IFZlY3RvcjxSZWZQdHI8QXVkaW9CdXM+
PiYgaW5wdXRzLCBWZWN0CiAgICAgSlNMb2NrSG9sZGVyIGxvY2sodm0pOwogCiAgICAgTWFya2Vk
QXJndW1lbnRCdWZmZXIgYXJnczsKLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNvbnNpZGVyIGNh
Y2hpbmcgdGhlIEpTQXJyYXlzICYgSlNPYmplY3QgYW5kIG9ubHkgdXBkYXRlIHRoZWlyIGl0ZW1z
Ci0gICAgLy8gZXZlcnkgdGltZSBwcm9jZXNzKCkgaXMgY2FsbGVkLCBmb3IgcGVyZm9ybWFuY2Ug
cmVhc29ucy4KLSAgICBhcmdzLmFwcGVuZChjb25zdHJ1Y3RGcm96ZW5KU0FycmF5KHZtLCBnbG9i
YWxPYmplY3QsIGlucHV0cywgU2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YTo6WWVzKSk7Ci0gICAg
YXV0byogb3VwdXRKU0FycmF5ID0gY29uc3RydWN0RnJvemVuSlNBcnJheSh2bSwgZ2xvYmFsT2Jq
ZWN0LCBvdXRwdXRzLCBTaG91bGRQb3B1bGF0ZVdpdGhCdXNEYXRhOjpObyk7Ci0gICAgYXJncy5h
cHBlbmQob3VwdXRKU0FycmF5KTsKLSAgICBhcmdzLmFwcGVuZChjb25zdHJ1Y3RGcm96ZW5LZXlW
YWx1ZU9iamVjdCh2bSwgZ2xvYmFsT2JqZWN0LCBwYXJhbVZhbHVlc01hcCkpOworICAgIGJ1aWxk
SlNBcmd1bWVudHModm0sIGdsb2JhbE9iamVjdCwgYXJncywgaW5wdXRzLCBvdXRwdXRzLCBwYXJh
bVZhbHVlc01hcCk7CiAKICAgICBOYWtlZFB0cjxKU0M6OkV4Y2VwdGlvbj4gcmV0dXJuZWRFeGNl
cHRpb247CiAgICAgYXV0byByZXN1bHQgPSBtX3Byb2Nlc3NDYWxsYmFjay0+aW52b2tlQ2FsbGJh
Y2soanNVbmRlZmluZWQoKSwgYXJncywgSlNDYWxsYmFja0RhdGE6OkNhbGxiYWNrVHlwZTo6T2Jq
ZWN0LCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKHZtLCAicHJvY2VzcyIpLCByZXR1cm5lZEV4Y2Vw
dGlvbik7CkBAIC0xNTYsNyArMjYwLDcgQEAgYm9vbCBBdWRpb1dvcmtsZXRQcm9jZXNzb3I6OnBy
b2Nlc3MoY29uc3QgVmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+JiBpbnB1dHMsIFZlY3QKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGNvcHlEYXRhRnJvbUpTQXJyYXlUb0J1c2Vz
KGdsb2JhbE9iamVjdCwgKm91cHV0SlNBcnJheSwgb3V0cHV0cyk7CisgICAgY29weURhdGFGcm9t
SlNBcnJheVRvQnVzZXMoZ2xvYmFsT2JqZWN0LCAqbV9qc091dHB1dHMuZ2V0KCksIG91dHB1dHMp
OwogCiAgICAgcmV0dXJuIHJlc3VsdC50b0Jvb2xlYW4oJmdsb2JhbE9iamVjdCk7CiB9CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nl
c3Nvci5oIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb1dvcmtsZXRQcm9j
ZXNzb3IuaAppbmRleCA3YjM4ZmYyMTVjMTRhNmM5NTFjZmE3OTRmMjhmNzkyMDYxNjk2M2IwLi5j
OGMwNDg1ZDM1ZGFjYzkzYzQ4ZGFjY2NkYzAxM2IyODljNDU3ZDRlIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5oCisrKyBi
L1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Xb3JrbGV0UHJvY2Vzc29yLmgK
QEAgLTMxLDEwICszMSwxNiBAQAogI2lmIEVOQUJMRShXRUJfQVVESU8pCiAjaW5jbHVkZSAiQXVk
aW9BcnJheS5oIgogI2luY2x1ZGUgIkV4Y2VwdGlvbk9yLmgiCisjaW5jbHVkZSA8SmF2YVNjcmlw
dENvcmUvU3Ryb25nLmg+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KICNpbmNsdWRlIDx3dGYv
UmVmLmg+CiAjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CiAKK25hbWVzcGFj
ZSBKU0MgeworY2xhc3MgSlNBcnJheTsKK2NsYXNzIE1hcmtlZEFyZ3VtZW50QnVmZmVyOworfQor
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIEF1ZGlvQnVzOwpAQCAtNTcsMTAgKzYzLDE0
IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICBleHBsaWNpdCBBdWRpb1dvcmtsZXRQcm9jZXNz
b3IoY29uc3QgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yQ29uc3RydWN0aW9uRGF0YSYpOworICAgIHZv
aWQgYnVpbGRKU0FyZ3VtZW50cyhKU0M6OlZNJiwgSlNDOjpKU0dsb2JhbE9iamVjdCYsIEpTQzo6
TWFya2VkQXJndW1lbnRCdWZmZXImLCBjb25zdCBWZWN0b3I8UmVmUHRyPEF1ZGlvQnVzPj4mIGlu
cHV0cywgVmVjdG9yPFJlZjxBdWRpb0J1cz4+JiBvdXRwdXRzLCBjb25zdCBIYXNoTWFwPFN0cmlu
Zywgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvRmxvYXRBcnJheT4+JiBwYXJhbVZhbHVlc01hcCk7CiAK
ICAgICBTdHJpbmcgbV9uYW1lOwogICAgIFJlZjxNZXNzYWdlUG9ydD4gbV9wb3J0OwogICAgIHN0
ZDo6dW5pcXVlX3B0cjxKU0NhbGxiYWNrRGF0YVN0cm9uZz4gbV9wcm9jZXNzQ2FsbGJhY2s7Cisg
ICAgSlNDOjpTdHJvbmc8SlNDOjpKU0FycmF5PiBtX2pzSW5wdXRzOworICAgIEpTQzo6U3Ryb25n
PEpTQzo6SlNBcnJheT4gbV9qc091dHB1dHM7CisgICAgSlNDOjpTdHJvbmc8SlNDOjpKU09iamVj
dD4gbV9qc1BhcmFtVmFsdWVzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>411297</attachid>
            <date>2020-10-13 21:18:37 -0700</date>
            <delta_ts>2020-10-15 16:41:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-217685-20201013211836.patch</filename>
            <type>text/plain</type>
            <size>19247</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjY4NDI0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYjc1ODFmOTBmNGI0Mzhj
YjliYTA4NTc1YTE5ZWQ5MjI5Y2NiZjllMi4uOWI5YWZjNGU0MGRmOWFlYzRlNzMxOTA0Y2MyOTk5
NzQzYzA4NGFiMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5IEBACisyMDIwLTEwLTEzICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgQ2FjaGUgSlMgYXJndW1lbnRz
IGluIEF1ZGlvV29ya2xldFByb2Nlc3Nvcjo6cHJvY2VzcygpIGZvciBwZXJmb3JtYW5jZQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE3Njg1CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2FjaGUgSlMgYXJn
dW1lbnRzIGluIEF1ZGlvV29ya2xldFByb2Nlc3Nvcjo6cHJvY2VzcygpIGZvciBwZXJmb3JtYW5j
ZS4KKyAgICAgICAgQmxpbmsgaGFzIHRoZSBzYW1lIG9wdGltaXphdGlvbiBoZXJlOgorICAgICAg
ICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJvbWl1bS9jaHJvbWl1bS9ibG9iL21hc3Rlci90aGly
ZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3dlYmF1ZGlvL2F1ZGlvX3dvcmtsZXRfcHJv
Y2Vzc29yLmNjCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBubyBXZWItZmFjaW5nIGJlaGF2aW9y
IGNoYW5nZS4KKworICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vQXVkaW9Xb3JrbGV0UHJvY2Vz
c29yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmJ1c0NoYW5uZWxDb3VudCk6CisgICAgICAgIChX
ZWJDb3JlOjpjb25zdHJ1Y3RGcm96ZW5KU0FycmF5KToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlE
YXRhRnJvbUpTQXJyYXlUb0J1c2VzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlEYXRhRnJvbUJ1
c2VzVG9KU0FycmF5KToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlEYXRhRnJvbVBhcmFtZXRlck1h
cFRvSlNPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6YnVzVG9wb2xvZ3lNYXRjaGVzSlNBcnJh
eSk6CisgICAgICAgIChXZWJDb3JlOjpwYXJhbWV0ZXJNYXBUb3BvbG9neU1hdGNoZXNKU09iamVj
dCk6CisgICAgICAgIChXZWJDb3JlOjp6ZXJvSlNBcnJheSk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb1dvcmtsZXRQcm9jZXNzb3I6OmJ1aWxkSlNBcmd1bWVudHMpOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9Xb3JrbGV0UHJvY2Vzc29yOjpwcm9jZXNzKToKKyAgICAgICAgKiBNb2R1bGVzL3dl
YmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5oOgorCiAyMDIwLTEwLTEzICBDaHJpcyBEdW1l
eiAgPGNkdW1lekBhcHBsZS5jb20+CiAKICAgICAgICAgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRv
IGNyZWF0ZSBhbiBBdWRpb1dvcmtsZXROb2RlIGZvciBhIGNvbnRleHQgdGhhdCBoYXMgZmluaXNo
ZWQgcmVuZGVyaW5nCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlv
L0F1ZGlvV29ya2xldFByb2Nlc3Nvci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1
ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5jcHAKaW5kZXggYTIyMzE1MTJiYjFhZDg1NjlkMDIw
MTJlZjAyODIyZGM3NWZlMWZhNC4uOGE2ODIwNWQ1ZjY3NzE2YjFkYzhhMGNhNGM4ZTJlZDFiYzQ5
ZTJlMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb1dv
cmtsZXRQcm9jZXNzb3IuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8v
QXVkaW9Xb3JrbGV0UHJvY2Vzc29yLmNwcApAQCAtNDUsNiArNDUsMzUgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSlNDOwogCitzdGF0aWMgdW5zaWduZWQgYnVzQ2hh
bm5lbENvdW50KGNvbnN0IEF1ZGlvQnVzJiBidXMpCit7CisgICAgcmV0dXJuIGJ1cy5udW1iZXJP
ZkNoYW5uZWxzKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBidXNDaGFubmVsQ291bnQoY29uc3Qg
QXVkaW9CdXMqIGJ1cykKK3sKKyAgICByZXR1cm4gYnVzID8gYnVzQ2hhbm5lbENvdW50KCpidXMp
IDogMDsKK30KKworc3RhdGljIEpTQXJyYXkqIHRvSlNBcnJheShKU1ZhbHVlSW5XcmFwcGVkT2Jq
ZWN0JiB3cmFwcGVyKQoreworICAgIHJldHVybiB3cmFwcGVyID8ganNDYXN0PEpTQXJyYXkqPihz
dGF0aWNfY2FzdDxKU1ZhbHVlPih3cmFwcGVyKSkgOiBudWxscHRyOworfQorCitzdGF0aWMgSlNP
YmplY3QqIHRvSlNPYmplY3QoSlNWYWx1ZUluV3JhcHBlZE9iamVjdCYgd3JhcHBlcikKK3sKKyAg
ICByZXR1cm4gd3JhcHBlciA/IGpzQ2FzdDxKU09iamVjdCo+KHN0YXRpY19jYXN0PEpTVmFsdWU+
KHdyYXBwZXIpKSA6IG51bGxwdHI7Cit9CisKK3N0YXRpYyB2b2lkIGZvckVhY2hDaGFubmVsRGF0
YUpTQXJyYXkoSlNHbG9iYWxPYmplY3QmIGdsb2JhbE9iamVjdCwgSlNBcnJheSYganNBcnJheSwg
Y29uc3QgRnVuY3Rpb248dm9pZCh1bnNpZ25lZCBidXNJbmRleCwgdW5zaWduZWQgY2hhbm5lbElu
ZGV4LCBKU0Zsb2F0MzJBcnJheSYgY2hhbm5lbERhdGEpPiYgYXBwbHkpCit7CisgICAgZm9yICh1
bnNpZ25lZCBidXNJbmRleCA9IDAsIGJ1c0NvdW50ID0ganNBcnJheS5sZW5ndGgoKTsgYnVzSW5k
ZXggPCBidXNDb3VudDsgKytidXNJbmRleCkgeworICAgICAgICBhdXRvKiBjaGFubmVsc0FycmF5
ID0ganNDYXN0PEpTQXJyYXkqPihqc0FycmF5LmdldEluZGV4KCZnbG9iYWxPYmplY3QsIGJ1c0lu
ZGV4KSk7CisgICAgICAgIGZvciAodW5zaWduZWQgY2hhbm5lbEluZGV4ID0gMCwgY2hhbm5lbENv
dW50ID0gY2hhbm5lbHNBcnJheS0+bGVuZ3RoKCk7IGNoYW5uZWxJbmRleCA8IGNoYW5uZWxDb3Vu
dDsgKytjaGFubmVsSW5kZXgpCisgICAgICAgICAgICBhcHBseShidXNJbmRleCwgY2hhbm5lbElu
ZGV4LCAqanNDYXN0PEpTRmxvYXQzMkFycmF5Kj4oY2hhbm5lbHNBcnJheS0+Z2V0SW5kZXgoJmds
b2JhbE9iamVjdCwgY2hhbm5lbEluZGV4KSkpOworICAgIH0KK30KKwogc3RhdGljIEpTRmxvYXQz
MkFycmF5KiBjb25zdHJ1Y3RKU0Zsb2F0MzJBcnJheShKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2Jq
ZWN0LCB1bnNpZ25lZCBsZW5ndGgsIGNvbnN0IGZsb2F0KiBkYXRhID0gbnVsbHB0cikKIHsKICAg
ICBhdXRvKiBqc0FycmF5ID0gSlNGbG9hdDMyQXJyYXk6OmNyZWF0ZSgmZ2xvYmFsT2JqZWN0LCBn
bG9iYWxPYmplY3QudHlwZWRBcnJheVN0cnVjdHVyZShUeXBlRmxvYXQzMiksIGxlbmd0aCk7CkBA
IC03MCw5ICs5OSwxMSBAQCBzdGF0aWMgSlNPYmplY3QqIGNvbnN0cnVjdEZyb3plbktleVZhbHVl
T2JqZWN0KFZNJiB2bSwgSlNHbG9iYWxPYmplY3QmIGdsb2JhbE9iagogfQogCiBlbnVtIGNsYXNz
IFNob3VsZFBvcHVsYXRlV2l0aEJ1c0RhdGEgOiBib29sIHsgTm8sIFllcyB9Owotc3RhdGljIEpT
QXJyYXkqIGNvbnN0cnVjdEZyb3plbkpTQXJyYXkoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCYgZ2xv
YmFsT2JqZWN0LCBKU0M6OlRocm93U2NvcGUmIHNjb3BlLCBBdWRpb0J1cyogYnVzLCBTaG91bGRQ
b3B1bGF0ZVdpdGhCdXNEYXRhIHNob3VsZFBvcHVsYXRlV2l0aEJ1c0RhdGEpCisKK3RlbXBsYXRl
IDx0eXBlbmFtZSBUPgorc3RhdGljIEpTQXJyYXkqIGNvbnN0cnVjdEZyb3plbkpTQXJyYXkoVk0m
IHZtLCBKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBKU0M6OlRocm93U2NvcGUmIHNjb3Bl
LCBjb25zdCBUJiBidXMsIFNob3VsZFBvcHVsYXRlV2l0aEJ1c0RhdGEgc2hvdWxkUG9wdWxhdGVX
aXRoQnVzRGF0YSkKIHsKLSAgICB1bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzID0gYnVzID8gYnVz
LT5udW1iZXJPZkNoYW5uZWxzKCkgOiAwOworICAgIHVuc2lnbmVkIG51bWJlck9mQ2hhbm5lbHMg
PSBidXNDaGFubmVsQ291bnQoYnVzLmdldCgpKTsKICAgICBhdXRvKiBjaGFubmVsc0RhdGEgPSBK
U0FycmF5OjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdC5vcmlnaW5hbEFycmF5U3RydWN0dXJlRm9y
SW5kZXhpbmdUeXBlKEFycmF5V2l0aENvbnRpZ3VvdXMpLCBudW1iZXJPZkNoYW5uZWxzKTsKICAg
ICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgbnVtYmVyT2ZDaGFubmVsczsgKytqKSB7CiAgICAg
ICAgIGF1dG8qIGNoYW5uZWwgPSBidXMtPmNoYW5uZWwoaik7CkBAIC04OSwxMyArMTIwLDEzIEBA
IHN0YXRpYyBKU0FycmF5KiBjb25zdHJ1Y3RGcm96ZW5KU0FycmF5KFZNJiB2bSwgSlNHbG9iYWxP
YmplY3QmIGdsb2JhbE9iamVjdCwgY29uCiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1df
U0NPUEUodm0pOwogICAgIGF1dG8qIGFycmF5ID0gSlNBcnJheTo6Y3JlYXRlKHZtLCBnbG9iYWxP
YmplY3Qub3JpZ2luYWxBcnJheVN0cnVjdHVyZUZvckluZGV4aW5nVHlwZShBcnJheVdpdGhDb250
aWd1b3VzKSwgYnVzZXMuc2l6ZSgpKTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYnVz
ZXMuc2l6ZSgpOyArK2kpCi0gICAgICAgIGFycmF5LT5zZXRJbmRleFF1aWNrbHkodm0sIGksIGNv
bnN0cnVjdEZyb3plbkpTQXJyYXkodm0sIGdsb2JhbE9iamVjdCwgc2NvcGUsIFdURjo6Z2V0UHRy
KGJ1c2VzW2ldKSwgc2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YSkpOworICAgICAgICBhcnJheS0+
c2V0SW5kZXhRdWlja2x5KHZtLCBpLCBjb25zdHJ1Y3RGcm96ZW5KU0FycmF5KHZtLCBnbG9iYWxP
YmplY3QsIHNjb3BlLCBidXNlc1tpXSwgc2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YSkpOwogICAg
IEpTQzo6b2JqZWN0Q29uc3RydWN0b3JGcmVlemUoJmdsb2JhbE9iamVjdCwgYXJyYXkpOwogICAg
IEVYQ0VQVElPTl9BU1NFUlQoIXNjb3BlLmV4Y2VwdGlvbigpKTsKICAgICByZXR1cm4gYXJyYXk7
CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlEYXRhRnJvbUpTQXJyYXlUb0J1c2VzKEpTR2xvYmFsT2Jq
ZWN0JiBnbG9iYWxPYmplY3QsIEpTQXJyYXkmIGpzQXJyYXksIFZlY3RvcjxSZWY8QXVkaW9CdXM+
PiYgYnVzZXMpCitzdGF0aWMgdm9pZCBjb3B5RGF0YUZyb21KU0FycmF5VG9CdXNlcyhKU0dsb2Jh
bE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBjb25zdCBKU0FycmF5JiBqc0FycmF5LCBWZWN0b3I8UmVm
PEF1ZGlvQnVzPj4mIGJ1c2VzKQogewogICAgIC8vIFdlIGNhbiBzYWZlbHkgbWFrZSBhc3N1bXB0
aW9ucyBhYm91dCB0aGUgc3RydWN0dXJlIG9mIHRoZSBKU0FycmF5IHNpbmNlIHdlIHVzZSBmcm96
ZW4gYXJyYXlzLgogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBidXNlcy5zaXplKCk7ICsr
aSkgewpAQCAtMTEyLDYgKzE0Myw3MiBAQCBzdGF0aWMgdm9pZCBjb3B5RGF0YUZyb21KU0FycmF5
VG9CdXNlcyhKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBKU0FycmF5JiBqcwogICAgIH0K
IH0KIAorc3RhdGljIHZvaWQgY29weURhdGFGcm9tQnVzZXNUb0pTQXJyYXkoSlNHbG9iYWxPYmpl
Y3QmIGdsb2JhbE9iamVjdCwgY29uc3QgVmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+JiBidXNlcywg
SlNBcnJheSYganNBcnJheSkKK3sKKyAgICBmb3JFYWNoQ2hhbm5lbERhdGFKU0FycmF5KGdsb2Jh
bE9iamVjdCwganNBcnJheSwgWyZdKHVuc2lnbmVkIGJ1c0luZGV4LCB1bnNpZ25lZCBjaGFubmVs
SW5kZXgsIEpTRmxvYXQzMkFycmF5JiBjaGFubmVsRGF0YSkgeworICAgICAgICBhdXRvKiBjaGFu
bmVsID0gYnVzZXNbYnVzSW5kZXhdLT5jaGFubmVsKGNoYW5uZWxJbmRleCk7CisgICAgICAgIEFT
U0VSVChjaGFubmVsRGF0YS5sZW5ndGgoKSA9PSBjaGFubmVsLT5sZW5ndGgoKSk7CisgICAgICAg
IG1lbWNweShjaGFubmVsRGF0YS50eXBlZFZlY3RvcigpLCBjaGFubmVsLT5tdXRhYmxlRGF0YSgp
LCBzaXplb2YoZmxvYXQpICogY2hhbm5lbC0+bGVuZ3RoKCkpOworICAgIH0pOworfQorCitzdGF0
aWMgdm9pZCBjb3B5RGF0YUZyb21QYXJhbWV0ZXJNYXBUb0pTT2JqZWN0KFZNJiB2bSwgSlNHbG9i
YWxPYmplY3QmIGdsb2JhbE9iamVjdCwgY29uc3QgSGFzaE1hcDxTdHJpbmcsIHN0ZDo6dW5pcXVl
X3B0cjxBdWRpb0Zsb2F0QXJyYXk+PiYgcGFyYW1WYWx1ZXNNYXAsIEpTT2JqZWN0JiBqc09iamVj
dCkKK3sKKyAgICBmb3IgKGF1dG8mIHBhaXIgOiBwYXJhbVZhbHVlc01hcCkgeworICAgICAgICBh
dXRvKiBqc1R5cGVkQXJyYXkgPSBqc0Nhc3Q8SlNGbG9hdDMyQXJyYXkqPihqc09iamVjdC5nZXQo
Jmdsb2JhbE9iamVjdCwgSWRlbnRpZmllcjo6ZnJvbVN0cmluZyh2bSwgcGFpci5rZXkpKSk7Cisg
ICAgICAgIEFTU0VSVChwYWlyLnZhbHVlLT5zaXplKCkgPj0ganNUeXBlZEFycmF5LT5sZW5ndGgo
KSk7CisgICAgICAgIG1lbWNweShqc1R5cGVkQXJyYXktPnR5cGVkVmVjdG9yKCksIHBhaXIudmFs
dWUtPmRhdGEoKSwgc2l6ZW9mKGZsb2F0KSAqIGpzVHlwZWRBcnJheS0+bGVuZ3RoKCkpOworICAg
IH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBib29sIGJ1c1RvcG9sb2d5TWF0
Y2hlc0pTQXJyYXkoSlNHbG9iYWxPYmplY3QmIGdsb2JhbE9iamVjdCwgY29uc3QgVmVjdG9yPFQ+
JiBidXNlcywgSlNBcnJheSoganNBcnJheSkKK3sKKyAgICBpZiAoIWpzQXJyYXkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoanNBcnJheS0+bGVuZ3Ro
KCkgPT0gYnVzZXMuc2l6ZSgpLCAiTnVtYmVyIG9mIGlucHV0cy9vdXRwdXRzIGNhbm5vdCBjaGFu
Z2UgYWZ0ZXIgY29uc3RydWN0aW9uIik7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
YnVzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgYXV0byYgYnVzID0gYnVzZXNbaV07CisgICAg
ICAgIGF1dG8qIGNoYW5uZWxzQXJyYXkgPSBqc0Nhc3Q8SlNBcnJheSo+KGpzQXJyYXktPmdldElu
ZGV4KCZnbG9iYWxPYmplY3QsIGkpKTsKKyAgICAgICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVs
cyA9IGJ1c0NoYW5uZWxDb3VudChidXMuZ2V0KCkpOworICAgICAgICBpZiAoY2hhbm5lbHNBcnJh
eS0+bGVuZ3RoKCkgIT0gbnVtYmVyT2ZDaGFubmVscykKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgbnVtYmVyT2ZDaGFubmVsczsg
KytqKSB7CisgICAgICAgICAgICBhdXRvKiBjaGFubmVsID0gYnVzLT5jaGFubmVsKGopOworICAg
ICAgICAgICAgYXV0byoganNDaGFubmVsRGF0YSA9IGpzQ2FzdDxKU0Zsb2F0MzJBcnJheSo+KGNo
YW5uZWxzQXJyYXktPmdldEluZGV4KCZnbG9iYWxPYmplY3QsIGopKTsKKyAgICAgICAgICAgIGlm
IChqc0NoYW5uZWxEYXRhLT5sZW5ndGgoKSAhPSBjaGFubmVsLT5sZW5ndGgoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworc3RhdGljIGJvb2wgcGFyYW1ldGVyTWFwVG9wb2xvZ3lNYXRjaGVzSlNPYmplY3Qo
Vk0mIHZtLCBKU0dsb2JhbE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBjb25zdCBIYXNoTWFwPFN0cmlu
Zywgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvRmxvYXRBcnJheT4+JiBwYXJhbVZhbHVlc01hcCwgSlNP
YmplY3QqIGpzT2JqZWN0KQoreworICAgIGlmICghanNPYmplY3QpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIGZvciAoYXV0byYgcGFpciA6IHBhcmFtVmFsdWVzTWFwKSB7CisgICAgICAg
IGF1dG8qIGpzVHlwZWRBcnJheSA9IGpzQ2FzdDxKU0Zsb2F0MzJBcnJheSo+KGpzT2JqZWN0LT5n
ZXQoJmdsb2JhbE9iamVjdCwgSWRlbnRpZmllcjo6ZnJvbVN0cmluZyh2bSwgcGFpci5rZXkpKSk7
CisgICAgICAgIHVuc2lnbmVkIGV4cGVjdGVkTGVuZ3RoID0gcGFpci52YWx1ZS0+Y29udGFpbnND
b25zdGFudFZhbHVlKCkgPyAxIDogcGFpci52YWx1ZS0+c2l6ZSgpOworICAgICAgICBpZiAoanNU
eXBlZEFycmF5LT5sZW5ndGgoKSAhPSBleHBlY3RlZExlbmd0aCkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgemVy
b0pTQXJyYXkoSlNHbG9iYWxPYmplY3QmIGdsb2JhbE9iamVjdCwgSlNBcnJheSYganNBcnJheSkK
K3sKKyAgICBmb3JFYWNoQ2hhbm5lbERhdGFKU0FycmF5KGdsb2JhbE9iamVjdCwganNBcnJheSwg
W10odW5zaWduZWQsIHVuc2lnbmVkLCBKU0Zsb2F0MzJBcnJheSYgY2hhbm5lbERhdGEpIHsKKyAg
ICAgICAgbWVtc2V0KGNoYW5uZWxEYXRhLnR5cGVkVmVjdG9yKCksIDAsIHNpemVvZihmbG9hdCkg
KiBjaGFubmVsRGF0YS5sZW5ndGgoKSk7CisgICAgfSk7Cit9CisKIEV4Y2VwdGlvbk9yPFJlZjxB
dWRpb1dvcmtsZXRQcm9jZXNzb3I+PiBBdWRpb1dvcmtsZXRQcm9jZXNzb3I6OmNyZWF0ZShTY3Jp
cHRFeGVjdXRpb25Db250ZXh0JiBjb250ZXh0KQogewogICAgIGF1dG8gY29uc3RydWN0aW9uRGF0
YSA9IGRvd25jYXN0PEF1ZGlvV29ya2xldEdsb2JhbFNjb3BlPihjb250ZXh0KS50YWtlUGVuZGlu
Z1Byb2Nlc3NvckNvbnN0cnVjdGlvbkRhdGEoKTsKQEAgLTEzMCw2ICsyMjcsMjggQEAgQXVkaW9X
b3JrbGV0UHJvY2Vzc29yOjpBdWRpb1dvcmtsZXRQcm9jZXNzb3IoY29uc3QgQXVkaW9Xb3JrbGV0
UHJvY2Vzc29yQ29uc3RydWMKICAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKIH0KIAordm9p
ZCBBdWRpb1dvcmtsZXRQcm9jZXNzb3I6OmJ1aWxkSlNBcmd1bWVudHMoVk0mIHZtLCBKU0dsb2Jh
bE9iamVjdCYgZ2xvYmFsT2JqZWN0LCBNYXJrZWRBcmd1bWVudEJ1ZmZlciYgYXJncywgY29uc3Qg
VmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+JiBpbnB1dHMsIFZlY3RvcjxSZWY8QXVkaW9CdXM+PiYg
b3V0cHV0cywgY29uc3QgSGFzaE1hcDxTdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb0Zsb2F0
QXJyYXk+PiYgcGFyYW1WYWx1ZXNNYXApCit7CisgICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNv
bnMsIHdlIGNhY2hlIHRoZSBhcnJheXMgcGFzc2VkIHRvIEpTIGFuZCByZWNvbnN0cnVjdCB0aGVt
IG9ubHkgd2hlbiB0aGUgdG9wb2xvZ3kgY2hhbmdlcy4KKyAgICBpZiAoYnVzVG9wb2xvZ3lNYXRj
aGVzSlNBcnJheShnbG9iYWxPYmplY3QsIGlucHV0cywgdG9KU0FycmF5KG1fanNJbnB1dHMpKSkK
KyAgICAgICAgY29weURhdGFGcm9tQnVzZXNUb0pTQXJyYXkoZ2xvYmFsT2JqZWN0LCBpbnB1dHMs
ICp0b0pTQXJyYXkobV9qc0lucHV0cykpOworICAgIGVsc2UKKyAgICAgICAgbV9qc0lucHV0cyA9
IHsgY29uc3RydWN0RnJvemVuSlNBcnJheSh2bSwgZ2xvYmFsT2JqZWN0LCBpbnB1dHMsIFNob3Vs
ZFBvcHVsYXRlV2l0aEJ1c0RhdGE6OlllcykgfTsKKyAgICBhcmdzLmFwcGVuZChtX2pzSW5wdXRz
KTsKKworICAgIGlmIChidXNUb3BvbG9neU1hdGNoZXNKU0FycmF5KGdsb2JhbE9iamVjdCwgb3V0
cHV0cywgdG9KU0FycmF5KG1fanNPdXRwdXRzKSkpCisgICAgICAgIHplcm9KU0FycmF5KGdsb2Jh
bE9iamVjdCwgKnRvSlNBcnJheShtX2pzT3V0cHV0cykpOworICAgIGVsc2UKKyAgICAgICAgbV9q
c091dHB1dHMgPSB7IGNvbnN0cnVjdEZyb3plbkpTQXJyYXkodm0sIGdsb2JhbE9iamVjdCwgb3V0
cHV0cywgU2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YTo6Tm8pIH07CisgICAgYXJncy5hcHBlbmQo
bV9qc091dHB1dHMpOworCisgICAgaWYgKHBhcmFtZXRlck1hcFRvcG9sb2d5TWF0Y2hlc0pTT2Jq
ZWN0KHZtLCBnbG9iYWxPYmplY3QsIHBhcmFtVmFsdWVzTWFwLCB0b0pTT2JqZWN0KG1fanNQYXJh
bVZhbHVlcykpKQorICAgICAgICBjb3B5RGF0YUZyb21QYXJhbWV0ZXJNYXBUb0pTT2JqZWN0KHZt
LCBnbG9iYWxPYmplY3QsIHBhcmFtVmFsdWVzTWFwLCAqdG9KU09iamVjdChtX2pzUGFyYW1WYWx1
ZXMpKTsKKyAgICBlbHNlCisgICAgICAgIG1fanNQYXJhbVZhbHVlcyA9IHsgY29uc3RydWN0RnJv
emVuS2V5VmFsdWVPYmplY3Qodm0sIGdsb2JhbE9iamVjdCwgcGFyYW1WYWx1ZXNNYXApIH07Cisg
ICAgYXJncy5hcHBlbmQobV9qc1BhcmFtVmFsdWVzKTsKK30KKwogYm9vbCBBdWRpb1dvcmtsZXRQ
cm9jZXNzb3I6OnByb2Nlc3MoY29uc3QgVmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+JiBpbnB1dHMs
IFZlY3RvcjxSZWY8QXVkaW9CdXM+PiYgb3V0cHV0cywgY29uc3QgSGFzaE1hcDxTdHJpbmcsIHN0
ZDo6dW5pcXVlX3B0cjxBdWRpb0Zsb2F0QXJyYXk+PiYgcGFyYW1WYWx1ZXNNYXAsIGJvb2wmIHRo
cmV3RXhjZXB0aW9uKQogewogICAgIEFTU0VSVChtX3Byb2Nlc3NDYWxsYmFjayk7CkBAIC0xNDEs
MTIgKzI2MCw3IEBAIGJvb2wgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yOjpwcm9jZXNzKGNvbnN0IFZl
Y3RvcjxSZWZQdHI8QXVkaW9CdXM+PiYgaW5wdXRzLCBWZWN0CiAgICAgSlNMb2NrSG9sZGVyIGxv
Y2sodm0pOwogCiAgICAgTWFya2VkQXJndW1lbnRCdWZmZXIgYXJnczsKLSAgICAvLyBGSVhNRTog
V2Ugc2hvdWxkIGNvbnNpZGVyIGNhY2hpbmcgdGhlIEpTQXJyYXlzICYgSlNPYmplY3QgYW5kIG9u
bHkgdXBkYXRlIHRoZWlyIGl0ZW1zCi0gICAgLy8gZXZlcnkgdGltZSBwcm9jZXNzKCkgaXMgY2Fs
bGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLSAgICBhcmdzLmFwcGVuZChjb25zdHJ1Y3RG
cm96ZW5KU0FycmF5KHZtLCBnbG9iYWxPYmplY3QsIGlucHV0cywgU2hvdWxkUG9wdWxhdGVXaXRo
QnVzRGF0YTo6WWVzKSk7Ci0gICAgYXV0byogb3VwdXRKU0FycmF5ID0gY29uc3RydWN0RnJvemVu
SlNBcnJheSh2bSwgZ2xvYmFsT2JqZWN0LCBvdXRwdXRzLCBTaG91bGRQb3B1bGF0ZVdpdGhCdXNE
YXRhOjpObyk7Ci0gICAgYXJncy5hcHBlbmQob3VwdXRKU0FycmF5KTsKLSAgICBhcmdzLmFwcGVu
ZChjb25zdHJ1Y3RGcm96ZW5LZXlWYWx1ZU9iamVjdCh2bSwgZ2xvYmFsT2JqZWN0LCBwYXJhbVZh
bHVlc01hcCkpOworICAgIGJ1aWxkSlNBcmd1bWVudHModm0sIGdsb2JhbE9iamVjdCwgYXJncywg
aW5wdXRzLCBvdXRwdXRzLCBwYXJhbVZhbHVlc01hcCk7CiAKICAgICBOYWtlZFB0cjxKU0M6OkV4
Y2VwdGlvbj4gcmV0dXJuZWRFeGNlcHRpb247CiAgICAgYXV0byByZXN1bHQgPSBtX3Byb2Nlc3ND
YWxsYmFjay0+aW52b2tlQ2FsbGJhY2soanNVbmRlZmluZWQoKSwgYXJncywgSlNDYWxsYmFja0Rh
dGE6OkNhbGxiYWNrVHlwZTo6T2JqZWN0LCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKHZtLCAicHJv
Y2VzcyIpLCByZXR1cm5lZEV4Y2VwdGlvbik7CkBAIC0xNTYsNyArMjcwLDcgQEAgYm9vbCBBdWRp
b1dvcmtsZXRQcm9jZXNzb3I6OnByb2Nlc3MoY29uc3QgVmVjdG9yPFJlZlB0cjxBdWRpb0J1cz4+
JiBpbnB1dHMsIFZlY3QKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGNvcHlE
YXRhRnJvbUpTQXJyYXlUb0J1c2VzKGdsb2JhbE9iamVjdCwgKm91cHV0SlNBcnJheSwgb3V0cHV0
cyk7CisgICAgY29weURhdGFGcm9tSlNBcnJheVRvQnVzZXMoZ2xvYmFsT2JqZWN0LCAqdG9KU0Fy
cmF5KG1fanNPdXRwdXRzKSwgb3V0cHV0cyk7CiAKICAgICByZXR1cm4gcmVzdWx0LnRvQm9vbGVh
bigmZ2xvYmFsT2JqZWN0KTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMv
d2ViYXVkaW8vQXVkaW9Xb3JrbGV0UHJvY2Vzc29yLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5oCmluZGV4IDdiMzhmZjIxNWMxNGE2Yzk1
MWNmYTc5NGYyOGY3OTIwNjE2OTYzYjAuLjc5YjUzZDBjMDZhZmUwYTRmZDZkM2M4NzNmNDQ0NmZl
OTM0MzNiM2UgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVk
aW9Xb3JrbGV0UHJvY2Vzc29yLmgKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRp
by9BdWRpb1dvcmtsZXRQcm9jZXNzb3IuaApAQCAtMzEsMTAgKzMxLDE2IEBACiAjaWYgRU5BQkxF
KFdFQl9BVURJTykKICNpbmNsdWRlICJBdWRpb0FycmF5LmgiCiAjaW5jbHVkZSAiRXhjZXB0aW9u
T3IuaCIKKyNpbmNsdWRlICJKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0LmgiCiAjaW5jbHVkZSA8d3Rm
L0ZvcndhcmQuaD4KICNpbmNsdWRlIDx3dGYvUmVmLmg+CiAjaW5jbHVkZSA8d3RmL1RocmVhZFNh
ZmVSZWZDb3VudGVkLmg+CiAKK25hbWVzcGFjZSBKU0MgeworY2xhc3MgSlNBcnJheTsKK2NsYXNz
IE1hcmtlZEFyZ3VtZW50QnVmZmVyOworfQorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNz
IEF1ZGlvQnVzOwpAQCAtNTUsMTIgKzYxLDIwIEBAIHB1YmxpYzoKIAogICAgIHZvaWQgc2V0UHJv
Y2Vzc0NhbGxiYWNrKHN0ZDo6dW5pcXVlX3B0cjxKU0NhbGxiYWNrRGF0YVN0cm9uZz4mJik7CiAK
KyAgICBKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0JiBqc0lucHV0c1dyYXBwZXIoKSB7IHJldHVybiBt
X2pzSW5wdXRzOyB9CisgICAgSlNWYWx1ZUluV3JhcHBlZE9iamVjdCYganNPdXRwdXRzV3JhcHBl
cigpIHsgcmV0dXJuIG1fanNPdXRwdXRzOyB9CisgICAgSlNWYWx1ZUluV3JhcHBlZE9iamVjdCYg
anNQYXJhbVZhbHVlc1dyYXBwZXIoKSB7IHJldHVybiBtX2pzUGFyYW1WYWx1ZXM7IH0KKwogcHJp
dmF0ZToKICAgICBleHBsaWNpdCBBdWRpb1dvcmtsZXRQcm9jZXNzb3IoY29uc3QgQXVkaW9Xb3Jr
bGV0UHJvY2Vzc29yQ29uc3RydWN0aW9uRGF0YSYpOworICAgIHZvaWQgYnVpbGRKU0FyZ3VtZW50
cyhKU0M6OlZNJiwgSlNDOjpKU0dsb2JhbE9iamVjdCYsIEpTQzo6TWFya2VkQXJndW1lbnRCdWZm
ZXImLCBjb25zdCBWZWN0b3I8UmVmUHRyPEF1ZGlvQnVzPj4mIGlucHV0cywgVmVjdG9yPFJlZjxB
dWRpb0J1cz4+JiBvdXRwdXRzLCBjb25zdCBIYXNoTWFwPFN0cmluZywgc3RkOjp1bmlxdWVfcHRy
PEF1ZGlvRmxvYXRBcnJheT4+JiBwYXJhbVZhbHVlc01hcCk7CiAKICAgICBTdHJpbmcgbV9uYW1l
OwogICAgIFJlZjxNZXNzYWdlUG9ydD4gbV9wb3J0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxKU0Nh
bGxiYWNrRGF0YVN0cm9uZz4gbV9wcm9jZXNzQ2FsbGJhY2s7CisgICAgSlNWYWx1ZUluV3JhcHBl
ZE9iamVjdCBtX2pzSW5wdXRzOworICAgIEpTVmFsdWVJbldyYXBwZWRPYmplY3QgbV9qc091dHB1
dHM7CisgICAgSlNWYWx1ZUluV3JhcHBlZE9iamVjdCBtX2pzUGFyYW1WYWx1ZXM7CiB9OwogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5pZGwgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL3dlYmF1ZGlvL0F1ZGlvV29ya2xldFByb2Nlc3Nvci5pZGwKaW5kZXggZDI2NjEzMTcyMTkw
MWVjYjE3MzNmNWE2MTgwZGRmZTliNDRlNTViMy4uNzIxYzI5NzA2MTMyNDAxNzVhMmEzNGUzMmRl
ZTBlMmMyMzcxNjNlOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRp
by9BdWRpb1dvcmtsZXRQcm9jZXNzb3IuaWRsCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMv
d2ViYXVkaW8vQXVkaW9Xb3JrbGV0UHJvY2Vzc29yLmlkbApAQCAtMjksNyArMjksOCBAQAogWwog
ICAgIENvbmRpdGlvbmFsPVdFQl9BVURJTywKICAgICBFeHBvc2VkPUF1ZGlvV29ya2xldCwKLSAg
ICBJbXBsZW1lbnRhdGlvbkxhY2tzVlRhYmxlCisgICAgSW1wbGVtZW50YXRpb25MYWNrc1ZUYWJs
ZSwKKyAgICBKU0N1c3RvbU1hcmtGdW5jdGlvbgogXSBpbnRlcmZhY2UgQXVkaW9Xb3JrbGV0UHJv
Y2Vzc29yIHsKICAgICBbQ2FsbFdpdGg9U2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgTWF5VGhyb3dF
eGNlcHRpb25dIGNvbnN0cnVjdG9yKCk7CiAgICAgcmVhZG9ubHkgYXR0cmlidXRlIE1lc3NhZ2VQ
b3J0IHBvcnQ7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dCBiL1NvdXJj
ZS9XZWJDb3JlL1NvdXJjZXMudHh0CmluZGV4IDk2NWFkYzEzMGYxZGY0MzY1YjA4Mjk5ZDI2NmQ2
OGY5ZmNmODFiMWQuLmRmMjMwYzJhYzBhODE5NDVjMTZmZTFiYWRjYjllZGZiNmZhYzM3N2MgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CisrKyBiL1NvdXJjZS9XZWJDb3Jl
L1NvdXJjZXMudHh0CkBAIC00NzIsNiArNDcyLDcgQEAgYmluZGluZ3MvanMvSlNBbmltYXRpb25U
aW1lbGluZUN1c3RvbS5jcHAKIGJpbmRpbmdzL2pzL0pTQXR0ckN1c3RvbS5jcHAKIGJpbmRpbmdz
L2pzL0pTQXVkaW9UcmFja0N1c3RvbS5jcHAKIGJpbmRpbmdzL2pzL0pTQXVkaW9UcmFja0xpc3RD
dXN0b20uY3BwCitiaW5kaW5ncy9qcy9KU0F1ZGlvV29ya2xldFByb2Nlc3NvckN1c3RvbS5jcHAK
IGJpbmRpbmdzL2pzL0pTQXV0aGVudGljYXRvclJlc3BvbnNlQ3VzdG9tLmNwcAogYmluZGluZ3Mv
anMvSlNCYXNpY0NyZWRlbnRpYWxDdXN0b20uY3BwCiBiaW5kaW5ncy9qcy9KU0Jsb2JDdXN0b20u
Y3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKaW5kZXggNGMwNzU3ODA5NmY0NmNmYTE3YzQ4MGYzMzUzNWQ3ZTNjNDhhOTliZC4uMWYxNTE3
NTVjMThlY2Q5M2ZlNWFjNThlZDg4NmE2YmNjMjkzODgxMiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMTA4MzUsNiArMTA4MzUs
NyBAQAogCQk4M0VFNTk4QzFGNTA5NThCMDAzRThCMzAgLyogSlNFcnJvckNhbGxiYWNrLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTRXJyb3JDYWxsYmFjay5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTgzRjI4QkZEMjREQjFERDMwMDVCQTZGNiAv
KiBDb252b2x2ZXJPcHRpb25zLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvbnZvbHZlck9wdGlvbnMuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODNGMjhCRkYyNERCMURENDAwNUJBNkY2IC8q
IENvbnZvbHZlck9wdGlvbnMuaWRsICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RL
bm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IENvbnZvbHZlck9wdGlvbnMuaWRsOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OworCQk4M0YzN0E2NzI1MzZCMjFCMDBGRjVGM0IgLyogSlNBdWRp
b1dvcmtsZXRQcm9jZXNzb3JDdXN0b20uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNBdWRpb1dv
cmtsZXRQcm9jZXNzb3JDdXN0b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4
M0Y1NzBBRDFDNTMyNjhFMDA3RkQ2Q0IgLyogSlNYTUxEb2N1bWVudC5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBKU1hNTERvY3VtZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTgzRjU3MEFFMUM1MzI2OEUwMDdGRDZDQiAvKiBKU1hNTERvY3VtZW50LmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTWE1MRG9jdW1lbnQuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4M0Y1NzI5NDFGQTEwNjZGMDAzODM3QkUgLyog
SlNTZXJ2aWNlV29ya2VyQ2xpZW50Q3VzdG9tLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IEpTU2VydmljZVdvcmtlckNsaWVudEN1c3RvbS5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CkBAIC0yMjIyNyw2ICsyMjIyOCw3IEBACiAJCQkJNDEwNjI2QTcyMjgw
QTIyQTAwNkQxQjU5IC8qIEpTQXVkaW9Ob2RlQ3VzdG9tLmNwcCAqLywKIAkJCQlCRTZERjcwRTE3
MUNBMkRBMDBERDUyQjggLyogSlNBdWRpb1RyYWNrQ3VzdG9tLmNwcCAqLywKIAkJCQlCRTZERjcx
MDE3MUNBMkRBMDBERDUyQjggLyogSlNBdWRpb1RyYWNrTGlzdEN1c3RvbS5jcHAgKi8sCisJCQkJ
ODNGMzdBNjcyNTM2QjIxQjAwRkY1RjNCIC8qIEpTQXVkaW9Xb3JrbGV0UHJvY2Vzc29yQ3VzdG9t
LmNwcCAqLywKIAkJCQk1NzYwODI1NjIwMTFCRTAyMDAxMTY2NzggLyogSlNBdXRoZW50aWNhdG9y
UmVzcG9uc2VDdXN0b20uY3BwICovLAogCQkJCTU3NjA4MjRGMjAxMThEOEQwMDExNjY3OCAvKiBK
U0Jhc2ljQ3JlZGVudGlhbEN1c3RvbS5jcHAgKi8sCiAJCQkJODkzMURFNUExNEM0NEM0NDAwMERD
OUQyIC8qIEpTQmxvYkN1c3RvbS5jcHAgKi8sCkBAIC0zMDY1NCw3ICszMDY1Niw2IEBACiAJCQkJ
NTE3NDFEMEYwQjA3MjU5QTAwRUQ0NDJDIC8qIEJhY2tGb3J3YXJkQ2xpZW50LmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCQ0E4QzgxRTExRTNEMzY5MDA4MTJGQjcgLyogQmFja0ZvcndhcmRDb250cm9s
bGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk1MUExQjg3RDIwODdDNEMwMDA5NzlBNzUgLyogQmFj
a0ZvcndhcmRJdGVtSWRlbnRpZmllci5oIGluIEhlYWRlcnMgKi8sCi0JCQkJMEY5NDcyMTcyNTMy
M0MyMTAwRjE1M0M4IC8qIEJhY2tncm91bmRJbWFnZUdlb21ldHJ5LmggaW4gSGVhZGVycyAqLywK
IAkJCQlCQzEyNEVFODBDMjY0MUNEMDA5RTIzNDkgLyogQmFyUHJvcC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJNDYwQkI2MTYxRDBBMUJGMDAwMjIxODEyIC8qIEJhc2U2NFV0aWxpdGllcy5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJODMxOThGQkYyNEExNjBERDAwNDIwQjA1IC8qIEJhc2VBdWRpb0NvbnRl
eHQuaCBpbiBIZWFkZXJzICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
anMvSlNBdWRpb1dvcmtsZXRQcm9jZXNzb3JDdXN0b20uY3BwIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3MvanMvSlNBdWRpb1dvcmtsZXRQcm9jZXNzb3JDdXN0b20uY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmUz
ZTdmMDY2MWU3NDJiMzI1OTVhMTM4NjExNTc5ZmMxOGFlYWU1ZWYKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0F1ZGlvV29ya2xldFByb2Nlc3NvckN1c3Rv
bS5jcHAKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJKU0F1ZGlvV29ya2xldFByb2Nlc3Nvci5oIgorCisjaWYgRU5BQkxFKFdFQl9B
VURJTykKKworbmFtZXNwYWNlIFdlYkNvcmUgewordXNpbmcgbmFtZXNwYWNlIEpTQzsKKwordm9p
ZCBKU0F1ZGlvV29ya2xldFByb2Nlc3Nvcjo6dmlzaXRBZGRpdGlvbmFsQ2hpbGRyZW4oU2xvdFZp
c2l0b3ImIHZpc2l0b3IpCit7CisgICAgYXV0byYgcHJvY2Vzc29yID0gd3JhcHBlZCgpOworICAg
IHByb2Nlc3Nvci5qc0lucHV0c1dyYXBwZXIoKS52aXNpdCh2aXNpdG9yKTsKKyAgICBwcm9jZXNz
b3IuanNPdXRwdXRzV3JhcHBlcigpLnZpc2l0KHZpc2l0b3IpOworICAgIHByb2Nlc3Nvci5qc1Bh
cmFtVmFsdWVzV3JhcHBlcigpLnZpc2l0KHZpc2l0b3IpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>