<?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>141275</bug_id>
          
          <creation_ts>2015-02-04 17:08:32 -0800</creation_ts>
          <short_desc>DelayedReleaseScope drops locks during GC which can cause a thread switch and code reentry</short_desc>
          <delta_ts>2015-03-03 21:33:57 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1066994</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-04 17:08:32 -0800</bug_when>
    <thetext>In CodeCache::getGlobalCodeBlock(), the CodeCacheMap::add() method will initially add a null UnlinkedCodeBlockType* and then set the value to the new code block after it is created.  The creation of that code block could block, drop all of its locks and allow another thread to begin executing.  That second thread could also add the same source to the CadeCache and this time it finds the entry the first thread created which has a null UnlinkedCodeBlockType*.  This second thread will try to use that null pointer and then crash.

Here is a sample stack trace for the first thread:
* thread #18: tid = 0x8756a0, 0x000000010479c076 libsystem_kernel.dylib`__psynch_mutexwait + 10, queue = &apos;JSTEval&apos;
  * frame #0: 0x000000010479c076 libsystem_kernel.dylib`__psynch_mutexwait + 10
    frame #1: 0x00000001048ca744 libsystem_pthread.dylib`_pthread_mutex_lock + 482
    frame #2: 0x0000000104391f67 libc++.1.dylib`std::__1::mutex::lock() + 9
    frame #3: 0x000000010069353d JavaScriptCore`JSC::JSLock::lock(this=0x0000000119ffb000, lockCount=2) + 157 at JSLock.cpp:121
    frame #4: 0x0000000100693cea JavaScriptCore`JSC::JSLock::grabAllLocks(this=0x0000000119ffb000, dropper=0x000000011b7358c8, droppedLockCount=2) + 186 at JSLock.cpp:237
    frame #5: 0x000000010069407d JavaScriptCore`JSC::JSLock::DropAllLocks::~DropAllLocks(this=0x000000011b7358c8) + 109 at JSLock.cpp:280
    frame #6: 0x0000000100694105 JavaScriptCore`JSC::JSLock::DropAllLocks::~DropAllLocks(this=0x000000011b7358c8) + 21 at JSLock.cpp:277
    frame #7: 0x000000010051ce84 JavaScriptCore`JSC::DelayedReleaseScope::~DelayedReleaseScope(this=0x000000011b7359e0) + 260 at DelayedReleaseScope.h:57
    frame #8: 0x0000000100512615 JavaScriptCore`JSC::DelayedReleaseScope::~DelayedReleaseScope(this=0x000000011b7359e0) + 21 at DelayedReleaseScope.h:47
    frame #9: 0x0000000100773de0 JavaScriptCore`JSC::MarkedAllocator::tryAllocateHelper(this=0x0000000118013e78, bytes=336) + 672 at MarkedAllocator.cpp:105
    frame #10: 0x0000000100772212 JavaScriptCore`JSC::MarkedAllocator::tryAllocate(this=0x0000000118013e78, bytes=336) + 114 at MarkedAllocator.cpp:129
    frame #11: 0x0000000100771afe JavaScriptCore`JSC::MarkedAllocator::allocateSlowCase(this=0x0000000118013e78, bytes=336) + 254 at MarkedAllocator.cpp:171
    frame #12: 0x000000010003c8a1 JavaScriptCore`JSC::MarkedAllocator::allocate(this=0x0000000118013e78, bytes=336) + 81 at MarkedAllocator.h:95
    frame #13: 0x000000010004da59 JavaScriptCore`JSC::MarkedSpace::allocateWithImmortalStructureDestructor(this=0x0000000118010328, bytes=336) + 41 at MarkedSpace.h:251
    frame #14: 0x000000010004da26 JavaScriptCore`JSC::Heap::allocateWithImmortalStructureDestructor(this=0x0000000118010018, bytes=336) + 118 at HeapInlines.h:196
    frame #15: 0x0000000100122ac7 JavaScriptCore`void* JSC::allocateCell&lt;JSC::UnlinkedProgramCodeBlock&gt;(heap=0x0000000118010018, size=336) + 151 at JSCellInlines.h:134
    frame #16: 0x000000010012284c JavaScriptCore`void* JSC::allocateCell&lt;JSC::UnlinkedProgramCodeBlock&gt;(heap=0x0000000118010018) + 28 at JSCellInlines.h:150
    frame #17: 0x00000001001225e3 JavaScriptCore`JSC::UnlinkedProgramCodeBlock::create(vm=0x0000000118010000, info=0x000000011b735d48) + 35 at UnlinkedCodeBlock.h:622
    frame #18: 0x000000010011daa0 JavaScriptCore`JSC::UnlinkedProgramCodeBlock* JSC::CodeCache::getGlobalCodeBlock&lt;JSC::UnlinkedProgramCodeBlock, JSC::ProgramExecutable&gt;(this=0x0000000119ff7058, vm=0x0000000118010000, executable=0x000000011a33fc70, source=0x000000011a33fcb0, strictness=JSParseNormal, debuggerMode=DebuggerOff, profilerMode=ProfilerOff, error=0x000000011b736230) + 1856 at CodeCache.cpp:107
    frame #19: 0x000000010011c9de JavaScriptCore`JSC::CodeCache::getProgramCodeBlock(this=0x0000000119ff7058, vm=0x0000000118010000, executable=0x000000011a33fc70, source=0x000000011a33fcb0, strictness=JSParseNormal, debuggerMode=DebuggerOff, profilerMode=ProfilerOff, error=0x000000011b736230) + 94 at CodeCache.cpp:128
    frame #20: 0x000000010065da9b JavaScriptCore`JSC::JSGlobalObject::createProgramCodeBlock(this=0x000000011a2df970, callFrame=0x000000011a2df9b0, executable=0x000000011a33fc70, exception=0x000000011b736388) + 315 at JSGlobalObject.cpp:765
    frame #21: 0x000000010043ad9d JavaScriptCore`JSC::ProgramExecutable::initializeGlobalProperties(this=0x000000011a33fc70, vm=0x0000000118010000, callFrame=0x000000011a2df9b0, scope=0x000000011a2df970) + 253 at Executable.cpp:489
    frame #22: 0x00000001005c37f3 JavaScriptCore`JSC::Interpreter::execute(this=0x0000000119ff4000, program=0x000000011a33fc70, callFrame=0x000000011a2df9b0, thisObj=0x000000011a2efaf0) + 3795 at Interpreter.cpp:889
    frame #23: 0x00000001001448e0 JavaScriptCore`JSC::evaluate(exec=0x000000011a2df9b0, source=0x000000011b737b10, thisValue=JSValue at 0x000000011b737a70, returnedException=0x000000011b737ae0) + 480 at Completion.cpp:81
    frame #24: 0x000000010062cfea JavaScriptCore`JSEvaluateScript(ctx=0x000000011a2df9b0, script=0x0000000119fd03c0, thisObject=0x0000000000000000, sourceURL=0x0000000000000000, startingLineNumber=1, exception=0x000000011b737c00) + 538 at JSBase.cpp:66
    frame #25: 0x000000010064562e JavaScriptCore`-[JSContext evaluateScript:withSourceURL:](self=0x0000628000043210, _cmd=0x0000000100c914fc, script=0x0000000100008760, sourceURL=0x0000000000000000) + 158 at JSContext.mm:102
    frame #26: 0x0000000100645582 JavaScriptCore`-[JSContext evaluateScript:](self=0x0000628000043210, _cmd=0x0000000100006f27, script=0x0000000100008760) + 66 at JSContext.mm:94
    frame #27: 0x0000000100002f17 JSCTester`__42-[JSTEvaluator evaluateScript:completion:]_block_invoke(.block_descriptor=0x0000628000041230, context=0x0000628000043210) + 71 at JSTEvaluator.m:172
    frame #28: 0x0000000100004c0c JSCTester`__30-[JSTEvaluator _sourcePerform]_block_invoke158(.block_descriptor=&lt;unavailable&gt;) + 220 at JSTEvaluator.m:343
    frame #29: 0x000000010459cc64 libdispatch.dylib`_dispatch_call_block_and_release + 12
    frame #30: 0x00000001045976ec libdispatch.dylib`_dispatch_client_callout + 8
    frame #31: 0x00000001045ae4cf libdispatch.dylib`_dispatch_async_redirect_invoke + 2746
    frame #32: 0x00000001045976ec libdispatch.dylib`_dispatch_client_callout + 8
    frame #33: 0x000000010459b9a4 libdispatch.dylib`_dispatch_root_queue_drain + 2858
    frame #34: 0x000000010459ae73 libdispatch.dylib`_dispatch_worker_thread3 + 106
    frame #35: 0x00000001048ccb1d libsystem_pthread.dylib`_pthread_wqthread + 729
    frame #36: 0x00000001048ca489 libsystem_pthread.dylib`start_wqthread + 13

Here is the stack trace for the second thread:
* thread #6: tid = 0x875633, 0x000000010011f43c JavaScriptCore`JSC::UnlinkedCodeBlock::firstLine(this=0x0000000000000000) const + 12 at UnlinkedCodeBlock.h:485, queue = &apos;JSTEval&apos;, stop reason = EXC_BAD_ACCESS (code=1, address=0x48)
  * frame #0: 0x000000010011f43c JavaScriptCore`JSC::UnlinkedCodeBlock::firstLine(this=0x0000000000000000) const + 12 at UnlinkedCodeBlock.h:485
    frame #1: 0x000000010011d538 JavaScriptCore`JSC::UnlinkedProgramCodeBlock* JSC::CodeCache::getGlobalCodeBlock&lt;JSC::UnlinkedProgramCodeBlock, JSC::ProgramExecutable&gt;(this=0x0000000119ff7058, vm=0x0000000118010000, executable=0x000000011a33fb70, source=0x000000011a33fbb0, strictness=JSParseNormal, debuggerMode=DebuggerOff, profilerMode=ProfilerOff, error=0x000000010e102230) + 472 at CodeCache.cpp:85
    frame #2: 0x000000010011c9de JavaScriptCore`JSC::CodeCache::getProgramCodeBlock(this=0x0000000119ff7058, vm=0x0000000118010000, executable=0x000000011a33fb70, source=0x000000011a33fbb0, strictness=JSParseNormal, debuggerMode=DebuggerOff, profilerMode=ProfilerOff, error=0x000000010e102230) + 94 at CodeCache.cpp:128
    frame #3: 0x000000010065da9b JavaScriptCore`JSC::JSGlobalObject::createProgramCodeBlock(this=0x000000011a2df970, callFrame=0x000000011a2df9b0, executable=0x000000011a33fb70, exception=0x000000010e102388) + 315 at JSGlobalObject.cpp:765
    frame #4: 0x000000010043ad9d JavaScriptCore`JSC::ProgramExecutable::initializeGlobalProperties(this=0x000000011a33fb70, vm=0x0000000118010000, callFrame=0x000000011a2df9b0, scope=0x000000011a2df970) + 253 at Executable.cpp:489
    frame #5: 0x00000001005c37f3 JavaScriptCore`JSC::Interpreter::execute(this=0x0000000119ff4000, program=0x000000011a33fb70, callFrame=0x000000011a2df9b0, thisObj=0x000000011a2efaf0) + 3795 at Interpreter.cpp:889
    frame #6: 0x00000001001448e0 JavaScriptCore`JSC::evaluate(exec=0x000000011a2df9b0, source=0x000000010e103b10, thisValue=JSValue at 0x000000010e103a70, returnedException=0x000000010e103ae0) + 480 at Completion.cpp:81
    frame #7: 0x000000010062cfea JavaScriptCore`JSEvaluateScript(ctx=0x000000011a2df9b0, script=0x0000000119fe6060, thisObject=0x0000000000000000, sourceURL=0x0000000000000000, startingLineNumber=1, exception=0x000000010e103c00) + 538 at JSBase.cpp:66
    frame #8: 0x000000010064562e JavaScriptCore`-[JSContext evaluateScript:withSourceURL:](self=0x0000628000043210, _cmd=0x0000000100c914fc, script=0x0000000100008760, sourceURL=0x0000000000000000) + 158 at JSContext.mm:102
    frame #9: 0x0000000100645582 JavaScriptCore`-[JSContext evaluateScript:](self=0x0000628000043210, _cmd=0x0000000100006f27, script=0x0000000100008760) + 66 at JSContext.mm:94
    frame #10: 0x0000000100002f17 JSCTester`__42-[JSTEvaluator evaluateScript:completion:]_block_invoke(.block_descriptor=0x0000628000041440, context=0x0000628000043210) + 71 at JSTEvaluator.m:172
    frame #11: 0x0000000100004c0c JSCTester`__30-[JSTEvaluator _sourcePerform]_block_invoke158(.block_descriptor=&lt;unavailable&gt;) + 220 at JSTEvaluator.m:343
    frame #12: 0x000000010459cc64 libdispatch.dylib`_dispatch_call_block_and_release + 12
    frame #13: 0x00000001045976ec libdispatch.dylib`_dispatch_client_callout + 8
    frame #14: 0x00000001045ae4cf libdispatch.dylib`_dispatch_async_redirect_invoke + 2746
    frame #15: 0x00000001045976ec libdispatch.dylib`_dispatch_client_callout + 8
    frame #16: 0x000000010459b9a4 libdispatch.dylib`_dispatch_root_queue_drain + 2858
    frame #17: 0x000000010459ae73 libdispatch.dylib`_dispatch_worker_thread3 + 106
    frame #18: 0x00000001048ccb1d libsystem_pthread.dylib`_pthread_wqthread + 729
    frame #19: 0x00000001048ca489 libsystem_pthread.dylib`start_wqthread + 13

This was found with an internal multi-threaded test app.

rdar://problem/19708290</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067003</commentid>
    <comment_count>1</comment_count>
      <attachid>246072</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-04 17:42:43 -0800</bug_when>
    <thetext>Created attachment 246072
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067025</commentid>
    <comment_count>2</comment_count>
      <attachid>246072</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-02-04 19:54:30 -0800</bug_when>
    <thetext>Comment on attachment 246072
Patch

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

I&apos;ve provided some feedback for now but I&apos;m not sold on this solution.  The main issue I see is that we used to release all the delayed releases at the end of each GC cycle.  Now, with this patch, we&apos;ll have to wait till the outermost JSLock is unlocked.  If a piece of JS code is long running (e.g. the benchmarks), it will continue to retain these DelayedReleasedObjects for a long time even if we&apos;ve GC&apos;ed several times.  As a result, the runtime memory profile will higher peak usage.

From your bug description, I think the issue at hand is that another thread can see an null UnlinkedCodeBlock in the Cache.  The fact that we drop all locks may have enabled the issue to manifest, but in my understanding is not core to the issue.  Instead, would be possible to fix the issue by changing CodeCache to:

1. Instead of add the SourceCode immediately, do a find to see if an UnlinkedCodeBlock for it exists.
2. If it exists, use the cached UnlinkedCodeBlock.
3. If not:
   3.1 go ahead and parse the SourceCode and make the UnlinkedCodeBlock.
   3.2. Check again is an UnlinkedCodeBlock has already been added for this SourceCode.
   3.3. If not already present, add the UnlinkedCodeBlock to the cache.
   3.4. If already present, release the new UnlinkedCodeBlock, and use the one in the cache.

Theoretically, this might result in some wasted work where the same SourceCode being parsed into an UnlinkedCodeBlock twice.  However, in practice, if we don&apos;t have 2 threads, that will never happen.  Even with running on 2 threads, the collision mwill probably still be rare.

Would that work?

&gt; Source/JavaScriptCore/ChangeLog:7
&gt; +

Your ChangeLog comment describes what was done but not why.  I think your description of the issue in bugzilla did a good job of explaining what the issue is.  Would you mind adding it here before you start explaining how it is fixed?

&gt; Source/JavaScriptCore/ChangeLog:17
&gt; +        by calling into JS.  This case is acually tested by testapi.mm.

typo: &quot;acually&quot;.  However, I think &quot;already&quot; would be a better fit here.

&gt; Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:1758
&gt; -&lt;/Project&gt;
&gt;  \ No newline at end of file
&gt; +&lt;/Project&gt;

Is this necessary and ok to do?

&gt; Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:4390
&gt; -&lt;/Project&gt;
&gt;  \ No newline at end of file
&gt; +&lt;/Project&gt;

Ditto.

&gt; Source/JavaScriptCore/heap/Heap.h:118
&gt; +    JS_EXPORT_PRIVATE void releaseDelayedReleasedObjects();

No need to JS_EXPORT_PRIVATE this function as it is only used inside JSC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067160</commentid>
    <comment_count>3</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-05 11:53:59 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Comment on attachment 246072 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=246072&amp;action=review
&gt; 
&gt; I&apos;ve provided some feedback for now but I&apos;m not sold on this solution.  The
&gt; main issue I see is that we used to release all the delayed releases at the
&gt; end of each GC cycle.  Now, with this patch, we&apos;ll have to wait till the
&gt; outermost JSLock is unlocked.  If a piece of JS code is long running (e.g.
&gt; the benchmarks), it will continue to retain these DelayedReleasedObjects for
&gt; a long time even if we&apos;ve GC&apos;ed several times.  As a result, the runtime
&gt; memory profile will higher peak usage.

I don&apos;t think any of our benchmarks use the ObjC API or retain ObjC objects.

&gt; From your bug description, I think the issue at hand is that another thread
&gt; can see an null UnlinkedCodeBlock in the Cache.  The fact that we drop all
&gt; locks may have enabled the issue to manifest, but in my understanding is not
&gt; core to the issue.  Instead, would be possible to fix the issue by changing
&gt; CodeCache to:
&gt; 
&gt; 1. Instead of add the SourceCode immediately, do a find to see if an
&gt; UnlinkedCodeBlock for it exists.
&gt; 2. If it exists, use the cached UnlinkedCodeBlock.
&gt; 3. If not:
&gt;    3.1 go ahead and parse the SourceCode and make the UnlinkedCodeBlock.
&gt;    3.2. Check again is an UnlinkedCodeBlock has already been added for this
&gt; SourceCode.
&gt;    3.3. If not already present, add the UnlinkedCodeBlock to the cache.
&gt;    3.4. If already present, release the new UnlinkedCodeBlock, and use the
&gt; one in the cache.
&gt; 
&gt; Theoretically, this might result in some wasted work where the same
&gt; SourceCode being parsed into an UnlinkedCodeBlock twice.  However, in
&gt; practice, if we don&apos;t have 2 threads, that will never happen.  Even with
&gt; running on 2 threads, the collision mwill probably still be rare.
&gt; 
&gt; Would that work?

I implemented a trial solution in CodeCache:add() similar to what you describe and it worked fine for this issue.  I discussed it with Geoff and he said the problem with that solution is there are many other places that we do this &quot;add null and fill in the value later&quot; kind of HashMap accesses.  From that discussion, we agreed on this approach of not dropping the lock during GC and releasing delayed objects after the lock was dropped exiting the VM.

&gt; &gt; Source/JavaScriptCore/ChangeLog:7
&gt; &gt; +
&gt; 
&gt; Your ChangeLog comment describes what was done but not why.  I think your
&gt; description of the issue in bugzilla did a good job of explaining what the
&gt; issue is.  Would you mind adding it here before you start explaining how it
&gt; is fixed?

I added this paragraph to the top of the ChangeLog entry:
    The root issue is that one thread, while allocating JS objects may need to garbage collect.
    During that garbage collection, if there are delayed Objective C objects that need to be
    released, we drop the locks to release them.  While the locks are release by that thread,
    another thread can enter the VM and might have exactly the same source and therefore hit
    this issue.  This fixes the problem by not dropping the locks during garbage collection.

&gt; &gt; Source/JavaScriptCore/ChangeLog:17
&gt; &gt; +        by calling into JS.  This case is acually tested by testapi.mm.
&gt; 
&gt; typo: &quot;acually&quot;.  However, I think &quot;already&quot; would be a better fit here.

Made that fix locally.

&gt; &gt; Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:1758
&gt; &gt; -&lt;/Project&gt;
&gt; &gt;  \ No newline at end of file
&gt; &gt; +&lt;/Project&gt;
&gt; 
&gt; Is this necessary and ok to do?

Given that it is XML, I think it is fine.  The Win EWS bot built with the patch just fine.
 
&gt; &gt; Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:4390
&gt; &gt; -&lt;/Project&gt;
&gt; &gt;  \ No newline at end of file
&gt; &gt; +&lt;/Project&gt;
&gt; 
&gt; Ditto.
&gt; 
&gt; &gt; Source/JavaScriptCore/heap/Heap.h:118
&gt; &gt; +    JS_EXPORT_PRIVATE void releaseDelayedReleasedObjects();
&gt; 
&gt; No need to JS_EXPORT_PRIVATE this function as it is only used inside JSC.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067161</commentid>
    <comment_count>4</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-05 11:58:24 -0800</bug_when>
    <thetext>Here are benchmark results.  Neutral to maybe a slight speed up.

Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on msaboff-pro (MacPro5,1).

VMs tested:
&quot;Baseline&quot; at /Volumes/Data/src/webkit.baseline/WebKitBuild/Release/JavaScriptCore.framework/Versions/A/Resources/jsc
&quot;GCDontDropLocks&quot; at /Volumes/Data/src/webkit/WebKitBuild/Release/JavaScriptCore.framework/Versions/A/Resources/jsc

Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample measurements.
Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level
timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.

                                                         Baseline              GCDontDropLocks                                  
SunSpider:
   3d-cube                                            8.2874+-0.4075     ?      8.4276+-0.1794        ? might be 1.0169x slower
   3d-morph                                          12.6283+-0.2559           12.6267+-0.3875        
   3d-raytrace                                       11.0775+-0.3408           10.9921+-0.3171        
   access-binary-trees                                3.5512+-0.2837            3.4613+-0.2011          might be 1.0260x faster
   access-fannkuch                                   10.4371+-0.3147     ?     10.5487+-0.1167        ? might be 1.0107x slower
   access-nbody                                       5.6537+-0.0808            5.6317+-0.2477        
   access-nsieve                                      5.7880+-0.2364     ?      6.1447+-0.7727        ? might be 1.0616x slower
   bitops-3bit-bits-in-byte                           2.3798+-0.1259            2.3016+-0.1406          might be 1.0340x faster
   bitops-bits-in-byte                                6.4005+-0.1407     ?      6.6443+-0.5729        ? might be 1.0381x slower
   bitops-bitwise-and                                 3.1192+-0.1480     ?      3.1356+-0.0724        ?
   bitops-nsieve-bits                                 6.8399+-0.3972     ?      6.8992+-0.0346        ?
   controlflow-recursive                              3.6331+-0.2296     ?      3.6355+-0.3157        ?
   crypto-aes                                         7.1508+-0.4122     ?      7.1888+-0.4024        ?
   crypto-md5                                         4.3215+-0.2786            4.3129+-0.5220        
   crypto-sha1                                        4.3408+-0.1204            4.1880+-0.2596          might be 1.0365x faster
   date-format-tofte                                 16.7717+-0.7366           16.6817+-0.2536        
   date-format-xparb                                  9.4168+-0.5794     ?      9.5230+-0.4646        ? might be 1.0113x slower
   math-cordic                                        5.6259+-0.2124            5.6171+-0.3203        
   math-partial-sums                                 11.0132+-0.1232     ?     11.0358+-0.2127        ?
   math-spectral-norm                                 3.6334+-0.1861            3.5872+-0.0561          might be 1.0129x faster
   regexp-dna                                        11.6884+-0.5060           11.3149+-0.2350          might be 1.0330x faster
   string-base64                                      7.2542+-0.3255            7.2304+-0.3460        
   string-fasta                                      12.2562+-0.3317     ?     12.3046+-0.4177        ?
   string-tagcloud                                   17.7007+-0.3883           17.3237+-0.3029          might be 1.0218x faster
   string-unpack-code                                37.3306+-1.0074     ?     38.2923+-1.0488        ? might be 1.0258x slower
   string-validate-input                              8.5934+-0.3738            8.4857+-0.1985          might be 1.0127x faster

   &lt;arithmetic&gt; *                                     9.1113+-0.0862     ?      9.1360+-0.1193        ? might be 1.0027x slower
   &lt;geometric&gt;                                        7.4436+-0.0882            7.4396+-0.1216          might be 1.0005x faster
   &lt;harmonic&gt;                                         6.2588+-0.1045            6.2312+-0.1153          might be 1.0044x faster

                                                         Baseline              GCDontDropLocks                                  
LongSpider:
   3d-cube                                         1600.9268+-29.6274        1597.9611+-28.7411       
   3d-morph                                        1980.2997+-4.5007         1979.3760+-1.9151        
   3d-raytrace                                     1563.5179+-9.3382         1561.7790+-9.3141        
   access-binary-trees                             1870.8630+-11.6636        1853.6997+-8.9547        
   access-fannkuch                                  598.4971+-44.1336    ?    600.7025+-29.9472       ?
   access-nbody                                    1486.9128+-8.4505     ?   1490.3475+-11.1716       ?
   access-nsieve                                   1814.2460+-11.8846    ?   1819.5962+-20.7864       ?
   bitops-3bit-bits-in-byte                          71.4328+-0.9201           71.0125+-1.0927        
   bitops-bits-in-byte                              369.8054+-11.8523    ?    373.0720+-14.0135       ?
   bitops-nsieve-bits                              1453.0237+-16.2679    ?   1453.2216+-11.1583       ?
   controlflow-recursive                           1089.6410+-3.6694     ?   1099.3997+-8.3668        ?
   crypto-aes                                      1297.5742+-8.4535         1293.8137+-5.1115        
   crypto-md5                                      1083.3359+-11.6202        1082.2216+-9.4268        
   crypto-sha1                                     1449.4463+-2.9528     ?   1450.9452+-9.7966        ?
   date-format-tofte                               1514.6633+-84.9346    ?   1526.6085+-25.2648       ?
   date-format-xparb                               1423.4734+-27.9681        1388.8990+-28.5513         might be 1.0249x faster
   math-cordic                                     1051.2505+-12.7771        1048.5900+-9.7412        
   math-partial-sums                               1285.7495+-2.8893         1285.5657+-5.8522        
   math-spectral-norm                              1218.3607+-1.6995     ?   1218.5185+-2.5982        ?
   string-base64                                    635.0610+-1.5039          634.2584+-2.8186        
   string-fasta                                     873.4131+-26.1124         854.9326+-9.9061          might be 1.0216x faster
   string-tagcloud                                  419.6511+-2.9527          417.9655+-4.1416        

   &lt;arithmetic&gt;                                    1188.6884+-7.9262         1186.4767+-3.6740          might be 1.0019x faster
   &lt;geometric&gt; *                                   1002.3436+-7.7248         1000.5258+-2.7055          might be 1.0018x faster
   &lt;harmonic&gt;                                       630.1777+-5.3515          628.3575+-3.6252          might be 1.0029x faster

                                                         Baseline              GCDontDropLocks                                  
V8Spider:
   crypto                                           100.2801+-1.2653     ?    100.5043+-1.1308        ?
   deltablue                                        126.9694+-5.3371          121.9311+-2.6027          might be 1.0413x faster
   earley-boyer                                      83.0057+-5.4756           80.6595+-0.2354          might be 1.0291x faster
   raytrace                                          51.3168+-0.9058           50.6696+-1.0394          might be 1.0128x faster
   regexp                                           128.9222+-1.4115          128.8653+-0.9100        
   richards                                         132.2358+-2.4264     ?    133.1490+-1.0884        ?
   splay                                             59.2132+-1.3879     ?     61.7690+-6.8158        ? might be 1.0432x slower

   &lt;arithmetic&gt;                                      97.4205+-0.5011           96.7925+-0.9790          might be 1.0065x faster
   &lt;geometric&gt; *                                     91.7400+-0.5463           91.3272+-1.5237          might be 1.0045x faster
   &lt;harmonic&gt;                                        85.7713+-0.7367           85.5814+-2.1441          might be 1.0022x faster

                                                         Baseline              GCDontDropLocks                                  
Octane:
   encrypt                                           0.46692+-0.01103          0.46354+-0.01443       
   decrypt                                           8.24243+-0.03055          8.23960+-0.01946       
   deltablue                                x2       0.39210+-0.00701    ?     0.39272+-0.00444       ?
   earley                                            1.34903+-0.01789          1.33857+-0.03040       
   boyer                                            12.15227+-0.23771         11.99703+-0.02912         might be 1.0129x faster
   navier-stokes                            x2       7.37743+-0.00696    ?     7.38730+-0.02524       ?
   raytrace                                 x2       2.67632+-0.33980          2.65387+-0.20697       
   richards                                 x2       0.24530+-0.00471          0.24205+-0.00553         might be 1.0134x faster
   splay                                    x2       0.66180+-0.02769          0.65440+-0.00381         might be 1.0113x faster
   regexp                                   x2      63.30892+-0.65007         63.24368+-2.23599       
   pdfjs                                    x2     101.20690+-1.02071        100.00601+-1.28065         might be 1.0120x faster
   mandreel                                 x2     106.90159+-1.56042    ?   107.15199+-0.70171       ?
   gbemu                                    x2     100.00511+-4.51717         99.72006+-3.37979       
   closure                                           0.98703+-0.01117    ?     0.98851+-0.01114       ?
   jquery                                           12.52820+-0.14516    ?    12.63393+-0.15504       ?
   box2d                                    x2      28.81709+-0.42253    ^    28.35351+-0.02981       ^ definitely 1.0163x faster
   zlib                                     x2     874.67743+-78.77564   ?   900.54356+-5.96773       ? might be 1.0296x slower
   typescript                               x2    1473.44904+-44.86878   ?  1497.86053+-10.57159      ? might be 1.0166x slower

   &lt;arithmetic&gt;                                    185.17213+-8.15047    ?   188.40269+-0.82534       ? might be 1.0174x slower
   &lt;geometric&gt; *                                    13.48771+-0.19672         13.46913+-0.08889         might be 1.0014x faster
   &lt;harmonic&gt;                                        1.38607+-0.00685          1.37592+-0.01121         might be 1.0074x faster

                                                         Baseline              GCDontDropLocks                                  
Kraken:
   ai-astar                                          831.922+-10.318           818.597+-21.629          might be 1.0163x faster
   audio-beat-detection                              221.653+-5.461            221.273+-1.316         
   audio-dft                                         295.661+-2.959      ?     302.912+-19.833        ? might be 1.0245x slower
   audio-fft                                         155.251+-0.618      ?     155.711+-0.351         ?
   audio-oscillator                                  438.332+-3.393            436.554+-1.882         
   imaging-darkroom                                  334.565+-1.615      ?     335.556+-2.214         ?
   imaging-desaturate                                144.874+-0.283      ?     145.078+-0.613         ?
   imaging-gaussian-blur                             216.790+-0.959            216.398+-0.386         
   json-parse-financial                               92.422+-1.096             92.126+-0.611         
   json-stringify-tinderbox                          117.408+-11.631           111.417+-0.557           might be 1.0538x faster
   stanford-crypto-aes                               118.359+-1.730      ?     118.932+-2.909         ?
   stanford-crypto-ccm                               100.800+-12.170     ?     105.620+-20.493        ? might be 1.0478x slower
   stanford-crypto-pbkdf2                            315.251+-5.126      ?     317.996+-4.245         ?
   stanford-crypto-sha256-iterative                   95.067+-0.568      ?      95.376+-2.879         ?

   &lt;arithmetic&gt; *                                    248.454+-1.219            248.110+-2.814           might be 1.0014x faster
   &lt;geometric&gt;                                       198.810+-1.670      ?     198.998+-3.135         ? might be 1.0009x slower
   &lt;harmonic&gt;                                        167.095+-2.223      ?     167.292+-4.056         ? might be 1.0012x slower

                                                         Baseline              GCDontDropLocks                                  
JSRegress:
   abs-boolean                                        4.9039+-0.7798            4.6655+-0.1388          might be 1.0511x faster
   adapt-to-double-divide                            19.7751+-0.1035           19.7607+-0.1161        
   aliased-arguments-getbyval                         1.4850+-0.0498     ?      1.4988+-0.0874        ?
   allocate-big-object                                3.9099+-0.1903     ?      3.9507+-0.6173        ? might be 1.0104x slower
   arity-mismatch-inlining                            1.3118+-0.1009     ?      1.3835+-0.0940        ? might be 1.0546x slower
   array-access-polymorphic-structure                12.6620+-0.3088     ?     12.6750+-0.2490        ?
   array-nonarray-polymorhpic-access                 68.9453+-0.3822     ?     69.4298+-1.2578        ?
   array-prototype-every                            187.5782+-8.9778          184.9826+-4.2053          might be 1.0140x faster
   array-prototype-forEach                          183.1628+-7.2041          182.8010+-1.7654        
   array-prototype-map                              224.4810+-6.0747          224.0670+-7.1083        
   array-prototype-some                             189.9885+-2.2155     ?    191.6420+-6.1883        ?
   array-splice-contiguous                           95.0856+-4.1395           95.0295+-4.8040        
   array-with-double-add                              7.4538+-0.1129            7.4410+-0.2286        
   array-with-double-increment                        5.6599+-0.2689            5.5112+-0.2261          might be 1.0270x faster
   array-with-double-mul-add                         11.8201+-0.2235           11.6105+-0.1533          might be 1.0181x faster
   array-with-double-sum                              5.4011+-0.1249     ?      5.4792+-0.1940        ? might be 1.0145x slower
   array-with-int32-add-sub                          13.1190+-0.1629           13.0753+-0.0849        
   array-with-int32-or-double-sum                     5.3206+-0.1428     ?      5.3509+-0.0814        ?
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     67.4449+-3.1558           65.0034+-1.2483          might be 1.0376x faster
   ArrayBuffer-DataView-alloc-long-lived             28.3835+-2.6615           26.8492+-0.4847          might be 1.0571x faster
   ArrayBuffer-Int32Array-byteOffset                  5.1708+-0.1793     ?      5.3670+-0.2430        ? might be 1.0379x slower
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     69.3553+-1.3089           68.3317+-1.2618          might be 1.0150x faster
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     49.0463+-3.5148           45.8782+-5.1571          might be 1.0691x faster
   ArrayBuffer-Int8Array-alloc-long-lived            25.9260+-1.2349           25.6655+-0.3735          might be 1.0102x faster
   ArrayBuffer-Int8Array-alloc                       21.1623+-0.4510     ?     21.2051+-0.5032        ?
   asmjs_bool_bug                                    12.7102+-0.2582     ?     12.9255+-0.3227        ? might be 1.0169x slower
   assign-custom-setter-polymorphic                   6.0051+-0.2325     ?      6.1526+-0.2088        ? might be 1.0246x slower
   assign-custom-setter                               8.3787+-0.3240            8.1545+-0.0807          might be 1.0275x faster
   basic-set                                         17.6423+-1.1215           17.5315+-0.9472        
   big-int-mul                                        7.7305+-0.1298            7.7203+-0.1079        
   boolean-test                                       4.9650+-0.0958            4.9219+-0.1432        
   branch-fold                                        5.2761+-0.1207            5.2139+-0.1087          might be 1.0119x faster
   by-val-generic                                    15.6538+-0.4113     ?     15.8600+-0.7473        ? might be 1.0132x slower
   call-spread-apply                                 25.7766+-0.3250     ?     26.1796+-1.0617        ? might be 1.0156x slower
   call-spread-call                                  11.3736+-0.2834     ?     11.4882+-0.2004        ? might be 1.0101x slower
   captured-assignments                               0.8073+-0.1250     ?      0.8228+-0.1541        ? might be 1.0191x slower
   cast-int-to-double                                 8.6315+-0.1372     ?      8.6738+-0.1119        ?
   cell-argument                                     12.0446+-0.2477     ?     12.2531+-0.4238        ? might be 1.0173x slower
   cfg-simplify                                       3.9150+-0.0722     ?      3.9724+-0.0507        ? might be 1.0147x slower
   chain-getter-access                               16.4993+-0.3234           16.4705+-0.2705        
   cmpeq-obj-to-obj-other                            16.6860+-0.4798     ?     16.7102+-0.4701        ?
   constant-test                                      8.0961+-0.0803            8.0090+-0.1410          might be 1.0109x faster
   DataView-custom-properties                        79.4473+-4.3748           76.1459+-3.1501          might be 1.0434x faster
   delay-tear-off-arguments-strictmode               45.4232+-0.9265     ?     45.5005+-0.9970        ?
   destructuring-arguments                            9.1252+-0.1275            9.1111+-0.2100        
   destructuring-swap                                 8.3210+-0.1561            8.2637+-0.1086        
   direct-arguments-getbyval                          1.5987+-0.3076     ?      1.6596+-0.3791        ? might be 1.0381x slower
   div-boolean-double                                 5.8640+-0.0654     ?      5.9987+-0.1347        ? might be 1.0230x slower
   div-boolean                                       10.2576+-0.0393           10.2510+-0.3121        
   double-get-by-val-out-of-bounds                    8.1508+-0.2113     ?      8.2041+-0.2906        ?
   double-pollution-getbyval                         10.0820+-0.0961     ?     10.1068+-0.1696        ?
   double-pollution-putbyoffset                       8.0867+-0.1528            8.0607+-0.0867        
   double-to-int32-typed-array-no-inline              3.7795+-0.2651            3.7372+-0.0584          might be 1.0113x faster
   double-to-int32-typed-array                        3.2941+-0.1358            3.2575+-0.0923          might be 1.0112x faster
   double-to-uint32-typed-array-no-inline             3.8181+-0.1766     ?      3.8832+-0.2454        ? might be 1.0170x slower
   double-to-uint32-typed-array                       3.3947+-0.1728            3.2814+-0.1806          might be 1.0345x faster
   elidable-new-object-dag                           62.6877+-2.1583           62.4510+-2.5799        
   elidable-new-object-roflcopter                   242.1007+-5.5626          237.9272+-2.5464          might be 1.0175x faster
   elidable-new-object-then-call                     60.3154+-2.0250           58.7932+-0.9074          might be 1.0259x faster
   elidable-new-object-tree                          70.2939+-1.2846     ?     70.3883+-1.1415        ?
   empty-string-plus-int                             10.4761+-0.4592           10.2294+-0.2269          might be 1.0241x faster
   emscripten-cube2hash                              57.2521+-1.1727     ?     58.2951+-1.4164        ? might be 1.0182x slower
   external-arguments-getbyval                        2.5018+-0.1807            2.4797+-0.3049        
   external-arguments-putbyval                        3.8517+-0.1520            3.7413+-0.2808          might be 1.0295x faster
   fixed-typed-array-storage-var-index                2.0370+-0.0943            1.9715+-0.1770          might be 1.0332x faster
   fixed-typed-array-storage                          1.3853+-0.1255     ?      1.4150+-0.1272        ? might be 1.0215x slower
   Float32Array-matrix-mult                           8.4427+-0.6791            8.0106+-0.2693          might be 1.0539x faster
   Float32Array-to-Float64Array-set                 117.7137+-2.0385     ?    119.9370+-7.1261        ? might be 1.0189x slower
   Float64Array-alloc-long-lived                    104.3427+-0.7615          103.9674+-0.5007        
   Float64Array-to-Int16Array-set                   147.8989+-5.7667          145.5093+-2.5894          might be 1.0164x faster
   fold-double-to-int                                24.5105+-0.5455           24.3843+-0.3457        
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     14.3041+-0.5144           14.0502+-0.2147          might be 1.0181x faster
   fold-get-by-id-to-multi-get-by-offset             12.2864+-0.3936     ?     12.4200+-0.5803        ? might be 1.0109x slower
   fold-multi-get-by-offset-to-get-by-offset   
                                                     10.5012+-1.4849     ?     11.6681+-0.8244        ? might be 1.1111x slower
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                     11.3296+-1.2084     ?     11.4252+-0.9003        ?
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                     10.5042+-1.1953            9.9715+-1.1096          might be 1.0534x faster
   fold-multi-put-by-offset-to-put-by-offset   
                                                      8.6668+-1.5594     ?      8.7687+-1.0436        ? might be 1.0118x slower
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                     15.4473+-2.0953     ?     15.7321+-1.4008        ? might be 1.0184x slower
   fold-put-by-id-to-multi-put-by-offset             11.4315+-0.8821     ?     11.7145+-0.8120        ? might be 1.0248x slower
   fold-put-structure                                 8.6942+-1.1696     ?      8.8929+-1.0738        ? might be 1.0229x slower
   for-of-iterate-array-entries                      11.0456+-0.4550     ?     11.1745+-0.4394        ? might be 1.0117x slower
   for-of-iterate-array-keys                          5.1106+-0.1261     ?      5.3860+-0.3469        ? might be 1.0539x slower
   for-of-iterate-array-values                        4.3795+-0.3280     ?      4.7305+-0.2394        ? might be 1.0801x slower
   fround                                            26.1556+-1.0184           25.7432+-0.0276          might be 1.0160x faster
   ftl-library-inlining-dataview                    159.5065+-20.3904    ?    166.5156+-27.6958       ? might be 1.0439x slower
   ftl-library-inlining                             134.2111+-3.2031          133.3567+-0.3098        
   function-dot-apply                                 2.8790+-0.1053            2.7940+-0.2984          might be 1.0304x faster
   function-test                                      5.6203+-0.2980            5.5601+-0.1176          might be 1.0108x faster
   function-with-eval                               226.4252+-1.1450     ?    226.6873+-4.2426        ?
   gcse-poly-get-less-obvious                        36.7097+-0.9344     ?     37.1866+-0.7438        ? might be 1.0130x slower
   gcse-poly-get                                     36.6384+-0.2324     ?     36.9536+-0.2619        ?
   gcse                                               9.1887+-0.1535            9.1263+-0.1787        
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      4.1465+-0.1181            4.0878+-0.0447          might be 1.0144x faster
   get-by-id-bimorphic-check-structure-elimination   
                                                     12.1324+-0.1044           12.0778+-0.1025        
   get-by-id-chain-from-try-block                    19.7584+-0.1127           19.6074+-0.0805        
   get-by-id-check-structure-elimination             10.7896+-0.1714           10.7125+-0.1162        
   get-by-id-proto-or-self                           33.2939+-4.5872           30.6615+-0.5304          might be 1.0859x faster
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      5.1968+-0.1885     ?      5.3729+-0.3389        ? might be 1.0339x slower
   get-by-id-self-or-proto                           32.3140+-3.8927     ?     32.4664+-4.1033        ?
   get-by-val-out-of-bounds                           7.7048+-0.0937     ?      7.8212+-0.1789        ? might be 1.0151x slower
   get_callee_monomorphic                             6.4418+-0.5322     ?      6.5833+-0.9700        ? might be 1.0220x slower
   get_callee_polymorphic                             5.3914+-0.1723     ?      5.5063+-0.0768        ? might be 1.0213x slower
   getter-no-activation                               6.3140+-0.1034     ?      6.3192+-0.1278        ?
   getter-richards                                  180.3203+-3.7006          176.7853+-7.2642          might be 1.0200x faster
   getter                                             9.2660+-0.4927            9.2566+-0.4562        
   global-var-const-infer-fire-from-opt               1.6943+-0.0592     ?      1.8022+-0.0847        ? might be 1.0637x slower
   global-var-const-infer                             1.7415+-0.1462            1.6291+-0.1500          might be 1.0690x faster
   HashMap-put-get-iterate-keys                      51.6534+-1.1998     ?     51.7634+-1.0618        ?
   HashMap-put-get-iterate                           50.3761+-0.6012           50.0996+-0.8934        
   HashMap-string-put-get-iterate                    48.1560+-0.6403           47.3760+-0.2342          might be 1.0165x faster
   hoist-make-rope                                   17.6647+-2.6264     ?     19.1873+-3.1359        ? might be 1.0862x slower
   hoist-poly-check-structure-effectful-loop   
                                                      9.5908+-0.1093     ?      9.6189+-0.0365        ?
   hoist-poly-check-structure                         6.3116+-0.1337     ?      6.3143+-0.1068        ?
   imul-double-only                                  13.8478+-2.1592           12.1512+-0.3126          might be 1.1396x faster
   imul-int-only                                     14.3560+-0.7743     ?     14.5774+-0.0720        ? might be 1.0154x slower
   imul-mixed                                        12.2758+-0.3281     ?     12.4580+-0.1690        ? might be 1.0148x slower
   in-four-cases                                     35.3623+-0.2299     ?     35.5377+-0.3855        ?
   in-one-case-false                                 18.7362+-0.1230     ?     18.9167+-0.0904        ?
   in-one-case-true                                  18.7361+-0.2161     ?     18.7432+-0.1037        ?
   in-two-cases                                      19.2914+-0.2106           19.2202+-0.0497        
   indexed-properties-in-objects                      4.7818+-0.0994            4.7349+-0.1446        
   infer-closure-const-then-mov-no-inline             6.0425+-0.0580            5.9664+-0.0912          might be 1.0128x faster
   infer-closure-const-then-mov                      26.1909+-0.2291           26.0888+-0.2013        
   infer-closure-const-then-put-to-scope-no-inline   
                                                     19.9008+-0.1173           19.8727+-0.1765        
   infer-closure-const-then-put-to-scope             33.9648+-0.9965     ?     34.1788+-0.7592        ?
   infer-closure-const-then-reenter-no-inline   
                                                     93.0925+-0.2930           92.6370+-0.8677        
   infer-closure-const-then-reenter                  31.8092+-0.5085     ?     31.8775+-0.2082        ?
   infer-constant-global-property                    38.8815+-0.0816     ?     38.9991+-0.1381        ?
   infer-constant-property                            3.7441+-0.1425            3.6388+-0.2008          might be 1.0289x faster
   infer-one-time-closure-ten-vars                   17.6861+-0.3930           17.6125+-0.1956        
   infer-one-time-closure-two-vars                   16.9491+-0.1937     ?     16.9615+-0.5703        ?
   infer-one-time-closure                            16.8242+-0.4588           16.7938+-0.5082        
   infer-one-time-deep-closure                       29.8387+-0.2992           29.5775+-0.5055        
   inline-arguments-access                            2.8828+-0.0841            2.8301+-0.1709          might be 1.0186x faster
   inline-arguments-aliased-access                    3.0391+-0.1706     ?      3.2081+-0.0639        ? might be 1.0556x slower
   inline-arguments-local-escape                     26.2448+-0.2466     ?     26.6507+-1.6650        ? might be 1.0155x slower
   inline-get-scoped-var                              5.9337+-0.2037            5.9230+-0.1995        
   inlined-put-by-id-transition                      18.6192+-0.2993     ?     18.6315+-0.2925        ?
   int-or-other-abs-then-get-by-val                   9.5482+-0.1762            9.4762+-0.1543        
   int-or-other-abs-zero-then-get-by-val             34.4332+-0.5905     ?     34.4520+-0.8143        ?
   int-or-other-add-then-get-by-val                   8.4808+-0.1908            8.4376+-0.2232        
   int-or-other-add                                   9.0556+-0.2322     ?      9.1369+-0.3095        ?
   int-or-other-div-then-get-by-val                   6.5219+-0.1306            6.5076+-0.1235        
   int-or-other-max-then-get-by-val                   8.0834+-0.2801     ?      8.2429+-0.3038        ? might be 1.0197x slower
   int-or-other-min-then-get-by-val                   7.2509+-0.1862            7.2227+-0.2425        
   int-or-other-mod-then-get-by-val                   6.1520+-0.0339            6.1027+-0.1393        
   int-or-other-mul-then-get-by-val                   6.5627+-0.0828            6.5493+-0.1748        
   int-or-other-neg-then-get-by-val                   8.1566+-0.2424            8.1215+-0.2293        
   int-or-other-neg-zero-then-get-by-val             34.5405+-0.2778           34.1718+-0.4726          might be 1.0108x faster
   int-or-other-sub-then-get-by-val                   8.8137+-0.0916            8.7767+-0.2080        
   int-or-other-sub                                   6.8842+-0.1051            6.7810+-0.7515          might be 1.0152x faster
   int-overflow-local                                 7.9830+-0.1900            7.9332+-0.1485        
   Int16Array-alloc-long-lived                       77.7075+-0.9676           76.7988+-0.7093          might be 1.0118x faster
   Int16Array-bubble-sort-with-byteLength            51.2611+-0.4691           51.1688+-0.2292        
   Int16Array-bubble-sort                            49.8958+-0.3509           49.7271+-0.3523        
   Int16Array-load-int-mul                            2.4927+-0.3321            2.3790+-0.1765          might be 1.0478x faster
   Int16Array-to-Int32Array-set                     117.2755+-5.7481          116.0438+-8.2719          might be 1.0106x faster
   Int32Array-alloc-large                            37.8079+-0.7289           37.5195+-0.3693        
   Int32Array-alloc-long-lived                       84.8037+-0.6696           84.3643+-0.5691        
   Int32Array-alloc                                   4.9630+-0.1617     ?      5.0410+-0.1938        ? might be 1.0157x slower
   Int32Array-Int8Array-view-alloc                   13.2523+-1.1704           13.0984+-0.5665          might be 1.0117x faster
   int52-spill                                       12.6750+-0.3402     ?     12.7317+-0.2315        ?
   Int8Array-alloc-long-lived                        71.4784+-0.8167           71.2983+-0.1291        
   Int8Array-load-with-byteLength                     5.1890+-0.1435            5.1741+-0.1626        
   Int8Array-load                                     5.2203+-0.1241            5.1931+-0.1744        
   integer-divide                                    19.4474+-0.1624           19.2855+-0.0699        
   integer-modulo                                     3.7591+-0.3421     ?      3.7742+-0.1617        ?
   large-int-captured                                12.5248+-0.3290     ?     12.7825+-0.5772        ? might be 1.0206x slower
   large-int-neg                                     30.6542+-0.4530           30.5390+-0.3885        
   large-int                                         27.8512+-0.2662           27.7445+-0.1375        
   logical-not                                        8.0995+-0.1499     ?      8.3277+-0.5641        ? might be 1.0282x slower
   lots-of-fields                                    19.5097+-0.1337           19.4719+-0.3008        
   make-indexed-storage                               5.3522+-0.2227            4.8837+-0.7897          might be 1.0959x faster
   make-rope-cse                                      6.3777+-0.2408     ?      6.5562+-0.4396        ? might be 1.0280x slower
   marsaglia-larger-ints                             69.2272+-1.1604           68.7192+-1.3240        
   marsaglia-osr-entry                               34.6951+-0.5846           34.5122+-0.3559        
   max-boolean                                        3.9263+-0.0762            3.9242+-0.1351        
   method-on-number                                  34.1494+-0.7148     ?     35.0854+-3.5781        ? might be 1.0274x slower
   min-boolean                                        3.8738+-0.1329            3.8368+-0.1615        
   minus-boolean-double                               4.3873+-0.1232            4.3200+-0.0727          might be 1.0156x faster
   minus-boolean                                      3.7852+-0.0720            3.7033+-0.1755          might be 1.0221x faster
   misc-strict-eq                                    71.0651+-1.1205     ?     76.1788+-9.0995        ? might be 1.0720x slower
   mod-boolean-double                                14.3724+-0.1671     ?     14.5200+-0.8415        ? might be 1.0103x slower
   mod-boolean                                        9.2263+-0.1184            9.2256+-0.1656        
   mul-boolean-double                                 4.9919+-0.1161     ?      5.0269+-0.1229        ?
   mul-boolean                                        4.1248+-0.0623            4.0256+-0.1719          might be 1.0246x faster
   neg-boolean                                        4.5883+-0.0942     ?      4.6048+-0.0437        ?
   negative-zero-divide                               0.6188+-0.1386     ?      0.6452+-0.0898        ? might be 1.0426x slower
   negative-zero-modulo                               0.6545+-0.0473            0.6349+-0.1155          might be 1.0308x faster
   negative-zero-negate                               0.5855+-0.0879            0.5372+-0.0249          might be 1.0899x faster
   nested-function-parsing                           41.0352+-0.2690           40.8641+-0.2172        
   new-array-buffer-dead                              4.1129+-0.2076     ?      4.1379+-0.3367        ?
   new-array-buffer-push                             10.7457+-0.2452           10.5203+-0.1413          might be 1.0214x faster
   new-array-dead                                    17.6908+-0.9714           17.5629+-0.9695        
   new-array-push                                     8.3011+-0.1249     ?      8.3193+-0.2714        ?
   number-test                                        4.9020+-0.4426            4.8317+-0.2495          might be 1.0145x faster
   object-closure-call                               10.5706+-0.1870     ?     10.7538+-0.0905        ? might be 1.0173x slower
   object-test                                        5.3610+-0.2113     ?      5.3730+-0.1623        ?
   obvious-sink-pathology-taken                     217.3514+-1.9245     ^    214.0780+-0.3054        ^ definitely 1.0153x faster
   obvious-sink-pathology                           201.2391+-2.6274          200.7522+-3.5779        
   obviously-elidable-new-object                     55.7850+-0.9496           55.0394+-0.7010          might be 1.0135x faster
   plus-boolean-arith                                 4.0974+-0.1436            4.0213+-0.0837          might be 1.0189x faster
   plus-boolean-double                                4.4755+-0.0946            4.4678+-0.0669        
   plus-boolean                                       3.5936+-0.1286     ?      3.6833+-0.2692        ? might be 1.0250x slower
   poly-chain-access-different-prototypes-simple   
                                                      5.1332+-0.0970            5.1332+-0.0854        
   poly-chain-access-different-prototypes             3.7897+-0.7005            3.5861+-0.2065          might be 1.0568x faster
   poly-chain-access-simpler                          5.1768+-0.1205     ?      5.1812+-0.1303        ?
   poly-chain-access                                  3.5493+-0.1897            3.5275+-0.1414        
   poly-stricteq                                    101.1295+-2.5868          100.9315+-1.1071        
   polymorphic-array-call                             3.3520+-0.2910            3.2274+-0.1553          might be 1.0386x faster
   polymorphic-get-by-id                              5.2880+-0.1104            5.2699+-0.1166        
   polymorphic-put-by-id                             46.4290+-2.5495     ?     46.7411+-2.5766        ?
   polymorphic-structure                             32.9877+-0.1825           32.7559+-0.3972        
   polyvariant-monomorphic-get-by-id                 17.1022+-1.0412           16.8517+-0.2065          might be 1.0149x faster
   proto-getter-access                               16.7443+-0.4297           16.5272+-0.3409          might be 1.0131x faster
   put-by-id-replace-and-transition                  13.8135+-0.1142     ^     13.4194+-0.0740        ^ definitely 1.0294x faster
   put-by-id-slightly-polymorphic                     4.2306+-0.2011            4.0024+-0.1129          might be 1.0570x faster
   put-by-id                                         20.6379+-0.6266           20.5039+-0.3636        
   put-by-val-direct                                  1.0159+-0.1372            0.9672+-0.0237          might be 1.0504x faster
   put-by-val-large-index-blank-indexing-type   
                                                     10.8410+-0.4722     ?     11.1888+-1.0078        ? might be 1.0321x slower
   put-by-val-machine-int                             4.3951+-0.2577            4.2426+-0.2174          might be 1.0359x faster
   rare-osr-exit-on-local                            25.5859+-0.2137           25.5680+-0.0928        
   register-pressure-from-osr                        38.1308+-0.3462     ?     38.8505+-1.8452        ? might be 1.0189x slower
   setter                                             7.2527+-0.0726            7.2230+-0.1075        
   simple-activation-demo                            45.2758+-0.9283           44.9360+-0.4936        
   simple-getter-access                              22.1892+-0.5301           22.1487+-0.3947        
   simple-poly-call-nested                           13.9409+-0.7088           13.7840+-0.1337          might be 1.0114x faster
   simple-poly-call                                   2.0372+-0.1697     ?      2.0515+-0.0422        ?
   sin-boolean                                       29.6371+-0.4665           29.5812+-0.5918        
   sinkable-new-object-dag                          117.4052+-0.9555          116.5355+-0.4832        
   sinkable-new-object-taken                         93.4968+-5.9617           88.9117+-0.6971          might be 1.0516x faster
   sinkable-new-object                               61.2180+-0.8399     ?     61.3400+-1.4976        ?
   slow-array-profile-convergence                     5.1018+-0.2715     ?      5.3026+-0.1663        ? might be 1.0394x slower
   slow-convergence                                   5.7303+-0.3998            5.6806+-0.4248        
   sparse-conditional                                 1.8288+-0.1456     ?      1.8464+-0.2429        ?
   splice-to-remove                                  41.6455+-0.8918     ^     35.4322+-2.6289        ^ definitely 1.1754x faster
   string-char-code-at                               30.4093+-0.3345           30.2682+-0.3253        
   string-concat-object                               3.3947+-0.2665            3.3003+-0.2673          might be 1.0286x faster
   string-concat-pair-object                          3.4307+-0.2015     ?      3.4792+-0.4550        ? might be 1.0141x slower
   string-concat-pair-simple                         19.2665+-0.5413           18.7865+-0.5862          might be 1.0256x faster
   string-concat-simple                              19.9454+-0.3921           19.6539+-0.6129          might be 1.0148x faster
   string-cons-repeat                                12.4667+-0.4590           12.1314+-0.3106          might be 1.0276x faster
   string-cons-tower                                 12.0494+-0.2723           11.5101+-0.3408          might be 1.0469x faster
   string-equality                                   34.7372+-0.6414     ?     35.0696+-1.7369        ?
   string-get-by-val-big-char                        13.5543+-0.1765           13.3838+-0.1537          might be 1.0127x faster
   string-get-by-val-out-of-bounds-insane             8.4212+-0.1948     ?      8.8743+-1.9815        ? might be 1.0538x slower
   string-get-by-val-out-of-bounds                   10.1138+-0.6395            9.8272+-0.1071          might be 1.0292x faster
   string-get-by-val                                  6.8783+-0.0854            6.7597+-0.1664          might be 1.0175x faster
   string-hash                                        3.5449+-0.0487     ?      3.6699+-0.1223        ? might be 1.0352x slower
   string-long-ident-equality                        27.2795+-1.1739           27.0955+-0.6206        
   string-repeat-arith                               62.1400+-1.3519           61.9624+-0.5083        
   string-sub                                       120.3463+-0.8595     ?    120.8298+-0.3453        ?
   string-test                                        4.8938+-0.2348            4.7329+-0.1307          might be 1.0340x faster
   string-var-equality                               62.1268+-0.3333           62.0968+-0.2072        
   structure-hoist-over-transitions                   4.1060+-0.2878     ?      4.1290+-0.2895        ?
   substring-concat-weird                            74.5724+-0.8467           73.9078+-0.6376        
   substring-concat                                  78.8601+-0.6116           78.1986+-0.4697        
   substring                                         90.0316+-0.3427           89.7267+-0.3882        
   switch-char-constant                               3.8243+-0.2032            3.8170+-0.1772        
   switch-char                                       12.2530+-1.0250           12.0240+-0.1224          might be 1.0190x faster
   switch-constant                                   19.1667+-1.1769           18.3155+-0.1905          might be 1.0465x faster
   switch-string-basic-big-var                       27.8137+-1.4937           27.0532+-0.2000          might be 1.0281x faster
   switch-string-basic-big                           23.8311+-0.3789           23.6327+-0.3626        
   switch-string-basic-var                           32.9052+-1.6893           32.4160+-1.4665          might be 1.0151x faster
   switch-string-basic                               26.6434+-2.2716     ?     27.9477+-1.5121        ? might be 1.0490x slower
   switch-string-big-length-tower-var                31.2447+-0.1660     ?     31.3659+-0.3409        ?
   switch-string-length-tower-var                    26.1968+-0.2505           26.1537+-0.7635        
   switch-string-length-tower                        20.9168+-0.2720     ?     21.0845+-0.3291        ?
   switch-string-short                               20.3360+-0.4472           20.2965+-0.1721        
   switch                                            27.1509+-0.8038           23.6587+-6.6594          might be 1.1476x faster
   tear-off-arguments-simple                          3.0574+-0.2098            3.0242+-0.2302          might be 1.0110x faster
   tear-off-arguments                                 4.6716+-0.1961            4.5760+-0.1241          might be 1.0209x faster
   temporal-structure                                20.7015+-0.4431           20.6696+-0.1768        
   to-int32-boolean                                  24.9670+-0.2490     ?     25.0707+-0.1293        ?
   undefined-property-access                        582.8043+-1.7300     ?    584.1109+-5.1334        ?
   undefined-test                                     4.9273+-0.0649     ?      5.0392+-0.0795        ? might be 1.0227x slower
   unprofiled-licm                                   34.8692+-0.5498           34.5882+-0.1922        
   weird-inlining-const-prop                          3.3654+-0.2688     ?      3.4314+-0.1782        ? might be 1.0196x slower

   &lt;arithmetic&gt;                                      30.7965+-0.0675           30.6547+-0.1106          might be 1.0046x faster
   &lt;geometric&gt; *                                     13.7433+-0.0428           13.6871+-0.0692          might be 1.0041x faster
   &lt;harmonic&gt;                                         6.8824+-0.1087            6.8480+-0.0891          might be 1.0050x faster

                                                         Baseline              GCDontDropLocks                                  
AsmBench:
   bigfib.cpp                                       892.8593+-11.0205         884.5098+-12.9579       
   cray.c                                           937.8826+-9.8051          934.5866+-7.5146        
   dry.c                                           1054.9327+-2.1557         1038.5106+-50.3661         might be 1.0158x faster
   FloatMM.c                                       1302.4790+-2.9021     ?   1304.0134+-5.5945        ?
   gcc-loops.cpp                                   8249.8732+-8.1224         8245.3165+-46.8821       
   n-body.c                                        2459.3489+-1.5754     ?   2463.0585+-4.0248        ?
   Quicksort.c                                      711.7990+-12.7685    ?    715.6802+-2.4469        ?
   stepanov_container.cpp                          6171.9437+-126.7963   ?   6200.2064+-103.5813      ?
   Towers.c                                         604.5075+-1.6238     ?    605.1746+-1.3776        ?

   &lt;arithmetic&gt;                                    2487.2918+-15.4417    ?   2487.8952+-12.5238       ? might be 1.0002x slower
   &lt;geometric&gt; *                                   1581.7820+-6.6192         1579.0328+-7.2450          might be 1.0017x faster
   &lt;harmonic&gt;                                      1176.2988+-4.4010         1173.5011+-5.4085          might be 1.0024x faster

                                                         Baseline              GCDontDropLocks                                  
CompressionBench:
   huffman                                         1053.0552+-7.4523         1052.2343+-7.6608        
   arithmetic-simple                                767.8580+-6.4668     ?    771.0495+-4.0561        ?
   arithmetic-precise                               594.5696+-4.5895     ?    594.6685+-4.6868        ?
   arithmetic-complex-precise                       597.4836+-8.7574          596.3629+-9.3928        
   arithmetic-precise-order-0                       888.8469+-12.1076    ?    892.4737+-3.0690        ?
   arithmetic-precise-order-1                       649.8916+-6.8364     ?    655.4582+-23.2516       ?
   arithmetic-precise-order-2                       737.1080+-39.4436         701.8575+-11.0504         might be 1.0502x faster
   arithmetic-simple-order-1                        799.6346+-29.9775         793.8840+-17.2383       
   arithmetic-simple-order-2                        875.8927+-5.6488          872.1931+-15.2694       
   lz-string                                        633.1583+-30.5944         631.7170+-28.3004       

   &lt;arithmetic&gt;                                     759.7499+-7.8170          756.1899+-2.6853          might be 1.0047x faster
   &lt;geometric&gt; *                                    747.1227+-8.4012          743.5275+-3.0568          might be 1.0048x faster
   &lt;harmonic&gt;                                       735.1799+-8.8974          731.6467+-3.4965          might be 1.0048x faster

                                                         Baseline              GCDontDropLocks                                  
All benchmarks:
   &lt;arithmetic&gt;                                     188.5052+-0.1356          188.4297+-0.1818          might be 1.0004x faster
   &lt;geometric&gt;                                       23.4283+-0.0664           23.3506+-0.0895          might be 1.0033x faster
   &lt;harmonic&gt;                                         5.9626+-0.0663            5.9286+-0.0509          might be 1.0057x faster

                                                         Baseline              GCDontDropLocks                                  
Geomean of preferred means:
   &lt;scaled-result&gt;                                  120.8835+-0.4227          120.6260+-0.2997          might be 1.0021x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067198</commentid>
    <comment_count>5</comment_count>
      <attachid>246072</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-02-05 13:39:13 -0800</bug_when>
    <thetext>Comment on attachment 246072
Patch

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

I&apos;m still not sure about the effects on peak memory usage for ObjC apps that uses long running JS code which also allocates a lot of JS wrapped ObjC objects.  However, it is re-assuring that release of JS objects isn&apos;t gated by this change.  I agree that we can go with this solution until there is evidence to the contrary that the peak memory usage is of consequence.

I have added a few more questions and comments.  See below.

&gt;&gt;&gt; Source/JavaScriptCore/ChangeLog:7
&gt;&gt;&gt; +
&gt;&gt; 
&gt;&gt; Your ChangeLog comment describes what was done but not why.  I think your description of the issue in bugzilla did a good job of explaining what the issue is.  Would you mind adding it here before you start explaining how it is fixed?
&gt; 
&gt; I added this paragraph to the top of the ChangeLog entry:
&gt;     The root issue is that one thread, while allocating JS objects may need to garbage collect.
&gt;     During that garbage collection, if there are delayed Objective C objects that need to be
&gt;     released, we drop the locks to release them.  While the locks are release by that thread,
&gt;     another thread can enter the VM and might have exactly the same source and therefore hit
&gt;     this issue.  This fixes the problem by not dropping the locks during garbage collection.

I feel that the detail about the code cache having a partially initialized entry is important to understanding this issue.  How about ...

    The root issue is that one thread, while parsing source code into an UnlinkedCodeBlock, may need to garbage collect. During that garbage collection, if there are delayed Objective C objects that need to be released, we drop the locks to release them. While the locks are release by that thread, another thread can enter the VM and might parse exactly the same source and therefore hit this issue where the CodeCache contains an incomplete entry for that source from the first thread. This fixes the problem by not dropping the locks during garbage collection.

&gt;&gt;&gt; Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:1758
&gt;&gt;&gt; +&lt;/Project&gt;
&gt;&gt; 
&gt;&gt; Is this necessary and ok to do?
&gt; 
&gt; Given that it is XML, I think it is fine.  The Win EWS bot built with the patch just fine.

Would you mind reverting this line, or at least deleting the &quot;\No newline at end of file&quot;?  This change is just not relevant to this patch, and having the &quot;\No newline at end of file&quot; before the end of the file just feels icky.

&gt;&gt;&gt; Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:4390
&gt;&gt;&gt; +&lt;/Project&gt;
&gt;&gt; 
&gt;&gt; Ditto.
&gt; 
&gt; Fixed.

Ditto if your fixed does not mean reverting this change, or deleting the &quot;\No newline at end of file&quot;.

&gt; Source/JavaScriptCore/heap/Heap.cpp:376
&gt; +    if (!m_delayedReleaseRecursionCount++) {
&gt; +        while (!m_delayedReleaseObjects.isEmpty()) {
&gt; +            RetainPtr&lt;CFTypeRef&gt; objectToRelease = m_delayedReleaseObjects.takeLast();
&gt; +            objectToRelease.clear();
&gt; +        }
&gt; +    }

In the original ~DelayedReleaseScope(), we do the release by simply calling m_delayedReleaseObjects.clear().  Why do we need to iterate it here and manually clear each entry?

Another question: why do we need this m_delayedReleaseRecursionCount?  Given that releaseDelayedReleasedObjects() is only called just before the outermost JSLock is unlocked, and on heap destruction, there should be no chance of m_delayedReleaseRecursionCount ever being more than 0.  Am I missing something?

&gt; Source/JavaScriptCore/heap/MarkedAllocator.cpp:132
&gt; -    // Due to the DelayedReleaseScope in tryAllocateHelper, some other thread might have
&gt; +    // Due to the DelayedReleaseList in tryAllocateHelper, some other thread might have
&gt;      // created a new block after we thought we didn&apos;t find any free cells. 
&gt;      while (!result &amp;&amp; m_currentBlock) {
&gt;          // A new block was added by another thread so try popping the free list.

I think this while loop is now obsolete, and this comment is invalid.  Since we no longer have a DelayedReleaseScope in tryAllocateHelper(), there&apos;s now no opportunity for another thread to run and create the new block that we&apos;re checking for here.  Hence, this loop and comment should be removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067234</commentid>
    <comment_count>6</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-05 15:16:44 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 246072 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=246072&amp;action=review
&gt; 
&gt; I&apos;m still not sure about the effects on peak memory usage for ObjC apps that
&gt; uses long running JS code which also allocates a lot of JS wrapped ObjC
&gt; objects.  However, it is re-assuring that release of JS objects isn&apos;t gated
&gt; by this change.  I agree that we can go with this solution until there is
&gt; evidence to the contrary that the peak memory usage is of consequence.
&gt; 
&gt; I have added a few more questions and comments.  See below.
&gt; 
&gt; &gt;&gt;&gt; Source/JavaScriptCore/ChangeLog:7
&gt; &gt;&gt;&gt; +
&gt; &gt;&gt; 
&gt; &gt;&gt; Your ChangeLog comment describes what was done but not why.  I think your description of the issue in bugzilla did a good job of explaining what the issue is.  Would you mind adding it here before you start explaining how it is fixed?
&gt; &gt; 
&gt; &gt; I added this paragraph to the top of the ChangeLog entry:
&gt; &gt;     The root issue is that one thread, while allocating JS objects may need to garbage collect.
&gt; &gt;     During that garbage collection, if there are delayed Objective C objects that need to be
&gt; &gt;     released, we drop the locks to release them.  While the locks are release by that thread,
&gt; &gt;     another thread can enter the VM and might have exactly the same source and therefore hit
&gt; &gt;     this issue.  This fixes the problem by not dropping the locks during garbage collection.
&gt; 
&gt; I feel that the detail about the code cache having a partially initialized
&gt; entry is important to understanding this issue.  How about ...
&gt; 
&gt;     The root issue is that one thread, while parsing source code into an
&gt; UnlinkedCodeBlock, may need to garbage collect. During that garbage
&gt; collection, if there are delayed Objective C objects that need to be
&gt; released, we drop the locks to release them. While the locks are release by
&gt; that thread, another thread can enter the VM and might parse exactly the
&gt; same source and therefore hit this issue where the CodeCache contains an
&gt; incomplete entry for that source from the first thread. This fixes the
&gt; problem by not dropping the locks during garbage collection.

During GC, we used to drop all lock even if there aren&apos;t any delayed Objective C objects that need to be released.

How about:

    The issue for this bug is that one thread, takes a cache miss in CodeCache::getGlobalCodeBlock,
    but in the process creates a cache entry with a nullptr UnlinkedCodeBlockType* which it will
    fill in later in the function.  During the body of that function, it allocates objects  that
    may garbage collect.  During that garbage collection, we drop the all locks.  While the 
    locks are released by the first thread, another thread can enter the VM and might have exactly
    the same source and enter CodeCache::getGlobalCodeBlock() itself.  When it looks up the code block,
    it sees it as a cache it and uses the nullptr UnlinkedCodeBlockType* and crashes.  This fixes
    the problem by not dropping the locks during garbage collection.  There are other likely scenarios
    where we have a date structure like this code cache in an unsafe state for arbitrary reentrance.

&gt; &gt;&gt;&gt; Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:1758
&gt; &gt;&gt;&gt; +&lt;/Project&gt;
&gt; &gt;&gt; 
&gt; &gt;&gt; Is this necessary and ok to do?
&gt; &gt; 
&gt; &gt; Given that it is XML, I think it is fine.  The Win EWS bot built with the patch just fine.
&gt; 
&gt; Would you mind reverting this line, or at least deleting the &quot;\No newline at
&gt; end of file&quot;?  This change is just not relevant to this patch, and having
&gt; the &quot;\No newline at end of file&quot; before the end of the file just feels icky.

Fine.

&gt; &gt;&gt;&gt; Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:4390
&gt; &gt;&gt;&gt; +&lt;/Project&gt;
&gt; &gt;&gt; 
&gt; &gt;&gt; Ditto.
&gt; &gt; 
&gt; &gt; Fixed.
&gt; 
&gt; Ditto if your fixed does not mean reverting this change, or deleting the
&gt; &quot;\No newline at end of file&quot;.

I&apos;ll revert.

&gt; &gt; Source/JavaScriptCore/heap/Heap.cpp:376
&gt; &gt; +    if (!m_delayedReleaseRecursionCount++) {
&gt; &gt; +        while (!m_delayedReleaseObjects.isEmpty()) {
&gt; &gt; +            RetainPtr&lt;CFTypeRef&gt; objectToRelease = m_delayedReleaseObjects.takeLast();
&gt; &gt; +            objectToRelease.clear();
&gt; &gt; +        }
&gt; &gt; +    }
&gt; 
&gt; In the original ~DelayedReleaseScope(), we do the release by simply calling
&gt; m_delayedReleaseObjects.clear().  Why do we need to iterate it here and
&gt; manually clear each entry?
&gt; 
&gt; Another question: why do we need this m_delayedReleaseRecursionCount?  Given
&gt; that releaseDelayedReleasedObjects() is only called just before the
&gt; outermost JSLock is unlocked, and on heap destruction, there should be no
&gt; chance of m_delayedReleaseRecursionCount ever being more than 0.  Am I
&gt; missing something?

Yes.  As we clear all the delayed release objects, the release of that object could invoke some arbitrary JS that creates more delayed objects to be released.  This means that we can&apos;t clear the list with Vector::clear() and we will be in the middle of the clear, but recursively we&apos;ll be appending and then clearing as that recursive call executes the same path.  That is why we also have a recursive count so that we are only releasing at the first call and not any nested calls.  testapi.mm hits this case, see EvilAllocationObject.

That&apos;s why this section is in the ChangeLog:
    We do need to guard against the case that releasing an object can create more objects
    by calling into JS.  This case is acually tested by testapi.mm.

I&apos;ll add more to it.

&gt; &gt; Source/JavaScriptCore/heap/MarkedAllocator.cpp:132
&gt; &gt; -    // Due to the DelayedReleaseScope in tryAllocateHelper, some other thread might have
&gt; &gt; +    // Due to the DelayedReleaseList in tryAllocateHelper, some other thread might have
&gt; &gt;      // created a new block after we thought we didn&apos;t find any free cells. 
&gt; &gt;      while (!result &amp;&amp; m_currentBlock) {
&gt; &gt;          // A new block was added by another thread so try popping the free list.
&gt; 
&gt; I think this while loop is now obsolete, and this comment is invalid.  Since
&gt; we no longer have a DelayedReleaseScope in tryAllocateHelper(), there&apos;s now
&gt; no opportunity for another thread to run and create the new block that we&apos;re
&gt; checking for here.  Hence, this loop and comment should be removed.

I think these can be removed.  I&apos;ll remove these and rerun the tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067235</commentid>
    <comment_count>7</comment_count>
      <attachid>246072</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-02-05 15:24:16 -0800</bug_when>
    <thetext>Comment on attachment 246072
Patch

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

r=me with remaining changes and tests passing.

&gt;&gt;&gt;&gt;&gt; Source/JavaScriptCore/ChangeLog:7
&gt;&gt;&gt;&gt;&gt; +
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Your ChangeLog comment describes what was done but not why.  I think your description of the issue in bugzilla did a good job of explaining what the issue is.  Would you mind adding it here before you start explaining how it is fixed?
&gt;&gt;&gt; 
&gt;&gt;&gt; I added this paragraph to the top of the ChangeLog entry:
&gt;&gt;&gt;     The root issue is that one thread, while allocating JS objects may need to garbage collect.
&gt;&gt;&gt;     During that garbage collection, if there are delayed Objective C objects that need to be
&gt;&gt;&gt;     released, we drop the locks to release them.  While the locks are release by that thread,
&gt;&gt;&gt;     another thread can enter the VM and might have exactly the same source and therefore hit
&gt;&gt;&gt;     this issue.  This fixes the problem by not dropping the locks during garbage collection.
&gt;&gt; 
&gt;&gt; I feel that the detail about the code cache having a partially initialized entry is important to understanding this issue.  How about ...
&gt;&gt; 
&gt;&gt;     The root issue is that one thread, while parsing source code into an UnlinkedCodeBlock, may need to garbage collect. During that garbage collection, if there are delayed Objective C objects that need to be released, we drop the locks to release them. While the locks are release by that thread, another thread can enter the VM and might parse exactly the same source and therefore hit this issue where the CodeCache contains an incomplete entry for that source from the first thread. This fixes the problem by not dropping the locks during garbage collection.
&gt; 
&gt; During GC, we used to drop all lock even if there aren&apos;t any delayed Objective C objects that need to be released.
&gt; 
&gt; How about:
&gt; 
&gt;     The issue for this bug is that one thread, takes a cache miss in CodeCache::getGlobalCodeBlock,
&gt;     but in the process creates a cache entry with a nullptr UnlinkedCodeBlockType* which it will
&gt;     fill in later in the function.  During the body of that function, it allocates objects  that
&gt;     may garbage collect.  During that garbage collection, we drop the all locks.  While the 
&gt;     locks are released by the first thread, another thread can enter the VM and might have exactly
&gt;     the same source and enter CodeCache::getGlobalCodeBlock() itself.  When it looks up the code block,
&gt;     it sees it as a cache it and uses the nullptr UnlinkedCodeBlockType* and crashes.  This fixes
&gt;     the problem by not dropping the locks during garbage collection.  There are other likely scenarios
&gt;     where we have a date structure like this code cache in an unsafe state for arbitrary reentrance.

Looks good.  typo: &quot;date&quot; ==&gt; &quot;data&quot;.

&gt;&gt;&gt; Source/JavaScriptCore/heap/Heap.cpp:376
&gt;&gt;&gt; +    }
&gt;&gt; 
&gt;&gt; In the original ~DelayedReleaseScope(), we do the release by simply calling m_delayedReleaseObjects.clear().  Why do we need to iterate it here and manually clear each entry?
&gt;&gt; 
&gt;&gt; Another question: why do we need this m_delayedReleaseRecursionCount?  Given that releaseDelayedReleasedObjects() is only called just before the outermost JSLock is unlocked, and on heap destruction, there should be no chance of m_delayedReleaseRecursionCount ever being more than 0.  Am I missing something?
&gt; 
&gt; Yes.  As we clear all the delayed release objects, the release of that object could invoke some arbitrary JS that creates more delayed objects to be released.  This means that we can&apos;t clear the list with Vector::clear() and we will be in the middle of the clear, but recursively we&apos;ll be appending and then clearing as that recursive call executes the same path.  That is why we also have a recursive count so that we are only releasing at the first call and not any nested calls.  testapi.mm hits this case, see EvilAllocationObject.
&gt; 
&gt; That&apos;s why this section is in the ChangeLog:
&gt;     We do need to guard against the case that releasing an object can create more objects
&gt;     by calling into JS.  This case is acually tested by testapi.mm.
&gt; 
&gt; I&apos;ll add more to it.

I see.  That&apos;s clear now.  Can you put that comment in this block of code since it is not automatically clear from just reading the code as is?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067265</commentid>
    <comment_count>8</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-05 17:12:03 -0800</bug_when>
    <thetext>Committed r179728: &lt;http://trac.webkit.org/changeset/179728&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1068508</commentid>
    <comment_count>9</comment_count>
      <attachid>246072</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-02-11 15:41:34 -0800</bug_when>
    <thetext>Comment on attachment 246072
Patch

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

&gt; Source/JavaScriptCore/heap/Heap.cpp:374
&gt; +            RetainPtr&lt;CFTypeRef&gt; objectToRelease = m_delayedReleaseObjects.takeLast();
&gt; +            objectToRelease.clear();

I agree with Mark that you should have added a comment here. Please do that.

Also, there&apos;s no need for an explicit temporary: You can just takeLast().

&gt; Source/JavaScriptCore/runtime/JSLock.cpp:175
&gt; +        m_vm-&gt;heap.releaseDelayedReleasedObjects();

This looks wrong. If you release ObjC objects *before* releasing the lock, then all dealloc methods will run with the lock still held, and may deadlock with other running threads. The main goal of the code you removed was to avoid that kind of deadlock. So, I think you&apos;ve introduced a regression where a dealloc method can now deadlock if it waits on a lock owned by a thread waiting to run JavaScript.

A general rule in our API is that we never call out to client code while holding the lock. In fact, releaseDelayedObjectsNow() should ASSERT that the lock is not held, like so:

(1) ASSERT that lock is not held
(2) Acquire lock
(3) Increment recursion counter and do recursion check
(4) Take all items into temporary vector
(5) Release lock
(6) If temporary vector is empty, return
(7) Clear temporary vector
(8) Goto (1)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1068509</commentid>
    <comment_count>10</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-02-11 15:42:42 -0800</bug_when>
    <thetext>&gt; (1) ASSERT that lock is not held

...ASSERT that lock is not held *by current thread* (other threads are OK)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1068513</commentid>
    <comment_count>11</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-11 15:49:20 -0800</bug_when>
    <thetext>Reopened to address ggaren&apos;s concerns.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1072640</commentid>
    <comment_count>12</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-26 21:27:24 -0800</bug_when>
    <thetext>(In reply to comment #9)

&gt; A general rule in our API is that we never call out to client code while
&gt; holding the lock. In fact, releaseDelayedObjectsNow() should ASSERT that the
&gt; lock is not held, like so:
&gt; 
&gt; (1) ASSERT that lock is not by current thread held
&gt; (2) Acquire lock
&gt; (3) Increment recursion counter and do recursion check
&gt; (4) Take all items into temporary vector
&gt; (5) Release lock
&gt; (6) If temporary vector is empty, return
&gt; (7) Clear temporary vector
&gt; (8) Goto (1)

Tried implementing these steps and there is a problem with infinite recursion.  The first time through, you proceed through steps 1-5.  When the lock is released at step 5, we reenter performing steps 1, 2 and 3 at which point we realize that we have entered recursively.  In the process of exiting, we drop the lock and reenter.

I have implemented a variation where by we enter holding the lock.
(1) Increment recursion counter and do recursion check and exit if recursing
(2) ASSERT that lock is held by current thread
(3) Take all items into temporary Vector
(4) If temporary Vector is empty, return
(5) Release lock
(6) Clear temporary vector
(7) Reaquire lock
(8) Goto (2)

Not only is this recursive safe, but it satisfies the requirement that we release objects while not holding the lock.

I also added the requested comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1072641</commentid>
    <comment_count>13</comment_count>
      <attachid>247495</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-26 21:28:20 -0800</bug_when>
    <thetext>Created attachment 247495
Updated patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1072647</commentid>
    <comment_count>14</comment_count>
      <attachid>247495</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-02-26 21:37:41 -0800</bug_when>
    <thetext>Comment on attachment 247495
Updated patch.

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

&gt; Source/JavaScriptCore/heap/Heap.cpp:394
&gt; +            Vector&lt;RetainPtr&lt;CFTypeRef&gt;&gt; objectsToRelease;
&gt; +            objectsToRelease.swap(m_delayedReleaseObjects);

objectsToRelease = WTF::move(m_delayedReleaseObjects)

&gt; Source/JavaScriptCore/heap/Heap.cpp:404
&gt; +                while (!objectsToRelease.isEmpty())
&gt; +                    objectsToRelease.takeLast().clear();

If this code is hot: takeLast() is costly, especially if you chain them. Here you could loop over the whole array, clear every retain ptr, then the whole array backbuffer would be cleared when getting out of scope.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1072655</commentid>
    <comment_count>15</comment_count>
      <attachid>247499</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-26 22:16:25 -0800</bug_when>
    <thetext>Created attachment 247499
Updated with Benjamin&apos;s suggestions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1072740</commentid>
    <comment_count>16</comment_count>
      <attachid>247499</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-02-27 11:05:58 -0800</bug_when>
    <thetext>Comment on attachment 247499
Updated with Benjamin&apos;s suggestions.

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

&gt; Source/JavaScriptCore/heap/Heap.cpp:390
&gt; +        while (1) {

Can this be &quot;while (m_delayedReleaseObjects.size())&quot;?

&gt; Source/JavaScriptCore/heap/Heap.cpp:394
&gt; +            Vector&lt;RetainPtr&lt;CFTypeRef&gt;&gt; objectsToRelease;
&gt; +            objectsToRelease = WTF::move(m_delayedReleaseObjects);

Can this be one line instead of two?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1072742</commentid>
    <comment_count>17</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-02-27 11:07:04 -0800</bug_when>
    <thetext>Side questions:

(1) Can you update the title of this bug to reflect what&apos;s actually going on? We don&apos;t expect the CodeCache to be thread-safe -- or any other data structure in JSC -- so it&apos;s confusing to have a but title about CodeCache not being thread-safe.

(2) Can you turn your test case into a regression test?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1072745</commentid>
    <comment_count>18</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-27 11:10:44 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; Comment on attachment 247499 [details]
&gt; Updated with Benjamin&apos;s suggestions.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=247499&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/heap/Heap.cpp:390
&gt; &gt; +        while (1) {
&gt; 
&gt; Can this be &quot;while (m_delayedReleaseObjects.size())&quot;?
&gt; 
&gt; &gt; Source/JavaScriptCore/heap/Heap.cpp:394
&gt; &gt; +            Vector&lt;RetainPtr&lt;CFTypeRef&gt;&gt; objectsToRelease;
&gt; &gt; +            objectsToRelease = WTF::move(m_delayedReleaseObjects);
&gt; 
&gt; Can this be one line instead of two?

Yes on both counts.  

I prefer &quot;while (!m_delayedReleaseObjects.empty())&quot;.

Done in my source tree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1072750</commentid>
    <comment_count>19</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-02-27 11:19:25 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; Side questions:
&gt; 
&gt; (1) Can you update the title of this bug to reflect what&apos;s actually going
&gt; on? We don&apos;t expect the CodeCache to be thread-safe -- or any other data
&gt; structure in JSC -- so it&apos;s confusing to have a but title about CodeCache
&gt; not being thread-safe.

How about &quot;DelayedReleaseScope drops locks during GC which can cause a thread switch.&quot;

&gt; (2) Can you turn your test case into a regression test?

This is already tested in the testApi &quot;EvilAllocationObject&quot; test case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073892</commentid>
    <comment_count>20</comment_count>
      <attachid>247820</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-03-03 17:12:26 -0800</bug_when>
    <thetext>Created attachment 247820
Updated patch with regression test

The Objective-C++ anonymous block functions declarations fail the style checker.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073893</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-03-03 17:14:17 -0800</bug_when>
    <thetext>Attachment 247820 did not pass style-queue:


ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:133:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:144:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:157:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:167:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:175:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:236:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:246:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:298:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:339:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:359:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:367:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:371:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:375:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 13 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073894</commentid>
    <comment_count>22</comment_count>
      <attachid>247820</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-03-03 17:15:55 -0800</bug_when>
    <thetext>Comment on attachment 247820
Updated patch with regression test

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073916</commentid>
    <comment_count>23</comment_count>
      <attachid>247824</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-03-03 18:22:15 -0800</bug_when>
    <thetext>Created attachment 247824
Patch for landing with speculative fix for pre 10.10 Mac OS X builds</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073919</commentid>
    <comment_count>24</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-03-03 18:24:28 -0800</bug_when>
    <thetext>Attachment 247824 did not pass style-queue:


ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:132:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:143:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:156:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:166:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:174:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:235:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:245:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:297:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:338:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:358:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:366:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:370:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/API/tests/Regress141275.mm:374:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 13 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1073970</commentid>
    <comment_count>25</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-03-03 21:33:57 -0800</bug_when>
    <thetext>Committed r180992: &lt;http://trac.webkit.org/changeset/180992&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>246072</attachid>
            <date>2015-02-04 17:42:43 -0800</date>
            <delta_ts>2015-02-26 21:28:20 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>141275.patch</filename>
            <type>text/plain</type>
            <size>22569</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTc5NjU0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDYzIEBA
CisyMDE1LTAyLTA0ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIENvZGVDYWNoZSBpcyBub3QgdGhyZWFkIHNhZmUgd2hlbiBhZGRpbmcgdGhlIHNhbWUgc291
cmNlIGZyb20gdHdvIGRpZmZlcmVudCB0aHJlYWRzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDEyNzUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBNb3ZlZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBEZWxheWVk
UmVsZWFzZVNjb3BlIGRpcmVjdGx5IGludG8gSGVhcC4gIENoYW5nZWQgaXQgaW50bworICAgICAg
ICBhIHNpbXBsZSBsaXN0IHRoYXQgaXMgY2xlYXJlZCB3aXRoIHRoZSBuZXcgZnVuY3Rpb24gSGVh
cDo6cmVsZWFzZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMuCisgICAgICAgIE5vdyB3ZSBhY2N1bXVs
YXRlIG9iamVjdHMgdG8gYmUgcmVsZWFzZWQgYW5kIHJlbGVhc2UgdGhlbSB3aGVuIGFsbCBsb2Nr
cyBhcmUgZHJvcHBlZCBvcgorICAgICAgICB3aGVuIGRlc3Ryb3lpbmcgdGhlIEhlYXAuICBUaGlz
IGVsaW1pbmF0ZWQgdGhlIGRyb3BwaW5nIGFuZCByZWFxdWlyaW5nIG9mIGxvY2tzIGFzc29jaWF0
ZWQKKyAgICAgICAgd2l0aCB0aGUgb2xkIHNjb3BlIGZvcm0gb2YgdGhpcyBsaXN0LgorCisgICAg
ICAgIEdpdmVuIHRoYXQgYWxsIGZ1bmN0aW9uYWxpdHkgb2YgRGVsYXllZFJlbGVhc2VTY29wZSBp
cyBub3cgdXNlZCBhbmQgcmVmZXJlbmNlZCBieSBIZWFwCisgICAgICAgIGFuZCB0aGUgbG9jayBt
YW5hZ2VtZW50IG5vIGxvbmdlciBuZWVkcyB0byBiZSBkb25lLCBqdXN0IG1hZGUgdGhlIGxpc3Qg
YSBtZW1iZXIgb2YgSGVhcC4KKyAgICAgICAgV2UgZG8gbmVlZCB0byBndWFyZCBhZ2FpbnN0IHRo
ZSBjYXNlIHRoYXQgcmVsZWFzaW5nIGFuIG9iamVjdCBjYW4gY3JlYXRlIG1vcmUgb2JqZWN0cwor
ICAgICAgICBieSBjYWxsaW5nIGludG8gSlMuICBUaGlzIGNhc2UgaXMgYWN1YWxseSB0ZXN0ZWQg
YnkgdGVzdGFwaS5tbS4KKworICAgICAgICAqIGhlYXAvRGVsYXllZFJlbGVhc2VTY29wZS5oOiBS
ZW1vdmVkIGZpbGUKKworICAgICAgICAqIEFQSS9KU0FQSVdyYXBwZXJPYmplY3QubW06CisgICAg
ICAgICogQVBJL09iakNDYWxsYmFja0Z1bmN0aW9uLm1tOgorICAgICAgICAqIEphdmFTY3JpcHRD
b3JlLnZjeHByb2ovSmF2YVNjcmlwdENvcmUudmN4cHJvajoKKyAgICAgICAgKiBKYXZhU2NyaXB0
Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2ouZmlsdGVyczoKKyAgICAgICAgKiBK
YXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGhlYXAv
SW5jcmVtZW50YWxTd2VlcGVyLmNwcDoKKyAgICAgICAgKEpTQzo6SW5jcmVtZW50YWxTd2VlcGVy
Ojpkb1N3ZWVwKToKKyAgICAgICAgKiBoZWFwL01hcmtlZEFsbG9jYXRvci5jcHA6CisgICAgICAg
IChKU0M6Ok1hcmtlZEFsbG9jYXRvcjo6dHJ5QWxsb2NhdGVIZWxwZXIpOgorICAgICAgICAoSlND
OjpNYXJrZWRBbGxvY2F0b3I6OnRyeUFsbG9jYXRlKToKKyAgICAgICAgKiBoZWFwL01hcmtlZEJs
b2NrLmNwcDoKKyAgICAgICAgKEpTQzo6TWFya2VkQmxvY2s6OnN3ZWVwKToKKyAgICAgICAgKiBo
ZWFwL01hcmtlZFNwYWNlLmNwcDoKKyAgICAgICAgKEpTQzo6TWFya2VkU3BhY2U6Ok1hcmtlZFNw
YWNlKToKKyAgICAgICAgKEpTQzo6TWFya2VkU3BhY2U6Omxhc3RDaGFuY2VUb0ZpbmFsaXplKToK
KyAgICAgICAgKEpTQzo6TWFya2VkU3BhY2U6OmRpZEZpbmlzaEl0ZXJhdGluZyk6CisgICAgICAg
ICogaGVhcC9NYXJrZWRTcGFjZS5oOgorICAgICAgICAqIGhlYXAvSGVhcC5jcHA6CisgICAgICAg
IChKU0M6OkhlYXA6OmNvbGxlY3RBbGxHYXJiYWdlKToKKyAgICAgICAgKEpTQzo6SGVhcDo6em9t
YmlmeURlYWRPYmplY3RzKToKKyAgICAgICAgUmVtb3ZlZCByZWZlcmVuY2VzIHRvIERlbGF5ZWRS
ZWxlYXNlU2NvcGUgYW5kIERlbGF5ZWRSZWxlYXNlU2NvcGUuaC4KKworICAgICAgICAqIGhlYXAv
SGVhcC5jcHA6CisgICAgICAgIChKU0M6OkhlYXA6OkhlYXApOiBJbml0aWFsaXplZCBtX2RlbGF5
ZWRSZWxlYXNlUmVjdXJzaW9uQ291bnQuCisgICAgICAgIChKU0M6OkhlYXA6Omxhc3RDaGFuY2VU
b0ZpbmFsaXplKTogQ2FsbCByZWxlYXNlRGVsYXllZE9iamVjdHNOb3coKSBhcyB0aGUgVk0gaXMg
Z29pbmcgYXdheS4KKyAgICAgICAgKEpTQzo6SGVhcDo6cmVsZWFzZURlbGF5ZWRSZWxlYXNlZE9i
amVjdHMpOiBOZXcgZnVuY3Rpb24gdGhhdCByZWxlYXNlZCB0aGUgYWNjdW11bGF0ZWQKKyAgICAg
ICAgZGVsYXllZCByZWxlYXNlIG9iamVjdHMuCisKKyAgICAgICAgKiBoZWFwL0hlYXAuaDoKKyAg
ICAgICAgKEpTQzo6SGVhcDo6bV9kZWxheWVkUmVsZWFzZU9iamVjdHMpOiBMaXN0IG9mIG9iamVj
dHMgdG8gYmUgcmVsZWFzZWQgbGF0ZXIuCisgICAgICAgIChKU0M6OkhlYXA6Om1fZGVsYXllZFJl
bGVhc2VSZWN1cnNpb25Db3VudCk6IENvdW50ZXIgdG8gaW5kaWNhdGUgdGhhdAorICAgICAgICBy
ZWxlYXNlRGVsYXllZFJlbGVhc2VkT2JqZWN0cyBpcyBiZWluZyBjYWxsZWQgcmVjdXJzaXZlbHku
CisgICAgICAgICogaGVhcC9IZWFwSW5saW5lcy5oOgorICAgICAgICAoSlNDOjpIZWFwOjpyZWxl
YXNlU29vbik6IENoYW5nZWQgbG9jYXRpb24gb2YgbGlzdCB0byBhZGQgZGVsYXllZCByZWxlYXNl
IG9iamVjdHMuCisgICAgICAgIAorCisgICAgICAgICogcnVudGltZS9KU0xvY2suY3BwOgorICAg
ICAgICAoSlNDOjpKU0xvY2s6OndpbGxSZWxlYXNlTG9jayk6CisgICAgICAgIENhbGwgSGVhcDo6
cmVsZWFzZURlbGF5ZWRPYmplY3RzTm93KCkgd2hlbiByZWxlYXNpbmcgdGhlIGxvY2suCisKIDIw
MTUtMDItMDQgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgogCiAgICAgICAgIFVuZG8g
Z2FyZGVuaW5nOiBSZXN0b3JpbmcgdGhlIGV4cGVjdGVkIEVSUk9SIG1lc3NhZ2Ugc2luY2UgdGhh
dCBpcyBub3QgdGhlIGNhdXNlIG9mIHRoZSBib3QgdW5oYXBwaW5lc3MuCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQVBJL0pTQVBJV3JhcHBlck9iamVjdC5tbQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0pTQVBJV3JhcHBlck9iamVjdC5tbQkocmV2aXNpb24g
MTc5NjM2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9KU0FQSVdyYXBwZXJPYmplY3Qu
bW0JKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlICJKU0FQSVdyYXBwZXJPYmplY3QuaCIKIAotI2luY2x1ZGUgIkRlbGF5ZWRSZWxl
YXNlU2NvcGUuaCIKICNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCiAjaW5jbHVkZSAiSlNDYWxsYmFj
a09iamVjdC5oIgogI2luY2x1ZGUgIkpTVmlydHVhbE1hY2hpbmVJbnRlcm5hbC5oIgpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9PYmpDQ2FsbGJhY2tGdW5jdGlvbi5tbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL09iakNDYWxsYmFja0Z1bmN0aW9uLm1t
CShyZXZpc2lvbiAxNzk2MzYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL09iakNDYWxs
YmFja0Z1bmN0aW9uLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw3ICszMCw2IEBACiAKICNpbXBv
cnQgIkFQSUNhbGxiYWNrRnVuY3Rpb24uaCIKICNpbXBvcnQgIkFQSUNhc3QuaCIKLSNpbXBvcnQg
IkRlbGF5ZWRSZWxlYXNlU2NvcGUuaCIKICNpbXBvcnQgIkVycm9yLmgiCiAjaW1wb3J0ICJKU0NK
U1ZhbHVlSW5saW5lcy5oIgogI2ltcG9ydCAiSlNDZWxsLmgiCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9q
L0phdmFTY3JpcHRDb3JlLnZjeHByb2oJKHJldmlzaW9uIDE3OTYzNikKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2oJ
KHdvcmtpbmcgY29weSkKQEAgLTEyMzAsNyArMTIzMCw2IEBACiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlxoZWFwXENvcHlXb3JrTGlzdC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0i
Li5caGVhcFxDb3B5V3JpdGVCYXJyaWVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIu
LlxoZWFwXERlZmVyR0MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGhlYXBcRGVs
YXllZFJlbGVhc2VTY29wZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5caGVhcFxF
ZGVuR0NBY3Rpdml0eUNhbGxiYWNrLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxo
ZWFwXEZ1bGxHQ0FjdGl2aXR5Q2FsbGJhY2suaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9
Ii4uXGhlYXBcR0NBY3Rpdml0eUNhbGxiYWNrLmgiIC8+CkBAIC0xNzU1LDQgKzE3NTQsNCBAQAog
ICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgogICAgIDxJbXBvcnQgUHJv
amVjdD0iJChWQ1RhcmdldHNQYXRoKVxCdWlsZEN1c3RvbWl6YXRpb25zXG1hc20udGFyZ2V0cyIg
Lz4KICAgPC9JbXBvcnRHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBm
aWxlCis8L1Byb2plY3Q+CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENv
cmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qLmZpbHRlcnMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjeHByb2ovSmF2YVNjcmlwdENv
cmUudmN4cHJvai5maWx0ZXJzCShyZXZpc2lvbiAxNzk2MzYpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvSmF2YVNjcmlwdENvcmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qLmZpbHRl
cnMJKHdvcmtpbmcgY29weSkKQEAgLTM3NjgsOSArMzc2OCw2IEBACiAgICAgPENsSW5jbHVkZSBJ
bmNsdWRlPSIuLlxydW50aW1lXFN0YWNrQWxpZ25tZW50LmgiPgogICAgICAgPEZpbHRlcj5ydW50
aW1lPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIu
LlxoZWFwXERlbGF5ZWRSZWxlYXNlU2NvcGUuaCI+Ci0gICAgICA8RmlsdGVyPmhlYXA8L0ZpbHRl
cj4KLSAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGJ5dGVjb2Rl
XFZhcmlhYmxlV2F0Y2hwb2ludFNldC5oIj4KICAgICAgIDxGaWx0ZXI+Ynl0ZWNvZGU8L0ZpbHRl
cj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTQzODksNCArNDM4Niw0IEBACiAgICAgICA8RmlsdGVy
PmppdDwvRmlsdGVyPgogICAgIDwvTUFTTT4KICAgPC9JdGVtR3JvdXA+Ci08L1Byb2plY3Q+Clwg
Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDE3OTYzNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkp
CkBAIC04NjQsNyArODY0LDYgQEAKIAkJMkEwNUFCRDYxOTYxREYyNDAwMzQxNzUwIC8qIEpTUHJv
cGVydHlOYW1lRW51bWVyYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMkEwNUFCRDQxOTYxREYyNDAwMzQxNzUwIC8qIEpTUHJvcGVydHlOYW1lRW51
bWVyYXRvci5oICovOyB9OwogCQkyQTExMTI0NTE5MkZDRTc5MDA1RUUxOEQgLyogQ3VzdG9tR2V0
dGVyU2V0dGVyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDJBMTExMjQzMTkyRkNFNzkwMDVFRTE4RCAvKiBDdXN0b21HZXR0ZXJTZXR0ZXIuY3BwICov
OyB9OwogCQkyQTExMTI0NjE5MkZDRTc5MDA1RUUxOEQgLyogQ3VzdG9tR2V0dGVyU2V0dGVyLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyQTExMTI0NDE5
MkZDRTc5MDA1RUUxOEQgLyogQ3VzdG9tR2V0dGVyU2V0dGVyLmggKi87IHNldHRpbmdzID0ge0FU
VFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKLQkJMkEyODI1RDAxODM0MUYyRDAwODdGQkE5
IC8qIERlbGF5ZWRSZWxlYXNlU2NvcGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDJBMjgyNUNGMTgzNDFGMkQwMDg3RkJBOSAvKiBEZWxheWVkUmVsZWFz
ZVNjb3BlLmggKi87IH07CiAJCTJBNDhEMTkxMTc3MjM2NUIwMEM2NUE1RiAvKiBBUElDYWxsYmFj
a0Z1bmN0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBDMjExQjU3NDE3NkEyMjREMDAwRTJBMjMgLyogQVBJQ2FsbGJhY2tGdW5jdGlvbi5oICovOyB9
OwogCQkyQTRCQjdGMzE4QTQxMTc5MDA4QTBGQ0QgLyogSlNNYW5hZ2VkVmFsdWVJbnRlcm5hbC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkE0QkI3RjIx
OEE0MTE3OTAwOEEwRkNEIC8qIEpTTWFuYWdlZFZhbHVlSW50ZXJuYWwuaCAqLzsgfTsKIAkJMkE0
RUM5MEIxODYwRDZDMjAwOTRGNzgyIC8qIFdyaXRlQmFycmllckJ1ZmZlci5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyQTRFQzkwOTE4NjBENkMyMDA5
NEY3ODIgLyogV3JpdGVCYXJyaWVyQnVmZmVyLmNwcCAqLzsgfTsKQEAgLTI0OTksNyArMjQ5OCw2
IEBACiAJCTJBMDVBQkQ0MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0
b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNQcm9wZXJ0eU5hbWVFbnVt
ZXJhdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTJBMTExMjQzMTkyRkNFNzkw
MDVFRTE4RCAvKiBDdXN0b21HZXR0ZXJTZXR0ZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gQ3VzdG9tR2V0dGVyU2V0dGVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJMkExMTEyNDQxOTJGQ0U3OTAwNUVFMThEIC8qIEN1c3RvbUdldHRlclNldHRl
ci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDdXN0b21HZXR0ZXJTZXR0ZXIu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJMkEyODI1Q0YxODM0MUYyRDAwODdGQkE5
IC8qIERlbGF5ZWRSZWxlYXNlU2NvcGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gRGVsYXllZFJlbGVhc2VTY29wZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQky
QTM0M0Y3NDE4QTE3NDhCMDAzOUIwODUgLyogR0NTZWdtZW50ZWRBcnJheS5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBHQ1NlZ21lbnRlZEFycmF5Lmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTJBMzQzRjc3MThBMTc0OUQwMDM5QjA4NSAvKiBHQ1NlZ21lbnRlZEFy
cmF5SW5saW5lcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBHQ1NlZ21lbnRl
ZEFycmF5SW5saW5lcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyQTRCQjdGMjE4
QTQxMTc5MDA4QTBGQ0QgLyogSlNNYW5hZ2VkVmFsdWVJbnRlcm5hbC5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBKU01hbmFnZWRWYWx1ZUludGVybmFsLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CkBAIC0zODQ4LDcgKzM4NDYsNiBAQAogCQkJCTJBNjgyOTVBMTg3NUY4
MDUwMEI2QzNFMiAvKiBDb3B5V3JpdGVCYXJyaWVyLmggKi8sCiAJCQkJMkE3QTU4RUUxODA4QTRD
NDAwMjBCREY3IC8qIERlZmVyR0MuY3BwICovLAogCQkJCTBGMTM2RDRCMTc0QUQ2OUIwMDc1QjM1
NCAvKiBEZWZlckdDLmggKi8sCi0JCQkJMkEyODI1Q0YxODM0MUYyRDAwODdGQkE5IC8qIERlbGF5
ZWRSZWxlYXNlU2NvcGUuaCAqLywKIAkJCQlCQ0JFMkNBRDE0RTk4NUFBMDAwNTkzQUQgLyogR0NB
c3NlcnRpb25zLmggKi8sCiAJCQkJMEYyQjY2QTgxN0I2QjUzRDAwQTdBRTNGIC8qIEdDSW5jb21p
bmdSZWZDb3VudGVkLmggKi8sCiAJCQkJMEYyQjY2QTkxN0I2QjUzRDAwQTdBRTNGIC8qIEdDSW5j
b21pbmdSZWZDb3VudGVkSW5saW5lcy5oICovLApAQCAtNTUzNSw3ICs1NTMyLDYgQEAKIAkJCQlG
RUEwODYyMTE4MkI3QTA0MDBGNkQ4NTEgLyogRGVidWdnZXJQcmltaXRpdmVzLmggaW4gSGVhZGVy
cyAqLywKIAkJCQkwRjEzNkQ0RDE3NEFENjlFMDA3NUIzNTQgLyogRGVmZXJHQy5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJMEZDNzEyREYxN0NEODc3QzAwOENDOTNDIC8qIERlZmVycmVkQ29tcGlsYXRp
b25DYWxsYmFjay5oIGluIEhlYWRlcnMgKi8sCi0JCQkJMkEyODI1RDAxODM0MUYyRDAwODdGQkE5
IC8qIERlbGF5ZWRSZWxlYXNlU2NvcGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUE3N0E0MjNFMTdB
MEJCRkQwMEE4REI4MSAvKiBERkdBYnN0cmFjdEhlYXAuaCBpbiBIZWFkZXJzICovLAogCQkJCUE1
RUE3MEU4MTlGNUIxMDEwMDk4RjVFQyAvKiBBdWdtZW50YWJsZUluc3BlY3RvckNvbnRyb2xsZXJD
bGllbnQuaCBpbiBIZWFkZXJzICovLAogCQkJCUE3MDREOTAzMTdBMEJBQTgwMDZCQTU1NCAvKiBE
RkdBYnN0cmFjdEludGVycHJldGVyLmggaW4gSGVhZGVycyAqLywKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9oZWFwL0RlbGF5ZWRSZWxlYXNlU2NvcGUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaGVhcC9EZWxheWVkUmVsZWFzZVNjb3BlLmgJKHJldmlzaW9uIDE3
OTYzNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0RlbGF5ZWRSZWxlYXNlU2NvcGUu
aAkod29ya2luZyBjb3B5KQpAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0g
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYg
RGVsYXllZFJlbGVhc2VTY29wZV9oCi0jZGVmaW5lIERlbGF5ZWRSZWxlYXNlU2NvcGVfaAotCi0j
aW5jbHVkZSAiSGVhcC5oIgotI2luY2x1ZGUgIkpTTG9jay5oIgotI2luY2x1ZGUgIk1hcmtlZFNw
YWNlLmgiCi0KLW5hbWVzcGFjZSBKU0MgewotCi0jaWYgVVNFKENGKQotCi1jbGFzcyBEZWxheWVk
UmVsZWFzZVNjb3BlIHsKLXB1YmxpYzoKLSAgICBEZWxheWVkUmVsZWFzZVNjb3BlKE1hcmtlZFNw
YWNlJiBtYXJrZWRTcGFjZSkKLSAgICAgICAgOiBtX21hcmtlZFNwYWNlKG1hcmtlZFNwYWNlKQot
ICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX21hcmtlZFNwYWNlLm1fY3VycmVudERlbGF5ZWRSZWxl
YXNlU2NvcGUpOwotICAgICAgICBtX21hcmtlZFNwYWNlLm1fY3VycmVudERlbGF5ZWRSZWxlYXNl
U2NvcGUgPSB0aGlzOwotICAgIH0KLQotICAgIH5EZWxheWVkUmVsZWFzZVNjb3BlKCkKLSAgICB7
Ci0gICAgICAgIEFTU0VSVChtX21hcmtlZFNwYWNlLm1fY3VycmVudERlbGF5ZWRSZWxlYXNlU2Nv
cGUgPT0gdGhpcyk7Ci0gICAgICAgIG1fbWFya2VkU3BhY2UubV9jdXJyZW50RGVsYXllZFJlbGVh
c2VTY29wZSA9IG51bGxwdHI7Ci0KLSAgICAgICAgSGVhcE9wZXJhdGlvbiBvcGVyYXRpb25JblBy
b2dyZXNzID0gTm9PcGVyYXRpb247Ci0gICAgICAgIHN0ZDo6c3dhcChvcGVyYXRpb25JblByb2dy
ZXNzLCBtX21hcmtlZFNwYWNlLm1faGVhcC0+bV9vcGVyYXRpb25JblByb2dyZXNzKTsKLQotICAg
ICAgICB7Ci0gICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3MoKm1f
bWFya2VkU3BhY2UubV9oZWFwLT52bSgpKTsKLSAgICAgICAgICAgIG1fZGVsYXllZFJlbGVhc2VP
YmplY3RzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGQ6OnN3YXAob3BlcmF0aW9u
SW5Qcm9ncmVzcywgbV9tYXJrZWRTcGFjZS5tX2hlYXAtPm1fb3BlcmF0aW9uSW5Qcm9ncmVzcyk7
Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgdm9pZCByZWxlYXNlU29v
bihSZXRhaW5QdHI8VD4mJiBvYmplY3QpCi0gICAgewotICAgICAgICBtX2RlbGF5ZWRSZWxlYXNl
T2JqZWN0cy5hcHBlbmQoV1RGOjptb3ZlKG9iamVjdCkpOwotICAgIH0KLQotICAgIHN0YXRpYyBi
b29sIGlzSW5FZmZlY3RGb3IoTWFya2VkU3BhY2UmIG1hcmtlZFNwYWNlKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIG1hcmtlZFNwYWNlLm1fY3VycmVudERlbGF5ZWRSZWxlYXNlU2NvcGU7Ci0gICAg
fQotCi1wcml2YXRlOgotICAgIE1hcmtlZFNwYWNlJiBtX21hcmtlZFNwYWNlOwotICAgIFZlY3Rv
cjxSZXRhaW5QdHI8Q0ZUeXBlUmVmPj4gbV9kZWxheWVkUmVsZWFzZU9iamVjdHM7Ci19OwotCi10
ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSB2b2lkIE1hcmtlZFNwYWNlOjpyZWxlYXNlU29v
bihSZXRhaW5QdHI8VD4mJiBvYmplY3QpCi17Ci0gICAgQVNTRVJUKG1fY3VycmVudERlbGF5ZWRS
ZWxlYXNlU2NvcGUpOwotICAgIG1fY3VycmVudERlbGF5ZWRSZWxlYXNlU2NvcGUtPnJlbGVhc2VT
b29uKFdURjo6bW92ZShvYmplY3QpKTsKLX0KLQotI2Vsc2UgLy8gVVNFKENGKQotCi1jbGFzcyBE
ZWxheWVkUmVsZWFzZVNjb3BlIHsKLXB1YmxpYzoKLSAgICBEZWxheWVkUmVsZWFzZVNjb3BlKE1h
cmtlZFNwYWNlJikKLSAgICB7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgaXNJbkVmZmVjdEZv
cihNYXJrZWRTcGFjZSYpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Owot
Ci0jZW5kaWYgLy8gVVNFKENGKQotCi19IC8vIG5hbWVzcGFjZSBKU0MKLQotI2VuZGlmIC8vIERl
bGF5ZWRSZWxlYXNlU2NvcGVfaApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSGVh
cC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcC5jcHAJ
KHJldmlzaW9uIDE3OTYzNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXAuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiQ29waWVkU3BhY2VJ
bmxpbmVzLmgiCiAjaW5jbHVkZSAiQ29weVZpc2l0b3JJbmxpbmVzLmgiCiAjaW5jbHVkZSAiREZH
V29ya2xpc3QuaCIKLSNpbmNsdWRlICJEZWxheWVkUmVsZWFzZVNjb3BlLmgiCiAjaW5jbHVkZSAi
RWRlbkdDQWN0aXZpdHlDYWxsYmFjay5oIgogI2luY2x1ZGUgIkZ1bGxHQ0FjdGl2aXR5Q2FsbGJh
Y2suaCIKICNpbmNsdWRlICJHQ0FjdGl2aXR5Q2FsbGJhY2suaCIKQEAgLTMzNyw2ICszMzYsOSBA
QCBIZWFwOjpIZWFwKFZNKiB2bSwgSGVhcFR5cGUgaGVhcFR5cGUpCiAgICAgLCBtX3N3ZWVwZXIo
c3RkOjptYWtlX3VuaXF1ZTxJbmNyZW1lbnRhbFN3ZWVwZXI+KHRoaXMtPnZtKCkpKQogI2VuZGlm
CiAgICAgLCBtX2RlZmVycmFsRGVwdGgoMCkKKyNpZiBVU0UoQ0YpCisgICAgLCBtX2RlbGF5ZWRS
ZWxlYXNlUmVjdXJzaW9uQ291bnQoMCkKKyNlbmRpZgogewogICAgIG1fc3RvcmFnZVNwYWNlLmlu
aXQoKTsKICAgICBpZiAoT3B0aW9uczo6dmVyaWZ5SGVhcCgpKQpAQCAtMzYwLDYgKzM2MiwyMCBA
QCB2b2lkIEhlYXA6Omxhc3RDaGFuY2VUb0ZpbmFsaXplKCkKICAgICBSRUxFQVNFX0FTU0VSVCht
X29wZXJhdGlvbkluUHJvZ3Jlc3MgPT0gTm9PcGVyYXRpb24pOwogCiAgICAgbV9vYmplY3RTcGFj
ZS5sYXN0Q2hhbmNlVG9GaW5hbGl6ZSgpOworICAgIHJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmpl
Y3RzKCk7Cit9CisKK3ZvaWQgSGVhcDo6cmVsZWFzZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMoKQor
eworI2lmIFVTRShDRikKKyAgICBpZiAoIW1fZGVsYXllZFJlbGVhc2VSZWN1cnNpb25Db3VudCsr
KSB7CisgICAgICAgIHdoaWxlICghbV9kZWxheWVkUmVsZWFzZU9iamVjdHMuaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICBSZXRhaW5QdHI8Q0ZUeXBlUmVmPiBvYmplY3RUb1JlbGVhc2UgPSBtX2Rl
bGF5ZWRSZWxlYXNlT2JqZWN0cy50YWtlTGFzdCgpOworICAgICAgICAgICAgb2JqZWN0VG9SZWxl
YXNlLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbV9kZWxheWVkUmVsZWFzZVJlY3Vy
c2lvbkNvdW50LS07CisjZW5kaWYKIH0KIAogdm9pZCBIZWFwOjpyZXBvcnRFeHRyYU1lbW9yeUNv
c3RTbG93Q2FzZShzaXplX3QgY29zdCkKQEAgLTk2Niw3ICs5ODIsNiBAQCB2b2lkIEhlYXA6OmNv
bGxlY3RBbGxHYXJiYWdlKCkKICAgICBjb2xsZWN0KEZ1bGxDb2xsZWN0aW9uKTsKIAogICAgIFNh
bXBsaW5nUmVnaW9uIHNhbXBsaW5nUmVnaW9uKCJHYXJiYWdlIENvbGxlY3Rpb246IFN3ZWVwaW5n
Iik7Ci0gICAgRGVsYXllZFJlbGVhc2VTY29wZSBkZWxheWVkUmVsZWFzZVNjb3BlKG1fb2JqZWN0
U3BhY2UpOwogICAgIG1fb2JqZWN0U3BhY2Uuc3dlZXAoKTsKICAgICBtX29iamVjdFNwYWNlLnNo
cmluaygpOwogfQpAQCAtMTM3OCw3ICsxMzkzLDYgQEAgdm9pZCBIZWFwOjp6b21iaWZ5RGVhZE9i
amVjdHMoKQogICAgIC8vIFN3ZWVwIG5vdyBiZWNhdXNlIGRlc3RydWN0b3JzIHdpbGwgY3Jhc2gg
b25jZSB3ZSdyZSB6b21iaWZpZWQuCiAgICAgewogICAgICAgICBTYW1wbGluZ1JlZ2lvbiBzYW1w
bGluZ1JlZ2lvbigiR2FyYmFnZSBDb2xsZWN0aW9uOiBTd2VlcGluZyIpOwotICAgICAgICBEZWxh
eWVkUmVsZWFzZVNjb3BlIGRlbGF5ZWRSZWxlYXNlU2NvcGUobV9vYmplY3RTcGFjZSk7CiAgICAg
ICAgIG1fb2JqZWN0U3BhY2Uuem9tYmlmeVN3ZWVwKCk7CiAgICAgfQogICAgIEhlYXBJdGVyYXRp
b25TY29wZSBpdGVyYXRpb25TY29wZSgqdGhpcyk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvaGVhcC9IZWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAv
SGVhcC5oCShyZXZpc2lvbiAxNzk2MzYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9I
ZWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTExNSw2ICsxMTUsNyBAQCBwdWJsaWM6CiAgICAgSGVh
cChWTSosIEhlYXBUeXBlKTsKICAgICB+SGVhcCgpOwogICAgIEpTX0VYUE9SVF9QUklWQVRFIHZv
aWQgbGFzdENoYW5jZVRvRmluYWxpemUoKTsKKyAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lkIHJl
bGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKCk7CiAKICAgICBWTSogdm0oKSBjb25zdCB7IHJl
dHVybiBtX3ZtOyB9CiAgICAgTWFya2VkU3BhY2UmIG9iamVjdFNwYWNlKCkgeyByZXR1cm4gbV9v
YmplY3RTcGFjZTsgfQpAQCAtMjMxLDcgKzIzMiw2IEBAIHByaXZhdGU6CiAgICAgZnJpZW5kIGNs
YXNzIENvcGllZEJsb2NrOwogICAgIGZyaWVuZCBjbGFzcyBEZWZlckdDOwogICAgIGZyaWVuZCBj
bGFzcyBEZWZlckdDRm9yQVdoaWxlOwotICAgIGZyaWVuZCBjbGFzcyBEZWxheWVkUmVsZWFzZVNj
b3BlOwogICAgIGZyaWVuZCBjbGFzcyBHQ0F3YXJlSklUU3R1YlJvdXRpbmU7CiAgICAgZnJpZW5k
IGNsYXNzIEdDTG9nZ2luZzsKICAgICBmcmllbmQgY2xhc3MgSGFuZGxlU2V0OwpAQCAtMzg3LDYg
KzM4NywxMCBAQCBwcml2YXRlOgogICAgIFZlY3RvcjxERkc6OldvcmtsaXN0Kj4gbV9zdXNwZW5k
ZWRDb21waWxlcldvcmtsaXN0czsKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxIZWFwVmVyaWZpZXI+
IG1fdmVyaWZpZXI7CisjaWYgVVNFKENGKQorICAgIFZlY3RvcjxSZXRhaW5QdHI8Q0ZUeXBlUmVm
Pj4gbV9kZWxheWVkUmVsZWFzZU9iamVjdHM7CisgICAgdW5zaWduZWQgbV9kZWxheWVkUmVsZWFz
ZVJlY3Vyc2lvbkNvdW50OworI2VuZGlmCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXBJbmxpbmVzLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcElubGluZXMuaAkocmV2aXNpb24gMTc5NjM2
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcElubGluZXMuaAkod29ya2luZyBj
b3B5KQpAQCAtMjQ5LDcgKzI0OSw3IEBAIGlubGluZSBCbG9ja0FsbG9jYXRvciYgSGVhcDo6Ymxv
Y2tBbGxvY2EKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogaW5saW5lIHZvaWQgSGVhcDo6cmVsZWFz
ZVNvb24oUmV0YWluUHRyPFQ+JiYgb2JqZWN0KQogewotICAgIG1fb2JqZWN0U3BhY2UucmVsZWFz
ZVNvb24oV1RGOjptb3ZlKG9iamVjdCkpOworICAgIG1fZGVsYXllZFJlbGVhc2VPYmplY3RzLmFw
cGVuZChXVEY6Om1vdmUob2JqZWN0KSk7CiB9CiAjZW5kaWYKIApJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2hlYXAvSW5jcmVtZW50YWxTd2VlcGVyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaGVhcC9JbmNyZW1lbnRhbFN3ZWVwZXIuY3BwCShyZXZpc2lvbiAx
Nzk2MzYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9JbmNyZW1lbnRhbFN3ZWVwZXIu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgi
CiAjaW5jbHVkZSAiSW5jcmVtZW50YWxTd2VlcGVyLmgiCiAKLSNpbmNsdWRlICJEZWxheWVkUmVs
ZWFzZVNjb3BlLmgiCiAjaW5jbHVkZSAiSGVhcC5oIgogI2luY2x1ZGUgIkpTT2JqZWN0LmgiCiAj
aW5jbHVkZSAiSlNTdHJpbmcuaCIKQEAgLTY4LDcgKzY3LDYgQEAgdm9pZCBJbmNyZW1lbnRhbFN3
ZWVwZXI6OmRvV29yaygpCiAKIHZvaWQgSW5jcmVtZW50YWxTd2VlcGVyOjpkb1N3ZWVwKGRvdWJs
ZSBzd2VlcEJlZ2luVGltZSkKIHsKLSAgICBEZWxheWVkUmVsZWFzZVNjb3BlIHNjb3BlKG1fdm0t
PmhlYXAubV9vYmplY3RTcGFjZSk7CiAgICAgd2hpbGUgKG1fY3VycmVudEJsb2NrVG9Td2VlcElu
ZGV4IDwgbV9ibG9ja3NUb1N3ZWVwLnNpemUoKSkgewogICAgICAgICBzd2VlcE5leHRCbG9jaygp
OwogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRBbGxvY2F0b3IuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01hcmtlZEFsbG9jYXRv
ci5jcHAJKHJldmlzaW9uIDE3OTYzNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01h
cmtlZEFsbG9jYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNs
dWRlICJjb25maWcuaCIKICNpbmNsdWRlICJNYXJrZWRBbGxvY2F0b3IuaCIKIAotI2luY2x1ZGUg
IkRlbGF5ZWRSZWxlYXNlU2NvcGUuaCIKICNpbmNsdWRlICJHQ0FjdGl2aXR5Q2FsbGJhY2suaCIK
ICNpbmNsdWRlICJIZWFwLmgiCiAjaW5jbHVkZSAiSW5jcmVtZW50YWxTd2VlcGVyLmgiCkBAIC02
MiwxMSArNjEsMTAgQEAgYm9vbCBNYXJrZWRBbGxvY2F0b3I6OmlzUGFnZWRPdXQoZG91YmxlIAog
CiBpbmxpbmUgdm9pZCogTWFya2VkQWxsb2NhdG9yOjp0cnlBbGxvY2F0ZUhlbHBlcihzaXplX3Qg
Ynl0ZXMpCiB7Ci0gICAgLy8gV2UgbmVlZCBhIHdoaWxlIGxvb3AgdG8gY2hlY2sgdGhlIGZyZWUg
bGlzdCBiZWNhdXNlIHRoZSBEZWxheWVkUmVsZWFzZVNjb3BlIAorICAgIC8vIFdlIG5lZWQgYSB3
aGlsZSBsb29wIHRvIGNoZWNrIHRoZSBmcmVlIGxpc3QgYmVjYXVzZSB0aGUgRGVsYXllZFJlbGVh
c2VMaXN0CiAgICAgLy8gY291bGQgY2F1c2UgYXJiaXRyYXJ5IGNvZGUgdG8gZXhlY3V0ZSBhbmQg
ZXhoYXVzdCB0aGUgZnJlZSBsaXN0IHRoYXQgd2UgCiAgICAgLy8gdGhvdWdodCBoYWQgZWxlbWVu
dHMgaW4gaXQuCiAgICAgd2hpbGUgKCFtX2ZyZWVMaXN0LmhlYWQpIHsKLSAgICAgICAgRGVsYXll
ZFJlbGVhc2VTY29wZSBkZWxheWVkUmVsZWFzZVNjb3BlKCptX21hcmtlZFNwYWNlKTsKICAgICAg
ICAgaWYgKG1fY3VycmVudEJsb2NrKSB7CiAgICAgICAgICAgICBBU1NFUlQobV9jdXJyZW50Qmxv
Y2sgPT0gbV9uZXh0QmxvY2tUb1N3ZWVwKTsKICAgICAgICAgICAgIG1fY3VycmVudEJsb2NrLT5k
aWRDb25zdW1lRnJlZUxpc3QoKTsKQEAgLTEyOCw3ICsxMjYsNyBAQCBpbmxpbmUgdm9pZCogTWFy
a2VkQWxsb2NhdG9yOjp0cnlBbGxvY2F0CiAgICAgbV9oZWFwLT5tX29wZXJhdGlvbkluUHJvZ3Jl
c3MgPSBBbGxvY2F0aW9uOwogICAgIHZvaWQqIHJlc3VsdCA9IHRyeUFsbG9jYXRlSGVscGVyKGJ5
dGVzKTsKIAotICAgIC8vIER1ZSB0byB0aGUgRGVsYXllZFJlbGVhc2VTY29wZSBpbiB0cnlBbGxv
Y2F0ZUhlbHBlciwgc29tZSBvdGhlciB0aHJlYWQgbWlnaHQgaGF2ZQorICAgIC8vIER1ZSB0byB0
aGUgRGVsYXllZFJlbGVhc2VMaXN0IGluIHRyeUFsbG9jYXRlSGVscGVyLCBzb21lIG90aGVyIHRo
cmVhZCBtaWdodCBoYXZlCiAgICAgLy8gY3JlYXRlZCBhIG5ldyBibG9jayBhZnRlciB3ZSB0aG91
Z2h0IHdlIGRpZG4ndCBmaW5kIGFueSBmcmVlIGNlbGxzLiAKICAgICB3aGlsZSAoIXJlc3VsdCAm
JiBtX2N1cnJlbnRCbG9jaykgewogICAgICAgICAvLyBBIG5ldyBibG9jayB3YXMgYWRkZWQgYnkg
YW5vdGhlciB0aHJlYWQgc28gdHJ5IHBvcHBpbmcgdGhlIGZyZWUgbGlzdC4KSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01hcmtlZEJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRCbG9jay5jcHAJKHJldmlzaW9uIDE3OTYzNikK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01hcmtlZEJsb2NrLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIk1h
cmtlZEJsb2NrLmgiCiAKLSNpbmNsdWRlICJEZWxheWVkUmVsZWFzZVNjb3BlLmgiCiAjaW5jbHVk
ZSAiSW5jcmVtZW50YWxTd2VlcGVyLmgiCiAjaW5jbHVkZSAiSlNDZWxsLmgiCiAjaW5jbHVkZSAi
SlNEZXN0cnVjdGlibGVPYmplY3QuaCIKQEAgLTExMCw3ICsxMDksNiBAQCBNYXJrZWRCbG9jazo6
RnJlZUxpc3QgTWFya2VkQmxvY2s6OnNwZWNpCiAKIE1hcmtlZEJsb2NrOjpGcmVlTGlzdCBNYXJr
ZWRCbG9jazo6c3dlZXAoU3dlZXBNb2RlIHN3ZWVwTW9kZSkKIHsKLSAgICBBU1NFUlQoRGVsYXll
ZFJlbGVhc2VTY29wZTo6aXNJbkVmZmVjdEZvcihoZWFwKCktPm1fb2JqZWN0U3BhY2UpKTsKICAg
ICBIRUFQX0xPR19CTE9DS19TVEFURV9UUkFOU0lUSU9OKHRoaXMpOwogCiAgICAgbV93ZWFrU2V0
LnN3ZWVwKCk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRTcGFjZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkU3BhY2Uu
Y3BwCShyZXZpc2lvbiAxNzk2MzYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJr
ZWRTcGFjZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJNYXJrZWRTcGFjZS5oIgogCi0jaW5jbHVkZSAiRGVsYXllZFJl
bGVhc2VTY29wZS5oIgogI2luY2x1ZGUgIkluY3JlbWVudGFsU3dlZXBlci5oIgogI2luY2x1ZGUg
IkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAiSlNMb2NrLmgiCkBAIC04Miw3ICs4MSw2IEBA
IE1hcmtlZFNwYWNlOjpNYXJrZWRTcGFjZShIZWFwKiBoZWFwKQogICAgIDogbV9oZWFwKGhlYXAp
CiAgICAgLCBtX2NhcGFjaXR5KDApCiAgICAgLCBtX2lzSXRlcmF0aW5nKGZhbHNlKQotICAgICwg
bV9jdXJyZW50RGVsYXllZFJlbGVhc2VTY29wZShudWxscHRyKQogewogICAgIGZvciAoc2l6ZV90
IGNlbGxTaXplID0gcHJlY2lzZVN0ZXA7IGNlbGxTaXplIDw9IHByZWNpc2VDdXRvZmY7IGNlbGxT
aXplICs9IHByZWNpc2VTdGVwKSB7CiAgICAgICAgIGFsbG9jYXRvckZvcihjZWxsU2l6ZSkuaW5p
dChoZWFwLCB0aGlzLCBjZWxsU2l6ZSwgTWFya2VkQmxvY2s6Ok5vbmUpOwpAQCAtMTE0LDcgKzEx
Miw2IEBAIHN0cnVjdCBMYXN0Q2hhbmNlVG9GaW5hbGl6ZSB7CiAKIHZvaWQgTWFya2VkU3BhY2U6
Omxhc3RDaGFuY2VUb0ZpbmFsaXplKCkKIHsKLSAgICBEZWxheWVkUmVsZWFzZVNjb3BlIGRlbGF5
ZWRSZWxlYXNlU2NvcGUoKnRoaXMpOwogICAgIHN0b3BBbGxvY2F0aW5nKCk7CiAgICAgZm9yRWFj
aEFsbG9jYXRvcjxMYXN0Q2hhbmNlVG9GaW5hbGl6ZT4oKTsKIH0KQEAgLTM2Miw3ICszNTksNiBA
QCB2b2lkIE1hcmtlZFNwYWNlOjp3aWxsU3RhcnRJdGVyYXRpbmcoKQogdm9pZCBNYXJrZWRTcGFj
ZTo6ZGlkRmluaXNoSXRlcmF0aW5nKCkKIHsKICAgICBBU1NFUlQoaXNJdGVyYXRpbmcoKSk7Ci0g
ICAgRGVsYXllZFJlbGVhc2VTY29wZSBzY29wZSgqdGhpcyk7CiAgICAgcmVzdW1lQWxsb2NhdGlu
ZygpOwogICAgIG1faXNJdGVyYXRpbmcgPSBmYWxzZTsKIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9oZWFwL01hcmtlZFNwYWNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2hlYXAvTWFya2VkU3BhY2UuaAkocmV2aXNpb24gMTc5NjM2KQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkU3BhY2UuaAkod29ya2luZyBjb3B5KQpAQCAtMzYsNyAr
MzYsNiBAQAogCiBuYW1lc3BhY2UgSlNDIHsKIAotY2xhc3MgRGVsYXllZFJlbGVhc2VTY29wZTsK
IGNsYXNzIEhlYXA7CiBjbGFzcyBIZWFwSXRlcmF0aW9uU2NvcGU7CiBjbGFzcyBKU0NlbGw7CkBA
IC0xNjEsNyArMTYwLDYgQEAgcHVibGljOgogI2VuZGlmCiAKIHByaXZhdGU6Ci0gICAgZnJpZW5k
IGNsYXNzIERlbGF5ZWRSZWxlYXNlU2NvcGU7CiAgICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0
c0V4dHJhY3RvcjsKICAgICBmcmllbmQgY2xhc3MgSklUOwogCkBAIC0xNzcsOCArMTc1LDYgQEAg
cHJpdmF0ZToKICAgICBib29sIG1faXNJdGVyYXRpbmc7CiAgICAgTWFya2VkQmxvY2tTZXQgbV9i
bG9ja3M7CiAgICAgVmVjdG9yPE1hcmtlZEJsb2NrKj4gbV9ibG9ja3NXaXRoTmV3T2JqZWN0czsK
LQotICAgIERlbGF5ZWRSZWxlYXNlU2NvcGUqIG1fY3VycmVudERlbGF5ZWRSZWxlYXNlU2NvcGU7
CiB9OwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPiBpbmxpbmUgdHlwZW5hbWUgRnVuY3Rv
cjo6UmV0dXJuVHlwZSBNYXJrZWRTcGFjZTo6Zm9yRWFjaExpdmVDZWxsKEhlYXBJdGVyYXRpb25T
Y29wZSYsIEZ1bmN0b3ImIGZ1bmN0b3IpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9KU0xvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0pTTG9jay5jcHAJKHJldmlzaW9uIDE3OTYzNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0pTTG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3MSw4ICsxNzEsMTAgQEAg
dm9pZCBKU0xvY2s6OnVubG9jayhpbnRwdHJfdCB1bmxvY2tDb3VudAogCiB2b2lkIEpTTG9jazo6
d2lsbFJlbGVhc2VMb2NrKCkKIHsKLSAgICBpZiAobV92bSkKKyAgICBpZiAobV92bSkgeworICAg
ICAgICBtX3ZtLT5oZWFwLnJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKCk7CiAgICAgICAg
IG1fdm0tPnNldFN0YWNrUG9pbnRlckF0Vk1FbnRyeShudWxscHRyKTsKKyAgICB9CiAKICAgICBp
ZiAobV9lbnRyeUF0b21pY1N0cmluZ1RhYmxlKSB7CiAgICAgICAgIHd0ZlRocmVhZERhdGEoKS5z
ZXRDdXJyZW50QXRvbWljU3RyaW5nVGFibGUobV9lbnRyeUF0b21pY1N0cmluZ1RhYmxlKTsK
</data>
<flag name="review"
          id="271013"
          type_id="1"
          status="-"
          setter="ggaren"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247495</attachid>
            <date>2015-02-26 21:28:20 -0800</date>
            <delta_ts>2015-02-26 22:16:25 -0800</delta_ts>
            <desc>Updated patch.</desc>
            <filename>141275-update1.patch</filename>
            <type>text/plain</type>
            <size>4386</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgwNzIyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMyIEBA
CisyMDE1LTAyLTI2ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIENvZGVDYWNoZSBpcyBub3QgdGhyZWFkIHNhZmUgd2hlbiBhZGRpbmcgdGhlIHNhbWUgc291
cmNlIGZyb20gdHdvIGRpZmZlcmVudCB0aHJlYWRzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDEyNzUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBVcGRhdGVkIHJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmpl
Y3RzKCkgc28gdGhhdCBvYmplY3RzIGFyZSByZWxlYXNlZCB3aXRoIGFsbCBsb2NrcworICAgICAg
ICBkcm9wcGVkLiAgTm93IGl0cyBwcm9jZXNzaW5nIGZvbGxvd3MgdGhlc2Ugc3RlcHMKKyAgICAg
ICAgICAgICgxKSBJbmNyZW1lbnQgcmVjdXJzaW9uIGNvdW50ZXIgYW5kIGRvIHJlY3Vyc2lvbiBj
aGVjayBhbmQgZXhpdCBpZiByZWN1cnNpbmcKKyAgICAgICAgICAgICgyKSBBU1NFUlQgdGhhdCBs
b2NrIGlzIGhlbGQgYnkgY3VycmVudCB0aHJlYWQKKyAgICAgICAgICAgICgzKSBUYWtlIGFsbCBp
dGVtcyBmcm9tIGRlbGF5ZWQgcmVsZWFzZSBWZWN0b3IgYW5kIHB1dCBpbnRvIHRlbXBvcmFyeSBW
ZWN0b3IKKyAgICAgICAgICAgICg0KSBJZiB0ZW1wb3JhcnkgVmVjdG9yIGlzIGVtcHR5LCByZXR1
cm4KKyAgICAgICAgICAgICg1KSBSZWxlYXNlIEFQSSBsb2NrCisgICAgICAgICAgICAoNikgUmVs
ZWFzZSBhbmQgY2xlYXIgaXRlbXMgZnJvbSB0ZW1wb3JhcnkgdmVjdG9yCisgICAgICAgICAgICAo
NykgUmVhcXVpcmUgQVBJIGxvY2sKKyAgICAgICAgICAgICg4KSBHb3RvICgyKQorICAgICAgICBU
aGlzIG1lZXRzIHRoZSByZXF1aXJlbWVudCB0aGF0IHdlIHJlbGVhc2Ugd2hpbGUgdGhlIEFQSSBs
b2NrIGlzIHJlbGVhc2VkIGFuZCBpdCBpcworICAgICAgICBzYWZlciBwcm9jZXNzaW5nIG9mIHRo
ZSBkZWxheWVkIHJlbGVhc2UgVmVjdG9yLgorCisgICAgICAgIEFsc28gYWRkZWQgY29tbWVudCBk
ZXNjcmliaW5nIGhvdyByZWN1cnNpb24gaW50byByZWxlYXNlRGVsYXllZFJlbGVhc2VkT2JqZWN0
cygpIGlzCisgICAgICAgIHByZXZlbnRlZC4KKworICAgICAgICAqIGhlYXAvSGVhcC5jcHA6Cisg
ICAgICAgIChKU0M6OkhlYXA6OnJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKToKKyAgICAg
ICAgKiBydW50aW1lL0pTTG9jay5jcHA6CisgICAgICAgIChKU0M6OkpTTG9jazo6dW5sb2NrKTog
Q2hhbmdlZCB0aGUgcHJvY2Vzc2luZyBvZiB3aWxsUmVsZWFzZUxvY2soKSBzbyB0aGF0IGR1cmlu
ZyBpdHMKKyAgICAgICAgZXhlY3V0aW9uIGFuZCB0aGF0IG9mIGl0cyBjYWxsZWUncywgY3VycmVu
dFRocmVhZElzSG9sZGluZ0xvY2soKSBpcyB0cnVlLgorCiAyMDE1LTAyLTI2ICBNYXJrIExhbSAg
PG1hcmsubGFtQGFwcGxlLmNvbT4KIAogICAgICAgICBBc3NlcnRpb24gZml4IGZvciByMTgwNzEx
OiBUaGUgYm9vbCByZXR1cm5pbmcgZm9ybSBvZiBCeXRlY29kZUdlbmVyYXRvcjo6YWRkVmFyKCkg
Y2FuIGJlIHJlbW92ZWQuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmNwcAkocmV2
aXNpb24gMTgwNjgzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM3OSwxMCArMzc5LDMwIEBAIHZvaWQgSGVhcDo6bGFzdENoYW5jZVRv
RmluYWxpemUoKQogdm9pZCBIZWFwOjpyZWxlYXNlRGVsYXllZFJlbGVhc2VkT2JqZWN0cygpCiB7
CiAjaWYgVVNFKENGKQorICAgIC8vIFdlIG5lZWQgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgY2FzZSB0
aGF0IHJlbGVhc2luZyBhbiBvYmplY3QgY2FuIGNyZWF0ZSBtb3JlIG9iamVjdHMgZHVlIHRvIHRo
ZQorICAgIC8vIHJlbGVhc2UgY2FsbGluZyBpbnRvIEpTLiBXaGVuIHRob3NlIEpTIGNhbGwocykg
ZXhpdCBhbmQgYWxsIGxvY2tzIGFyZSBiZWluZyBkcm9wcGVkIHdlIGVuZCB1cAorICAgIC8vIGJh
Y2sgaGVyZSBhbmQgY291bGQgdHJ5IHRvIHJlY3Vyc2l2ZWx5IHJlbGVhc2Ugb2JqZWN0cy4gV2Ug
Z3VhcmQgdGhhdCB3aXRoIGEgcmVjdXJzaXZlIGVudHJ5CisgICAgLy8gY291bnQuIE9ubHkgdGhl
IGluaXRpYWwgY2FsbCB3aWxsIHJlbGVhc2Ugb2JqZWN0cywgcmVjdXJzaXZlIGNhbGxzIHNpbXBs
ZSByZXR1cm4gYW5kIGxldCB0aGUKKyAgICAvLyB0aGUgaW5pdGlhbCBjYWxsIHRvIHRoZSBmdW5j
dGlvbiB0YWtlIGNhcmUgb2YgYW55IG9iamVjdHMgY3JlYXRlZCBkdXJpbmcgcmVsZWFzZSB0aW1l
LgorICAgIC8vIFRoaXMgYWxzbyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gbG9vcCB1bnRpbCB0aGVy
ZSBhcmUgbm8gb2JqZWN0cyBpbiBtX2RlbGF5ZWRSZWxlYXNlT2JqZWN0cworICAgIC8vIGFuZCB1
c2UgYSB0ZW1wIFZlY3RvciBmb3IgdGhlIGFjdHVhbCByZWxlYXNpbmcuCiAgICAgaWYgKCFtX2Rl
bGF5ZWRSZWxlYXNlUmVjdXJzaW9uQ291bnQrKykgewotICAgICAgICB3aGlsZSAoIW1fZGVsYXll
ZFJlbGVhc2VPYmplY3RzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgUmV0YWluUHRyPENGVHlw
ZVJlZj4gb2JqZWN0VG9SZWxlYXNlID0gbV9kZWxheWVkUmVsZWFzZU9iamVjdHMudGFrZUxhc3Qo
KTsKLSAgICAgICAgICAgIG9iamVjdFRvUmVsZWFzZS5jbGVhcigpOworICAgICAgICB3aGlsZSAo
MSkgeworICAgICAgICAgICAgQVNTRVJUKG1fdm0tPmN1cnJlbnRUaHJlYWRJc0hvbGRpbmdBUElM
b2NrKCkpOworCisgICAgICAgICAgICBWZWN0b3I8UmV0YWluUHRyPENGVHlwZVJlZj4+IG9iamVj
dHNUb1JlbGVhc2U7CisgICAgICAgICAgICBvYmplY3RzVG9SZWxlYXNlLnN3YXAobV9kZWxheWVk
UmVsZWFzZU9iamVjdHMpOworCisgICAgICAgICAgICBpZiAob2JqZWN0c1RvUmVsZWFzZS5pc0Vt
cHR5KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICAvLyBXZSBuZWVkIHRvIGRyb3AgbG9ja3MgYmVmb3JlIGNhbGxpbmcgb3V0IHRvIGFy
Yml0cmFyeSBjb2RlLgorICAgICAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BB
bGxMb2NrcyhtX3ZtKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICghb2JqZWN0c1RvUmVsZWFz
ZS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIG9iamVjdHNUb1JlbGVhc2UudGFrZUxh
c3QoKS5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIG1fZGVs
YXllZFJlbGVhc2VSZWN1cnNpb25Db3VudC0tOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvSlNMb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9KU0xvY2suY3BwCShyZXZpc2lvbiAxODA2ODMpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU0xvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTcsMTAgKzE1Nywx
NCBAQCB2b2lkIEpTTG9jazo6dW5sb2NrKGludHB0cl90IHVubG9ja0NvdW50CiAgICAgUkVMRUFT
RV9BU1NFUlQoY3VycmVudFRocmVhZElzSG9sZGluZ0xvY2soKSk7CiAgICAgQVNTRVJUKG1fbG9j
a0NvdW50ID49IHVubG9ja0NvdW50KTsKIAorICAgIC8vIE1haW50YWluIG1fbG9ja0NvdW50IHdo
aWxlIGNhbGxpbmcgd2lsbFJlbGVhc2VMb2NrKCkgc28gdGhhdCBpdHMgY2FsbGVlcyBrbm93IHRo
YXQKKyAgICAvLyB0aGV5IHN0aWxsIGhhdmUgdGhlIGxvY2suCisgICAgaWYgKHVubG9ja0NvdW50
ID09IG1fbG9ja0NvdW50KQorICAgICAgICB3aWxsUmVsZWFzZUxvY2soKTsKKwogICAgIG1fbG9j
a0NvdW50IC09IHVubG9ja0NvdW50OwogCiAgICAgaWYgKCFtX2xvY2tDb3VudCkgewotICAgICAg
ICB3aWxsUmVsZWFzZUxvY2soKTsKIAogICAgICAgICBpZiAoIW1faGFzRXhjbHVzaXZlVGhyZWFk
KSB7CiAgICAgICAgICAgICBtX293bmVyVGhyZWFkSUQgPSBzdGQ6OnRocmVhZDo6aWQoKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247499</attachid>
            <date>2015-02-26 22:16:25 -0800</date>
            <delta_ts>2015-03-03 17:12:26 -0800</delta_ts>
            <desc>Updated with Benjamin&apos;s suggestions.</desc>
            <filename>141275-update1A.patch</filename>
            <type>text/plain</type>
            <size>5101</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgwNzIyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQxIEBA
CisyMDE1LTAyLTI2ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIENvZGVDYWNoZSBpcyBub3QgdGhyZWFkIHNhZmUgd2hlbiBhZGRpbmcgdGhlIHNhbWUgc291
cmNlIGZyb20gdHdvIGRpZmZlcmVudCB0aHJlYWRzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDEyNzUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBUaGUgb3JpZ2luYWwgaXNzdWUgaXMgdGhhdCB0aGUgQ29k
ZUNhY2hlIHVzZXMgYW4gdW5zYWZlIG1ldGhvZCB0byBhZGQgbmV3IFVubGlua2VkQ29kZUJsb2Nr
cy4KKyAgICAgICAgSXQgYmFzaWNhbGx5IGFkZHMgYSBudWxsIFVubGlua2VkQ29kZUJsb2NrIGlm
IHRoZXJlIGlzbid0IGEgY2FjaGVkIGVudHJ5IGFuZCB0aGVuIGxhdGVyCisgICAgICAgIHVwZGF0
ZXMgdGhlIG51bGwgZW50cnkgdG8gdGhlIHJlc3VsdCBvZiB0aGUgY29tcGlsYXRpb24uICBJZiBk
dXJpbmcgdGhhdCBjb21waWxhdGlvbiBhbmQKKyAgICAgICAgcmVsYXRlZCBwcm9jZXNzaW5nIHdl
IG5lZWQgdG8gZ2FyYmFnZSBjb2xsZWN0LCB0aGUgRGVsYXllZFJlbGVhc2VTY29wZSB3b3VsZCBk
cm9wIGxvY2tzCisgICAgICAgIHBvc3NpYmx5IGFsbG93aW5nIGFub3RoZXIgdGhyZWFkIHRvIHRy
eSB0byBnZXQgdGhlIHNhbWUgc291cmNlIG91dCBvZiB0aGUgQ29kZUNhY2hlLgorICAgICAgICBU
aGlzIHNlY29uZCB0aHJlYWQgd291bGQgZmluZCB0aGUgbnVsbCBlbnRyeSBhbmQgY3Jhc2guICBU
aGUgZml4IGlzIHRvIG1vdmUgdGhlIHByb2Nlc3Npbmcgb2YKKyAgICAgICAgRGVsYXllZFJlbGVh
c2VTY29wZSB0byB3aGVuIHdlIGRyb3AgbG9ja3MgYW5kIG5vdCBkcm9wIGxvY2tzIGR1cmluZyBH
Qy4gIFRoYXQgd2FzIGRvbmUgaW4KKyAgICAgICAgdGhlIG9yaWdpbmFsIHBhdGNoIHdpdGggdGhl
IG5ldyBmdW5jdGlvbiByZWxlYXNlRGVsYXllZFJlbGVhc2VkT2JqZWN0cygpLgorCisgICAgICAg
IFVwZGF0ZWQgcmVsZWFzZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMoKSBzbyB0aGF0IG9iamVjdHMg
YXJlIHJlbGVhc2VkIHdpdGggYWxsIGxvY2tzCisgICAgICAgIGRyb3BwZWQuICBOb3cgaXRzIHBy
b2Nlc3NpbmcgZm9sbG93cyB0aGVzZSBzdGVwcworICAgICAgICAgICAgKDEpIEluY3JlbWVudCBy
ZWN1cnNpb24gY291bnRlciBhbmQgZG8gcmVjdXJzaW9uIGNoZWNrIGFuZCBleGl0IGlmIHJlY3Vy
c2luZworICAgICAgICAgICAgKDIpIEFTU0VSVCB0aGF0IGxvY2sgaXMgaGVsZCBieSBjdXJyZW50
IHRocmVhZAorICAgICAgICAgICAgKDMpIFRha2UgYWxsIGl0ZW1zIGZyb20gZGVsYXllZCByZWxl
YXNlIFZlY3RvciBhbmQgcHV0IGludG8gdGVtcG9yYXJ5IFZlY3RvcgorICAgICAgICAgICAgKDQp
IElmIHRlbXBvcmFyeSBWZWN0b3IgaXMgZW1wdHksIHJldHVybgorICAgICAgICAgICAgKDUpIFJl
bGVhc2UgQVBJIGxvY2sKKyAgICAgICAgICAgICg2KSBSZWxlYXNlIGFuZCBjbGVhciBpdGVtcyBm
cm9tIHRlbXBvcmFyeSB2ZWN0b3IKKyAgICAgICAgICAgICg3KSBSZWFxdWlyZSBBUEkgbG9jawor
ICAgICAgICAgICAgKDgpIEdvdG8gKDIpCisgICAgICAgIFRoaXMgbWVldHMgdGhlIHJlcXVpcmVt
ZW50IHRoYXQgd2UgcmVsZWFzZSB3aGlsZSB0aGUgQVBJIGxvY2sgaXMgcmVsZWFzZWQgYW5kIGl0
IGlzCisgICAgICAgIHNhZmVyIHByb2Nlc3Npbmcgb2YgdGhlIGRlbGF5ZWQgcmVsZWFzZSBWZWN0
b3IuCisKKyAgICAgICAgQWxzbyBhZGRlZCBjb21tZW50IGRlc2NyaWJpbmcgaG93IHJlY3Vyc2lv
biBpbnRvIHJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKCkgaXMKKyAgICAgICAgcHJldmVu
dGVkLgorCisgICAgICAgICogaGVhcC9IZWFwLmNwcDoKKyAgICAgICAgKEpTQzo6SGVhcDo6cmVs
ZWFzZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMpOgorICAgICAgICAqIHJ1bnRpbWUvSlNMb2NrLmNw
cDoKKyAgICAgICAgKEpTQzo6SlNMb2NrOjp1bmxvY2spOiBDaGFuZ2VkIHRoZSBwcm9jZXNzaW5n
IG9mIHdpbGxSZWxlYXNlTG9jaygpIHNvIHRoYXQgZHVyaW5nIGl0cworICAgICAgICBleGVjdXRp
b24gYW5kIHRoYXQgb2YgaXRzIGNhbGxlZSdzLCBjdXJyZW50VGhyZWFkSXNIb2xkaW5nTG9jaygp
IGlzIHRydWUuCisKIDIwMTUtMDItMjYgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgog
CiAgICAgICAgIEFzc2VydGlvbiBmaXggZm9yIHIxODA3MTE6IFRoZSBib29sIHJldHVybmluZyBm
b3JtIG9mIEJ5dGVjb2RlR2VuZXJhdG9yOjphZGRWYXIoKSBjYW4gYmUgcmVtb3ZlZC4KSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXAuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXAuY3BwCShyZXZpc2lvbiAxODA2ODMpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzc5LDEw
ICszNzksMjkgQEAgdm9pZCBIZWFwOjpsYXN0Q2hhbmNlVG9GaW5hbGl6ZSgpCiB2b2lkIEhlYXA6
OnJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKCkKIHsKICNpZiBVU0UoQ0YpCisgICAgLy8g
V2UgbmVlZCB0byBndWFyZCBhZ2FpbnN0IHRoZSBjYXNlIHRoYXQgcmVsZWFzaW5nIGFuIG9iamVj
dCBjYW4gY3JlYXRlIG1vcmUgb2JqZWN0cyBkdWUgdG8gdGhlCisgICAgLy8gcmVsZWFzZSBjYWxs
aW5nIGludG8gSlMuIFdoZW4gdGhvc2UgSlMgY2FsbChzKSBleGl0IGFuZCBhbGwgbG9ja3MgYXJl
IGJlaW5nIGRyb3BwZWQgd2UgZW5kIHVwCisgICAgLy8gYmFjayBoZXJlIGFuZCBjb3VsZCB0cnkg
dG8gcmVjdXJzaXZlbHkgcmVsZWFzZSBvYmplY3RzLiBXZSBndWFyZCB0aGF0IHdpdGggYSByZWN1
cnNpdmUgZW50cnkKKyAgICAvLyBjb3VudC4gT25seSB0aGUgaW5pdGlhbCBjYWxsIHdpbGwgcmVs
ZWFzZSBvYmplY3RzLCByZWN1cnNpdmUgY2FsbHMgc2ltcGxlIHJldHVybiBhbmQgbGV0IHRoZQor
ICAgIC8vIHRoZSBpbml0aWFsIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIHRha2UgY2FyZSBvZiBhbnkg
b2JqZWN0cyBjcmVhdGVkIGR1cmluZyByZWxlYXNlIHRpbWUuCisgICAgLy8gVGhpcyBhbHNvIG1l
YW5zIHRoYXQgd2UgbmVlZCB0byBsb29wIHVudGlsIHRoZXJlIGFyZSBubyBvYmplY3RzIGluIG1f
ZGVsYXllZFJlbGVhc2VPYmplY3RzCisgICAgLy8gYW5kIHVzZSBhIHRlbXAgVmVjdG9yIGZvciB0
aGUgYWN0dWFsIHJlbGVhc2luZy4KICAgICBpZiAoIW1fZGVsYXllZFJlbGVhc2VSZWN1cnNpb25D
b3VudCsrKSB7Ci0gICAgICAgIHdoaWxlICghbV9kZWxheWVkUmVsZWFzZU9iamVjdHMuaXNFbXB0
eSgpKSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8Q0ZUeXBlUmVmPiBvYmplY3RUb1JlbGVhc2Ug
PSBtX2RlbGF5ZWRSZWxlYXNlT2JqZWN0cy50YWtlTGFzdCgpOwotICAgICAgICAgICAgb2JqZWN0
VG9SZWxlYXNlLmNsZWFyKCk7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBBU1NF
UlQobV92bS0+Y3VycmVudFRocmVhZElzSG9sZGluZ0FQSUxvY2soKSk7CisKKyAgICAgICAgICAg
IFZlY3RvcjxSZXRhaW5QdHI8Q0ZUeXBlUmVmPj4gb2JqZWN0c1RvUmVsZWFzZTsKKyAgICAgICAg
ICAgIG9iamVjdHNUb1JlbGVhc2UgPSBXVEY6Om1vdmUobV9kZWxheWVkUmVsZWFzZU9iamVjdHMp
OworCisgICAgICAgICAgICBpZiAob2JqZWN0c1RvUmVsZWFzZS5pc0VtcHR5KCkpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBu
ZWVkIHRvIGRyb3AgbG9ja3MgYmVmb3JlIGNhbGxpbmcgb3V0IHRvIGFyYml0cmFyeSBjb2RlLgor
ICAgICAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrcyhtX3ZtKTsK
KworICAgICAgICAgICAgICAgIG9iamVjdHNUb1JlbGVhc2UuY2xlYXIoKTsKKyAgICAgICAgICAg
IH0KICAgICAgICAgfQogICAgIH0KICAgICBtX2RlbGF5ZWRSZWxlYXNlUmVjdXJzaW9uQ291bnQt
LTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTG9jay5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNMb2NrLmNwcAkocmV2aXNp
b24gMTgwNjgzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNMb2NrLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTU3LDEwICsxNTcsMTQgQEAgdm9pZCBKU0xvY2s6OnVubG9jayhp
bnRwdHJfdCB1bmxvY2tDb3VudAogICAgIFJFTEVBU0VfQVNTRVJUKGN1cnJlbnRUaHJlYWRJc0hv
bGRpbmdMb2NrKCkpOwogICAgIEFTU0VSVChtX2xvY2tDb3VudCA+PSB1bmxvY2tDb3VudCk7CiAK
KyAgICAvLyBNYWludGFpbiBtX2xvY2tDb3VudCB3aGlsZSBjYWxsaW5nIHdpbGxSZWxlYXNlTG9j
aygpIHNvIHRoYXQgaXRzIGNhbGxlZXMga25vdyB0aGF0CisgICAgLy8gdGhleSBzdGlsbCBoYXZl
IHRoZSBsb2NrLgorICAgIGlmICh1bmxvY2tDb3VudCA9PSBtX2xvY2tDb3VudCkKKyAgICAgICAg
d2lsbFJlbGVhc2VMb2NrKCk7CisKICAgICBtX2xvY2tDb3VudCAtPSB1bmxvY2tDb3VudDsKIAog
ICAgIGlmICghbV9sb2NrQ291bnQpIHsKLSAgICAgICAgd2lsbFJlbGVhc2VMb2NrKCk7CiAKICAg
ICAgICAgaWYgKCFtX2hhc0V4Y2x1c2l2ZVRocmVhZCkgewogICAgICAgICAgICAgbV9vd25lclRo
cmVhZElEID0gc3RkOjp0aHJlYWQ6OmlkKCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247820</attachid>
            <date>2015-03-03 17:12:26 -0800</date>
            <delta_ts>2015-03-03 18:22:15 -0800</delta_ts>
            <desc>Updated patch with regression test</desc>
            <filename>141275-update1C.patch</filename>
            <type>text/plain</type>
            <size>26750</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgwOTYzKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY0IEBA
CisyMDE1LTAzLTAzICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIERlbGF5ZWRSZWxlYXNlU2NvcGUgZHJvcHMgbG9ja3MgZHVyaW5nIEdDIHdoaWNoIGNhbiBj
YXVzZSBhIHRocmVhZCBzd2l0Y2ggYW5kIGNvZGUgcmVlbnRyeQorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMjc1CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIG9yaWdpbmFsIGlzc3VlIGlzIHRoYXQg
dGhlIENvZGVDYWNoZSB1c2VzIGFuIHVuc2FmZSBtZXRob2QgdG8gYWRkIG5ldyBVbmxpbmtlZENv
ZGVCbG9ja3MuCisgICAgICAgIEl0IGJhc2ljYWxseSBhZGRzIGEgbnVsbCBVbmxpbmtlZENvZGVC
bG9jayBpZiB0aGVyZSBpc24ndCBhIGNhY2hlZCBlbnRyeSBhbmQgdGhlbiBsYXRlcgorICAgICAg
ICB1cGRhdGVzIHRoZSBudWxsIGVudHJ5IHRvIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBpbGF0aW9u
LiAgSWYgZHVyaW5nIHRoYXQgY29tcGlsYXRpb24gYW5kCisgICAgICAgIHJlbGF0ZWQgcHJvY2Vz
c2luZyB3ZSBuZWVkIHRvIGdhcmJhZ2UgY29sbGVjdCwgdGhlIERlbGF5ZWRSZWxlYXNlU2NvcGUg
d291bGQgZHJvcCBsb2NrcworICAgICAgICBwb3NzaWJseSBhbGxvd2luZyBhbm90aGVyIHRocmVh
ZCB0byB0cnkgdG8gZ2V0IHRoZSBzYW1lIHNvdXJjZSBvdXQgb2YgdGhlIENvZGVDYWNoZS4KKyAg
ICAgICAgVGhpcyBzZWNvbmQgdGhyZWFkIHdvdWxkIGZpbmQgdGhlIG51bGwgZW50cnkgYW5kIGNy
YXNoLiAgVGhlIGZpeCBpcyB0byBtb3ZlIHRoZSBwcm9jZXNzaW5nIG9mCisgICAgICAgIERlbGF5
ZWRSZWxlYXNlU2NvcGUgdG8gd2hlbiB3ZSBkcm9wIGxvY2tzIGFuZCBub3QgZHJvcCBsb2NrcyBk
dXJpbmcgR0MuICBUaGF0IHdhcyBkb25lIGluCisgICAgICAgIHRoZSBvcmlnaW5hbCBwYXRjaCB3
aXRoIHRoZSBuZXcgZnVuY3Rpb24gcmVsZWFzZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMoKS4KKwor
ICAgICAgICBVcGRhdGVkIHJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKCkgc28gdGhhdCBv
YmplY3RzIGFyZSByZWxlYXNlZCB3aXRoIGFsbCBsb2NrcworICAgICAgICBkcm9wcGVkLiAgTm93
IGl0cyBwcm9jZXNzaW5nIGZvbGxvd3MgdGhlc2Ugc3RlcHMKKyAgICAgICAgICAgIEluY3JlbWVu
dCByZWN1cnNpb24gY291bnRlciBhbmQgZG8gcmVjdXJzaW9uIGNoZWNrIGFuZCBleGl0IGlmIHJl
Y3Vyc2luZworICAgICAgICAgICAgV2hpbGUgdGhlcmUgYXJlIG9iamVjdHMgdG8gcmVsZWFzZQor
ICAgICAgICAgICAgICAgIEFTU0VSVCB0aGF0IGxvY2sgaXMgaGVsZCBieSBjdXJyZW50IHRocmVh
ZAorICAgICAgICAgICAgICAgIFRha2UgYWxsIGl0ZW1zIGZyb20gZGVsYXllZCByZWxlYXNlIFZl
Y3RvciBhbmQgcHV0IGludG8gdGVtcG9yYXJ5IFZlY3RvcgorICAgICAgICAgICAgICAgIFJlbGVh
c2UgQVBJIGxvY2sKKyAgICAgICAgICAgICAgICBSZWxlYXNlIGFuZCBjbGVhciBpdGVtcyBmcm9t
IHRlbXBvcmFyeSB2ZWN0b3IKKyAgICAgICAgICAgICAgICBSZWFxdWlyZSBBUEkgbG9jaworICAg
ICAgICBUaGlzIG1lZXRzIHRoZSByZXF1aXJlbWVudCB0aGF0IHdlIHJlbGVhc2Ugd2hpbGUgdGhl
IEFQSSBsb2NrIGlzIHJlbGVhc2VkIGFuZCBpdCBpcworICAgICAgICBzYWZlciBwcm9jZXNzaW5n
IG9mIHRoZSBkZWxheWVkIHJlbGVhc2UgVmVjdG9yLgorCisgICAgICAgIEFkZGVkIG5ldyByZWdy
ZXNzaW9uIHRlc3QgdG8gdGVzdGFwaS4KKworICAgICAgICBBbHNvIGFkZGVkIGNvbW1lbnQgZGVz
Y3JpYmluZyBob3cgcmVjdXJzaW9uIGludG8gcmVsZWFzZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMo
KSBpcworICAgICAgICBwcmV2ZW50ZWQuCisKKyAgICAgICAgKiBBUEkvdGVzdHMvUmVncmVzczE0
MTI3NS5oOiBBZGRlZC4KKyAgICAgICAgKiBBUEkvdGVzdHMvUmVncmVzczE0MTI3NS5tbTogQWRk
ZWQuCisgICAgICAgICgrW0pTVEV2YWx1YXRvclRhc2sgZXZhbHVhdG9yVGFza1dpdGhFdmFsdWF0
ZUJsb2NrOmNvbXBsZXRpb25IYW5kbGVyOl0pOgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgaW5p
dF0pOgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgaW5pdFdpdGhTY3JpcHQ6XSk6CisgICAgICAg
ICgtW0pTVEV2YWx1YXRvciBfYWNjZXNzUGVuZGluZ1Rhc2tzV2l0aEJsb2NrOl0pOgorICAgICAg
ICAoLVtKU1RFdmFsdWF0b3IgaW5zZXJ0U2lnblBvc3RXaXRoQ29tcGxldGlvbjpdKToKKyAgICAg
ICAgKC1bSlNURXZhbHVhdG9yIGV2YWx1YXRlU2NyaXB0OmNvbXBsZXRpb246XSk6CisgICAgICAg
ICgtW0pTVEV2YWx1YXRvciBldmFsdWF0ZUJsb2NrOmNvbXBsZXRpb246XSk6CisgICAgICAgICgt
W0pTVEV2YWx1YXRvciB3YWl0Rm9yVGFza3NEb25lQW5kUmVwb3J0UmVzdWx0c10pOgorICAgICAg
ICAoX19KU1RSdW5Mb29wU291cmNlU2NoZWR1bGVDYWxsQmFjayk6CisgICAgICAgIChfX0pTVFJ1
bkxvb3BTb3VyY2VQZXJmb3JtQ2FsbEJhY2spOgorICAgICAgICAoX19KU1RSdW5Mb29wU291cmNl
Q2FuY2VsQ2FsbEJhY2spOgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgX2pzVGhyZWFkTWFpbl0p
OgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgX3NvdXJjZVNjaGVkdWxlZE9uUnVuTG9vcDpdKToK
KyAgICAgICAgKC1bSlNURXZhbHVhdG9yIF9zZXR1cEV2YWx1YXRvclRocmVhZENvbnRleHRJZk5l
ZWRlZF0pOgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgX2NhbGxDb21wbGV0aW9uSGFuZGxlcjpp
Zk5lZWRlZFdpdGhFcnJvcjpdKToKKyAgICAgICAgKC1bSlNURXZhbHVhdG9yIF9zb3VyY2VQZXJm
b3JtXSk6CisgICAgICAgICgtW0pTVEV2YWx1YXRvciBfc291cmNlQ2FuY2VsZWRPblJ1bkxvb3A6
XSk6CisgICAgICAgIChydW5SZWdyZXNzMTQxMjc1KToKKyAgICAgICAgKiBBUEkvdGVzdHMvdGVz
dGFwaS5tbToKKyAgICAgICAgKHRlc3RPYmplY3RpdmVDQVBJKToKKyAgICAgICAgKiBKYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGhlYXAvSGVhcC5j
cHA6CisgICAgICAgIChKU0M6OkhlYXA6OnJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKToK
KyAgICAgICAgKiBydW50aW1lL0pTTG9jay5jcHA6CisgICAgICAgIChKU0M6OkpTTG9jazo6dW5s
b2NrKToKKwogMjAxNS0wMy0wMyAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAg
ICAgICAgIEpJVCBkZWJ1Z2dpbmcgZmVhdHVyZXMgdGhhdCBzZWxlY3RpdmVseSBkaXNhYmxlIHRo
ZSBKSVRzIGZvciBjb2RlIGJsb2NrcyBuZWVkIHRvIHN0YXkgb3V0IG9mIHRoZSB3YXkgb2YgdGhl
IGNyaXRpY2FsIHBhdGggb2YgSklUIG1hbmFnZW1lbnQKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9BUEkvdGVzdHMvUmVncmVzczE0MTI3NS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9BUEkvdGVzdHMvUmVncmVzczE0MTI3NS5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL0FQSS90ZXN0cy9SZWdyZXNzMTQxMjc1LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91
bmRhdGlvbi5oPgorI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuaD4KKwor
I2lmIEpTQ19PQkpDX0FQSV9FTkFCTEVECisKK3ZvaWQgcnVuUmVncmVzczE0MTI3NSgpOworCisj
ZW5kaWYgLy8gSlNDX09CSkNfQVBJX0VOQUJMRUQKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL0FQSS90ZXN0cy9SZWdyZXNzMTQxMjc1Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9BUEkvdGVzdHMvUmVncmVzczE0MTI3NS5tbQkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvdGVzdHMvUmVncmVzczE0MTI3NS5tbQkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgor
I2ltcG9ydCAiUmVncmVzczE0MTI3NS5oIgorCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRp
b24uaD4KKyNpbXBvcnQgPG9iamMvb2JqYy5oPgorI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+CisK
KyNpZiBKU0NfT0JKQ19BUElfRU5BQkxFRAorCitleHRlcm4gIkMiIHZvaWQgSlNTeW5jaHJvbm91
c0dhcmJhZ2VDb2xsZWN0Rm9yRGVidWdnaW5nKEpTQ29udGV4dFJlZik7CisKK2V4dGVybiBpbnQg
ZmFpbGVkOworCitzdGF0aWMgY29uc3QgTlNVSW50ZWdlciBzY3JpcHRUb0V2YWx1YXRlID0gNTA7
CisKK0BpbnRlcmZhY2UgSlNURXZhbHVhdG9yIDogTlNPYmplY3QKKy0gKGluc3RhbmNldHlwZSlp
bml0V2l0aFNjcmlwdDooTlNTdHJpbmcqKXNjcmlwdDsKKworLSAodm9pZClpbnNlcnRTaWduUG9z
dFdpdGhDb21wbGV0aW9uOih2b2lkKF4pKE5TRXJyb3IqIGVycm9yKSljb21wbGV0aW9uSGFuZGxl
cjsKKworLSAodm9pZClldmFsdWF0ZVNjcmlwdDooTlNTdHJpbmcqKXNjcmlwdCBjb21wbGV0aW9u
Oih2b2lkKF4pKE5TRXJyb3IqIGVycm9yKSljb21wbGV0aW9uSGFuZGxlcjsKKy0gKHZvaWQpZXZh
bHVhdGVCbG9jazoodm9pZCheKShKU0NvbnRleHQqIGNvbnRleHQpKWV2YWx1YXRpb25CbG9jayBj
b21wbGV0aW9uOih2b2lkKF4pKE5TRXJyb3IqIGVycm9yKSljb21wbGV0aW9uSGFuZGxlcjsKKwor
LSAodm9pZCl3YWl0Rm9yVGFza3NEb25lQW5kUmVwb3J0UmVzdWx0czsKK0BlbmQKKworCitzdGF0
aWMgY29uc3QgTlNTdHJpbmcqIEpTVEV2YWx1YXRvclRocmVhZENvbnRleHRLZXkgPSBAIkpTVEV2
YWx1YXRvclRocmVhZENvbnRleHRLZXkiOworCisvKgorICogQSBKU1RFdmFsdWF0b3JUaHJlYWRD
b250ZXh0IGlzIGtlcHQgaW4gdGhlIHRocmVhZCBkaWN0aW9uYXJ5IG9mIHRocmVhZHMgdXNlZCBi
eSBKU0V2YWx1YXRvci4KKyAqCisgKiBUaGlzIGluY2x1ZGVzIHRoZSBydW4gbG9vcCB0aHJlYWQs
IGFuZCBhbnkgdGhyZWFkcyB1c2VkIGJ5IF9qc1NvdXJjZVBlcmZvcm1RdWV1ZSB0byBleGVjdXRl
IGEgdGFzay4KKyAqLworQGludGVyZmFjZSBKU1RFdmFsdWF0b3JUaHJlYWRDb250ZXh0IDogTlNP
YmplY3QKK0Bwcm9wZXJ0eSAod2VhaykgSlNURXZhbHVhdG9yKiBldmFsdWF0b3I7CitAcHJvcGVy
dHkgKHN0cm9uZykgSlNDb250ZXh0KiBqc0NvbnRleHQ7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlv
biBKU1RFdmFsdWF0b3JUaHJlYWRDb250ZXh0CitAZW5kCisKKworLyohCisgKiBBIEpTVEV2YWx1
YXRvclRhc2sgaXMgYSBzaW5nbGUgdGFzayB0byBiZSBleGVjdXRlZC4KKyAqCisgKiBKU1RFdmFs
dWF0b3Iga2VlcHMgYSBsaXN0IG9mIHBlbmRpbmcgdGFza3MuIFRoZSBydW4gbG9vcCB0aHJlYWQg
aXMgcmVwc29uc2libGUgZm9yIGZlZWRpbmcgcGVuZGluZyB0YXNrcyB0byB0aGUgX2pzU291cmNl
UGVyZm9ybVF1ZXVlLCB3aGlsZSByZXNwZWN0aW5nIHNpZ24gcG9zdHMuCisgKi8KK0BpbnRlcmZh
Y2UgSlNURXZhbHVhdG9yVGFzayA6IE5TT2JqZWN0CisKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBj
b3B5KSB2b2lkICheZXZhbHVhdGVCbG9jaykoSlNDb250ZXh0KiBqc0NvbnRleHQpOworQHByb3Bl
cnR5IChub25hdG9taWMsIGNvcHkpIHZvaWQgKF5jb21wbGV0aW9uSGFuZGxlcikoTlNFcnJvciog
ZXJyb3IpOworQHByb3BlcnR5IChub25hdG9taWMsIGNvcHkpIE5TRXJyb3IqIGVycm9yOworCisr
IChpbnN0YW5jZXR5cGUpZXZhbHVhdG9yVGFza1dpdGhFdmFsdWF0ZUJsb2NrOih2b2lkICheKShK
U0NvbnRleHQqKSlibG9jayBjb21wbGV0aW9uSGFuZGxlcjoodm9pZCAoXikoTlNFcnJvciogZXJy
b3IpKWNvbXBsZXRpb25CbG9jazsKKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gSlNURXZhbHVh
dG9yVGFzaworCisrIChpbnN0YW5jZXR5cGUpZXZhbHVhdG9yVGFza1dpdGhFdmFsdWF0ZUJsb2Nr
Oih2b2lkICheKShKU0NvbnRleHQqKSlldmFsdWF0aW9uQmxvY2sgY29tcGxldGlvbkhhbmRsZXI6
KHZvaWQgKF4pKE5TRXJyb3IqIGVycm9yKSljb21wbGV0aW9uSGFuZGxlcgoreworICAgIEpTVEV2
YWx1YXRvclRhc2sqIHRhc2sgPSBbc2VsZiBuZXddOworICAgIHRhc2suZXZhbHVhdGVCbG9jayA9
IGV2YWx1YXRpb25CbG9jazsKKyAgICB0YXNrLmNvbXBsZXRpb25IYW5kbGVyID0gY29tcGxldGlv
bkhhbmRsZXI7CisgICAgcmV0dXJuIHRhc2s7Cit9CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9u
IEpTVEV2YWx1YXRvciB7CisgICAgZGlzcGF0Y2hfcXVldWVfdCBfanNTb3VyY2VQZXJmb3JtUXVl
dWU7CisgICAgZGlzcGF0Y2hfc2VtYXBob3JlX3QgX2FsbFNjcmlwdHNEb25lOworICAgIENGUnVu
TG9vcFJlZiBfanNUaHJlYWRSdW5Mb29wOworICAgIENGUnVuTG9vcFNvdXJjZVJlZiBfanNUaHJl
YWRSdW5Mb29wU291cmNlOworICAgIEpTQ29udGV4dCogX2pzQ29udGV4dDsKKyAgICBOU011dGFi
bGVBcnJheSogX19wZW5kaW5nVGFza3M7Cit9CisKKy0gKGluc3RhbmNldHlwZSlpbml0Cit7Cisg
ICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoc2VsZikgeworICAgICAgICBfanNTb3Vy
Y2VQZXJmb3JtUXVldWUgPSBkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoIkpTVEV2YWwiLCBESVNQQVRD
SF9RVUVVRV9DT05DVVJSRU5UKTsKKworICAgICAgICBfYWxsU2NyaXB0c0RvbmUgPSBkaXNwYXRj
aF9zZW1hcGhvcmVfY3JlYXRlKDApOworCisgICAgICAgIF9qc0NvbnRleHQgPSBbSlNDb250ZXh0
IG5ld107CisgICAgICAgIF9qc0NvbnRleHQubmFtZSA9IEAiSlNURXZhbCI7CisgICAgICAgIF9f
cGVuZGluZ1Rhc2tzID0gW05TTXV0YWJsZUFycmF5IG5ld107CisKKyAgICAgICAgTlNUaHJlYWQq
IGpzVGhyZWFkID0gW1tOU1RocmVhZCBhbGxvY10gaW5pdFdpdGhUYXJnZXQ6c2VsZiBzZWxlY3Rv
cjpAc2VsZWN0b3IoX2pzVGhyZWFkTWFpbikgb2JqZWN0Om5pbF07CisgICAgICAgIFtqc1RocmVh
ZCBzZXROYW1lOkAiSlNURXZhbCJdOworICAgICAgICBbanNUaHJlYWQgc2V0UXVhbGl0eU9mU2Vy
dmljZTpOU1F1YWxpdHlPZlNlcnZpY2VVc2VySW5pdGlhdGVkXTsKKyAgICAgICAgW2pzVGhyZWFk
IHN0YXJ0XTsKKworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaW5zdGFuY2V0eXBl
KWluaXRXaXRoU2NyaXB0OihOU1N0cmluZyopc2NyaXB0Cit7CisgICAgc2VsZiA9IFtzZWxmIGlu
aXRdOworICAgIGlmIChzZWxmKSB7CisgICAgICAgIF9fYmxvY2sgTlNFcnJvciogc2NyaXB0RXJy
b3IgPSBuaWw7CisgICAgICAgIGRpc3BhdGNoX3NlbWFwaG9yZV90IGRzZW1hID0gZGlzcGF0Y2hf
c2VtYXBob3JlX2NyZWF0ZSgwKTsKKyAgICAgICAgW3NlbGYgZXZhbHVhdGVTY3JpcHQ6c2NyaXB0
CisgICAgICAgICAgICBjb21wbGV0aW9uOl4oTlNFcnJvciogZXJyb3IpIHsKKyAgICAgICAgICAg
ICAgICBzY3JpcHRFcnJvciA9IGVycm9yOworICAgICAgICAgICAgICAgIGRpc3BhdGNoX3NlbWFw
aG9yZV9zaWduYWwoZHNlbWEpOworICAgICAgICAgICAgfV07CisgICAgICAgIGRpc3BhdGNoX3Nl
bWFwaG9yZV93YWl0KGRzZW1hLCBESVNQQVRDSF9USU1FX0ZPUkVWRVIpOworICAgIH0KKyAgICBy
ZXR1cm4gc2VsZjsKK30KKworLSAodm9pZClfYWNjZXNzUGVuZGluZ1Rhc2tzV2l0aEJsb2NrOih2
b2lkKF4pKE5TTXV0YWJsZUFycmF5KiBwZW5kaW5nVGFza3MpKWJsb2NrCit7CisgICAgQHN5bmNo
cm9uaXplZChzZWxmKSB7CisgICAgICAgIGJsb2NrKF9fcGVuZGluZ1Rhc2tzKTsKKyAgICAgICAg
aWYgKF9fcGVuZGluZ1Rhc2tzLmNvdW50ID4gMCkgeworICAgICAgICAgICAgaWYgKF9qc1RocmVh
ZFJ1bkxvb3AgJiYgX2pzVGhyZWFkUnVuTG9vcFNvdXJjZSkgeworICAgICAgICAgICAgICAgIENG
UnVuTG9vcFNvdXJjZVNpZ25hbChfanNUaHJlYWRSdW5Mb29wU291cmNlKTsKKyAgICAgICAgICAg
ICAgICBDRlJ1bkxvb3BXYWtlVXAoX2pzVGhyZWFkUnVuTG9vcCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9Cit9CisKKy0gKHZvaWQpaW5zZXJ0U2lnblBvc3RXaXRoQ29tcGxldGlv
bjoodm9pZCheKShOU0Vycm9yKiBlcnJvcikpY29tcGxldGlvbkhhbmRsZXIKK3sKKyAgICBbc2Vs
ZiBfYWNjZXNzUGVuZGluZ1Rhc2tzV2l0aEJsb2NrOl4oTlNNdXRhYmxlQXJyYXkqIHBlbmRpbmdU
YXNrcykgeworICAgICAgICBKU1RFdmFsdWF0b3JUYXNrKiB0YXNrID0gW0pTVEV2YWx1YXRvclRh
c2sgZXZhbHVhdG9yVGFza1dpdGhFdmFsdWF0ZUJsb2NrOm5pbAorICAgICAgICAgICAgY29tcGxl
dGlvbkhhbmRsZXI6Y29tcGxldGlvbkhhbmRsZXJdOworCisgICAgICAgIFtwZW5kaW5nVGFza3Mg
YWRkT2JqZWN0OnRhc2tdOworICAgIH1dOworfQorCistICh2b2lkKWV2YWx1YXRlU2NyaXB0OihO
U1N0cmluZyopc2NyaXB0IGNvbXBsZXRpb246KHZvaWQoXikoTlNFcnJvciogZXJyb3IpKWNvbXBs
ZXRpb25IYW5kbGVyCit7CisgICAgW3NlbGYgZXZhbHVhdGVCbG9jazpeKEpTQ29udGV4dCogY29u
dGV4dCkgeworICAgICAgICBbY29udGV4dCBldmFsdWF0ZVNjcmlwdDpzY3JpcHRdOworICAgIH0g
Y29tcGxldGlvbjpjb21wbGV0aW9uSGFuZGxlcl07Cit9CisKKy0gKHZvaWQpZXZhbHVhdGVCbG9j
azoodm9pZCheKShKU0NvbnRleHQqIGNvbnRleHQpKWV2YWx1YXRpb25CbG9jayBjb21wbGV0aW9u
Oih2b2lkKF4pKE5TRXJyb3IqIGVycm9yKSljb21wbGV0aW9uSGFuZGxlcgoreworICAgIE5TUGFy
YW1ldGVyQXNzZXJ0KGV2YWx1YXRpb25CbG9jayAhPSBuaWwpOworICAgIFtzZWxmIF9hY2Nlc3NQ
ZW5kaW5nVGFza3NXaXRoQmxvY2s6XihOU011dGFibGVBcnJheSogcGVuZGluZ1Rhc2tzKSB7Cisg
ICAgICAgIEpTVEV2YWx1YXRvclRhc2sqIHRhc2sgPSBbSlNURXZhbHVhdG9yVGFzayBldmFsdWF0
b3JUYXNrV2l0aEV2YWx1YXRlQmxvY2s6ZXZhbHVhdGlvbkJsb2NrCisgICAgICAgICAgICBjb21w
bGV0aW9uSGFuZGxlcjpjb21wbGV0aW9uSGFuZGxlcl07CisKKyAgICAgICAgW3BlbmRpbmdUYXNr
cyBhZGRPYmplY3Q6dGFza107CisgICAgfV07Cit9CisKKy0gKHZvaWQpd2FpdEZvclRhc2tzRG9u
ZUFuZFJlcG9ydFJlc3VsdHMKK3sKKyAgICBOU1N0cmluZyogcGFzc0ZhaWxTdHJpbmcgPSBAIlBB
U1NFRCI7CisKKyAgICBpZiAoIWRpc3BhdGNoX3NlbWFwaG9yZV93YWl0KF9hbGxTY3JpcHRzRG9u
ZSwgZGlzcGF0Y2hfdGltZShESVNQQVRDSF9USU1FX05PVywgMzAgKiBOU0VDX1BFUl9TRUMpKSkg
eworICAgICAgICBpbnQgdG90YWxTY3JpcHRzUnVuID0gW19qc0NvbnRleHRbQCJjb3VudGVyIl0g
dG9JbnQzMl07CisKKyAgICAgICAgaWYgKHRvdGFsU2NyaXB0c1J1biAhPSBzY3JpcHRUb0V2YWx1
YXRlKSB7CisgICAgICAgICAgICBwYXNzRmFpbFN0cmluZyA9IEAiRkFJTEVEIjsKKyAgICAgICAg
ICAgIGZhaWxlZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBOU0xvZyhAIiAgUmFuIGEgdG90
YWwgb2YgJWQgc2NyaXB0czogJUAiLCB0b3RhbFNjcmlwdHNSdW4sIHBhc3NGYWlsU3RyaW5nKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBwYXNzRmFpbFN0cmluZyA9IEAiRkFJTEVEIjsKKyAgICAg
ICAgZmFpbGVkID0gMTsKKyAgICAgICAgTlNMb2coQCIgIEVycm9yLCB0aW1lb3V0IHdhaXRpbmcg
Zm9yIGFsbCB0YXNrcyB0byBjb21wbGV0ZTogJUAiLCBwYXNzRmFpbFN0cmluZyk7CisgICAgfQor
fQorCitzdGF0aWMgdm9pZCBfX0pTVFJ1bkxvb3BTb3VyY2VTY2hlZHVsZUNhbGxCYWNrKHZvaWQq
IGluZm8sIENGUnVuTG9vcFJlZiBybCwgQ0ZTdHJpbmdSZWYpCit7CisgICAgQGF1dG9yZWxlYXNl
cG9vbCB7CisgICAgICAgIFsoX19icmlkZ2UgSlNURXZhbHVhdG9yKilpbmZvIF9zb3VyY2VTY2hl
ZHVsZWRPblJ1bkxvb3A6cmxdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19KU1RSdW5Mb29w
U291cmNlUGVyZm9ybUNhbGxCYWNrKHZvaWQqIGluZm8gKQoreworICAgIEBhdXRvcmVsZWFzZXBv
b2wgeworICAgICAgICBbKF9fYnJpZGdlIEpTVEV2YWx1YXRvciopaW5mbyBfc291cmNlUGVyZm9y
bV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX0pTVFJ1bkxvb3BTb3VyY2VDYW5jZWxDYWxs
QmFjayh2b2lkKiBpbmZvLCBDRlJ1bkxvb3BSZWYgcmwsIENGU3RyaW5nUmVmKQoreworICAgIEBh
dXRvcmVsZWFzZXBvb2wgeworICAgICAgICBbKF9fYnJpZGdlIEpTVEV2YWx1YXRvciopaW5mbyBf
c291cmNlQ2FuY2VsZWRPblJ1bkxvb3A6cmxdOworICAgIH0KK30KKworLSAodm9pZClfanNUaHJl
YWRNYWluCit7CisgICAgQGF1dG9yZWxlYXNlcG9vbCB7CisgICAgICAgIGNvbnN0IENGSW5kZXgg
a1J1bkxvb3BTb3VyY2VDb250ZXh0VmVyc2lvbiA9IDA7CisgICAgICAgIENGUnVuTG9vcFNvdXJj
ZUNvbnRleHQgc291cmNlQ29udGV4dCA9IHsKKyAgICAgICAgICAgIGtSdW5Mb29wU291cmNlQ29u
dGV4dFZlcnNpb24sIChfX2JyaWRnZSB2b2lkKikoc2VsZiksCisgICAgICAgICAgICBOVUxMLCBO
VUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgX19KU1RSdW5Mb29wU291cmNlU2No
ZWR1bGVDYWxsQmFjaywKKyAgICAgICAgICAgIF9fSlNUUnVuTG9vcFNvdXJjZUNhbmNlbENhbGxC
YWNrLAorICAgICAgICAgICAgX19KU1RSdW5Mb29wU291cmNlUGVyZm9ybUNhbGxCYWNrCisgICAg
ICAgIH07CisKKyAgICAgICAgQHN5bmNocm9uaXplZChzZWxmKSB7CisgICAgICAgICAgICBfanNU
aHJlYWRSdW5Mb29wID0gQ0ZSdW5Mb29wR2V0Q3VycmVudCgpOworICAgICAgICAgICAgQ0ZSZXRh
aW4oX2pzVGhyZWFkUnVuTG9vcCk7CisKKyAgICAgICAgICAgIF9qc1RocmVhZFJ1bkxvb3BTb3Vy
Y2UgPSBDRlJ1bkxvb3BTb3VyY2VDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgMCwgJnNvdXJj
ZUNvbnRleHQpOworICAgICAgICAgICAgQ0ZSdW5Mb29wQWRkU291cmNlKF9qc1RocmVhZFJ1bkxv
b3AsIF9qc1RocmVhZFJ1bkxvb3BTb3VyY2UsIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7CisgICAg
ICAgIH0KKworICAgICAgICBDRlJ1bkxvb3BSdW4oKTsKKworICAgICAgICBAc3luY2hyb25pemVk
KHNlbGYpIHsKKyAgICAgICAgICAgIE5TTXV0YWJsZURpY3Rpb25hcnkqIHRocmVhZERpY3QgPSBb
W05TVGhyZWFkIGN1cnJlbnRUaHJlYWRdIHRocmVhZERpY3Rpb25hcnldOworICAgICAgICAgICAg
W3RocmVhZERpY3QgcmVtb3ZlT2JqZWN0Rm9yS2V5OnRocmVhZERpY3RbSlNURXZhbHVhdG9yVGhy
ZWFkQ29udGV4dEtleV1dOworCisgICAgICAgICAgICBDRlJlbGVhc2UoX2pzVGhyZWFkUnVuTG9v
cFNvdXJjZSk7CisgICAgICAgICAgICBfanNUaHJlYWRSdW5Mb29wU291cmNlID0gTlVMTDsKKwor
ICAgICAgICAgICAgQ0ZSZWxlYXNlKF9qc1RocmVhZFJ1bkxvb3ApOworICAgICAgICAgICAgX2pz
VGhyZWFkUnVuTG9vcCA9IE5VTEw7CisKKyAgICAgICAgICAgIF9fcGVuZGluZ1Rhc2tzID0gbmls
OworICAgICAgICB9CisgICAgfQorfQorCistICh2b2lkKV9zb3VyY2VTY2hlZHVsZWRPblJ1bkxv
b3A6KENGUnVuTG9vcFJlZilydW5Mb29wCit7CisgICAgVU5VU0VEX1BBUkFNKHJ1bkxvb3ApOwor
ICAgIGFzc2VydChbW1tOU1RocmVhZCBjdXJyZW50VGhyZWFkXSBuYW1lXSBpc0VxdWFsVG9TdHJp
bmc6QCJKU1RFdmFsIl0pOworCisgICAgLy8gV2FrZSB1cCB0aGUgcnVuIGxvb3AgaW4gY2FzZSBy
ZXF1ZXN0cyB3ZXJlIHN1Ym1pdHRlZCBwcmlvciB0byB0aGUKKyAgICAvLyBydW4gbG9vcCAmIHJ1
biBsb29wIHNvdXJjZSBnZXR0aW5nIGNyZWF0ZWQuCisgICAgQ0ZSdW5Mb29wU291cmNlU2lnbmFs
KF9qc1RocmVhZFJ1bkxvb3BTb3VyY2UpOworICAgIENGUnVuTG9vcFdha2VVcChfanNUaHJlYWRS
dW5Mb29wKTsKK30KKworLSAodm9pZClfc2V0dXBFdmFsdWF0b3JUaHJlYWRDb250ZXh0SWZOZWVk
ZWQKK3sKKyAgICBOU011dGFibGVEaWN0aW9uYXJ5KiB0aHJlYWREaWN0ID0gW1tOU1RocmVhZCBj
dXJyZW50VGhyZWFkXSB0aHJlYWREaWN0aW9uYXJ5XTsKKyAgICBKU1RFdmFsdWF0b3JUaHJlYWRD
b250ZXh0KiBjb250ZXh0ID0gdGhyZWFkRGljdFtKU1RFdmFsdWF0b3JUaHJlYWRDb250ZXh0S2V5
XTsKKyAgICAvLyBUaGUgZXZhbHVhdG9yIG1heSBiZSBvdGhlciBldnVhbHVhdG9yLCBvciBuaWwg
aWYgdGhpcyB0aHJlYWQgaGFzIG5vdCBiZWVuIHVzZWQgYmVmb3JlLiBFYWl0aGVyIHdheSB0YWtl
IG93bmVyc2hpcC4KKyAgICBpZiAoY29udGV4dC5ldmFsdWF0b3IgIT0gc2VsZikgeworICAgICAg
ICBjb250ZXh0ID0gW0pTVEV2YWx1YXRvclRocmVhZENvbnRleHQgbmV3XTsKKyAgICAgICAgY29u
dGV4dC5ldmFsdWF0b3IgPSBzZWxmOworICAgICAgICB0aHJlYWREaWN0W0pTVEV2YWx1YXRvclRo
cmVhZENvbnRleHRLZXldID0gY29udGV4dDsKKyAgICB9Cit9CisKKy0gKHZvaWQpX2NhbGxDb21w
bGV0aW9uSGFuZGxlcjoodm9pZCheKShOU0Vycm9yKiBlcnJvcikpY29tcGxldGlvbkhhbmRsZXIg
aWZOZWVkZWRXaXRoRXJyb3I6KE5TRXJyb3IqKWVycm9yCit7CisgICAgaWYgKGNvbXBsZXRpb25I
YW5kbGVyKSB7CisgICAgICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9nbG9iYWxfcXVl
dWUoRElTUEFUQ0hfUVVFVUVfUFJJT1JJVFlfREVGQVVMVCwgMCksIF57CisgICAgICAgICAgICBj
b21wbGV0aW9uSGFuZGxlcihlcnJvcik7CisgICAgICAgIH0pOworICAgIH0KK30KKworLSAodm9p
ZClfc291cmNlUGVyZm9ybQoreworICAgIGFzc2VydChbW1tOU1RocmVhZCBjdXJyZW50VGhyZWFk
XSBuYW1lXSBpc0VxdWFsVG9TdHJpbmc6QCJKU1RFdmFsIl0pOworCisgICAgX19ibG9jayBOU0Fy
cmF5KiB0YXNrcyA9IG5pbDsKKyAgICBbc2VsZiBfYWNjZXNzUGVuZGluZ1Rhc2tzV2l0aEJsb2Nr
Ol4oTlNNdXRhYmxlQXJyYXkqIHBlbmRpbmdUYXNrcykgeworICAgICAgICAvLyBObyBzaWducG9z
dCwgdGFrZSBhbGwgdGFza3MuCisgICAgICAgIHRhc2tzID0gW3BlbmRpbmdUYXNrcyBjb3B5XTsK
KyAgICAgICAgW3BlbmRpbmdUYXNrcyByZW1vdmVBbGxPYmplY3RzXTsKKyAgICB9XTsKKworICAg
IGlmICh0YXNrcy5jb3VudCA+IDApIHsKKyAgICAgICAgZm9yIChKU1RFdmFsdWF0b3JUYXNrKiB0
YXNrIGluIHRhc2tzKSB7CisgICAgICAgICAgICBkaXNwYXRjaF9ibG9ja190IGJsb2NrID0gXnsK
KyAgICAgICAgICAgICAgICBOU0Vycm9yKiBlcnJvciA9IG5pbDsKKyAgICAgICAgICAgICAgICBp
ZiAodGFzay5ldmFsdWF0ZUJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIF9zZXR1
cEV2YWx1YXRvclRocmVhZENvbnRleHRJZk5lZWRlZF07CisgICAgICAgICAgICAgICAgICAgIHRh
c2suZXZhbHVhdGVCbG9jayhfanNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9q
c0NvbnRleHQuZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIkRp
ZCBmYWlsIG9uIEpTQ29udGV4dDogJUAiLCBfanNDb250ZXh0Lm5hbWUpOworICAgICAgICAgICAg
ICAgICAgICAgICAgTlNEaWN0aW9uYXJ5KiB1c2VySW5mbyA9IEB7IE5TTG9jYWxpemVkRGVzY3Jp
cHRpb25LZXkgOiBbX2pzQ29udGV4dC5leGNlcHRpb25bQCJtZXNzYWdlIl0gdG9TdHJpbmddIH07
CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFp
bjpAIkpTVEV2YWx1YXRvciIgY29kZToxIHVzZXJJbmZvOnVzZXJJbmZvXTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIF9qc0NvbnRleHQuZXhjZXB0aW9uID0gbmlsOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFtzZWxmIF9jYWxsQ29t
cGxldGlvbkhhbmRsZXI6dGFzay5jb21wbGV0aW9uSGFuZGxlciBpZk5lZWRlZFdpdGhFcnJvcjpl
cnJvcl07CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAodGFzay5ldmFsdWF0ZUJs
b2NrKQorICAgICAgICAgICAgICAgIGRpc3BhdGNoX2FzeW5jKF9qc1NvdXJjZVBlcmZvcm1RdWV1
ZSwgYmxvY2spOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRpc3BhdGNoX2Jh
cnJpZXJfYXN5bmMoX2pzU291cmNlUGVyZm9ybVF1ZXVlLCBibG9jayk7CisgICAgICAgIH0KKwor
ICAgICAgICBkaXNwYXRjaF9iYXJyaWVyX3N5bmMoX2pzU291cmNlUGVyZm9ybVF1ZXVlLCBeewor
ICAgICAgICAgICAgaWYgKFtfanNDb250ZXh0W0AiY291bnRlciJdIHRvSW50MzJdID09IHNjcmlw
dFRvRXZhbHVhdGUpCisgICAgICAgICAgICAgICAgZGlzcGF0Y2hfc2VtYXBob3JlX3NpZ25hbChf
YWxsU2NyaXB0c0RvbmUpOworICAgICAgICB9KTsKKyAgICB9Cit9CisKKy0gKHZvaWQpX3NvdXJj
ZUNhbmNlbGVkT25SdW5Mb29wOihDRlJ1bkxvb3BSZWYpcnVuTG9vcAoreworICAgIFVOVVNFRF9Q
QVJBTShydW5Mb29wKTsKKyAgICBhc3NlcnQoW1tbTlNUaHJlYWQgY3VycmVudFRocmVhZF0gbmFt
ZV0gaXNFcXVhbFRvU3RyaW5nOkAiSlNURXZhbCJdKTsKKworICAgIEBzeW5jaHJvbml6ZWQoc2Vs
ZikgeworICAgICAgICBhc3NlcnQoX2pzVGhyZWFkUnVuTG9vcCk7CisgICAgICAgIGFzc2VydChf
anNUaHJlYWRSdW5Mb29wU291cmNlKTsKKworICAgICAgICBDRlJ1bkxvb3BSZW1vdmVTb3VyY2Uo
X2pzVGhyZWFkUnVuTG9vcCwgX2pzVGhyZWFkUnVuTG9vcFNvdXJjZSwga0NGUnVuTG9vcERlZmF1
bHRNb2RlKTsKKyAgICAgICAgQ0ZSdW5Mb29wU3RvcChfanNUaHJlYWRSdW5Mb29wKTsKKyAgICB9
Cit9CisKK0BlbmQKKwordm9pZCBydW5SZWdyZXNzMTQxMjc1KCkKK3sKKyAgICAvLyBUZXN0IHRo
YXQgd2UgY2FuIGV4ZWN1dGUgdGhlIHNhbWUgc2NyaXB0IGZyb20gbXVsdGlwbGUgdGhyZWFkcyB3
aXRoIGEgc2hhcmVkIGNvbnRleHQuCisgICAgLy8gU2VlIDxodHRwczovL3dlYmtpdC5vcmcvYi8x
NDEyNzU+CisgICAgTlNMb2coQCJURVNUOiBUZXN0aW5nIG11bHRpcGxlIHRocmVhZHMgZXhlY3V0
aW5nIHRoZSBzYW1lIHNjcmlwdCB3aXRoIGEgc2hhcmVkIGNvbnRleHQiKTsKKworICAgIEBhdXRv
cmVsZWFzZXBvb2wgeworICAgICAgICBKU1RFdmFsdWF0b3IqIGV2YWx1YXRvciA9IFtbSlNURXZh
bHVhdG9yIGFsbG9jXSBpbml0V2l0aFNjcmlwdDpAInRoaXNbJ2NvdW50ZXInXSA9IDA7Il07CisK
KyAgICAgICAgdm9pZCAoXnNob3dFcnJvcklmTmVlZGVkKShOU0Vycm9yKiBlcnJvcikgPSBeKE5T
RXJyb3IqIGVycm9yKSB7CisgICAgICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgICAg
ICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfbWFpbl9xdWV1ZSgpLCBeeworICAgICAgICAg
ICAgICAgICAgICBOU0xvZyhAIkVycm9yOiAlQCIsIGVycm9yKTsKKyAgICAgICAgICAgICAgICB9
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBbZXZhbHVhdG9yIGV2YWx1
YXRlQmxvY2s6XihKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgICAgICAgICAgIEpTU3luY2hyb25v
dXNHYXJiYWdlQ29sbGVjdEZvckRlYnVnZ2luZyhbY29udGV4dCBKU0dsb2JhbENvbnRleHRSZWZd
KTsKKyAgICAgICAgfSBjb21wbGV0aW9uOnNob3dFcnJvcklmTmVlZGVkXTsKKworICAgICAgICBb
ZXZhbHVhdG9yIGV2YWx1YXRlQmxvY2s6XihKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgICAgICAg
ICAgIGNvbnRleHRbQCJ3YWl0Il0gPSBeeworICAgICAgICAgICAgICAgIFtOU1RocmVhZCBzbGVl
cEZvclRpbWVJbnRlcnZhbDowLjAxXTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0gY29tcGxl
dGlvbjpeKE5TRXJyb3IqIGVycm9yKSB7CisgICAgICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAg
ICAgICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfbWFpbl9xdWV1ZSgpLCBeewor
ICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIkVycm9yOiAlQCIsIGVycm9yKTsKKyAgICAgICAg
ICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBzY3JpcHRUb0V2YWx1YXRlOyBpKyspCisgICAgICAgICAgICAgICAgW2V2YWx1YXRv
ciBldmFsdWF0ZVNjcmlwdDpAInRoaXNbJ2NvdW50ZXInXSsrOyB0aGlzWyd3YWl0J10oKTsiIGNv
bXBsZXRpb246c2hvd0Vycm9ySWZOZWVkZWRdOworICAgICAgICB9XTsKKworICAgICAgICBbZXZh
bHVhdG9yIHdhaXRGb3JUYXNrc0RvbmVBbmRSZXBvcnRSZXN1bHRzXTsKKyAgICB9Cit9CisKKyNl
bmRpZiAvLyBKU0NfT0JKQ19BUElfRU5BQkxFRApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L0FQSS90ZXN0cy90ZXN0YXBpLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9BUEkvdGVzdHMvdGVzdGFwaS5tbQkocmV2aXNpb24gMTgwOTYzKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL0FQSS90ZXN0cy90ZXN0YXBpLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsy
OCw3IEBACiAjaW1wb3J0ICJDdXJyZW50VGhpc0luc2lkZUJsb2NrR2V0dGVyVGVzdC5oIgogI2lt
cG9ydCAiRGF0ZVRlc3RzLmgiCiAjaW1wb3J0ICJKU0V4cG9ydFRlc3RzLmgiCisjaW1wb3J0ICJS
ZWdyZXNzMTQxMjc1LmgiCiAjaW1wb3J0ICJSZWdyZXNzMTQxODA5LmgiCiAKICNpbXBvcnQgPHB0
aHJlYWQuaD4KQEAgLTQ4Niw3ICs0ODcsNiBAQCBzdGF0aWMgdm9pZCogdGhyZWFkTWFpbih2b2lk
KiBjb250ZXh0UHRyCiB2b2lkIHRlc3RPYmplY3RpdmVDQVBJKCkKIHsKICAgICBOU0xvZyhAIlRl
c3RpbmcgT2JqZWN0aXZlLUMgQVBJIik7Ci0KICAgICBAYXV0b3JlbGVhc2Vwb29sIHsKICAgICAg
ICAgSlNWaXJ0dWFsTWFjaGluZSogdm0gPSBbW0pTVmlydHVhbE1hY2hpbmUgYWxsb2NdIGluaXRd
OwogICAgICAgICBKU0NvbnRleHQqIGNvbnRleHQgPSBbW0pTQ29udGV4dCBhbGxvY10gaW5pdFdp
dGhWaXJ0dWFsTWFjaGluZTp2bV07CkBAIC0xMzg2LDYgKzEzODYsNyBAQCB2b2lkIHRlc3RPYmpl
Y3RpdmVDQVBJKCkKICAgICBjdXJyZW50VGhpc0luc2lkZUJsb2NrR2V0dGVyVGVzdCgpOwogICAg
IHJ1bkRhdGVUZXN0cygpOwogICAgIHJ1bkpTRXhwb3J0VGVzdHMoKTsKKyAgICBydW5SZWdyZXNz
MTQxMjc1KCk7CiAgICAgcnVuUmVncmVzczE0MTgwOSgpOwogfQogCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMTgwOTYzKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29w
eSkKQEAgLTkzNCw2ICs5MzQsNyBAQAogCQk2NTUyNUZDNTFBNkREODAxMDA3QjU0OTUgLyogTnVs
bFNldHRlckZ1bmN0aW9uLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDY1NTI1RkMzMUE2REQzQjMwMDdCNTQ5NSAvKiBOdWxsU2V0dGVyRnVuY3Rpb24u
Y3BwICovOyB9OwogCQk2NTUzQTMzMTE3QTFGMUVFMDA4Q0Y2RjMgLyogQ29tbW9uU2xvd1BhdGhz
RXhjZXB0aW9ucy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA2NTUzQTMyRjE3QTFGMUVFMDA4Q0Y2RjMgLyogQ29tbW9uU2xvd1BhdGhzRXhjZXB0aW9u
cy5jcHAgKi87IH07CiAJCTY1NTNBMzMyMTdBMUYxRUUwMDhDRjZGMyAvKiBDb21tb25TbG93UGF0
aHNFeGNlcHRpb25zLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA2NTUzQTMzMDE3QTFGMUVFMDA4Q0Y2RjMgLyogQ29tbW9uU2xvd1BhdGhzRXhjZXB0aW9u
cy5oICovOyB9OworCQk2NTU3MEY1QTFBQTRDM0VBMDA5QjNDMjMgLyogUmVncmVzczE0MTI3NS5t
bSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDY1NTcwRjU5
MUFBNEMwMEEwMDlCM0MyMyAvKiBSZWdyZXNzMTQxMjc1Lm1tICovOyB9OwogCQk2NTVFQjI5QjEw
Q0UyNTgxMDAxQTk5MEUgLyogTm9kZXNDb2RlZ2VuLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDY1NUVCMjlBMTBDRTI1ODEwMDFBOTkwRSAvKiBOb2Rl
c0NvZGVnZW4uY3BwICovOyB9OwogCQk2NTdDRjQ1ODE5QkY2NjYyMDA0QUNCRjIgLyogSlNDYWxs
ZWUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNjU3
Q0Y0NTYxOUJGNjY2MjAwNEFDQkYyIC8qIEpTQ2FsbGVlLmNwcCAqLzsgfTsKIAkJNjU3Q0Y0NTkx
OUJGNjY2MjAwNEFDQkYyIC8qIEpTQ2FsbGVlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA2NTdDRjQ1NzE5QkY2NjYyMDA0QUNCRjIgLyogSlNDYWxsZWUu
aCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwpAQCAtMjU5
Nyw2ICsyNTk4LDggQEAKIAkJNjU1MjVGQzQxQTZERDNCMzAwN0I1NDk1IC8qIE51bGxTZXR0ZXJG
dW5jdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBOdWxsU2V0dGVyRnVu
Y3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNjU1M0EzMkYxN0ExRjFFRTAw
OENGNkYzIC8qIENvbW1vblNsb3dQYXRoc0V4Y2VwdGlvbnMuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gQ29tbW9uU2xvd1BhdGhzRXhjZXB0aW9ucy5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTY1NTNBMzMwMTdBMUYxRUUwMDhDRjZGMyAvKiBDb21t
b25TbG93UGF0aHNFeGNlcHRpb25zLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IENvbW1vblNsb3dQYXRoc0V4Y2VwdGlvbnMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJNjU1NzBGNTgxQUE0QzAwQTAwOUIzQzIzIC8qIFJlZ3Jlc3MxNDEyNzUuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gUmVncmVzczE0MTI3NS5oOyBwYXRoID0gQVBJL3Rlc3Rz
L1JlZ3Jlc3MxNDEyNzUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNjU1NzBGNTkx
QUE0QzAwQTAwOUIzQzIzIC8qIFJlZ3Jlc3MxNDEyNzUubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5vYmpjcHA7IG5hbWUgPSBSZWdyZXNzMTQxMjc1Lm1tOyBwYXRoID0gQVBJL3Rlc3RzL1Jl
Z3Jlc3MxNDEyNzUubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTY1NUVCMjlBMTBD
RTI1ODEwMDFBOTkwRSAvKiBOb2Rlc0NvZGVnZW4uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gTm9kZXNDb2RlZ2VuLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJNjU2MEE0Q0YwNEIzQjNFNzAwOEFFOTUyIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29y
ayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBw
ZXIuZnJhbWV3b3JrOyBuYW1lID0gQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gL1N5
c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrOyBzb3VyY2VU
cmVlID0gIjxhYnNvbHV0ZT4iOyB9OwogCQk2NTYyMUU2QjA4OUU4NTk3MDA3NjBGMzUgLyogUHJv
cGVydHlTbG90LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IFByb3BlcnR5U2xvdC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRh
YldpZHRoID0gODsgfTsKQEAgLTM3MjgsNiArMzczMSw4IEBACiAJCQkJQzI4OEIyREQxOEE1NEQz
RTAwN0JFNDBCIC8qIERhdGVUZXN0cy5tbSAqLywKIAkJCQlDMjE4MUZDMDE4QTk0OEZCMDAyNUEy
MzUgLyogSlNFeHBvcnRUZXN0cy5oICovLAogCQkJCUMyMTgxRkMxMThBOTQ4RkIwMDI1QTIzNSAv
KiBKU0V4cG9ydFRlc3RzLm1tICovLAorCQkJCTY1NTcwRjU4MUFBNEMwMEEwMDlCM0MyMyAvKiBS
ZWdyZXNzMTQxMjc1LmggKi8sCisJCQkJNjU1NzBGNTkxQUE0QzAwQTAwOUIzQzIzIC8qIFJlZ3Jl
c3MxNDEyNzUubW0gKi8sCiAJCQkJRkVCNTFGNkExQTk3QjY4ODAwMUY5MjFDIC8qIFJlZ3Jlc3Mx
NDE4MDkuaCAqLywKIAkJCQlGRUI1MUY2QjFBOTdCNjg4MDAxRjkyMUMgLyogUmVncmVzczE0MTgw
OS5tbSAqLywKIAkJCQkxNDQwMDUxNzBBNTMxQ0I1MDAwNUYwNjEgLyogbWluaWRvbSAqLywKQEAg
LTY3NTcsNiArNjc2Miw3IEBACiAJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKIAkJCWJ1
aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CiAJCQlmaWxlcyA9ICgKKwkJCQk2NTU3MEY1QTFB
QTRDM0VBMDA5QjNDMjMgLyogUmVncmVzczE0MTI3NS5tbSBpbiBTb3VyY2VzICovLAogCQkJCUMy
OUVDQjAzMTgwNEQwRUQwMEQyQ0JCNCAvKiBDdXJyZW50VGhpc0luc2lkZUJsb2NrR2V0dGVyVGVz
dC5tbSBpbiBTb3VyY2VzICovLAogCQkJCUZFQjUxRjZDMUE5N0I2ODgwMDFGOTIxQyAvKiBSZWdy
ZXNzMTQxODA5Lm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJQzIwMzI4MjAxOTgxOTc5RDAwODhCNDk5
IC8qIEN1c3RvbUdsb2JhbE9iamVjdENsYXNzVGVzdC5jIGluIFNvdXJjZXMgKi8sCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmNwcAkocmV2aXNpb24gMTgwOTYzKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2OCwxMCAr
MzY4LDI1IEBAIHZvaWQgSGVhcDo6bGFzdENoYW5jZVRvRmluYWxpemUoKQogdm9pZCBIZWFwOjpy
ZWxlYXNlRGVsYXllZFJlbGVhc2VkT2JqZWN0cygpCiB7CiAjaWYgVVNFKENGKQorICAgIC8vIFdl
IG5lZWQgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgY2FzZSB0aGF0IHJlbGVhc2luZyBhbiBvYmplY3Qg
Y2FuIGNyZWF0ZSBtb3JlIG9iamVjdHMgZHVlIHRvIHRoZQorICAgIC8vIHJlbGVhc2UgY2FsbGlu
ZyBpbnRvIEpTLiBXaGVuIHRob3NlIEpTIGNhbGwocykgZXhpdCBhbmQgYWxsIGxvY2tzIGFyZSBi
ZWluZyBkcm9wcGVkIHdlIGVuZCB1cAorICAgIC8vIGJhY2sgaGVyZSBhbmQgY291bGQgdHJ5IHRv
IHJlY3Vyc2l2ZWx5IHJlbGVhc2Ugb2JqZWN0cy4gV2UgZ3VhcmQgdGhhdCB3aXRoIGEgcmVjdXJz
aXZlIGVudHJ5CisgICAgLy8gY291bnQuIE9ubHkgdGhlIGluaXRpYWwgY2FsbCB3aWxsIHJlbGVh
c2Ugb2JqZWN0cywgcmVjdXJzaXZlIGNhbGxzIHNpbXBsZSByZXR1cm4gYW5kIGxldCB0aGUKKyAg
ICAvLyB0aGUgaW5pdGlhbCBjYWxsIHRvIHRoZSBmdW5jdGlvbiB0YWtlIGNhcmUgb2YgYW55IG9i
amVjdHMgY3JlYXRlZCBkdXJpbmcgcmVsZWFzZSB0aW1lLgorICAgIC8vIFRoaXMgYWxzbyBtZWFu
cyB0aGF0IHdlIG5lZWQgdG8gbG9vcCB1bnRpbCB0aGVyZSBhcmUgbm8gb2JqZWN0cyBpbiBtX2Rl
bGF5ZWRSZWxlYXNlT2JqZWN0cworICAgIC8vIGFuZCB1c2UgYSB0ZW1wIFZlY3RvciBmb3IgdGhl
IGFjdHVhbCByZWxlYXNpbmcuCiAgICAgaWYgKCFtX2RlbGF5ZWRSZWxlYXNlUmVjdXJzaW9uQ291
bnQrKykgewogICAgICAgICB3aGlsZSAoIW1fZGVsYXllZFJlbGVhc2VPYmplY3RzLmlzRW1wdHko
KSkgewotICAgICAgICAgICAgUmV0YWluUHRyPENGVHlwZVJlZj4gb2JqZWN0VG9SZWxlYXNlID0g
bV9kZWxheWVkUmVsZWFzZU9iamVjdHMudGFrZUxhc3QoKTsKLSAgICAgICAgICAgIG9iamVjdFRv
UmVsZWFzZS5jbGVhcigpOworICAgICAgICAgICAgQVNTRVJUKG1fdm0tPmN1cnJlbnRUaHJlYWRJ
c0hvbGRpbmdBUElMb2NrKCkpOworCisgICAgICAgICAgICBWZWN0b3I8UmV0YWluUHRyPENGVHlw
ZVJlZj4+IG9iamVjdHNUb1JlbGVhc2UgPSBXVEY6Om1vdmUobV9kZWxheWVkUmVsZWFzZU9iamVj
dHMpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkcm9w
IGxvY2tzIGJlZm9yZSBjYWxsaW5nIG91dCB0byBhcmJpdHJhcnkgY29kZS4KKyAgICAgICAgICAg
ICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3MobV92bSk7CisKKyAgICAgICAg
ICAgICAgICBvYmplY3RzVG9SZWxlYXNlLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAg
IH0KICAgICB9CiAgICAgbV9kZWxheWVkUmVsZWFzZVJlY3Vyc2lvbkNvdW50LS07CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0xvY2suY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTG9jay5jcHAJKHJldmlzaW9uIDE4MDk2MykK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTG9jay5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTE1NywxMCArMTU3LDE0IEBAIHZvaWQgSlNMb2NrOjp1bmxvY2soaW50cHRyX3QgdW5s
b2NrQ291bnQKICAgICBSRUxFQVNFX0FTU0VSVChjdXJyZW50VGhyZWFkSXNIb2xkaW5nTG9jaygp
KTsKICAgICBBU1NFUlQobV9sb2NrQ291bnQgPj0gdW5sb2NrQ291bnQpOwogCisgICAgLy8gTWFp
bnRhaW4gbV9sb2NrQ291bnQgd2hpbGUgY2FsbGluZyB3aWxsUmVsZWFzZUxvY2soKSBzbyB0aGF0
IGl0cyBjYWxsZWVzIGtub3cgdGhhdAorICAgIC8vIHRoZXkgc3RpbGwgaGF2ZSB0aGUgbG9jay4K
KyAgICBpZiAodW5sb2NrQ291bnQgPT0gbV9sb2NrQ291bnQpCisgICAgICAgIHdpbGxSZWxlYXNl
TG9jaygpOworCiAgICAgbV9sb2NrQ291bnQgLT0gdW5sb2NrQ291bnQ7CiAKICAgICBpZiAoIW1f
bG9ja0NvdW50KSB7Ci0gICAgICAgIHdpbGxSZWxlYXNlTG9jaygpOwogCiAgICAgICAgIGlmICgh
bV9oYXNFeGNsdXNpdmVUaHJlYWQpIHsKICAgICAgICAgICAgIG1fb3duZXJUaHJlYWRJRCA9IHN0
ZDo6dGhyZWFkOjppZCgpOwo=
</data>
<flag name="review"
          id="272733"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247824</attachid>
            <date>2015-03-03 18:22:15 -0800</date>
            <delta_ts>2015-03-03 18:22:15 -0800</delta_ts>
            <desc>Patch for landing with speculative fix for pre 10.10 Mac OS X builds</desc>
            <filename>141275-update1D.patch</filename>
            <type>text/plain</type>
            <size>26574</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgwOTcwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY0IEBA
CisyMDE1LTAzLTAzICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIERlbGF5ZWRSZWxlYXNlU2NvcGUgZHJvcHMgbG9ja3MgZHVyaW5nIEdDIHdoaWNoIGNhbiBj
YXVzZSBhIHRocmVhZCBzd2l0Y2ggYW5kIGNvZGUgcmVlbnRyeQorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMjc1CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgR2VvZmZyZXkgR2FyZW4uCisKKyAgICAgICAgVGhlIG9yaWdpbmFsIGlzc3VlIGlzIHRoYXQg
dGhlIENvZGVDYWNoZSB1c2VzIGFuIHVuc2FmZSBtZXRob2QgdG8gYWRkIG5ldyBVbmxpbmtlZENv
ZGVCbG9ja3MuCisgICAgICAgIEl0IGJhc2ljYWxseSBhZGRzIGEgbnVsbCBVbmxpbmtlZENvZGVC
bG9jayBpZiB0aGVyZSBpc24ndCBhIGNhY2hlZCBlbnRyeSBhbmQgdGhlbiBsYXRlcgorICAgICAg
ICB1cGRhdGVzIHRoZSBudWxsIGVudHJ5IHRvIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBpbGF0aW9u
LiAgSWYgZHVyaW5nIHRoYXQgY29tcGlsYXRpb24gYW5kCisgICAgICAgIHJlbGF0ZWQgcHJvY2Vz
c2luZyB3ZSBuZWVkIHRvIGdhcmJhZ2UgY29sbGVjdCwgdGhlIERlbGF5ZWRSZWxlYXNlU2NvcGUg
d291bGQgZHJvcCBsb2NrcworICAgICAgICBwb3NzaWJseSBhbGxvd2luZyBhbm90aGVyIHRocmVh
ZCB0byB0cnkgdG8gZ2V0IHRoZSBzYW1lIHNvdXJjZSBvdXQgb2YgdGhlIENvZGVDYWNoZS4KKyAg
ICAgICAgVGhpcyBzZWNvbmQgdGhyZWFkIHdvdWxkIGZpbmQgdGhlIG51bGwgZW50cnkgYW5kIGNy
YXNoLiAgVGhlIGZpeCBpcyB0byBtb3ZlIHRoZSBwcm9jZXNzaW5nIG9mCisgICAgICAgIERlbGF5
ZWRSZWxlYXNlU2NvcGUgdG8gd2hlbiB3ZSBkcm9wIGxvY2tzIGFuZCBub3QgZHJvcCBsb2NrcyBk
dXJpbmcgR0MuICBUaGF0IHdhcyBkb25lIGluCisgICAgICAgIHRoZSBvcmlnaW5hbCBwYXRjaCB3
aXRoIHRoZSBuZXcgZnVuY3Rpb24gcmVsZWFzZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMoKS4KKwor
ICAgICAgICBVcGRhdGVkIHJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKCkgc28gdGhhdCBv
YmplY3RzIGFyZSByZWxlYXNlZCB3aXRoIGFsbCBsb2NrcworICAgICAgICBkcm9wcGVkLiAgTm93
IGl0cyBwcm9jZXNzaW5nIGZvbGxvd3MgdGhlc2Ugc3RlcHMKKyAgICAgICAgICAgIEluY3JlbWVu
dCByZWN1cnNpb24gY291bnRlciBhbmQgZG8gcmVjdXJzaW9uIGNoZWNrIGFuZCBleGl0IGlmIHJl
Y3Vyc2luZworICAgICAgICAgICAgV2hpbGUgdGhlcmUgYXJlIG9iamVjdHMgdG8gcmVsZWFzZQor
ICAgICAgICAgICAgICAgIEFTU0VSVCB0aGF0IGxvY2sgaXMgaGVsZCBieSBjdXJyZW50IHRocmVh
ZAorICAgICAgICAgICAgICAgIFRha2UgYWxsIGl0ZW1zIGZyb20gZGVsYXllZCByZWxlYXNlIFZl
Y3RvciBhbmQgcHV0IGludG8gdGVtcG9yYXJ5IFZlY3RvcgorICAgICAgICAgICAgICAgIFJlbGVh
c2UgQVBJIGxvY2sKKyAgICAgICAgICAgICAgICBSZWxlYXNlIGFuZCBjbGVhciBpdGVtcyBmcm9t
IHRlbXBvcmFyeSB2ZWN0b3IKKyAgICAgICAgICAgICAgICBSZWFxdWlyZSBBUEkgbG9jaworICAg
ICAgICBUaGlzIG1lZXRzIHRoZSByZXF1aXJlbWVudCB0aGF0IHdlIHJlbGVhc2Ugd2hpbGUgdGhl
IEFQSSBsb2NrIGlzIHJlbGVhc2VkIGFuZCBpdCBpcworICAgICAgICBzYWZlciBwcm9jZXNzaW5n
IG9mIHRoZSBkZWxheWVkIHJlbGVhc2UgVmVjdG9yLgorCisgICAgICAgIEFkZGVkIG5ldyByZWdy
ZXNzaW9uIHRlc3QgdG8gdGVzdGFwaS4KKworICAgICAgICBBbHNvIGFkZGVkIGNvbW1lbnQgZGVz
Y3JpYmluZyBob3cgcmVjdXJzaW9uIGludG8gcmVsZWFzZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMo
KSBpcworICAgICAgICBwcmV2ZW50ZWQuCisKKyAgICAgICAgKiBBUEkvdGVzdHMvUmVncmVzczE0
MTI3NS5oOiBBZGRlZC4KKyAgICAgICAgKiBBUEkvdGVzdHMvUmVncmVzczE0MTI3NS5tbTogQWRk
ZWQuCisgICAgICAgICgrW0pTVEV2YWx1YXRvclRhc2sgZXZhbHVhdG9yVGFza1dpdGhFdmFsdWF0
ZUJsb2NrOmNvbXBsZXRpb25IYW5kbGVyOl0pOgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgaW5p
dF0pOgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgaW5pdFdpdGhTY3JpcHQ6XSk6CisgICAgICAg
ICgtW0pTVEV2YWx1YXRvciBfYWNjZXNzUGVuZGluZ1Rhc2tzV2l0aEJsb2NrOl0pOgorICAgICAg
ICAoLVtKU1RFdmFsdWF0b3IgaW5zZXJ0U2lnblBvc3RXaXRoQ29tcGxldGlvbjpdKToKKyAgICAg
ICAgKC1bSlNURXZhbHVhdG9yIGV2YWx1YXRlU2NyaXB0OmNvbXBsZXRpb246XSk6CisgICAgICAg
ICgtW0pTVEV2YWx1YXRvciBldmFsdWF0ZUJsb2NrOmNvbXBsZXRpb246XSk6CisgICAgICAgICgt
W0pTVEV2YWx1YXRvciB3YWl0Rm9yVGFza3NEb25lQW5kUmVwb3J0UmVzdWx0c10pOgorICAgICAg
ICAoX19KU1RSdW5Mb29wU291cmNlU2NoZWR1bGVDYWxsQmFjayk6CisgICAgICAgIChfX0pTVFJ1
bkxvb3BTb3VyY2VQZXJmb3JtQ2FsbEJhY2spOgorICAgICAgICAoX19KU1RSdW5Mb29wU291cmNl
Q2FuY2VsQ2FsbEJhY2spOgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgX2pzVGhyZWFkTWFpbl0p
OgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgX3NvdXJjZVNjaGVkdWxlZE9uUnVuTG9vcDpdKToK
KyAgICAgICAgKC1bSlNURXZhbHVhdG9yIF9zZXR1cEV2YWx1YXRvclRocmVhZENvbnRleHRJZk5l
ZWRlZF0pOgorICAgICAgICAoLVtKU1RFdmFsdWF0b3IgX2NhbGxDb21wbGV0aW9uSGFuZGxlcjpp
Zk5lZWRlZFdpdGhFcnJvcjpdKToKKyAgICAgICAgKC1bSlNURXZhbHVhdG9yIF9zb3VyY2VQZXJm
b3JtXSk6CisgICAgICAgICgtW0pTVEV2YWx1YXRvciBfc291cmNlQ2FuY2VsZWRPblJ1bkxvb3A6
XSk6CisgICAgICAgIChydW5SZWdyZXNzMTQxMjc1KToKKyAgICAgICAgKiBBUEkvdGVzdHMvdGVz
dGFwaS5tbToKKyAgICAgICAgKHRlc3RPYmplY3RpdmVDQVBJKToKKyAgICAgICAgKiBKYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGhlYXAvSGVhcC5j
cHA6CisgICAgICAgIChKU0M6OkhlYXA6OnJlbGVhc2VEZWxheWVkUmVsZWFzZWRPYmplY3RzKToK
KyAgICAgICAgKiBydW50aW1lL0pTTG9jay5jcHA6CisgICAgICAgIChKU0M6OkpTTG9jazo6dW5s
b2NrKToKKwogMjAxNS0wMy0wMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29t
PgogCiAgICAgICAgIFJlbW92ZSB1bnVzZWQgY29tcHJlc3Npb24gY29kZQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL0FQSS90ZXN0cy9SZWdyZXNzMTQxMjc1LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS90ZXN0cy9SZWdyZXNzMTQxMjc1LmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL3Rlc3RzL1JlZ3Jlc3MxNDEyNzUuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9ydCA8Rm91
bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS5oPgorCisjaWYgSlNDX09CSkNfQVBJX0VOQUJMRUQKKwordm9pZCBydW5SZWdyZXNzMTQx
Mjc1KCk7CisKKyNlbmRpZiAvLyBKU0NfT0JKQ19BUElfRU5BQkxFRAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQVBJL3Rlc3RzL1JlZ3Jlc3MxNDEyNzUubW0KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS90ZXN0cy9SZWdyZXNzMTQxMjc1Lm1tCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS90ZXN0cy9SZWdyZXNzMTQxMjc1Lm1t
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9ydCAi
Y29uZmlnLmgiCisjaW1wb3J0ICJSZWdyZXNzMTQxMjc1LmgiCisKKyNpbXBvcnQgPEZvdW5kYXRp
b24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCA8b2JqYy9vYmpjLmg+CisjaW1wb3J0IDxvYmpjL3J1
bnRpbWUuaD4KKworI2lmIEpTQ19PQkpDX0FQSV9FTkFCTEVECisKK2V4dGVybiAiQyIgdm9pZCBK
U1N5bmNocm9ub3VzR2FyYmFnZUNvbGxlY3RGb3JEZWJ1Z2dpbmcoSlNDb250ZXh0UmVmKTsKKwor
ZXh0ZXJuIGludCBmYWlsZWQ7CisKK3N0YXRpYyBjb25zdCBOU1VJbnRlZ2VyIHNjcmlwdFRvRXZh
bHVhdGUgPSA1MDsKKworQGludGVyZmFjZSBKU1RFdmFsdWF0b3IgOiBOU09iamVjdAorLSAoaW5z
dGFuY2V0eXBlKWluaXRXaXRoU2NyaXB0OihOU1N0cmluZyopc2NyaXB0OworCistICh2b2lkKWlu
c2VydFNpZ25Qb3N0V2l0aENvbXBsZXRpb246KHZvaWQoXikoTlNFcnJvciogZXJyb3IpKWNvbXBs
ZXRpb25IYW5kbGVyOworCistICh2b2lkKWV2YWx1YXRlU2NyaXB0OihOU1N0cmluZyopc2NyaXB0
IGNvbXBsZXRpb246KHZvaWQoXikoTlNFcnJvciogZXJyb3IpKWNvbXBsZXRpb25IYW5kbGVyOwor
LSAodm9pZClldmFsdWF0ZUJsb2NrOih2b2lkKF4pKEpTQ29udGV4dCogY29udGV4dCkpZXZhbHVh
dGlvbkJsb2NrIGNvbXBsZXRpb246KHZvaWQoXikoTlNFcnJvciogZXJyb3IpKWNvbXBsZXRpb25I
YW5kbGVyOworCistICh2b2lkKXdhaXRGb3JUYXNrc0RvbmVBbmRSZXBvcnRSZXN1bHRzOworQGVu
ZAorCisKK3N0YXRpYyBjb25zdCBOU1N0cmluZyogSlNURXZhbHVhdG9yVGhyZWFkQ29udGV4dEtl
eSA9IEAiSlNURXZhbHVhdG9yVGhyZWFkQ29udGV4dEtleSI7CisKKy8qCisgKiBBIEpTVEV2YWx1
YXRvclRocmVhZENvbnRleHQgaXMga2VwdCBpbiB0aGUgdGhyZWFkIGRpY3Rpb25hcnkgb2YgdGhy
ZWFkcyB1c2VkIGJ5IEpTRXZhbHVhdG9yLgorICoKKyAqIFRoaXMgaW5jbHVkZXMgdGhlIHJ1biBs
b29wIHRocmVhZCwgYW5kIGFueSB0aHJlYWRzIHVzZWQgYnkgX2pzU291cmNlUGVyZm9ybVF1ZXVl
IHRvIGV4ZWN1dGUgYSB0YXNrLgorICovCitAaW50ZXJmYWNlIEpTVEV2YWx1YXRvclRocmVhZENv
bnRleHQgOiBOU09iamVjdAorQHByb3BlcnR5ICh3ZWFrKSBKU1RFdmFsdWF0b3IqIGV2YWx1YXRv
cjsKK0Bwcm9wZXJ0eSAoc3Ryb25nKSBKU0NvbnRleHQqIGpzQ29udGV4dDsKK0BlbmQKKworQGlt
cGxlbWVudGF0aW9uIEpTVEV2YWx1YXRvclRocmVhZENvbnRleHQKK0BlbmQKKworCisvKiEKKyAq
IEEgSlNURXZhbHVhdG9yVGFzayBpcyBhIHNpbmdsZSB0YXNrIHRvIGJlIGV4ZWN1dGVkLgorICoK
KyAqIEpTVEV2YWx1YXRvciBrZWVwcyBhIGxpc3Qgb2YgcGVuZGluZyB0YXNrcy4gVGhlIHJ1biBs
b29wIHRocmVhZCBpcyByZXBzb25zaWJsZSBmb3IgZmVlZGluZyBwZW5kaW5nIHRhc2tzIHRvIHRo
ZSBfanNTb3VyY2VQZXJmb3JtUXVldWUsIHdoaWxlIHJlc3BlY3Rpbmcgc2lnbiBwb3N0cy4KKyAq
LworQGludGVyZmFjZSBKU1RFdmFsdWF0b3JUYXNrIDogTlNPYmplY3QKKworQHByb3BlcnR5IChu
b25hdG9taWMsIGNvcHkpIHZvaWQgKF5ldmFsdWF0ZUJsb2NrKShKU0NvbnRleHQqIGpzQ29udGV4
dCk7CitAcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgdm9pZCAoXmNvbXBsZXRpb25IYW5kbGVy
KShOU0Vycm9yKiBlcnJvcik7CitAcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgTlNFcnJvciog
ZXJyb3I7CisKKysgKGluc3RhbmNldHlwZSlldmFsdWF0b3JUYXNrV2l0aEV2YWx1YXRlQmxvY2s6
KHZvaWQgKF4pKEpTQ29udGV4dCopKWJsb2NrIGNvbXBsZXRpb25IYW5kbGVyOih2b2lkICheKShO
U0Vycm9yKiBlcnJvcikpY29tcGxldGlvbkJsb2NrOworCitAZW5kCisKK0BpbXBsZW1lbnRhdGlv
biBKU1RFdmFsdWF0b3JUYXNrCisKKysgKGluc3RhbmNldHlwZSlldmFsdWF0b3JUYXNrV2l0aEV2
YWx1YXRlQmxvY2s6KHZvaWQgKF4pKEpTQ29udGV4dCopKWV2YWx1YXRpb25CbG9jayBjb21wbGV0
aW9uSGFuZGxlcjoodm9pZCAoXikoTlNFcnJvciogZXJyb3IpKWNvbXBsZXRpb25IYW5kbGVyCit7
CisgICAgSlNURXZhbHVhdG9yVGFzayogdGFzayA9IFtzZWxmIG5ld107CisgICAgdGFzay5ldmFs
dWF0ZUJsb2NrID0gZXZhbHVhdGlvbkJsb2NrOworICAgIHRhc2suY29tcGxldGlvbkhhbmRsZXIg
PSBjb21wbGV0aW9uSGFuZGxlcjsKKyAgICByZXR1cm4gdGFzazsKK30KKworQGVuZAorCitAaW1w
bGVtZW50YXRpb24gSlNURXZhbHVhdG9yIHsKKyAgICBkaXNwYXRjaF9xdWV1ZV90IF9qc1NvdXJj
ZVBlcmZvcm1RdWV1ZTsKKyAgICBkaXNwYXRjaF9zZW1hcGhvcmVfdCBfYWxsU2NyaXB0c0RvbmU7
CisgICAgQ0ZSdW5Mb29wUmVmIF9qc1RocmVhZFJ1bkxvb3A7CisgICAgQ0ZSdW5Mb29wU291cmNl
UmVmIF9qc1RocmVhZFJ1bkxvb3BTb3VyY2U7CisgICAgSlNDb250ZXh0KiBfanNDb250ZXh0Owor
ICAgIE5TTXV0YWJsZUFycmF5KiBfX3BlbmRpbmdUYXNrczsKK30KKworLSAoaW5zdGFuY2V0eXBl
KWluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIGlmIChzZWxmKSB7CisgICAg
ICAgIF9qc1NvdXJjZVBlcmZvcm1RdWV1ZSA9IGRpc3BhdGNoX3F1ZXVlX2NyZWF0ZSgiSlNURXZh
bCIsIERJU1BBVENIX1FVRVVFX0NPTkNVUlJFTlQpOworCisgICAgICAgIF9hbGxTY3JpcHRzRG9u
ZSA9IGRpc3BhdGNoX3NlbWFwaG9yZV9jcmVhdGUoMCk7CisKKyAgICAgICAgX2pzQ29udGV4dCA9
IFtKU0NvbnRleHQgbmV3XTsKKyAgICAgICAgX2pzQ29udGV4dC5uYW1lID0gQCJKU1RFdmFsIjsK
KyAgICAgICAgX19wZW5kaW5nVGFza3MgPSBbTlNNdXRhYmxlQXJyYXkgbmV3XTsKKworICAgICAg
ICBOU1RocmVhZCoganNUaHJlYWQgPSBbW05TVGhyZWFkIGFsbG9jXSBpbml0V2l0aFRhcmdldDpz
ZWxmIHNlbGVjdG9yOkBzZWxlY3RvcihfanNUaHJlYWRNYWluKSBvYmplY3Q6bmlsXTsKKyAgICAg
ICAgW2pzVGhyZWFkIHNldE5hbWU6QCJKU1RFdmFsIl07CisgICAgICAgIFtqc1RocmVhZCBzdGFy
dF07CisKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGluc3RhbmNldHlwZSlpbml0
V2l0aFNjcmlwdDooTlNTdHJpbmcqKXNjcmlwdAoreworICAgIHNlbGYgPSBbc2VsZiBpbml0XTsK
KyAgICBpZiAoc2VsZikgeworICAgICAgICBfX2Jsb2NrIE5TRXJyb3IqIHNjcmlwdEVycm9yID0g
bmlsOworICAgICAgICBkaXNwYXRjaF9zZW1hcGhvcmVfdCBkc2VtYSA9IGRpc3BhdGNoX3NlbWFw
aG9yZV9jcmVhdGUoMCk7CisgICAgICAgIFtzZWxmIGV2YWx1YXRlU2NyaXB0OnNjcmlwdAorICAg
ICAgICAgICAgY29tcGxldGlvbjpeKE5TRXJyb3IqIGVycm9yKSB7CisgICAgICAgICAgICAgICAg
c2NyaXB0RXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgICAgICBkaXNwYXRjaF9zZW1hcGhvcmVf
c2lnbmFsKGRzZW1hKTsKKyAgICAgICAgICAgIH1dOworICAgICAgICBkaXNwYXRjaF9zZW1hcGhv
cmVfd2FpdChkc2VtYSwgRElTUEFUQ0hfVElNRV9GT1JFVkVSKTsKKyAgICB9CisgICAgcmV0dXJu
IHNlbGY7Cit9CisKKy0gKHZvaWQpX2FjY2Vzc1BlbmRpbmdUYXNrc1dpdGhCbG9jazoodm9pZChe
KShOU011dGFibGVBcnJheSogcGVuZGluZ1Rhc2tzKSlibG9jaworeworICAgIEBzeW5jaHJvbml6
ZWQoc2VsZikgeworICAgICAgICBibG9jayhfX3BlbmRpbmdUYXNrcyk7CisgICAgICAgIGlmIChf
X3BlbmRpbmdUYXNrcy5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGlmIChfanNUaHJlYWRSdW5M
b29wICYmIF9qc1RocmVhZFJ1bkxvb3BTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBDRlJ1bkxv
b3BTb3VyY2VTaWduYWwoX2pzVGhyZWFkUnVuTG9vcFNvdXJjZSk7CisgICAgICAgICAgICAgICAg
Q0ZSdW5Mb29wV2FrZVVwKF9qc1RocmVhZFJ1bkxvb3ApOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorfQorCistICh2b2lkKWluc2VydFNpZ25Qb3N0V2l0aENvbXBsZXRpb246KHZv
aWQoXikoTlNFcnJvciogZXJyb3IpKWNvbXBsZXRpb25IYW5kbGVyCit7CisgICAgW3NlbGYgX2Fj
Y2Vzc1BlbmRpbmdUYXNrc1dpdGhCbG9jazpeKE5TTXV0YWJsZUFycmF5KiBwZW5kaW5nVGFza3Mp
IHsKKyAgICAgICAgSlNURXZhbHVhdG9yVGFzayogdGFzayA9IFtKU1RFdmFsdWF0b3JUYXNrIGV2
YWx1YXRvclRhc2tXaXRoRXZhbHVhdGVCbG9jazpuaWwKKyAgICAgICAgICAgIGNvbXBsZXRpb25I
YW5kbGVyOmNvbXBsZXRpb25IYW5kbGVyXTsKKworICAgICAgICBbcGVuZGluZ1Rhc2tzIGFkZE9i
amVjdDp0YXNrXTsKKyAgICB9XTsKK30KKworLSAodm9pZClldmFsdWF0ZVNjcmlwdDooTlNTdHJp
bmcqKXNjcmlwdCBjb21wbGV0aW9uOih2b2lkKF4pKE5TRXJyb3IqIGVycm9yKSljb21wbGV0aW9u
SGFuZGxlcgoreworICAgIFtzZWxmIGV2YWx1YXRlQmxvY2s6XihKU0NvbnRleHQqIGNvbnRleHQp
IHsKKyAgICAgICAgW2NvbnRleHQgZXZhbHVhdGVTY3JpcHQ6c2NyaXB0XTsKKyAgICB9IGNvbXBs
ZXRpb246Y29tcGxldGlvbkhhbmRsZXJdOworfQorCistICh2b2lkKWV2YWx1YXRlQmxvY2s6KHZv
aWQoXikoSlNDb250ZXh0KiBjb250ZXh0KSlldmFsdWF0aW9uQmxvY2sgY29tcGxldGlvbjoodm9p
ZCheKShOU0Vycm9yKiBlcnJvcikpY29tcGxldGlvbkhhbmRsZXIKK3sKKyAgICBOU1BhcmFtZXRl
ckFzc2VydChldmFsdWF0aW9uQmxvY2sgIT0gbmlsKTsKKyAgICBbc2VsZiBfYWNjZXNzUGVuZGlu
Z1Rhc2tzV2l0aEJsb2NrOl4oTlNNdXRhYmxlQXJyYXkqIHBlbmRpbmdUYXNrcykgeworICAgICAg
ICBKU1RFdmFsdWF0b3JUYXNrKiB0YXNrID0gW0pTVEV2YWx1YXRvclRhc2sgZXZhbHVhdG9yVGFz
a1dpdGhFdmFsdWF0ZUJsb2NrOmV2YWx1YXRpb25CbG9jaworICAgICAgICAgICAgY29tcGxldGlv
bkhhbmRsZXI6Y29tcGxldGlvbkhhbmRsZXJdOworCisgICAgICAgIFtwZW5kaW5nVGFza3MgYWRk
T2JqZWN0OnRhc2tdOworICAgIH1dOworfQorCistICh2b2lkKXdhaXRGb3JUYXNrc0RvbmVBbmRS
ZXBvcnRSZXN1bHRzCit7CisgICAgTlNTdHJpbmcqIHBhc3NGYWlsU3RyaW5nID0gQCJQQVNTRUQi
OworCisgICAgaWYgKCFkaXNwYXRjaF9zZW1hcGhvcmVfd2FpdChfYWxsU2NyaXB0c0RvbmUsIGRp
c3BhdGNoX3RpbWUoRElTUEFUQ0hfVElNRV9OT1csIDMwICogTlNFQ19QRVJfU0VDKSkpIHsKKyAg
ICAgICAgaW50IHRvdGFsU2NyaXB0c1J1biA9IFtfanNDb250ZXh0W0AiY291bnRlciJdIHRvSW50
MzJdOworCisgICAgICAgIGlmICh0b3RhbFNjcmlwdHNSdW4gIT0gc2NyaXB0VG9FdmFsdWF0ZSkg
eworICAgICAgICAgICAgcGFzc0ZhaWxTdHJpbmcgPSBAIkZBSUxFRCI7CisgICAgICAgICAgICBm
YWlsZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgTlNMb2coQCIgIFJhbiBhIHRvdGFsIG9m
ICVkIHNjcmlwdHM6ICVAIiwgdG90YWxTY3JpcHRzUnVuLCBwYXNzRmFpbFN0cmluZyk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgcGFzc0ZhaWxTdHJpbmcgPSBAIkZBSUxFRCI7CisgICAgICAgIGZh
aWxlZCA9IDE7CisgICAgICAgIE5TTG9nKEAiICBFcnJvciwgdGltZW91dCB3YWl0aW5nIGZvciBh
bGwgdGFza3MgdG8gY29tcGxldGU6ICVAIiwgcGFzc0ZhaWxTdHJpbmcpOworICAgIH0KK30KKwor
c3RhdGljIHZvaWQgX19KU1RSdW5Mb29wU291cmNlU2NoZWR1bGVDYWxsQmFjayh2b2lkKiBpbmZv
LCBDRlJ1bkxvb3BSZWYgcmwsIENGU3RyaW5nUmVmKQoreworICAgIEBhdXRvcmVsZWFzZXBvb2wg
eworICAgICAgICBbKF9fYnJpZGdlIEpTVEV2YWx1YXRvciopaW5mbyBfc291cmNlU2NoZWR1bGVk
T25SdW5Mb29wOnJsXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fSlNUUnVuTG9vcFNvdXJj
ZVBlcmZvcm1DYWxsQmFjayh2b2lkKiBpbmZvICkKK3sKKyAgICBAYXV0b3JlbGVhc2Vwb29sIHsK
KyAgICAgICAgWyhfX2JyaWRnZSBKU1RFdmFsdWF0b3IqKWluZm8gX3NvdXJjZVBlcmZvcm1dOwor
ICAgIH0KK30KKworc3RhdGljIHZvaWQgX19KU1RSdW5Mb29wU291cmNlQ2FuY2VsQ2FsbEJhY2so
dm9pZCogaW5mbywgQ0ZSdW5Mb29wUmVmIHJsLCBDRlN0cmluZ1JlZikKK3sKKyAgICBAYXV0b3Jl
bGVhc2Vwb29sIHsKKyAgICAgICAgWyhfX2JyaWRnZSBKU1RFdmFsdWF0b3IqKWluZm8gX3NvdXJj
ZUNhbmNlbGVkT25SdW5Mb29wOnJsXTsKKyAgICB9Cit9CisKKy0gKHZvaWQpX2pzVGhyZWFkTWFp
bgoreworICAgIEBhdXRvcmVsZWFzZXBvb2wgeworICAgICAgICBjb25zdCBDRkluZGV4IGtSdW5M
b29wU291cmNlQ29udGV4dFZlcnNpb24gPSAwOworICAgICAgICBDRlJ1bkxvb3BTb3VyY2VDb250
ZXh0IHNvdXJjZUNvbnRleHQgPSB7CisgICAgICAgICAgICBrUnVuTG9vcFNvdXJjZUNvbnRleHRW
ZXJzaW9uLCAoX19icmlkZ2Ugdm9pZCopKHNlbGYpLAorICAgICAgICAgICAgTlVMTCwgTlVMTCwg
TlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgIF9fSlNUUnVuTG9vcFNvdXJjZVNjaGVkdWxl
Q2FsbEJhY2ssCisgICAgICAgICAgICBfX0pTVFJ1bkxvb3BTb3VyY2VDYW5jZWxDYWxsQmFjaywK
KyAgICAgICAgICAgIF9fSlNUUnVuTG9vcFNvdXJjZVBlcmZvcm1DYWxsQmFjaworICAgICAgICB9
OworCisgICAgICAgIEBzeW5jaHJvbml6ZWQoc2VsZikgeworICAgICAgICAgICAgX2pzVGhyZWFk
UnVuTG9vcCA9IENGUnVuTG9vcEdldEN1cnJlbnQoKTsKKyAgICAgICAgICAgIENGUmV0YWluKF9q
c1RocmVhZFJ1bkxvb3ApOworCisgICAgICAgICAgICBfanNUaHJlYWRSdW5Mb29wU291cmNlID0g
Q0ZSdW5Mb29wU291cmNlQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIDAsICZzb3VyY2VDb250
ZXh0KTsKKyAgICAgICAgICAgIENGUnVuTG9vcEFkZFNvdXJjZShfanNUaHJlYWRSdW5Mb29wLCBf
anNUaHJlYWRSdW5Mb29wU291cmNlLCBrQ0ZSdW5Mb29wRGVmYXVsdE1vZGUpOworICAgICAgICB9
CisKKyAgICAgICAgQ0ZSdW5Mb29wUnVuKCk7CisKKyAgICAgICAgQHN5bmNocm9uaXplZChzZWxm
KSB7CisgICAgICAgICAgICBOU011dGFibGVEaWN0aW9uYXJ5KiB0aHJlYWREaWN0ID0gW1tOU1Ro
cmVhZCBjdXJyZW50VGhyZWFkXSB0aHJlYWREaWN0aW9uYXJ5XTsKKyAgICAgICAgICAgIFt0aHJl
YWREaWN0IHJlbW92ZU9iamVjdEZvcktleTp0aHJlYWREaWN0W0pTVEV2YWx1YXRvclRocmVhZENv
bnRleHRLZXldXTsKKworICAgICAgICAgICAgQ0ZSZWxlYXNlKF9qc1RocmVhZFJ1bkxvb3BTb3Vy
Y2UpOworICAgICAgICAgICAgX2pzVGhyZWFkUnVuTG9vcFNvdXJjZSA9IE5VTEw7CisKKyAgICAg
ICAgICAgIENGUmVsZWFzZShfanNUaHJlYWRSdW5Mb29wKTsKKyAgICAgICAgICAgIF9qc1RocmVh
ZFJ1bkxvb3AgPSBOVUxMOworCisgICAgICAgICAgICBfX3BlbmRpbmdUYXNrcyA9IG5pbDsKKyAg
ICAgICAgfQorICAgIH0KK30KKworLSAodm9pZClfc291cmNlU2NoZWR1bGVkT25SdW5Mb29wOihD
RlJ1bkxvb3BSZWYpcnVuTG9vcAoreworICAgIFVOVVNFRF9QQVJBTShydW5Mb29wKTsKKyAgICBh
c3NlcnQoW1tbTlNUaHJlYWQgY3VycmVudFRocmVhZF0gbmFtZV0gaXNFcXVhbFRvU3RyaW5nOkAi
SlNURXZhbCJdKTsKKworICAgIC8vIFdha2UgdXAgdGhlIHJ1biBsb29wIGluIGNhc2UgcmVxdWVz
dHMgd2VyZSBzdWJtaXR0ZWQgcHJpb3IgdG8gdGhlCisgICAgLy8gcnVuIGxvb3AgJiBydW4gbG9v
cCBzb3VyY2UgZ2V0dGluZyBjcmVhdGVkLgorICAgIENGUnVuTG9vcFNvdXJjZVNpZ25hbChfanNU
aHJlYWRSdW5Mb29wU291cmNlKTsKKyAgICBDRlJ1bkxvb3BXYWtlVXAoX2pzVGhyZWFkUnVuTG9v
cCk7Cit9CisKKy0gKHZvaWQpX3NldHVwRXZhbHVhdG9yVGhyZWFkQ29udGV4dElmTmVlZGVkCit7
CisgICAgTlNNdXRhYmxlRGljdGlvbmFyeSogdGhyZWFkRGljdCA9IFtbTlNUaHJlYWQgY3VycmVu
dFRocmVhZF0gdGhyZWFkRGljdGlvbmFyeV07CisgICAgSlNURXZhbHVhdG9yVGhyZWFkQ29udGV4
dCogY29udGV4dCA9IHRocmVhZERpY3RbSlNURXZhbHVhdG9yVGhyZWFkQ29udGV4dEtleV07Cisg
ICAgLy8gVGhlIGV2YWx1YXRvciBtYXkgYmUgb3RoZXIgZXZ1YWx1YXRvciwgb3IgbmlsIGlmIHRo
aXMgdGhyZWFkIGhhcyBub3QgYmVlbiB1c2VkIGJlZm9yZS4gRWFpdGhlciB3YXkgdGFrZSBvd25l
cnNoaXAuCisgICAgaWYgKGNvbnRleHQuZXZhbHVhdG9yICE9IHNlbGYpIHsKKyAgICAgICAgY29u
dGV4dCA9IFtKU1RFdmFsdWF0b3JUaHJlYWRDb250ZXh0IG5ld107CisgICAgICAgIGNvbnRleHQu
ZXZhbHVhdG9yID0gc2VsZjsKKyAgICAgICAgdGhyZWFkRGljdFtKU1RFdmFsdWF0b3JUaHJlYWRD
b250ZXh0S2V5XSA9IGNvbnRleHQ7CisgICAgfQorfQorCistICh2b2lkKV9jYWxsQ29tcGxldGlv
bkhhbmRsZXI6KHZvaWQoXikoTlNFcnJvciogZXJyb3IpKWNvbXBsZXRpb25IYW5kbGVyIGlmTmVl
ZGVkV2l0aEVycm9yOihOU0Vycm9yKillcnJvcgoreworICAgIGlmIChjb21wbGV0aW9uSGFuZGxl
cikgeworICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfZ2xvYmFsX3F1ZXVlKERJ
U1BBVENIX1FVRVVFX1BSSU9SSVRZX0RFRkFVTFQsIDApLCBeeworICAgICAgICAgICAgY29tcGxl
dGlvbkhhbmRsZXIoZXJyb3IpOworICAgICAgICB9KTsKKyAgICB9Cit9CisKKy0gKHZvaWQpX3Nv
dXJjZVBlcmZvcm0KK3sKKyAgICBhc3NlcnQoW1tbTlNUaHJlYWQgY3VycmVudFRocmVhZF0gbmFt
ZV0gaXNFcXVhbFRvU3RyaW5nOkAiSlNURXZhbCJdKTsKKworICAgIF9fYmxvY2sgTlNBcnJheSog
dGFza3MgPSBuaWw7CisgICAgW3NlbGYgX2FjY2Vzc1BlbmRpbmdUYXNrc1dpdGhCbG9jazpeKE5T
TXV0YWJsZUFycmF5KiBwZW5kaW5nVGFza3MpIHsKKyAgICAgICAgLy8gTm8gc2lnbnBvc3QsIHRh
a2UgYWxsIHRhc2tzLgorICAgICAgICB0YXNrcyA9IFtwZW5kaW5nVGFza3MgY29weV07CisgICAg
ICAgIFtwZW5kaW5nVGFza3MgcmVtb3ZlQWxsT2JqZWN0c107CisgICAgfV07CisKKyAgICBpZiAo
dGFza3MuY291bnQgPiAwKSB7CisgICAgICAgIGZvciAoSlNURXZhbHVhdG9yVGFzayogdGFzayBp
biB0YXNrcykgeworICAgICAgICAgICAgZGlzcGF0Y2hfYmxvY2tfdCBibG9jayA9IF57CisgICAg
ICAgICAgICAgICAgTlNFcnJvciogZXJyb3IgPSBuaWw7CisgICAgICAgICAgICAgICAgaWYgKHRh
c2suZXZhbHVhdGVCbG9jaykgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBfc2V0dXBFdmFs
dWF0b3JUaHJlYWRDb250ZXh0SWZOZWVkZWRdOworICAgICAgICAgICAgICAgICAgICB0YXNrLmV2
YWx1YXRlQmxvY2soX2pzQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfanNDb250
ZXh0LmV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJEaWQgZmFp
bCBvbiBKU0NvbnRleHQ6ICVAIiwgX2pzQ29udGV4dC5uYW1lKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIE5TRGljdGlvbmFyeSogdXNlckluZm8gPSBAeyBOU0xvY2FsaXplZERlc2NyaXB0aW9u
S2V5IDogW19qc0NvbnRleHQuZXhjZXB0aW9uW0AibWVzc2FnZSJdIHRvU3RyaW5nXSB9OworICAg
ICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46QCJK
U1RFdmFsdWF0b3IiIGNvZGU6MSB1c2VySW5mbzp1c2VySW5mb107CisgICAgICAgICAgICAgICAg
ICAgICAgICBfanNDb250ZXh0LmV4Y2VwdGlvbiA9IG5pbDsKKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBbc2VsZiBfY2FsbENvbXBsZXRp
b25IYW5kbGVyOnRhc2suY29tcGxldGlvbkhhbmRsZXIgaWZOZWVkZWRXaXRoRXJyb3I6ZXJyb3Jd
OworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKHRhc2suZXZhbHVhdGVCbG9jaykK
KyAgICAgICAgICAgICAgICBkaXNwYXRjaF9hc3luYyhfanNTb3VyY2VQZXJmb3JtUXVldWUsIGJs
b2NrKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaXNwYXRjaF9iYXJyaWVy
X2FzeW5jKF9qc1NvdXJjZVBlcmZvcm1RdWV1ZSwgYmxvY2spOworICAgICAgICB9CisKKyAgICAg
ICAgZGlzcGF0Y2hfYmFycmllcl9zeW5jKF9qc1NvdXJjZVBlcmZvcm1RdWV1ZSwgXnsKKyAgICAg
ICAgICAgIGlmIChbX2pzQ29udGV4dFtAImNvdW50ZXIiXSB0b0ludDMyXSA9PSBzY3JpcHRUb0V2
YWx1YXRlKQorICAgICAgICAgICAgICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoX2FsbFNj
cmlwdHNEb25lKTsKKyAgICAgICAgfSk7CisgICAgfQorfQorCistICh2b2lkKV9zb3VyY2VDYW5j
ZWxlZE9uUnVuTG9vcDooQ0ZSdW5Mb29wUmVmKXJ1bkxvb3AKK3sKKyAgICBVTlVTRURfUEFSQU0o
cnVuTG9vcCk7CisgICAgYXNzZXJ0KFtbW05TVGhyZWFkIGN1cnJlbnRUaHJlYWRdIG5hbWVdIGlz
RXF1YWxUb1N0cmluZzpAIkpTVEV2YWwiXSk7CisKKyAgICBAc3luY2hyb25pemVkKHNlbGYpIHsK
KyAgICAgICAgYXNzZXJ0KF9qc1RocmVhZFJ1bkxvb3ApOworICAgICAgICBhc3NlcnQoX2pzVGhy
ZWFkUnVuTG9vcFNvdXJjZSk7CisKKyAgICAgICAgQ0ZSdW5Mb29wUmVtb3ZlU291cmNlKF9qc1Ro
cmVhZFJ1bkxvb3AsIF9qc1RocmVhZFJ1bkxvb3BTb3VyY2UsIGtDRlJ1bkxvb3BEZWZhdWx0TW9k
ZSk7CisgICAgICAgIENGUnVuTG9vcFN0b3AoX2pzVGhyZWFkUnVuTG9vcCk7CisgICAgfQorfQor
CitAZW5kCisKK3ZvaWQgcnVuUmVncmVzczE0MTI3NSgpCit7CisgICAgLy8gVGVzdCB0aGF0IHdl
IGNhbiBleGVjdXRlIHRoZSBzYW1lIHNjcmlwdCBmcm9tIG11bHRpcGxlIHRocmVhZHMgd2l0aCBh
IHNoYXJlZCBjb250ZXh0LgorICAgIC8vIFNlZSA8aHR0cHM6Ly93ZWJraXQub3JnL2IvMTQxMjc1
PgorICAgIE5TTG9nKEAiVEVTVDogVGVzdGluZyBtdWx0aXBsZSB0aHJlYWRzIGV4ZWN1dGluZyB0
aGUgc2FtZSBzY3JpcHQgd2l0aCBhIHNoYXJlZCBjb250ZXh0Iik7CisKKyAgICBAYXV0b3JlbGVh
c2Vwb29sIHsKKyAgICAgICAgSlNURXZhbHVhdG9yKiBldmFsdWF0b3IgPSBbW0pTVEV2YWx1YXRv
ciBhbGxvY10gaW5pdFdpdGhTY3JpcHQ6QCJ0aGlzWydjb3VudGVyJ10gPSAwOyJdOworCisgICAg
ICAgIHZvaWQgKF5zaG93RXJyb3JJZk5lZWRlZCkoTlNFcnJvciogZXJyb3IpID0gXihOU0Vycm9y
KiBlcnJvcikgeworICAgICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgZGlz
cGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgXnsKKyAgICAgICAgICAgICAg
ICAgICAgTlNMb2coQCJFcnJvcjogJUAiLCBlcnJvcik7CisgICAgICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgW2V2YWx1YXRvciBldmFsdWF0ZUJs
b2NrOl4oSlNDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICAgICAgICBKU1N5bmNocm9ub3VzR2Fy
YmFnZUNvbGxlY3RGb3JEZWJ1Z2dpbmcoW2NvbnRleHQgSlNHbG9iYWxDb250ZXh0UmVmXSk7Cisg
ICAgICAgIH0gY29tcGxldGlvbjpzaG93RXJyb3JJZk5lZWRlZF07CisKKyAgICAgICAgW2V2YWx1
YXRvciBldmFsdWF0ZUJsb2NrOl4oSlNDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICAgICAgICBj
b250ZXh0W0Aid2FpdCJdID0gXnsKKyAgICAgICAgICAgICAgICBbTlNUaHJlYWQgc2xlZXBGb3JU
aW1lSW50ZXJ2YWw6MC4wMV07CisgICAgICAgICAgICB9OworICAgICAgICB9IGNvbXBsZXRpb246
XihOU0Vycm9yKiBlcnJvcikgeworICAgICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAg
ICAgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgXnsKKyAgICAg
ICAgICAgICAgICAgICAgTlNMb2coQCJFcnJvcjogJUAiLCBlcnJvcik7CisgICAgICAgICAgICAg
ICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgc2NyaXB0VG9FdmFsdWF0ZTsgaSsrKQorICAgICAgICAgICAgICAgIFtldmFsdWF0b3IgZXZh
bHVhdGVTY3JpcHQ6QCJ0aGlzWydjb3VudGVyJ10rKzsgdGhpc1snd2FpdCddKCk7IiBjb21wbGV0
aW9uOnNob3dFcnJvcklmTmVlZGVkXTsKKyAgICAgICAgfV07CisKKyAgICAgICAgW2V2YWx1YXRv
ciB3YWl0Rm9yVGFza3NEb25lQW5kUmVwb3J0UmVzdWx0c107CisgICAgfQorfQorCisjZW5kaWYg
Ly8gSlNDX09CSkNfQVBJX0VOQUJMRUQKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkv
dGVzdHMvdGVzdGFwaS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJ
L3Rlc3RzL3Rlc3RhcGkubW0JKHJldmlzaW9uIDE4MDk3MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9BUEkvdGVzdHMvdGVzdGFwaS5tbQkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBA
QAogI2ltcG9ydCAiQ3VycmVudFRoaXNJbnNpZGVCbG9ja0dldHRlclRlc3QuaCIKICNpbXBvcnQg
IkRhdGVUZXN0cy5oIgogI2ltcG9ydCAiSlNFeHBvcnRUZXN0cy5oIgorI2ltcG9ydCAiUmVncmVz
czE0MTI3NS5oIgogI2ltcG9ydCAiUmVncmVzczE0MTgwOS5oIgogCiAjaW1wb3J0IDxwdGhyZWFk
Lmg+CkBAIC00ODYsNyArNDg3LDYgQEAgc3RhdGljIHZvaWQqIHRocmVhZE1haW4odm9pZCogY29u
dGV4dFB0cgogdm9pZCB0ZXN0T2JqZWN0aXZlQ0FQSSgpCiB7CiAgICAgTlNMb2coQCJUZXN0aW5n
IE9iamVjdGl2ZS1DIEFQSSIpOwotCiAgICAgQGF1dG9yZWxlYXNlcG9vbCB7CiAgICAgICAgIEpT
VmlydHVhbE1hY2hpbmUqIHZtID0gW1tKU1ZpcnR1YWxNYWNoaW5lIGFsbG9jXSBpbml0XTsKICAg
ICAgICAgSlNDb250ZXh0KiBjb250ZXh0ID0gW1tKU0NvbnRleHQgYWxsb2NdIGluaXRXaXRoVmly
dHVhbE1hY2hpbmU6dm1dOwpAQCAtMTM4Niw2ICsxMzg2LDcgQEAgdm9pZCB0ZXN0T2JqZWN0aXZl
Q0FQSSgpCiAgICAgY3VycmVudFRoaXNJbnNpZGVCbG9ja0dldHRlclRlc3QoKTsKICAgICBydW5E
YXRlVGVzdHMoKTsKICAgICBydW5KU0V4cG9ydFRlc3RzKCk7CisgICAgcnVuUmVncmVzczE0MTI3
NSgpOwogICAgIHJ1blJlZ3Jlc3MxNDE4MDkoKTsKIH0KIApJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oJKHJldmlzaW9uIDE4MDk3MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9K
YXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBA
IC05MzQsNiArOTM0LDcgQEAKIAkJNjU1MjVGQzUxQTZERDgwMTAwN0I1NDk1IC8qIE51bGxTZXR0
ZXJGdW5jdGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA2NTUyNUZDMzFBNkREM0IzMDA3QjU0OTUgLyogTnVsbFNldHRlckZ1bmN0aW9uLmNwcCAq
LzsgfTsKIAkJNjU1M0EzMzExN0ExRjFFRTAwOENGNkYzIC8qIENvbW1vblNsb3dQYXRoc0V4Y2Vw
dGlvbnMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
NjU1M0EzMkYxN0ExRjFFRTAwOENGNkYzIC8qIENvbW1vblNsb3dQYXRoc0V4Y2VwdGlvbnMuY3Bw
ICovOyB9OwogCQk2NTUzQTMzMjE3QTFGMUVFMDA4Q0Y2RjMgLyogQ29tbW9uU2xvd1BhdGhzRXhj
ZXB0aW9ucy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
NjU1M0EzMzAxN0ExRjFFRTAwOENGNkYzIC8qIENvbW1vblNsb3dQYXRoc0V4Y2VwdGlvbnMuaCAq
LzsgfTsKKwkJNjU1NzBGNUExQUE0QzNFQTAwOUIzQzIzIC8qIFJlZ3Jlc3MxNDEyNzUubW0gaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2NTU3MEY1OTFBQTRD
MDBBMDA5QjNDMjMgLyogUmVncmVzczE0MTI3NS5tbSAqLzsgfTsKIAkJNjU1RUIyOUIxMENFMjU4
MTAwMUE5OTBFIC8qIE5vZGVzQ29kZWdlbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA2NTVFQjI5QTEwQ0UyNTgxMDAxQTk5MEUgLyogTm9kZXNDb2Rl
Z2VuLmNwcCAqLzsgfTsKIAkJNjU3Q0Y0NTgxOUJGNjY2MjAwNEFDQkYyIC8qIEpTQ2FsbGVlLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDY1N0NGNDU2
MTlCRjY2NjIwMDRBQ0JGMiAvKiBKU0NhbGxlZS5jcHAgKi87IH07CiAJCTY1N0NGNDU5MTlCRjY2
NjIwMDRBQ0JGMiAvKiBKU0NhbGxlZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNjU3Q0Y0NTcxOUJGNjY2MjAwNEFDQkYyIC8qIEpTQ2FsbGVlLmggKi87
IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTI1OTcsNiAr
MjU5OCw4IEBACiAJCTY1NTI1RkM0MUE2REQzQjMwMDdCNTQ5NSAvKiBOdWxsU2V0dGVyRnVuY3Rp
b24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTnVsbFNldHRlckZ1bmN0aW9u
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTY1NTNBMzJGMTdBMUYxRUUwMDhDRjZG
MyAvKiBDb21tb25TbG93UGF0aHNFeGNlcHRpb25zLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IENvbW1vblNsb3dQYXRoc0V4Y2VwdGlvbnMuY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk2NTUzQTMzMDE3QTFGMUVFMDA4Q0Y2RjMgLyogQ29tbW9uU2xv
d1BhdGhzRXhjZXB0aW9ucy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDb21t
b25TbG93UGF0aHNFeGNlcHRpb25zLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTY1
NTcwRjU4MUFBNEMwMEEwMDlCM0MyMyAvKiBSZWdyZXNzMTQxMjc1LmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgbmFtZSA9IFJlZ3Jlc3MxNDEyNzUuaDsgcGF0aCA9IEFQSS90ZXN0cy9SZWdy
ZXNzMTQxMjc1Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTY1NTcwRjU5MUFBNEMw
MEEwMDlCM0MyMyAvKiBSZWdyZXNzMTQxMjc1Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
b2JqY3BwOyBuYW1lID0gUmVncmVzczE0MTI3NS5tbTsgcGF0aCA9IEFQSS90ZXN0cy9SZWdyZXNz
MTQxMjc1Lm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk2NTVFQjI5QTEwQ0UyNTgx
MDAxQTk5MEUgLyogTm9kZXNDb2RlZ2VuLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IE5vZGVzQ29kZWdlbi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTY1NjBBNENGMDRCM0IzRTcwMDhBRTk1MiAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZy
YW1ld29yazsgbmFtZSA9IENvcmVGb3VuZGF0aW9uLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0v
TGlicmFyeS9GcmFtZXdvcmtzL0NvcmVGb3VuZGF0aW9uLmZyYW1ld29yazsgc291cmNlVHJlZSA9
ICI8YWJzb2x1dGU+IjsgfTsKIAkJNjU2MjFFNkIwODlFODU5NzAwNzYwRjM1IC8qIFByb3BlcnR5
U2xvdC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7
IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBQcm9wZXJ0eVNsb3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0
aCA9IDg7IH07CkBAIC0zNzI4LDYgKzM3MzEsOCBAQAogCQkJCUMyODhCMkREMThBNTREM0UwMDdC
RTQwQiAvKiBEYXRlVGVzdHMubW0gKi8sCiAJCQkJQzIxODFGQzAxOEE5NDhGQjAwMjVBMjM1IC8q
IEpTRXhwb3J0VGVzdHMuaCAqLywKIAkJCQlDMjE4MUZDMTE4QTk0OEZCMDAyNUEyMzUgLyogSlNF
eHBvcnRUZXN0cy5tbSAqLywKKwkJCQk2NTU3MEY1ODFBQTRDMDBBMDA5QjNDMjMgLyogUmVncmVz
czE0MTI3NS5oICovLAorCQkJCTY1NTcwRjU5MUFBNEMwMEEwMDlCM0MyMyAvKiBSZWdyZXNzMTQx
Mjc1Lm1tICovLAogCQkJCUZFQjUxRjZBMUE5N0I2ODgwMDFGOTIxQyAvKiBSZWdyZXNzMTQxODA5
LmggKi8sCiAJCQkJRkVCNTFGNkIxQTk3QjY4ODAwMUY5MjFDIC8qIFJlZ3Jlc3MxNDE4MDkubW0g
Ki8sCiAJCQkJMTQ0MDA1MTcwQTUzMUNCNTAwMDVGMDYxIC8qIG1pbmlkb20gKi8sCkBAIC02NzU3
LDYgKzY3NjIsNyBAQAogCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CiAJCQlidWlsZEFj
dGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwogCQkJZmlsZXMgPSAoCisJCQkJNjU1NzBGNUExQUE0QzNF
QTAwOUIzQzIzIC8qIFJlZ3Jlc3MxNDEyNzUubW0gaW4gU291cmNlcyAqLywKIAkJCQlDMjlFQ0Iw
MzE4MDREMEVEMDBEMkNCQjQgLyogQ3VycmVudFRoaXNJbnNpZGVCbG9ja0dldHRlclRlc3QubW0g
aW4gU291cmNlcyAqLywKIAkJCQlGRUI1MUY2QzFBOTdCNjg4MDAxRjkyMUMgLyogUmVncmVzczE0
MTgwOS5tbSBpbiBTb3VyY2VzICovLAogCQkJCUMyMDMyODIwMTk4MTk3OUQwMDg4QjQ5OSAvKiBD
dXN0b21HbG9iYWxPYmplY3RDbGFzc1Rlc3QuYyBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2hlYXAvSGVhcC5jcHAJKHJldmlzaW9uIDE4MDk3MCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9oZWFwL0hlYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNjgsMTAgKzM2OCwy
NSBAQCB2b2lkIEhlYXA6Omxhc3RDaGFuY2VUb0ZpbmFsaXplKCkKIHZvaWQgSGVhcDo6cmVsZWFz
ZURlbGF5ZWRSZWxlYXNlZE9iamVjdHMoKQogewogI2lmIFVTRShDRikKKyAgICAvLyBXZSBuZWVk
IHRvIGd1YXJkIGFnYWluc3QgdGhlIGNhc2UgdGhhdCByZWxlYXNpbmcgYW4gb2JqZWN0IGNhbiBj
cmVhdGUgbW9yZSBvYmplY3RzIGR1ZSB0byB0aGUKKyAgICAvLyByZWxlYXNlIGNhbGxpbmcgaW50
byBKUy4gV2hlbiB0aG9zZSBKUyBjYWxsKHMpIGV4aXQgYW5kIGFsbCBsb2NrcyBhcmUgYmVpbmcg
ZHJvcHBlZCB3ZSBlbmQgdXAKKyAgICAvLyBiYWNrIGhlcmUgYW5kIGNvdWxkIHRyeSB0byByZWN1
cnNpdmVseSByZWxlYXNlIG9iamVjdHMuIFdlIGd1YXJkIHRoYXQgd2l0aCBhIHJlY3Vyc2l2ZSBl
bnRyeQorICAgIC8vIGNvdW50LiBPbmx5IHRoZSBpbml0aWFsIGNhbGwgd2lsbCByZWxlYXNlIG9i
amVjdHMsIHJlY3Vyc2l2ZSBjYWxscyBzaW1wbGUgcmV0dXJuIGFuZCBsZXQgdGhlCisgICAgLy8g
dGhlIGluaXRpYWwgY2FsbCB0byB0aGUgZnVuY3Rpb24gdGFrZSBjYXJlIG9mIGFueSBvYmplY3Rz
IGNyZWF0ZWQgZHVyaW5nIHJlbGVhc2UgdGltZS4KKyAgICAvLyBUaGlzIGFsc28gbWVhbnMgdGhh
dCB3ZSBuZWVkIHRvIGxvb3AgdW50aWwgdGhlcmUgYXJlIG5vIG9iamVjdHMgaW4gbV9kZWxheWVk
UmVsZWFzZU9iamVjdHMKKyAgICAvLyBhbmQgdXNlIGEgdGVtcCBWZWN0b3IgZm9yIHRoZSBhY3R1
YWwgcmVsZWFzaW5nLgogICAgIGlmICghbV9kZWxheWVkUmVsZWFzZVJlY3Vyc2lvbkNvdW50Kysp
IHsKICAgICAgICAgd2hpbGUgKCFtX2RlbGF5ZWRSZWxlYXNlT2JqZWN0cy5pc0VtcHR5KCkpIHsK
LSAgICAgICAgICAgIFJldGFpblB0cjxDRlR5cGVSZWY+IG9iamVjdFRvUmVsZWFzZSA9IG1fZGVs
YXllZFJlbGVhc2VPYmplY3RzLnRha2VMYXN0KCk7Ci0gICAgICAgICAgICBvYmplY3RUb1JlbGVh
c2UuY2xlYXIoKTsKKyAgICAgICAgICAgIEFTU0VSVChtX3ZtLT5jdXJyZW50VGhyZWFkSXNIb2xk
aW5nQVBJTG9jaygpKTsKKworICAgICAgICAgICAgVmVjdG9yPFJldGFpblB0cjxDRlR5cGVSZWY+
PiBvYmplY3RzVG9SZWxlYXNlID0gV1RGOjptb3ZlKG1fZGVsYXllZFJlbGVhc2VPYmplY3RzKTsK
KworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZHJvcCBsb2Nr
cyBiZWZvcmUgY2FsbGluZyBvdXQgdG8gYXJiaXRyYXJ5IGNvZGUuCisgICAgICAgICAgICAgICAg
SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzKG1fdm0pOworCisgICAgICAgICAgICAg
ICAgb2JqZWN0c1RvUmVsZWFzZS5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAg
ICAgfQogICAgIG1fZGVsYXllZFJlbGVhc2VSZWN1cnNpb25Db3VudC0tOwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNMb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0xvY2suY3BwCShyZXZpc2lvbiAxODA5NzApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0xvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xNTcsMTAgKzE1NywxNCBAQCB2b2lkIEpTTG9jazo6dW5sb2NrKGludHB0cl90IHVubG9ja0Nv
dW50CiAgICAgUkVMRUFTRV9BU1NFUlQoY3VycmVudFRocmVhZElzSG9sZGluZ0xvY2soKSk7CiAg
ICAgQVNTRVJUKG1fbG9ja0NvdW50ID49IHVubG9ja0NvdW50KTsKIAorICAgIC8vIE1haW50YWlu
IG1fbG9ja0NvdW50IHdoaWxlIGNhbGxpbmcgd2lsbFJlbGVhc2VMb2NrKCkgc28gdGhhdCBpdHMg
Y2FsbGVlcyBrbm93IHRoYXQKKyAgICAvLyB0aGV5IHN0aWxsIGhhdmUgdGhlIGxvY2suCisgICAg
aWYgKHVubG9ja0NvdW50ID09IG1fbG9ja0NvdW50KQorICAgICAgICB3aWxsUmVsZWFzZUxvY2so
KTsKKwogICAgIG1fbG9ja0NvdW50IC09IHVubG9ja0NvdW50OwogCiAgICAgaWYgKCFtX2xvY2tD
b3VudCkgewotICAgICAgICB3aWxsUmVsZWFzZUxvY2soKTsKIAogICAgICAgICBpZiAoIW1faGFz
RXhjbHVzaXZlVGhyZWFkKSB7CiAgICAgICAgICAgICBtX293bmVyVGhyZWFkSUQgPSBzdGQ6OnRo
cmVhZDo6aWQoKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>