<?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>177887</bug_id>
          
          <creation_ts>2017-10-04 11:20:36 -0700</creation_ts>
          <short_desc>WebAssembly: address no VM / JS follow-ups</short_desc>
          <delta_ts>2017-10-19 21:20: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>WebAssembly</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>177473</dup_id>
          
          <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>
          <dependson>177473</dependson>
    
    <dependson>178031</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="JF Bastien">jfbastien</reporter>
          <assigned_to name="JF Bastien">jfbastien</assigned_to>
          <cc>buildbot</cc>
    
    <cc>commit-queue</cc>
    
    <cc>jfbastien</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1356526</commentid>
    <comment_count>0</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2017-10-04 11:20:36 -0700</bug_when>
    <thetext>Saam had comments in #177473 which I hadn&apos;t addressed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356585</commentid>
    <comment_count>1</comment_count>
      <attachid>322703</attachid>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2017-10-04 12:33:56 -0700</bug_when>
    <thetext>Created attachment 322703
patch

(In reply to Saam Barati from comment #30)
&gt; Comment on attachment 322103 [details]
&gt;
&gt; My meta comment here is I think this patch would be a lot easier to review
&gt; if you had split it up.

Agreed, will do so next time.


&gt; &gt; Source/JavaScriptCore/ChangeLog:30
&gt; &gt; +            purpose: one to notify of memory pressure, and the other to ask for
&gt; 
&gt; what do you mean by memory pressure here?

When we allocate we can get told &quot;I found space, but it&apos;s getting tight here&quot;. There&apos;s a callback for that now, as well as one for &quot;I didn&apos;t find any space so sorry&quot;, and &quot;I got space, all is good&quot;.


&gt; &gt; Source/JavaScriptCore/ChangeLog:104
&gt; &gt; +            entrypoint. This triples the space allocated per instance&apos;s imported
&gt; &gt; +            function, but there shouldn&apos;t be that many imports. This has two upsides: it
&gt; 
&gt; Triples seems like a lot if there are a lot of these. I thought Emscripten
&gt; generates a *ton* of imports?

No, it&apos;s functions that it has a lot of. If you look at Epic Zen Garden it has:

     Type start=0x0000000e end=0x000024c7 (size=0x000024b9) count: 852
   Import start=0x000024cd end=0x000055cf (size=0x00003102) count: 443
 Function start=0x000055d5 end=0x00021257 (size=0x0001bc82) count: 111860
   Global start=0x0002125d end=0x00021290 (size=0x00000033) count: 10
   Export start=0x00021296 end=0x00024fc0 (size=0x00003d2a) count: 498
     Elem start=0x00024fc6 end=0x00080dd1 (size=0x0005be0b) count: 1
     Code start=0x00080dd7 end=0x01749ab3 (size=0x016c8cdc) count: 111860
     Data start=0x01749ab9 end=0x01d3f79c (size=0x005f5ce3) count: 8153
   Custom start=0x01d3f7a2 end=0x025ae17e (size=0x0086e9dc) &quot;name&quot;


&gt; &gt; Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp:388
&gt; &gt; +            // FIXME: Because WasmToWasm call clobbers wasmContextInstance register and does not restore it, we need to restore it in the caller side.
&gt; 
&gt; wasmContextInstance? Isn&apos;t that redundant? Ditto elsewhere you do this.

Indeed! Right now it&apos;s just weird but context is instance, and I wanted to make that obvious. I plan to fix it as a follow-up.


&gt; &gt; Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp:1206
&gt; &gt; +    // FIXME: when we have trap handlers, we can just let the call fail because Signature::invalidIndex is 0. https://bugs.webkit.org/show_bug.cgi?id=177210
&gt; 
&gt; How does this have anything to do with signature index? It seems like this
&gt; only has to do with the code pointer we load.

I&apos;m not sure I understand your question. This bug just says that we don&apos;t need to do the zero check if we have trap handlers, we just need to detect that we jumped to whatever is in index entry zero (another zero presumably, or 0xc0defefe) from wasm JIT code and that&apos;s enough to know that the index was invalid.


&gt; &gt; Source/JavaScriptCore/wasm/WasmMemory.h:99
&gt; &gt; +    WTF::Function&lt;void()&gt; m_notifyMemoryPressure;
&gt; &gt; +    WTF::Function&lt;void()&gt; m_syncTryToReclaimMemory;
&gt; &gt; +    WTF::Function&lt;void(PageCount, PageCount)&gt; m_growSuccessCallback;
&gt; 
&gt; Do we really want to tie these to a Memory and not a call to grow()?

The call to grow doesn&apos;t know what the embedder is, but it necessarily knows the memory. That&apos;s why I want the memory to know: so I don&apos;t have to teach the code we generate. Even better: eventually we could share a memory between two embedders, and chain these callbacks (so you grow, and then both know what the new size is and update embedder-specific info).


&gt; &gt; Source/JavaScriptCore/wasm/WasmThunks.cpp:94
&gt; &gt; +    typedef void (*Run)(JSWebAssemblyInstance*, uint32_t);
&gt; &gt; +    Run run = OMGPlan::runForIndex;
&gt; 
&gt; Is this just for documenting the type?

Yeah it forces a type check. I had a bug here where I changed the signature, and the reinterpret_cast was none the wiser :-(


&gt; &gt;&gt; Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp:344
&gt; &gt;&gt; +                [&amp;vm, jsMemory] (Wasm::PageCount oldPageCount, Wasm::PageCount newPageCount) { jsMemory-&gt;growSuccessCallback(vm, oldPageCount, newPageCount); });
&gt; &gt; 
&gt; &gt; That&apos;s pretty cool!
&gt; &gt; 
&gt; &gt; The one downside is that it&apos;s hard to tell what each callback is for.  One way to make this easy to read is to introduce dummy enums for each WTF::Function:
&gt; &gt; 
&gt; &gt; enum NotifyLowMemory { NotifyLowMemoryTag }
&gt; &gt; enum SyncTryToReclaim { SyncTryToReclaimTag }
&gt; &gt; enum GrowMemory { GrowMemoryTag }
&gt; &gt; 
&gt; &gt; And then this would do:
&gt; &gt; 
&gt; &gt; RefPtr&lt;...&gt; memory = ...(...,
&gt; &gt;     [&amp;vm] (NotifyLowMemory) { vm.heap.collectAsync(...); },
&gt; &gt;     [&amp;vm] (SyncTryToRedlaim) ...
&gt; &gt; 
&gt; &gt; I don&apos;t feel strongly about it, but it might be nice.
&gt; 
&gt; Or you could just give all these lambdas names. That&apos;s usually what I do in
&gt; this situation. The nice thing about Fil&apos;s suggestion is the type checker
&gt; will catch a bug if you provide the wrong lambda.

Yeah I like the extra typecheck it gives.

&gt; &gt; Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h:82
&gt; &gt; +    ImportFunctionInfo* importFunctionInfo(size_t importFunctionNum) { return &amp;bitwise_cast&lt;ImportFunctionInfo*&gt;(bitwise_cast&lt;char*&gt;(this) + offsetOfTail())[importFunctionNum]; }
&gt; &gt; +    static size_t offsetOfTargetInstance(size_t importFunctionNum) { return offsetOfTail() + importFunctionNum * sizeof(ImportFunctionInfo) + OBJECT_OFFSETOF(ImportFunctionInfo, targetInstance); }
&gt; &gt; +    static size_t offsetOfWasmEntrypoint(size_t importFunctionNum) { return offsetOfTail() + importFunctionNum * sizeof(ImportFunctionInfo) + OBJECT_OFFSETOF(ImportFunctionInfo, wasmEntrypoint); }
&gt; &gt; +    static size_t offsetOfImportFunction(size_t importFunctionNum) { return offsetOfTail() + importFunctionNum * sizeof(ImportFunctionInfo) + OBJECT_OFFSETOF(ImportFunctionInfo, importFunction); }
&gt; &gt; +    JSObject* importFunction(unsigned importFunctionNum) { RELEASE_ASSERT(importFunctionNum &lt; m_numImportFunctions); return importFunctionInfo(importFunctionNum)-&gt;importFunction.get(); }
&gt; 
&gt; oh boy

That&apos;ll go away :)

&gt; &gt; Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.cpp:124
&gt; &gt; +const Wasm::ModuleInformation&amp; JSWebAssemblyModule::moduleInformation() const
&gt; &gt; +{
&gt; &gt; +    return m_module-&gt;moduleInformation();
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +SymbolTable* JSWebAssemblyModule::exportSymbolTable() const
&gt; &gt; +{
&gt; &gt; +    return m_exportSymbolTable.get();
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +Wasm::SignatureIndex JSWebAssemblyModule::signatureIndexFromFunctionIndexSpace(unsigned functionIndexSpace) const
&gt; &gt; +{
&gt; &gt; +    return m_module-&gt;signatureIndexFromFunctionIndexSpace(functionIndexSpace);
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +WebAssemblyToJSCallee* JSWebAssemblyModule::callee() const
&gt; &gt; +{
&gt; &gt; +    return m_callee.get();
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +JSWebAssemblyCodeBlock* JSWebAssemblyModule::codeBlock(Wasm::MemoryMode mode)
&gt; &gt; +{
&gt; &gt; +    return m_codeBlocks[static_cast&lt;size_t&gt;(mode)].get();
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +Wasm::Module&amp; JSWebAssemblyModule::module()
&gt; &gt; +{
&gt; &gt; +    return m_module.get();
&gt; &gt; +}
&gt; 
&gt; these all seem like the should be inlined. Are they only called from the cpp
&gt; file?

The problem is that JSWebAssemblyModule.h is included from WebCore for SerializedScriptValue.cpp, and I want to expose as few other headers as possible. Really I should have exported helpers that WebCore passes opaque pointers to, and hide all the details...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356616</commentid>
    <comment_count>2</comment_count>
      <attachid>322703</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-04 13:20:46 -0700</bug_when>
    <thetext>Comment on attachment 322703
patch

Clearing flags on attachment: 322703

Committed r222873: &lt;http://trac.webkit.org/changeset/222873&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356617</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-04 13:20:48 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356618</commentid>
    <comment_count>4</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-10-04 13:21:33 -0700</bug_when>
    <thetext>&lt;rdar://problem/34819035&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1357757</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-06 15:10:31 -0700</bug_when>
    <thetext>Re-opened since this is blocked by bug 178031</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362547</commentid>
    <comment_count>6</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2017-10-19 21:20:31 -0700</bug_when>
    <thetext>Fixed when re-comitting #177473.

*** This bug has been marked as a duplicate of bug 177473 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>322703</attachid>
            <date>2017-10-04 12:33:56 -0700</date>
            <delta_ts>2017-10-04 13:20:46 -0700</delta_ts>
            <desc>patch</desc>
            <filename>0001-WebAssembly-address-no-VM-JS-follow-ups.patch</filename>
            <type>text/plain</type>
            <size>12706</size>
            <attacher name="JF Bastien">jfbastien</attacher>
            
              <data encoding="base64">RnJvbSA2YTE4ZDA4MzgxZjEwMWVhOTBkNWQ5NzBhZmEyZDA4NTcwMmU3MTAxIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKRiBCYXN0aWVuIDxqZmJhc3RpZW5AYXBwbGUuY29tPgpEYXRl
OiBXZWQsIDQgT2N0IDIwMTcgMTI6MzM6MzIgLTA3MDAKU3ViamVjdDogW1BBVENIXSBXZWJBc3Nl
bWJseTogYWRkcmVzcyBubyBWTSAvIEpTIGZvbGxvdy11cHMKCi0tLQogU291cmNlL0phdmFTY3Jp
cHRDb3JlL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAgfCAyNSArKysrKysrKysrKysrKysr
KysrCiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAgICB8
IDI5ICsrKysrKysrKysrKy0tLS0tLS0tLS0KIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dh
c21Db250ZXh0LmNwcCAgICAgICAgIHwgIDYgKystLS0KIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93
YXNtL1dhc21NZW1vcnlNb2RlLmggICAgICAgIHwgIDQgKy0tCiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtVGFibGUuaCAgICAgICAgICAgICB8ICAzIC0tLQogLi4uL3dhc20vanMvSlNX
ZWJBc3NlbWJseUluc3RhbmNlLmNwcCAgICAgICAgICAgICAgfCAgMiArLQogLi4uL0phdmFTY3Jp
cHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseVRhYmxlLmNwcCAgfCAgNCArLS0KIDcgZmlsZXMg
Y2hhbmdlZCwgNDggaW5zZXJ0aW9ucygrKSwgMjUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv
U291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9D
aGFuZ2VMb2cKaW5kZXggMzRkN2MzMi4uYjk3OGQ2OSAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFT
Y3JpcHRDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9n
CkBAIC0xLDMgKzEsMjggQEAKKzIwMTctMTAtMDQgIEpGIEJhc3RpZW4gIDxqZmJhc3RpZW5AYXBw
bGUuY29tPgorCisgICAgICAgIFdlYkFzc2VtYmx5OiBhZGRyZXNzIG5vIFZNIC8gSlMgZm9sbG93
LXVwcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc3
ODg3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWxs
IG1pbm9yIGZpeGVzLCBubyBmdW5jdGlvbmFsIGNoYW5nZXMuCisKKyAgICAgICAgKiB3YXNtL1dh
c21CM0lSR2VuZXJhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6V2FzbTo6QjNJUkdlbmVyYXRvcjo6
QjNJUkdlbmVyYXRvcik6CisgICAgICAgIChKU0M6Oldhc206OkIzSVJHZW5lcmF0b3I6OnJlc3Rv
cmVXZWJBc3NlbWJseUdsb2JhbFN0YXRlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6QjNJUkdlbmVy
YXRvcjo6YWRkQ3VycmVudE1lbW9yeSk6CisgICAgICAgIChKU0M6Oldhc206OkIzSVJHZW5lcmF0
b3I6OmFkZENhbGwpOgorICAgICAgICAoSlNDOjpXYXNtOjpCM0lSR2VuZXJhdG9yOjphZGRDYWxs
SW5kaXJlY3QpOgorICAgICAgICAqIHdhc20vV2FzbUNvbnRleHQuY3BwOgorICAgICAgICAoSlND
OjpXYXNtOjpDb250ZXh0OjpzdG9yZSk6CisgICAgICAgICogd2FzbS9XYXNtTWVtb3J5TW9kZS5o
OgorICAgICAgICAqIHdhc20vV2FzbVRhYmxlLmg6CisgICAgICAgICogd2FzbS9qcy9KU1dlYkFz
c2VtYmx5SW5zdGFuY2UuY3BwOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5SW5zdGFuY2U6
OkpTV2ViQXNzZW1ibHlJbnN0YW5jZSk6CisgICAgICAgICogd2FzbS9qcy9KU1dlYkFzc2VtYmx5
VGFibGUuY3BwOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5VGFibGU6OkpTV2ViQXNzZW1i
bHlUYWJsZSk6CisgICAgICAgIChKU0M6OkpTV2ViQXNzZW1ibHlUYWJsZTo6Z3Jvdyk6CisKIDIw
MTctMTAtMDQgIENhcmxvcyBBbGJlcnRvIExvcGV6IFBlcmV6ICA8Y2xvcGV6QGlnYWxpYS5jb20+
CiAKICAgICAgICAgR2VuZXJhdGUgYSBjb21waWxlIGVycm9yIGlmIHJlbGVhc2UgaXMgYnVpbHQg
d2l0aG91dCBjb21waWxlciBvcHRpbWl6YXRpb25zCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAKaW5kZXggYWY2Y2ZlOC4uNDIxNjRkNCAxMDA2
NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJHZW5lcmF0b3IuY3Bw
CisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmNwcApA
QCAtMzY5LDcgKzM2OSwxMCBAQCBCM0lSR2VuZXJhdG9yOjpCM0lSR2VuZXJhdG9yKGNvbnN0IE1v
ZHVsZUluZm9ybWF0aW9uJiBpbmZvLCBQcm9jZWR1cmUmIHByb2NlZHVyZQogICAgICAgICBjYXNl
IE1lbW9yeU1vZGU6OkJvdW5kc0NoZWNraW5nOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg
IGNhc2UgTWVtb3J5TW9kZTo6U2lnbmFsaW5nOgotICAgICAgICAvLyBNb3N0IG1lbW9yeSBhY2Nl
c3NlcyBpbiBzaWduYWxpbmcgbW9kZSBkb24ndCBkbyBhbiBleHBsaWNpdCBleGNlcHRpb24gY2hl
Y2sgYmVjYXVzZSB0aGV5IGNhbiByZWx5IG9uIGZhdWx0IGhhbmRsaW5nIHRvIGRldGVjdCBvdXQt
b2YtYm91bmRzIGFjY2Vzc2VzLiBGYXVsdFNpZ25hbEhhbmRsZXIgbm9uZXRoZWxlc3MgbmVlZHMg
dGhlIHRodW5rIHRvIGV4aXN0IHNvIHRoYXQgaXQgY2FuIGp1bXAgdG8gdGhhdCB0aHVuay4KKyAg
ICAgICAgICAgIC8vIE1vc3QgbWVtb3J5IGFjY2Vzc2VzIGluIHNpZ25hbGluZyBtb2RlIGRvbid0
IGRvIGFuIGV4cGxpY2l0CisgICAgICAgICAgICAvLyBleGNlcHRpb24gY2hlY2sgYmVjYXVzZSB0
aGV5IGNhbiByZWx5IG9uIGZhdWx0IGhhbmRsaW5nIHRvIGRldGVjdAorICAgICAgICAgICAgLy8g
b3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcy4gRmF1bHRTaWduYWxIYW5kbGVyIG5vbmV0aGVsZXNzIG5l
ZWRzIHRoZQorICAgICAgICAgICAgLy8gdGh1bmsgdG8gZXhpc3Qgc28gdGhhdCBpdCBjYW4ganVt
cCB0byB0aGF0IHRodW5rLgogICAgICAgICAgICAgaWYgKFVOTElLRUxZKCFUaHVua3M6OnNpbmds
ZXRvbigpLnN0dWIodGhyb3dFeGNlcHRpb25Gcm9tV2FzbVRodW5rR2VuZXJhdG9yKSkpCiAgICAg
ICAgICAgICAgICAgQ1JBU0goKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDczLDggKzQ3Niw4
IEBAIHZvaWQgQjNJUkdlbmVyYXRvcjo6cmVzdG9yZVdlYkFzc2VtYmx5R2xvYmFsU3RhdGUoY29u
c3QgTWVtb3J5SW5mb3JtYXRpb24mIG1lbW9yCiAgICAgICAgICAgICBjb25zdCBhdXRvJiBzaXpl
UmVncyA9IHBpbm5lZFJlZ3MtPnNpemVSZWdpc3RlcnM7CiAgICAgICAgICAgICBBU1NFUlQoc2l6
ZVJlZ3Muc2l6ZSgpID49IDEpOwogICAgICAgICAgICAgQVNTRVJUKCFzaXplUmVnc1swXS5zaXpl
T2Zmc2V0KTsgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGFzc3VtZXMgd2Ugc3RhcnQgYXQgMCwgYW5k
IGNhbGN1bGF0ZXMgc3Vic2VxdWVudCBzaXplIHJlZ2lzdGVycyByZWxhdGl2ZSB0byAwLgotICAg
ICAgICAgICAgaml0LmxvYWRQdHIoQ0NhbGxIZWxwZXJzOjpBZGRyZXNzKGJhc2VNZW1vcnksIFdh
c206Ok1lbW9yeTo6b2Zmc2V0T2ZTaXplKCkpLCBzaXplUmVnc1swXS5zaXplUmVnaXN0ZXIpOwot
ICAgICAgICAgICAgaml0LmxvYWRQdHIoQ0NhbGxIZWxwZXJzOjpBZGRyZXNzKGJhc2VNZW1vcnks
IFdhc206Ok1lbW9yeTo6b2Zmc2V0T2ZNZW1vcnkoKSksIGJhc2VNZW1vcnkpOworICAgICAgICAg
ICAgaml0LmxvYWRQdHIoQ0NhbGxIZWxwZXJzOjpBZGRyZXNzKGJhc2VNZW1vcnksIE1lbW9yeTo6
b2Zmc2V0T2ZTaXplKCkpLCBzaXplUmVnc1swXS5zaXplUmVnaXN0ZXIpOworICAgICAgICAgICAg
aml0LmxvYWRQdHIoQ0NhbGxIZWxwZXJzOjpBZGRyZXNzKGJhc2VNZW1vcnksIE1lbW9yeTo6b2Zm
c2V0T2ZNZW1vcnkoKSksIGJhc2VNZW1vcnkpOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMTsgaSA8IHNpemVSZWdzLnNpemUoKTsgKytpKQogICAgICAgICAgICAgICAgIGppdC5hZGQ2
NChDQ2FsbEhlbHBlcnM6OlRydXN0ZWRJbW0zMigtc2l6ZVJlZ3NbaV0uc2l6ZU9mZnNldCksIHNp
emVSZWdzWzBdLnNpemVSZWdpc3Rlciwgc2l6ZVJlZ3NbaV0uc2l6ZVJlZ2lzdGVyKTsKICAgICAg
ICAgfSk7CkBAIC01ODMsOCArNTg2LDggQEAgYXV0byBCM0lSR2VuZXJhdG9yOjphZGRDdXJyZW50
TWVtb3J5KEV4cHJlc3Npb25UeXBlJiByZXN1bHQpIC0+IFBhcnRpYWxSZXN1bHQKIHsKICAgICBW
YWx1ZSogbWVtb3J5T2JqZWN0ID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxNZW1vcnlWYWx1
ZT4obV9wcm9jLCBMb2FkLCBwb2ludGVyVHlwZSgpLCBvcmlnaW4oKSwgaW5zdGFuY2VWYWx1ZSgp
LCBzYWZlQ2FzdDxpbnQzMl90PihKU1dlYkFzc2VtYmx5SW5zdGFuY2U6Om9mZnNldE9mV2FzbU1l
bW9yeSgpKSk7CiAKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkZWNsdHlwZShzdGF0aWNfY2Fz
dDxXYXNtOjpNZW1vcnkqPihudWxscHRyKS0+c2l6ZSgpKSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwg
ImNvZGVnZW4gcmVsaWVzIG9uIHRoaXMgc2l6ZSIpOwotICAgIFZhbHVlKiBzaXplID0gbV9jdXJy
ZW50QmxvY2stPmFwcGVuZE5ldzxNZW1vcnlWYWx1ZT4obV9wcm9jLCBMb2FkLCBJbnQ2NCwgb3Jp
Z2luKCksIG1lbW9yeU9iamVjdCwgc2FmZUNhc3Q8aW50MzJfdD4oV2FzbTo6TWVtb3J5OjpvZmZz
ZXRPZlNpemUoKSkpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRlY2x0eXBlKHN0YXRpY19j
YXN0PE1lbW9yeSo+KG51bGxwdHIpLT5zaXplKCkpKSA9PSBzaXplb2YodWludDY0X3QpLCAiY29k
ZWdlbiByZWxpZXMgb24gdGhpcyBzaXplIik7CisgICAgVmFsdWUqIHNpemUgPSBtX2N1cnJlbnRC
bG9jay0+YXBwZW5kTmV3PE1lbW9yeVZhbHVlPihtX3Byb2MsIExvYWQsIEludDY0LCBvcmlnaW4o
KSwgbWVtb3J5T2JqZWN0LCBzYWZlQ2FzdDxpbnQzMl90PihNZW1vcnk6Om9mZnNldE9mU2l6ZSgp
KSk7CiAgICAgCiAgICAgY29uc3RleHByIHVpbnQzMl90IHNoaWZ0VmFsdWUgPSAxNjsKICAgICBz
dGF0aWNfYXNzZXJ0KFBhZ2VDb3VudDo6cGFnZVNpemUgPT0gMXVsbCA8PCBzaGlmdFZhbHVlLCAi
VGhpcyBtdXN0IGhvbGQgZm9yIHRoZSBjb2RlIGJlbG93IHRvIGJlIGNvcnJlY3QuIik7CkBAIC0x
MTA3LDcgKzExMTAsNyBAQCBhdXRvIEIzSVJHZW5lcmF0b3I6OmFkZENhbGwodWludDMyX3QgZnVu
Y3Rpb25JbmRleCwgY29uc3QgU2lnbmF0dXJlJiBzaWduYXR1cmUsCiAKICAgICAgICAgLy8gRklY
TUU6IExldCdzIHJlbW92ZSB0aGlzIGluZGlyZWN0aW9uIGJ5IGNyZWF0aW5nIGEgUElDIGZyaWVu
ZGx5IElDCiAgICAgICAgIC8vIGZvciBjYWxscyBvdXQgdG8gSlMuIFRoaXMgc2hvdWxkbid0IGJl
IHRoYXQgaGFyZCB0byBkby4gV2UgY291bGQgcHJvYmFibHkKLSAgICAgICAgLy8gaW1wbGVtZW50
IHRoZSBJQyB0byBiZSBvdmVyIFdhc206OkNvbnRleHQqLgorICAgICAgICAvLyBpbXBsZW1lbnQg
dGhlIElDIHRvIGJlIG92ZXIgQ29udGV4dCouCiAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzAzNzUKICAgICAgICAgVmFsdWUqIGNvZGVCbG9jayA9
IGlzRW1iZWRkZXJCbG9jay0+YXBwZW5kTmV3PE1lbW9yeVZhbHVlPihtX3Byb2MsCiAgICAgICAg
ICAgICBMb2FkLCBwb2ludGVyVHlwZSgpLCBvcmlnaW4oKSwgaW5zdGFuY2VWYWx1ZSgpLCBzYWZl
Q2FzdDxpbnQzMl90PihKU1dlYkFzc2VtYmx5SW5zdGFuY2U6Om9mZnNldE9mV2FzbUNvZGVCbG9j
aygpKSk7CkBAIC0xMTc5LDExICsxMTgyLDExIEBAIGF1dG8gQjNJUkdlbmVyYXRvcjo6YWRkQ2Fs
bEluZGlyZWN0KGNvbnN0IFNpZ25hdHVyZSYgc2lnbmF0dXJlLCBWZWN0b3I8RXhwcmVzc2lvCiAg
ICAgICAgIEV4cHJlc3Npb25UeXBlIHRhYmxlID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxN
ZW1vcnlWYWx1ZT4obV9wcm9jLCBMb2FkLCBwb2ludGVyVHlwZSgpLCBvcmlnaW4oKSwKICAgICAg
ICAgICAgIGluc3RhbmNlVmFsdWUoKSwgc2FmZUNhc3Q8aW50MzJfdD4oSlNXZWJBc3NlbWJseUlu
c3RhbmNlOjpvZmZzZXRPZldhc21UYWJsZSgpKSk7CiAgICAgICAgIGNhbGxhYmxlRnVuY3Rpb25C
dWZmZXIgPSBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PE1lbW9yeVZhbHVlPihtX3Byb2MsIExv
YWQsIHBvaW50ZXJUeXBlKCksIG9yaWdpbigpLAotICAgICAgICAgICAgdGFibGUsIHNhZmVDYXN0
PGludDMyX3Q+KFdhc206OlRhYmxlOjpvZmZzZXRPZkZ1bmN0aW9ucygpKSk7CisgICAgICAgICAg
ICB0YWJsZSwgc2FmZUNhc3Q8aW50MzJfdD4oVGFibGU6Om9mZnNldE9mRnVuY3Rpb25zKCkpKTsK
ICAgICAgICAgaW5zdGFuY2VzQnVmZmVyID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxNZW1v
cnlWYWx1ZT4obV9wcm9jLCBMb2FkLCBwb2ludGVyVHlwZSgpLCBvcmlnaW4oKSwKLSAgICAgICAg
ICAgIHRhYmxlLCBzYWZlQ2FzdDxpbnQzMl90PihXYXNtOjpUYWJsZTo6b2Zmc2V0T2ZJbnN0YW5j
ZXMoKSkpOworICAgICAgICAgICAgdGFibGUsIHNhZmVDYXN0PGludDMyX3Q+KFRhYmxlOjpvZmZz
ZXRPZkluc3RhbmNlcygpKSk7CiAgICAgICAgIGNhbGxhYmxlRnVuY3Rpb25CdWZmZXJTaXplID0g
bV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxNZW1vcnlWYWx1ZT4obV9wcm9jLCBMb2FkLCBJbnQz
Miwgb3JpZ2luKCksCi0gICAgICAgICAgICB0YWJsZSwgc2FmZUNhc3Q8aW50MzJfdD4oV2FzbTo6
VGFibGU6Om9mZnNldE9mU2l6ZSgpKSk7CisgICAgICAgICAgICB0YWJsZSwgc2FmZUNhc3Q8aW50
MzJfdD4oVGFibGU6Om9mZnNldE9mU2l6ZSgpKSk7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgdGhl
IGluZGV4IHdlIGFyZSBsb29raW5nIGZvciBpcyB2YWxpZC4KQEAgLTEyMzIsNyArMTIzNSw3IEBA
IGF1dG8gQjNJUkdlbmVyYXRvcjo6YWRkQ2FsbEluZGlyZWN0KGNvbnN0IFNpZ25hdHVyZSYgc2ln
bmF0dXJlLCBWZWN0b3I8RXhwcmVzc2lvCiAgICAgewogICAgICAgICBWYWx1ZSogb2Zmc2V0ID0g
bV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxWYWx1ZT4obV9wcm9jLCBNdWwsIG9yaWdpbigpLAog
ICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxWYWx1ZT4obV9wcm9jLCBaRXh0
MzIsIG9yaWdpbigpLCBjYWxsZWVJbmRleCksCi0gICAgICAgICAgICBjb25zdGFudChwb2ludGVy
VHlwZSgpLCBzaXplb2YoV2FzbTo6SW5zdGFuY2UqKSkpOworICAgICAgICAgICAgY29uc3RhbnQo
cG9pbnRlclR5cGUoKSwgc2l6ZW9mKEluc3RhbmNlKikpKTsKICAgICAgICAgVmFsdWUqIG5ld0Nv
bnRleHRJbnN0YW5jZSA9IG1fY3VycmVudEJsb2NrLT5hcHBlbmROZXc8TWVtb3J5VmFsdWU+KG1f
cHJvYywgTG9hZCwgcG9pbnRlclR5cGUoKSwgb3JpZ2luKCksCiAgICAgICAgICAgICBtX2N1cnJl
bnRCbG9jay0+YXBwZW5kTmV3PFZhbHVlPihtX3Byb2MsIEFkZCwgb3JpZ2luKCksIGluc3RhbmNl
c0J1ZmZlciwgb2Zmc2V0KSk7CiAKQEAgLTEyNjMsMTMgKzEyNjYsMTMgQEAgYXV0byBCM0lSR2Vu
ZXJhdG9yOjphZGRDYWxsSW5kaXJlY3QoY29uc3QgU2lnbmF0dXJlJiBzaWduYXR1cmUsIFZlY3Rv
cjxFeHByZXNzaW8KICAgICAgICAgICAgIGppdC5sb2FkUHRyKENDYWxsSGVscGVyczo6QWRkcmVz
cyhvbGRDb250ZXh0SW5zdGFuY2UsIEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6b2Zmc2V0T2ZDYWNo
ZWRTdGFja0xpbWl0KCkpLCBiYXNlTWVtb3J5KTsKICAgICAgICAgICAgIGppdC5zdG9yZVB0cihi
YXNlTWVtb3J5LCBDQ2FsbEhlbHBlcnM6OkFkZHJlc3MobmV3Q29udGV4dEluc3RhbmNlLCBKU1dl
YkFzc2VtYmx5SW5zdGFuY2U6Om9mZnNldE9mQ2FjaGVkU3RhY2tMaW1pdCgpKSk7CiAgICAgICAg
ICAgICBqaXQuc3RvcmVXYXNtQ29udGV4dEluc3RhbmNlKG5ld0NvbnRleHRJbnN0YW5jZSk7Ci0g
ICAgICAgICAgICBqaXQubG9hZFB0cihDQ2FsbEhlbHBlcnM6OkFkZHJlc3MobmV3Q29udGV4dElu
c3RhbmNlLCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6Om9mZnNldE9mV2FzbU1lbW9yeSgpKSwgYmFz
ZU1lbW9yeSk7IC8vIFdhc206Ok1lbW9yeSouCisgICAgICAgICAgICBqaXQubG9hZFB0cihDQ2Fs
bEhlbHBlcnM6OkFkZHJlc3MobmV3Q29udGV4dEluc3RhbmNlLCBKU1dlYkFzc2VtYmx5SW5zdGFu
Y2U6Om9mZnNldE9mV2FzbU1lbW9yeSgpKSwgYmFzZU1lbW9yeSk7IC8vIE1lbW9yeSouCiAgICAg
ICAgICAgICBBU1NFUlQoc2l6ZVJlZ3Muc2l6ZSgpID09IDEpOwogICAgICAgICAgICAgQVNTRVJU
KHNpemVSZWdzWzBdLnNpemVSZWdpc3RlciAhPSBiYXNlTWVtb3J5KTsKICAgICAgICAgICAgIEFT
U0VSVChzaXplUmVnc1swXS5zaXplUmVnaXN0ZXIgIT0gbmV3Q29udGV4dEluc3RhbmNlKTsKICAg
ICAgICAgICAgIEFTU0VSVCghc2l6ZVJlZ3NbMF0uc2l6ZU9mZnNldCk7Ci0gICAgICAgICAgICBq
aXQubG9hZFB0cihDQ2FsbEhlbHBlcnM6OkFkZHJlc3MoYmFzZU1lbW9yeSwgV2FzbTo6TWVtb3J5
OjpvZmZzZXRPZlNpemUoKSksIHNpemVSZWdzWzBdLnNpemVSZWdpc3Rlcik7IC8vIE1lbW9yeSBz
aXplLgotICAgICAgICAgICAgaml0LmxvYWRQdHIoQ0NhbGxIZWxwZXJzOjpBZGRyZXNzKGJhc2VN
ZW1vcnksIFdhc206Ok1lbW9yeTo6b2Zmc2V0T2ZNZW1vcnkoKSksIGJhc2VNZW1vcnkpOyAvLyBX
YXNtOjpNZW1vcnk6OnZvaWQqLgorICAgICAgICAgICAgaml0LmxvYWRQdHIoQ0NhbGxIZWxwZXJz
OjpBZGRyZXNzKGJhc2VNZW1vcnksIE1lbW9yeTo6b2Zmc2V0T2ZTaXplKCkpLCBzaXplUmVnc1sw
XS5zaXplUmVnaXN0ZXIpOyAvLyBNZW1vcnkgc2l6ZS4KKyAgICAgICAgICAgIGppdC5sb2FkUHRy
KENDYWxsSGVscGVyczo6QWRkcmVzcyhiYXNlTWVtb3J5LCBNZW1vcnk6Om9mZnNldE9mTWVtb3J5
KCkpLCBiYXNlTWVtb3J5KTsgLy8gTWVtb3J5Ojp2b2lkKi4KICAgICAgICAgfSk7CiAgICAgICAg
IGRvQ29udGV4dFN3aXRjaC0+YXBwZW5kTmV3Q29udHJvbFZhbHVlKG1fcHJvYywgSnVtcCwgb3Jp
Z2luKCksIGNvbnRpbnVhdGlvbik7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93YXNtL1dhc21Db250ZXh0LmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21D
b250ZXh0LmNwcAppbmRleCBlMDU5ZmMxLi5jZjM0ODUxIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9XYXNtQ29udGV4dC5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vV2FzbUNvbnRleHQuY3BwCkBAIC01NCwxMyArNTQsMTMgQEAgSlNXZWJBc3NlbWJs
eUluc3RhbmNlKiBDb250ZXh0Ojpsb2FkKCkgY29uc3QKICAgICByZXR1cm4gaW5zdGFuY2U7CiB9
CiAKLXZvaWQgQ29udGV4dDo6c3RvcmUoSlNXZWJBc3NlbWJseUluc3RhbmNlKiBpLCB2b2lkKiBz
b2Z0U3RhY2tMaW1pdCkKK3ZvaWQgQ29udGV4dDo6c3RvcmUoSlNXZWJBc3NlbWJseUluc3RhbmNl
KiBpbnN0LCB2b2lkKiBzb2Z0U3RhY2tMaW1pdCkKIHsKICNpZiBFTkFCTEUoRkFTVF9UTFNfSklU
KQogICAgIGlmICh1c2VGYXN0VExTKCkpCi0gICAgICAgIF9wdGhyZWFkX3NldHNwZWNpZmljX2Rp
cmVjdChXVEZfV0FTTV9DT05URVhUX0tFWSwgYml0d2lzZV9jYXN0PHZvaWQqPihpKSk7CisgICAg
ICAgIF9wdGhyZWFkX3NldHNwZWNpZmljX2RpcmVjdChXVEZfV0FTTV9DT05URVhUX0tFWSwgYml0
d2lzZV9jYXN0PHZvaWQqPihpbnN0KSk7CiAjZW5kaWYKLSAgICBpbnN0YW5jZSA9IGk7CisgICAg
aW5zdGFuY2UgPSBpbnN0OwogICAgIGlmIChpbnN0YW5jZSkKICAgICAgICAgaW5zdGFuY2UtPnNl
dENhY2hlZFN0YWNrTGltaXQoc29mdFN0YWNrTGltaXQpOwogfQpkaWZmIC0tZ2l0IGEvU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbU1lbW9yeU1vZGUuaCBiL1NvdXJjZS9KYXZhU2NyaXB0
Q29yZS93YXNtL1dhc21NZW1vcnlNb2RlLmgKaW5kZXggMTRmYzg5Ni4uMGEyODU1YSAxMDA2NDQK
LS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbU1lbW9yeU1vZGUuaAorKysgYi9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTWVtb3J5TW9kZS5oCkBAIC0yOSw5ICsyOSw3
IEBACiAKICNpbmNsdWRlICJKU0V4cG9ydE1hY3Jvcy5oIgogCi1uYW1lc3BhY2UgSlNDIHsKLQot
bmFtZXNwYWNlIFdhc20geworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKIAogLy8g
RklYTUU6IFdlIHNob3VsZCBzdXBwb3J0IG90aGVyIG1vZGVzLiBzZWU6IGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjI2OTMKIGVudW0gY2xhc3MgTWVtb3J5TW9kZSA6
IHVpbnQ4X3QgewpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVRh
YmxlLmggYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtVGFibGUuaAppbmRleCBiOTA4
ZWM4Li5hOTJhOWE5IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
VGFibGUuaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtVGFibGUuaApAQCAt
NDIsOSArNDIsNiBAQCBuYW1lc3BhY2UgV2FzbSB7CiAKIGNsYXNzIFRhYmxlIDogcHVibGljIFRo
cmVhZFNhZmVSZWZDb3VudGVkPFRhYmxlPiB7CiBwdWJsaWM6Ci0gICAgZW51bSBjbGFzcyBDcmVh
dGVGYWlsIHsKLSAgICAgICAgSW52YWxpZFNpemUsCi0gICAgfTsKICAgICBzdGF0aWMgUmVmUHRy
PFRhYmxlPiBjcmVhdGUodWludDMyX3QgaW5pdGlhbCwgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4g
bWF4aW11bSk7CiAKICAgICBKU19FWFBPUlRfUFJJVkFURSB+VGFibGUoKTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlJbnN0YW5jZS5jcHAg
Yi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5SW5zdGFuY2UuY3Bw
CmluZGV4IDcyYWEwYTAuLmJiMmI1ZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlJbnN0YW5jZS5jcHAKKysrIGIvU291cmNlL0phdmFTY3Jp
cHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmNwcApAQCAtNTksNyArNTksNyBA
QCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OkpTV2ViQXNzZW1ibHlJbnN0YW5jZShWTSYgdm0sIFN0
cnVjdHVyZSogc3RydWN0dXJlLCB1bnNpZwogICAgICwgbV9udW1JbXBvcnRGdW5jdGlvbnMobnVt
SW1wb3J0RnVuY3Rpb25zKQogewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX251bUlt
cG9ydEZ1bmN0aW9uczsgKytpKQotICAgICAgICBuZXcgKGltcG9ydEZ1bmN0aW9uSW5mbyhpKSkg
SW1wb3J0RnVuY3Rpb25JbmZvKCk7CisgICAgICAgIGRlZmF1bHRfY29uc3RydWN0X2F0KGltcG9y
dEZ1bmN0aW9uSW5mbyhpKSk7CiB9CiAKIHZvaWQgSlNXZWJBc3NlbWJseUluc3RhbmNlOjpmaW5p
c2hDcmVhdGlvbihWTSYgdm0sIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSwgSlNNb2R1bGVO
YW1lc3BhY2VPYmplY3QqIG1vZHVsZU5hbWVzcGFjZU9iamVjdCkKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlUYWJsZS5jcHAgYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5VGFibGUuY3BwCmluZGV4IGFkYWE3
NDkuLjk5YmUwNmQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pT
V2ViQXNzZW1ibHlUYWJsZS5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMv
SlNXZWJBc3NlbWJseVRhYmxlLmNwcApAQCAtNjIsNyArNjIsNyBAQCBKU1dlYkFzc2VtYmx5VGFi
bGU6OkpTV2ViQXNzZW1ibHlUYWJsZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlLCBSZWY8
V2FzbTo6VAogICAgIC8vIEJ1dCBmb3Igbm93LCB3ZSdyZSBub3QgZG9pbmcgdGhhdC4KICAgICBt
X2pzRnVuY3Rpb25zID0gTWFsbG9jUHRyPFdyaXRlQmFycmllcjxKU09iamVjdD4+OjptYWxsb2Mo
c2l6ZW9mKFdyaXRlQmFycmllcjxKU09iamVjdD4pICogc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXpl
KCkpKTsKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZSgpOyArK2kpCi0gICAgICAg
IG5ldyAoJm1fanNGdW5jdGlvbnMuZ2V0KClbaV0pIFdyaXRlQmFycmllcjxKU09iamVjdD4oKTsK
KyAgICAgICAgZGVmYXVsdF9jb25zdHJ1Y3RfYXQoJm1fanNGdW5jdGlvbnMuZ2V0KClbaV0pOwog
fQogCiB2b2lkIEpTV2ViQXNzZW1ibHlUYWJsZTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtKQpAQCAt
MTAyLDcgKzEwMiw3IEBAIGJvb2wgSlNXZWJBc3NlbWJseVRhYmxlOjpncm93KHVpbnQzMl90IGRl
bHRhKQogICAgIG1fanNGdW5jdGlvbnMucmVhbGxvYyhzaXplb2YoV3JpdGVCYXJyaWVyPEpTT2Jq
ZWN0PikgKiBuZXdTaXplKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSBvbGRTaXplOyBpIDwgbmV3
U2l6ZTsgKytpKQotICAgICAgICBuZXcgKCZtX2pzRnVuY3Rpb25zLmdldCgpW2ldKSBXcml0ZUJh
cnJpZXI8SlNPYmplY3Q+KCk7CisgICAgICAgIGRlZmF1bHRfY29uc3RydWN0X2F0KCZtX2pzRnVu
Y3Rpb25zLmdldCgpW2ldKTsKIAogICAgIHJldHVybiB0cnVlOwogfQotLSAKMi45LjMKCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>