<?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>78278</bug_id>
          
          <creation_ts>2012-02-09 13:29:56 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream graphics helper classes in WebKitSupport</short_desc>
          <delta_ts>2012-02-10 12:46:19 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73144</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Rob Buis">rwlbuis</reporter>
          <assigned_to name="Rob Buis">rwlbuis</assigned_to>
          <cc>abarth</cc>
    
    <cc>jpetsovits</cc>
    
    <cc>manyoso</cc>
    
    <cc>ojan</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>553457</commentid>
    <comment_count>0</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-09 13:29:56 -0800</bug_when>
    <thetext>Upstream graphics helper classes in WebKitSupport</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553461</commentid>
    <comment_count>1</comment_count>
      <attachid>126360</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-09 13:31:45 -0800</bug_when>
    <thetext>Created attachment 126360
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553464</commentid>
    <comment_count>2</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-09 13:36:32 -0800</bug_when>
    <thetext>Add Antonio.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553512</commentid>
    <comment_count>3</comment_count>
      <attachid>126360</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-09 14:37:03 -0800</bug_when>
    <thetext>Comment on attachment 126360
Patch

you probably uploaded the wrong patch. WebPageCompositor is here: bug 78276</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553519</commentid>
    <comment_count>4</comment_count>
      <attachid>126376</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-09 14:43:02 -0800</bug_when>
    <thetext>Created attachment 126376
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553548</commentid>
    <comment_count>5</comment_count>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-09 15:10:55 -0800</bug_when>
    <thetext>jakob/adam, do we want to upstream #if OPENVG blocks of code, or stick with SKIA only?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553555</commentid>
    <comment_count>6</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2012-02-09 15:15:32 -0800</bug_when>
    <thetext>I think we want to avoid upstreaming them, and suggest removal of OpenVG from the tree as it&apos;s not a focus for us anymore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553604</commentid>
    <comment_count>7</comment_count>
      <attachid>126376</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-09 16:21:38 -0800</bug_when>
    <thetext>Comment on attachment 126376
Patch

lets set us free of openvg first :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553704</commentid>
    <comment_count>8</comment_count>
      <attachid>126425</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-09 18:36:53 -0800</bug_when>
    <thetext>Created attachment 126425
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553733</commentid>
    <comment_count>9</comment_count>
      <attachid>126425</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-09 19:12:56 -0800</bug_when>
    <thetext>Comment on attachment 126425
Patch

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

some more comments and questions ...

&gt; Source/WebKit/blackberry/WebKitSupport/SurfacePool.cpp:109
&gt; +#if USE(SKIA)
&gt; +    WebCore::PlatformContextSkia* platformGraphicsContext = new WebCore::PlatformContextSkia(drawable);
&gt; +#endif
&gt; +    return platformGraphicsContext;

that wont build if !SKIA

&gt; Source/WebKit/blackberry/WebKitSupport/SurfacePool.cpp:119
&gt; +PlatformGraphicsContext* SurfacePool::lockTileRenderingSurface() const
&gt; +{
&gt; +#if USE(SKIA)
&gt; +    if (!m_tileRenderingSurface)
&gt; +        return 0;
&gt; +    return createPlatformGraphicsContext(BlackBerry::Platform::Graphics::lockBufferDrawable(m_tileRenderingSurface));
&gt; +#endif
&gt; +}

that wont return anything if !SKIA

&gt; Source/WebKit/blackberry/WebKitSupport/SurfacePool.cpp:175
&gt; +    // Create the m_visibleTileBuffer.

do we need these comment?

&gt; Source/WebKit/blackberry/WebKitSupport/SurfacePool.cpp:199
&gt; +    // Release the m_visibleTileBuffer.

ditto

&gt; Source/WebKit/blackberry/WebKitSupport/SurfacePool.cpp:205
&gt; +    // Release the backbuffer.

ditto

&gt; Source/WebKit/blackberry/WebKitSupport/SurfacePool.h:87
&gt; +#if USE(SKIA)

maybe we should just drop the SKIA condition completely?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554066</commentid>
    <comment_count>10</comment_count>
      <attachid>126513</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-10 07:20:33 -0800</bug_when>
    <thetext>Created attachment 126513
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554075</commentid>
    <comment_count>11</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-10 07:43:35 -0800</bug_when>
    <thetext>Landed in r107401.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554238</commentid>
    <comment_count>12</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-10 11:23:10 -0800</bug_when>
    <thetext>Reopening to attach new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554239</commentid>
    <comment_count>13</comment_count>
      <attachid>126542</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-10 11:23:14 -0800</bug_when>
    <thetext>Created attachment 126542
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554266</commentid>
    <comment_count>14</comment_count>
      <attachid>126546</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-10 11:59:52 -0800</bug_when>
    <thetext>Created attachment 126546
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554310</commentid>
    <comment_count>15</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-10 12:46:19 -0800</bug_when>
    <thetext>Landed in r107426.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126360</attachid>
            <date>2012-02-09 13:31:45 -0800</date>
            <delta_ts>2012-02-09 14:42:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78278-20120209163415.patch</filename>
            <type>text/plain</type>
            <size>8431</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MjYyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDY3OGI4NDBmNTk3MjQxYmMy
MDNjZTYyZGZkMWZmY2VmY2YwZWJlZDkuLjI3NGUyODM2YzFmYWFjNDI1ZmM0MzkzNTdkNmRiNjBm
NDNmMzk3YTAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMDkgIFJvYiBCdWlz
ICA8cmJ1aXNAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0gQmxhY2tC
ZXJyeSBXZWJLaXRTdXBwb3J0IFdlYlBhZ2VDb21wb3NpdG9yIGNsYXNzCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03ODI3NgorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5l
dyB0ZXN0cy4KKworICAgICAgICAqIGJsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9XZWJQYWdlQ29t
cG9zaXRvci5jcHA6IEFkZGVkLgorICAgICAgICAqIGJsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9X
ZWJQYWdlQ29tcG9zaXRvci5oOiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgSmFja3kgSmlhbmcgIDx6
aGFqaWFuZ0ByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBCbGFja0Jl
cnJ5IFdlYkNvcmVTdXBwb3J0IEZyYW1lTmV0d29ya2luZ0NvbnRleHRCbGFja0JlcnJ5IGFuZCBJ
Y29uRGF0YWJhc2VDbGllbnRCbGFja0JlcnJ5IGNsYXNzZXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1dlYlBhZ2VDb21wb3NpdG9yLmNwcCBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1dlYlBhZ2VDb21wb3NpdG9yLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5mNzdhYzY0MjcyZjkzY2M4M2IzODlhYTZhOTU2OTZjYjVhZTIwYzMxCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQv
V2ViUGFnZUNvbXBvc2l0b3IuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh
cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJXZWJQYWdlQ29tcG9zaXRvci5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorI2luY2x1ZGUgIkxheWVyV2ViS2l0VGhyZWFkLmgiCisjaW5jbHVkZSAiV2Vi
UGFnZV9wLmgiCisKKyNpbmNsdWRlIDxHZW5lcmljVGltZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxU
aHJlYWRUaW1lckNsaWVudC5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNw
YWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CisKK1dlYlBhZ2VDb21wb3NpdG9y
OjpXZWJQYWdlQ29tcG9zaXRvcihXZWJQYWdlUHJpdmF0ZSogcGFnZSkKKyAgICA6IG1fd2ViUGFn
ZShwYWdlKQorICAgICwgbV9sYXllclJlbmRlcmVyKExheWVyUmVuZGVyZXI6OmNyZWF0ZShwYWdl
LT5tX3BhZ2UpKQorICAgICwgbV9nZW5lcmF0aW9uKDApCisgICAgLCBtX2NvbXBvc2l0ZWRHZW5l
cmF0aW9uKC0xKQorICAgICwgbV9jb21wb3NpdGluZ09udG9NYWluV2luZG93KGZhbHNlKQorICAg
ICwgbV9ibGl0VGltZXIodGhpcywgJkJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZUNvbXBvc2l0
b3I6OmJsaXRUaW1lckZpcmVkKQorICAgICwgbV90aW1lckNsaWVudChuZXcgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdlbmVyaWNUaW1lckNsaWVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlcklu
dGVyZmFjZVRocmVhZFRpbWVyQ2xpZW50KCkpKQoreworICAgIG1fYmxpdFRpbWVyLnNldENsaWVu
dChtX3RpbWVyQ2xpZW50KTsKK30KKworV2ViUGFnZUNvbXBvc2l0b3I6On5XZWJQYWdlQ29tcG9z
aXRvcigpCit7CisgICAgbV9ibGl0VGltZXIuc3RvcCgpOworICAgIGRlbGV0ZSBtX3RpbWVyQ2xp
ZW50OworfQorCitib29sIFdlYlBhZ2VDb21wb3NpdG9yOjpoYXJkd2FyZUNvbXBvc2l0aW5nKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9sYXllclJlbmRlcmVyLT5oYXJkd2FyZUNvbXBvc2l0aW5n
KCk7Cit9CisKK3ZvaWQgV2ViUGFnZUNvbXBvc2l0b3I6OnNldFJvb3RMYXllcihMYXllckNvbXBv
c2l0aW5nVGhyZWFkKiByb290TGF5ZXIpCit7CisgICAgbV9yb290TGF5ZXIgPSByb290TGF5ZXI7
CisgICAgbV9sYXllclJlbmRlcmVyLT5zZXRSb290TGF5ZXIobV9yb290TGF5ZXIuZ2V0KCkpOwor
fQorCit2b2lkIFdlYlBhZ2VDb21wb3NpdG9yOjpzZXRDb21wb3NpdGluZ09udG9NYWluV2luZG93
KGJvb2wgY29tcG9zaXRpbmdPbnRvTWFpbldpbmRvdykKK3sKKyAgICBtX2NvbXBvc2l0aW5nT250
b01haW5XaW5kb3cgPSBjb21wb3NpdGluZ09udG9NYWluV2luZG93OworICAgIG1fbGF5ZXJSZW5k
ZXJlci0+c2V0Q2xlYXJTdXJmYWNlT25EcmF3TGF5ZXJzKCFjb21wb3NpdGluZ09udG9NYWluV2lu
ZG93KTsKK30KKwordm9pZCBXZWJQYWdlQ29tcG9zaXRvcjo6Y29tbWl0KExheWVyV2ViS2l0VGhy
ZWFkKiByb290TGF5ZXIpCit7CisgICAgaWYgKCFyb290TGF5ZXIpCisgICAgICAgIHJldHVybjsK
KworICAgIHJvb3RMYXllci0+Y29tbWl0T25Db21wb3NpdGluZ1RocmVhZCgpOworICAgICsrbV9n
ZW5lcmF0aW9uOworfQorCitib29sIFdlYlBhZ2VDb21wb3NpdG9yOjpkcmF3TGF5ZXJzKGNvbnN0
IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgY29udGVudHMpCit7CisgICAgLy8g
U2F2ZSBhIGRyYXcgaWYgd2UgYWxyZWFkeSBkcmV3IHRoaXMgZ2VuZXJhdGlvbiwgZm9yIGV4YW1w
bGUgZHVlIHRvIGEgY29uY3VycmVudCBzY3JvbGwgb3BlcmF0aW9uLgorICAgIGlmIChtX2NvbXBv
c2l0ZWRHZW5lcmF0aW9uID09IG1fZ2VuZXJhdGlvbiAmJiBkc3RSZWN0ID09IG1fY29tcG9zaXRl
ZERzdFJlY3QKKyAgICAgICAgJiYgY29udGVudHMgPT0gbV9jb21wb3NpdGVkQ29udGVudHNSZWN0
ICYmICFtX2NvbXBvc2l0aW5nT250b01haW5XaW5kb3cpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIG1fbGF5ZXJSZW5kZXJlci0+ZHJhd0xheWVycyhjb250ZW50cywgbV9sYXlvdXRSZWN0
Rm9yQ29tcG9zaXRpbmcsIG1fY29udGVudHNTaXplRm9yQ29tcG9zaXRpbmcsIGRzdFJlY3QpOwor
ICAgIG1fbGFzdENvbXBvc2l0aW5nUmVzdWx0cyA9IG1fbGF5ZXJSZW5kZXJlci0+bGFzdFJlbmRl
cmluZ1Jlc3VsdHMoKTsKKworICAgIG1fY29tcG9zaXRlZERzdFJlY3QgPSBkc3RSZWN0OworICAg
IG1fY29tcG9zaXRlZENvbnRlbnRzUmVjdCA9IGNvbnRlbnRzOworICAgIG1fY29tcG9zaXRlZEdl
bmVyYXRpb24gPSBtX2dlbmVyYXRpb247CisKKyAgICBpZiAobV9sYXN0Q29tcG9zaXRpbmdSZXN1
bHRzLm5lZWRzQW5pbWF0aW9uRnJhbWUpIHsKKyAgICAgICAgKyttX2dlbmVyYXRpb247IC8vIFRo
ZSBhbmltYXRpb24gdXBkYXRlIG1vdmVzIHVzIGFsb25nIG9uZSBnZW5lcmF0aW9uCisgICAgICAg
IC8vIFVzaW5nIGEgdGltZW91dCBvZiAwIGFjdHVhbGx5IHdvbid0IHN0YXJ0IGEgdGltZXIsIGl0
IHdpbGwgc2VuZCBhIG1lc3NhZ2UKKyAgICAgICAgbV9ibGl0VGltZXIuc3RhcnQoMS4wIC8gNjAu
MCk7CisgICAgICAgIG1fd2ViUGFnZS0+dXBkYXRlRGVsZWdhdGVkT3ZlcmxheXMoKTsKKyAgICB9
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdlQ29tcG9zaXRvcjo6cmVsZWFz
ZUxheWVyUmVzb3VyY2VzKCkKK3sKKyAgICBtX2xheWVyUmVuZGVyZXItPnJlbGVhc2VMYXllclJl
c291cmNlcygpOworfQorCit2b2lkIFdlYlBhZ2VDb21wb3NpdG9yOjpibGl0VGltZXJGaXJlZCgp
Cit7CisgICAgbV93ZWJQYWdlLT5ibGl0VmlzaWJsZUNvbnRlbnRzKCk7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdlYktpdAorfSAvLyBuYW1lc3BhY2UgQmxhY2tCZXJyeQorCisjZW5kaWYgLy8gVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFj
a2JlcnJ5L1dlYktpdFN1cHBvcnQvV2ViUGFnZUNvbXBvc2l0b3IuaCBiL1NvdXJjZS9XZWJLaXQv
YmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1dlYlBhZ2VDb21wb3NpdG9yLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
Y2I5ZGQ2YTM4NTI1YmNkMzI4ZTAzNTY3ODk1ZTVkM2RmYTc5NDI3MwotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1dlYlBhZ2VDb21wb3Np
dG9yLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwg
MjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2Vy
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx
MC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFdlYlBhZ2VDb21wb3NpdG9yX2gKKyNkZWZpbmUg
V2ViUGFnZUNvbXBvc2l0b3JfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
CisjaW5jbHVkZSAiTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oIgorI2luY2x1ZGUgIkxheWVyUmVu
ZGVyZXIuaCIKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVRpbWVyLmg+CisjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworY2xhc3MgTGF5ZXJXZWJLaXRUaHJlYWQ7Cit9OworCituYW1lc3BhY2UgQmxhY2tC
ZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgV2ViUGFnZVByaXZhdGU7CisKKy8v
IFRoaXMgY2xhc3MgbWF5IG9ubHkgYmUgdXNlZCBvbiB0aGUgY29tcG9zaXRpbmcgdGhyZWFkCitj
bGFzcyBXZWJQYWdlQ29tcG9zaXRvciB7CitwdWJsaWM6CisgICAgV2ViUGFnZUNvbXBvc2l0b3Io
V2ViUGFnZVByaXZhdGUqKTsKKyAgICB+V2ViUGFnZUNvbXBvc2l0b3IoKTsKKworICAgIGJvb2wg
aGFyZHdhcmVDb21wb3NpdGluZygpIGNvbnN0OworCisgICAgdm9pZCBzZXRSb290TGF5ZXIoV2Vi
Q29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZCopOworCisgICAgdm9pZCBzZXRDb21wb3NpdGlu
Z09udG9NYWluV2luZG93KGJvb2wpOworCisgICAgdm9pZCBjb21taXQoV2ViQ29yZTo6TGF5ZXJX
ZWJLaXRUaHJlYWQqIHJvb3RMYXllclByb3h5KTsKKworICAgIGJvb2wgZHJhd0xheWVycyhjb25z
dCBXZWJDb3JlOjpJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIGNv
bnRlbnRzKTsKKworICAgIFdlYkNvcmU6OkludFJlY3QgbGF5b3V0UmVjdEZvckNvbXBvc2l0aW5n
KCkgY29uc3QgeyByZXR1cm4gbV9sYXlvdXRSZWN0Rm9yQ29tcG9zaXRpbmc7IH0KKyAgICB2b2lk
IHNldExheW91dFJlY3RGb3JDb21wb3NpdGluZyhjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0
KSB7IG1fbGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nID0gcmVjdDsgfQorCisgICAgV2ViQ29yZTo6
SW50U2l6ZSBjb250ZW50c1NpemVGb3JDb21wb3NpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fY29u
dGVudHNTaXplRm9yQ29tcG9zaXRpbmc7IH0KKyAgICB2b2lkIHNldENvbnRlbnRzU2l6ZUZvckNv
bXBvc2l0aW5nKGNvbnN0IFdlYkNvcmU6OkludFNpemUmIHNpemUpIHsgbV9jb250ZW50c1NpemVG
b3JDb21wb3NpdGluZyA9IHNpemU7IH0KKworICAgIFdlYkNvcmU6OkxheWVyUmVuZGVyaW5nUmVz
dWx0cyBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0Q29tcG9z
aXRpbmdSZXN1bHRzOyB9CisgICAgdm9pZCBzZXRMYXN0Q29tcG9zaXRpbmdSZXN1bHRzKGNvbnN0
IFdlYkNvcmU6OkxheWVyUmVuZGVyaW5nUmVzdWx0cyYgcmVzdWx0cykgeyBtX2xhc3RDb21wb3Np
dGluZ1Jlc3VsdHMgPSByZXN1bHRzOyB9CisKKyAgICB2b2lkIHJlbGVhc2VMYXllclJlc291cmNl
cygpOworCitwcml2YXRlOgorICAgIHZvaWQgYmxpdFRpbWVyRmlyZWQoKTsKKworICAgIFdlYlBh
Z2VQcml2YXRlKiBtX3dlYlBhZ2U7CisgICAgT3duUHRyPFdlYkNvcmU6OkxheWVyUmVuZGVyZXI+
IG1fbGF5ZXJSZW5kZXJlcjsKKyAgICBSZWZQdHI8V2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZD4gbV9yb290TGF5ZXI7CisgICAgV2ViQ29yZTo6SW50UmVjdCBtX2xheW91dFJlY3RGb3JD
b21wb3NpdGluZzsKKyAgICBXZWJDb3JlOjpJbnRTaXplIG1fY29udGVudHNTaXplRm9yQ29tcG9z
aXRpbmc7CisgICAgV2ViQ29yZTo6TGF5ZXJSZW5kZXJpbmdSZXN1bHRzIG1fbGFzdENvbXBvc2l0
aW5nUmVzdWx0czsKKyAgICBpbnQgbV9nZW5lcmF0aW9uOworICAgIGludCBtX2NvbXBvc2l0ZWRH
ZW5lcmF0aW9uOworICAgIFdlYkNvcmU6OkludFJlY3QgbV9jb21wb3NpdGVkRHN0UmVjdDsKKyAg
ICBXZWJDb3JlOjpGbG9hdFJlY3QgbV9jb21wb3NpdGVkQ29udGVudHNSZWN0OworICAgIGJvb2wg
bV9jb21wb3NpdGluZ09udG9NYWluV2luZG93OworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpU
aW1lcjxXZWJQYWdlQ29tcG9zaXRvcj4gbV9ibGl0VGltZXI7CisgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OlRpbWVyQ2xpZW50KiBtX3RpbWVyQ2xpZW50OworfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0Cit9IC8vIG5hbWVzcGFjZSBCbGFja0JlcnJ5CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZiAvLyBXZWJQYWdlQ29tcG9zaXRvcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126376</attachid>
            <date>2012-02-09 14:43:02 -0800</date>
            <delta_ts>2012-02-09 18:36:17 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78278-20120209174532.patch</filename>
            <type>text/plain</type>
            <size>17389</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MjYyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDY3OGI4NDBmNTk3MjQxYmMy
MDNjZTYyZGZkMWZmY2VmY2YwZWJlZDkuLmI4YjE5MzI0N2M0NmVkNWY0NzM2MmQ0MjI1ODU1M2Zi
NDBmYmIxNjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTItMDItMDkgIFJvYiBCdWlz
ICA8cmJ1aXNAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0gZ3JhcGhp
Y3MgaGVscGVyIGNsYXNzZXMgaW4gV2ViS2l0U3VwcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgyNzgKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBubyBuZXcgdGVzdHMu
CisKKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuaDog
QWRkZWQuCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1RpbGVJbmRleC5oOiBB
ZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4SGFzaC5o
OiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgSmFja3kgSmlhbmcgIDx6aGFqaWFuZ0ByaW0uY29tPgog
CiAgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBCbGFja0JlcnJ5IFdlYkNvcmVTdXBwb3J0
IEZyYW1lTmV0d29ya2luZ0NvbnRleHRCbGFja0JlcnJ5IGFuZCBJY29uRGF0YWJhc2VDbGllbnRC
bGFja0JlcnJ5IGNsYXNzZXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9X
ZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmNwcCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9X
ZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iNjI2ZjZlOTM1ZDNlMWQ3
M2U4MDEwNWI4MTQ0ZDNkZTI0YTJjYzdjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuY3BwCkBAIC0wLDAgKzEsMjI3
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3Jp
dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdXJmYWNlUG9vbC5oIgorCisjaWYgVVNF
KE9QRU5WRykKKyNpbmNsdWRlICJFR0xEaXNwbGF5T3BlblZHLmgiCisjaW5jbHVkZSAiRUdMVXRp
bHMuaCIKKyNpbmNsdWRlICJTdXJmYWNlT3BlblZHLmgiCisjZWxpZiBVU0UoU0tJQSkKKyNpbmNs
dWRlICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCisjZW5kaWYKKworI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2Uu
aCIKKyNlbmRpZgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTG9nLmg+CisjaW5jbHVk
ZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWlzYy5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9y
bVNjcmVlbi5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVNldHRpbmdzLmg+CisKKyNk
ZWZpbmUgU0hBUkVEX1BJWE1BUF9HUk9VUCAid2Via2l0X2JhY2tpbmdzdG9yZV9ncm91cCIKKwor
bmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CisKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElOR19TVVJGQUNFCitzdGF0
aWMgUGFzc1JlZlB0cjxCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2U+IGNyZWF0ZUNvbXBv
c2l0aW5nU3VyZmFjZSgpCit7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFNpemUgc2Ny
ZWVuU2l6ZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpzaXplKCk7
CisgICAgcmV0dXJuIEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZTo6Y3JlYXRlKHNjcmVl
blNpemUsIGZhbHNlIC8qZG91YmxlQnVmZmVyZWQqLyk7Cit9CisjZW5kaWYKKworU3VyZmFjZVBv
b2wqIFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpCit7CisgICAgc3RhdGljIFN1cmZh
Y2VQb29sKiBzX2luc3RhbmNlID0gMDsKKyAgICBpZiAoIXNfaW5zdGFuY2UpCisgICAgICAgIHNf
aW5zdGFuY2UgPSBuZXcgU3VyZmFjZVBvb2w7CisgICAgcmV0dXJuIHNfaW5zdGFuY2U7Cit9CisK
K1N1cmZhY2VQb29sOjpTdXJmYWNlUG9vbCgpCisgICAgOiBtX3Zpc2libGVUaWxlQnVmZmVyKDAp
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICwgbV9jb21wb3NpdGluZ1N1
cmZhY2UoMCkKKyNlbmRpZgorICAgICwgbV90aWxlUmVuZGVyaW5nU3VyZmFjZSgwKQorICAgICwg
bV9iYWNrQnVmZmVyKDApCisgICAgLCBtX2luaXRpYWxpemVkKGZhbHNlKQorICAgICwgbV9idWZm
ZXJzU3VzcGVuZGVkKGZhbHNlKQoreworfQorCit2b2lkIFN1cmZhY2VQb29sOjppbml0aWFsaXpl
KGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRTaXplJiB0aWxlU2l6ZSkKK3sKKyAgICBp
ZiAobV9pbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworICAgIG1faW5pdGlhbGl6ZWQgPSB0
cnVlOworCisgICAgY29uc3QgdW5zaWduZWQgbnVtYmVyT2ZUaWxlcyA9IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpTZXR0aW5nczo6Z2V0KCktPm51bWJlck9mQmFja2luZ1N0b3JlVGlsZXMoKTsKKyAg
ICBjb25zdCB1bnNpZ25lZCBtYXhOdW1iZXJPZlRpbGVzID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06
OlNldHRpbmdzOjpnZXQoKS0+bWF4aW11bU51bWJlck9mQmFja2luZ1N0b3JlVGlsZXNBY3Jvc3NQ
cm9jZXNzZXMoKTsKKworICAgIGlmIChudW1iZXJPZlRpbGVzKSB7IC8vIE9ubHkgYWxsb2NhdGUg
aWYgd2UgYWN0dWFsbHkgdXNlIGEgYmFja2luZ3N0b3JlLgorICAgICAgICB1bnNpZ25lZCBieXRl
TGltaXQgPSAobWF4TnVtYmVyT2ZUaWxlcyAvKnBvb2wqLyArIDIgLyp2aXNpYmxlIHRpbGUgYnVm
ZmVyLCBiYWNrYnVmZmVyKi8pICogdGlsZVNpemUud2lkdGgoKSAqIHRpbGVTaXplLmhlaWdodCgp
ICogNDsKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpjcmVhdGVQaXhtYXBHcm91cChTSEFSRURfUElYTUFQX0dST1VQLCBieXRlTGltaXQpOwor
ICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
Ojpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsV2FybiwKKyAgICAgICAgICAgICAg
ICAiU2hhcmVkIGJ1ZmZlciBwb29sIGNvdWxkIG5vdCBiZSBzZXQgdXAsIHVzaW5nIHJlZ3VsYXIg
bWVtb3J5IGFsbG9jYXRpb24gaW5zdGVhZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFVT
RShPUEVOVkcpCisgICAgbV90aWxlUmVuZGVyaW5nU3VyZmFjZSA9IGNyZWF0ZVBsYXRmb3JtR3Jh
cGhpY3NDb250ZXh0KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6ZHJhd2luZ1N1cmZh
Y2UoKSk7CisjZWxpZiBVU0UoU0tJQSkKKyAgICBtX3RpbGVSZW5kZXJpbmdTdXJmYWNlID0gQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpkcmF3aW5nU3VyZmFjZSgpOworI2VuZGlmCisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElOR19T
VVJGQUNFCisgICAgbV9jb21wb3NpdGluZ1N1cmZhY2UgPSBjcmVhdGVDb21wb3NpdGluZ1N1cmZh
Y2UoKTsKKyNlbmRpZgorCisgICAgaWYgKCFudW1iZXJPZlRpbGVzKQorICAgICAgICByZXR1cm47
IC8vIHdlIG9ubHkgdXNlIGRpcmVjdCByZW5kZXJpbmcgd2hlbiAwIHRpbGVzIGFyZSBzcGVjaWZp
ZWQuCisKKyAgICAvLyBDcmVhdGUgdGhlIHNoYXJlZCBiYWNrYnVmZmVyLgorICAgIG1fYmFja0J1
ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQ+KG5ldyBUaWxlQnVmZmVyKHRpbGVTaXpl
KSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWJlck9mVGlsZXM7ICsraSkKKyAg
ICAgICAgbV90aWxlUG9vbC5hcHBlbmQoQmFja2luZ1N0b3JlVGlsZTo6Y3JlYXRlKHRpbGVTaXpl
LCBCYWNraW5nU3RvcmVUaWxlOjpEb3VibGVCdWZmZXJlZCkpOworfQorCitQbGF0Zm9ybUdyYXBo
aWNzQ29udGV4dCogU3VyZmFjZVBvb2w6OmNyZWF0ZVBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6RHJhd2FibGUqIGRyYXdhYmxlKSBjb25zdAor
eworI2lmIFVTRShPUEVOVkcpCisgICAgU3VyZmFjZU9wZW5WRyogcGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQgPSBTdXJmYWNlT3BlblZHOjphZG9wdEV4aXN0aW5nU3VyZmFjZSgKKyAgICAgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjplZ2xEaXNwbGF5KCksIGRyYXdhYmxlLT5zdXJm
YWNlKCksCisgICAgICAgIFN1cmZhY2VPcGVuVkc6OkRvbnRUYWtlU3VyZmFjZU93bmVyc2hpcCwg
ZHJhd2FibGUtPnN1cmZhY2VUeXBlKCkpOworCisgICAgcGxhdGZvcm1HcmFwaGljc0NvbnRleHQt
PnNldEFwcGx5RmxpcFRyYW5zZm9ybWF0aW9uT25QYWludGVyQ3JlYXRpb24oZHJhd2FibGUtPmlz
RmxpcFRyYW5zZm9ybWF0aW9uUmVxdWlyZWQoKSk7CisjZWxpZiBVU0UoU0tJQSkKKyAgICBXZWJD
b3JlOjpQbGF0Zm9ybUNvbnRleHRTa2lhKiBwbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCA9IG5ldyBX
ZWJDb3JlOjpQbGF0Zm9ybUNvbnRleHRTa2lhKGRyYXdhYmxlKTsKKyNlbmRpZgorICAgIHJldHVy
biBwbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDsKK30KKworUGxhdGZvcm1HcmFwaGljc0NvbnRleHQq
IFN1cmZhY2VQb29sOjpsb2NrVGlsZVJlbmRlcmluZ1N1cmZhY2UoKSBjb25zdAoreworI2lmIFVT
RShPUEVOVkcpCisgICAgcmV0dXJuIG1fdGlsZVJlbmRlcmluZ1N1cmZhY2U7CisjZWxpZiBVU0Uo
U0tJQSkKKyAgICBpZiAoIW1fdGlsZVJlbmRlcmluZ1N1cmZhY2UpCisgICAgICAgIHJldHVybiAw
OworICAgIHJldHVybiBjcmVhdGVQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dChCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OmxvY2tCdWZmZXJEcmF3YWJsZShtX3RpbGVSZW5kZXJpbmdTdXJm
YWNlKSk7CisjZW5kaWYKK30KKwordm9pZCBTdXJmYWNlUG9vbDo6cmVsZWFzZVRpbGVSZW5kZXJp
bmdTdXJmYWNlKFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0KSBjb25zdAoreworI2lm
IFVTRShTS0lBKQorICAgIGlmICghbV90aWxlUmVuZGVyaW5nU3VyZmFjZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgZGVsZXRlIGNvbnRleHQ7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpyZWxlYXNlQnVmZmVyRHJhd2FibGUobV90aWxlUmVuZGVyaW5nU3VyZmFjZSk7Cisj
ZW5kaWYKK30KKwordm9pZCBTdXJmYWNlUG9vbDo6aW5pdGlhbGl6ZVZpc2libGVUaWxlQnVmZmVy
KGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRTaXplJiB2aXNpYmxlU2l6ZSkKK3sKKyAg
ICBpZiAoIW1fdmlzaWJsZVRpbGVCdWZmZXIgfHwgbV92aXNpYmxlVGlsZUJ1ZmZlci0+c2l6ZSgp
ICE9IHZpc2libGVTaXplKSB7CisgICAgICAgIGRlbGV0ZSBtX3Zpc2libGVUaWxlQnVmZmVyOwor
ICAgICAgICBtX3Zpc2libGVUaWxlQnVmZmVyID0gQmFja2luZ1N0b3JlVGlsZTo6Y3JlYXRlKHZp
c2libGVTaXplLCBCYWNraW5nU3RvcmVUaWxlOjpTaW5nbGVCdWZmZXJlZCk7CisgICAgfQorfQor
CitUaWxlQnVmZmVyKiBTdXJmYWNlUG9vbDo6YmFja0J1ZmZlcigpIGNvbnN0Cit7CisgICAgQVNT
RVJUKG1fYmFja0J1ZmZlcik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VGlsZUJ1ZmZl
cio+KG1fYmFja0J1ZmZlcik7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CitCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2UqIFN1cmZhY2VQb29sOjpjb21wb3NpdGlu
Z1N1cmZhY2UoKSBjb25zdAoreworICAgIHJldHVybiBtX2NvbXBvc2l0aW5nU3VyZmFjZS5nZXQo
KTsKK30KKyNlbmRpZgorCit2b2lkIFN1cmZhY2VQb29sOjpub3RpZnlTY3JlZW5Sb3RhdGVkKCkK
K3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElO
R19TVVJGQUNFCisgICAgLy8gUmVjcmVhdGUgY29tcG9zaXRpbmcgc3VyZmFjZSBhdCBuZXcgc2Ny
ZWVuIHJlc29sdXRpb24uCisgICAgbV9jb21wb3NpdGluZ1N1cmZhY2UgPSBjcmVhdGVDb21wb3Np
dGluZ1N1cmZhY2UoKTsKKyNlbmRpZgorfQorCitzdGQ6OnN0cmluZyBTdXJmYWNlUG9vbDo6c2hh
cmVkUGl4bWFwR3JvdXAoKSBjb25zdAoreworICAgIHJldHVybiBTSEFSRURfUElYTUFQX0dST1VQ
OworfQorCit2b2lkIFN1cmZhY2VQb29sOjpjcmVhdGVCdWZmZXJzKCkKK3sKKyAgICBpZiAoIW1f
aW5pdGlhbGl6ZWQgfHwgbV90aWxlUG9vbC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIC8vIENyZWF0ZSB0aGUgdGlsZSBwb29sLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bV90aWxlUG9vbC5zaXplKCk7ICsraSkKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpjcmVhdGVQaXhtYXBCdWZmZXIobV90aWxlUG9vbFtpXS0+ZnJvbnRCdWZmZXIoKS0+
bmF0aXZlQnVmZmVyKCkpOworCisgICAgLy8gQ3JlYXRlIHRoZSBtX3Zpc2libGVUaWxlQnVmZmVy
LgorICAgIGlmIChtX3Zpc2libGVUaWxlQnVmZmVyKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6R3JhcGhpY3M6OmNyZWF0ZVBpeG1hcEJ1ZmZlcihtX3Zpc2libGVUaWxlQnVmZmVyLT5m
cm9udEJ1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSk7CisKKyAgICAvLyBDcmVhdGUgdGhlIGJhY2ti
dWZmZXIuCisgICAgaWYgKGJhY2tCdWZmZXIoKSkKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpjcmVhdGVQaXhtYXBCdWZmZXIoYmFja0J1ZmZlcigpLT5uYXRpdmVCdWZm
ZXIoKSk7CisKKyAgICBtX2J1ZmZlcnNTdXNwZW5kZWQgPSBmYWxzZTsKK30KKwordm9pZCBTdXJm
YWNlUG9vbDo6cmVsZWFzZUJ1ZmZlcnMoKQoreworICAgIGlmICghbV9pbml0aWFsaXplZCB8fCBt
X3RpbGVQb29sLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9idWZmZXJzU3Vz
cGVuZGVkID0gdHJ1ZTsKKworICAgIC8vIFJlbGVhc2UgdGhlIHRpbGUgcG9vbC4KKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG1fdGlsZVBvb2wuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbV90
aWxlUG9vbFtpXS0+ZnJvbnRCdWZmZXIoKS0+Y2xlYXJSZW5kZXJlZFJlZ2lvbigpOworICAgICAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmRlc3Ryb3lQaXhtYXBCdWZmZXIobV90
aWxlUG9vbFtpXS0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCkpOworICAgIH0KKworICAg
IC8vIFJlbGVhc2UgdGhlIG1fdmlzaWJsZVRpbGVCdWZmZXIuCisgICAgaWYgKG1fdmlzaWJsZVRp
bGVCdWZmZXIpIHsKKyAgICAgICAgbV92aXNpYmxlVGlsZUJ1ZmZlci0+ZnJvbnRCdWZmZXIoKS0+
Y2xlYXJSZW5kZXJlZFJlZ2lvbigpOworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3Jh
cGhpY3M6OmRlc3Ryb3lQaXhtYXBCdWZmZXIobV92aXNpYmxlVGlsZUJ1ZmZlci0+ZnJvbnRCdWZm
ZXIoKS0+bmF0aXZlQnVmZmVyKCkpOworICAgIH0KKworICAgIC8vIFJlbGVhc2UgdGhlIGJhY2ti
dWZmZXIuCisgICAgaWYgKGJhY2tCdWZmZXIoKSkgeworICAgICAgICBiYWNrQnVmZmVyKCktPmNs
ZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpkZXN0cm95UGl4bWFwQnVmZmVyKGJhY2tCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCkpOwor
ICAgIH0KK30KKworfQorfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dl
YktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJL
aXRTdXBwb3J0L1N1cmZhY2VQb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTA2ODNmNjVhNTc2OWU5NDYwNWIw
N2RmODFkYjIyOTJhM2ZhMzU2YwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxh
Y2tiZXJyeS9XZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRl
ZiBTdXJmYWNlUG9vbF9oCisjZGVmaW5lIFN1cmZhY2VQb29sX2gKKworI2luY2x1ZGUgIkJhY2tp
bmdTdG9yZVRpbGUuaCIKKworI2lmIFVTRShPUEVOVkcpCisjaW5jbHVkZSAiU3VyZmFjZU9wZW5W
Ry5oIgorI2VsaWYgVVNFKFNLSUEpCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgor
I2VuZGlmCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HcmFwaGljcy5oPgorI2luY2x1
ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CisKKyNkZWZpbmUgRU5BQkxFX0NPTVBPU0lUSU5HX1NVUkZBQ0UgMQorCituYW1lc3BhY2Ug
QmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgQmFja2luZ1N0b3JlQ29t
cG9zaXRpbmdTdXJmYWNlOworCitjbGFzcyBTdXJmYWNlUG9vbCB7CitwdWJsaWM6CisgICAgc3Rh
dGljIFN1cmZhY2VQb29sKiBnbG9iYWxTdXJmYWNlUG9vbCgpOworCisgICAgdm9pZCBpbml0aWFs
aXplKGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRTaXplJik7CisKKyAgICBpbnQgaXNB
Y3RpdmUoKSBjb25zdCB7IHJldHVybiAhbV90aWxlUG9vbC5pc0VtcHR5KCkgJiYgIW1fYnVmZmVy
c1N1c3BlbmRlZDsgfQorICAgIGludCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV90aWxlUG9v
bC5pc0VtcHR5KCk7IH0KKyAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGlsZVBvb2wu
c2l6ZSgpOyB9CisKKyAgICB0eXBlZGVmIFdURjo6VmVjdG9yPEJhY2tpbmdTdG9yZVRpbGUqPiBU
aWxlTGlzdDsKKyAgICBjb25zdCBUaWxlTGlzdCB0aWxlTGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1f
dGlsZVBvb2w7IH0KKworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjcmVhdGVQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkRyYXdhYmxl
KikgY29uc3Q7CisgICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGxvY2tUaWxlUmVuZGVyaW5n
U3VyZmFjZSgpIGNvbnN0OworICAgIHZvaWQgcmVsZWFzZVRpbGVSZW5kZXJpbmdTdXJmYWNlKFBs
YXRmb3JtR3JhcGhpY3NDb250ZXh0KikgY29uc3Q7CisgICAgQmFja2luZ1N0b3JlVGlsZSogdmlz
aWJsZVRpbGVCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX3Zpc2libGVUaWxlQnVmZmVyOyB9CisK
KyAgICB2b2lkIGluaXRpYWxpemVWaXNpYmxlVGlsZUJ1ZmZlcihjb25zdCBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6SW50U2l6ZSYpOworCisgICAgLy8gVGhpcyBpcyBhIHNoYXJlZCBiYWNrIGJ1ZmZl
ciB0aGF0IGlzIHVzZWQgYnkgYWxsIHRoZSB0aWxlcyBzaW5jZQorICAgIC8vIG9ubHkgb25lIHRp
bGUgd2lsbCBiZSByZW5kZXJpbmcgaXQgYXQgYSB0aW1lIGFuZCB3ZSBpbnZhbGlkYXRlCisgICAg
Ly8gdGhlIHdob2xlIHRpbGUgZXZlcnkgdGltZSB3ZSByZW5kZXIgYnkgY29weWluZyBmcm9tIHRo
ZSBmcm9udAorICAgIC8vIGJ1ZmZlciB0aG9zZSBwb3J0aW9ucyB0aGF0IHdlIGRvbid0IHJlbmRl
ci4gVGhpcyBhbGxvd3MgdXMgdG8KKyAgICAvLyBoYXZlIE4rMSB0aWxlYnVmZmVycyByYXRoZXIg
dGhhbiBOKjIgZm9yIG91ciBkb3VibGUgYnVmZmVyZWQKKyAgICAvLyBiYWNraW5nc3RvcmUuCisg
ICAgVGlsZUJ1ZmZlciogYmFja0J1ZmZlcigpIGNvbnN0OworCisgICAgQmFja2luZ1N0b3JlQ29t
cG9zaXRpbmdTdXJmYWNlKiBjb21wb3NpdGluZ1N1cmZhY2UoKSBjb25zdDsKKworICAgIHZvaWQg
bm90aWZ5U2NyZWVuUm90YXRlZCgpOworCisgICAgc3RkOjpzdHJpbmcgc2hhcmVkUGl4bWFwR3Jv
dXAoKSBjb25zdDsKKworICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcnMoKTsKKyAgICB2b2lkIGNyZWF0
ZUJ1ZmZlcnMoKTsKKworcHJpdmF0ZToKKyAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBzbyBCYWNr
aW5nU3RvcmVUaWxlIGNhbiBhdG9taWNhbGx5IHN3YXAgYnVmZmVycyB3aXRoIG1fYmFja0J1ZmZl
ci4KKyAgICBmcmllbmQgY2xhc3MgQmFja2luZ1N0b3JlVGlsZTsKKworICAgIFN1cmZhY2VQb29s
KCk7CisKKyAgICBUaWxlTGlzdCBtX3RpbGVQb29sOworICAgIEJhY2tpbmdTdG9yZVRpbGUqIG1f
dmlzaWJsZVRpbGVCdWZmZXI7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IFJlZlB0cjxCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2U+IG1fY29tcG9zaXRpbmdTdXJm
YWNlOworI2VuZGlmCisjaWYgVVNFKE9QRU5WRykKKyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4
dCogbV90aWxlUmVuZGVyaW5nU3VyZmFjZTsKKyNlbGlmIFVTRShTS0lBKQorICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBtX3RpbGVSZW5kZXJpbmdTdXJmYWNlOwor
I2VuZGlmCisgICAgdW5zaWduZWQgbV9iYWNrQnVmZmVyOworICAgIGJvb2wgbV9pbml0aWFsaXpl
ZDsgLy8gU3VyZmFjZVBvb2wgaGFzIGJlZW4gc2V0IHVwLCB3aXRoIG9yIHdpdGhvdXQgYnVmZmVy
cy4KKyAgICBib29sIG1fYnVmZmVyc1N1c3BlbmRlZDsgLy8gQnVmZmVyIG9iamVjdHMgZXhpc3Qs
IGJ1dCBwaXhlbCBtZW1vcnkgaGFzIGJlZW4gZnJlZWQuCit9OworfQorfQorCisjZW5kaWYgLy8g
U3VyZmFjZVBvb2xfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktp
dFN1cHBvcnQvVGlsZUluZGV4LmggYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3Vw
cG9ydC9UaWxlSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zMTQ5ODQ3YzkxZjFlMTZmMTgxZDhhNWQxN2Y0
NGUzMzJjNzRkNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5
L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4LmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFRpbGVJbmRl
eF9oCisjZGVmaW5lIFRpbGVJbmRleF9oCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFj
ZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBUaWxlSW5kZXggewor
cHVibGljOgorICAgIFRpbGVJbmRleCgpCisgICAgICAgIDogbV9pKHN0ZDo6bnVtZXJpY19saW1p
dHM8dW5zaWduZWQgaW50Pjo6bWF4KCkpCisgICAgICAgICwgbV9qKHN0ZDo6bnVtZXJpY19saW1p
dHM8dW5zaWduZWQgaW50Pjo6bWF4KCkpIHsgfQorICAgIFRpbGVJbmRleCh1bnNpZ25lZCBpbnQg
aSwgdW5zaWduZWQgaW50IGopCisgICAgICAgIDogbV9pKGkpCisgICAgICAgICwgbV9qKGopIHsg
fQorICAgIH5UaWxlSW5kZXgoKSB7IH0KKworICAgIHVuc2lnbmVkIGludCBpKCkgY29uc3QgeyBy
ZXR1cm4gbV9pOyB9CisgICAgdW5zaWduZWQgaW50IGooKSBjb25zdCB7IHJldHVybiBtX2o7IH0K
KyAgICB2b2lkIHNldEluZGV4KHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgaikKKyAgICB7
CisgICAgICAgIG1faSA9IGk7CisgICAgICAgIG1faiA9IGo7CisgICAgfQorCitwcml2YXRlOgor
ICAgIGJvb2wgbV9pc1ZhbGlkOworICAgIHVuc2lnbmVkIGludCBtX2k7CisgICAgdW5zaWduZWQg
aW50IG1fajsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQmxhY2tCZXJyeTo6
V2ViS2l0OjpUaWxlSW5kZXgmIGEsIGNvbnN0IEJsYWNrQmVycnk6OldlYktpdDo6VGlsZUluZGV4
JiBiKQoreworICAgIHJldHVybiBhLmkoKSA9PSBiLmkoKSAmJiBhLmooKSA9PSBiLmooKTsKK30K
KworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCbGFja0JlcnJ5OjpXZWJLaXQ6OlRpbGVJ
bmRleCYgYSwgY29uc3QgQmxhY2tCZXJyeTo6V2ViS2l0OjpUaWxlSW5kZXgmIGIpCit7CisgICAg
cmV0dXJuIGEuaSgpICE9IGIuaSgpIHx8IGEuaigpICE9IGIuaigpOworfQorfQorfQorCisjZW5k
aWYgLy8gVGlsZUluZGV4X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9X
ZWJLaXRTdXBwb3J0L1RpbGVJbmRleEhhc2guaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9X
ZWJLaXRTdXBwb3J0L1RpbGVJbmRleEhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wZDQ2MzNiNzViZjk1YmM1
MGI0YmM3MDgxMGNkM2I1ODdkZWFmYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4SGFzaC5oCkBAIC0wLDAgKzEsNTYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
Ki8KKworI2lmbmRlZiBUaWxlSW5kZXhIYXNoX2gKKyNkZWZpbmUgVGlsZUluZGV4SGFzaF9oCisK
KyNpbmNsdWRlICJUaWxlSW5kZXguaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8d3Rm
L0hhc2hNYXAuaD4KKwordXNpbmcgQmxhY2tCZXJyeTo6V2ViS2l0OjpUaWxlSW5kZXg7CisKK25h
bWVzcGFjZSBXVEYgeworCit0ZW1wbGF0ZTw+IHN0cnVjdCBJbnRIYXNoPFRpbGVJbmRleD4gewor
ICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IFRpbGVJbmRleCYga2V5KSB7IHJldHVybiBp
bnRIYXNoKChzdGF0aWNfY2FzdDx1aW50NjRfdD4oa2V5LmkoKSkgPDwgMzIgfCBrZXkuaigpKSk7
IH0KKyAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBUaWxlSW5kZXgmIGEsIGNvbnN0IFRpbGVJ
bmRleCYgYikgeyByZXR1cm4gYSA9PSBiOyB9CisgICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRv
Q29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOworfTsKK3RlbXBsYXRlPD4gc3RydWN0IERl
ZmF1bHRIYXNoPFRpbGVJbmRleD4geworICAgIHR5cGVkZWYgSW50SGFzaDxUaWxlSW5kZXg+IEhh
c2g7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBIYXNoVHJhaXRzPFRpbGVJbmRleD4gOiBHZW5l
cmljSGFzaFRyYWl0czxUaWxlSW5kZXg+IHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBlbXB0eVZh
bHVlSXNaZXJvID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVjdGlv
biA9IGZhbHNlOworICAgIHN0YXRpYyBUaWxlSW5kZXggZW1wdHlWYWx1ZSgpIHsgcmV0dXJuIFRp
bGVJbmRleCgpOyB9CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0RGVsZXRlZFZhbHVlKFRpbGVJ
bmRleCYgc2xvdCkKKyAgICB7CisgICAgICAgIG5ldyAoJnNsb3QpIFRpbGVJbmRleChzdGQ6Om51
bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD46Om1heCgpIC0gMSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCkgLSAx
KTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgaXNEZWxldGVkVmFsdWUoY29uc3QgVGlsZUluZGV4
JiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZS5pKCkgPT0gKHN0ZDo6bnVtZXJp
Y19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCkgLSAxKQorICAgICAgICAgICAgICAgJiYgdmFs
dWUuaigpID09IChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD46Om1heCgpIC0gMSk7
CisgICAgfQorfTsKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gVGlsZUluZGV4SGFz
aF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126425</attachid>
            <date>2012-02-09 18:36:53 -0800</date>
            <delta_ts>2012-02-10 07:20:29 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78278-20120209213641.patch</filename>
            <type>text/plain</type>
            <size>16609</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MzMyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IGM0ODM3ODE1N2U4MGJlMDQ1
NGQ3NmY1Mjg2MzJjNjliYzdmMmRhYTcuLjIwODNkOWIwMTY3ZTdmNTkwMjllODY5Yjg2NWQzMzli
NTcwY2VkMDcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMTkgQEAKIDIwMTItMDItMDkgIFJvYiBCdWlz
ICA8cmJ1aXNAcmltLmNvbT4KIAorICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0gZ3JhcGhp
Y3MgaGVscGVyIGNsYXNzZXMgaW4gV2ViS2l0U3VwcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgyNzgKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBubyBuZXcgdGVzdHMu
CisKKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuaDog
QWRkZWQuCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1RpbGVJbmRleC5oOiBB
ZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4SGFzaC5o
OiBBZGRlZC4KKworMjAxMi0wMi0wOSAgUm9iIEJ1aXMgIDxyYnVpc0ByaW0uY29tPgorCiAgICAg
ICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBCbGFja0JlcnJ5IFdlYktpdFN1cHBvcnQgV2ViUGFn
ZUNvbXBvc2l0b3IgY2xhc3MKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTc4Mjc2CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9X
ZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmNwcCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9X
ZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hZWYyYjNjZmEzZDAwMWJk
ZjUzYWQ4ZmNlMjA2ZDNiOTAwNWRmZGZiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuY3BwCkBAIC0wLDAgKzEsMjEz
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3Jp
dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdXJmYWNlUG9vbC5oIgorCisjaWYgVVNF
KFNLSUEpCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI2VuZGlmCisKKyNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlQ29tcG9z
aXRpbmdTdXJmYWNlLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxv
Zy5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybU1pc2MuaD4KKyNpbmNsdWRlIDxCbGFj
a0JlcnJ5UGxhdGZvcm1TY3JlZW4uaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TZXR0
aW5ncy5oPgorCisjZGVmaW5lIFNIQVJFRF9QSVhNQVBfR1JPVVAgIndlYmtpdF9iYWNraW5nc3Rv
cmVfZ3JvdXAiCisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgewor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKSAmJiBFTkFCTEVfQ09NUE9TSVRJTkdf
U1VSRkFDRQorc3RhdGljIFBhc3NSZWZQdHI8QmFja2luZ1N0b3JlQ29tcG9zaXRpbmdTdXJmYWNl
PiBjcmVhdGVDb21wb3NpdGluZ1N1cmZhY2UoKQoreworICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpJbnRTaXplIHNjcmVlblNpemUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlNj
cmVlbjo6c2l6ZSgpOworICAgIHJldHVybiBCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2U6
OmNyZWF0ZShzY3JlZW5TaXplLCBmYWxzZSAvKmRvdWJsZUJ1ZmZlcmVkKi8pOworfQorI2VuZGlm
CisKK1N1cmZhY2VQb29sKiBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKQoreworICAg
IHN0YXRpYyBTdXJmYWNlUG9vbCogc19pbnN0YW5jZSA9IDA7CisgICAgaWYgKCFzX2luc3RhbmNl
KQorICAgICAgICBzX2luc3RhbmNlID0gbmV3IFN1cmZhY2VQb29sOworICAgIHJldHVybiBzX2lu
c3RhbmNlOworfQorCitTdXJmYWNlUG9vbDo6U3VyZmFjZVBvb2woKQorICAgIDogbV92aXNpYmxl
VGlsZUJ1ZmZlcigwKQorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAsIG1f
Y29tcG9zaXRpbmdTdXJmYWNlKDApCisjZW5kaWYKKyAgICAsIG1fdGlsZVJlbmRlcmluZ1N1cmZh
Y2UoMCkKKyAgICAsIG1fYmFja0J1ZmZlcigwKQorICAgICwgbV9pbml0aWFsaXplZChmYWxzZSkK
KyAgICAsIG1fYnVmZmVyc1N1c3BlbmRlZChmYWxzZSkKK3sKK30KKwordm9pZCBTdXJmYWNlUG9v
bDo6aW5pdGlhbGl6ZShjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50U2l6ZSYgdGlsZVNp
emUpCit7CisgICAgaWYgKG1faW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBtX2lu
aXRpYWxpemVkID0gdHJ1ZTsKKworICAgIGNvbnN0IHVuc2lnbmVkIG51bWJlck9mVGlsZXMgPSBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6U2V0dGluZ3M6OmdldCgpLT5udW1iZXJPZkJhY2tpbmdTdG9y
ZVRpbGVzKCk7CisgICAgY29uc3QgdW5zaWduZWQgbWF4TnVtYmVyT2ZUaWxlcyA9IEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpTZXR0aW5nczo6Z2V0KCktPm1heGltdW1OdW1iZXJPZkJhY2tpbmdTdG9y
ZVRpbGVzQWNyb3NzUHJvY2Vzc2VzKCk7CisKKyAgICBpZiAobnVtYmVyT2ZUaWxlcykgeyAvLyBP
bmx5IGFsbG9jYXRlIGlmIHdlIGFjdHVhbGx5IHVzZSBhIGJhY2tpbmdzdG9yZS4KKyAgICAgICAg
dW5zaWduZWQgYnl0ZUxpbWl0ID0gKG1heE51bWJlck9mVGlsZXMgLypwb29sKi8gKyAyIC8qdmlz
aWJsZSB0aWxlIGJ1ZmZlciwgYmFja2J1ZmZlciovKSAqIHRpbGVTaXplLndpZHRoKCkgKiB0aWxl
U2l6ZS5oZWlnaHQoKSAqIDQ7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6Y3JlYXRlUGl4bWFwR3JvdXAoU0hBUkVEX1BJWE1BUF9HUk9VUCwg
Ynl0ZUxpbWl0KTsKKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sCisg
ICAgICAgICAgICAgICAgIlNoYXJlZCBidWZmZXIgcG9vbCBjb3VsZCBub3QgYmUgc2V0IHVwLCB1
c2luZyByZWd1bGFyIG1lbW9yeSBhbGxvY2F0aW9uIGluc3RlYWQuIik7CisgICAgICAgIH0KKyAg
ICB9CisKKyNpZiBVU0UoU0tJQSkKKyAgICBtX3RpbGVSZW5kZXJpbmdTdXJmYWNlID0gQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpkcmF3aW5nU3VyZmFjZSgpOworI2VuZGlmCisKKyNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElOR19TVVJG
QUNFCisgICAgbV9jb21wb3NpdGluZ1N1cmZhY2UgPSBjcmVhdGVDb21wb3NpdGluZ1N1cmZhY2Uo
KTsKKyNlbmRpZgorCisgICAgaWYgKCFudW1iZXJPZlRpbGVzKQorICAgICAgICByZXR1cm47IC8v
IHdlIG9ubHkgdXNlIGRpcmVjdCByZW5kZXJpbmcgd2hlbiAwIHRpbGVzIGFyZSBzcGVjaWZpZWQu
CisKKyAgICAvLyBDcmVhdGUgdGhlIHNoYXJlZCBiYWNrYnVmZmVyLgorICAgIG1fYmFja0J1ZmZl
ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQ+KG5ldyBUaWxlQnVmZmVyKHRpbGVTaXplKSk7
CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWJlck9mVGlsZXM7ICsraSkKKyAgICAg
ICAgbV90aWxlUG9vbC5hcHBlbmQoQmFja2luZ1N0b3JlVGlsZTo6Y3JlYXRlKHRpbGVTaXplLCBC
YWNraW5nU3RvcmVUaWxlOjpEb3VibGVCdWZmZXJlZCkpOworfQorCitQbGF0Zm9ybUdyYXBoaWNz
Q29udGV4dCogU3VyZmFjZVBvb2w6OmNyZWF0ZVBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6RHJhd2FibGUqIGRyYXdhYmxlKSBjb25zdAorewor
I2lmIFVTRShTS0lBKQorICAgIFdlYkNvcmU6OlBsYXRmb3JtQ29udGV4dFNraWEqIHBsYXRmb3Jt
R3JhcGhpY3NDb250ZXh0ID0gbmV3IFdlYkNvcmU6OlBsYXRmb3JtQ29udGV4dFNraWEoZHJhd2Fi
bGUpOworI2VuZGlmCisgICAgcmV0dXJuIHBsYXRmb3JtR3JhcGhpY3NDb250ZXh0OworfQorCitQ
bGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogU3VyZmFjZVBvb2w6OmxvY2tUaWxlUmVuZGVyaW5nU3Vy
ZmFjZSgpIGNvbnN0Cit7CisjaWYgVVNFKFNLSUEpCisgICAgaWYgKCFtX3RpbGVSZW5kZXJpbmdT
dXJmYWNlKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY3JlYXRlUGxhdGZvcm1HcmFw
aGljc0NvbnRleHQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpsb2NrQnVmZmVyRHJh
d2FibGUobV90aWxlUmVuZGVyaW5nU3VyZmFjZSkpOworI2VuZGlmCit9CisKK3ZvaWQgU3VyZmFj
ZVBvb2w6OnJlbGVhc2VUaWxlUmVuZGVyaW5nU3VyZmFjZShQbGF0Zm9ybUdyYXBoaWNzQ29udGV4
dCogY29udGV4dCkgY29uc3QKK3sKKyNpZiBVU0UoU0tJQSkKKyAgICBpZiAoIW1fdGlsZVJlbmRl
cmluZ1N1cmZhY2UpCisgICAgICAgIHJldHVybjsKKworICAgIGRlbGV0ZSBjb250ZXh0OworICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cmVsZWFzZUJ1ZmZlckRyYXdhYmxlKG1f
dGlsZVJlbmRlcmluZ1N1cmZhY2UpOworI2VuZGlmCit9CisKK3ZvaWQgU3VyZmFjZVBvb2w6Omlu
aXRpYWxpemVWaXNpYmxlVGlsZUJ1ZmZlcihjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50
U2l6ZSYgdmlzaWJsZVNpemUpCit7CisgICAgaWYgKCFtX3Zpc2libGVUaWxlQnVmZmVyIHx8IG1f
dmlzaWJsZVRpbGVCdWZmZXItPnNpemUoKSAhPSB2aXNpYmxlU2l6ZSkgeworICAgICAgICBkZWxl
dGUgbV92aXNpYmxlVGlsZUJ1ZmZlcjsKKyAgICAgICAgbV92aXNpYmxlVGlsZUJ1ZmZlciA9IEJh
Y2tpbmdTdG9yZVRpbGU6OmNyZWF0ZSh2aXNpYmxlU2l6ZSwgQmFja2luZ1N0b3JlVGlsZTo6U2lu
Z2xlQnVmZmVyZWQpOworICAgIH0KK30KKworVGlsZUJ1ZmZlciogU3VyZmFjZVBvb2w6OmJhY2tC
dWZmZXIoKSBjb25zdAoreworICAgIEFTU0VSVChtX2JhY2tCdWZmZXIpOworICAgIHJldHVybiBy
ZWludGVycHJldF9jYXN0PFRpbGVCdWZmZXIqPihtX2JhY2tCdWZmZXIpOworfQorCisjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorQmFja2luZ1N0b3JlQ29tcG9zaXRpbmdTdXJmYWNl
KiBTdXJmYWNlUG9vbDo6Y29tcG9zaXRpbmdTdXJmYWNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9jb21wb3NpdGluZ1N1cmZhY2UuZ2V0KCk7Cit9CisjZW5kaWYKKwordm9pZCBTdXJmYWNlUG9v
bDo6bm90aWZ5U2NyZWVuUm90YXRlZCgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKSAmJiBFTkFCTEVfQ09NUE9TSVRJTkdfU1VSRkFDRQorICAgIC8vIFJlY3JlYXRlIGNvbXBv
c2l0aW5nIHN1cmZhY2UgYXQgbmV3IHNjcmVlbiByZXNvbHV0aW9uLgorICAgIG1fY29tcG9zaXRp
bmdTdXJmYWNlID0gY3JlYXRlQ29tcG9zaXRpbmdTdXJmYWNlKCk7CisjZW5kaWYKK30KKworc3Rk
OjpzdHJpbmcgU3VyZmFjZVBvb2w6OnNoYXJlZFBpeG1hcEdyb3VwKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gU0hBUkVEX1BJWE1BUF9HUk9VUDsKK30KKwordm9pZCBTdXJmYWNlUG9vbDo6Y3JlYXRl
QnVmZmVycygpCit7CisgICAgaWYgKCFtX2luaXRpYWxpemVkIHx8IG1fdGlsZVBvb2wuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDcmVhdGUgdGhlIHRpbGUgcG9vbC4KKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdGlsZVBvb2wuc2l6ZSgpOyArK2kpCisgICAgICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y3JlYXRlUGl4bWFwQnVmZmVyKG1fdGls
ZVBvb2xbaV0tPmZyb250QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpKTsKKworICAgIC8vIENyZWF0
ZSB0aGUgbV92aXNpYmxlVGlsZUJ1ZmZlci4KKyAgICBpZiAobV92aXNpYmxlVGlsZUJ1ZmZlcikK
KyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjcmVhdGVQaXhtYXBCdWZm
ZXIobV92aXNpYmxlVGlsZUJ1ZmZlci0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCkpOwor
CisgICAgLy8gQ3JlYXRlIHRoZSBiYWNrYnVmZmVyLgorICAgIGlmIChiYWNrQnVmZmVyKCkpCisg
ICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y3JlYXRlUGl4bWFwQnVmZmVy
KGJhY2tCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCkpOworCisgICAgbV9idWZmZXJzU3VzcGVuZGVk
ID0gZmFsc2U7Cit9CisKK3ZvaWQgU3VyZmFjZVBvb2w6OnJlbGVhc2VCdWZmZXJzKCkKK3sKKyAg
ICBpZiAoIW1faW5pdGlhbGl6ZWQgfHwgbV90aWxlUG9vbC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fYnVmZmVyc1N1c3BlbmRlZCA9IHRydWU7CisKKyAgICAvLyBSZWxlYXNl
IHRoZSB0aWxlIHBvb2wuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3RpbGVQb29sLnNp
emUoKTsgKytpKSB7CisgICAgICAgIG1fdGlsZVBvb2xbaV0tPmZyb250QnVmZmVyKCktPmNsZWFy
UmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpkZXN0cm95UGl4bWFwQnVmZmVyKG1fdGlsZVBvb2xbaV0tPmZyb250QnVmZmVyKCktPm5hdGl2
ZUJ1ZmZlcigpKTsKKyAgICB9CisKKyAgICAvLyBSZWxlYXNlIHRoZSBtX3Zpc2libGVUaWxlQnVm
ZmVyLgorICAgIGlmIChtX3Zpc2libGVUaWxlQnVmZmVyKSB7CisgICAgICAgIG1fdmlzaWJsZVRp
bGVCdWZmZXItPmZyb250QnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpkZXN0cm95UGl4bWFwQnVmZmVyKG1fdmlz
aWJsZVRpbGVCdWZmZXItPmZyb250QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpKTsKKyAgICB9CisK
KyAgICAvLyBSZWxlYXNlIHRoZSBiYWNrYnVmZmVyLgorICAgIGlmIChiYWNrQnVmZmVyKCkpIHsK
KyAgICAgICAgYmFja0J1ZmZlcigpLT5jbGVhclJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6ZGVzdHJveVBpeG1hcEJ1ZmZlcihiYWNrQnVm
ZmVyKCktPm5hdGl2ZUJ1ZmZlcigpKTsKKyAgICB9Cit9CisKK30KK30KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmggYi9Tb3Vy
Y2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9TdXJmYWNlUG9vbC5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmQ1Njg4YmNhZTQzZTNmMWEzMzdlMDU5MmEwMTY3ZDdhY2Y1ZGRiMDMKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9TdXJmYWNlUG9v
bC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIw
MTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAt
MTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBTdXJmYWNlUG9vbF9oCisjZGVmaW5lIFN1cmZhY2VQ
b29sX2gKKworI2luY2x1ZGUgIkJhY2tpbmdTdG9yZVRpbGUuaCIKKworI2lmIFVTRShTS0lBKQor
I2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Qmxh
Y2tCZXJyeVBsYXRmb3JtR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Q
cmltaXRpdmVzLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjZGVmaW5lIEVOQUJMRV9D
T01QT1NJVElOR19TVVJGQUNFIDEKKworbmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNl
IFdlYktpdCB7CisKK2NsYXNzIEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZTsKKworY2xh
c3MgU3VyZmFjZVBvb2wgeworcHVibGljOgorICAgIHN0YXRpYyBTdXJmYWNlUG9vbCogZ2xvYmFs
U3VyZmFjZVBvb2woKTsKKworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6SW50U2l6ZSYpOworCisgICAgaW50IGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4g
IW1fdGlsZVBvb2wuaXNFbXB0eSgpICYmICFtX2J1ZmZlcnNTdXNwZW5kZWQ7IH0KKyAgICBpbnQg
aXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fdGlsZVBvb2wuaXNFbXB0eSgpOyB9CisgICAgaW50
IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3RpbGVQb29sLnNpemUoKTsgfQorCisgICAgdHlwZWRl
ZiBXVEY6OlZlY3RvcjxCYWNraW5nU3RvcmVUaWxlKj4gVGlsZUxpc3Q7CisgICAgY29uc3QgVGls
ZUxpc3QgdGlsZUxpc3QoKSBjb25zdCB7IHJldHVybiBtX3RpbGVQb29sOyB9CisKKyAgICBQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dCogY3JlYXRlUGxhdGZvcm1HcmFwaGljc0NvbnRleHQoQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpEcmF3YWJsZSopIGNvbnN0OworICAgIFBsYXRmb3Jt
R3JhcGhpY3NDb250ZXh0KiBsb2NrVGlsZVJlbmRlcmluZ1N1cmZhY2UoKSBjb25zdDsKKyAgICB2
b2lkIHJlbGVhc2VUaWxlUmVuZGVyaW5nU3VyZmFjZShQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCop
IGNvbnN0OworICAgIEJhY2tpbmdTdG9yZVRpbGUqIHZpc2libGVUaWxlQnVmZmVyKCkgY29uc3Qg
eyByZXR1cm4gbV92aXNpYmxlVGlsZUJ1ZmZlcjsgfQorCisgICAgdm9pZCBpbml0aWFsaXplVmlz
aWJsZVRpbGVCdWZmZXIoY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFNpemUmKTsKKwor
ICAgIC8vIFRoaXMgaXMgYSBzaGFyZWQgYmFjayBidWZmZXIgdGhhdCBpcyB1c2VkIGJ5IGFsbCB0
aGUgdGlsZXMgc2luY2UKKyAgICAvLyBvbmx5IG9uZSB0aWxlIHdpbGwgYmUgcmVuZGVyaW5nIGl0
IGF0IGEgdGltZSBhbmQgd2UgaW52YWxpZGF0ZQorICAgIC8vIHRoZSB3aG9sZSB0aWxlIGV2ZXJ5
IHRpbWUgd2UgcmVuZGVyIGJ5IGNvcHlpbmcgZnJvbSB0aGUgZnJvbnQKKyAgICAvLyBidWZmZXIg
dGhvc2UgcG9ydGlvbnMgdGhhdCB3ZSBkb24ndCByZW5kZXIuIFRoaXMgYWxsb3dzIHVzIHRvCisg
ICAgLy8gaGF2ZSBOKzEgdGlsZWJ1ZmZlcnMgcmF0aGVyIHRoYW4gTioyIGZvciBvdXIgZG91Ymxl
IGJ1ZmZlcmVkCisgICAgLy8gYmFja2luZ3N0b3JlLgorICAgIFRpbGVCdWZmZXIqIGJhY2tCdWZm
ZXIoKSBjb25zdDsKKworICAgIEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZSogY29tcG9z
aXRpbmdTdXJmYWNlKCkgY29uc3Q7CisKKyAgICB2b2lkIG5vdGlmeVNjcmVlblJvdGF0ZWQoKTsK
KworICAgIHN0ZDo6c3RyaW5nIHNoYXJlZFBpeG1hcEdyb3VwKCkgY29uc3Q7CisKKyAgICB2b2lk
IHJlbGVhc2VCdWZmZXJzKCk7CisgICAgdm9pZCBjcmVhdGVCdWZmZXJzKCk7CisKK3ByaXZhdGU6
CisgICAgLy8gVGhpcyBpcyBuZWNlc3Nhcnkgc28gQmFja2luZ1N0b3JlVGlsZSBjYW4gYXRvbWlj
YWxseSBzd2FwIGJ1ZmZlcnMgd2l0aCBtX2JhY2tCdWZmZXIuCisgICAgZnJpZW5kIGNsYXNzIEJh
Y2tpbmdTdG9yZVRpbGU7CisKKyAgICBTdXJmYWNlUG9vbCgpOworCisgICAgVGlsZUxpc3QgbV90
aWxlUG9vbDsKKyAgICBCYWNraW5nU3RvcmVUaWxlKiBtX3Zpc2libGVUaWxlQnVmZmVyOworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBSZWZQdHI8QmFja2luZ1N0b3JlQ29t
cG9zaXRpbmdTdXJmYWNlPiBtX2NvbXBvc2l0aW5nU3VyZmFjZTsKKyNlbmRpZgorI2lmIFVTRShT
S0lBKQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBtX3RpbGVS
ZW5kZXJpbmdTdXJmYWNlOworI2VuZGlmCisgICAgdW5zaWduZWQgbV9iYWNrQnVmZmVyOworICAg
IGJvb2wgbV9pbml0aWFsaXplZDsgLy8gU3VyZmFjZVBvb2wgaGFzIGJlZW4gc2V0IHVwLCB3aXRo
IG9yIHdpdGhvdXQgYnVmZmVycy4KKyAgICBib29sIG1fYnVmZmVyc1N1c3BlbmRlZDsgLy8gQnVm
ZmVyIG9iamVjdHMgZXhpc3QsIGJ1dCBwaXhlbCBtZW1vcnkgaGFzIGJlZW4gZnJlZWQuCit9Owor
fQorfQorCisjZW5kaWYgLy8gU3VyZmFjZVBvb2xfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4LmggYi9Tb3VyY2UvV2ViS2l0L2Js
YWNrYmVycnkvV2ViS2l0U3VwcG9ydC9UaWxlSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zMTQ5ODQ3Yzkx
ZjFlMTZmMTgxZDhhNWQxN2Y0NGUzMzJjNzRkNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4LmgKQEAgLTAsMCArMSw2
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBN
b3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdy
aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLwor
CisjaWZuZGVmIFRpbGVJbmRleF9oCisjZGVmaW5lIFRpbGVJbmRleF9oCisKKyNpbmNsdWRlIDxs
aW1pdHM+CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitj
bGFzcyBUaWxlSW5kZXggeworcHVibGljOgorICAgIFRpbGVJbmRleCgpCisgICAgICAgIDogbV9p
KHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCkpCisgICAgICAgICwgbV9q
KHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCkpIHsgfQorICAgIFRpbGVJ
bmRleCh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IGopCisgICAgICAgIDogbV9pKGkpCisg
ICAgICAgICwgbV9qKGopIHsgfQorICAgIH5UaWxlSW5kZXgoKSB7IH0KKworICAgIHVuc2lnbmVk
IGludCBpKCkgY29uc3QgeyByZXR1cm4gbV9pOyB9CisgICAgdW5zaWduZWQgaW50IGooKSBjb25z
dCB7IHJldHVybiBtX2o7IH0KKyAgICB2b2lkIHNldEluZGV4KHVuc2lnbmVkIGludCBpLCB1bnNp
Z25lZCBpbnQgaikKKyAgICB7CisgICAgICAgIG1faSA9IGk7CisgICAgICAgIG1faiA9IGo7Cisg
ICAgfQorCitwcml2YXRlOgorICAgIGJvb2wgbV9pc1ZhbGlkOworICAgIHVuc2lnbmVkIGludCBt
X2k7CisgICAgdW5zaWduZWQgaW50IG1fajsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0o
Y29uc3QgQmxhY2tCZXJyeTo6V2ViS2l0OjpUaWxlSW5kZXgmIGEsIGNvbnN0IEJsYWNrQmVycnk6
OldlYktpdDo6VGlsZUluZGV4JiBiKQoreworICAgIHJldHVybiBhLmkoKSA9PSBiLmkoKSAmJiBh
LmooKSA9PSBiLmooKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCbGFja0Jl
cnJ5OjpXZWJLaXQ6OlRpbGVJbmRleCYgYSwgY29uc3QgQmxhY2tCZXJyeTo6V2ViS2l0OjpUaWxl
SW5kZXgmIGIpCit7CisgICAgcmV0dXJuIGEuaSgpICE9IGIuaSgpIHx8IGEuaigpICE9IGIuaigp
OworfQorfQorfQorCisjZW5kaWYgLy8gVGlsZUluZGV4X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1RpbGVJbmRleEhhc2guaCBiL1NvdXJjZS9X
ZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1RpbGVJbmRleEhhc2guaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li4wZDQ2MzNiNzViZjk1YmM1MGI0YmM3MDgxMGNkM2I1ODdkZWFmYWQ0Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4SGFz
aC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIw
MTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBUaWxlSW5kZXhIYXNoX2gKKyNkZWZpbmUg
VGlsZUluZGV4SGFzaF9oCisKKyNpbmNsdWRlICJUaWxlSW5kZXguaCIKKyNpbmNsdWRlIDxsaW1p
dHM+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKwordXNpbmcgQmxhY2tCZXJyeTo6V2ViS2l0
OjpUaWxlSW5kZXg7CisKK25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0ZTw+IHN0cnVjdCBJbnRI
YXNoPFRpbGVJbmRleD4geworICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IFRpbGVJbmRl
eCYga2V5KSB7IHJldHVybiBpbnRIYXNoKChzdGF0aWNfY2FzdDx1aW50NjRfdD4oa2V5LmkoKSkg
PDwgMzIgfCBrZXkuaigpKSk7IH0KKyAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBUaWxlSW5k
ZXgmIGEsIGNvbnN0IFRpbGVJbmRleCYgYikgeyByZXR1cm4gYSA9PSBiOyB9CisgICAgc3RhdGlj
IGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOworfTsKK3Rl
bXBsYXRlPD4gc3RydWN0IERlZmF1bHRIYXNoPFRpbGVJbmRleD4geworICAgIHR5cGVkZWYgSW50
SGFzaDxUaWxlSW5kZXg+IEhhc2g7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBIYXNoVHJhaXRz
PFRpbGVJbmRleD4gOiBHZW5lcmljSGFzaFRyYWl0czxUaWxlSW5kZXg+IHsKKyAgICBzdGF0aWMg
Y29uc3QgYm9vbCBlbXB0eVZhbHVlSXNaZXJvID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJv
b2wgbmVlZHNEZXN0cnVjdGlvbiA9IGZhbHNlOworICAgIHN0YXRpYyBUaWxlSW5kZXggZW1wdHlW
YWx1ZSgpIHsgcmV0dXJuIFRpbGVJbmRleCgpOyB9CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0
RGVsZXRlZFZhbHVlKFRpbGVJbmRleCYgc2xvdCkKKyAgICB7CisgICAgICAgIG5ldyAoJnNsb3Qp
IFRpbGVJbmRleChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD46Om1heCgpIC0gMSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWdu
ZWQgaW50Pjo6bWF4KCkgLSAxKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgaXNEZWxldGVkVmFs
dWUoY29uc3QgVGlsZUluZGV4JiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZS5p
KCkgPT0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCkgLSAxKQorICAg
ICAgICAgICAgICAgJiYgdmFsdWUuaigpID09IChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVk
IGludD46Om1heCgpIC0gMSk7CisgICAgfQorfTsKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5k
aWYgLy8gVGlsZUluZGV4SGFzaF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126513</attachid>
            <date>2012-02-10 07:20:33 -0800</date>
            <delta_ts>2012-02-10 11:23:04 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78278-20120210102305.patch</filename>
            <type>text/plain</type>
            <size>16166</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3Mzk5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDYwMGU2NGExMjAzNGIxYjE0
NDYyYjE5ZjNkN2YyODhjYmE5YjE1YzguLjk5ZDRjY2QwMDA5NGFiZGY1NWNlMDQzYzRjYWNlMDVl
NzIyNjQ3Y2EgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTItMDItMTAgIFJvYiBCdWlz
ICA8cmJ1aXNAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0gZ3JhcGhp
Y3MgaGVscGVyIGNsYXNzZXMgaW4gV2ViS2l0U3VwcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgyNzgKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBubyBuZXcgdGVzdHMu
CisKKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuaDog
QWRkZWQuCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1RpbGVJbmRleC5oOiBB
ZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4SGFzaC5o
OiBBZGRlZC4KKwogMjAxMi0wMi0wOSAgTGVvIFlhbmcgIDxsZW8ueWFuZ0B0b3JjaG1vYmlsZS5j
b20uY24+CiAKICAgICAgICAgW0JsYWNrQmVycnldIFVwc3RyZWFtIEphdmFTY3JpcHREZWJ1Z2dl
ckJsYWNrQmVycnkue2gsIGNwcH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9XZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmNwcCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9XZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yNjQyZjM5ZTNlNmE3
YzQ3Yjc5Yzk3NzkyYWI2ODY0ODEyYjFlOWRmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuY3BwCkBAIC0wLDAgKzEs
MTk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIElu
IE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwg
d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdXJmYWNlUG9vbC5oIgorCisjaW5j
bHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZS5oIgorI2Vu
ZGlmCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Mb2cuaD4KKyNpbmNsdWRlIDxCbGFj
a0JlcnJ5UGxhdGZvcm1NaXNjLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtU2NyZWVu
Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtU2V0dGluZ3MuaD4KKworI2RlZmluZSBT
SEFSRURfUElYTUFQX0dST1VQICJ3ZWJraXRfYmFja2luZ3N0b3JlX2dyb3VwIgorCituYW1lc3Bh
Y2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykgJiYgRU5BQkxFX0NPTVBPU0lUSU5HX1NVUkZBQ0UKK3N0YXRpYyBQYXNz
UmVmUHRyPEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZT4gY3JlYXRlQ29tcG9zaXRpbmdT
dXJmYWNlKCkKK3sKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50U2l6ZSBzY3JlZW5TaXpl
ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnNpemUoKTsKKyAgICBy
ZXR1cm4gQmFja2luZ1N0b3JlQ29tcG9zaXRpbmdTdXJmYWNlOjpjcmVhdGUoc2NyZWVuU2l6ZSwg
ZmFsc2UgLypkb3VibGVCdWZmZXJlZCovKTsKK30KKyNlbmRpZgorCitTdXJmYWNlUG9vbCogU3Vy
ZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCkKK3sKKyAgICBzdGF0aWMgU3VyZmFjZVBvb2wq
IHNfaW5zdGFuY2UgPSAwOworICAgIGlmICghc19pbnN0YW5jZSkKKyAgICAgICAgc19pbnN0YW5j
ZSA9IG5ldyBTdXJmYWNlUG9vbDsKKyAgICByZXR1cm4gc19pbnN0YW5jZTsKK30KKworU3VyZmFj
ZVBvb2w6OlN1cmZhY2VQb29sKCkKKyAgICA6IG1fdmlzaWJsZVRpbGVCdWZmZXIoMCkKKyNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLCBtX2NvbXBvc2l0aW5nU3VyZmFjZSgw
KQorI2VuZGlmCisgICAgLCBtX3RpbGVSZW5kZXJpbmdTdXJmYWNlKDApCisgICAgLCBtX2JhY2tC
dWZmZXIoMCkKKyAgICAsIG1faW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgLCBtX2J1ZmZlcnNTdXNw
ZW5kZWQoZmFsc2UpCit7Cit9CisKK3ZvaWQgU3VyZmFjZVBvb2w6OmluaXRpYWxpemUoY29uc3Qg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFNpemUmIHRpbGVTaXplKQoreworICAgIGlmIChtX2lu
aXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgbV9pbml0aWFsaXplZCA9IHRydWU7CisK
KyAgICBjb25zdCB1bnNpZ25lZCBudW1iZXJPZlRpbGVzID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06
OlNldHRpbmdzOjpnZXQoKS0+bnVtYmVyT2ZCYWNraW5nU3RvcmVUaWxlcygpOworICAgIGNvbnN0
IHVuc2lnbmVkIG1heE51bWJlck9mVGlsZXMgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6U2V0dGlu
Z3M6OmdldCgpLT5tYXhpbXVtTnVtYmVyT2ZCYWNraW5nU3RvcmVUaWxlc0Fjcm9zc1Byb2Nlc3Nl
cygpOworCisgICAgaWYgKG51bWJlck9mVGlsZXMpIHsgLy8gT25seSBhbGxvY2F0ZSBpZiB3ZSBh
Y3R1YWxseSB1c2UgYSBiYWNraW5nc3RvcmUuCisgICAgICAgIHVuc2lnbmVkIGJ5dGVMaW1pdCA9
IChtYXhOdW1iZXJPZlRpbGVzIC8qcG9vbCovICsgMiAvKnZpc2libGUgdGlsZSBidWZmZXIsIGJh
Y2tidWZmZXIqLykgKiB0aWxlU2l6ZS53aWR0aCgpICogdGlsZVNpemUuaGVpZ2h0KCkgKiA0Owor
ICAgICAgICBib29sIHN1Y2Nlc3MgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmNy
ZWF0ZVBpeG1hcEdyb3VwKFNIQVJFRF9QSVhNQVBfR1JPVVAsIGJ5dGVMaW1pdCk7CisgICAgICAg
IGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLAorICAgICAgICAgICAgICAgICJTaGFy
ZWQgYnVmZmVyIHBvb2wgY291bGQgbm90IGJlIHNldCB1cCwgdXNpbmcgcmVndWxhciBtZW1vcnkg
YWxsb2NhdGlvbiBpbnN0ZWFkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgbV90aWxlUmVu
ZGVyaW5nU3VyZmFjZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6ZHJhd2luZ1N1
cmZhY2UoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykgJiYgRU5BQkxFX0NP
TVBPU0lUSU5HX1NVUkZBQ0UKKyAgICBtX2NvbXBvc2l0aW5nU3VyZmFjZSA9IGNyZWF0ZUNvbXBv
c2l0aW5nU3VyZmFjZSgpOworI2VuZGlmCisKKyAgICBpZiAoIW51bWJlck9mVGlsZXMpCisgICAg
ICAgIHJldHVybjsgLy8gd2Ugb25seSB1c2UgZGlyZWN0IHJlbmRlcmluZyB3aGVuIDAgdGlsZXMg
YXJlIHNwZWNpZmllZC4KKworICAgIC8vIENyZWF0ZSB0aGUgc2hhcmVkIGJhY2tidWZmZXIuCisg
ICAgbV9iYWNrQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4obmV3IFRpbGVCdWZm
ZXIodGlsZVNpemUpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYmVyT2ZUaWxl
czsgKytpKQorICAgICAgICBtX3RpbGVQb29sLmFwcGVuZChCYWNraW5nU3RvcmVUaWxlOjpjcmVh
dGUodGlsZVNpemUsIEJhY2tpbmdTdG9yZVRpbGU6OkRvdWJsZUJ1ZmZlcmVkKSk7Cit9CisKK1Bs
YXRmb3JtR3JhcGhpY3NDb250ZXh0KiBTdXJmYWNlUG9vbDo6Y3JlYXRlUGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpEcmF3YWJsZSogZHJhd2Fi
bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG5ldyBXZWJDb3JlOjpQbGF0Zm9ybUNvbnRleHRTa2lh
KGRyYXdhYmxlKTsKK30KKworUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIFN1cmZhY2VQb29sOjps
b2NrVGlsZVJlbmRlcmluZ1N1cmZhY2UoKSBjb25zdAoreworICAgIGlmICghbV90aWxlUmVuZGVy
aW5nU3VyZmFjZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3JlYXRlUGxhdGZv
cm1HcmFwaGljc0NvbnRleHQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpsb2NrQnVm
ZmVyRHJhd2FibGUobV90aWxlUmVuZGVyaW5nU3VyZmFjZSkpOworfQorCit2b2lkIFN1cmZhY2VQ
b29sOjpyZWxlYXNlVGlsZVJlbmRlcmluZ1N1cmZhY2UoUGxhdGZvcm1HcmFwaGljc0NvbnRleHQq
IGNvbnRleHQpIGNvbnN0Cit7CisgICAgaWYgKCFtX3RpbGVSZW5kZXJpbmdTdXJmYWNlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBkZWxldGUgY29udGV4dDsKKyAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6R3JhcGhpY3M6OnJlbGVhc2VCdWZmZXJEcmF3YWJsZShtX3RpbGVSZW5kZXJpbmdTdXJm
YWNlKTsKK30KKwordm9pZCBTdXJmYWNlUG9vbDo6aW5pdGlhbGl6ZVZpc2libGVUaWxlQnVmZmVy
KGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRTaXplJiB2aXNpYmxlU2l6ZSkKK3sKKyAg
ICBpZiAoIW1fdmlzaWJsZVRpbGVCdWZmZXIgfHwgbV92aXNpYmxlVGlsZUJ1ZmZlci0+c2l6ZSgp
ICE9IHZpc2libGVTaXplKSB7CisgICAgICAgIGRlbGV0ZSBtX3Zpc2libGVUaWxlQnVmZmVyOwor
ICAgICAgICBtX3Zpc2libGVUaWxlQnVmZmVyID0gQmFja2luZ1N0b3JlVGlsZTo6Y3JlYXRlKHZp
c2libGVTaXplLCBCYWNraW5nU3RvcmVUaWxlOjpTaW5nbGVCdWZmZXJlZCk7CisgICAgfQorfQor
CitUaWxlQnVmZmVyKiBTdXJmYWNlUG9vbDo6YmFja0J1ZmZlcigpIGNvbnN0Cit7CisgICAgQVNT
RVJUKG1fYmFja0J1ZmZlcik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VGlsZUJ1ZmZl
cio+KG1fYmFja0J1ZmZlcik7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CitCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2UqIFN1cmZhY2VQb29sOjpjb21wb3NpdGlu
Z1N1cmZhY2UoKSBjb25zdAoreworICAgIHJldHVybiBtX2NvbXBvc2l0aW5nU3VyZmFjZS5nZXQo
KTsKK30KKyNlbmRpZgorCit2b2lkIFN1cmZhY2VQb29sOjpub3RpZnlTY3JlZW5Sb3RhdGVkKCkK
K3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElO
R19TVVJGQUNFCisgICAgLy8gUmVjcmVhdGUgY29tcG9zaXRpbmcgc3VyZmFjZSBhdCBuZXcgc2Ny
ZWVuIHJlc29sdXRpb24uCisgICAgbV9jb21wb3NpdGluZ1N1cmZhY2UgPSBjcmVhdGVDb21wb3Np
dGluZ1N1cmZhY2UoKTsKKyNlbmRpZgorfQorCitzdGQ6OnN0cmluZyBTdXJmYWNlUG9vbDo6c2hh
cmVkUGl4bWFwR3JvdXAoKSBjb25zdAoreworICAgIHJldHVybiBTSEFSRURfUElYTUFQX0dST1VQ
OworfQorCit2b2lkIFN1cmZhY2VQb29sOjpjcmVhdGVCdWZmZXJzKCkKK3sKKyAgICBpZiAoIW1f
aW5pdGlhbGl6ZWQgfHwgbV90aWxlUG9vbC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIC8vIENyZWF0ZSB0aGUgdGlsZSBwb29sLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bV90aWxlUG9vbC5zaXplKCk7ICsraSkKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpjcmVhdGVQaXhtYXBCdWZmZXIobV90aWxlUG9vbFtpXS0+ZnJvbnRCdWZmZXIoKS0+
bmF0aXZlQnVmZmVyKCkpOworCisgICAgaWYgKG1fdmlzaWJsZVRpbGVCdWZmZXIpCisgICAgICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y3JlYXRlUGl4bWFwQnVmZmVyKG1fdmlz
aWJsZVRpbGVCdWZmZXItPmZyb250QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpKTsKKworICAgIGlm
IChiYWNrQnVmZmVyKCkpCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6
Y3JlYXRlUGl4bWFwQnVmZmVyKGJhY2tCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCkpOworCisgICAg
bV9idWZmZXJzU3VzcGVuZGVkID0gZmFsc2U7Cit9CisKK3ZvaWQgU3VyZmFjZVBvb2w6OnJlbGVh
c2VCdWZmZXJzKCkKK3sKKyAgICBpZiAoIW1faW5pdGlhbGl6ZWQgfHwgbV90aWxlUG9vbC5pc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fYnVmZmVyc1N1c3BlbmRlZCA9IHRydWU7
CisKKyAgICAvLyBSZWxlYXNlIHRoZSB0aWxlIHBvb2wuCisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX3RpbGVQb29sLnNpemUoKTsgKytpKSB7CisgICAgICAgIG1fdGlsZVBvb2xbaV0tPmZy
b250QnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpkZXN0cm95UGl4bWFwQnVmZmVyKG1fdGlsZVBvb2xbaV0tPmZy
b250QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpKTsKKyAgICB9CisKKyAgICBpZiAobV92aXNpYmxl
VGlsZUJ1ZmZlcikgeworICAgICAgICBtX3Zpc2libGVUaWxlQnVmZmVyLT5mcm9udEJ1ZmZlcigp
LT5jbGVhclJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpH
cmFwaGljczo6ZGVzdHJveVBpeG1hcEJ1ZmZlcihtX3Zpc2libGVUaWxlQnVmZmVyLT5mcm9udEJ1
ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSk7CisgICAgfQorCisgICAgaWYgKGJhY2tCdWZmZXIoKSkg
eworICAgICAgICBiYWNrQnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpkZXN0cm95UGl4bWFwQnVmZmVyKGJhY2tC
dWZmZXIoKS0+bmF0aXZlQnVmZmVyKCkpOworICAgIH0KK30KKworfQorfQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU3VyZmFjZVBvb2wuaCBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1N1cmZhY2VQb29sLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZmE4OGE1ZDZhNDc2NzgwNzM2ZjJiOGIwOGMzMGUwODhhOTQ3MzMxMAotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1N1cmZhY2VQ
b29sLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwg
MjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2Vy
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx
MC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFN1cmZhY2VQb29sX2gKKyNkZWZpbmUgU3VyZmFj
ZVBvb2xfaAorCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlVGlsZS5oIgorCisjaW5jbHVkZSAiUGxh
dGZvcm1Db250ZXh0U2tpYS5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3JhcGhp
Y3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1QcmltaXRpdmVzLmg+CisjaW5jbHVk
ZSA8d3RmL1ZlY3Rvci5oPgorCisjZGVmaW5lIEVOQUJMRV9DT01QT1NJVElOR19TVVJGQUNFIDEK
KworbmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIEJh
Y2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZTsKKworY2xhc3MgU3VyZmFjZVBvb2wgeworcHVi
bGljOgorICAgIHN0YXRpYyBTdXJmYWNlUG9vbCogZ2xvYmFsU3VyZmFjZVBvb2woKTsKKworICAg
IHZvaWQgaW5pdGlhbGl6ZShjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50U2l6ZSYpOwor
CisgICAgaW50IGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gIW1fdGlsZVBvb2wuaXNFbXB0eSgp
ICYmICFtX2J1ZmZlcnNTdXNwZW5kZWQ7IH0KKyAgICBpbnQgaXNFbXB0eSgpIGNvbnN0IHsgcmV0
dXJuIG1fdGlsZVBvb2wuaXNFbXB0eSgpOyB9CisgICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVy
biBtX3RpbGVQb29sLnNpemUoKTsgfQorCisgICAgdHlwZWRlZiBXVEY6OlZlY3RvcjxCYWNraW5n
U3RvcmVUaWxlKj4gVGlsZUxpc3Q7CisgICAgY29uc3QgVGlsZUxpc3QgdGlsZUxpc3QoKSBjb25z
dCB7IHJldHVybiBtX3RpbGVQb29sOyB9CisKKyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCog
Y3JlYXRlUGxhdGZvcm1HcmFwaGljc0NvbnRleHQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpEcmF3YWJsZSopIGNvbnN0OworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBsb2Nr
VGlsZVJlbmRlcmluZ1N1cmZhY2UoKSBjb25zdDsKKyAgICB2b2lkIHJlbGVhc2VUaWxlUmVuZGVy
aW5nU3VyZmFjZShQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCopIGNvbnN0OworICAgIEJhY2tpbmdT
dG9yZVRpbGUqIHZpc2libGVUaWxlQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV92aXNpYmxlVGls
ZUJ1ZmZlcjsgfQorCisgICAgdm9pZCBpbml0aWFsaXplVmlzaWJsZVRpbGVCdWZmZXIoY29uc3Qg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFNpemUmKTsKKworICAgIC8vIFRoaXMgaXMgYSBzaGFy
ZWQgYmFjayBidWZmZXIgdGhhdCBpcyB1c2VkIGJ5IGFsbCB0aGUgdGlsZXMgc2luY2UKKyAgICAv
LyBvbmx5IG9uZSB0aWxlIHdpbGwgYmUgcmVuZGVyaW5nIGl0IGF0IGEgdGltZSBhbmQgd2UgaW52
YWxpZGF0ZQorICAgIC8vIHRoZSB3aG9sZSB0aWxlIGV2ZXJ5IHRpbWUgd2UgcmVuZGVyIGJ5IGNv
cHlpbmcgZnJvbSB0aGUgZnJvbnQKKyAgICAvLyBidWZmZXIgdGhvc2UgcG9ydGlvbnMgdGhhdCB3
ZSBkb24ndCByZW5kZXIuIFRoaXMgYWxsb3dzIHVzIHRvCisgICAgLy8gaGF2ZSBOKzEgdGlsZWJ1
ZmZlcnMgcmF0aGVyIHRoYW4gTioyIGZvciBvdXIgZG91YmxlIGJ1ZmZlcmVkCisgICAgLy8gYmFj
a2luZ3N0b3JlLgorICAgIFRpbGVCdWZmZXIqIGJhY2tCdWZmZXIoKSBjb25zdDsKKworICAgIEJh
Y2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZSogY29tcG9zaXRpbmdTdXJmYWNlKCkgY29uc3Q7
CisKKyAgICB2b2lkIG5vdGlmeVNjcmVlblJvdGF0ZWQoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNo
YXJlZFBpeG1hcEdyb3VwKCkgY29uc3Q7CisKKyAgICB2b2lkIHJlbGVhc2VCdWZmZXJzKCk7Cisg
ICAgdm9pZCBjcmVhdGVCdWZmZXJzKCk7CisKK3ByaXZhdGU6CisgICAgLy8gVGhpcyBpcyBuZWNl
c3Nhcnkgc28gQmFja2luZ1N0b3JlVGlsZSBjYW4gYXRvbWljYWxseSBzd2FwIGJ1ZmZlcnMgd2l0
aCBtX2JhY2tCdWZmZXIuCisgICAgZnJpZW5kIGNsYXNzIEJhY2tpbmdTdG9yZVRpbGU7CisKKyAg
ICBTdXJmYWNlUG9vbCgpOworCisgICAgVGlsZUxpc3QgbV90aWxlUG9vbDsKKyAgICBCYWNraW5n
U3RvcmVUaWxlKiBtX3Zpc2libGVUaWxlQnVmZmVyOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKyAgICBSZWZQdHI8QmFja2luZ1N0b3JlQ29tcG9zaXRpbmdTdXJmYWNlPiBtX2Nv
bXBvc2l0aW5nU3VyZmFjZTsKKyNlbmRpZgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6QnVmZmVyKiBtX3RpbGVSZW5kZXJpbmdTdXJmYWNlOworICAgIHVuc2lnbmVkIG1fYmFj
a0J1ZmZlcjsKKyAgICBib29sIG1faW5pdGlhbGl6ZWQ7IC8vIFN1cmZhY2VQb29sIGhhcyBiZWVu
IHNldCB1cCwgd2l0aCBvciB3aXRob3V0IGJ1ZmZlcnMuCisgICAgYm9vbCBtX2J1ZmZlcnNTdXNw
ZW5kZWQ7IC8vIEJ1ZmZlciBvYmplY3RzIGV4aXN0LCBidXQgcGl4ZWwgbWVtb3J5IGhhcyBiZWVu
IGZyZWVkLgorfTsKK30KK30KKworI2VuZGlmIC8vIFN1cmZhY2VQb29sX2gKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1RpbGVJbmRleC5oIGIvU291
cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvVGlsZUluZGV4LmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uMzE0OTg0N2M5MWYxZTE2ZjE4MWQ4YTVkMTdmNDRlMzMyYzc0ZDVhNwotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1RpbGVJbmRleC5o
CkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEg
UmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMw
MSAgVVNBCisgKi8KKworI2lmbmRlZiBUaWxlSW5kZXhfaAorI2RlZmluZSBUaWxlSW5kZXhfaAor
CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2Ug
V2ViS2l0IHsKKworY2xhc3MgVGlsZUluZGV4IHsKK3B1YmxpYzoKKyAgICBUaWxlSW5kZXgoKQor
ICAgICAgICA6IG1faShzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD46Om1heCgpKQor
ICAgICAgICAsIG1faihzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD46Om1heCgpKSB7
IH0KKyAgICBUaWxlSW5kZXgodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKQorICAgICAg
ICA6IG1faShpKQorICAgICAgICAsIG1faihqKSB7IH0KKyAgICB+VGlsZUluZGV4KCkgeyB9CisK
KyAgICB1bnNpZ25lZCBpbnQgaSgpIGNvbnN0IHsgcmV0dXJuIG1faTsgfQorICAgIHVuc2lnbmVk
IGludCBqKCkgY29uc3QgeyByZXR1cm4gbV9qOyB9CisgICAgdm9pZCBzZXRJbmRleCh1bnNpZ25l
ZCBpbnQgaSwgdW5zaWduZWQgaW50IGopCisgICAgeworICAgICAgICBtX2kgPSBpOworICAgICAg
ICBtX2ogPSBqOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1faXNWYWxpZDsKKyAgICB1
bnNpZ25lZCBpbnQgbV9pOworICAgIHVuc2lnbmVkIGludCBtX2o7Cit9OworCitpbmxpbmUgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IEJsYWNrQmVycnk6OldlYktpdDo6VGlsZUluZGV4JiBhLCBjb25z
dCBCbGFja0JlcnJ5OjpXZWJLaXQ6OlRpbGVJbmRleCYgYikKK3sKKyAgICByZXR1cm4gYS5pKCkg
PT0gYi5pKCkgJiYgYS5qKCkgPT0gYi5qKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0o
Y29uc3QgQmxhY2tCZXJyeTo6V2ViS2l0OjpUaWxlSW5kZXgmIGEsIGNvbnN0IEJsYWNrQmVycnk6
OldlYktpdDo6VGlsZUluZGV4JiBiKQoreworICAgIHJldHVybiBhLmkoKSAhPSBiLmkoKSB8fCBh
LmooKSAhPSBiLmooKTsKK30KK30KK30KKworI2VuZGlmIC8vIFRpbGVJbmRleF9oCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9UaWxlSW5kZXhIYXNo
LmggYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9UaWxlSW5kZXhIYXNo
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uMGQ0NjMzYjc1YmY5NWJjNTBiNGJjNzA4MTBjZDNiNTg3ZGVhZmFkNAot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0
L1RpbGVJbmRleEhhc2guaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh
cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgVGlsZUluZGV4SGFz
aF9oCisjZGVmaW5lIFRpbGVJbmRleEhhc2hfaAorCisjaW5jbHVkZSAiVGlsZUluZGV4LmgiCisj
aW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK3VzaW5nIEJsYWNr
QmVycnk6OldlYktpdDo6VGlsZUluZGV4OworCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGU8
PiBzdHJ1Y3QgSW50SGFzaDxUaWxlSW5kZXg+IHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChj
b25zdCBUaWxlSW5kZXgmIGtleSkgeyByZXR1cm4gaW50SGFzaCgoc3RhdGljX2Nhc3Q8dWludDY0
X3Q+KGtleS5pKCkpIDw8IDMyIHwga2V5LmooKSkpOyB9CisgICAgc3RhdGljIGJvb2wgZXF1YWwo
Y29uc3QgVGlsZUluZGV4JiBhLCBjb25zdCBUaWxlSW5kZXgmIGIpIHsgcmV0dXJuIGEgPT0gYjsg
fQorICAgIHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0g
dHJ1ZTsKK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBEZWZhdWx0SGFzaDxUaWxlSW5kZXg+IHsKKyAg
ICB0eXBlZGVmIEludEhhc2g8VGlsZUluZGV4PiBIYXNoOworfTsKKwordGVtcGxhdGU8PiBzdHJ1
Y3QgSGFzaFRyYWl0czxUaWxlSW5kZXg+IDogR2VuZXJpY0hhc2hUcmFpdHM8VGlsZUluZGV4PiB7
CisgICAgc3RhdGljIGNvbnN0IGJvb2wgZW1wdHlWYWx1ZUlzWmVybyA9IGZhbHNlOworICAgIHN0
YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgICBzdGF0aWMgVGls
ZUluZGV4IGVtcHR5VmFsdWUoKSB7IHJldHVybiBUaWxlSW5kZXgoKTsgfQorICAgIHN0YXRpYyB2
b2lkIGNvbnN0cnVjdERlbGV0ZWRWYWx1ZShUaWxlSW5kZXgmIHNsb3QpCisgICAgeworICAgICAg
ICBuZXcgKCZzbG90KSBUaWxlSW5kZXgoc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBpbnQ+
OjptYXgoKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNf
bGltaXRzPHVuc2lnbmVkIGludD46Om1heCgpIC0gMSk7CisgICAgfQorICAgIHN0YXRpYyBib29s
IGlzRGVsZXRlZFZhbHVlKGNvbnN0IFRpbGVJbmRleCYgdmFsdWUpCisgICAgeworICAgICAgICBy
ZXR1cm4gdmFsdWUuaSgpID09IChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD46Om1h
eCgpIC0gMSkKKyAgICAgICAgICAgICAgICYmIHZhbHVlLmooKSA9PSAoc3RkOjpudW1lcmljX2xp
bWl0czx1bnNpZ25lZCBpbnQ+OjptYXgoKSAtIDEpOworICAgIH0KK307Cit9IC8vIG5hbWVzcGFj
ZSBXVEYKKworI2VuZGlmIC8vIFRpbGVJbmRleEhhc2hfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126542</attachid>
            <date>2012-02-10 11:23:14 -0800</date>
            <delta_ts>2012-02-10 11:59:47 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78278-20120210142545.patch</filename>
            <type>text/plain</type>
            <size>43649</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3NDAxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZlZmM5YWJiZWMwMGNmMGQz
M2RmN2E2MWY3NjE2OTA3NDM5YWMyMzEuLjNmODJjNjEzODg3Y2JhNTVlYThkMjhkMWVkMTBmZWY1
NDEwYzIwZjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0zLDYgKzMsMTggQEAKICAgICAgICAgW0JsYWNrQmVycnld
IFVwc3RyZWFtIGdyYXBoaWNzIGhlbHBlciBjbGFzc2VzIGluIFdlYktpdFN1cHBvcnQKICAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4Mjc4CiAKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVh
bSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1Jl
bmRlclF1ZXVlLmNwcDogQWRkZWQuCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0
L1JlbmRlclF1ZXVlLmg6IEFkZGVkLgorCisyMDEyLTAyLTEwICBSb2IgQnVpcyAgPHJidWlzQHJp
bS5jb20+CisKKyAgICAgICAgW0JsYWNrQmVycnldIFVwc3RyZWFtIGdyYXBoaWNzIGhlbHBlciBj
bGFzc2VzIGluIFdlYktpdFN1cHBvcnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTc4Mjc4CisKICAgICAgICAgUmV2aWV3ZWQgYnkgQW50b25pbyBHb21l
cy4KIAogICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBubyBuZXcgdGVzdHMuCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9SZW5kZXJRdWV1ZS5jcHAg
Yi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9SZW5kZXJRdWV1ZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMWYzMjBiOWE4MDAyYjgzNzA0OWRlYWQyZWY1YjA3MThmZTg1OGI2OQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1Jl
bmRlclF1ZXVlLmNwcApAQCAtMCwwICsxLDkxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUmVuZGVyUXVldWUuaCIKKworI2luY2x1ZGUgIkJhY2tpbmdTdG9yZV9wLmgiCisj
aW5jbHVkZSAiV2ViUGFnZUNsaWVudC5oIgorI2luY2x1ZGUgIldlYlBhZ2VfcC5oIgorCisjZGVm
aW5lIERFQlVHX1JFTkRFUl9RVUVVRSAwCisjZGVmaW5lIERFQlVHX1JFTkRFUl9RVUVVRV9TT1JU
IDAKKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9y
bUxvZy5oPgorI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgorI2VuZGlmCisKK25hbWVzcGFj
ZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCit0ZW1wbGF0ZTxTb3J0RGlyZWN0
aW9uIHNvcnREaXJlY3Rpb24+CitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlUmVjdE9uZURpcmVj
dGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcjEsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiByMikKK3sKKyAgICBzd2l0Y2ggKHNvcnREaXJlY3Rpb24pIHsKKyAgICBjYXNlIExlZnRUb1Jp
Z2h0OgorICAgICAgICByZXR1cm4gcjEueCgpIC0gcjIueCgpOworICAgIGNhc2UgUmlnaHRUb0xl
ZnQ6CisgICAgICAgIHJldHVybiByMi54KCkgLSByMS54KCk7CisgICAgY2FzZSBUb3BUb0JvdHRv
bToKKyAgICAgICAgcmV0dXJuIHIxLnkoKSAtIHIyLnkoKTsKKyAgICBjYXNlIEJvdHRvbVRvVG9w
OgorICAgICAgICByZXR1cm4gcjIueSgpIC0gcjEueSgpOworICAgIGRlZmF1bHQ6CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsK
K30KKwordGVtcGxhdGU8U29ydERpcmVjdGlvbiBwcmltYXJ5U29ydERpcmVjdGlvbiwgU29ydERp
cmVjdGlvbiBzZWNvbmRhcnlTb3J0RGlyZWN0aW9uPgorc3RhdGljIGJvb2wgcmVjdElzTGVzc1Ro
YW4oY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHIxLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
cjIpCit7CisgICAgaW50IHByaW1hcnlSZXN1bHQgPSBjb21wYXJlUmVjdE9uZURpcmVjdGlvbjxw
cmltYXJ5U29ydERpcmVjdGlvbj4ocjEsIHIyKTsKKyAgICBpZiAocHJpbWFyeVJlc3VsdCB8fCBz
ZWNvbmRhcnlTb3J0RGlyZWN0aW9uID09IHByaW1hcnlTb3J0RGlyZWN0aW9uKQorICAgICAgICBy
ZXR1cm4gcHJpbWFyeVJlc3VsdCA8IDA7CisgICAgcmV0dXJuIGNvbXBhcmVSZWN0T25lRGlyZWN0
aW9uPHNlY29uZGFyeVNvcnREaXJlY3Rpb24+KHIxLCByMikgPCAwOworfQorCit0eXBlZGVmIGJv
b2wgKCpGdW5jUmVjdExlc3NUaGFuKShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcjEsIGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JiByMik7CitzdGF0aWMgRnVuY1JlY3RMZXNzVGhhbiByZWN0TGVz
c1RoYW5GdW5jdGlvbihTb3J0RGlyZWN0aW9uIHByaW1hcnksIFNvcnREaXJlY3Rpb24gc2Vjb25k
YXJ5KQoreworICAgIHN0YXRpYyBGdW5jUmVjdExlc3NUaGFuIHNfcmVjdExlc3NUaGFuRnVuY3Rp
b25zW051bVNvcnREaXJlY3Rpb25zXVtOdW1Tb3J0RGlyZWN0aW9uc10gPSB7IHsgMCB9IH07Cisg
ICAgc3RhdGljIGJvb2wgc19pbml0aWFsaXplZCA9IGZhbHNlOworICAgIGlmICghc19pbml0aWFs
aXplZCkgeworI2RlZmluZSBBRERfQ09NUEFSRV9GVU5DVElPTihfcHJpbWFyeSwgX3NlY29uZGFy
eSkgXAorICAgICAgICBzX3JlY3RMZXNzVGhhbkZ1bmN0aW9uc1tfcHJpbWFyeV1bX3NlY29uZGFy
eV0gPSByZWN0SXNMZXNzVGhhbjxfcHJpbWFyeSwgX3NlY29uZGFyeT4KKworICAgICAgICBBRERf
Q09NUEFSRV9GVU5DVElPTihMZWZ0VG9SaWdodCwgTGVmdFRvUmlnaHQpOworICAgICAgICBBRERf
Q09NUEFSRV9GVU5DVElPTihMZWZ0VG9SaWdodCwgUmlnaHRUb0xlZnQpOworICAgICAgICBBRERf
Q09NUEFSRV9GVU5DVElPTihMZWZ0VG9SaWdodCwgVG9wVG9Cb3R0b20pOworICAgICAgICBBRERf
Q09NUEFSRV9GVU5DVElPTihMZWZ0VG9SaWdodCwgQm90dG9tVG9Ub3ApOworCisgICAgICAgIEFE
RF9DT01QQVJFX0ZVTkNUSU9OKFJpZ2h0VG9MZWZ0LCBMZWZ0VG9SaWdodCk7CisgICAgICAgIEFE
RF9DT01QQVJFX0ZVTkNUSU9OKFJpZ2h0VG9MZWZ0LCBSaWdodFRvTGVmdCk7CisgICAgICAgIEFE
RF9DT01QQVJFX0ZVTkNUSU9OKFJpZ2h0VG9MZWZ0LCBUb3BUb0JvdHRvbSk7CisgICAgICAgIEFE
RF9DT01QQVJFX0ZVTkNUSU9OKFJpZ2h0VG9MZWZ0LCBCb3R0b21Ub1RvcCk7CisKKyAgICAgICAg
QUREX0NPTVBBUkVfRlVOQ1RJT04oVG9wVG9Cb3R0b20sIExlZnRUb1JpZ2h0KTsKKyAgICAgICAg
QUREX0NPTVBBUkVfRlVOQ1RJT04oVG9wVG9Cb3R0b20sIFJpZ2h0VG9MZWZ0KTsKKyAgICAgICAg
QUREX0NPTVBBUkVfRlVOQ1RJT04oVG9wVG9Cb3R0b20sIFRvcFRvQm90dG9tKTsKKyAgICAgICAg
QUREX0NPTVBBUkVfRlVOQ1RJT04oVG9wVG9Cb3R0b20sIEJvdHRvbVRvVG9wKTsKKworICAgICAg
ICBBRERfQ09NUEFSRV9GVU5DVElPTihCb3R0b21Ub1RvcCwgTGVmdFRvUmlnaHQpOworICAgICAg
ICBBRERfQ09NUEFSRV9GVU5DVElPTihCb3R0b21Ub1RvcCwgUmlnaHRUb0xlZnQpOworICAgICAg
ICBBRERfQ09NUEFSRV9GVU5DVElPTihCb3R0b21Ub1RvcCwgVG9wVG9Cb3R0b20pOworICAgICAg
ICBBRERfQ09NUEFSRV9GVU5DVElPTihCb3R0b21Ub1RvcCwgQm90dG9tVG9Ub3ApOworI3VuZGVm
IEFERF9DT01QQVJFX0ZVTkNUSU9OCisKKyAgICAgICAgc19pbml0aWFsaXplZCA9IHRydWU7Cisg
ICAgfQorCisgICAgcmV0dXJuIHNfcmVjdExlc3NUaGFuRnVuY3Rpb25zW3ByaW1hcnldW3NlY29u
ZGFyeV07Cit9CisKK2NsYXNzIFJlY3RMZXNzVGhhbiB7CitwdWJsaWM6CisgICAgUmVjdExlc3NU
aGFuKFNvcnREaXJlY3Rpb24gcHJpbWFyeVNvcnREaXJlY3Rpb24sIFNvcnREaXJlY3Rpb24gc2Vj
b25kYXJ5U29ydERpcmVjdGlvbikKKyAgICAgICAgOiBtX3JlY3RJc0xlc3NUaGFuKHJlY3RMZXNz
VGhhbkZ1bmN0aW9uKHByaW1hcnlTb3J0RGlyZWN0aW9uLCBzZWNvbmRhcnlTb3J0RGlyZWN0aW9u
KSkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0JiByMSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHIyKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1fcmVjdElzTGVzc1RoYW4ocjEsIHIyKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
RnVuY1JlY3RMZXNzVGhhbiBtX3JlY3RJc0xlc3NUaGFuOworfTsKKworY2xhc3MgUmVuZGVyUmVj
dExlc3NUaGFuIHsKK3B1YmxpYzoKKyAgICBSZW5kZXJSZWN0TGVzc1RoYW4oU29ydERpcmVjdGlv
biBwcmltYXJ5U29ydERpcmVjdGlvbiwgU29ydERpcmVjdGlvbiBzZWNvbmRhcnlTb3J0RGlyZWN0
aW9uKQorICAgICAgICA6IG1fcmVjdElzTGVzc1RoYW4ocmVjdExlc3NUaGFuRnVuY3Rpb24ocHJp
bWFyeVNvcnREaXJlY3Rpb24sIHNlY29uZGFyeVNvcnREaXJlY3Rpb24pKQorICAgIHsKKyAgICB9
CisKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmVuZGVyUmVjdCYgcjEsIGNvbnN0IFJlbmRl
clJlY3QmIHIyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcmVjdElzTGVzc1RoYW4ocjEuc3Vi
UmVjdHMoKVswXSwgcjIuc3ViUmVjdHMoKVswXSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEZ1
bmNSZWN0TGVzc1RoYW4gbV9yZWN0SXNMZXNzVGhhbjsKK307CisKK1JlbmRlclJlY3Q6OlJlbmRl
clJlY3QoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBsb2NhdGlvbiwgY29uc3QgUGxhdGZvcm06
OkludFNpemUmIHNpemUsIGludCBzcGxpdHRpbmdGYWN0b3IpCisgICAgOiBQbGF0Zm9ybTo6SW50
UmVjdChsb2NhdGlvbiwgc2l6ZSkKKyAgICAsIG1fc3BsaXR0aW5nRmFjdG9yKDApCisgICAgLCBt
X3ByaW1hcnlTb3J0RGlyZWN0aW9uKFRvcFRvQm90dG9tKQorICAgICwgbV9zZWNvbmRhcnlTb3J0
RGlyZWN0aW9uKExlZnRUb1JpZ2h0KQoreworICAgIGluaXRpYWxpemUoc3BsaXR0aW5nRmFjdG9y
KTsKK30KKworUmVuZGVyUmVjdDo6UmVuZGVyUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwg
aW50IGhlaWdodCwgaW50IHNwbGl0dGluZ0ZhY3RvcikKKyAgICA6IFBsYXRmb3JtOjpJbnRSZWN0
KHgsIHksIHdpZHRoLCBoZWlnaHQpCisgICAgLCBtX3NwbGl0dGluZ0ZhY3RvcigwKQorICAgICwg
bV9wcmltYXJ5U29ydERpcmVjdGlvbihUb3BUb0JvdHRvbSkKKyAgICAsIG1fc2Vjb25kYXJ5U29y
dERpcmVjdGlvbihMZWZ0VG9SaWdodCkKK3sKKyAgICBpbml0aWFsaXplKHNwbGl0dGluZ0ZhY3Rv
cik7Cit9CisKK3ZvaWQgUmVuZGVyUmVjdDo6aW5pdGlhbGl6ZShpbnQgc3BsaXR0aW5nRmFjdG9y
KQoreworICAgIG1fc3ViUmVjdHMucHVzaF9iYWNrKCp0aGlzKTsKKyAgICBmb3IgKGludCBpID0g
MDsgaSA8IHNwbGl0dGluZ0ZhY3RvcjsgKytpKQorICAgICAgICBzcGxpdCgpOworICAgIHF1aWNr
U29ydCgpOworfQorCitzdGF0aWMgdm9pZCBzcGxpdFJlY3RJbkhhbGZBbmRBZGRUb0xpc3QoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QsIGJvb2wgdmVydGljYWwsIEludFJlY3RMaXN0JiBy
ZW5kZXJSZWN0TGlzdCkKK3sKKyAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgaW50IHdpZHRo
MSA9IHN0YXRpY19jYXN0PGludD4oY2VpbGYocmVjdC53aWR0aCgpIC8gMi4wKSk7CisgICAgICAg
IGludCB3aWR0aDIgPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZihyZWN0LndpZHRoKCkgLyAyLjAp
KTsKKyAgICAgICAgcmVuZGVyUmVjdExpc3QucHVzaF9iYWNrKFBsYXRmb3JtOjpJbnRSZWN0KHJl
Y3QueCgpLCByZWN0LnkoKSwgd2lkdGgxLCByZWN0LmhlaWdodCgpKSk7CisgICAgICAgIHJlbmRl
clJlY3RMaXN0LnB1c2hfYmFjayhQbGF0Zm9ybTo6SW50UmVjdChyZWN0LngoKSArIHdpZHRoMSwg
cmVjdC55KCksIHdpZHRoMiwgcmVjdC5oZWlnaHQoKSkpOworICAgIH0gZWxzZSB7CisgICAgICAg
IGludCBoZWlnaHQxID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihyZWN0LmhlaWdodCgpIC8gMi4w
KSk7CisgICAgICAgIGludCBoZWlnaHQyID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcmYocmVjdC5o
ZWlnaHQoKSAvIDIuMCkpOworICAgICAgICByZW5kZXJSZWN0TGlzdC5wdXNoX2JhY2soUGxhdGZv
cm06OkludFJlY3QocmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIGhlaWdodDEpKTsK
KyAgICAgICAgcmVuZGVyUmVjdExpc3QucHVzaF9iYWNrKFBsYXRmb3JtOjpJbnRSZWN0KHJlY3Qu
eCgpLCByZWN0LnkoKSArIGhlaWdodDEsIHJlY3Qud2lkdGgoKSwgaGVpZ2h0MikpOworICAgIH0K
K30KKwordm9pZCBSZW5kZXJSZWN0OjpzcGxpdCgpCit7CisgICAgKyttX3NwbGl0dGluZ0ZhY3Rv
cjsKKworICAgIGJvb2wgdmVydGljYWwgPSAhKG1fc3BsaXR0aW5nRmFjdG9yICUgMik7CisKKyAg
ICBJbnRSZWN0TGlzdCBzdWJSZWN0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3Vi
UmVjdHMuc2l6ZSgpOyArK2kpCisgICAgICAgIHNwbGl0UmVjdEluSGFsZkFuZEFkZFRvTGlzdCht
X3N1YlJlY3RzLmF0KGkpLCB2ZXJ0aWNhbCwgc3ViUmVjdHMpOworICAgIG1fc3ViUmVjdHMuc3dh
cChzdWJSZWN0cyk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IFJlbmRlclJlY3Q6OnJlY3RGb3JS
ZW5kZXJpbmcoKQoreworICAgIEFTU0VSVCghbV9zdWJSZWN0cy5lbXB0eSgpKTsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCByZWN0ID0gbV9zdWJSZWN0c1swXTsKKyAgICBtX3N1YlJlY3RzLmVyYXNl
KG1fc3ViUmVjdHMuYmVnaW4oKSk7CisgICAgcmV0dXJuIHJlY3Q7Cit9CisKK3ZvaWQgUmVuZGVy
UmVjdDo6dXBkYXRlU29ydERpcmVjdGlvbihTb3J0RGlyZWN0aW9uIHByaW1hcnksIFNvcnREaXJl
Y3Rpb24gc2Vjb25kYXJ5KQoreworICAgIGlmIChwcmltYXJ5ID09IG1fcHJpbWFyeVNvcnREaXJl
Y3Rpb24gJiYgc2Vjb25kYXJ5ID09IG1fc2Vjb25kYXJ5U29ydERpcmVjdGlvbikKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9wcmltYXJ5U29ydERpcmVjdGlvbiA9IHByaW1hcnk7CisgICAgbV9z
ZWNvbmRhcnlTb3J0RGlyZWN0aW9uID0gc2Vjb25kYXJ5OworCisgICAgcXVpY2tTb3J0KCk7Cit9
CisKK3ZvaWQgUmVuZGVyUmVjdDo6cXVpY2tTb3J0KCkKK3sKKyAgICBzdGQ6OnNvcnQobV9zdWJS
ZWN0cy5iZWdpbigpLCBtX3N1YlJlY3RzLmJlZ2luKCksIFJlY3RMZXNzVGhhbihtX3ByaW1hcnlT
b3J0RGlyZWN0aW9uLCBtX3NlY29uZGFyeVNvcnREaXJlY3Rpb24pKTsKK30KKworUmVuZGVyUXVl
dWU6OlJlbmRlclF1ZXVlKEJhY2tpbmdTdG9yZVByaXZhdGUqIHBhcmVudCkKKyAgICA6IG1fcGFy
ZW50KHBhcmVudCkKKyAgICAsIG1fcmVjdHNBZGRlZFRvUmVndWxhclJlbmRlckpvYnNJbkN1cnJl
bnRDeWNsZShmYWxzZSkKKyAgICAsIG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hVbmRl
clByZXNzdXJlKGZhbHNlKQorICAgICwgbV9wcmltYXJ5U29ydERpcmVjdGlvbihUb3BUb0JvdHRv
bSkKKyAgICAsIG1fc2Vjb25kYXJ5U29ydERpcmVjdGlvbihMZWZ0VG9SaWdodCkKK3sKK30KKwor
dm9pZCBSZW5kZXJRdWV1ZTo6cmVzZXQoKQoreworICAgIG1fcmVjdHNBZGRlZFRvUmVndWxhclJl
bmRlckpvYnNJbkN1cnJlbnRDeWNsZSA9IGZhbHNlOworICAgIG1fY3VycmVudFJlZ3VsYXJSZW5k
ZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlID0gZmFsc2U7CisgICAgbV9wcmltYXJ5U29ydERpcmVj
dGlvbiA9IFRvcFRvQm90dG9tOworICAgIG1fc2Vjb25kYXJ5U29ydERpcmVjdGlvbiA9IExlZnRU
b1JpZ2h0OworICAgIG1fdmlzaWJsZVpvb21Kb2JzLmNsZWFyKCk7CisgICAgbV92aXNpYmxlU2Ny
b2xsSm9icy5jbGVhcigpOworICAgIG1fdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQuY2xlYXIo
KTsKKyAgICBtX25vblZpc2libGVTY3JvbGxKb2JzLmNsZWFyKCk7CisgICAgbV9ub25WaXNpYmxl
U2Nyb2xsSm9ic0NvbXBsZXRlZC5jbGVhcigpOworICAgIG1fcmVndWxhclJlbmRlckpvYnNSZWdp
b24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbigpOworICAgIG1fY3VycmVudFJlZ3VsYXJSZW5k
ZXJKb2JzQmF0Y2guY2xlYXIoKTsKKyAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNo
UmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb24oKTsKKyAgICBtX3JlZ3VsYXJSZW5kZXJK
b2JzTm90UmVuZGVyZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbigpOworICAgIG1f
cGFyZW50LT5zdG9wUmVuZGVyVGltZXIoKTsKKyAgICBBU1NFUlQoaXNFbXB0eSgpKTsKK30KKwor
aW50IFJlbmRlclF1ZXVlOjpzcGxpdHRpbmdGYWN0b3IoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IHJlY3QpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzcGxpdCB1cCBy
ZWd1bGFyIHJlbmRlciByZWN0IGpvYnMgYW5kIHdlIHdhbnQgaXQgdG8KKyAgICAvLyB0byBiZSB6
b29tIGludmFyaWFudCB3aXRoIHJlc3BlY3QgdG8gV2ViQ29yZS4gSW4gb3RoZXIgd29yZHMsIGlm
IFdlYkNvcmUgc2VuZHMKKyAgICAvLyB1cyBhIHJlY3Qgb2Ygdmlld3BvcnQgc2l6ZSB0byBpbnZh
bGlkYXRlIGF0IHpvb20gMS4wIHRoZW4gd2Ugc3BsaXQgdGhhdCB1cAorICAgIC8vIGluIHRoZSBl
eGFjdCBzYW1lIHdheSB3ZSB3b3VsZCBhdCB6b29tIDIuMC4gVGhlIGFtb3VudCBvZiBjb250ZW50
IHRoYXQgaXMKKyAgICAvLyByZW5kZXJlZCBpbiBhbnkgb25lIHBhc3Mgc2hvdWxkIHN0YXkgZml4
ZWQgd2l0aCByZWdhcmQgdG8gdGhlIHpvb20gbGV2ZWwuCisgICAgUGxhdGZvcm06OkludFJlY3Qg
dW50cmFuc2Zvcm1lZFJlY3QgPSBtX3BhcmVudC0+bV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJhbnNm
b3JtZWQocmVjdCk7CisgICAgZG91YmxlIHJlY3RBcmVhID0gdW50cmFuc2Zvcm1lZFJlY3Qud2lk
dGgoKSAqIHVudHJhbnNmb3JtZWRSZWN0LmhlaWdodCgpOworICAgIFBsYXRmb3JtOjpJbnRTaXpl
IGRlZmF1bHRNYXhMYXlvdXRTaXplID0gV2ViUGFnZVByaXZhdGU6OmRlZmF1bHRNYXhMYXlvdXRT
aXplKCk7CisgICAgZG91YmxlIG1heEFyZWEgPSBkZWZhdWx0TWF4TGF5b3V0U2l6ZS53aWR0aCgp
ICogZGVmYXVsdE1heExheW91dFNpemUuaGVpZ2h0KCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBz
cGxpdEZhY3RvciA9IDEgPDwgMDsKKyAgICBkb3VibGUgcmVuZGVyUmVjdEFyZWEgPSBtYXhBcmVh
IC8gc3BsaXRGYWN0b3I7CisgICAgcmV0dXJuIGNlaWwobG9nKHJlY3RBcmVhIC8gcmVuZGVyUmVj
dEFyZWEpIC8gbG9nKDIuMCkpOworfQorCitSZW5kZXJSZWN0IFJlbmRlclF1ZXVlOjpjb252ZXJ0
VG9SZW5kZXJSZWN0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAg
IHJldHVybiBSZW5kZXJSZWN0KHJlY3QubG9jYXRpb24oKSwgcmVjdC5zaXplKCksIHNwbGl0dGlu
Z0ZhY3RvcihyZWN0KSk7Cit9CisKK2Jvb2wgUmVuZGVyUXVldWU6OmlzRW1wdHkoYm9vbCBzaG91
bGRQZXJmb3JtUmVndWxhclJlbmRlckpvYnMpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdmlzaWJs
ZVpvb21Kb2JzLmVtcHR5KCkgJiYgbV92aXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgpCisgICAgICAg
ICYmICghc2hvdWxkUGVyZm9ybVJlZ3VsYXJSZW5kZXJKb2JzIHx8IG1fY3VycmVudFJlZ3VsYXJS
ZW5kZXJKb2JzQmF0Y2guZW1wdHkoKSkKKyAgICAgICAgJiYgKCFzaG91bGRQZXJmb3JtUmVndWxh
clJlbmRlckpvYnMgfHwgbV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lvbi5pc0VtcHR5KCkpCisgICAg
ICAgICYmIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKTsKK30KKworYm9vbCBSZW5kZXJR
dWV1ZTo6aGFzQ3VycmVudFJlZ3VsYXJSZW5kZXJKb2IoKSBjb25zdAoreworICAgIHJldHVybiAh
bV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaC5lbXB0eSgpIHx8ICFtX3JlZ3VsYXJSZW5k
ZXJKb2JzUmVnaW9uLmlzRW1wdHkoKTsKK30KKworYm9vbCBSZW5kZXJRdWV1ZTo6aGFzQ3VycmVu
dFZpc2libGVab29tSm9iKCkgY29uc3QKK3sKKyAgICByZXR1cm4gIW1fdmlzaWJsZVpvb21Kb2Jz
LmVtcHR5KCk7Cit9CisKK2Jvb2wgUmVuZGVyUXVldWU6Omhhc0N1cnJlbnRWaXNpYmxlU2Nyb2xs
Sm9iKCkgY29uc3QKK3sKKyAgICByZXR1cm4gIW1fdmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKTsK
K30KKworYm9vbCBSZW5kZXJRdWV1ZTo6aXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYihjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kKG1f
dmlzaWJsZVNjcm9sbEpvYnMuYmVnaW4oKSwgbV92aXNpYmxlU2Nyb2xsSm9icy5lbmQoKSwgcmVj
dCkgIT0gbV92aXNpYmxlU2Nyb2xsSm9icy5lbmQoKTsKK30KKworYm9vbCBSZW5kZXJRdWV1ZTo6
aXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYkNvbXBsZXRlZChjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kKG1fdmlzaWJsZVNjcm9sbEpv
YnNDb21wbGV0ZWQuYmVnaW4oKSwgbV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lbmQoKSwg
cmVjdCkgIT0gbV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lbmQoKTsKK30KKworYm9vbCBS
ZW5kZXJRdWV1ZTo6aXNDdXJyZW50UmVndWxhclJlbmRlckpvYihjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lv
bi5pc1JlY3RJblJlZ2lvbihyZWN0KSA9PSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6Q29udGFp
bmVkSW5SZWdpb24KKyAgICAgICAgfHwgbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFJl
Z2lvbi5pc1JlY3RJblJlZ2lvbihyZWN0KSA9PSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6Q29u
dGFpbmVkSW5SZWdpb247Cit9CisKK2Jvb2wgUmVuZGVyUXVldWU6OmN1cnJlbnRSZWd1bGFyUmVu
ZGVySm9iQmF0Y2hVbmRlclByZXNzdXJlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jdXJyZW50
UmVndWxhclJlbmRlckpvYnNCYXRjaFVuZGVyUHJlc3N1cmU7Cit9CisKK3ZvaWQgUmVuZGVyUXVl
dWU6OnNldEN1cnJlbnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hVbmRlclByZXNzdXJlKGJvb2wgY3Vy
cmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlKQoreworICAgIG1fY3VycmVu
dFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlID0gY3VycmVudFJlZ3VsYXJSZW5k
ZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlOworfQorCit2b2lkIFJlbmRlclF1ZXVlOjpldmVudFF1
ZXVlQ3ljbGVkKCkKK3sKKyAgICAvLyBDYWxsZWQgYnkgdGhlIGJhY2tpbmcgc3RvcmUgd2hlbiB0
aGUgZXZlbnQgcXVldWUgaGFzIGN5Y2xlZCB0byBhbGxvdyB0aGUKKyAgICAvLyByZW5kZXIgcXVl
dWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZWd1bGFyIHJlbmRlciBqb2JzIGFyZSB1bmRlciBwcmVz
c3VyZS4KKyAgICBpZiAobV9yZWN0c0FkZGVkVG9SZWd1bGFyUmVuZGVySm9ic0luQ3VycmVudEN5
Y2xlICYmIG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hSZWdpb24uaXNFbXB0eSgpKQor
ICAgICAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoVW5kZXJQcmVzc3VyZSA9IHRy
dWU7CisgICAgbV9yZWN0c0FkZGVkVG9SZWd1bGFyUmVuZGVySm9ic0luQ3VycmVudEN5Y2xlID0g
ZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OmFkZFRvUXVldWUoSm9iVHlwZSB0eXBlLCBj
b25zdCBJbnRSZWN0TGlzdCYgcmVjdExpc3QpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCByZWN0TGlzdC5zaXplKCk7ICsraSkKKyAgICAgICAgYWRkVG9RdWV1ZSh0eXBlLCByZWN0TGlz
dC5hdChpKSk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OmFkZFRvUXVldWUoSm9iVHlwZSB0eXBl
LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAodHlwZSA9PSBOb25W
aXNpYmxlU2Nyb2xsICYmIHN0ZDo6ZmluZChtX3Zpc2libGVTY3JvbGxKb2JzLmJlZ2luKCksIG1f
dmlzaWJsZVNjcm9sbEpvYnMuZW5kKCksIHJlY3QpICE9IG1fdmlzaWJsZVNjcm9sbEpvYnMuZW5k
KCkpCisgICAgICAgIHJldHVybjsgLy8gfHJlY3R8IGlzIGluIGEgaGlnaGVyIHByaW9yaXR5IHF1
ZXVlLgorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBWaXNpYmxlWm9vbToKKyAgICAg
ICAgYWRkVG9TY3JvbGxab29tUXVldWUoY29udmVydFRvUmVuZGVyUmVjdChyZWN0KSwgJm1fdmlz
aWJsZVpvb21Kb2JzKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmlzaWJsZVNjcm9sbDoK
KyAgICAgICAgYWRkVG9TY3JvbGxab29tUXVldWUoY29udmVydFRvUmVuZGVyUmVjdChyZWN0KSwg
Jm1fdmlzaWJsZVNjcm9sbEpvYnMpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBSZWd1bGFy
UmVuZGVyOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBGbGFnIHRoYXQgd2UgYWRkZWQgcmVj
dHMgaW4gdGhlIGN1cnJlbnQgZXZlbnQgcXVldWUgY3ljbGUuCisgICAgICAgICAgICBtX3JlY3Rz
QWRkZWRUb1JlZ3VsYXJSZW5kZXJKb2JzSW5DdXJyZW50Q3ljbGUgPSB0cnVlOworCisgICAgICAg
ICAgICAvLyBXZSB0cnkgYW5kIGRldGVjdCBpZiB0aGlzIG5ld2x5IGFkZGVkIHJlY3QgaW50ZXJz
ZWN0cyBvciBpcyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnRseSBydW5uaW5nCisgICAgICAgICAg
ICAvLyBiYXRjaCBvZiByZW5kZXIgam9icy4gSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBzdGFydCB0
aGUgYmF0Y2ggb3ZlciBzaW5jZSB3ZSBkZWNvbXBvc2UgaW5kaXZpZHVhbAorICAgICAgICAgICAg
Ly8gcmVjdHMgaW50byBzdWJyZWN0cyBhbmQgbWlnaHQgaGF2ZSBhbHJlYWR5IHJlbmRlcmVkIG9u
ZSBvZiB0aGVtLiBJZiB0aGUgd2ViIHBhZ2UncyBjb250ZW50IGhhcworICAgICAgICAgICAgLy8g
Y2hhbmdlZCBzdGF0ZSB0aGVuIHRoaXMgY2FuIGxlYWQgdG8gYXJ0aWZhY3RzLiBXZSBtYXJrIHRo
aXMgYnkgbm90aW5nIHRoZSBiYXRjaCBpcyBub3cgdW5kZXIgcHJlc3N1cmUKKyAgICAgICAgICAg
IC8vIGFuZCB0aGUgYmFja2luZ3N0b3JlIHdpbGwgYXR0ZW1wdCB0byBjbGVhciBpdCBhdCB0aGUg
bmV4dCBhdmFpbGFibGUgb3Bwb3J0dW5pdHkuCisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbjo6SW50ZXJzZWN0aW9uU3RhdGUgc3RhdGUgPSBtX2N1cnJlbnRSZWd1bGFyUmVuZGVy
Sm9ic0JhdGNoUmVnaW9uLmlzUmVjdEluUmVnaW9uKHJlY3QpOworICAgICAgICAgICAgaWYgKHN0
YXRlID09IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpDb250YWluZWRJblJlZ2lvbiB8fCBzdGF0
ZSA9PSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6UGFydGlhbGx5Q29udGFpbmVkSW5SZWdpb24p
IHsKKyAgICAgICAgICAgICAgICBtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9uID0gUGxhdGZvcm06
OkludFJlY3RSZWdpb246OnVuaW9uUmVnaW9ucyhtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9uLCBt
X2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uKTsKKyAgICAgICAgICAgICAgICBt
X2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICAgICAg
bV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uKCk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRj
aFVuZGVyUHJlc3N1cmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkVG9S
ZWd1bGFyUXVldWUocmVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
Tm9uVmlzaWJsZVNjcm9sbDoKKyAgICAgICAgYWRkVG9TY3JvbGxab29tUXVldWUoY29udmVydFRv
UmVuZGVyUmVjdChyZWN0KSwgJm1fbm9uVmlzaWJsZVNjcm9sbEpvYnMpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit2b2lkIFJlbmRlclF1
ZXVlOjphZGRUb1JlZ3VsYXJRdWV1ZShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkKK3sK
KyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICBpZiAobV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lv
bi5pc1JlY3RJblJlZ2lvbihyZWN0KSAhPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6Q29udGFp
bmVkSW5SZWdpb24pIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlbmRlclF1ZXVlOjphZGRUb1JlZ3Vs
YXJRdWV1ZSAlZCwlZCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVj
dC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIH0KKyNl
bmRpZgorCisgICAgLy8gRG8gbm90IGxldCB0aGUgcmVndWxhciByZW5kZXIgcXVldWUgZ3JvdyBw
YXN0IGEgbWF4aW11bSBvZiAzIGRpc2pvaW50IHJlY3RzLgorICAgIGlmIChtX3JlZ3VsYXJSZW5k
ZXJKb2JzUmVnaW9uLm51bVJlY3RzKCkgPiAyKQorICAgICAgICBtX3JlZ3VsYXJSZW5kZXJKb2Jz
UmVnaW9uID0gUGxhdGZvcm06OnVuaW9uT2ZSZWN0cyhtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9u
LmV4dGVudHMoKSwgcmVjdCk7CisgICAgZWxzZQorICAgICAgICBtX3JlZ3VsYXJSZW5kZXJKb2Jz
UmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OnVuaW9uUmVnaW9ucyhtX3JlZ3VsYXJS
ZW5kZXJKb2JzUmVnaW9uLCByZWN0KTsKKworICAgIGlmICghaXNFbXB0eSgpKQorICAgICAgICBt
X3BhcmVudC0+c3RhcnRSZW5kZXJUaW1lcigpOyAvLyBTdGFydCB0aGUgcmVuZGVyIHRpbWVyIHNp
bmNlIHdlIGNvdWxkIGhhdmUgc29tZSBzdGFsZSBjb250ZW50IGhlcmUuLi4KK30KKwordm9pZCBS
ZW5kZXJRdWV1ZTo6YWRkVG9TY3JvbGxab29tUXVldWUoY29uc3QgUmVuZGVyUmVjdCYgcmVjdCwg
UmVuZGVyUmVjdExpc3QqIHJlY3RMaXN0KQoreworICAgIGlmIChzdGQ6OmZpbmQocmVjdExpc3Qt
PmJlZ2luKCksIHJlY3RMaXN0LT5lbmQoKSwgcmVjdCkgIT0gcmVjdExpc3QtPmVuZCgpKQorICAg
ICAgICByZXR1cm47CisKKyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiUmVu
ZGVyUXVldWU6OmFkZFRvU2Nyb2xsWm9vbVF1ZXVlICVkLCVkICVkeCVkIiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0Lmhl
aWdodCgpKTsKKyNlbmRpZgorICAgIHJlY3RMaXN0LT5wdXNoX2JhY2socmVjdCk7CisKKyAgICBp
ZiAoIWlzRW1wdHkoKSkKKyAgICAgICAgbV9wYXJlbnQtPnN0YXJ0UmVuZGVyVGltZXIoKTsgLy8g
U3RhcnQgdGhlIHJlbmRlciB0aW1lciBzaW5jZSB3ZSBrbm93IHdlIGNvdWxkIGhhdmUgc29tZSBj
aGVja2VyYm9hcmQgaGVyZS4uLgorfQorCit2b2lkIFJlbmRlclF1ZXVlOjpxdWlja1NvcnQoUmVu
ZGVyUmVjdExpc3QqIHF1ZXVlKQoreworICAgIHNpemVfdCBsZW5ndGggPSBxdWV1ZS0+c2l6ZSgp
OworICAgIGlmICghbGVuZ3RoKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICBxdWV1ZS0+YXQoaSkudXBkYXRlU29ydERp
cmVjdGlvbihtX3ByaW1hcnlTb3J0RGlyZWN0aW9uLCBtX3NlY29uZGFyeVNvcnREaXJlY3Rpb24p
OworICAgIHJldHVybiBzdGQ6OnNvcnQocXVldWUtPmJlZ2luKCksIHF1ZXVlLT5lbmQoKSwgUmVu
ZGVyUmVjdExlc3NUaGFuKG1fcHJpbWFyeVNvcnREaXJlY3Rpb24sIG1fc2Vjb25kYXJ5U29ydERp
cmVjdGlvbikpOworfQorCit2b2lkIFJlbmRlclF1ZXVlOjp1cGRhdGVTb3J0RGlyZWN0aW9uKGlu
dCBsYXN0RGVsdGFYLCBpbnQgbGFzdERlbHRhWSkKK3sKKyAgICBib29sIHByaW1hcnlJc0hvcml6
b250YWwgPSBhYnMobGFzdERlbHRhWCkgPj0gYWJzKGxhc3REZWx0YVkpOworICAgIGlmIChwcmlt
YXJ5SXNIb3Jpem9udGFsKSB7CisgICAgICAgIG1fcHJpbWFyeVNvcnREaXJlY3Rpb24gPSBsYXN0
RGVsdGFYIDw9IDAgPyBMZWZ0VG9SaWdodCA6IFJpZ2h0VG9MZWZ0OworICAgICAgICBtX3NlY29u
ZGFyeVNvcnREaXJlY3Rpb24gPSBsYXN0RGVsdGFZIDw9IDAgPyBUb3BUb0JvdHRvbSA6IEJvdHRv
bVRvVG9wOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcHJpbWFyeVNvcnREaXJlY3Rpb24gPSBs
YXN0RGVsdGFZIDw9IDAgPyBUb3BUb0JvdHRvbSA6IEJvdHRvbVRvVG9wOworICAgICAgICBtX3Nl
Y29uZGFyeVNvcnREaXJlY3Rpb24gPSBsYXN0RGVsdGFYIDw9IDAgPyBMZWZ0VG9SaWdodCA6IFJp
Z2h0VG9MZWZ0OworICAgIH0KK30KKwordm9pZCBSZW5kZXJRdWV1ZTo6dmlzaWJsZUNvbnRlbnRD
aGFuZ2VkKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiB2aXNpYmxlQ29udGVudCkKK3sKKyAgICBp
ZiAobV92aXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgpICYmIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMu
ZW1wdHkoKSkgeworICAgICAgICBBU1NFUlQobV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5l
bXB0eSgpICYmIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQuZW1wdHkoKSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBNb3ZlIHZpc2libGVTY3JvbGxKb2JzIHRvIG5v
blZpc2libGVTY3JvbGxKb2JzIGlmIHRoZXkgZG8gbm90IGludGVyc2VjdAorICAgIC8vIHRoZSB2
aXNpYmxlIGNvbnRlbnQgcmVjdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdmlzaWJs
ZVNjcm9sbEpvYnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVuZGVyUmVjdCByZWN0ID0gbV92
aXNpYmxlU2Nyb2xsSm9icy5hdChpKTsKKyAgICAgICAgaWYgKCFyZWN0LmludGVyc2VjdHModmlz
aWJsZUNvbnRlbnQpKSB7CisgICAgICAgICAgICBtX3Zpc2libGVTY3JvbGxKb2JzLmVyYXNlKG1f
dmlzaWJsZVNjcm9sbEpvYnMuYmVnaW4oKSArIGkpOworICAgICAgICAgICAgYWRkVG9TY3JvbGxa
b29tUXVldWUocmVjdCwgJm1fbm9uVmlzaWJsZVNjcm9sbEpvYnMpOworICAgICAgICAgICAgLS1p
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRG8gdGhlIHNhbWUgZm9yIHRoZSBjb21wbGV0
ZWQgbGlzdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdmlzaWJsZVNjcm9sbEpvYnND
b21wbGV0ZWQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVuZGVyUmVjdCByZWN0ID0gbV92aXNp
YmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5hdChpKTsKKyAgICAgICAgaWYgKCFyZWN0LmludGVyc2Vj
dHModmlzaWJsZUNvbnRlbnQpKSB7CisgICAgICAgICAgICBtX3Zpc2libGVTY3JvbGxKb2JzQ29t
cGxldGVkLmVyYXNlKG1fdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQuYmVnaW4oKSArIGkpOwor
ICAgICAgICAgICAgYWRkVG9TY3JvbGxab29tUXVldWUocmVjdCwgJm1fbm9uVmlzaWJsZVNjcm9s
bEpvYnNDb21wbGV0ZWQpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gTW92ZSBub25WaXNpYmxlU2Nyb2xsSm9icyB0byB2aXNpYmxlU2Nyb2xsSm9icyBpZiB0
aGV5IGRvIGludGVyc2VjdAorICAgIC8vIHRoZSB2aXNpYmxlIGNvbnRlbnQgcmVjdC4KKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuc2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgUmVuZGVyUmVjdCByZWN0ID0gbV9ub25WaXNpYmxlU2Nyb2xsSm9icy5hdChp
KTsKKyAgICAgICAgaWYgKHJlY3QuaW50ZXJzZWN0cyh2aXNpYmxlQ29udGVudCkpIHsKKyAgICAg
ICAgICAgIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuZXJhc2UobV9ub25WaXNpYmxlU2Nyb2xsSm9i
cy5iZWdpbigpICsgaSk7CisgICAgICAgICAgICBhZGRUb1Njcm9sbFpvb21RdWV1ZShyZWN0LCAm
bV92aXNpYmxlU2Nyb2xsSm9icyk7CisgICAgICAgICAgICAtLWk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICAvLyBEbyB0aGUgc2FtZSBmb3IgdGhlIGNvbXBsZXRlZCBsaXN0LgorICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbV9ub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5zaXplKCk7
ICsraSkgeworICAgICAgICBSZW5kZXJSZWN0IHJlY3QgPSBtX25vblZpc2libGVTY3JvbGxKb2Jz
Q29tcGxldGVkLmF0KGkpOworICAgICAgICBpZiAocmVjdC5pbnRlcnNlY3RzKHZpc2libGVDb250
ZW50KSkgeworICAgICAgICAgICAgbV9ub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lcmFz
ZShtX25vblZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLmJlZ2luKCkgKyBpKTsKKyAgICAgICAg
ICAgIGFkZFRvU2Nyb2xsWm9vbVF1ZXVlKHJlY3QsICZtX3Zpc2libGVTY3JvbGxKb2JzQ29tcGxl
dGVkKTsKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3Zp
c2libGVTY3JvbGxKb2JzLmVtcHR5KCkgJiYgIW1fdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQu
ZW1wdHkoKSkKKyAgICAgICAgdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQoZmFsc2UgLypzaG91
bGRCbGl0Ki8pOworCisgICAgaWYgKG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKSAmJiAh
bV9ub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lbXB0eSgpKQorICAgICAgICBub25WaXNp
YmxlU2Nyb2xsSm9ic0NvbXBsZXRlZCgpOworCisgICAgLy8gV2Ugc2hvdWxkbid0IGJlIGVtcHR5
IGJlY2F1c2UgdGhlIGVhcmx5IHJldHVybiBhYm92ZSBhbmQgdGhlIGZhY3QgdGhhdCB0aGlzCisg
ICAgLy8gbWV0aG9kIGp1c3Qgc2h1ZmZsZXMgcmVjdHMgZnJvbSBxdWV1ZSB0byBxdWV1ZSBoZW5j
ZSB0aGUgdG90YWwgbnVtYmVyIG9mCisgICAgLy8gcmVjdHMgaW4gdGhlIHZhcmlvdXMgcXVldWVz
IHNob3VsZCBiZSBjb25zZXJ2ZWQuCisgICAgQVNTRVJUKCFpc0VtcHR5KCkpOworfQorCit2b2lk
IFJlbmRlclF1ZXVlOjpjbGVhcihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgcmVnaW9u
LCBib29sIGNsZWFyUmVndWxhclJlbmRlckpvYnMpCit7CisgICAgSW50UmVjdExpc3QgcmVjdHMg
PSByZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlY3RzLnNpemUo
KTsgKytpKQorICAgICAgICBjbGVhcihyZWN0cy5hdChpKSwgY2xlYXJSZWd1bGFyUmVuZGVySm9i
cyk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OmNsZWFyKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiByZWN0LCBib29sIGNsZWFyUmVndWxhclJlbmRlckpvYnMpCit7CisgICAgaWYgKG1fdmlzaWJs
ZVNjcm9sbEpvYnMuZW1wdHkoKSAmJiBtX25vblZpc2libGVTY3JvbGxKb2JzLmVtcHR5KCkpCisg
ICAgICAgIEFTU0VSVChtX3Zpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLmVtcHR5KCkgJiYgbV9u
b25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lbXB0eSgpKTsKKworICAgIC8vIFJlbW92ZSBh
bGwgcmVjdHMgZnJvbSBhbGwgcXVldWVzIHRoYXQgYXJlIGNvbnRhaW5lZCBieSB0aGlzIHJlY3Qu
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3Zpc2libGVTY3JvbGxKb2JzLnNpemUoKTsg
KytpKSB7CisgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fdmlzaWJsZVNjcm9sbEpvYnMuYXQo
aSkpKSB7CisgICAgICAgICAgICBtX3Zpc2libGVTY3JvbGxKb2JzLmVyYXNlKG1fdmlzaWJsZVNj
cm9sbEpvYnMuYmVnaW4oKSArIGkpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAg
fQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3Zpc2libGVTY3JvbGxKb2JzQ29tcGxl
dGVkLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fdmlzaWJsZVNj
cm9sbEpvYnNDb21wbGV0ZWQuYXQoaSkpKSB7CisgICAgICAgICAgICBtX3Zpc2libGVTY3JvbGxK
b2JzQ29tcGxldGVkLmVyYXNlKG1fdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQuYmVnaW4oKSAr
IGkpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX25vblZpc2libGVTY3JvbGxKb2JzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuYXQoaSkpKSB7Cisg
ICAgICAgICAgICBtX25vblZpc2libGVTY3JvbGxKb2JzLmVyYXNlKG1fbm9uVmlzaWJsZVNjcm9s
bEpvYnMuYmVnaW4oKSArIGkpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQor
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX25vblZpc2libGVTY3JvbGxKb2JzQ29tcGxl
dGVkLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fbm9uVmlzaWJs
ZVNjcm9sbEpvYnNDb21wbGV0ZWQuYXQoaSkpKSB7CisgICAgICAgICAgICBtX25vblZpc2libGVT
Y3JvbGxKb2JzQ29tcGxldGVkLmVyYXNlKG1fbm9uVmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQu
YmVnaW4oKSArIGkpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQorCisgICAg
Ly8gT25seSBjbGVhciB0aGUgcmVndWxhciByZW5kZXIgam9icyBpZiB0aGUgZmxhZyBoYXMgYmVl
biBzZXQuCisgICAgaWYgKGNsZWFyUmVndWxhclJlbmRlckpvYnMpCisgICAgICAgIHRoaXMtPmNs
ZWFyUmVndWxhclJlbmRlckpvYnMocmVjdCk7CisKKyAgICBpZiAobV92aXNpYmxlU2Nyb2xsSm9i
cy5lbXB0eSgpICYmICFtX3Zpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLmVtcHR5KCkpCisgICAg
ICAgIHZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkKGZhbHNlIC8qc2hvdWxkQmxpdCovKTsKKwor
ICAgIGlmIChtX25vblZpc2libGVTY3JvbGxKb2JzLmVtcHR5KCkgJiYgIW1fbm9uVmlzaWJsZVNj
cm9sbEpvYnNDb21wbGV0ZWQuZW1wdHkoKSkKKyAgICAgICAgbm9uVmlzaWJsZVNjcm9sbEpvYnND
b21wbGV0ZWQoKTsKKworICAgIGlmIChpc0VtcHR5KCkpCisgICAgICAgICBtX3BhcmVudC0+c3Rv
cFJlbmRlclRpbWVyKCk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OmNsZWFyUmVndWxhclJlbmRl
ckpvYnMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpCit7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoLnNpemUoKTsgKytpKSB7
CisgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0
Y2guYXQoaSkpKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNo
LmVyYXNlKG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2guYmVnaW4oKSArIGkpOworICAg
ICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQorICAgIG1fcmVndWxhclJlbmRlckpvYnNS
ZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKG1fcmVndWxh
clJlbmRlckpvYnNSZWdpb24sIHJlY3QpOworICAgIG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2Jz
QmF0Y2hSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKG1f
Y3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hSZWdpb24sIHJlY3QpOworICAgIG1fcmVndWxh
clJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpz
dWJ0cmFjdFJlZ2lvbnMobV9yZWd1bGFyUmVuZGVySm9ic05vdFJlbmRlcmVkUmVnaW9uLCByZWN0
KTsKK30KKwordm9pZCBSZW5kZXJRdWV1ZTo6Y2xlYXJWaXNpYmxlWm9vbSgpCit7CisgICAgbV92
aXNpYmxlWm9vbUpvYnMuY2xlYXIoKTsKKyAgICBpZiAoaXNFbXB0eSgpKQorICAgICAgICAgbV9w
YXJlbnQtPnN0b3BSZW5kZXJUaW1lcigpOworfQorCitib29sIFJlbmRlclF1ZXVlOjpyZWd1bGFy
UmVuZGVySm9ic1ByZXZpb3VzbHlBdHRlbXB0ZWRCdXROb3RSZW5kZXJlZChjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gbV9yZWd1bGFyUmVuZGVySm9ic05vdFJl
bmRlcmVkUmVnaW9uLmlzUmVjdEluUmVnaW9uKHJlY3QpICE9IFBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uOjpOb3RJblJlZ2lvbjsKK30KKwordm9pZCBSZW5kZXJRdWV1ZTo6cmVuZGVyKGJvb2wgc2hv
dWxkUGVyZm9ybVJlZ3VsYXJSZW5kZXJKb2JzKQoreworICAgIC8vIFdlIHJlcXVlc3QgYSBsYXlv
dXQgaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSdyZSBleGVjdXRpbmcgam9icyBpbiB0aGUgY29ycmVj
dAorICAgIC8vIG9yZGVyLiBJZiB3ZSBkaWRuJ3QgcmVxdWVzdCBhIGxheW91dCBoZXJlIHRoZW4g
dGhlIGpvYnMgYmVsb3cgY291bGQgcmVzdWx0CisgICAgLy8gaW4gYSBsYXlvdXQgYW5kIHRoYXQg
bGF5b3V0IGNhbiBhbHRlciB0aGlzIHF1ZXVlLiBTbyByZXF1ZXN0IGxheW91dCBpZiBuZWVkZWQK
KyAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgcXVldWVzIGJlbG93IGFyZSBpbiBjb25zdGFudCBz
dGF0ZSBiZWZvcmUgcGVyZm9ybWluZyB0aGUKKyAgICAvLyBuZXh0IHJlbmRlcmluZyBqb2IuCisK
KyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICAvLyBTdGFydCB0aGUgdGltZSBtZWFzdXJlbWVu
dC4KKyAgICBkb3VibGUgdGltZSA9IFdURjo6Y3VycmVudFRpbWUoKTsKKyNlbmRpZgorCisgICAg
bV9wYXJlbnQtPnJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworCisjaWYgREVCVUdfUkVOREVSX1FV
RVVFCisgICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJlbnRUaW1lKCkgLSB0aW1lOworICAg
IGlmIChlbGFwc2VkKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiUmVuZGVyUXVldWU6OnJlbmRlciBsYXlv
dXQgZWxhcHNlZD0lZiIsIGVsYXBzZWQpOworI2VuZGlmCisKKyAgICAvLyBFbXB0eSB0aGUgcXVl
dWVzIGluIGEgcHJlY2lzZSBvcmRlciBvZiBwcmlvcml0eS4KKyAgICBpZiAoIW1fdmlzaWJsZVpv
b21Kb2JzLmVtcHR5KCkpCisgICAgICAgIHJlbmRlclZpc2libGVab29tSm9iKCk7CisgICAgZWxz
ZSBpZiAoIW1fdmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKSkKKyAgICAgICAgcmVuZGVyVmlzaWJs
ZVNjcm9sbEpvYigpOworICAgIGVsc2UgaWYgKHNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9i
cyAmJiAoIW1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2guZW1wdHkoKSB8fCAhbV9yZWd1
bGFyUmVuZGVySm9ic1JlZ2lvbi5pc0VtcHR5KCkpKSB7CisgICAgICAgIGlmIChjdXJyZW50UmVn
dWxhclJlbmRlckpvYkJhdGNoVW5kZXJQcmVzc3VyZSgpKQorICAgICAgICAgICAgcmVuZGVyQWxs
Q3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJl
bmRlclJlZ3VsYXJSZW5kZXJKb2IoKTsKKyAgICB9IGVsc2UgaWYgKCFtX25vblZpc2libGVTY3Jv
bGxKb2JzLmVtcHR5KCkpCisgICAgICAgIHJlbmRlck5vblZpc2libGVTY3JvbGxKb2IoKTsKKwor
ICAgIGlmIChpc0VtcHR5KCkpCisgICAgICAgIG1fcGFyZW50LT5zdG9wUmVuZGVyVGltZXIoKTsK
K30KKwordm9pZCBSZW5kZXJRdWV1ZTo6cmVuZGVyQWxsQ3VycmVudFJlZ3VsYXJSZW5kZXJKb2Jz
KCkKK3sKKyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICAvLyBTdGFydCB0aGUgdGltZSBtZWFz
dXJlbWVudC4uLgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50VGltZSgpOworI2VuZGlm
CisKKyAgICAvLyBSZXF1ZXN0IGxheW91dCBmaXJzdAorICAgIG1fcGFyZW50LT5yZXF1ZXN0TGF5
b3V0SWZOZWVkZWQoKTsKKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorICAgIGRvdWJsZSBlbGFw
c2VkID0gV1RGOjpjdXJyZW50VGltZSgpIC0gdGltZTsKKyAgICBpZiAoZWxhcHNlZCkKKyAgICAg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2
ZWxDcml0aWNhbCwgIlJlbmRlclF1ZXVlOjpyZW5kZXJBbGxDdXJyZW50UmVndWxhclJlbmRlckpv
YnMgbGF5b3V0IGVsYXBzZWQ9JWYiLCBlbGFwc2VkKTsKKyNlbmRpZgorCisgICAgLy8gVGhlIHN0
YXRlIG9mIHJlbmRlciBxdWV1ZSBtYXkgYmUgbW9kaWZpZWQgZnJvbSBpbnNpZGUgcmVxdWVzdExh
eW91dElmTmVlZGVkLgorICAgIC8vIEluIGZhY3QsIGl0IGNhbiBldmVuIGJlIGVtcHRpZWQgZW50
aXJlbHkhIExheW91dCBjYW4gdHJpZ2dlciBhIGNhbGwgdG8KKyAgICAvLyBSZW5kZXJRdWV1ZTo6
Y2xlYXIuIFNlZSBQUiMxMDE4MTEgZm9yIGluc3RhbmNlLiBTbyB3ZSBzaG91bGQgY2hlY2sgYWdh
aW4gaGVyZS4KKyAgICBpZiAoIWhhc0N1cnJlbnRSZWd1bGFyUmVuZGVySm9iKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgYmF0Y2ggb2Ygam9icywg
dGhlbiBjcmVhdGUgb25lLgorICAgIGlmIChtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNo
UmVnaW9uLmlzRW1wdHkoKSkgeworCisgICAgICAgIC8vIENyZWF0ZSBhIGN1cnJlbnQgcmVnaW9u
IG9iamVjdCBmcm9tIG91ciByZWd1bGFyIHJlbmRlciByZWdpb24uCisgICAgICAgIG1fY3VycmVu
dFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hSZWdpb24gPSBtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9u
OworCisgICAgICAgIC8vIENsZWFyIHRoaXMgc2luY2Ugd2UncmUgYWJvdXQgdG8gcmVuZGVyIGV2
ZXJ5dGhpbmcuCisgICAgICAgIG1fcmVndWxhclJlbmRlckpvYnNSZWdpb24gPSBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbigpOworICAgIH0KKworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHJl
Z2lvbk5vdFJlbmRlcmVkOworICAgIGlmIChtX3BhcmVudC0+c2hvdWxkU3VwcHJlc3NOb25WaXNp
YmxlUmVndWxhclJlbmRlckpvYnMoKSkgeworICAgICAgICAvLyBSZWNvcmQgYW55IHBhcnQgb2Yg
dGhlIHJlZ2lvbiB0aGF0IGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBjdXJyZW50IHZpc2libGUgY29u
dGVudHMgcmVjdC4KKyAgICAgICAgcmVnaW9uTm90UmVuZGVyZWQgPSBQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hS
ZWdpb24sIG1fcGFyZW50LT52aXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgICAgICBtX3JlZ3Vs
YXJSZW5kZXJKb2JzTm90UmVuZGVyZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6
dW5pb25SZWdpb25zKG1fcmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbiwgcmVnaW9u
Tm90UmVuZGVyZWQpOworCisjaWYgREVCVUdfUkVOREVSX1FVRVVFCisgICAgICAgIGlmICghcmVn
aW9uTm90UmVuZGVyZWQuaXNFbXB0eSgpKQorICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlbmRlclF1
ZXVlOjpyZW5kZXJBbGxDdXJyZW50UmVndWxhclJlbmRlckpvYnMgcmVnaW9uIG5vdCBjb21wbGV0
ZWx5IHJlbmRlcmVkISIpOworI2VuZGlmCisKKyAgICAgICAgLy8gQ2xpcCB0byB0aGUgdmlzaWJs
ZSBjb250ZW50cyBzbyB3ZSdsbCBiZSBmYXN0ZXIuCisgICAgICAgIG1fY3VycmVudFJlZ3VsYXJS
ZW5kZXJKb2JzQmF0Y2hSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0
UmVnaW9ucyhtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uLCBtX3BhcmVudC0+
dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICB9CisKKyAgICBib29sIHJlbmRlcmVkID0gZmFs
c2U7CisgICAgaWYgKCFtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uLmlzRW1w
dHkoKSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxQbGF0Zm9ybTo6SW50UmVjdD4gcmVjdExpc3Qg
PSBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uLnJlY3RzKCk7CisgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdExpc3Quc2l6ZSgpOyArK2kpCisgICAgICAgICAg
ICByZW5kZXJlZCA9IG1fcGFyZW50LT5yZW5kZXIocmVjdExpc3QuYXQoaSkpID8gdHJ1ZSA6IHJl
bmRlcmVkOworICAgIH0KKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorICAgIC8vIFN0b3AgdGhl
IHRpbWUgbWVhc3VyZW1lbnQuCisgICAgZWxhcHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRp
bWU7CisgICAgUGxhdGZvcm06OkludFJlY3QgZXh0ZW50cyA9IG1fY3VycmVudFJlZ3VsYXJSZW5k
ZXJKb2JzQmF0Y2hSZWdpb24uZXh0ZW50cygpOworICAgIGludCBudW1iZXJPZlJlY3RzID0gbV9j
dXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFJlZ2lvbi5yZWN0cygpLnNpemUoKTsKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENy
aXRpY2FsLCAiUmVuZGVyUXVldWU6OnJlbmRlckFsbEN1cnJlbnRSZWd1bGFyUmVuZGVySm9icyBl
eHRlbnRzPSglZCwlZCAlZHglZCkgbnVtYmVyT2ZSZWN0cz0lZCBlbGFwc2VkPSVmIiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGV4dGVudHMueCgpLCBleHRlbnRzLnkoKSwgZXh0ZW50cy53
aWR0aCgpLCBleHRlbnRzLmhlaWdodCgpLCBudW1iZXJPZlJlY3RzLCBlbGFwc2VkKTsKKyNlbmRp
ZgorCisgICAgLy8gQ2xlYXIgdGhlIHJlZ2lvbiBhbmQgYmxpdCBzaW5jZSB0aGlzIGJhdGNoIGlz
IG5vdyBjb21wbGV0ZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCByZW5kZXJlZFJlY3QgPSBtX2N1
cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uLmV4dGVudHMoKTsKKyAgICBtX2N1cnJl
bnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoLmNsZWFyKCk7CisgICAgbV9jdXJyZW50UmVndWxhclJl
bmRlckpvYnNCYXRjaFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKCk7CisgICAgbV9j
dXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFVuZGVyUHJlc3N1cmUgPSBmYWxzZTsKKworICAg
IC8vIFVwZGF0ZSB0aGUgc2NyZWVuIG9ubHkgaWYgd2UncmUgbm90IHNjcm9sbGluZyBvciB6b29t
aW5nLgorICAgIGlmIChyZW5kZXJlZCAmJiAhbV9wYXJlbnQtPmlzU2Nyb2xsaW5nT3Jab29taW5n
KCkpIHsKKyAgICAgICAgaWYgKCFtX3BhcmVudC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5k
b3coKSkKKyAgICAgICAgICAgIG1fcGFyZW50LT5ibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIG1fcGFyZW50LT5pbnZhbGlkYXRlV2luZG93KCk7CisgICAg
ICAgIG1fcGFyZW50LT5tX3dlYlBhZ2UtPmNsaWVudCgpLT5ub3RpZnlDb250ZW50UmVuZGVyZWQo
cmVuZGVyZWRSZWN0KTsKKyAgICB9CisKKyAgICBpZiAobV9wYXJlbnQtPnNob3VsZFN1cHByZXNz
Tm9uVmlzaWJsZVJlZ3VsYXJSZW5kZXJKb2JzKCkgJiYgIXJlZ2lvbk5vdFJlbmRlcmVkLmlzRW1w
dHkoKSkKKyAgICAgICAgbV9wYXJlbnQtPnVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJl
ZFJlZ2lvbihmYWxzZSAvKmNoZWNrTG9hZGluZyovKTsKK30KKwordm9pZCBSZW5kZXJRdWV1ZTo6
c3RhcnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hJZk5lZWRlZCgpCit7CisgICAgaWYgKCFtX2N1cnJl
bnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoLmVtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIERlY29tcG9zZSB0aGUgY3VycmVudCByZWd1bGFyIHJlbmRlciBqb2IgcmVnaW9uIGludG8g
cmVuZGVyIHJlY3QgcGllY2VzLgorICAgIEludFJlY3RMaXN0IHJlZ3VsYXJSZW5kZXJKb2JzID0g
bV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lvbi5yZWN0cygpOworCisgICAgLy8gVGhlIGN1cnJlbnQg
YmF0Y2guLi4KKyAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoID0gcmVndWxhclJl
bmRlckpvYnM7CisKKyAgICAvLyBDcmVhdGUgYSByZWdpb24gb2JqZWN0IHRoYXQgd2lsbCBiZSBj
aGVja2VkIHdoZW4gYWRkaW5nIG5ldyByZWN0cyBiZWZvcmUKKyAgICAvLyB0aGlzIGJhdGNoIGhh
cyBiZWVuIGNvbXBsZXRlZC4KKyAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVn
aW9uID0gbV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lvbjsKKworICAgIC8vIENsZWFyIHRoZSBmb3Jt
ZXIgcmVnaW9uIHNpbmNlIGl0IGlzIG5vdyBwYXJ0IG9mIHRoaXMgYmF0Y2guCisgICAgbV9yZWd1
bGFyUmVuZGVySm9ic1JlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKCk7CisKKyNpZiBE
RUJVR19SRU5ERVJfUVVFVUUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiUmVuZGVyUXVldWU6OnN0YXJ0UmVndWxh
clJlbmRlckpvYkJhdGNoSWZOZWVkZWQgYmF0Y2ggc2l6ZSBpcyAlZCEiLCBtX2N1cnJlbnRSZWd1
bGFyUmVuZGVySm9ic0JhdGNoLnNpemUoKSk7CisjZW5kaWYKK30KKwordm9pZCBSZW5kZXJRdWV1
ZTo6cmVuZGVyVmlzaWJsZVpvb21Kb2IoKQoreworICAgIEFTU0VSVChtX3Zpc2libGVab29tSm9i
cy5zaXplKCkgPiAwKTsKKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorICAgIC8vIFN0YXJ0IHRo
ZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50VGltZSgp
OworI2VuZGlmCisKKyAgICBSZW5kZXJSZWN0KiByZWN0ID0gJm1fdmlzaWJsZVpvb21Kb2JzWzBd
OworICAgIEFTU0VSVCghcmVjdC0+aXNDb21wbGV0ZWQoKSk7CisgICAgUGxhdGZvcm06OkludFJl
Y3Qgc3ViUmVjdCA9IHJlY3QtPnJlY3RGb3JSZW5kZXJpbmcoKTsKKyAgICBpZiAocmVjdC0+aXND
b21wbGV0ZWQoKSkKKyAgICAgICAgbV92aXNpYmxlWm9vbUpvYnMuZXJhc2UobV92aXNpYmxlWm9v
bUpvYnMuYmVnaW4oKSk7CisKKyAgICBtX3BhcmVudC0+cmVuZGVyKHN1YlJlY3QpOworCisgICAg
Ly8gUmVjb3JkIHRoYXQgaXQgaGFzIG5vdyBiZWVuIHJlbmRlcmVkIHZpYSBhIGRpZmZlcmVudCB0
eXBlIG9mIGpvYi4uLgorICAgIGNsZWFyUmVndWxhclJlbmRlckpvYnMoc3ViUmVjdCk7CisKKyNp
ZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50Cisg
ICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJlbnRUaW1lKCkgLSB0aW1lOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsICJSZW5kZXJRdWV1ZTo6cmVuZGVyVmlzaWJsZVpvb21Kb2IgcmVjdD0oJWQsJWQgJWR4JWQp
IGVsYXBzZWQ9JWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVjdC54KCksIHN1
YlJlY3QueSgpLCBzdWJSZWN0LndpZHRoKCksIHN1YlJlY3QuaGVpZ2h0KCksIGVsYXBzZWQpOwor
I2VuZGlmCit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OnJlbmRlclZpc2libGVTY3JvbGxKb2IoKQor
eworICAgIEFTU0VSVCghbV92aXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgpKTsKKworI2lmIERFQlVH
X1JFTkRFUl9RVUVVRSB8fCBERUJVR19SRU5ERVJfUVVFVUVfU09SVAorICAgIC8vIFN0YXJ0IHRo
ZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50VGltZSgp
OworI2VuZGlmCisKKyAgICBxdWlja1NvcnQoJm1fdmlzaWJsZVNjcm9sbEpvYnMpOworCisjaWYg
REVCVUdfUkVOREVSX1FVRVVFX1NPUlQKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50
CisgICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJlbnRUaW1lKCkgLSB0aW1lOworICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3Jp
dGljYWwsICJSZW5kZXJRdWV1ZTo6cmVuZGVyVmlzaWJsZVNjcm9sbEpvYiBzb3J0IGVsYXBzZWQ9
JWYiLCBlbGFwc2VkKTsKKyNlbmRpZgorCisgICAgUmVuZGVyUmVjdCByZWN0ID0gbV92aXNpYmxl
U2Nyb2xsSm9ic1swXTsKKyAgICBtX3Zpc2libGVTY3JvbGxKb2JzLmVyYXNlKG1fdmlzaWJsZVNj
cm9sbEpvYnMuYmVnaW4oKSk7CisKKyAgICBBU1NFUlQoIXJlY3QuaXNDb21wbGV0ZWQoKSk7Cisg
ICAgUGxhdGZvcm06OkludFJlY3Qgc3ViUmVjdCA9IHJlY3QucmVjdEZvclJlbmRlcmluZygpOwor
ICAgIGlmIChyZWN0LmlzQ29tcGxldGVkKCkpCisgICAgICAgIG1fdmlzaWJsZVNjcm9sbEpvYnND
b21wbGV0ZWQucHVzaF9iYWNrKHJlY3QpOworICAgIGVsc2UKKyAgICAgICAgbV92aXNpYmxlU2Ny
b2xsSm9icy5pbnNlcnQobV92aXNpYmxlU2Nyb2xsSm9icy5iZWdpbigpLCByZWN0KTsKKworICAg
IG1fcGFyZW50LT5yZW5kZXIoc3ViUmVjdCk7CisKKyAgICAvLyBSZWNvcmQgdGhhdCBpdCBoYXMg
bm93IGJlZW4gcmVuZGVyZWQgdmlhIGEgZGlmZmVyZW50IHR5cGUgb2Ygam9iLi4uCisgICAgY2xl
YXJSZWd1bGFyUmVuZGVySm9icyhzdWJSZWN0KTsKKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQor
ICAgIC8vIFN0b3AgdGhlIHRpbWUgbWVhc3VyZW1lbnQKKyAgICBkb3VibGUgZWxhcHNlZCA9IFdU
Rjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlbmRlclF1ZXVlOjpyZW5k
ZXJWaXNpYmxlU2Nyb2xsSm9iIHJlY3Q9KCVkLCVkICVkeCVkKSBlbGFwc2VkPSVmIiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN1YlJlY3QueCgpLCBzdWJSZWN0LnkoKSwgc3ViUmVjdC53
aWR0aCgpLCBzdWJSZWN0LmhlaWdodCgpLCBlbGFwc2VkKTsKKyNlbmRpZgorCisgICAgaWYgKG1f
dmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKSkKKyAgICAgICAgdmlzaWJsZVNjcm9sbEpvYnNDb21w
bGV0ZWQodHJ1ZSAvKnNob3VsZEJsaXQqLyk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OnJlbmRl
clJlZ3VsYXJSZW5kZXJKb2IoKQoreworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorICAgIC8vIFN0
YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50
VGltZSgpOworI2VuZGlmCisKKyAgICBBU1NFUlQoIW1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2Jz
QmF0Y2guZW1wdHkoKSB8fCAhbV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lvbi5pc0VtcHR5KCkpOwor
CisgICAgc3RhcnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hJZk5lZWRlZCgpOworCisgICAgLy8gVGFr
ZSB0aGUgZmlyc3Qgam9iIGZyb20gdGhlIHJlZ3VsYXIgcmVuZGVyIGpvYiBxdWV1ZS4KKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCByZWN0ID0gbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFsw
XTsKKyAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uID0gUGxhdGZvcm06
OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9i
c0JhdGNoUmVnaW9uLCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbihyZWN0KSk7CisgICAgbV9jdXJy
ZW50UmVndWxhclJlbmRlckpvYnNCYXRjaC5lcmFzZShtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9i
c0JhdGNoLmJlZ2luKCkpOworCisgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gcmVnaW9uTm90
UmVuZGVyZWQ7CisgICAgaWYgKG1fcGFyZW50LT5zaG91bGRTdXBwcmVzc05vblZpc2libGVSZWd1
bGFyUmVuZGVySm9icygpKSB7CisgICAgICAgIC8vIFJlY29yZCBhbnkgcGFydCBvZiB0aGUgcmVn
aW9uIHRoYXQgZG9lc24ndCBpbnRlcnNlY3QgdGhlIGN1cnJlbnQgdmlzaWJsZSB0aWxlcyByZWN0
LgorICAgICAgICByZWdpb25Ob3RSZW5kZXJlZCA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpz
dWJ0cmFjdFJlZ2lvbnMocmVjdCwgbV9wYXJlbnQtPnZpc2libGVDb250ZW50c1JlY3QoKSk7Cisg
ICAgICAgIG1fcmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbiA9IFBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uOjp1bmlvblJlZ2lvbnMobV9yZWd1bGFyUmVuZGVySm9ic05vdFJlbmRlcmVk
UmVnaW9uLCByZWdpb25Ob3RSZW5kZXJlZCk7CisKKyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAg
ICAgICAgaWYgKCFyZWdpb25Ob3RSZW5kZXJlZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3Jp
dGljYWwsICJSZW5kZXJRdWV1ZTo6cmVuZGVyUmVndWxhclJlbmRlckpvYiByZWN0ICglZCwlZCAl
ZHglZCkgbm90IGNvbXBsZXRlbHkgcmVuZGVyZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQo
KSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIENsaXAgdG8gdGhlIHZpc2libGUg
dGlsZXMgc28gd2UnbGwgYmUgZmFzdGVyLgorICAgICAgICByZWN0LmludGVyc2VjdChtX3BhcmVu
dC0+dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICB9CisKKyAgICBpZiAoIXJlY3QuaXNFbXB0
eSgpKQorICAgICAgICBtX3BhcmVudC0+cmVuZGVyKHJlY3QpOworCisjaWYgREVCVUdfUkVOREVS
X1FVRVVFCisgICAgLy8gU3RvcCB0aGUgdGltZSBtZWFzdXJlbWVudC4KKyAgICBkb3VibGUgZWxh
cHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlbmRlclF1
ZXVlOjpyZW5kZXJSZWd1bGFyUmVuZGVySm9iIHJlY3Q9KCVkLCVkICVkeCVkKSBlbGFwc2VkPSVm
IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53
aWR0aCgpLCByZWN0LmhlaWdodCgpLCBlbGFwc2VkKTsKKyNlbmRpZgorCisgICAgaWYgKG1fY3Vy
cmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2guZW1wdHkoKSkgeworICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdCByZW5kZXJlZFJlY3QgPSBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVn
aW9uLmV4dGVudHMoKTsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIHJlZ2lvbiBhbmQgdGhlIGFuZCBi
bGl0IHNpbmNlIHRoaXMgYmF0Y2ggaXMgbm93IGNvbXBsZXRlLgorICAgICAgICBtX2N1cnJlbnRS
ZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb24oKTsK
KyAgICAgICAgbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFVuZGVyUHJlc3N1cmUgPSBm
YWxzZTsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzY3JlZW4gb25seSBpZiB3ZSdyZSBub3Qgc2Ny
b2xsaW5nIG9yIHpvb21pbmcuCisgICAgICAgIGlmICghbV9wYXJlbnQtPmlzU2Nyb2xsaW5nT3Ja
b29taW5nKCkpIHsKKyAgICAgICAgICAgIGlmICghbV9wYXJlbnQtPnNob3VsZERpcmVjdFJlbmRl
cmluZ1RvV2luZG93KCkpCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPmJsaXRWaXNpYmxlQ29u
dGVudHMoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+aW52
YWxpZGF0ZVdpbmRvdygpOworICAgICAgICAgICAgbV9wYXJlbnQtPm1fd2ViUGFnZS0+Y2xpZW50
KCktPm5vdGlmeUNvbnRlbnRSZW5kZXJlZChyZW5kZXJlZFJlY3QpOworICAgICAgICB9CisgICAg
fQorCisgICAgLy8gTWFrZSBzdXJlIHdlIGRpZG4ndCBhbHRlciBzdGF0ZSBvZiB0aGUgcXVldWVz
IHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBlbXB0eQorICAgIC8vIGJlZm9yZSB0aGlzIG1ldGhvZCB3
YXMgY2FsbGVkLgorICAgIEFTU0VSVChtX3Zpc2libGVTY3JvbGxKb2JzLmVtcHR5KCkpOworCisg
ICAgaWYgKG1fcGFyZW50LT5zaG91bGRTdXBwcmVzc05vblZpc2libGVSZWd1bGFyUmVuZGVySm9i
cygpICYmICFyZWdpb25Ob3RSZW5kZXJlZC5pc0VtcHR5KCkpCisgICAgICAgIG1fcGFyZW50LT51
cGRhdGVUaWxlc0ZvclNjcm9sbE9yTm90UmVuZGVyZWRSZWdpb24oZmFsc2UgLypjaGVja0xvYWRp
bmcqLyk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OnJlbmRlck5vblZpc2libGVTY3JvbGxKb2Io
KQoreworICAgIEFTU0VSVCghbV9ub25WaXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgpKTsKKworI2lm
IERFQlVHX1JFTkRFUl9RVUVVRSB8fCBERUJVR19SRU5ERVJfUVVFVUVfU09SVAorICAgIC8vIFN0
YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50
VGltZSgpOworI2VuZGlmCisKKyAgICBxdWlja1NvcnQoJm1fbm9uVmlzaWJsZVNjcm9sbEpvYnMp
OworCisjaWYgREVCVUdfUkVOREVSX1FVRVVFX1NPUlQKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1l
YXN1cmVtZW50LgorICAgIGRvdWJsZSBlbGFwc2VkID0gV1RGOjpjdXJyZW50VGltZSgpIC0gdGlt
ZTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpM
b2dMZXZlbENyaXRpY2FsLCAiUmVuZGVyUXVldWU6OnJlbmRlck5vblZpc2libGVTY3JvbGxKb2Ig
c29ydCBlbGFwc2VkPSVmIiwgZWxhcHNlZCk7CisjZW5kaWYKKworICAgIFJlbmRlclJlY3QgcmVj
dCA9IG1fbm9uVmlzaWJsZVNjcm9sbEpvYnNbMF07CisgICAgbV9ub25WaXNpYmxlU2Nyb2xsSm9i
cy5lcmFzZShtX25vblZpc2libGVTY3JvbGxKb2JzLmJlZ2luKCkpOworCisgICAgQVNTRVJUKCFy
ZWN0LmlzQ29tcGxldGVkKCkpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHN1YlJlY3QgPSByZWN0
LnJlY3RGb3JSZW5kZXJpbmcoKTsKKyAgICBpZiAocmVjdC5pc0NvbXBsZXRlZCgpKQorICAgICAg
ICBtX25vblZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLnB1c2hfYmFjayhyZWN0KTsKKyAgICBl
bHNlCisgICAgICAgIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuaW5zZXJ0KG1fbm9uVmlzaWJsZVNj
cm9sbEpvYnMuYmVnaW4oKSwgcmVjdCk7CisKKyAgICBtX3BhcmVudC0+cmVuZGVyKHN1YlJlY3Qp
OworCisgICAgLy8gUmVjb3JkIHRoYXQgaXQgaGFzIG5vdyBiZWVuIHJlbmRlcmVkIHZpYSBhIGRp
ZmZlcmVudCB0eXBlIG9mIGpvYi4uLgorICAgIGNsZWFyUmVndWxhclJlbmRlckpvYnMoc3ViUmVj
dCk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgZGlkbid0IGFsdGVyIHN0YXRlIG9mIHRoZSBxdWV1
ZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGVtcHR5CisgICAgLy8gYmVmb3JlIHRoaXMgbWV0aG9k
IHdhcyBjYWxsZWQuCisgICAgQVNTRVJUKG1fdmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKSk7CisK
KyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50
LgorICAgIGRvdWJsZSBlbGFwc2VkID0gV1RGOjpjdXJyZW50VGltZSgpIC0gdGltZTsKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENy
aXRpY2FsLCAiUmVuZGVyUXVldWU6OnJlbmRlck5vblZpc2libGVTY3JvbGxKb2IgcmVjdD0oJWQs
JWQgJWR4JWQpIGVsYXBzZWQ9JWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVj
dC54KCksIHN1YlJlY3QueSgpLCBzdWJSZWN0LndpZHRoKCksIHN1YlJlY3QuaGVpZ2h0KCksIGVs
YXBzZWQpOworI2VuZGlmCisKKyAgICBpZiAobV9ub25WaXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgp
KQorICAgICAgICBub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZCgpOworfQorCit2b2lkIFJl
bmRlclF1ZXVlOjp2aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZChib29sIHNob3VsZEJsaXQpCit7
CisgICAgLy8gTm93IGJsaXQgdG8gdGhlIHNjcmVlbiBpZiB3ZSBhcmUgZG9uZSBhbmQgZ2V0IHJp
ZCBvZiB0aGUgY29tcGxldGVkIGxpc3QhCisgICAgQVNTRVJUKG1fdmlzaWJsZVNjcm9sbEpvYnMu
ZW1wdHkoKSk7CisgICAgbV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5jbGVhcigpOworICAg
IGlmIChzaG91bGRCbGl0ICYmICFtX3BhcmVudC0+aXNTY3JvbGxpbmdPclpvb21pbmcoKSkgewor
ICAgICAgICBpZiAoIW1fcGFyZW50LT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQor
ICAgICAgICAgICAgbV9wYXJlbnQtPmJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgbV9wYXJlbnQtPmludmFsaWRhdGVXaW5kb3coKTsKKyAgICAgICAgbV9w
YXJlbnQtPm1fd2ViUGFnZS0+Y2xpZW50KCktPm5vdGlmeUNvbnRlbnRSZW5kZXJlZChtX3BhcmVu
dC0+dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6
Om5vblZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkKCkKK3sKKyAgICAvLyBHZXQgcmlkIG9mIHRo
ZSBjb21wbGV0ZWQgbGlzdCEKKyAgICBBU1NFUlQobV9ub25WaXNpYmxlU2Nyb2xsSm9icy5lbXB0
eSgpKTsKKyAgICBtX25vblZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLmNsZWFyKCk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYktpdAorfSAvLyBuYW1lc3BhY2UgQmxhY2tCZXJyeQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvUmVuZGVyUXVldWUu
aCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1JlbmRlclF1ZXVlLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uNTAxMWRjOGVkMTNlM2EyODVkMjNkM2EzN2UwNzc4ZjkwMDQ1NTA3YwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1Jl
bmRlclF1ZXVlLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDks
IDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQor
ICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9z
dG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSZW5kZXJRdWV1ZV9oCisj
ZGVmaW5lIFJlbmRlclF1ZXVlX2gKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUludFJl
Y3RSZWdpb24uaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1QcmltaXRpdmVzLmg+Cisj
aW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2Vi
S2l0IHsKKworY2xhc3MgQmFja2luZ1N0b3JlUHJpdmF0ZTsKKwordHlwZWRlZiBzdGQ6OnZlY3Rv
cjxQbGF0Zm9ybTo6SW50UmVjdD4gSW50UmVjdExpc3Q7CisKK2VudW0gU29ydERpcmVjdGlvbiB7
CisgICAgTGVmdFRvUmlnaHQgPSAwLAorICAgIFJpZ2h0VG9MZWZ0LAorICAgIFRvcFRvQm90dG9t
LAorICAgIEJvdHRvbVRvVG9wLAorICAgIE51bVNvcnREaXJlY3Rpb25zCit9OworCitjbGFzcyBS
ZW5kZXJSZWN0IDogcHVibGljIFBsYXRmb3JtOjpJbnRSZWN0IHsKK3B1YmxpYzoKKyAgICBSZW5k
ZXJSZWN0KCkgeyB9CisgICAgUmVuZGVyUmVjdChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIGxv
Y2F0aW9uLCBjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYsIGludCBzcGxpdHRpbmdGYWN0b3IpOwor
ICAgIFJlbmRlclJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBz
cGxpdHRpbmdGYWN0b3IpOworICAgIFJlbmRlclJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
KTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3RGb3JSZW5kZXJpbmcoKTsKKworICAgIGJv
b2wgaXNDb21wbGV0ZWQoKSBjb25zdCB7IHJldHVybiAhbV9zdWJSZWN0cy5zaXplKCk7IH0KKwor
ICAgIGNvbnN0IEludFJlY3RMaXN0JiBzdWJSZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1fc3ViUmVj
dHM7IH0KKyAgICB2b2lkIHVwZGF0ZVNvcnREaXJlY3Rpb24oU29ydERpcmVjdGlvbiBwcmltYXJ5
LCBTb3J0RGlyZWN0aW9uIHNlY29uZGFyeSk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBpbml0aWFs
aXplKGludCBzcGxpdHRpbmdGYWN0b3IpOworICAgIHZvaWQgc3BsaXQoKTsKKyAgICB2b2lkIHF1
aWNrU29ydCgpOworICAgIGludCBtX3NwbGl0dGluZ0ZhY3RvcjsKKyAgICBJbnRSZWN0TGlzdCBt
X3N1YlJlY3RzOworICAgIFNvcnREaXJlY3Rpb24gbV9wcmltYXJ5U29ydERpcmVjdGlvbjsKKyAg
ICBTb3J0RGlyZWN0aW9uIG1fc2Vjb25kYXJ5U29ydERpcmVjdGlvbjsKK307CisKK3R5cGVkZWYg
c3RkOjp2ZWN0b3I8UmVuZGVyUmVjdD4gUmVuZGVyUmVjdExpc3Q7CisKK2NsYXNzIFJlbmRlclF1
ZXVlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEpvYlR5cGUgeyBWaXNpYmxlWm9vbSwgVmlzaWJsZVNj
cm9sbCwgUmVndWxhclJlbmRlciwgTm9uVmlzaWJsZVNjcm9sbCB9OworICAgIFJlbmRlclF1ZXVl
KEJhY2tpbmdTdG9yZVByaXZhdGUqKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKyAgICBSZW5kZXJS
ZWN0IGNvbnZlcnRUb1JlbmRlclJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsK
KworICAgIGJvb2wgaXNFbXB0eShib29sIHNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icyA9
IHRydWUpIGNvbnN0OworCisgICAgYm9vbCBoYXNDdXJyZW50UmVndWxhclJlbmRlckpvYigpIGNv
bnN0OworICAgIGJvb2wgaGFzQ3VycmVudFZpc2libGVab29tSm9iKCkgY29uc3Q7CisgICAgYm9v
bCBoYXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYigpIGNvbnN0OworICAgIGJvb2wgaXNDdXJyZW50
VmlzaWJsZVNjcm9sbEpvYihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJv
b2wgaXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYkNvbXBsZXRlZChjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYpIGNvbnN0OworICAgIGJvb2wgaXNDdXJyZW50UmVndWxhclJlbmRlckpvYihjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworCisgICAgYm9vbCBjdXJyZW50UmVndWxhclJlbmRl
ckpvYkJhdGNoVW5kZXJQcmVzc3VyZSgpIGNvbnN0OworICAgIHZvaWQgc2V0Q3VycmVudFJlZ3Vs
YXJSZW5kZXJKb2JCYXRjaFVuZGVyUHJlc3N1cmUoYm9vbCk7CisKKyAgICB2b2lkIGV2ZW50UXVl
dWVDeWNsZWQoKTsKKworICAgIHZvaWQgYWRkVG9RdWV1ZShKb2JUeXBlLCBjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYpOworICAgIHZvaWQgYWRkVG9RdWV1ZShKb2JUeXBlLCBjb25zdCBJbnRSZWN0
TGlzdCYpOworCisgICAgdm9pZCB1cGRhdGVTb3J0RGlyZWN0aW9uKGludCBsYXN0RGVsdGFYLCBp
bnQgbGFzdERlbHRhWSk7CisgICAgdm9pZCB2aXNpYmxlQ29udGVudENoYW5nZWQoY29uc3QgUGxh
dGZvcm06OkludFJlY3QmKTsKKyAgICB2b2lkIGNsZWFyKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uJiwgYm9vbCBjbGVhclJlZ3VsYXJSZW5kZXJKb2JzKTsKKyAgICB2b2lkIGNsZWFyKGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgYm9vbCBjbGVhclJlZ3VsYXJSZW5kZXJKb2JzKTsKKyAg
ICB2b2lkIGNsZWFyUmVndWxhclJlbmRlckpvYnMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsK
KyAgICB2b2lkIGNsZWFyVmlzaWJsZVpvb20oKTsKKyAgICBib29sIHJlZ3VsYXJSZW5kZXJKb2Jz
UHJldmlvdXNseUF0dGVtcHRlZEJ1dE5vdFJlbmRlcmVkKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
Jik7CisgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gcmVndWxhclJlbmRlckpvYnNOb3RSZW5k
ZXJlZFJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fcmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJl
ZFJlZ2lvbjsgfQorCisgICAgdm9pZCByZW5kZXIoYm9vbCBzaG91bGRQZXJmb3JtUmVndWxhclJl
bmRlckpvYnMgPSB0cnVlKTsKKyAgICB2b2lkIHJlbmRlckFsbEN1cnJlbnRSZWd1bGFyUmVuZGVy
Sm9icygpOworCitwcml2YXRlOgorICAgIHZvaWQgc3RhcnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hJ
Zk5lZWRlZCgpOworCisgICAgLy8gUmVuZGVyIGFuIGl0ZW0gZnJvbSB0aGUgcXVldWUuCisgICAg
dm9pZCByZW5kZXJWaXNpYmxlWm9vbUpvYigpOworICAgIHZvaWQgcmVuZGVyVmlzaWJsZVNjcm9s
bEpvYigpOworICAgIHZvaWQgcmVuZGVyUmVndWxhclJlbmRlckpvYigpOworICAgIHZvaWQgcmVu
ZGVyTm9uVmlzaWJsZVNjcm9sbEpvYigpOworCisgICAgLy8gTWV0aG9kcyB0byBoYW5kbGUgYSBj
b21wbGV0ZWQgc2V0IG9mIHNjcm9sbCBqb2JzLgorICAgIHZvaWQgdmlzaWJsZVNjcm9sbEpvYnND
b21wbGV0ZWQoYm9vbCBzaG91bGRCbGl0KTsKKyAgICB2b2lkIG5vblZpc2libGVTY3JvbGxKb2Jz
Q29tcGxldGVkKCk7CisKKyAgICAvLyBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIHRvIHRoZSB2YXJp
b3VzIHF1ZXVlcy4KKyAgICB2b2lkIGFkZFRvUmVndWxhclF1ZXVlKGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0Jik7CisgICAgdm9pZCBhZGRUb1Njcm9sbFpvb21RdWV1ZShjb25zdCBSZW5kZXJSZWN0
JiwgUmVuZGVyUmVjdExpc3QqIHF1ZXVlKTsKKyAgICB2b2lkIHF1aWNrU29ydChSZW5kZXJSZWN0
TGlzdCopOworCisgICAgLy8gVGhlIHNwbGl0dGluZyBmYWN0b3IgZm9yIHJlbmRlciByZWN0cy4K
KyAgICBpbnQgc3BsaXR0aW5nRmFjdG9yKCkgY29uc3Q7CisgICAgaW50IHNwbGl0dGluZ0ZhY3Rv
cihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworCisgICAgQmFja2luZ1N0b3JlUHJp
dmF0ZSogbV9wYXJlbnQ7CisKKyAgICAvLyBUaGUgaGlnaGVzdCBwcmlvcml0eSBxdWV1ZS4KKyAg
ICBSZW5kZXJSZWN0TGlzdCBtX3Zpc2libGVab29tSm9iczsKKyAgICBSZW5kZXJSZWN0TGlzdCBt
X3Zpc2libGVTY3JvbGxKb2JzOworICAgIFJlbmRlclJlY3RMaXN0IG1fdmlzaWJsZVNjcm9sbEpv
YnNDb21wbGV0ZWQ7CisgICAgLy8gVGhlIGxvd2VzdCBwcmlvcml0eSBxdWV1ZS4KKyAgICBSZW5k
ZXJSZWN0TGlzdCBtX25vblZpc2libGVTY3JvbGxKb2JzOworICAgIFJlbmRlclJlY3RMaXN0IG1f
bm9uVmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQ7CisgICAgLy8gVGhlIHJlZ3VsYXIgcmVuZGVy
IGpvYnMgYXJlIGluIHRoZSBtaWRkbGUuCisgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gbV9y
ZWd1bGFyUmVuZGVySm9ic1JlZ2lvbjsKKyAgICBJbnRSZWN0TGlzdCBtX2N1cnJlbnRSZWd1bGFy
UmVuZGVySm9ic0JhdGNoOworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIG1fY3VycmVudFJl
Z3VsYXJSZW5kZXJKb2JzQmF0Y2hSZWdpb247CisgICAgYm9vbCBtX3JlY3RzQWRkZWRUb1JlZ3Vs
YXJSZW5kZXJKb2JzSW5DdXJyZW50Q3ljbGU7CisgICAgYm9vbCBtX2N1cnJlbnRSZWd1bGFyUmVu
ZGVySm9ic0JhdGNoVW5kZXJQcmVzc3VyZTsKKworICAgIC8vIEhvbGRzIHRoZSByZWdpb24gb2Yg
dGhlIHBhZ2UgdGhhdCB3ZSBhdHRlbXB0IHRvIHJlbmRlciwgYnV0IHRoZQorICAgIC8vIGJhY2tp
bmdzdG9yZSB3YXMgbm90IGluIHRoZSByaWdodCBwbGFjZSBhdCB0aGUgdGltZS4gVGhpcyB3aWxs
CisgICAgLy8gYmUgY2hlY2tlZCBiZWZvcmUgd2UgdHJ5IHRvIHJlc3RvcmUgYSB0aWxlIHRvIGl0
J3MgbGFzdCByZW5kZXJlZAorICAgIC8vIHBsYWNlLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uIG1fcmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbjsKKworICAgIFNvcnREaXJl
Y3Rpb24gbV9wcmltYXJ5U29ydERpcmVjdGlvbjsKKyAgICBTb3J0RGlyZWN0aW9uIG1fc2Vjb25k
YXJ5U29ydERpcmVjdGlvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorfSAvLyBuYW1l
c3BhY2UgQmxhY2tCZXJyeQorCisjZW5kaWYgLy8gUmVuZGVyUXVldWVfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126546</attachid>
            <date>2012-02-10 11:59:52 -0800</date>
            <delta_ts>2012-02-10 12:04:18 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78278-20120210150224.patch</filename>
            <type>text/plain</type>
            <size>43615</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3NDAxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZlZmM5YWJiZWMwMGNmMGQz
M2RmN2E2MWY3NjE2OTA3NDM5YWMyMzEuLjNmODJjNjEzODg3Y2JhNTVlYThkMjhkMWVkMTBmZWY1
NDEwYzIwZjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0zLDYgKzMsMTggQEAKICAgICAgICAgW0JsYWNrQmVycnld
IFVwc3RyZWFtIGdyYXBoaWNzIGhlbHBlciBjbGFzc2VzIGluIFdlYktpdFN1cHBvcnQKICAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4Mjc4CiAKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVh
bSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1Jl
bmRlclF1ZXVlLmNwcDogQWRkZWQuCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0
L1JlbmRlclF1ZXVlLmg6IEFkZGVkLgorCisyMDEyLTAyLTEwICBSb2IgQnVpcyAgPHJidWlzQHJp
bS5jb20+CisKKyAgICAgICAgW0JsYWNrQmVycnldIFVwc3RyZWFtIGdyYXBoaWNzIGhlbHBlciBj
bGFzc2VzIGluIFdlYktpdFN1cHBvcnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTc4Mjc4CisKICAgICAgICAgUmV2aWV3ZWQgYnkgQW50b25pbyBHb21l
cy4KIAogICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBubyBuZXcgdGVzdHMuCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9SZW5kZXJRdWV1ZS5jcHAg
Yi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9SZW5kZXJRdWV1ZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMWYzMjBiOWE4MDAyYjgzNzA0OWRlYWQyZWY1YjA3MThmZTg1OGI2OQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1Jl
bmRlclF1ZXVlLmNwcApAQCAtMCwwICsxLDkxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUmVuZGVyUXVldWUuaCIKKworI2luY2x1ZGUgIkJhY2tpbmdTdG9yZV9wLmgiCisj
aW5jbHVkZSAiV2ViUGFnZUNsaWVudC5oIgorI2luY2x1ZGUgIldlYlBhZ2VfcC5oIgorCisjZGVm
aW5lIERFQlVHX1JFTkRFUl9RVUVVRSAwCisjZGVmaW5lIERFQlVHX1JFTkRFUl9RVUVVRV9TT1JU
IDAKKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9y
bUxvZy5oPgorI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgorI2VuZGlmCisKK25hbWVzcGFj
ZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCit0ZW1wbGF0ZTxTb3J0RGlyZWN0
aW9uIHNvcnREaXJlY3Rpb24+CitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlUmVjdE9uZURpcmVj
dGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcjEsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiByMikKK3sKKyAgICBzd2l0Y2ggKHNvcnREaXJlY3Rpb24pIHsKKyAgICBjYXNlIExlZnRUb1Jp
Z2h0OgorICAgICAgICByZXR1cm4gcjEueCgpIC0gcjIueCgpOworICAgIGNhc2UgUmlnaHRUb0xl
ZnQ6CisgICAgICAgIHJldHVybiByMi54KCkgLSByMS54KCk7CisgICAgY2FzZSBUb3BUb0JvdHRv
bToKKyAgICAgICAgcmV0dXJuIHIxLnkoKSAtIHIyLnkoKTsKKyAgICBjYXNlIEJvdHRvbVRvVG9w
OgorICAgICAgICByZXR1cm4gcjIueSgpIC0gcjEueSgpOworICAgIGRlZmF1bHQ6CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsK
K30KKwordGVtcGxhdGU8U29ydERpcmVjdGlvbiBwcmltYXJ5U29ydERpcmVjdGlvbiwgU29ydERp
cmVjdGlvbiBzZWNvbmRhcnlTb3J0RGlyZWN0aW9uPgorc3RhdGljIGJvb2wgcmVjdElzTGVzc1Ro
YW4oY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHIxLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
cjIpCit7CisgICAgaW50IHByaW1hcnlSZXN1bHQgPSBjb21wYXJlUmVjdE9uZURpcmVjdGlvbjxw
cmltYXJ5U29ydERpcmVjdGlvbj4ocjEsIHIyKTsKKyAgICBpZiAocHJpbWFyeVJlc3VsdCB8fCBz
ZWNvbmRhcnlTb3J0RGlyZWN0aW9uID09IHByaW1hcnlTb3J0RGlyZWN0aW9uKQorICAgICAgICBy
ZXR1cm4gcHJpbWFyeVJlc3VsdCA8IDA7CisgICAgcmV0dXJuIGNvbXBhcmVSZWN0T25lRGlyZWN0
aW9uPHNlY29uZGFyeVNvcnREaXJlY3Rpb24+KHIxLCByMikgPCAwOworfQorCit0eXBlZGVmIGJv
b2wgKCpGdW5jUmVjdExlc3NUaGFuKShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcjEsIGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JiByMik7CitzdGF0aWMgRnVuY1JlY3RMZXNzVGhhbiByZWN0TGVz
c1RoYW5GdW5jdGlvbihTb3J0RGlyZWN0aW9uIHByaW1hcnksIFNvcnREaXJlY3Rpb24gc2Vjb25k
YXJ5KQoreworICAgIHN0YXRpYyBGdW5jUmVjdExlc3NUaGFuIHNfcmVjdExlc3NUaGFuRnVuY3Rp
b25zW051bVNvcnREaXJlY3Rpb25zXVtOdW1Tb3J0RGlyZWN0aW9uc10gPSB7IHsgMCB9IH07Cisg
ICAgc3RhdGljIGJvb2wgc19pbml0aWFsaXplZCA9IGZhbHNlOworICAgIGlmICghc19pbml0aWFs
aXplZCkgeworI2RlZmluZSBBRERfQ09NUEFSRV9GVU5DVElPTihfcHJpbWFyeSwgX3NlY29uZGFy
eSkgXAorICAgICAgICBzX3JlY3RMZXNzVGhhbkZ1bmN0aW9uc1tfcHJpbWFyeV1bX3NlY29uZGFy
eV0gPSByZWN0SXNMZXNzVGhhbjxfcHJpbWFyeSwgX3NlY29uZGFyeT4KKworICAgICAgICBBRERf
Q09NUEFSRV9GVU5DVElPTihMZWZ0VG9SaWdodCwgTGVmdFRvUmlnaHQpOworICAgICAgICBBRERf
Q09NUEFSRV9GVU5DVElPTihMZWZ0VG9SaWdodCwgUmlnaHRUb0xlZnQpOworICAgICAgICBBRERf
Q09NUEFSRV9GVU5DVElPTihMZWZ0VG9SaWdodCwgVG9wVG9Cb3R0b20pOworICAgICAgICBBRERf
Q09NUEFSRV9GVU5DVElPTihMZWZ0VG9SaWdodCwgQm90dG9tVG9Ub3ApOworCisgICAgICAgIEFE
RF9DT01QQVJFX0ZVTkNUSU9OKFJpZ2h0VG9MZWZ0LCBMZWZ0VG9SaWdodCk7CisgICAgICAgIEFE
RF9DT01QQVJFX0ZVTkNUSU9OKFJpZ2h0VG9MZWZ0LCBSaWdodFRvTGVmdCk7CisgICAgICAgIEFE
RF9DT01QQVJFX0ZVTkNUSU9OKFJpZ2h0VG9MZWZ0LCBUb3BUb0JvdHRvbSk7CisgICAgICAgIEFE
RF9DT01QQVJFX0ZVTkNUSU9OKFJpZ2h0VG9MZWZ0LCBCb3R0b21Ub1RvcCk7CisKKyAgICAgICAg
QUREX0NPTVBBUkVfRlVOQ1RJT04oVG9wVG9Cb3R0b20sIExlZnRUb1JpZ2h0KTsKKyAgICAgICAg
QUREX0NPTVBBUkVfRlVOQ1RJT04oVG9wVG9Cb3R0b20sIFJpZ2h0VG9MZWZ0KTsKKyAgICAgICAg
QUREX0NPTVBBUkVfRlVOQ1RJT04oVG9wVG9Cb3R0b20sIFRvcFRvQm90dG9tKTsKKyAgICAgICAg
QUREX0NPTVBBUkVfRlVOQ1RJT04oVG9wVG9Cb3R0b20sIEJvdHRvbVRvVG9wKTsKKworICAgICAg
ICBBRERfQ09NUEFSRV9GVU5DVElPTihCb3R0b21Ub1RvcCwgTGVmdFRvUmlnaHQpOworICAgICAg
ICBBRERfQ09NUEFSRV9GVU5DVElPTihCb3R0b21Ub1RvcCwgUmlnaHRUb0xlZnQpOworICAgICAg
ICBBRERfQ09NUEFSRV9GVU5DVElPTihCb3R0b21Ub1RvcCwgVG9wVG9Cb3R0b20pOworICAgICAg
ICBBRERfQ09NUEFSRV9GVU5DVElPTihCb3R0b21Ub1RvcCwgQm90dG9tVG9Ub3ApOworI3VuZGVm
IEFERF9DT01QQVJFX0ZVTkNUSU9OCisKKyAgICAgICAgc19pbml0aWFsaXplZCA9IHRydWU7Cisg
ICAgfQorCisgICAgcmV0dXJuIHNfcmVjdExlc3NUaGFuRnVuY3Rpb25zW3ByaW1hcnldW3NlY29u
ZGFyeV07Cit9CisKK2NsYXNzIFJlY3RMZXNzVGhhbiB7CitwdWJsaWM6CisgICAgUmVjdExlc3NU
aGFuKFNvcnREaXJlY3Rpb24gcHJpbWFyeVNvcnREaXJlY3Rpb24sIFNvcnREaXJlY3Rpb24gc2Vj
b25kYXJ5U29ydERpcmVjdGlvbikKKyAgICAgICAgOiBtX3JlY3RJc0xlc3NUaGFuKHJlY3RMZXNz
VGhhbkZ1bmN0aW9uKHByaW1hcnlTb3J0RGlyZWN0aW9uLCBzZWNvbmRhcnlTb3J0RGlyZWN0aW9u
KSkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0JiByMSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHIyKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1fcmVjdElzTGVzc1RoYW4ocjEsIHIyKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
RnVuY1JlY3RMZXNzVGhhbiBtX3JlY3RJc0xlc3NUaGFuOworfTsKKworY2xhc3MgUmVuZGVyUmVj
dExlc3NUaGFuIHsKK3B1YmxpYzoKKyAgICBSZW5kZXJSZWN0TGVzc1RoYW4oU29ydERpcmVjdGlv
biBwcmltYXJ5U29ydERpcmVjdGlvbiwgU29ydERpcmVjdGlvbiBzZWNvbmRhcnlTb3J0RGlyZWN0
aW9uKQorICAgICAgICA6IG1fcmVjdElzTGVzc1RoYW4ocmVjdExlc3NUaGFuRnVuY3Rpb24ocHJp
bWFyeVNvcnREaXJlY3Rpb24sIHNlY29uZGFyeVNvcnREaXJlY3Rpb24pKQorICAgIHsKKyAgICB9
CisKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmVuZGVyUmVjdCYgcjEsIGNvbnN0IFJlbmRl
clJlY3QmIHIyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcmVjdElzTGVzc1RoYW4ocjEuc3Vi
UmVjdHMoKVswXSwgcjIuc3ViUmVjdHMoKVswXSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEZ1
bmNSZWN0TGVzc1RoYW4gbV9yZWN0SXNMZXNzVGhhbjsKK307CisKK1JlbmRlclJlY3Q6OlJlbmRl
clJlY3QoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBsb2NhdGlvbiwgY29uc3QgUGxhdGZvcm06
OkludFNpemUmIHNpemUsIGludCBzcGxpdHRpbmdGYWN0b3IpCisgICAgOiBQbGF0Zm9ybTo6SW50
UmVjdChsb2NhdGlvbiwgc2l6ZSkKKyAgICAsIG1fc3BsaXR0aW5nRmFjdG9yKDApCisgICAgLCBt
X3ByaW1hcnlTb3J0RGlyZWN0aW9uKFRvcFRvQm90dG9tKQorICAgICwgbV9zZWNvbmRhcnlTb3J0
RGlyZWN0aW9uKExlZnRUb1JpZ2h0KQoreworICAgIGluaXRpYWxpemUoc3BsaXR0aW5nRmFjdG9y
KTsKK30KKworUmVuZGVyUmVjdDo6UmVuZGVyUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwg
aW50IGhlaWdodCwgaW50IHNwbGl0dGluZ0ZhY3RvcikKKyAgICA6IFBsYXRmb3JtOjpJbnRSZWN0
KHgsIHksIHdpZHRoLCBoZWlnaHQpCisgICAgLCBtX3NwbGl0dGluZ0ZhY3RvcigwKQorICAgICwg
bV9wcmltYXJ5U29ydERpcmVjdGlvbihUb3BUb0JvdHRvbSkKKyAgICAsIG1fc2Vjb25kYXJ5U29y
dERpcmVjdGlvbihMZWZ0VG9SaWdodCkKK3sKKyAgICBpbml0aWFsaXplKHNwbGl0dGluZ0ZhY3Rv
cik7Cit9CisKK3ZvaWQgUmVuZGVyUmVjdDo6aW5pdGlhbGl6ZShpbnQgc3BsaXR0aW5nRmFjdG9y
KQoreworICAgIG1fc3ViUmVjdHMucHVzaF9iYWNrKCp0aGlzKTsKKyAgICBmb3IgKGludCBpID0g
MDsgaSA8IHNwbGl0dGluZ0ZhY3RvcjsgKytpKQorICAgICAgICBzcGxpdCgpOworICAgIHF1aWNr
U29ydCgpOworfQorCitzdGF0aWMgdm9pZCBzcGxpdFJlY3RJbkhhbGZBbmRBZGRUb0xpc3QoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QsIGJvb2wgdmVydGljYWwsIEludFJlY3RMaXN0JiBy
ZW5kZXJSZWN0TGlzdCkKK3sKKyAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgaW50IHdpZHRo
MSA9IHN0YXRpY19jYXN0PGludD4oY2VpbGYocmVjdC53aWR0aCgpIC8gMi4wKSk7CisgICAgICAg
IGludCB3aWR0aDIgPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZihyZWN0LndpZHRoKCkgLyAyLjAp
KTsKKyAgICAgICAgcmVuZGVyUmVjdExpc3QucHVzaF9iYWNrKFBsYXRmb3JtOjpJbnRSZWN0KHJl
Y3QueCgpLCByZWN0LnkoKSwgd2lkdGgxLCByZWN0LmhlaWdodCgpKSk7CisgICAgICAgIHJlbmRl
clJlY3RMaXN0LnB1c2hfYmFjayhQbGF0Zm9ybTo6SW50UmVjdChyZWN0LngoKSArIHdpZHRoMSwg
cmVjdC55KCksIHdpZHRoMiwgcmVjdC5oZWlnaHQoKSkpOworICAgIH0gZWxzZSB7CisgICAgICAg
IGludCBoZWlnaHQxID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihyZWN0LmhlaWdodCgpIC8gMi4w
KSk7CisgICAgICAgIGludCBoZWlnaHQyID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcmYocmVjdC5o
ZWlnaHQoKSAvIDIuMCkpOworICAgICAgICByZW5kZXJSZWN0TGlzdC5wdXNoX2JhY2soUGxhdGZv
cm06OkludFJlY3QocmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIGhlaWdodDEpKTsK
KyAgICAgICAgcmVuZGVyUmVjdExpc3QucHVzaF9iYWNrKFBsYXRmb3JtOjpJbnRSZWN0KHJlY3Qu
eCgpLCByZWN0LnkoKSArIGhlaWdodDEsIHJlY3Qud2lkdGgoKSwgaGVpZ2h0MikpOworICAgIH0K
K30KKwordm9pZCBSZW5kZXJSZWN0OjpzcGxpdCgpCit7CisgICAgKyttX3NwbGl0dGluZ0ZhY3Rv
cjsKKworICAgIGJvb2wgdmVydGljYWwgPSAhKG1fc3BsaXR0aW5nRmFjdG9yICUgMik7CisKKyAg
ICBJbnRSZWN0TGlzdCBzdWJSZWN0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3Vi
UmVjdHMuc2l6ZSgpOyArK2kpCisgICAgICAgIHNwbGl0UmVjdEluSGFsZkFuZEFkZFRvTGlzdCht
X3N1YlJlY3RzLmF0KGkpLCB2ZXJ0aWNhbCwgc3ViUmVjdHMpOworICAgIG1fc3ViUmVjdHMuc3dh
cChzdWJSZWN0cyk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IFJlbmRlclJlY3Q6OnJlY3RGb3JS
ZW5kZXJpbmcoKQoreworICAgIEFTU0VSVCghbV9zdWJSZWN0cy5lbXB0eSgpKTsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCByZWN0ID0gbV9zdWJSZWN0c1swXTsKKyAgICBtX3N1YlJlY3RzLmVyYXNl
KG1fc3ViUmVjdHMuYmVnaW4oKSk7CisgICAgcmV0dXJuIHJlY3Q7Cit9CisKK3ZvaWQgUmVuZGVy
UmVjdDo6dXBkYXRlU29ydERpcmVjdGlvbihTb3J0RGlyZWN0aW9uIHByaW1hcnksIFNvcnREaXJl
Y3Rpb24gc2Vjb25kYXJ5KQoreworICAgIGlmIChwcmltYXJ5ID09IG1fcHJpbWFyeVNvcnREaXJl
Y3Rpb24gJiYgc2Vjb25kYXJ5ID09IG1fc2Vjb25kYXJ5U29ydERpcmVjdGlvbikKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9wcmltYXJ5U29ydERpcmVjdGlvbiA9IHByaW1hcnk7CisgICAgbV9z
ZWNvbmRhcnlTb3J0RGlyZWN0aW9uID0gc2Vjb25kYXJ5OworCisgICAgcXVpY2tTb3J0KCk7Cit9
CisKK3ZvaWQgUmVuZGVyUmVjdDo6cXVpY2tTb3J0KCkKK3sKKyAgICBzdGQ6OnNvcnQobV9zdWJS
ZWN0cy5iZWdpbigpLCBtX3N1YlJlY3RzLmJlZ2luKCksIFJlY3RMZXNzVGhhbihtX3ByaW1hcnlT
b3J0RGlyZWN0aW9uLCBtX3NlY29uZGFyeVNvcnREaXJlY3Rpb24pKTsKK30KKworUmVuZGVyUXVl
dWU6OlJlbmRlclF1ZXVlKEJhY2tpbmdTdG9yZVByaXZhdGUqIHBhcmVudCkKKyAgICA6IG1fcGFy
ZW50KHBhcmVudCkKKyAgICAsIG1fcmVjdHNBZGRlZFRvUmVndWxhclJlbmRlckpvYnNJbkN1cnJl
bnRDeWNsZShmYWxzZSkKKyAgICAsIG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hVbmRl
clByZXNzdXJlKGZhbHNlKQorICAgICwgbV9wcmltYXJ5U29ydERpcmVjdGlvbihUb3BUb0JvdHRv
bSkKKyAgICAsIG1fc2Vjb25kYXJ5U29ydERpcmVjdGlvbihMZWZ0VG9SaWdodCkKK3sKK30KKwor
dm9pZCBSZW5kZXJRdWV1ZTo6cmVzZXQoKQoreworICAgIG1fcmVjdHNBZGRlZFRvUmVndWxhclJl
bmRlckpvYnNJbkN1cnJlbnRDeWNsZSA9IGZhbHNlOworICAgIG1fY3VycmVudFJlZ3VsYXJSZW5k
ZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlID0gZmFsc2U7CisgICAgbV9wcmltYXJ5U29ydERpcmVj
dGlvbiA9IFRvcFRvQm90dG9tOworICAgIG1fc2Vjb25kYXJ5U29ydERpcmVjdGlvbiA9IExlZnRU
b1JpZ2h0OworICAgIG1fdmlzaWJsZVpvb21Kb2JzLmNsZWFyKCk7CisgICAgbV92aXNpYmxlU2Ny
b2xsSm9icy5jbGVhcigpOworICAgIG1fdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQuY2xlYXIo
KTsKKyAgICBtX25vblZpc2libGVTY3JvbGxKb2JzLmNsZWFyKCk7CisgICAgbV9ub25WaXNpYmxl
U2Nyb2xsSm9ic0NvbXBsZXRlZC5jbGVhcigpOworICAgIG1fcmVndWxhclJlbmRlckpvYnNSZWdp
b24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbigpOworICAgIG1fY3VycmVudFJlZ3VsYXJSZW5k
ZXJKb2JzQmF0Y2guY2xlYXIoKTsKKyAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNo
UmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb24oKTsKKyAgICBtX3JlZ3VsYXJSZW5kZXJK
b2JzTm90UmVuZGVyZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbigpOworICAgIG1f
cGFyZW50LT5zdG9wUmVuZGVyVGltZXIoKTsKKyAgICBBU1NFUlQoaXNFbXB0eSgpKTsKK30KKwor
aW50IFJlbmRlclF1ZXVlOjpzcGxpdHRpbmdGYWN0b3IoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IHJlY3QpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzcGxpdCB1cCBy
ZWd1bGFyIHJlbmRlciByZWN0IGpvYnMgYW5kIHdlIHdhbnQgaXQgdG8KKyAgICAvLyB0byBiZSB6
b29tIGludmFyaWFudCB3aXRoIHJlc3BlY3QgdG8gV2ViQ29yZS4gSW4gb3RoZXIgd29yZHMsIGlm
IFdlYkNvcmUgc2VuZHMKKyAgICAvLyB1cyBhIHJlY3Qgb2Ygdmlld3BvcnQgc2l6ZSB0byBpbnZh
bGlkYXRlIGF0IHpvb20gMS4wIHRoZW4gd2Ugc3BsaXQgdGhhdCB1cAorICAgIC8vIGluIHRoZSBl
eGFjdCBzYW1lIHdheSB3ZSB3b3VsZCBhdCB6b29tIDIuMC4gVGhlIGFtb3VudCBvZiBjb250ZW50
IHRoYXQgaXMKKyAgICAvLyByZW5kZXJlZCBpbiBhbnkgb25lIHBhc3Mgc2hvdWxkIHN0YXkgZml4
ZWQgd2l0aCByZWdhcmQgdG8gdGhlIHpvb20gbGV2ZWwuCisgICAgUGxhdGZvcm06OkludFJlY3Qg
dW50cmFuc2Zvcm1lZFJlY3QgPSBtX3BhcmVudC0+bV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJhbnNm
b3JtZWQocmVjdCk7CisgICAgZG91YmxlIHJlY3RBcmVhID0gdW50cmFuc2Zvcm1lZFJlY3Qud2lk
dGgoKSAqIHVudHJhbnNmb3JtZWRSZWN0LmhlaWdodCgpOworICAgIFBsYXRmb3JtOjpJbnRTaXpl
IGRlZmF1bHRNYXhMYXlvdXRTaXplID0gV2ViUGFnZVByaXZhdGU6OmRlZmF1bHRNYXhMYXlvdXRT
aXplKCk7CisgICAgZG91YmxlIG1heEFyZWEgPSBkZWZhdWx0TWF4TGF5b3V0U2l6ZS53aWR0aCgp
ICogZGVmYXVsdE1heExheW91dFNpemUuaGVpZ2h0KCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBz
cGxpdEZhY3RvciA9IDEgPDwgMDsKKyAgICBkb3VibGUgcmVuZGVyUmVjdEFyZWEgPSBtYXhBcmVh
IC8gc3BsaXRGYWN0b3I7CisgICAgcmV0dXJuIGNlaWwobG9nKHJlY3RBcmVhIC8gcmVuZGVyUmVj
dEFyZWEpIC8gbG9nKDIuMCkpOworfQorCitSZW5kZXJSZWN0IFJlbmRlclF1ZXVlOjpjb252ZXJ0
VG9SZW5kZXJSZWN0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAg
IHJldHVybiBSZW5kZXJSZWN0KHJlY3QubG9jYXRpb24oKSwgcmVjdC5zaXplKCksIHNwbGl0dGlu
Z0ZhY3RvcihyZWN0KSk7Cit9CisKK2Jvb2wgUmVuZGVyUXVldWU6OmlzRW1wdHkoYm9vbCBzaG91
bGRQZXJmb3JtUmVndWxhclJlbmRlckpvYnMpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdmlzaWJs
ZVpvb21Kb2JzLmVtcHR5KCkgJiYgbV92aXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgpCisgICAgICAg
ICYmICghc2hvdWxkUGVyZm9ybVJlZ3VsYXJSZW5kZXJKb2JzIHx8IG1fY3VycmVudFJlZ3VsYXJS
ZW5kZXJKb2JzQmF0Y2guZW1wdHkoKSkKKyAgICAgICAgJiYgKCFzaG91bGRQZXJmb3JtUmVndWxh
clJlbmRlckpvYnMgfHwgbV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lvbi5pc0VtcHR5KCkpCisgICAg
ICAgICYmIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKTsKK30KKworYm9vbCBSZW5kZXJR
dWV1ZTo6aGFzQ3VycmVudFJlZ3VsYXJSZW5kZXJKb2IoKSBjb25zdAoreworICAgIHJldHVybiAh
bV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaC5lbXB0eSgpIHx8ICFtX3JlZ3VsYXJSZW5k
ZXJKb2JzUmVnaW9uLmlzRW1wdHkoKTsKK30KKworYm9vbCBSZW5kZXJRdWV1ZTo6aGFzQ3VycmVu
dFZpc2libGVab29tSm9iKCkgY29uc3QKK3sKKyAgICByZXR1cm4gIW1fdmlzaWJsZVpvb21Kb2Jz
LmVtcHR5KCk7Cit9CisKK2Jvb2wgUmVuZGVyUXVldWU6Omhhc0N1cnJlbnRWaXNpYmxlU2Nyb2xs
Sm9iKCkgY29uc3QKK3sKKyAgICByZXR1cm4gIW1fdmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKTsK
K30KKworYm9vbCBSZW5kZXJRdWV1ZTo6aXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYihjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kKG1f
dmlzaWJsZVNjcm9sbEpvYnMuYmVnaW4oKSwgbV92aXNpYmxlU2Nyb2xsSm9icy5lbmQoKSwgcmVj
dCkgIT0gbV92aXNpYmxlU2Nyb2xsSm9icy5lbmQoKTsKK30KKworYm9vbCBSZW5kZXJRdWV1ZTo6
aXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYkNvbXBsZXRlZChjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kKG1fdmlzaWJsZVNjcm9sbEpv
YnNDb21wbGV0ZWQuYmVnaW4oKSwgbV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lbmQoKSwg
cmVjdCkgIT0gbV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lbmQoKTsKK30KKworYm9vbCBS
ZW5kZXJRdWV1ZTo6aXNDdXJyZW50UmVndWxhclJlbmRlckpvYihjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lv
bi5pc1JlY3RJblJlZ2lvbihyZWN0KSA9PSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6Q29udGFp
bmVkSW5SZWdpb24KKyAgICAgICAgfHwgbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFJl
Z2lvbi5pc1JlY3RJblJlZ2lvbihyZWN0KSA9PSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6Q29u
dGFpbmVkSW5SZWdpb247Cit9CisKK2Jvb2wgUmVuZGVyUXVldWU6OmN1cnJlbnRSZWd1bGFyUmVu
ZGVySm9iQmF0Y2hVbmRlclByZXNzdXJlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jdXJyZW50
UmVndWxhclJlbmRlckpvYnNCYXRjaFVuZGVyUHJlc3N1cmU7Cit9CisKK3ZvaWQgUmVuZGVyUXVl
dWU6OnNldEN1cnJlbnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hVbmRlclByZXNzdXJlKGJvb2wgY3Vy
cmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlKQoreworICAgIG1fY3VycmVu
dFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlID0gY3VycmVudFJlZ3VsYXJSZW5k
ZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlOworfQorCit2b2lkIFJlbmRlclF1ZXVlOjpldmVudFF1
ZXVlQ3ljbGVkKCkKK3sKKyAgICAvLyBDYWxsZWQgYnkgdGhlIGJhY2tpbmcgc3RvcmUgd2hlbiB0
aGUgZXZlbnQgcXVldWUgaGFzIGN5Y2xlZCB0byBhbGxvdyB0aGUKKyAgICAvLyByZW5kZXIgcXVl
dWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZWd1bGFyIHJlbmRlciBqb2JzIGFyZSB1bmRlciBwcmVz
c3VyZS4KKyAgICBpZiAobV9yZWN0c0FkZGVkVG9SZWd1bGFyUmVuZGVySm9ic0luQ3VycmVudEN5
Y2xlICYmIG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hSZWdpb24uaXNFbXB0eSgpKQor
ICAgICAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoVW5kZXJQcmVzc3VyZSA9IHRy
dWU7CisgICAgbV9yZWN0c0FkZGVkVG9SZWd1bGFyUmVuZGVySm9ic0luQ3VycmVudEN5Y2xlID0g
ZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OmFkZFRvUXVldWUoSm9iVHlwZSB0eXBlLCBj
b25zdCBJbnRSZWN0TGlzdCYgcmVjdExpc3QpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCByZWN0TGlzdC5zaXplKCk7ICsraSkKKyAgICAgICAgYWRkVG9RdWV1ZSh0eXBlLCByZWN0TGlz
dC5hdChpKSk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OmFkZFRvUXVldWUoSm9iVHlwZSB0eXBl
LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAodHlwZSA9PSBOb25W
aXNpYmxlU2Nyb2xsICYmIHN0ZDo6ZmluZChtX3Zpc2libGVTY3JvbGxKb2JzLmJlZ2luKCksIG1f
dmlzaWJsZVNjcm9sbEpvYnMuZW5kKCksIHJlY3QpICE9IG1fdmlzaWJsZVNjcm9sbEpvYnMuZW5k
KCkpCisgICAgICAgIHJldHVybjsgLy8gfHJlY3R8IGlzIGluIGEgaGlnaGVyIHByaW9yaXR5IHF1
ZXVlLgorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBWaXNpYmxlWm9vbToKKyAgICAg
ICAgYWRkVG9TY3JvbGxab29tUXVldWUoY29udmVydFRvUmVuZGVyUmVjdChyZWN0KSwgJm1fdmlz
aWJsZVpvb21Kb2JzKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmlzaWJsZVNjcm9sbDoK
KyAgICAgICAgYWRkVG9TY3JvbGxab29tUXVldWUoY29udmVydFRvUmVuZGVyUmVjdChyZWN0KSwg
Jm1fdmlzaWJsZVNjcm9sbEpvYnMpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBSZWd1bGFy
UmVuZGVyOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBGbGFnIHRoYXQgd2UgYWRkZWQgcmVj
dHMgaW4gdGhlIGN1cnJlbnQgZXZlbnQgcXVldWUgY3ljbGUuCisgICAgICAgICAgICBtX3JlY3Rz
QWRkZWRUb1JlZ3VsYXJSZW5kZXJKb2JzSW5DdXJyZW50Q3ljbGUgPSB0cnVlOworCisgICAgICAg
ICAgICAvLyBXZSB0cnkgYW5kIGRldGVjdCBpZiB0aGlzIG5ld2x5IGFkZGVkIHJlY3QgaW50ZXJz
ZWN0cyBvciBpcyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnRseSBydW5uaW5nCisgICAgICAgICAg
ICAvLyBiYXRjaCBvZiByZW5kZXIgam9icy4gSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBzdGFydCB0
aGUgYmF0Y2ggb3ZlciBzaW5jZSB3ZSBkZWNvbXBvc2UgaW5kaXZpZHVhbAorICAgICAgICAgICAg
Ly8gcmVjdHMgaW50byBzdWJyZWN0cyBhbmQgbWlnaHQgaGF2ZSBhbHJlYWR5IHJlbmRlcmVkIG9u
ZSBvZiB0aGVtLiBJZiB0aGUgd2ViIHBhZ2UncyBjb250ZW50IGhhcworICAgICAgICAgICAgLy8g
Y2hhbmdlZCBzdGF0ZSB0aGVuIHRoaXMgY2FuIGxlYWQgdG8gYXJ0aWZhY3RzLiBXZSBtYXJrIHRo
aXMgYnkgbm90aW5nIHRoZSBiYXRjaCBpcyBub3cgdW5kZXIgcHJlc3N1cmUKKyAgICAgICAgICAg
IC8vIGFuZCB0aGUgYmFja2luZ3N0b3JlIHdpbGwgYXR0ZW1wdCB0byBjbGVhciBpdCBhdCB0aGUg
bmV4dCBhdmFpbGFibGUgb3Bwb3J0dW5pdHkuCisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbjo6SW50ZXJzZWN0aW9uU3RhdGUgc3RhdGUgPSBtX2N1cnJlbnRSZWd1bGFyUmVuZGVy
Sm9ic0JhdGNoUmVnaW9uLmlzUmVjdEluUmVnaW9uKHJlY3QpOworICAgICAgICAgICAgaWYgKHN0
YXRlID09IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpDb250YWluZWRJblJlZ2lvbiB8fCBzdGF0
ZSA9PSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6UGFydGlhbGx5Q29udGFpbmVkSW5SZWdpb24p
IHsKKyAgICAgICAgICAgICAgICBtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9uID0gUGxhdGZvcm06
OkludFJlY3RSZWdpb246OnVuaW9uUmVnaW9ucyhtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9uLCBt
X2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uKTsKKyAgICAgICAgICAgICAgICBt
X2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICAgICAg
bV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uKCk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRj
aFVuZGVyUHJlc3N1cmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkVG9S
ZWd1bGFyUXVldWUocmVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
Tm9uVmlzaWJsZVNjcm9sbDoKKyAgICAgICAgYWRkVG9TY3JvbGxab29tUXVldWUoY29udmVydFRv
UmVuZGVyUmVjdChyZWN0KSwgJm1fbm9uVmlzaWJsZVNjcm9sbEpvYnMpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit2b2lkIFJlbmRlclF1
ZXVlOjphZGRUb1JlZ3VsYXJRdWV1ZShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkKK3sK
KyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICBpZiAobV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lv
bi5pc1JlY3RJblJlZ2lvbihyZWN0KSAhPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6Q29udGFp
bmVkSW5SZWdpb24pIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlbmRlclF1ZXVlOjphZGRUb1JlZ3Vs
YXJRdWV1ZSAlZCwlZCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVj
dC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIH0KKyNl
bmRpZgorCisgICAgLy8gRG8gbm90IGxldCB0aGUgcmVndWxhciByZW5kZXIgcXVldWUgZ3JvdyBw
YXN0IGEgbWF4aW11bSBvZiAzIGRpc2pvaW50IHJlY3RzLgorICAgIGlmIChtX3JlZ3VsYXJSZW5k
ZXJKb2JzUmVnaW9uLm51bVJlY3RzKCkgPiAyKQorICAgICAgICBtX3JlZ3VsYXJSZW5kZXJKb2Jz
UmVnaW9uID0gUGxhdGZvcm06OnVuaW9uT2ZSZWN0cyhtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9u
LmV4dGVudHMoKSwgcmVjdCk7CisgICAgZWxzZQorICAgICAgICBtX3JlZ3VsYXJSZW5kZXJKb2Jz
UmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OnVuaW9uUmVnaW9ucyhtX3JlZ3VsYXJS
ZW5kZXJKb2JzUmVnaW9uLCByZWN0KTsKKworICAgIGlmICghaXNFbXB0eSgpKQorICAgICAgICBt
X3BhcmVudC0+c3RhcnRSZW5kZXJUaW1lcigpOyAvLyBTdGFydCB0aGUgcmVuZGVyIHRpbWVyIHNp
bmNlIHdlIGNvdWxkIGhhdmUgc29tZSBzdGFsZSBjb250ZW50IGhlcmUuLi4KK30KKwordm9pZCBS
ZW5kZXJRdWV1ZTo6YWRkVG9TY3JvbGxab29tUXVldWUoY29uc3QgUmVuZGVyUmVjdCYgcmVjdCwg
UmVuZGVyUmVjdExpc3QqIHJlY3RMaXN0KQoreworICAgIGlmIChzdGQ6OmZpbmQocmVjdExpc3Qt
PmJlZ2luKCksIHJlY3RMaXN0LT5lbmQoKSwgcmVjdCkgIT0gcmVjdExpc3QtPmVuZCgpKQorICAg
ICAgICByZXR1cm47CisKKyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiUmVu
ZGVyUXVldWU6OmFkZFRvU2Nyb2xsWm9vbVF1ZXVlICVkLCVkICVkeCVkIiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0Lmhl
aWdodCgpKTsKKyNlbmRpZgorICAgIHJlY3RMaXN0LT5wdXNoX2JhY2socmVjdCk7CisKKyAgICBp
ZiAoIWlzRW1wdHkoKSkKKyAgICAgICAgbV9wYXJlbnQtPnN0YXJ0UmVuZGVyVGltZXIoKTsgLy8g
U3RhcnQgdGhlIHJlbmRlciB0aW1lciBzaW5jZSB3ZSBrbm93IHdlIGNvdWxkIGhhdmUgc29tZSBj
aGVja2VyYm9hcmQgaGVyZS4uLgorfQorCit2b2lkIFJlbmRlclF1ZXVlOjpxdWlja1NvcnQoUmVu
ZGVyUmVjdExpc3QqIHF1ZXVlKQoreworICAgIHNpemVfdCBsZW5ndGggPSBxdWV1ZS0+c2l6ZSgp
OworICAgIGlmICghbGVuZ3RoKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICBxdWV1ZS0+YXQoaSkudXBkYXRlU29ydERp
cmVjdGlvbihtX3ByaW1hcnlTb3J0RGlyZWN0aW9uLCBtX3NlY29uZGFyeVNvcnREaXJlY3Rpb24p
OworICAgIHJldHVybiBzdGQ6OnNvcnQocXVldWUtPmJlZ2luKCksIHF1ZXVlLT5lbmQoKSwgUmVu
ZGVyUmVjdExlc3NUaGFuKG1fcHJpbWFyeVNvcnREaXJlY3Rpb24sIG1fc2Vjb25kYXJ5U29ydERp
cmVjdGlvbikpOworfQorCit2b2lkIFJlbmRlclF1ZXVlOjp1cGRhdGVTb3J0RGlyZWN0aW9uKGlu
dCBsYXN0RGVsdGFYLCBpbnQgbGFzdERlbHRhWSkKK3sKKyAgICBib29sIHByaW1hcnlJc0hvcml6
b250YWwgPSBhYnMobGFzdERlbHRhWCkgPj0gYWJzKGxhc3REZWx0YVkpOworICAgIGlmIChwcmlt
YXJ5SXNIb3Jpem9udGFsKSB7CisgICAgICAgIG1fcHJpbWFyeVNvcnREaXJlY3Rpb24gPSBsYXN0
RGVsdGFYIDw9IDAgPyBMZWZ0VG9SaWdodCA6IFJpZ2h0VG9MZWZ0OworICAgICAgICBtX3NlY29u
ZGFyeVNvcnREaXJlY3Rpb24gPSBsYXN0RGVsdGFZIDw9IDAgPyBUb3BUb0JvdHRvbSA6IEJvdHRv
bVRvVG9wOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcHJpbWFyeVNvcnREaXJlY3Rpb24gPSBs
YXN0RGVsdGFZIDw9IDAgPyBUb3BUb0JvdHRvbSA6IEJvdHRvbVRvVG9wOworICAgICAgICBtX3Nl
Y29uZGFyeVNvcnREaXJlY3Rpb24gPSBsYXN0RGVsdGFYIDw9IDAgPyBMZWZ0VG9SaWdodCA6IFJp
Z2h0VG9MZWZ0OworICAgIH0KK30KKwordm9pZCBSZW5kZXJRdWV1ZTo6dmlzaWJsZUNvbnRlbnRD
aGFuZ2VkKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiB2aXNpYmxlQ29udGVudCkKK3sKKyAgICBp
ZiAobV92aXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgpICYmIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMu
ZW1wdHkoKSkgeworICAgICAgICBBU1NFUlQobV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5l
bXB0eSgpICYmIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQuZW1wdHkoKSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBNb3ZlIHZpc2libGVTY3JvbGxKb2JzIHRvIG5v
blZpc2libGVTY3JvbGxKb2JzIGlmIHRoZXkgZG8gbm90IGludGVyc2VjdAorICAgIC8vIHRoZSB2
aXNpYmxlIGNvbnRlbnQgcmVjdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdmlzaWJs
ZVNjcm9sbEpvYnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVuZGVyUmVjdCByZWN0ID0gbV92
aXNpYmxlU2Nyb2xsSm9icy5hdChpKTsKKyAgICAgICAgaWYgKCFyZWN0LmludGVyc2VjdHModmlz
aWJsZUNvbnRlbnQpKSB7CisgICAgICAgICAgICBtX3Zpc2libGVTY3JvbGxKb2JzLmVyYXNlKG1f
dmlzaWJsZVNjcm9sbEpvYnMuYmVnaW4oKSArIGkpOworICAgICAgICAgICAgYWRkVG9TY3JvbGxa
b29tUXVldWUocmVjdCwgJm1fbm9uVmlzaWJsZVNjcm9sbEpvYnMpOworICAgICAgICAgICAgLS1p
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRG8gdGhlIHNhbWUgZm9yIHRoZSBjb21wbGV0
ZWQgbGlzdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdmlzaWJsZVNjcm9sbEpvYnND
b21wbGV0ZWQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVuZGVyUmVjdCByZWN0ID0gbV92aXNp
YmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5hdChpKTsKKyAgICAgICAgaWYgKCFyZWN0LmludGVyc2Vj
dHModmlzaWJsZUNvbnRlbnQpKSB7CisgICAgICAgICAgICBtX3Zpc2libGVTY3JvbGxKb2JzQ29t
cGxldGVkLmVyYXNlKG1fdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQuYmVnaW4oKSArIGkpOwor
ICAgICAgICAgICAgYWRkVG9TY3JvbGxab29tUXVldWUocmVjdCwgJm1fbm9uVmlzaWJsZVNjcm9s
bEpvYnNDb21wbGV0ZWQpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gTW92ZSBub25WaXNpYmxlU2Nyb2xsSm9icyB0byB2aXNpYmxlU2Nyb2xsSm9icyBpZiB0
aGV5IGRvIGludGVyc2VjdAorICAgIC8vIHRoZSB2aXNpYmxlIGNvbnRlbnQgcmVjdC4KKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuc2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgUmVuZGVyUmVjdCByZWN0ID0gbV9ub25WaXNpYmxlU2Nyb2xsSm9icy5hdChp
KTsKKyAgICAgICAgaWYgKHJlY3QuaW50ZXJzZWN0cyh2aXNpYmxlQ29udGVudCkpIHsKKyAgICAg
ICAgICAgIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuZXJhc2UobV9ub25WaXNpYmxlU2Nyb2xsSm9i
cy5iZWdpbigpICsgaSk7CisgICAgICAgICAgICBhZGRUb1Njcm9sbFpvb21RdWV1ZShyZWN0LCAm
bV92aXNpYmxlU2Nyb2xsSm9icyk7CisgICAgICAgICAgICAtLWk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICAvLyBEbyB0aGUgc2FtZSBmb3IgdGhlIGNvbXBsZXRlZCBsaXN0LgorICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbV9ub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5zaXplKCk7
ICsraSkgeworICAgICAgICBSZW5kZXJSZWN0IHJlY3QgPSBtX25vblZpc2libGVTY3JvbGxKb2Jz
Q29tcGxldGVkLmF0KGkpOworICAgICAgICBpZiAocmVjdC5pbnRlcnNlY3RzKHZpc2libGVDb250
ZW50KSkgeworICAgICAgICAgICAgbV9ub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lcmFz
ZShtX25vblZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLmJlZ2luKCkgKyBpKTsKKyAgICAgICAg
ICAgIGFkZFRvU2Nyb2xsWm9vbVF1ZXVlKHJlY3QsICZtX3Zpc2libGVTY3JvbGxKb2JzQ29tcGxl
dGVkKTsKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3Zp
c2libGVTY3JvbGxKb2JzLmVtcHR5KCkgJiYgIW1fdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQu
ZW1wdHkoKSkKKyAgICAgICAgdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQoZmFsc2UgLypzaG91
bGRCbGl0Ki8pOworCisgICAgaWYgKG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKSAmJiAh
bV9ub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lbXB0eSgpKQorICAgICAgICBub25WaXNp
YmxlU2Nyb2xsSm9ic0NvbXBsZXRlZCgpOworCisgICAgLy8gV2Ugc2hvdWxkbid0IGJlIGVtcHR5
IGJlY2F1c2UgdGhlIGVhcmx5IHJldHVybiBhYm92ZSBhbmQgdGhlIGZhY3QgdGhhdCB0aGlzCisg
ICAgLy8gbWV0aG9kIGp1c3Qgc2h1ZmZsZXMgcmVjdHMgZnJvbSBxdWV1ZSB0byBxdWV1ZSBoZW5j
ZSB0aGUgdG90YWwgbnVtYmVyIG9mCisgICAgLy8gcmVjdHMgaW4gdGhlIHZhcmlvdXMgcXVldWVz
IHNob3VsZCBiZSBjb25zZXJ2ZWQuCisgICAgQVNTRVJUKCFpc0VtcHR5KCkpOworfQorCit2b2lk
IFJlbmRlclF1ZXVlOjpjbGVhcihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgcmVnaW9u
LCBib29sIGNsZWFyUmVndWxhclJlbmRlckpvYnMpCit7CisgICAgSW50UmVjdExpc3QgcmVjdHMg
PSByZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlY3RzLnNpemUo
KTsgKytpKQorICAgICAgICBjbGVhcihyZWN0cy5hdChpKSwgY2xlYXJSZWd1bGFyUmVuZGVySm9i
cyk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OmNsZWFyKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiByZWN0LCBib29sIGNsZWFyUmVndWxhclJlbmRlckpvYnMpCit7CisgICAgaWYgKG1fdmlzaWJs
ZVNjcm9sbEpvYnMuZW1wdHkoKSAmJiBtX25vblZpc2libGVTY3JvbGxKb2JzLmVtcHR5KCkpCisg
ICAgICAgIEFTU0VSVChtX3Zpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLmVtcHR5KCkgJiYgbV9u
b25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5lbXB0eSgpKTsKKworICAgIC8vIFJlbW92ZSBh
bGwgcmVjdHMgZnJvbSBhbGwgcXVldWVzIHRoYXQgYXJlIGNvbnRhaW5lZCBieSB0aGlzIHJlY3Qu
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3Zpc2libGVTY3JvbGxKb2JzLnNpemUoKTsg
KytpKSB7CisgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fdmlzaWJsZVNjcm9sbEpvYnMuYXQo
aSkpKSB7CisgICAgICAgICAgICBtX3Zpc2libGVTY3JvbGxKb2JzLmVyYXNlKG1fdmlzaWJsZVNj
cm9sbEpvYnMuYmVnaW4oKSArIGkpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAg
fQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3Zpc2libGVTY3JvbGxKb2JzQ29tcGxl
dGVkLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fdmlzaWJsZVNj
cm9sbEpvYnNDb21wbGV0ZWQuYXQoaSkpKSB7CisgICAgICAgICAgICBtX3Zpc2libGVTY3JvbGxK
b2JzQ29tcGxldGVkLmVyYXNlKG1fdmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQuYmVnaW4oKSAr
IGkpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX25vblZpc2libGVTY3JvbGxKb2JzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuYXQoaSkpKSB7Cisg
ICAgICAgICAgICBtX25vblZpc2libGVTY3JvbGxKb2JzLmVyYXNlKG1fbm9uVmlzaWJsZVNjcm9s
bEpvYnMuYmVnaW4oKSArIGkpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQor
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX25vblZpc2libGVTY3JvbGxKb2JzQ29tcGxl
dGVkLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fbm9uVmlzaWJs
ZVNjcm9sbEpvYnNDb21wbGV0ZWQuYXQoaSkpKSB7CisgICAgICAgICAgICBtX25vblZpc2libGVT
Y3JvbGxKb2JzQ29tcGxldGVkLmVyYXNlKG1fbm9uVmlzaWJsZVNjcm9sbEpvYnNDb21wbGV0ZWQu
YmVnaW4oKSArIGkpOworICAgICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQorCisgICAg
Ly8gT25seSBjbGVhciB0aGUgcmVndWxhciByZW5kZXIgam9icyBpZiB0aGUgZmxhZyBoYXMgYmVl
biBzZXQuCisgICAgaWYgKGNsZWFyUmVndWxhclJlbmRlckpvYnMpCisgICAgICAgIHRoaXMtPmNs
ZWFyUmVndWxhclJlbmRlckpvYnMocmVjdCk7CisKKyAgICBpZiAobV92aXNpYmxlU2Nyb2xsSm9i
cy5lbXB0eSgpICYmICFtX3Zpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLmVtcHR5KCkpCisgICAg
ICAgIHZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkKGZhbHNlIC8qc2hvdWxkQmxpdCovKTsKKwor
ICAgIGlmIChtX25vblZpc2libGVTY3JvbGxKb2JzLmVtcHR5KCkgJiYgIW1fbm9uVmlzaWJsZVNj
cm9sbEpvYnNDb21wbGV0ZWQuZW1wdHkoKSkKKyAgICAgICAgbm9uVmlzaWJsZVNjcm9sbEpvYnND
b21wbGV0ZWQoKTsKKworICAgIGlmIChpc0VtcHR5KCkpCisgICAgICAgICBtX3BhcmVudC0+c3Rv
cFJlbmRlclRpbWVyKCk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OmNsZWFyUmVndWxhclJlbmRl
ckpvYnMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpCit7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoLnNpemUoKTsgKytpKSB7
CisgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zKG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0
Y2guYXQoaSkpKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNo
LmVyYXNlKG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2guYmVnaW4oKSArIGkpOworICAg
ICAgICAgICAgLS1pOworICAgICAgICB9CisgICAgfQorICAgIG1fcmVndWxhclJlbmRlckpvYnNS
ZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKG1fcmVndWxh
clJlbmRlckpvYnNSZWdpb24sIHJlY3QpOworICAgIG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2Jz
QmF0Y2hSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKG1f
Y3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hSZWdpb24sIHJlY3QpOworICAgIG1fcmVndWxh
clJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpz
dWJ0cmFjdFJlZ2lvbnMobV9yZWd1bGFyUmVuZGVySm9ic05vdFJlbmRlcmVkUmVnaW9uLCByZWN0
KTsKK30KKwordm9pZCBSZW5kZXJRdWV1ZTo6Y2xlYXJWaXNpYmxlWm9vbSgpCit7CisgICAgbV92
aXNpYmxlWm9vbUpvYnMuY2xlYXIoKTsKKyAgICBpZiAoaXNFbXB0eSgpKQorICAgICAgICAgbV9w
YXJlbnQtPnN0b3BSZW5kZXJUaW1lcigpOworfQorCitib29sIFJlbmRlclF1ZXVlOjpyZWd1bGFy
UmVuZGVySm9ic1ByZXZpb3VzbHlBdHRlbXB0ZWRCdXROb3RSZW5kZXJlZChjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gbV9yZWd1bGFyUmVuZGVySm9ic05vdFJl
bmRlcmVkUmVnaW9uLmlzUmVjdEluUmVnaW9uKHJlY3QpICE9IFBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uOjpOb3RJblJlZ2lvbjsKK30KKwordm9pZCBSZW5kZXJRdWV1ZTo6cmVuZGVyKGJvb2wgc2hv
dWxkUGVyZm9ybVJlZ3VsYXJSZW5kZXJKb2JzKQoreworICAgIC8vIFdlIHJlcXVlc3QgYSBsYXlv
dXQgaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSdyZSBleGVjdXRpbmcgam9icyBpbiB0aGUgY29ycmVj
dAorICAgIC8vIG9yZGVyLiBJZiB3ZSBkaWRuJ3QgcmVxdWVzdCBhIGxheW91dCBoZXJlIHRoZW4g
dGhlIGpvYnMgYmVsb3cgY291bGQgcmVzdWx0CisgICAgLy8gaW4gYSBsYXlvdXQgYW5kIHRoYXQg
bGF5b3V0IGNhbiBhbHRlciB0aGlzIHF1ZXVlLiBTbyByZXF1ZXN0IGxheW91dCBpZiBuZWVkZWQK
KyAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgcXVldWVzIGJlbG93IGFyZSBpbiBjb25zdGFudCBz
dGF0ZSBiZWZvcmUgcGVyZm9ybWluZyB0aGUKKyAgICAvLyBuZXh0IHJlbmRlcmluZyBqb2IuCisK
KyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICAvLyBTdGFydCB0aGUgdGltZSBtZWFzdXJlbWVu
dC4KKyAgICBkb3VibGUgdGltZSA9IFdURjo6Y3VycmVudFRpbWUoKTsKKyNlbmRpZgorCisgICAg
bV9wYXJlbnQtPnJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworCisjaWYgREVCVUdfUkVOREVSX1FV
RVVFCisgICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJlbnRUaW1lKCkgLSB0aW1lOworICAg
IGlmIChlbGFwc2VkKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiUmVuZGVyUXVldWU6OnJlbmRlciBsYXlv
dXQgZWxhcHNlZD0lZiIsIGVsYXBzZWQpOworI2VuZGlmCisKKyAgICAvLyBFbXB0eSB0aGUgcXVl
dWVzIGluIGEgcHJlY2lzZSBvcmRlciBvZiBwcmlvcml0eS4KKyAgICBpZiAoIW1fdmlzaWJsZVpv
b21Kb2JzLmVtcHR5KCkpCisgICAgICAgIHJlbmRlclZpc2libGVab29tSm9iKCk7CisgICAgZWxz
ZSBpZiAoIW1fdmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKSkKKyAgICAgICAgcmVuZGVyVmlzaWJs
ZVNjcm9sbEpvYigpOworICAgIGVsc2UgaWYgKHNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9i
cyAmJiAoIW1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2guZW1wdHkoKSB8fCAhbV9yZWd1
bGFyUmVuZGVySm9ic1JlZ2lvbi5pc0VtcHR5KCkpKSB7CisgICAgICAgIGlmIChjdXJyZW50UmVn
dWxhclJlbmRlckpvYkJhdGNoVW5kZXJQcmVzc3VyZSgpKQorICAgICAgICAgICAgcmVuZGVyQWxs
Q3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJl
bmRlclJlZ3VsYXJSZW5kZXJKb2IoKTsKKyAgICB9IGVsc2UgaWYgKCFtX25vblZpc2libGVTY3Jv
bGxKb2JzLmVtcHR5KCkpCisgICAgICAgIHJlbmRlck5vblZpc2libGVTY3JvbGxKb2IoKTsKKwor
ICAgIGlmIChpc0VtcHR5KCkpCisgICAgICAgIG1fcGFyZW50LT5zdG9wUmVuZGVyVGltZXIoKTsK
K30KKwordm9pZCBSZW5kZXJRdWV1ZTo6cmVuZGVyQWxsQ3VycmVudFJlZ3VsYXJSZW5kZXJKb2Jz
KCkKK3sKKyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICAvLyBTdGFydCB0aGUgdGltZSBtZWFz
dXJlbWVudC4uLgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50VGltZSgpOworI2VuZGlm
CisKKyAgICAvLyBSZXF1ZXN0IGxheW91dCBmaXJzdAorICAgIG1fcGFyZW50LT5yZXF1ZXN0TGF5
b3V0SWZOZWVkZWQoKTsKKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorICAgIGRvdWJsZSBlbGFw
c2VkID0gV1RGOjpjdXJyZW50VGltZSgpIC0gdGltZTsKKyAgICBpZiAoZWxhcHNlZCkKKyAgICAg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2
ZWxDcml0aWNhbCwgIlJlbmRlclF1ZXVlOjpyZW5kZXJBbGxDdXJyZW50UmVndWxhclJlbmRlckpv
YnMgbGF5b3V0IGVsYXBzZWQ9JWYiLCBlbGFwc2VkKTsKKyNlbmRpZgorCisgICAgLy8gVGhlIHN0
YXRlIG9mIHJlbmRlciBxdWV1ZSBtYXkgYmUgbW9kaWZpZWQgZnJvbSBpbnNpZGUgcmVxdWVzdExh
eW91dElmTmVlZGVkLgorICAgIC8vIEluIGZhY3QsIGl0IGNhbiBldmVuIGJlIGVtcHRpZWQgZW50
aXJlbHkhIExheW91dCBjYW4gdHJpZ2dlciBhIGNhbGwgdG8KKyAgICAvLyBSZW5kZXJRdWV1ZTo6
Y2xlYXIuIFNlZSBQUiMxMDE4MTEgZm9yIGluc3RhbmNlLiBTbyB3ZSBzaG91bGQgY2hlY2sgYWdh
aW4gaGVyZS4KKyAgICBpZiAoIWhhc0N1cnJlbnRSZWd1bGFyUmVuZGVySm9iKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgYmF0Y2ggb2Ygam9icywg
dGhlbiBjcmVhdGUgb25lLgorICAgIGlmIChtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNo
UmVnaW9uLmlzRW1wdHkoKSkgeworCisgICAgICAgIC8vIENyZWF0ZSBhIGN1cnJlbnQgcmVnaW9u
IG9iamVjdCBmcm9tIG91ciByZWd1bGFyIHJlbmRlciByZWdpb24uCisgICAgICAgIG1fY3VycmVu
dFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hSZWdpb24gPSBtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9u
OworCisgICAgICAgIC8vIENsZWFyIHRoaXMgc2luY2Ugd2UncmUgYWJvdXQgdG8gcmVuZGVyIGV2
ZXJ5dGhpbmcuCisgICAgICAgIG1fcmVndWxhclJlbmRlckpvYnNSZWdpb24gPSBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbigpOworICAgIH0KKworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHJl
Z2lvbk5vdFJlbmRlcmVkOworICAgIGlmIChtX3BhcmVudC0+c2hvdWxkU3VwcHJlc3NOb25WaXNp
YmxlUmVndWxhclJlbmRlckpvYnMoKSkgeworICAgICAgICAvLyBSZWNvcmQgYW55IHBhcnQgb2Yg
dGhlIHJlZ2lvbiB0aGF0IGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBjdXJyZW50IHZpc2libGUgY29u
dGVudHMgcmVjdC4KKyAgICAgICAgcmVnaW9uTm90UmVuZGVyZWQgPSBQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hS
ZWdpb24sIG1fcGFyZW50LT52aXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgICAgICBtX3JlZ3Vs
YXJSZW5kZXJKb2JzTm90UmVuZGVyZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6
dW5pb25SZWdpb25zKG1fcmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbiwgcmVnaW9u
Tm90UmVuZGVyZWQpOworCisjaWYgREVCVUdfUkVOREVSX1FVRVVFCisgICAgICAgIGlmICghcmVn
aW9uTm90UmVuZGVyZWQuaXNFbXB0eSgpKQorICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlbmRlclF1
ZXVlOjpyZW5kZXJBbGxDdXJyZW50UmVndWxhclJlbmRlckpvYnMgcmVnaW9uIG5vdCBjb21wbGV0
ZWx5IHJlbmRlcmVkISIpOworI2VuZGlmCisKKyAgICAgICAgLy8gQ2xpcCB0byB0aGUgdmlzaWJs
ZSBjb250ZW50cyBzbyB3ZSdsbCBiZSBmYXN0ZXIuCisgICAgICAgIG1fY3VycmVudFJlZ3VsYXJS
ZW5kZXJKb2JzQmF0Y2hSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0
UmVnaW9ucyhtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uLCBtX3BhcmVudC0+
dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICB9CisKKyAgICBib29sIHJlbmRlcmVkID0gZmFs
c2U7CisgICAgaWYgKCFtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uLmlzRW1w
dHkoKSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxQbGF0Zm9ybTo6SW50UmVjdD4gcmVjdExpc3Qg
PSBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uLnJlY3RzKCk7CisgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdExpc3Quc2l6ZSgpOyArK2kpCisgICAgICAgICAg
ICByZW5kZXJlZCA9IG1fcGFyZW50LT5yZW5kZXIocmVjdExpc3QuYXQoaSkpID8gdHJ1ZSA6IHJl
bmRlcmVkOworICAgIH0KKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorICAgIC8vIFN0b3AgdGhl
IHRpbWUgbWVhc3VyZW1lbnQuCisgICAgZWxhcHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRp
bWU7CisgICAgUGxhdGZvcm06OkludFJlY3QgZXh0ZW50cyA9IG1fY3VycmVudFJlZ3VsYXJSZW5k
ZXJKb2JzQmF0Y2hSZWdpb24uZXh0ZW50cygpOworICAgIGludCBudW1iZXJPZlJlY3RzID0gbV9j
dXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFJlZ2lvbi5yZWN0cygpLnNpemUoKTsKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENy
aXRpY2FsLCAiUmVuZGVyUXVldWU6OnJlbmRlckFsbEN1cnJlbnRSZWd1bGFyUmVuZGVySm9icyBl
eHRlbnRzPSglZCwlZCAlZHglZCkgbnVtYmVyT2ZSZWN0cz0lZCBlbGFwc2VkPSVmIiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGV4dGVudHMueCgpLCBleHRlbnRzLnkoKSwgZXh0ZW50cy53
aWR0aCgpLCBleHRlbnRzLmhlaWdodCgpLCBudW1iZXJPZlJlY3RzLCBlbGFwc2VkKTsKKyNlbmRp
ZgorCisgICAgLy8gQ2xlYXIgdGhlIHJlZ2lvbiBhbmQgYmxpdCBzaW5jZSB0aGlzIGJhdGNoIGlz
IG5vdyBjb21wbGV0ZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCByZW5kZXJlZFJlY3QgPSBtX2N1
cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uLmV4dGVudHMoKTsKKyAgICBtX2N1cnJl
bnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoLmNsZWFyKCk7CisgICAgbV9jdXJyZW50UmVndWxhclJl
bmRlckpvYnNCYXRjaFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKCk7CisgICAgbV9j
dXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFVuZGVyUHJlc3N1cmUgPSBmYWxzZTsKKworICAg
IC8vIFVwZGF0ZSB0aGUgc2NyZWVuIG9ubHkgaWYgd2UncmUgbm90IHNjcm9sbGluZyBvciB6b29t
aW5nLgorICAgIGlmIChyZW5kZXJlZCAmJiAhbV9wYXJlbnQtPmlzU2Nyb2xsaW5nT3Jab29taW5n
KCkpIHsKKyAgICAgICAgaWYgKCFtX3BhcmVudC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5k
b3coKSkKKyAgICAgICAgICAgIG1fcGFyZW50LT5ibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIG1fcGFyZW50LT5pbnZhbGlkYXRlV2luZG93KCk7CisgICAg
ICAgIG1fcGFyZW50LT5tX3dlYlBhZ2UtPmNsaWVudCgpLT5ub3RpZnlDb250ZW50UmVuZGVyZWQo
cmVuZGVyZWRSZWN0KTsKKyAgICB9CisKKyAgICBpZiAobV9wYXJlbnQtPnNob3VsZFN1cHByZXNz
Tm9uVmlzaWJsZVJlZ3VsYXJSZW5kZXJKb2JzKCkgJiYgIXJlZ2lvbk5vdFJlbmRlcmVkLmlzRW1w
dHkoKSkKKyAgICAgICAgbV9wYXJlbnQtPnVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJl
ZFJlZ2lvbihmYWxzZSAvKmNoZWNrTG9hZGluZyovKTsKK30KKwordm9pZCBSZW5kZXJRdWV1ZTo6
c3RhcnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hJZk5lZWRlZCgpCit7CisgICAgaWYgKCFtX2N1cnJl
bnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoLmVtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIERlY29tcG9zZSB0aGUgY3VycmVudCByZWd1bGFyIHJlbmRlciBqb2IgcmVnaW9uIGludG8g
cmVuZGVyIHJlY3QgcGllY2VzLgorICAgIEludFJlY3RMaXN0IHJlZ3VsYXJSZW5kZXJKb2JzID0g
bV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lvbi5yZWN0cygpOworCisgICAgLy8gVGhlIGN1cnJlbnQg
YmF0Y2guLi4KKyAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoID0gcmVndWxhclJl
bmRlckpvYnM7CisKKyAgICAvLyBDcmVhdGUgYSByZWdpb24gb2JqZWN0IHRoYXQgd2lsbCBiZSBj
aGVja2VkIHdoZW4gYWRkaW5nIG5ldyByZWN0cyBiZWZvcmUKKyAgICAvLyB0aGlzIGJhdGNoIGhh
cyBiZWVuIGNvbXBsZXRlZC4KKyAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVn
aW9uID0gbV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lvbjsKKworICAgIC8vIENsZWFyIHRoZSBmb3Jt
ZXIgcmVnaW9uIHNpbmNlIGl0IGlzIG5vdyBwYXJ0IG9mIHRoaXMgYmF0Y2guCisgICAgbV9yZWd1
bGFyUmVuZGVySm9ic1JlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKCk7CisKKyNpZiBE
RUJVR19SRU5ERVJfUVVFVUUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiUmVuZGVyUXVldWU6OnN0YXJ0UmVndWxh
clJlbmRlckpvYkJhdGNoSWZOZWVkZWQgYmF0Y2ggc2l6ZSBpcyAlZCEiLCBtX2N1cnJlbnRSZWd1
bGFyUmVuZGVySm9ic0JhdGNoLnNpemUoKSk7CisjZW5kaWYKK30KKwordm9pZCBSZW5kZXJRdWV1
ZTo6cmVuZGVyVmlzaWJsZVpvb21Kb2IoKQoreworICAgIEFTU0VSVChtX3Zpc2libGVab29tSm9i
cy5zaXplKCkgPiAwKTsKKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorICAgIC8vIFN0YXJ0IHRo
ZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50VGltZSgp
OworI2VuZGlmCisKKyAgICBSZW5kZXJSZWN0KiByZWN0ID0gJm1fdmlzaWJsZVpvb21Kb2JzWzBd
OworICAgIEFTU0VSVCghcmVjdC0+aXNDb21wbGV0ZWQoKSk7CisgICAgUGxhdGZvcm06OkludFJl
Y3Qgc3ViUmVjdCA9IHJlY3QtPnJlY3RGb3JSZW5kZXJpbmcoKTsKKyAgICBpZiAocmVjdC0+aXND
b21wbGV0ZWQoKSkKKyAgICAgICAgbV92aXNpYmxlWm9vbUpvYnMuZXJhc2UobV92aXNpYmxlWm9v
bUpvYnMuYmVnaW4oKSk7CisKKyAgICBtX3BhcmVudC0+cmVuZGVyKHN1YlJlY3QpOworCisgICAg
Ly8gUmVjb3JkIHRoYXQgaXQgaGFzIG5vdyBiZWVuIHJlbmRlcmVkIHZpYSBhIGRpZmZlcmVudCB0
eXBlIG9mIGpvYi4uLgorICAgIGNsZWFyUmVndWxhclJlbmRlckpvYnMoc3ViUmVjdCk7CisKKyNp
ZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50Cisg
ICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJlbnRUaW1lKCkgLSB0aW1lOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsICJSZW5kZXJRdWV1ZTo6cmVuZGVyVmlzaWJsZVpvb21Kb2IgcmVjdD0oJWQsJWQgJWR4JWQp
IGVsYXBzZWQ9JWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVjdC54KCksIHN1
YlJlY3QueSgpLCBzdWJSZWN0LndpZHRoKCksIHN1YlJlY3QuaGVpZ2h0KCksIGVsYXBzZWQpOwor
I2VuZGlmCit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OnJlbmRlclZpc2libGVTY3JvbGxKb2IoKQor
eworICAgIEFTU0VSVCghbV92aXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgpKTsKKworI2lmIERFQlVH
X1JFTkRFUl9RVUVVRSB8fCBERUJVR19SRU5ERVJfUVVFVUVfU09SVAorICAgIC8vIFN0YXJ0IHRo
ZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50VGltZSgp
OworI2VuZGlmCisKKyAgICBxdWlja1NvcnQoJm1fdmlzaWJsZVNjcm9sbEpvYnMpOworCisjaWYg
REVCVUdfUkVOREVSX1FVRVVFX1NPUlQKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50
CisgICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJlbnRUaW1lKCkgLSB0aW1lOworICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3Jp
dGljYWwsICJSZW5kZXJRdWV1ZTo6cmVuZGVyVmlzaWJsZVNjcm9sbEpvYiBzb3J0IGVsYXBzZWQ9
JWYiLCBlbGFwc2VkKTsKKyNlbmRpZgorCisgICAgUmVuZGVyUmVjdCByZWN0ID0gbV92aXNpYmxl
U2Nyb2xsSm9ic1swXTsKKyAgICBtX3Zpc2libGVTY3JvbGxKb2JzLmVyYXNlKG1fdmlzaWJsZVNj
cm9sbEpvYnMuYmVnaW4oKSk7CisKKyAgICBBU1NFUlQoIXJlY3QuaXNDb21wbGV0ZWQoKSk7Cisg
ICAgUGxhdGZvcm06OkludFJlY3Qgc3ViUmVjdCA9IHJlY3QucmVjdEZvclJlbmRlcmluZygpOwor
ICAgIGlmIChyZWN0LmlzQ29tcGxldGVkKCkpCisgICAgICAgIG1fdmlzaWJsZVNjcm9sbEpvYnND
b21wbGV0ZWQucHVzaF9iYWNrKHJlY3QpOworICAgIGVsc2UKKyAgICAgICAgbV92aXNpYmxlU2Ny
b2xsSm9icy5pbnNlcnQobV92aXNpYmxlU2Nyb2xsSm9icy5iZWdpbigpLCByZWN0KTsKKworICAg
IG1fcGFyZW50LT5yZW5kZXIoc3ViUmVjdCk7CisKKyAgICAvLyBSZWNvcmQgdGhhdCBpdCBoYXMg
bm93IGJlZW4gcmVuZGVyZWQgdmlhIGEgZGlmZmVyZW50IHR5cGUgb2Ygam9iLi4uCisgICAgY2xl
YXJSZWd1bGFyUmVuZGVySm9icyhzdWJSZWN0KTsKKworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQor
ICAgIC8vIFN0b3AgdGhlIHRpbWUgbWVhc3VyZW1lbnQKKyAgICBkb3VibGUgZWxhcHNlZCA9IFdU
Rjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlbmRlclF1ZXVlOjpyZW5k
ZXJWaXNpYmxlU2Nyb2xsSm9iIHJlY3Q9KCVkLCVkICVkeCVkKSBlbGFwc2VkPSVmIiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN1YlJlY3QueCgpLCBzdWJSZWN0LnkoKSwgc3ViUmVjdC53
aWR0aCgpLCBzdWJSZWN0LmhlaWdodCgpLCBlbGFwc2VkKTsKKyNlbmRpZgorCisgICAgaWYgKG1f
dmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKSkKKyAgICAgICAgdmlzaWJsZVNjcm9sbEpvYnNDb21w
bGV0ZWQodHJ1ZSAvKnNob3VsZEJsaXQqLyk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OnJlbmRl
clJlZ3VsYXJSZW5kZXJKb2IoKQoreworI2lmIERFQlVHX1JFTkRFUl9RVUVVRQorICAgIC8vIFN0
YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50
VGltZSgpOworI2VuZGlmCisKKyAgICBBU1NFUlQoIW1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2Jz
QmF0Y2guZW1wdHkoKSB8fCAhbV9yZWd1bGFyUmVuZGVySm9ic1JlZ2lvbi5pc0VtcHR5KCkpOwor
CisgICAgc3RhcnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hJZk5lZWRlZCgpOworCisgICAgLy8gVGFr
ZSB0aGUgZmlyc3Qgam9iIGZyb20gdGhlIHJlZ3VsYXIgcmVuZGVyIGpvYiBxdWV1ZS4KKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCByZWN0ID0gbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFsw
XTsKKyAgICBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uID0gUGxhdGZvcm06
OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9i
c0JhdGNoUmVnaW9uLCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbihyZWN0KSk7CisgICAgbV9jdXJy
ZW50UmVndWxhclJlbmRlckpvYnNCYXRjaC5lcmFzZShtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9i
c0JhdGNoLmJlZ2luKCkpOworCisgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gcmVnaW9uTm90
UmVuZGVyZWQ7CisgICAgaWYgKG1fcGFyZW50LT5zaG91bGRTdXBwcmVzc05vblZpc2libGVSZWd1
bGFyUmVuZGVySm9icygpKSB7CisgICAgICAgIC8vIFJlY29yZCBhbnkgcGFydCBvZiB0aGUgcmVn
aW9uIHRoYXQgZG9lc24ndCBpbnRlcnNlY3QgdGhlIGN1cnJlbnQgdmlzaWJsZSB0aWxlcyByZWN0
LgorICAgICAgICByZWdpb25Ob3RSZW5kZXJlZCA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpz
dWJ0cmFjdFJlZ2lvbnMocmVjdCwgbV9wYXJlbnQtPnZpc2libGVDb250ZW50c1JlY3QoKSk7Cisg
ICAgICAgIG1fcmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbiA9IFBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uOjp1bmlvblJlZ2lvbnMobV9yZWd1bGFyUmVuZGVySm9ic05vdFJlbmRlcmVk
UmVnaW9uLCByZWdpb25Ob3RSZW5kZXJlZCk7CisKKyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAg
ICAgICAgaWYgKCFyZWdpb25Ob3RSZW5kZXJlZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3Jp
dGljYWwsICJSZW5kZXJRdWV1ZTo6cmVuZGVyUmVndWxhclJlbmRlckpvYiByZWN0ICglZCwlZCAl
ZHglZCkgbm90IGNvbXBsZXRlbHkgcmVuZGVyZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQo
KSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIENsaXAgdG8gdGhlIHZpc2libGUg
dGlsZXMgc28gd2UnbGwgYmUgZmFzdGVyLgorICAgICAgICByZWN0LmludGVyc2VjdChtX3BhcmVu
dC0+dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICB9CisKKyAgICBpZiAoIXJlY3QuaXNFbXB0
eSgpKQorICAgICAgICBtX3BhcmVudC0+cmVuZGVyKHJlY3QpOworCisjaWYgREVCVUdfUkVOREVS
X1FVRVVFCisgICAgLy8gU3RvcCB0aGUgdGltZSBtZWFzdXJlbWVudC4KKyAgICBkb3VibGUgZWxh
cHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlbmRlclF1
ZXVlOjpyZW5kZXJSZWd1bGFyUmVuZGVySm9iIHJlY3Q9KCVkLCVkICVkeCVkKSBlbGFwc2VkPSVm
IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53
aWR0aCgpLCByZWN0LmhlaWdodCgpLCBlbGFwc2VkKTsKKyNlbmRpZgorCisgICAgaWYgKG1fY3Vy
cmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2guZW1wdHkoKSkgeworICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdCByZW5kZXJlZFJlY3QgPSBtX2N1cnJlbnRSZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVn
aW9uLmV4dGVudHMoKTsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIHJlZ2lvbiBhbmQgdGhlIGFuZCBi
bGl0IHNpbmNlIHRoaXMgYmF0Y2ggaXMgbm93IGNvbXBsZXRlLgorICAgICAgICBtX2N1cnJlbnRS
ZWd1bGFyUmVuZGVySm9ic0JhdGNoUmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb24oKTsK
KyAgICAgICAgbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFVuZGVyUHJlc3N1cmUgPSBm
YWxzZTsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzY3JlZW4gb25seSBpZiB3ZSdyZSBub3Qgc2Ny
b2xsaW5nIG9yIHpvb21pbmcuCisgICAgICAgIGlmICghbV9wYXJlbnQtPmlzU2Nyb2xsaW5nT3Ja
b29taW5nKCkpIHsKKyAgICAgICAgICAgIGlmICghbV9wYXJlbnQtPnNob3VsZERpcmVjdFJlbmRl
cmluZ1RvV2luZG93KCkpCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPmJsaXRWaXNpYmxlQ29u
dGVudHMoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+aW52
YWxpZGF0ZVdpbmRvdygpOworICAgICAgICAgICAgbV9wYXJlbnQtPm1fd2ViUGFnZS0+Y2xpZW50
KCktPm5vdGlmeUNvbnRlbnRSZW5kZXJlZChyZW5kZXJlZFJlY3QpOworICAgICAgICB9CisgICAg
fQorCisgICAgLy8gTWFrZSBzdXJlIHdlIGRpZG4ndCBhbHRlciBzdGF0ZSBvZiB0aGUgcXVldWVz
IHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBlbXB0eQorICAgIC8vIGJlZm9yZSB0aGlzIG1ldGhvZCB3
YXMgY2FsbGVkLgorICAgIEFTU0VSVChtX3Zpc2libGVTY3JvbGxKb2JzLmVtcHR5KCkpOworCisg
ICAgaWYgKG1fcGFyZW50LT5zaG91bGRTdXBwcmVzc05vblZpc2libGVSZWd1bGFyUmVuZGVySm9i
cygpICYmICFyZWdpb25Ob3RSZW5kZXJlZC5pc0VtcHR5KCkpCisgICAgICAgIG1fcGFyZW50LT51
cGRhdGVUaWxlc0ZvclNjcm9sbE9yTm90UmVuZGVyZWRSZWdpb24oZmFsc2UgLypjaGVja0xvYWRp
bmcqLyk7Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6OnJlbmRlck5vblZpc2libGVTY3JvbGxKb2Io
KQoreworICAgIEFTU0VSVCghbV9ub25WaXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgpKTsKKworI2lm
IERFQlVHX1JFTkRFUl9RVUVVRSB8fCBERUJVR19SRU5ERVJfUVVFVUVfU09SVAorICAgIC8vIFN0
YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSB0aW1lID0gV1RGOjpjdXJyZW50
VGltZSgpOworI2VuZGlmCisKKyAgICBxdWlja1NvcnQoJm1fbm9uVmlzaWJsZVNjcm9sbEpvYnMp
OworCisjaWYgREVCVUdfUkVOREVSX1FVRVVFX1NPUlQKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1l
YXN1cmVtZW50LgorICAgIGRvdWJsZSBlbGFwc2VkID0gV1RGOjpjdXJyZW50VGltZSgpIC0gdGlt
ZTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpM
b2dMZXZlbENyaXRpY2FsLCAiUmVuZGVyUXVldWU6OnJlbmRlck5vblZpc2libGVTY3JvbGxKb2Ig
c29ydCBlbGFwc2VkPSVmIiwgZWxhcHNlZCk7CisjZW5kaWYKKworICAgIFJlbmRlclJlY3QgcmVj
dCA9IG1fbm9uVmlzaWJsZVNjcm9sbEpvYnNbMF07CisgICAgbV9ub25WaXNpYmxlU2Nyb2xsSm9i
cy5lcmFzZShtX25vblZpc2libGVTY3JvbGxKb2JzLmJlZ2luKCkpOworCisgICAgQVNTRVJUKCFy
ZWN0LmlzQ29tcGxldGVkKCkpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHN1YlJlY3QgPSByZWN0
LnJlY3RGb3JSZW5kZXJpbmcoKTsKKyAgICBpZiAocmVjdC5pc0NvbXBsZXRlZCgpKQorICAgICAg
ICBtX25vblZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLnB1c2hfYmFjayhyZWN0KTsKKyAgICBl
bHNlCisgICAgICAgIG1fbm9uVmlzaWJsZVNjcm9sbEpvYnMuaW5zZXJ0KG1fbm9uVmlzaWJsZVNj
cm9sbEpvYnMuYmVnaW4oKSwgcmVjdCk7CisKKyAgICBtX3BhcmVudC0+cmVuZGVyKHN1YlJlY3Qp
OworCisgICAgLy8gUmVjb3JkIHRoYXQgaXQgaGFzIG5vdyBiZWVuIHJlbmRlcmVkIHZpYSBhIGRp
ZmZlcmVudCB0eXBlIG9mIGpvYi4uLgorICAgIGNsZWFyUmVndWxhclJlbmRlckpvYnMoc3ViUmVj
dCk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgZGlkbid0IGFsdGVyIHN0YXRlIG9mIHRoZSBxdWV1
ZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGVtcHR5CisgICAgLy8gYmVmb3JlIHRoaXMgbWV0aG9k
IHdhcyBjYWxsZWQuCisgICAgQVNTRVJUKG1fdmlzaWJsZVNjcm9sbEpvYnMuZW1wdHkoKSk7CisK
KyNpZiBERUJVR19SRU5ERVJfUVVFVUUKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50
LgorICAgIGRvdWJsZSBlbGFwc2VkID0gV1RGOjpjdXJyZW50VGltZSgpIC0gdGltZTsKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENy
aXRpY2FsLCAiUmVuZGVyUXVldWU6OnJlbmRlck5vblZpc2libGVTY3JvbGxKb2IgcmVjdD0oJWQs
JWQgJWR4JWQpIGVsYXBzZWQ9JWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVj
dC54KCksIHN1YlJlY3QueSgpLCBzdWJSZWN0LndpZHRoKCksIHN1YlJlY3QuaGVpZ2h0KCksIGVs
YXBzZWQpOworI2VuZGlmCisKKyAgICBpZiAobV9ub25WaXNpYmxlU2Nyb2xsSm9icy5lbXB0eSgp
KQorICAgICAgICBub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZCgpOworfQorCit2b2lkIFJl
bmRlclF1ZXVlOjp2aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZChib29sIHNob3VsZEJsaXQpCit7
CisgICAgLy8gTm93IGJsaXQgdG8gdGhlIHNjcmVlbiBpZiB3ZSBhcmUgZG9uZSBhbmQgZ2V0IHJp
ZCBvZiB0aGUgY29tcGxldGVkIGxpc3QhCisgICAgQVNTRVJUKG1fdmlzaWJsZVNjcm9sbEpvYnMu
ZW1wdHkoKSk7CisgICAgbV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZC5jbGVhcigpOworICAg
IGlmIChzaG91bGRCbGl0ICYmICFtX3BhcmVudC0+aXNTY3JvbGxpbmdPclpvb21pbmcoKSkgewor
ICAgICAgICBpZiAoIW1fcGFyZW50LT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQor
ICAgICAgICAgICAgbV9wYXJlbnQtPmJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgbV9wYXJlbnQtPmludmFsaWRhdGVXaW5kb3coKTsKKyAgICAgICAgbV9w
YXJlbnQtPm1fd2ViUGFnZS0+Y2xpZW50KCktPm5vdGlmeUNvbnRlbnRSZW5kZXJlZChtX3BhcmVu
dC0+dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyUXVldWU6
Om5vblZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkKCkKK3sKKyAgICAvLyBHZXQgcmlkIG9mIHRo
ZSBjb21wbGV0ZWQgbGlzdCEKKyAgICBBU1NFUlQobV9ub25WaXNpYmxlU2Nyb2xsSm9icy5lbXB0
eSgpKTsKKyAgICBtX25vblZpc2libGVTY3JvbGxKb2JzQ29tcGxldGVkLmNsZWFyKCk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYktpdAorfSAvLyBuYW1lc3BhY2UgQmxhY2tCZXJyeQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvUmVuZGVyUXVldWUu
aCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1JlbmRlclF1ZXVlLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uM2M5NjM5ZTY3YWIyMmQwMzc4NTJlY2MyNmU4NmNmNzNjMWQ4YTk5OQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1Jl
bmRlclF1ZXVlLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDks
IDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQor
ICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9z
dG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSZW5kZXJRdWV1ZV9oCisj
ZGVmaW5lIFJlbmRlclF1ZXVlX2gKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUludFJl
Y3RSZWdpb24uaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1QcmltaXRpdmVzLmg+Cisj
aW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2Vi
S2l0IHsKKworY2xhc3MgQmFja2luZ1N0b3JlUHJpdmF0ZTsKKwordHlwZWRlZiBzdGQ6OnZlY3Rv
cjxQbGF0Zm9ybTo6SW50UmVjdD4gSW50UmVjdExpc3Q7CisKK2VudW0gU29ydERpcmVjdGlvbiB7
CisgICAgTGVmdFRvUmlnaHQgPSAwLAorICAgIFJpZ2h0VG9MZWZ0LAorICAgIFRvcFRvQm90dG9t
LAorICAgIEJvdHRvbVRvVG9wLAorICAgIE51bVNvcnREaXJlY3Rpb25zCit9OworCitjbGFzcyBS
ZW5kZXJSZWN0IDogcHVibGljIFBsYXRmb3JtOjpJbnRSZWN0IHsKK3B1YmxpYzoKKyAgICBSZW5k
ZXJSZWN0KCkgeyB9CisgICAgUmVuZGVyUmVjdChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIGxv
Y2F0aW9uLCBjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYsIGludCBzcGxpdHRpbmdGYWN0b3IpOwor
ICAgIFJlbmRlclJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBz
cGxpdHRpbmdGYWN0b3IpOworICAgIFJlbmRlclJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
KTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3RGb3JSZW5kZXJpbmcoKTsKKworICAgIGJv
b2wgaXNDb21wbGV0ZWQoKSBjb25zdCB7IHJldHVybiAhbV9zdWJSZWN0cy5zaXplKCk7IH0KKwor
ICAgIGNvbnN0IEludFJlY3RMaXN0JiBzdWJSZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1fc3ViUmVj
dHM7IH0KKyAgICB2b2lkIHVwZGF0ZVNvcnREaXJlY3Rpb24oU29ydERpcmVjdGlvbiBwcmltYXJ5
LCBTb3J0RGlyZWN0aW9uIHNlY29uZGFyeSk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBpbml0aWFs
aXplKGludCBzcGxpdHRpbmdGYWN0b3IpOworICAgIHZvaWQgc3BsaXQoKTsKKyAgICB2b2lkIHF1
aWNrU29ydCgpOworICAgIGludCBtX3NwbGl0dGluZ0ZhY3RvcjsKKyAgICBJbnRSZWN0TGlzdCBt
X3N1YlJlY3RzOworICAgIFNvcnREaXJlY3Rpb24gbV9wcmltYXJ5U29ydERpcmVjdGlvbjsKKyAg
ICBTb3J0RGlyZWN0aW9uIG1fc2Vjb25kYXJ5U29ydERpcmVjdGlvbjsKK307CisKK3R5cGVkZWYg
c3RkOjp2ZWN0b3I8UmVuZGVyUmVjdD4gUmVuZGVyUmVjdExpc3Q7CisKK2NsYXNzIFJlbmRlclF1
ZXVlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEpvYlR5cGUgeyBWaXNpYmxlWm9vbSwgVmlzaWJsZVNj
cm9sbCwgUmVndWxhclJlbmRlciwgTm9uVmlzaWJsZVNjcm9sbCB9OworICAgIFJlbmRlclF1ZXVl
KEJhY2tpbmdTdG9yZVByaXZhdGUqKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKyAgICBSZW5kZXJS
ZWN0IGNvbnZlcnRUb1JlbmRlclJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsK
KworICAgIGJvb2wgaXNFbXB0eShib29sIHNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icyA9
IHRydWUpIGNvbnN0OworCisgICAgYm9vbCBoYXNDdXJyZW50UmVndWxhclJlbmRlckpvYigpIGNv
bnN0OworICAgIGJvb2wgaGFzQ3VycmVudFZpc2libGVab29tSm9iKCkgY29uc3Q7CisgICAgYm9v
bCBoYXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYigpIGNvbnN0OworICAgIGJvb2wgaXNDdXJyZW50
VmlzaWJsZVNjcm9sbEpvYihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJv
b2wgaXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYkNvbXBsZXRlZChjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYpIGNvbnN0OworICAgIGJvb2wgaXNDdXJyZW50UmVndWxhclJlbmRlckpvYihjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworCisgICAgYm9vbCBjdXJyZW50UmVndWxhclJlbmRl
ckpvYkJhdGNoVW5kZXJQcmVzc3VyZSgpIGNvbnN0OworICAgIHZvaWQgc2V0Q3VycmVudFJlZ3Vs
YXJSZW5kZXJKb2JCYXRjaFVuZGVyUHJlc3N1cmUoYm9vbCk7CisKKyAgICB2b2lkIGV2ZW50UXVl
dWVDeWNsZWQoKTsKKworICAgIHZvaWQgYWRkVG9RdWV1ZShKb2JUeXBlLCBjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYpOworICAgIHZvaWQgYWRkVG9RdWV1ZShKb2JUeXBlLCBjb25zdCBJbnRSZWN0
TGlzdCYpOworCisgICAgdm9pZCB1cGRhdGVTb3J0RGlyZWN0aW9uKGludCBsYXN0RGVsdGFYLCBp
bnQgbGFzdERlbHRhWSk7CisgICAgdm9pZCB2aXNpYmxlQ29udGVudENoYW5nZWQoY29uc3QgUGxh
dGZvcm06OkludFJlY3QmKTsKKyAgICB2b2lkIGNsZWFyKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uJiwgYm9vbCBjbGVhclJlZ3VsYXJSZW5kZXJKb2JzKTsKKyAgICB2b2lkIGNsZWFyKGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgYm9vbCBjbGVhclJlZ3VsYXJSZW5kZXJKb2JzKTsKKyAg
ICB2b2lkIGNsZWFyUmVndWxhclJlbmRlckpvYnMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsK
KyAgICB2b2lkIGNsZWFyVmlzaWJsZVpvb20oKTsKKyAgICBib29sIHJlZ3VsYXJSZW5kZXJKb2Jz
UHJldmlvdXNseUF0dGVtcHRlZEJ1dE5vdFJlbmRlcmVkKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
Jik7CisgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gcmVndWxhclJlbmRlckpvYnNOb3RSZW5k
ZXJlZFJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fcmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJl
ZFJlZ2lvbjsgfQorCisgICAgdm9pZCByZW5kZXIoYm9vbCBzaG91bGRQZXJmb3JtUmVndWxhclJl
bmRlckpvYnMgPSB0cnVlKTsKKyAgICB2b2lkIHJlbmRlckFsbEN1cnJlbnRSZWd1bGFyUmVuZGVy
Sm9icygpOworCitwcml2YXRlOgorICAgIHZvaWQgc3RhcnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hJ
Zk5lZWRlZCgpOworCisgICAgLy8gUmVuZGVyIGFuIGl0ZW0gZnJvbSB0aGUgcXVldWUuCisgICAg
dm9pZCByZW5kZXJWaXNpYmxlWm9vbUpvYigpOworICAgIHZvaWQgcmVuZGVyVmlzaWJsZVNjcm9s
bEpvYigpOworICAgIHZvaWQgcmVuZGVyUmVndWxhclJlbmRlckpvYigpOworICAgIHZvaWQgcmVu
ZGVyTm9uVmlzaWJsZVNjcm9sbEpvYigpOworCisgICAgLy8gTWV0aG9kcyB0byBoYW5kbGUgYSBj
b21wbGV0ZWQgc2V0IG9mIHNjcm9sbCBqb2JzLgorICAgIHZvaWQgdmlzaWJsZVNjcm9sbEpvYnND
b21wbGV0ZWQoYm9vbCBzaG91bGRCbGl0KTsKKyAgICB2b2lkIG5vblZpc2libGVTY3JvbGxKb2Jz
Q29tcGxldGVkKCk7CisKKyAgICAvLyBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIHRvIHRoZSB2YXJp
b3VzIHF1ZXVlcy4KKyAgICB2b2lkIGFkZFRvUmVndWxhclF1ZXVlKGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0Jik7CisgICAgdm9pZCBhZGRUb1Njcm9sbFpvb21RdWV1ZShjb25zdCBSZW5kZXJSZWN0
JiwgUmVuZGVyUmVjdExpc3QqIHF1ZXVlKTsKKyAgICB2b2lkIHF1aWNrU29ydChSZW5kZXJSZWN0
TGlzdCopOworCisgICAgLy8gVGhlIHNwbGl0dGluZyBmYWN0b3IgZm9yIHJlbmRlciByZWN0cy4K
KyAgICBpbnQgc3BsaXR0aW5nRmFjdG9yKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7
CisKKyAgICBCYWNraW5nU3RvcmVQcml2YXRlKiBtX3BhcmVudDsKKworICAgIC8vIFRoZSBoaWdo
ZXN0IHByaW9yaXR5IHF1ZXVlLgorICAgIFJlbmRlclJlY3RMaXN0IG1fdmlzaWJsZVpvb21Kb2Jz
OworICAgIFJlbmRlclJlY3RMaXN0IG1fdmlzaWJsZVNjcm9sbEpvYnM7CisgICAgUmVuZGVyUmVj
dExpc3QgbV92aXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZDsKKyAgICAvLyBUaGUgbG93ZXN0IHBy
aW9yaXR5IHF1ZXVlLgorICAgIFJlbmRlclJlY3RMaXN0IG1fbm9uVmlzaWJsZVNjcm9sbEpvYnM7
CisgICAgUmVuZGVyUmVjdExpc3QgbV9ub25WaXNpYmxlU2Nyb2xsSm9ic0NvbXBsZXRlZDsKKyAg
ICAvLyBUaGUgcmVndWxhciByZW5kZXIgam9icyBhcmUgaW4gdGhlIG1pZGRsZS4KKyAgICBQbGF0
Zm9ybTo6SW50UmVjdFJlZ2lvbiBtX3JlZ3VsYXJSZW5kZXJKb2JzUmVnaW9uOworICAgIEludFJl
Y3RMaXN0IG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2g7CisgICAgUGxhdGZvcm06Oklu
dFJlY3RSZWdpb24gbV9jdXJyZW50UmVndWxhclJlbmRlckpvYnNCYXRjaFJlZ2lvbjsKKyAgICBi
b29sIG1fcmVjdHNBZGRlZFRvUmVndWxhclJlbmRlckpvYnNJbkN1cnJlbnRDeWNsZTsKKyAgICBi
b29sIG1fY3VycmVudFJlZ3VsYXJSZW5kZXJKb2JzQmF0Y2hVbmRlclByZXNzdXJlOworCisgICAg
Ly8gSG9sZHMgdGhlIHJlZ2lvbiBvZiB0aGUgcGFnZSB0aGF0IHdlIGF0dGVtcHQgdG8gcmVuZGVy
LCBidXQgdGhlCisgICAgLy8gYmFja2luZ3N0b3JlIHdhcyBub3QgaW4gdGhlIHJpZ2h0IHBsYWNl
IGF0IHRoZSB0aW1lLiBUaGlzIHdpbGwKKyAgICAvLyBiZSBjaGVja2VkIGJlZm9yZSB3ZSB0cnkg
dG8gcmVzdG9yZSBhIHRpbGUgdG8gaXQncyBsYXN0IHJlbmRlcmVkCisgICAgLy8gcGxhY2UuCisg
ICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gbV9yZWd1bGFyUmVuZGVySm9ic05vdFJlbmRlcmVk
UmVnaW9uOworCisgICAgU29ydERpcmVjdGlvbiBtX3ByaW1hcnlTb3J0RGlyZWN0aW9uOworICAg
IFNvcnREaXJlY3Rpb24gbV9zZWNvbmRhcnlTb3J0RGlyZWN0aW9uOworfTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViS2l0Cit9IC8vIG5hbWVzcGFjZSBCbGFja0JlcnJ5CisKKyNlbmRpZiAvLyBSZW5k
ZXJRdWV1ZV9oCg==
</data>
<flag name="review"
          id="128387"
          type_id="1"
          status="+"
          setter="tonikitoo"
    />
          </attachment>
      

    </bug>

</bugzilla>