<?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>22176</bug_id>
          
          <creation_ts>2008-11-11 03:20:10 -0800</creation_ts>
          <short_desc>RenderThemeGtk depends on classes outside of platform</short_desc>
          <delta_ts>2014-08-29 01:06:25 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>136338</dependson>
          <blocked>21354</blocked>
    
    <blocked>51662</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Tor Arne Vestbø">vestbo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cgarcia</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>jesus</cc>
    
    <cc>kent.hansen</cc>
    
    <cc>krit</cc>
    
    <cc>laszlo.gombos</cc>
    
    <cc>mrobinson</cc>
    
    <cc>yael</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>98279</commentid>
    <comment_count>0</comment_count>
    <who name="Tor Arne Vestbø">vestbo</who>
    <bug_when>2008-11-11 03:20:10 -0800</bug_when>
    <thetext>This is a layering violation. The classes should perhaps be moved to WebCore/rendering like RenderThemeMac/Win.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328312</commentid>
    <comment_count>1</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-01-01 14:40:31 -0800</bug_when>
    <thetext>Why do we have a folder &apos;platform&apos;, if all platform related data can be all over the place? In my opinion it is confusing to have a lot of files in WebCore/rendering that are just used by a special platform (mainly Chromium, Mac and Win).
We had similar situations with HTML Canvas and SVG, where we placed all platform data in a subfolder, or in the _theoretically_ platform independent classes itself. It is much more efficient to work on the code, since we moved all these data to platform.
I think it makes it much more complicated to administer a port (or create new ports) if the platform dependent files are not concentrated and located on one place.

Maybe I misunderstood the sense of the name and folder &apos;platform&apos;, so sorry if I&apos;m mistaken.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>870440</commentid>
    <comment_count>2</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2013-04-07 05:27:11 -0700</bug_when>
    <thetext>I think we could create port specific directories in rendering (the same we have port dirs in other directories outside of platform like editing, page, plugins, etc.) and move all the RenderTheme&lt;Port&gt; files to rendering/&lt;port&gt; directories. This would fix the layering violations of RenderTheme files in platform.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1031966</commentid>
    <comment_count>3</comment_count>
      <attachid>237307</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2014-08-28 05:35:06 -0700</bug_when>
    <thetext>Created attachment 237307
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1032129</commentid>
    <comment_count>4</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2014-08-29 01:06:25 -0700</bug_when>
    <thetext>Committed r173111: &lt;http://trac.webkit.org/changeset/173111&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>237307</attachid>
            <date>2014-08-28 05:35:06 -0700</date>
            <delta_ts>2014-08-28 10:24:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>wcore-render-theme-gtk.diff</filename>
            <type>text/plain</type>
            <size>136301</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA2MjA2ZDIwLi5mNTdiMTEzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMTcg
QEAKIDIwMTQtMDgtMjggIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29t
PgogCisgICAgICAgIFJlbmRlclRoZW1lR3RrIGRlcGVuZHMgb24gY2xhc3NlcyBvdXRzaWRlIG9m
IHBsYXRmb3JtCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yMjE3NgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IE1vdmUgUmVuZGVyVGhlbWVHdGsuY3BwIGZyb20gcGxhdGZvcm0gdG8gcmVuZGVyaW5nLgorCisg
ICAgICAgICogUGxhdGZvcm1HVEsuY21ha2U6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRo
ZW1lR3RrLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5k
ZXJUaGVtZUd0ay5jcHAuCisKKzIwMTQtMDgtMjggIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dh
cmNpYUBpZ2FsaWEuY29tPgorCiAgICAgICAgIFtHVEtdIFNjcm9sbGJhclRoZW1lR3RrIHNob3Vs
ZCBub3QgZGVwZW5kIG9uIFJlbmRlclRoZW1lR3RrCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzYzMzgKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvUGxhdGZvcm1HVEsuY21ha2UgYi9Tb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUdUSy5jbWFrZQpp
bmRleCA2MWY3NTU5Li5iODcwZjFlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9QbGF0Zm9y
bUdUSy5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUdUSy5jbWFrZQpAQCAtMjM4
LDcgKzIzOCw2IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVQbGF0Zm9ybUdUS19TT1VSQ0VTCiAgICAg
cGxhdGZvcm0vZ3RrL1BsYXRmb3JtU2NyZWVuR3RrLmNwcAogICAgIHBsYXRmb3JtL2d0ay9QbGF0
Zm9ybVdoZWVsRXZlbnRHdGsuY3BwCiAgICAgcGxhdGZvcm0vZ3RrL1JlZGlyZWN0ZWRYQ29tcG9z
aXRlV2luZG93LmNwcAotICAgIHBsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5jcHAKICAgICBw
bGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuY3BwCiAgICAgcGxhdGZvcm0vZ3RrL1NoYXJl
ZEJ1ZmZlckd0ay5jcHAKICAgICBwbGF0Zm9ybS9ndGsvU2hhcmVkVGltZXJHdGsuY3BwCkBAIC0y
NDgsNiArMjQ3LDggQEAgbGlzdChBUFBFTkQgV2ViQ29yZVBsYXRmb3JtR1RLX1NPVVJDRVMKICAg
ICBwbGF0Zm9ybS9ndGsvV2ViS2l0QXV0aGVudGljYXRpb25XaWRnZXQuY3BwCiAgICAgcGxhdGZv
cm0vZ3RrL1dpZGdldEJhY2tpbmdTdG9yZUd0a1gxMS5jcHAKICAgICBwbGF0Zm9ybS9ndGsvV2lk
Z2V0R3RrLmNwcAorCisgICAgcmVuZGVyaW5nL1JlbmRlclRoZW1lR3RrLmNwcAogKQogCiBpZiAo
V1RGX1VTRV9HRU9DTFVFMikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0
ay9SZW5kZXJUaGVtZUd0ay5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVy
VGhlbWVHdGsuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDg1MGNmLi4wMDAw
MDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5jcHAK
KysrIC9kZXYvbnVsbApAQCAtMSwxNjc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MDcgQXBwbGUgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tl
ci5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4KLSAqIENvcHlyaWdo
dCAoQykgMjAwOSBLZW5uZXRoIFJvaGRlIENocmlzdGlhbnNlbgotICogQ29weXJpZ2h0IChDKSAy
MDEwIElnYWxpYSBTLkwuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgot
ICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
Ci0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiUmVuZGVy
VGhlbWVHdGsuaCIKLQotI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKLSNpbmNsdWRlICJF
eGNlcHRpb25Db2RlUGxhY2Vob2xkZXIuaCIKLSNpbmNsdWRlICJGaWxlTGlzdC5oIgotI2luY2x1
ZGUgIkZpbGVTeXN0ZW0uaCIKLSNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKLSNpbmNsdWRl
ICJHcmFkaWVudC5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkd0
a1ZlcnNpb25pbmcuaCIKLSNpbmNsdWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCi0jaW5jbHVkZSAi
TG9jYWxpemVkU3RyaW5ncy5oIgotI2luY2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCi0j
aW5jbHVkZSAiTmFtZWROb2RlTWFwLmgiCi0jaW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgIlBh
aW50SW5mby5oIgotI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dENhaXJvLmgiCi0jaW5jbHVkZSAi
UmVuZGVyQm94LmgiCi0jaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCi0jaW5jbHVkZSAiUmVuZGVy
UHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZUd0ay5oIgotI2luY2x1ZGUgIlN0
cmluZ1RydW5jYXRvci5oIgotI2luY2x1ZGUgIlRpbWVSYW5nZXMuaCIKLSNpbmNsdWRlICJVc2Vy
QWdlbnRTY3JpcHRzLmgiCi0jaW5jbHVkZSAiVXNlckFnZW50U3R5bGVTaGVldHMuaCIKLSNpbmNs
dWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxnZGsvZ2RrLmg+Ci0jaW5jbHVkZSA8Z2xpYi5oPgotI2lu
Y2x1ZGUgPGd0ay9ndGsuaD4KLSNpbmNsdWRlIDx3dGYvTmV2ZXJEZXN0cm95ZWQuaD4KLSNpbmNs
dWRlIDx3dGYvZ29iamVjdC9HUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3RmL2dvYmplY3QvR1VuaXF1
ZVB0ci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4
dC9TdHJpbmdCdWlsZGVyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotUGFzc1JlZlB0cjxS
ZW5kZXJUaGVtZT4gUmVuZGVyVGhlbWVHdGs6OmNyZWF0ZSgpCi17Ci0gICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBSZW5kZXJUaGVtZUd0aygpKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4g
UmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZShQYWdlKikKLXsKLSAgICBzdGF0aWMgUmVuZGVyVGhl
bWUqIHJ0ID0gUmVuZGVyVGhlbWVHdGs6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKLSAgICByZXR1cm4g
cnQ7Ci19Ci0KLXN0YXRpYyBkb3VibGUgZ2V0U2NyZWVuRFBJKCkKLXsKLSAgICAvLyBGSVhNRTog
UmVhbGx5IHRoaXMgc2hvdWxkIGJlIHRoZSB3aWRnZXQncyBzY3JlZW4uCi0gICAgR2RrU2NyZWVu
KiBzY3JlZW4gPSBnZGtfc2NyZWVuX2dldF9kZWZhdWx0KCk7Ci0gICAgaWYgKCFzY3JlZW4pCi0g
ICAgICAgIHJldHVybiA5NjsgLy8gRGVmYXVsdCB0byA5NiBEUEkuCi0KLSAgICBmbG9hdCBkcGkg
PSBnZGtfc2NyZWVuX2dldF9yZXNvbHV0aW9uKHNjcmVlbik7Ci0gICAgaWYgKGRwaSA8PSAwKQot
ICAgICAgICByZXR1cm4gOTY7Ci0gICAgcmV0dXJuIGRwaTsKLX0KLQotdm9pZCBSZW5kZXJUaGVt
ZUd0azo6c3lzdGVtRm9udChDU1NWYWx1ZUlELCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlw
dGlvbikgY29uc3QKLXsKLSAgICBHdGtTZXR0aW5ncyogc2V0dGluZ3MgPSBndGtfc2V0dGluZ3Nf
Z2V0X2RlZmF1bHQoKTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBUaGlzIHdpbGwgYmUgYSBmb250IHNlbGVjdGlvbiBzdHJpbmcgbGlrZSAiU2FucyAxMCIg
c28gd2UgY2Fubm90IHVzZSBpdCBhcyB0aGUgZmFtaWx5IG5hbWUuCi0gICAgR1VuaXF1ZU91dFB0
cjxnY2hhcj4gZm9udE5hbWU7Ci0gICAgZ19vYmplY3RfZ2V0KHNldHRpbmdzLCAiZ3RrLWZvbnQt
bmFtZSIsICZmb250TmFtZS5vdXRQdHIoKSwgbnVsbHB0cik7Ci0KLSAgICBQYW5nb0ZvbnREZXNj
cmlwdGlvbiogcGFuZ29EZXNjcmlwdGlvbiA9IHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJvbV9z
dHJpbmcoZm9udE5hbWUuZ2V0KCkpOwotICAgIGlmICghcGFuZ29EZXNjcmlwdGlvbikKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgZm9udERlc2NyaXB0aW9uLnNldE9uZUZhbWlseShwYW5nb19mb250
X2Rlc2NyaXB0aW9uX2dldF9mYW1pbHkocGFuZ29EZXNjcmlwdGlvbikpOwotCi0gICAgaW50IHNp
emUgPSBwYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zaXplKHBhbmdvRGVzY3JpcHRpb24pIC8g
UEFOR09fU0NBTEU7Ci0gICAgLy8gSWYgdGhlIHNpemUgb2YgdGhlIGZvbnQgaXMgaW4gcG9pbnRz
LCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzLgotICAgIGlmICghcGFuZ29fZm9udF9k
ZXNjcmlwdGlvbl9nZXRfc2l6ZV9pc19hYnNvbHV0ZShwYW5nb0Rlc2NyaXB0aW9uKSkKLSAgICAg
ICAgc2l6ZSA9IHNpemUgKiAoZ2V0U2NyZWVuRFBJKCkgLyA3Mi4wKTsKLQotICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJ
c0Fic29sdXRlU2l6ZSh0cnVlKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWls
eShGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0V2Vp
Z2h0KEZvbnRXZWlnaHROb3JtYWwpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJdGFsaWMoZmFs
c2UpOwotICAgIHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJlZShwYW5nb0Rlc2NyaXB0aW9uKTsK
LX0KLQotI2lmIEVOQUJMRShEQVRBTElTVF9FTEVNRU5UKQotSW50U2l6ZSBSZW5kZXJUaGVtZUd0
azo6c2xpZGVyVGlja1NpemUoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIHNl
dCB0aGlzIHRvIHRoZSBzaXplIG9mIG9uZSB0aWNrIG1hcmsuCi0gICAgcmV0dXJuIEludFNpemUo
MCwgMCk7Ci19Ci0KLWludCBSZW5kZXJUaGVtZUd0azo6c2xpZGVyVGlja09mZnNldEZyb21UcmFj
a0NlbnRlcigpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gc2V0IHRoaXMgdG8g
dGhlIHBvc2l0aW9uIG9mIHRoZSB0aWNrIG1hcmtzLgotICAgIHJldHVybiAwOwotfQotI2VuZGlm
Ci0KLSNpZm5kZWYgR1RLX0FQSV9WRVJTSU9OXzIKLQotLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCB2
YWx1ZSBkZWZpbmVkIGJ5IEdUSyssIHdoZXJlIGl0IHdhcyBkZWZpbmVkIGFzIE1JTl9BUlJPV19T
SVpFIGluIGd0a2Fycm93LmMuCi1zdGF0aWMgY29uc3QgaW50IG1pbkFycm93U2l6ZSA9IDE1Owot
Ly8gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkIGJ5IEdUSyssIHdoZXJlIGl0IHdh
cyBkZWZpbmVkIGFzIE1JTl9BUlJPV19XSURUSCBpbiBndGtzcGluYnV0dG9uLmMuCi1zdGF0aWMg
Y29uc3QgaW50IG1pblNwaW5CdXR0b25BcnJvd1NpemUgPSA2OwotCi10eXBlZGVmIEhhc2hNYXA8
R1R5cGUsIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0Pj4gU3R5bGVDb250ZXh0TWFwOwotc3RhdGlj
IFN0eWxlQ29udGV4dE1hcCYgc3R5bGVDb250ZXh0TWFwKCk7Ci0KLXN0YXRpYyB2b2lkIGd0a1N0
eWxlQ2hhbmdlZENhbGxiYWNrKEdPYmplY3QqLCBHUGFyYW1TcGVjKikKLXsKLSAgICBmb3IgKGNv
bnN0IGF1dG8mIHN0eWxlQ29udGV4dCA6IHN0eWxlQ29udGV4dE1hcCgpKQotICAgICAgICBndGtf
c3R5bGVfY29udGV4dF9pbnZhbGlkYXRlKHN0eWxlQ29udGV4dC52YWx1ZS5nZXQoKSk7Ci0gICAg
c3RhdGljX2Nhc3Q8U2Nyb2xsYmFyVGhlbWVHdGsqPihTY3JvbGxiYXJUaGVtZTo6dGhlbWUoKSkt
PnRoZW1lQ2hhbmdlZCgpOwotICAgIFBhZ2U6OnVwZGF0ZVN0eWxlRm9yQWxsUGFnZXNBZnRlckds
b2JhbENoYW5nZUluRW52aXJvbm1lbnQoKTsKLX0KLQotc3RhdGljIFN0eWxlQ29udGV4dE1hcCYg
c3R5bGVDb250ZXh0TWFwKCkKLXsKLSAgICBzdGF0aWMgTmV2ZXJEZXN0cm95ZWQ8U3R5bGVDb250
ZXh0TWFwPiBtYXA7Ci0gICAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICBp
ZiAoIWluaXRpYWxpemVkKSB7Ci0gICAgICAgIEd0a1NldHRpbmdzKiBzZXR0aW5ncyA9IGd0a19z
ZXR0aW5nc19nZXRfZGVmYXVsdCgpOwotICAgICAgICBnX3NpZ25hbF9jb25uZWN0KHNldHRpbmdz
LCAibm90aWZ5OjpndGstdGhlbWUtbmFtZSIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVDaGFuZ2VkQ2Fs
bGJhY2spLCBudWxscHRyKTsKLSAgICAgICAgZ19zaWduYWxfY29ubmVjdChzZXR0aW5ncywgIm5v
dGlmeTo6Z3RrLWNvbG9yLXNjaGVtZSIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVDaGFuZ2VkQ2FsbGJh
Y2spLCBudWxscHRyKTsKLSAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLSAgICBy
ZXR1cm4gbWFwOwotfQotCi1zdGF0aWMgR3RrU3R5bGVDb250ZXh0KiBnZXRTdHlsZUNvbnRleHQo
R1R5cGUgd2lkZ2V0VHlwZSkKLXsKLSAgICBTdHlsZUNvbnRleHRNYXA6OkFkZFJlc3VsdCByZXN1
bHQgPSBzdHlsZUNvbnRleHRNYXAoKS5hZGQod2lkZ2V0VHlwZSwgbnVsbHB0cik7Ci0gICAgaWYg
KCFyZXN1bHQuaXNOZXdFbnRyeSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVyYXRvci0+dmFs
dWUuZ2V0KCk7Ci0KLSAgICBHdGtXaWRnZXRQYXRoKiBwYXRoID0gZ3RrX3dpZGdldF9wYXRoX25l
dygpOwotICAgIGd0a193aWRnZXRfcGF0aF9hcHBlbmRfdHlwZShwYXRoLCB3aWRnZXRUeXBlKTsK
LQotICAgIGlmICh3aWRnZXRUeXBlID09IEdUS19UWVBFX0VOVFJZKQotICAgICAgICBndGtfd2lk
Z2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0aCwgMCwgR1RLX1NUWUxFX0NMQVNTX0VOVFJZKTsK
LSAgICBlbHNlIGlmICh3aWRnZXRUeXBlID09IEdUS19UWVBFX0FSUk9XKQotICAgICAgICBndGtf
d2lkZ2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0aCwgMCwgImFycm93Iik7Ci0gICAgZWxzZSBp
ZiAod2lkZ2V0VHlwZSA9PSBHVEtfVFlQRV9CVVRUT04pIHsKLSAgICAgICAgZ3RrX3dpZGdldF9w
YXRoX2l0ZXJfYWRkX2NsYXNzKHBhdGgsIDAsIEdUS19TVFlMRV9DTEFTU19CVVRUT04pOwotICAg
ICAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0aCwgMSwgInRleHQtYnV0dG9u
Iik7Ci0gICAgfSBlbHNlIGlmICh3aWRnZXRUeXBlID09IEdUS19UWVBFX1NDQUxFKQotICAgICAg
ICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0aCwgMCwgR1RLX1NUWUxFX0NMQVNT
X1NDQUxFKTsKLSAgICBlbHNlIGlmICh3aWRnZXRUeXBlID09IEdUS19UWVBFX1NFUEFSQVRPUikK
LSAgICAgICAgZ3RrX3dpZGdldF9wYXRoX2l0ZXJfYWRkX2NsYXNzKHBhdGgsIDAsIEdUS19TVFlM
RV9DTEFTU19TRVBBUkFUT1IpOwotICAgIGVsc2UgaWYgKHdpZGdldFR5cGUgPT0gR1RLX1RZUEVf
UFJPR1JFU1NfQkFSKQotICAgICAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0
aCwgMCwgR1RLX1NUWUxFX0NMQVNTX1BST0dSRVNTQkFSKTsKLSAgICBlbHNlIGlmICh3aWRnZXRU
eXBlID09IEdUS19UWVBFX1NQSU5fQlVUVE9OKQotICAgICAgICBndGtfd2lkZ2V0X3BhdGhfaXRl
cl9hZGRfY2xhc3MocGF0aCwgMCwgR1RLX1NUWUxFX0NMQVNTX1NQSU5CVVRUT04pOwotICAgIGVs
c2UgaWYgKHdpZGdldFR5cGUgPT0gR1RLX1RZUEVfVFJFRV9WSUVXKQotICAgICAgICBndGtfd2lk
Z2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0aCwgMCwgR1RLX1NUWUxFX0NMQVNTX1ZJRVcpOwot
ICAgIGVsc2UgaWYgKHdpZGdldFR5cGUgPT0gR1RLX1RZUEVfQ0hFQ0tfQlVUVE9OKQotICAgICAg
ICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0aCwgMCwgR1RLX1NUWUxFX0NMQVNT
X0NIRUNLKTsKLSAgICBlbHNlIGlmICh3aWRnZXRUeXBlID09IEdUS19UWVBFX1JBRElPX0JVVFRP
TikKLSAgICAgICAgZ3RrX3dpZGdldF9wYXRoX2l0ZXJfYWRkX2NsYXNzKHBhdGgsIDAsIEdUS19T
VFlMRV9DTEFTU19SQURJTyk7Ci0KLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gY29udGV4
dCA9IGFkb3B0R1JlZihndGtfc3R5bGVfY29udGV4dF9uZXcoKSk7Ci0gICAgZ3RrX3N0eWxlX2Nv
bnRleHRfc2V0X3BhdGgoY29udGV4dC5nZXQoKSwgcGF0aCk7Ci0gICAgZ3RrX3dpZGdldF9wYXRo
X2ZyZWUocGF0aCk7Ci0KLSAgICByZXN1bHQuaXRlcmF0b3ItPnZhbHVlID0gY29udGV4dDsKLSAg
ICByZXR1cm4gY29udGV4dC5nZXQoKTsKLX0KLQotc3RhdGljIEdSZWZQdHI8R2RrUGl4YnVmPiBn
ZXRTdG9ja0ljb25Gb3JXaWRnZXRUeXBlKEdUeXBlIHdpZGdldFR5cGUsIGNvbnN0IGNoYXIqIGlj
b25OYW1lLCBnaW50IGRpcmVjdGlvbiwgZ2ludCBzdGF0ZSwgZ2ludCBpY29uU2l6ZSkKLXsKLSAg
ICBBU1NFUlQoaWNvbk5hbWUpOwotCi0gICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0
U3R5bGVDb250ZXh0KHdpZGdldFR5cGUpOwotICAgIEd0a0ljb25TZXQqIGljb25TZXQgPSBndGtf
c3R5bGVfY29udGV4dF9sb29rdXBfaWNvbl9zZXQoY29udGV4dCwgaWNvbk5hbWUpOwotCi0gICAg
Z3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKLQotICAgIGd1aW50IGZsYWdzID0gMDsK
LSAgICBpZiAoc3RhdGUgPT0gR1RLX1NUQVRFX1BSRUxJR0hUKQotICAgICAgICBmbGFncyB8PSBH
VEtfU1RBVEVfRkxBR19QUkVMSUdIVDsKLSAgICBlbHNlIGlmIChzdGF0ZSA9PSBHVEtfU1RBVEVf
SU5TRU5TSVRJVkUpCi0gICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0lOU0VOU0lUSVZF
OwotCi0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0
PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVj
dGlvbihjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihkaXJlY3Rpb24pKTsK
LSAgICBHZGtQaXhidWYqIGljb24gPSBndGtfaWNvbl9zZXRfcmVuZGVyX2ljb25fcGl4YnVmKGlj
b25TZXQsIGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a0ljb25TaXplPihpY29uU2l6ZSkpOwotCi0g
ICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKLQotICAgIHJldHVybiBhZG9w
dEdSZWYoaWNvbik7Ci19Ci0KLXN0YXRpYyBHUmVmUHRyPEdka1BpeGJ1Zj4gZ2V0U3RvY2tTeW1i
b2xpY0ljb25Gb3JXaWRnZXRUeXBlKEdUeXBlIHdpZGdldFR5cGUsIGNvbnN0IGNoYXIqIHN5bWJv
bGljSWNvbk5hbWUsIGNvbnN0IGNoYXIqIGZhbGxiYWNrU3RvY2tJY29uTmFtZSwgZ2ludCBkaXJl
Y3Rpb24sIGdpbnQgc3RhdGUsIGdpbnQgaWNvblNpemUpCi17Ci0gICAgR3RrU3R5bGVDb250ZXh0
KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KHdpZGdldFR5cGUpOwotCi0gICAgZ3RrX3N0eWxl
X2NvbnRleHRfc2F2ZShjb250ZXh0KTsKLQotICAgIGd1aW50IGZsYWdzID0gMDsKLSAgICBpZiAo
c3RhdGUgPT0gR1RLX1NUQVRFX1BSRUxJR0hUKQotICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVf
RkxBR19QUkVMSUdIVDsKLSAgICBlbHNlIGlmIChzdGF0ZSA9PSBHVEtfU1RBVEVfSU5TRU5TSVRJ
VkUpCi0gICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0lOU0VOU0lUSVZFOwotCi0gICAg
Z3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRl
RmxhZ3M+KGZsYWdzKSk7Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250
ZXh0LCBzdGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihkaXJlY3Rpb24pKTsKLSAgICBHdGtJ
Y29uSW5mbyogaW5mbyA9IGd0a19pY29uX3RoZW1lX2xvb2t1cF9pY29uKGd0a19pY29uX3RoZW1l
X2dldF9kZWZhdWx0KCksIHN5bWJvbGljSWNvbk5hbWUsIGljb25TaXplLAotICAgICAgICBzdGF0
aWNfY2FzdDxHdGtJY29uTG9va3VwRmxhZ3M+KEdUS19JQ09OX0xPT0tVUF9GT1JDRV9TVkcgfCBH
VEtfSUNPTl9MT09LVVBfRk9SQ0VfU0laRSkpOwotICAgIEdka1BpeGJ1ZiogaWNvbiA9IDA7Ci0g
ICAgaWYgKGluZm8pIHsKLSAgICAgICAgaWNvbiA9IGd0a19pY29uX2luZm9fbG9hZF9zeW1ib2xp
Y19mb3JfY29udGV4dChpbmZvLCBjb250ZXh0LCAwLCAwKTsKLSAgICAgICAgZ3RrX2ljb25faW5m
b19mcmVlKGluZm8pOwotICAgIH0KLQotICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29u
dGV4dCk7Ci0KLSAgICBpZiAoIWljb24pIHsKLSAgICAgICAgaWYgKCFmYWxsYmFja1N0b2NrSWNv
bk5hbWUpCi0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIGdldFN0
b2NrSWNvbkZvcldpZGdldFR5cGUod2lkZ2V0VHlwZSwgZmFsbGJhY2tTdG9ja0ljb25OYW1lLCBk
aXJlY3Rpb24sIHN0YXRlLCBpY29uU2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFkb3B0R1Jl
ZihpY29uKTsKLX0KLQotI2lmIEVOQUJMRShWSURFTykKLXN0YXRpYyBIVE1MTWVkaWFFbGVtZW50
KiBnZXRNZWRpYUVsZW1lbnRGcm9tUmVuZGVyT2JqZWN0KGNvbnN0IFJlbmRlck9iamVjdCYgbykK
LXsKLSAgICBOb2RlKiBub2RlID0gby5ub2RlKCk7Ci0gICAgTm9kZSogbWVkaWFOb2RlID0gbm9k
ZSA/IG5vZGUtPnNoYWRvd0hvc3QoKSA6IDA7Ci0gICAgaWYgKCFtZWRpYU5vZGUpCi0gICAgICAg
IG1lZGlhTm9kZSA9IG5vZGU7Ci0gICAgaWYgKCFtZWRpYU5vZGUgfHwgIW1lZGlhTm9kZS0+aXNF
bGVtZW50Tm9kZSgpIHx8ICF0b0VsZW1lbnQobWVkaWFOb2RlKS0+aXNNZWRpYUVsZW1lbnQoKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gdG9IVE1MTWVkaWFFbGVtZW50KG1lZGlh
Tm9kZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycygpCi17Ci0g
ICAgR2RrUkdCQSBjb2xvcjsKLSAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRhaW5lckNvbnRleHQg
PSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfQ09OVEFJTkVSKTsKLQotICAgIGd0a19zdHlsZV9j
b250ZXh0X2dldF9iYWNrZ3JvdW5kX2NvbG9yKGNvbnRhaW5lckNvbnRleHQsIEdUS19TVEFURV9G
TEFHX05PUk1BTCwgJmNvbG9yKTsKLSAgICBtX3BhbmVsQ29sb3IgPSBjb2xvcjsKLSAgICBndGtf
c3R5bGVfY29udGV4dF9nZXRfYmFja2dyb3VuZF9jb2xvcihjb250YWluZXJDb250ZXh0LCBHVEtf
U1RBVEVfRkxBR19BQ1RJVkUsICZjb2xvcik7Ci0gICAgbV9zbGlkZXJDb2xvciA9IGNvbG9yOwot
ICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9iYWNrZ3JvdW5kX2NvbG9yKGNvbnRhaW5lckNvbnRl
eHQsIEdUS19TVEFURV9GTEFHX1NFTEVDVEVELCAmY29sb3IpOwotICAgIG1fc2xpZGVyVGh1bWJD
b2xvciA9IGNvbG9yOwotfQotCi12b2lkIFJlbmRlclRoZW1lR3RrOjppbml0TWVkaWFCdXR0b25z
KCkKLXsKLSAgICBzdGF0aWMgYm9vbCBpY29uc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgICBp
ZiAoaWNvbnNJbml0aWFsaXplZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgR1JlZlB0cjxHdGtJ
Y29uRmFjdG9yeT4gaWNvbkZhY3RvcnkgPSBhZG9wdEdSZWYoZ3RrX2ljb25fZmFjdG9yeV9uZXco
KSk7Ci0gICAgR3RrSWNvblNvdXJjZSogaWNvblNvdXJjZSA9IGd0a19pY29uX3NvdXJjZV9uZXco
KTsKLSAgICBjb25zdCBjaGFyKiBpY29uc1tdID0geyAiYXVkaW8tdm9sdW1lLWhpZ2giLCAiYXVk
aW8tdm9sdW1lLW11dGVkIiB9OwotCi0gICAgZ3RrX2ljb25fZmFjdG9yeV9hZGRfZGVmYXVsdChp
Y29uRmFjdG9yeS5nZXQoKSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEdfTl9FTEVN
RU5UUyhpY29ucyk7ICsraSkgewotICAgICAgICBndGtfaWNvbl9zb3VyY2Vfc2V0X2ljb25fbmFt
ZShpY29uU291cmNlLCBpY29uc1tpXSk7Ci0gICAgICAgIEd0a0ljb25TZXQqIGljb25TZXQgPSBn
dGtfaWNvbl9zZXRfbmV3KCk7Ci0gICAgICAgIGd0a19pY29uX3NldF9hZGRfc291cmNlKGljb25T
ZXQsIGljb25Tb3VyY2UpOwotICAgICAgICBndGtfaWNvbl9mYWN0b3J5X2FkZChpY29uRmFjdG9y
eS5nZXQoKSwgaWNvbnNbaV0sIGljb25TZXQpOwotICAgICAgICBndGtfaWNvbl9zZXRfdW5yZWYo
aWNvblNldCk7Ci0gICAgfQotCi0gICAgZ3RrX2ljb25fc291cmNlX2ZyZWUoaWNvblNvdXJjZSk7
Ci0KLSAgICBpY29uc0luaXRpYWxpemVkID0gdHJ1ZTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgYm9v
bCBub2RlSGFzUHNldWRvKE5vZGUqIG5vZGUsIGNvbnN0IGNoYXIqIHBzZXVkbykKLXsKLSAgICBS
ZWZQdHI8Tm9kZT4gYXR0cmlidXRlTm9kZSA9IG5vZGUtPmF0dHJpYnV0ZXMoKS0+Z2V0TmFtZWRJ
dGVtKCJwc2V1ZG8iKTsKLQotICAgIHJldHVybiBhdHRyaWJ1dGVOb2RlID8gYXR0cmlidXRlTm9k
ZS0+bm9kZVZhbHVlKCkgPT0gcHNldWRvIDogZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIG5vZGVI
YXNDbGFzcyhOb2RlKiBub2RlLCBjb25zdCBjaGFyKiBjbGFzc05hbWUpCi17Ci0gICAgaWYgKCFu
b2RlLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEVsZW1l
bnQqIGVsZW1lbnQgPSB0b0VsZW1lbnQobm9kZSk7Ci0KLSAgICBpZiAoIWVsZW1lbnQtPmhhc0Ns
YXNzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBlbGVtZW50LT5jbGFz
c05hbWVzKCkuY29udGFpbnMoY2xhc3NOYW1lKTsKLX0KLQotUmVuZGVyVGhlbWVHdGs6OlJlbmRl
clRoZW1lR3RrKCkKLSAgICA6IG1fcGFuZWxDb2xvcihDb2xvcjo6d2hpdGUpCi0gICAgLCBtX3Ns
aWRlckNvbG9yKENvbG9yOjp3aGl0ZSkKLSAgICAsIG1fc2xpZGVyVGh1bWJDb2xvcihDb2xvcjo6
d2hpdGUpCi0gICAgLCBtX21lZGlhSWNvblNpemUoMTYpCi0gICAgLCBtX21lZGlhU2xpZGVySGVp
Z2h0KDE0KQotewotI2lmIEVOQUJMRShWSURFTykKLSAgICBpbml0TWVkaWFDb2xvcnMoKTsKLSAg
ICBpbml0TWVkaWFCdXR0b25zKCk7Ci0jZW5kaWYKLX0KLQotUmVuZGVyVGhlbWVHdGs6On5SZW5k
ZXJUaGVtZUd0aygpCi17Ci19Ci0KLXN0YXRpYyBib29sIHN1cHBvcnRzRm9jdXMoQ29udHJvbFBh
cnQgYXBwZWFyYW5jZSkKLXsKLSAgICBzd2l0Y2ggKGFwcGVhcmFuY2UpIHsKLSAgICBjYXNlIFB1
c2hCdXR0b25QYXJ0OgotICAgIGNhc2UgQnV0dG9uUGFydDoKLSAgICBjYXNlIFRleHRGaWVsZFBh
cnQ6Ci0gICAgY2FzZSBUZXh0QXJlYVBhcnQ6Ci0gICAgY2FzZSBTZWFyY2hGaWVsZFBhcnQ6Ci0g
ICAgY2FzZSBNZW51bGlzdFBhcnQ6Ci0gICAgY2FzZSBSYWRpb1BhcnQ6Ci0gICAgY2FzZSBDaGVj
a2JveFBhcnQ6Ci0gICAgY2FzZSBTbGlkZXJIb3Jpem9udGFsUGFydDoKLSAgICBjYXNlIFNsaWRl
clZlcnRpY2FsUGFydDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6c3VwcG9y
dHNGb2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKSBjb25zdAotewotICAgIHJldHVy
biBzdXBwb3J0c0ZvY3VzKHN0eWxlLmFwcGVhcmFuY2UoKSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhl
bWVHdGs6OmNvbnRyb2xTdXBwb3J0c1RpbnRzKGNvbnN0IFJlbmRlck9iamVjdCYgbykgY29uc3QK
LXsKLSAgICByZXR1cm4gaXNFbmFibGVkKG8pOwotfQotCi1pbnQgUmVuZGVyVGhlbWVHdGs6OmJh
c2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2JqZWN0JiBvKSBjb25zdAotewotICAgIGlmICgh
by5pc0JveCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIEZJWE1FOiBUaGlzIHN0cmF0
ZWd5IGlzIHBvc3NpYmx5IGluY29ycmVjdCBmb3IgdGhlIEdUSysgcG9ydC4KLSAgICBpZiAoby5z
dHlsZSgpLmFwcGVhcmFuY2UoKSA9PSBDaGVja2JveFBhcnQKLSAgICAgICAgfHwgby5zdHlsZSgp
LmFwcGVhcmFuY2UoKSA9PSBSYWRpb1BhcnQpIHsKLSAgICAgICAgY29uc3QgUmVuZGVyQm94KiBi
b3ggPSB0b1JlbmRlckJveCgmbyk7Ci0gICAgICAgIHJldHVybiBib3gtPm1hcmdpblRvcCgpICsg
Ym94LT5oZWlnaHQoKSAtIDI7Ci0gICAgfQotCi0gICAgcmV0dXJuIFJlbmRlclRoZW1lOjpiYXNl
bGluZVBvc2l0aW9uKG8pOwotfQotCi1zdGF0aWMgR3RrVGV4dERpcmVjdGlvbiBndGtUZXh0RGly
ZWN0aW9uKFRleHREaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICAgIHN3aXRjaCAoZGlyZWN0aW9u
KSB7Ci0gICAgY2FzZSBSVEw6Ci0gICAgICAgIHJldHVybiBHVEtfVEVYVF9ESVJfUlRMOwotICAg
IGNhc2UgTFRSOgotICAgICAgICByZXR1cm4gR1RLX1RFWFRfRElSX0xUUjsKLSAgICBkZWZhdWx0
OgotICAgICAgICByZXR1cm4gR1RLX1RFWFRfRElSX05PTkU7Ci0gICAgfQotfQotCi1zdGF0aWMg
R3RrU3RhdGVUeXBlIGd0a0ljb25TdGF0ZShSZW5kZXJUaGVtZSogdGhlbWUsIGNvbnN0IFJlbmRl
ck9iamVjdCYgcmVuZGVyT2JqZWN0KQotewotICAgIGlmICghdGhlbWUtPmlzRW5hYmxlZChyZW5k
ZXJPYmplY3QpKQotICAgICAgICByZXR1cm4gR1RLX1NUQVRFX0lOU0VOU0lUSVZFOwotICAgIGlm
ICh0aGVtZS0+aXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCi0gICAgICAgIHJldHVybiBHVEtfU1RB
VEVfQUNUSVZFOwotICAgIGlmICh0aGVtZS0+aXNIb3ZlcmVkKHJlbmRlck9iamVjdCkpCi0gICAg
ICAgIHJldHVybiBHVEtfU1RBVEVfUFJFTElHSFQ7Ci0KLSAgICByZXR1cm4gR1RLX1NUQVRFX05P
Uk1BTDsKLX0KLQotc3RhdGljIHZvaWQgYWRqdXN0UmVjdEZvckZvY3VzKEd0a1N0eWxlQ29udGV4
dCogY29udGV4dCwgRmxvYXRSZWN0JiByZWN0KQotewotICAgIGdpbnQgZm9jdXNXaWR0aCwgZm9j
dXNQYWQ7Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsICJmb2N1cy1s
aW5lLXdpZHRoIiwgJmZvY3VzV2lkdGgsICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkLCBudWxs
cHRyKTsKLSAgICByZWN0LmluZmxhdGUoZm9jdXNXaWR0aCArIGZvY3VzUGFkKTsKLX0KLQotdm9p
ZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0UmVwYWludFJlY3QoY29uc3QgUmVuZGVyT2JqZWN0JiBy
ZW5kZXJPYmplY3QsIEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICBHdGtTdHlsZUNvbnRleHQqIGNv
bnRleHQgPSAwOwotICAgIGJvb2wgY2hlY2tJbnRlcmlvckZvY3VzID0gZmFsc2U7Ci0gICAgQ29u
dHJvbFBhcnQgcGFydCA9IHJlbmRlck9iamVjdC5zdHlsZSgpLmFwcGVhcmFuY2UoKTsKLSAgICBz
d2l0Y2ggKHBhcnQpIHsKLSAgICBjYXNlIENoZWNrYm94UGFydDoKLSAgICBjYXNlIFJhZGlvUGFy
dDoKLSAgICAgICAgY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChwYXJ0ID09IENoZWNrYm94UGFy
dCA/IEdUS19UWVBFX0NIRUNLX0JVVFRPTiA6IEdUS19UWVBFX1JBRElPX0JVVFRPTik7Ci0KLSAg
ICAgICAgZ2ludCBpbmRpY2F0b3JTcGFjaW5nOwotICAgICAgICBndGtfc3R5bGVfY29udGV4dF9n
ZXRfc3R5bGUoY29udGV4dCwgImluZGljYXRvci1zcGFjaW5nIiwgJmluZGljYXRvclNwYWNpbmcs
IG51bGxwdHIpOwotICAgICAgICByZWN0LmluZmxhdGUoaW5kaWNhdG9yU3BhY2luZyk7Ci0KLSAg
ICAgICAgcmV0dXJuOwotICAgIGNhc2UgU2xpZGVyVmVydGljYWxQYXJ0OgotICAgIGNhc2UgU2xp
ZGVySG9yaXpvbnRhbFBhcnQ6Ci0gICAgICAgIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RL
X1RZUEVfU0NBTEUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJ1dHRvblBhcnQ6Ci0gICAg
Y2FzZSBNZW51bGlzdEJ1dHRvblBhcnQ6Ci0gICAgY2FzZSBNZW51bGlzdFBhcnQ6Ci0gICAgICAg
IGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfQlVUVE9OKTsKLSAgICAgICAgY2hl
Y2tJbnRlcmlvckZvY3VzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUZXh0Rmll
bGRQYXJ0OgotICAgIGNhc2UgVGV4dEFyZWFQYXJ0OgotICAgICAgICBjb250ZXh0ID0gZ2V0U3R5
bGVDb250ZXh0KEdUS19UWVBFX0VOVFJZKTsKLSAgICAgICAgY2hlY2tJbnRlcmlvckZvY3VzID0g
dHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIEFTU0VSVChjb250ZXh0KTsKLSAgICBpZiAoY2hlY2tJbnRlcmlvckZvY3VzKSB7
Ci0gICAgICAgIGdib29sZWFuIGludGVyaW9yRm9jdXM7Ci0gICAgICAgIGd0a19zdHlsZV9jb250
ZXh0X2dldF9zdHlsZShjb250ZXh0LCAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JGb2N1cywg
bnVsbHB0cik7Ci0gICAgICAgIGlmIChpbnRlcmlvckZvY3VzKQotICAgICAgICAgICAgcmV0dXJu
OwotICAgIH0KLSAgICBhZGp1c3RSZWN0Rm9yRm9jdXMoY29udGV4dCwgcmVjdCk7Ci19Ci0KLXZv
aWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdEJ1dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5k
ZXJTdHlsZSYgc3R5bGUsIFdlYkNvcmU6OkVsZW1lbnQmKSBjb25zdAotewotICAgIC8vIFNvbWUg
bGF5b3V0IHRlc3RzIGNoZWNrIGV4cGxpY2l0bHkgdGhhdCBidXR0b25zIGlnbm9yZSBsaW5lLWhl
aWdodC4KLSAgICBpZiAoc3R5bGUuYXBwZWFyYW5jZSgpID09IFB1c2hCdXR0b25QYXJ0KQotICAg
ICAgICBzdHlsZS5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgp
KTsKLX0KLQotc3RhdGljIHZvaWQgc2V0VG9nZ2xlU2l6ZShHdGtTdHlsZUNvbnRleHQqIGNvbnRl
eHQsIFJlbmRlclN0eWxlJiBzdHlsZSkKLXsKLSAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBh
cmUgYm90aCBzcGVjaWZpZWQsIHNvIHdlIHNob3VsZG4ndCBjaGFuZ2UgdGhlbS4KLSAgICBpZiAo
IXN0eWxlLndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiAhc3R5bGUuaGVpZ2h0KCkuaXNB
dXRvKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIE90aGVyIHBvcnRzIGhhcmQtY29kZSB0
aGlzIHRvIDEzIHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQgdmFsdWUgZGVmaW5lZCBieSBHVEsr
LgotICAgIC8vIEdUSysgdXNlcnMgdGVuZCB0byBkZW1hbmQgdGhlIG5hdGl2ZSBsb29rLgotICAg
IC8vIEl0IGNvdWxkIGJlIG1hZGUgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB2YWx1ZXMgb3RoZXIg
dGhhbiAxMyBhY3R1YWxseSBicmVhayBzaXRlIGNvbXBhdGliaWxpdHkuCi0gICAgZ2ludCBpbmRp
Y2F0b3JTaXplOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LCAiaW5k
aWNhdG9yLXNpemUiLCAmaW5kaWNhdG9yU2l6ZSwgbnVsbHB0cik7Ci0KLSAgICBpZiAoc3R5bGUu
d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQotICAgICAgICBzdHlsZS5zZXRXaWR0aChMZW5n
dGgoaW5kaWNhdG9yU2l6ZSwgRml4ZWQpKTsKLQotICAgIGlmIChzdHlsZS5oZWlnaHQoKS5pc0F1
dG8oKSkKLSAgICAgICAgc3R5bGUuc2V0SGVpZ2h0KExlbmd0aChpbmRpY2F0b3JTaXplLCBGaXhl
ZCkpOwotfQotCi1zdGF0aWMgdm9pZCBwYWludFRvZ2dsZShjb25zdCBSZW5kZXJUaGVtZUd0ayog
dGhlbWUsIEdUeXBlIHdpZGdldFR5cGUsIGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0
LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgZnVsbFJlY3QpCi17
Ci0gICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KHdpZGdldFR5
cGUpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7Ci0KLSAgICAvLyBTb21l
IHRoZW1lcyBkbyBub3QgcmVuZGVyIGxhcmdlIHRvZ2dsZSBidXR0b25zIHByb3Blcmx5LCBzbyB3
ZSBzaW1wbHkKLSAgICAvLyBzaHJpbmsgdGhlIHJlY3RhbmdsZSBiYWNrIGRvd24gdG8gdGhlIGRl
ZmF1bHQgc2l6ZSBhbmQgdGhlbiBjZW50ZXIgaXQKLSAgICAvLyBpbiB0aGUgZnVsbCB0b2dnbGUg
YnV0dG9uIHJlZ2lvbi4gVGhlIHJlYXNvbiBmb3Igbm90IHNpbXBseSBmb3JjaW5nIHRvZ2dsZQot
ICAgIC8vIGJ1dHRvbnMgdG8gYmUgYSBzbWFsbGVyIHNpemUgaXMgdGhhdCB3ZSBkb24ndCB3YW50
IHRvIGJyZWFrIHNpdGUgbGF5b3V0cy4KLSAgICBnaW50IGluZGljYXRvclNpemU7Ci0gICAgZ3Rr
X3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsICJpbmRpY2F0b3Itc2l6ZSIsICZpbmRp
Y2F0b3JTaXplLCBudWxscHRyKTsKLSAgICBJbnRSZWN0IHJlY3QoZnVsbFJlY3QpOwotICAgIGlm
IChyZWN0LndpZHRoKCkgPiBpbmRpY2F0b3JTaXplKSB7Ci0gICAgICAgIHJlY3QuaW5mbGF0ZVgo
LShyZWN0LndpZHRoKCkgLSBpbmRpY2F0b3JTaXplKSAvIDIpOwotICAgICAgICByZWN0LnNldFdp
ZHRoKGluZGljYXRvclNpemUpOyAvLyBJbiBjYXNlIHJlY3Qud2lkdGgoKSB3YXMgZXF1YWwgdG8g
aW5kaWNhdG9yU2l6ZSArIDEuCi0gICAgfQotCi0gICAgaWYgKHJlY3QuaGVpZ2h0KCkgPiBpbmRp
Y2F0b3JTaXplKSB7Ci0gICAgICAgIHJlY3QuaW5mbGF0ZVkoLShyZWN0LmhlaWdodCgpIC0gaW5k
aWNhdG9yU2l6ZSkgLyAyKTsKLSAgICAgICAgcmVjdC5zZXRIZWlnaHQoaW5kaWNhdG9yU2l6ZSk7
IC8vIEluIGNhc2UgcmVjdC5oZWlnaHQoKSB3YXMgZXF1YWwgdG8gaW5kaWNhdG9yU2l6ZSArIDEu
Ci0gICAgfQotCi0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBz
dGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVj
dC5zdHlsZSgpLmRpcmVjdGlvbigpKSkpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFz
cyhjb250ZXh0LCB3aWRnZXRUeXBlID09IEdUS19UWVBFX0NIRUNLX0JVVFRPTiA/IEdUS19TVFlM
RV9DTEFTU19DSEVDSyA6IEdUS19TVFlMRV9DTEFTU19SQURJTyk7Ci0KLSAgICBndWludCBmbGFn
cyA9IDA7Ci0gICAgaWYgKCF0aGVtZS0+aXNFbmFibGVkKHJlbmRlck9iamVjdCkgfHwgdGhlbWUt
PmlzUmVhZE9ubHlDb250cm9sKHJlbmRlck9iamVjdCkpCi0gICAgICAgIGZsYWdzIHw9IEdUS19T
VEFURV9GTEFHX0lOU0VOU0lUSVZFOwotICAgIGVsc2UgaWYgKHRoZW1lLT5pc0hvdmVyZWQocmVu
ZGVyT2JqZWN0KSkKLSAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7Ci0g
ICAgaWYgKHRoZW1lLT5pc0luZGV0ZXJtaW5hdGUocmVuZGVyT2JqZWN0KSkKLSAgICAgICAgZmxh
Z3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5DT05TSVNURU5UOwotICAgIGVsc2UgaWYgKHRoZW1lLT5p
c0NoZWNrZWQocmVuZGVyT2JqZWN0KSkKLSNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigzLCAxMywgNykK
LSAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfQ0hFQ0tFRDsKLSNlbHNlCi0gICAgICAg
IGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0FDVElWRTsKLSNlbmRpZgotICAgIGlmICh0aGVtZS0+
aXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCi0gICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFH
X1NFTEVDVEVEOwotICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0
aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOwotCi0gICAgaWYgKHdpZGdldFR5cGUgPT0g
R1RLX1RZUEVfQ0hFQ0tfQlVUVE9OKQotICAgICAgICBndGtfcmVuZGVyX2NoZWNrKGNvbnRleHQs
IHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgcmVjdC54KCksIHJl
Y3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgIGVsc2UKLSAgICAgICAg
Z3RrX3JlbmRlcl9vcHRpb24oY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29u
dGV4dCgpLT5jcigpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWln
aHQoKSk7Ci0KLSAgICBpZiAodGhlbWUtPmlzRm9jdXNlZChyZW5kZXJPYmplY3QpKSB7Ci0gICAg
ICAgIEludFJlY3QgaW5kaWNhdG9yUmVjdChyZWN0KTsKLSAgICAgICAgZ2ludCBpbmRpY2F0b3JT
cGFjaW5nOwotICAgICAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwgImlu
ZGljYXRvci1zcGFjaW5nIiwgJmluZGljYXRvclNwYWNpbmcsIG51bGxwdHIpOwotICAgICAgICBp
bmRpY2F0b3JSZWN0LmluZmxhdGUoaW5kaWNhdG9yU3BhY2luZyk7Ci0gICAgICAgIGd0a19yZW5k
ZXJfZm9jdXMoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5j
cigpLCBpbmRpY2F0b3JSZWN0LngoKSwgaW5kaWNhdG9yUmVjdC55KCksCi0gICAgICAgICAgICBp
bmRpY2F0b3JSZWN0LndpZHRoKCksIGluZGljYXRvclJlY3QuaGVpZ2h0KCkpOwotICAgIH0KLQot
ICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGhlbWVHdGs6OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSYgc3R5bGUpIGNvbnN0Ci17Ci0g
ICAgc2V0VG9nZ2xlU2l6ZShnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfQ0hFQ0tfQlVUVE9OKSwg
c3R5bGUpOwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludENoZWNrYm94KGNvbnN0IFJl
bmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBwYWludFRvZ2dsZSh0aGlzLCBHVEtfVFlQRV9DSEVD
S19CVVRUT04sIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLCByZWN0KTsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSYg
c3R5bGUpIGNvbnN0Ci17Ci0gICAgc2V0VG9nZ2xlU2l6ZShnZXRTdHlsZUNvbnRleHQoR1RLX1RZ
UEVfUkFESU9fQlVUVE9OKSwgc3R5bGUpOwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWlu
dFJhZGlvKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBwYWludFRvZ2dsZSh0aGlz
LCBHVEtfVFlQRV9SQURJT19CVVRUT04sIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLCByZWN0KTsK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbmRlckJ1dHRvbihSZW5kZXJU
aGVtZSogdGhlbWUsIEd0a1N0eWxlQ29udGV4dCogY29udGV4dCwgY29uc3QgUmVuZGVyT2JqZWN0
JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByZWN0KQotewotICAgIEludFJlY3QgYnV0dG9uUmVjdChyZWN0KTsKLQotICAgIGd1aW50IGZs
YWdzID0gMDsKLSAgICBpZiAoIXRoZW1lLT5pc0VuYWJsZWQocmVuZGVyT2JqZWN0KSB8fCB0aGVt
ZS0+aXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkKLSAgICAgICAgZmxhZ3MgfD0gR1RL
X1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7Ci0gICAgZWxzZSBpZiAodGhlbWUtPmlzSG92ZXJlZChy
ZW5kZXJPYmplY3QpKQotICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdIVDsK
LSAgICBpZiAodGhlbWUtPmlzUHJlc3NlZChyZW5kZXJPYmplY3QpKQotICAgICAgICBmbGFncyB8
PSBHVEtfU1RBVEVfRkxBR19BQ1RJVkU7Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRl
KGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7Ci0KLSAgICBpZiAo
dGhlbWUtPmlzRGVmYXVsdChyZW5kZXJPYmplY3QpKSB7Ci0gICAgICAgIEd0a0JvcmRlciogYm9y
ZGVyUHRyID0gMDsKLSAgICAgICAgR3RrQm9yZGVyIGJvcmRlciA9IHsgMSwgMSwgMSwgMSB9Owot
Ci0gICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LCAiZGVmYXVsdC1i
b3JkZXIiLCAmYm9yZGVyUHRyLCBudWxscHRyKTsKLSAgICAgICAgaWYgKGJvcmRlclB0cikgewot
ICAgICAgICAgICAgYm9yZGVyID0gKmJvcmRlclB0cjsKLSAgICAgICAgICAgIGd0a19ib3JkZXJf
ZnJlZShib3JkZXJQdHIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnV0dG9uUmVjdC5tb3ZlKGJv
cmRlci5sZWZ0LCBib3JkZXIudG9wKTsKLSAgICAgICAgYnV0dG9uUmVjdC5zZXRXaWR0aChidXR0
b25SZWN0LndpZHRoKCkgLSAoYm9yZGVyLmxlZnQgKyBib3JkZXIucmlnaHQpKTsKLSAgICAgICAg
YnV0dG9uUmVjdC5zZXRIZWlnaHQoYnV0dG9uUmVjdC5oZWlnaHQoKSAtIChib3JkZXIudG9wICsg
Ym9yZGVyLmJvdHRvbSkpOwotCi0gICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhj
b250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfREVGQVVMVCk7Ci0gICAgfQotCi0gICAgZ3RrX3JlbmRl
cl9iYWNrZ3JvdW5kKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQo
KS0+Y3IoKSwgYnV0dG9uUmVjdC54KCksIGJ1dHRvblJlY3QueSgpLCBidXR0b25SZWN0LndpZHRo
KCksIGJ1dHRvblJlY3QuaGVpZ2h0KCkpOwotICAgIGd0a19yZW5kZXJfZnJhbWUoY29udGV4dCwg
cGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBidXR0b25SZWN0Lngo
KSwgYnV0dG9uUmVjdC55KCksIGJ1dHRvblJlY3Qud2lkdGgoKSwgYnV0dG9uUmVjdC5oZWlnaHQo
KSk7Ci0KLSAgICBpZiAodGhlbWUtPmlzRm9jdXNlZChyZW5kZXJPYmplY3QpKSB7Ci0gICAgICAg
IGdpbnQgZm9jdXNXaWR0aCwgZm9jdXNQYWQ7Ci0gICAgICAgIGdib29sZWFuIGRpc3BsYWNlRm9j
dXMsIGludGVyaW9yRm9jdXM7Ci0gICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZSgK
LSAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIsICZm
b2N1c1dpZHRoLAotICAgICAgICAgICAgImZvY3VzLXBhZGRpbmciLCAmZm9jdXNQYWQsCi0gICAg
ICAgICAgICAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JGb2N1cywKLSAgICAgICAgICAgICJk
aXNwbGFjZS1mb2N1cyIsICZkaXNwbGFjZUZvY3VzLAotICAgICAgICAgICAgbnVsbHB0cik7Ci0K
LSAgICAgICAgaWYgKGludGVyaW9yRm9jdXMpIHsKLSAgICAgICAgICAgIEd0a0JvcmRlciBib3Jk
ZXJXaWR0aDsKLSAgICAgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3JkZXIoY29udGV4
dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpLCAmYm9yZGVyV2lkdGgpOwotCi0g
ICAgICAgICAgICBidXR0b25SZWN0ID0gSW50UmVjdCgKLSAgICAgICAgICAgICAgICBidXR0b25S
ZWN0LngoKSArIGJvcmRlcldpZHRoLmxlZnQgKyBmb2N1c1BhZCwKLSAgICAgICAgICAgICAgICBi
dXR0b25SZWN0LnkoKSArIGJvcmRlcldpZHRoLnRvcCArIGZvY3VzUGFkLAotICAgICAgICAgICAg
ICAgIGJ1dHRvblJlY3Qud2lkdGgoKSAtICgyICogZm9jdXNQYWQgKyBib3JkZXJXaWR0aC5sZWZ0
ICsgYm9yZGVyV2lkdGgucmlnaHQpLAotICAgICAgICAgICAgICAgIGJ1dHRvblJlY3QuaGVpZ2h0
KCkgLSAoMiAqIGZvY3VzUGFkICsgYm9yZGVyV2lkdGgudG9wICsgYm9yZGVyV2lkdGguYm90dG9t
KSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYnV0dG9uUmVjdC5pbmZsYXRlKGZvY3Vz
V2lkdGggKyBmb2N1c1BhZCk7Ci0KLSAgICAgICAgaWYgKGRpc3BsYWNlRm9jdXMgJiYgdGhlbWUt
PmlzUHJlc3NlZChyZW5kZXJPYmplY3QpKSB7Ci0gICAgICAgICAgICBnaW50IGNoaWxkRGlzcGxh
Y2VtZW50WDsKLSAgICAgICAgICAgIGdpbnQgY2hpbGREaXNwbGFjZW1lbnRZOwotICAgICAgICAg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsICJjaGlsZC1kaXNwbGFjZW1l
bnQteCIsICZjaGlsZERpc3BsYWNlbWVudFgsICJjaGlsZC1kaXNwbGFjZW1lbnQteSIsICZjaGls
ZERpc3BsYWNlbWVudFksIG51bGxwdHIpOwotICAgICAgICAgICAgYnV0dG9uUmVjdC5tb3ZlKGNo
aWxkRGlzcGxhY2VtZW50WCwgY2hpbGREaXNwbGFjZW1lbnRZKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGd0a19yZW5kZXJfZm9jdXMoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpLT5jcigpLCBidXR0b25SZWN0LngoKSwgYnV0dG9uUmVjdC55KCksIGJ1dHRvblJl
Y3Qud2lkdGgoKSwgYnV0dG9uUmVjdC5oZWlnaHQoKSk7Ci0gICAgfQotfQotYm9vbCBSZW5kZXJU
aGVtZUd0azo6cGFpbnRCdXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNv
bnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIEd0
a1N0eWxlQ29udGV4dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9CVVRUT04p
OwotICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7Ci0KLSAgICBndGtfc3R5bGVf
Y29udGV4dF9zZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rp
b24+KGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0eWxlKCkuZGlyZWN0aW9uKCkpKSk7
Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFT
U19CVVRUT04pOwotCi0gICAgcmVuZGVyQnV0dG9uKHRoaXMsIGNvbnRleHQsIHJlbmRlck9iamVj
dCwgcGFpbnRJbmZvLCByZWN0KTsKLQotICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29u
dGV4dCk7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVHdGs6OmFk
anVzdE1lbnVMaXN0U3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiBzdHlsZSwgRWxl
bWVudCYpIGNvbnN0Ci17Ci0gICAgLy8gVGhlIHRlc3RzIGNoZWNrIGV4cGxpY2l0bHkgdGhhdCBz
ZWxlY3QgbWVudSBidXR0b25zIGlnbm9yZSBsaW5lIGhlaWdodC4KLSAgICBzdHlsZS5zZXRMaW5l
SGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKLQotICAgIC8vIFdlIGNh
bm5vdCBnaXZlIGEgcHJvcGVyIHJlbmRlcmluZyB3aGVuIGJvcmRlciByYWRpdXMgaXMgYWN0aXZl
LCB1bmZvcnR1bmF0ZWx5LgotICAgIHN0eWxlLnJlc2V0Qm9yZGVyUmFkaXVzKCk7Ci19Ci0KLXZv
aWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZl
ciYgc3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVtZW50JiBlKSBjb25zdAot
ewotICAgIGFkanVzdE1lbnVMaXN0U3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGUpOwotfQot
Ci1zdGF0aWMgdm9pZCBnZXRDb21ib0JveE1ldHJpY3MoUmVuZGVyU3R5bGUmIHN0eWxlLCBHdGtC
b3JkZXImIGJvcmRlciwgaW50JiBmb2N1cywgaW50JiBzZXBhcmF0b3IpCi17Ci0gICAgLy8gSWYg
dGhpcyBtZW51IGxpc3QgYnV0dG9uIGlzbid0IGRyYXduIHVzaW5nIHRoZSBuYXRpdmUgdGhlbWUs
IHdlCi0gICAgLy8gZG9uJ3QgYWRkIGFueSBleHRyYSBwYWRkaW5nIGJleW9uZCB3aGF0IFdlYkNv
cmUgYWxyZWFkeSB1c2VzLgotICAgIGlmIChzdHlsZS5hcHBlYXJhbmNlKCkgPT0gTm9Db250cm9s
UGFydCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0ID0g
Z2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0NPTUJPX0JPWCk7Ci0gICAgZ3RrX3N0eWxlX2NvbnRl
eHRfc2F2ZShjb250ZXh0KTsKLQotICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250
ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfQlVUVE9OKTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9zZXRf
ZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0a1RleHRE
aXJlY3Rpb24oc3R5bGUuZGlyZWN0aW9uKCkpKSk7Ci0KLSAgICBndGtfc3R5bGVfY29udGV4dF9n
ZXRfYm9yZGVyKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDApLCAmYm9yZGVy
KTsKLQotICAgIGdib29sZWFuIGludGVyaW9yRm9jdXM7Ci0gICAgZ2ludCBmb2N1c1dpZHRoLCBm
b2N1c1BhZDsKLSAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwgImludGVy
aW9yLWZvY3VzIiwgJmludGVyaW9yRm9jdXMsICJmb2N1cy1saW5lLXdpZHRoIiwgJmZvY3VzV2lk
dGgsICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkLCBudWxscHRyKTsKLSAgICBmb2N1cyA9IGlu
dGVyaW9yRm9jdXMgPyBmb2N1c1dpZHRoICsgZm9jdXNQYWQgOiAwOwotCi0gICAgZ3RrX3N0eWxl
X2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKLQotICAgIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRl
eHQoR1RLX1RZUEVfU0VQQVJBVE9SKTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRl
eHQpOwotCi0gICAgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24gPSBzdGF0aWNfY2FzdDxHdGtU
ZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9uKHN0eWxlLmRpcmVjdGlvbigpKSk7Ci0gICAg
Z3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBkaXJlY3Rpb24pOwotICAg
IGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCAic2VwYXJhdG9yIik7Ci0KLSAg
ICBnYm9vbGVhbiB3aWRlU2VwYXJhdG9yczsKLSAgICBnaW50IHNlcGFyYXRvcldpZHRoOwotICAg
IGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LCAid2lkZS1zZXBhcmF0b3JzIiwg
JndpZGVTZXBhcmF0b3JzLCAic2VwYXJhdG9yLXdpZHRoIiwgJnNlcGFyYXRvcldpZHRoLCBudWxs
cHRyKTsKLQotICAgIC8vIEdUSysgYWx3YXlzIHVzZXMgYm9yZGVyLmxlZnQsIHJlZ2FyZGxlc3Mg
b2YgdGV4dCBkaXJlY3Rpb24uIFNlZSBndGtzZXBlcmF0b3IuYy4KLSAgICBpZiAoIXdpZGVTZXBh
cmF0b3JzKQotICAgICAgICBzZXBhcmF0b3JXaWR0aCA9IGJvcmRlci5sZWZ0OwotCi0gICAgc2Vw
YXJhdG9yID0gc2VwYXJhdG9yV2lkdGg7Ci0KLSAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3Jl
KGNvbnRleHQpOwotfQotCi1pbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5n
TGVmdChSZW5kZXJTdHlsZSYgc3R5bGUpIGNvbnN0Ci17Ci0gICAgR3RrQm9yZGVyIGJvcmRlcldp
ZHRoID0geyAwLCAwLCAwLCAwIH07Ci0gICAgaW50IGZvY3VzV2lkdGggPSAwLCBzZXBhcmF0b3JX
aWR0aCA9IDA7Ci0gICAgZ2V0Q29tYm9Cb3hNZXRyaWNzKHN0eWxlLCBib3JkZXJXaWR0aCwgZm9j
dXNXaWR0aCwgc2VwYXJhdG9yV2lkdGgpOwotICAgIGludCBsZWZ0ID0gYm9yZGVyV2lkdGgubGVm
dCArIGZvY3VzV2lkdGg7Ci0gICAgaWYgKHN0eWxlLmRpcmVjdGlvbigpID09IFJUTCkKLSAgICAg
ICAgbGVmdCArPSBzZXBhcmF0b3JXaWR0aCArIG1pbkFycm93U2l6ZTsKLSAgICByZXR1cm4gbGVm
dDsKLX0KLQotaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJl
bmRlclN0eWxlJiBzdHlsZSkgY29uc3QKLXsKLSAgICBHdGtCb3JkZXIgYm9yZGVyV2lkdGggPSB7
IDAsIDAsIDAsIDAgfTsKLSAgICBpbnQgZm9jdXNXaWR0aCA9IDAsIHNlcGFyYXRvcldpZHRoID0g
MDsKLSAgICBnZXRDb21ib0JveE1ldHJpY3Moc3R5bGUsIGJvcmRlcldpZHRoLCBmb2N1c1dpZHRo
LCBzZXBhcmF0b3JXaWR0aCk7Ci0gICAgaW50IHJpZ2h0ID0gYm9yZGVyV2lkdGgucmlnaHQgKyBm
b2N1c1dpZHRoOwotICAgIGlmIChzdHlsZS5kaXJlY3Rpb24oKSA9PSBMVFIpCi0gICAgICAgIHJp
Z2h0ICs9IHNlcGFyYXRvcldpZHRoICsgbWluQXJyb3dTaXplOwotICAgIHJldHVybiByaWdodDsK
LX0KLQotaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcChSZW5kZXJT
dHlsZSYgc3R5bGUpIGNvbnN0Ci17Ci0gICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoID0geyAwLCAw
LCAwLCAwIH07Ci0gICAgaW50IGZvY3VzV2lkdGggPSAwLCBzZXBhcmF0b3JXaWR0aCA9IDA7Ci0g
ICAgZ2V0Q29tYm9Cb3hNZXRyaWNzKHN0eWxlLCBib3JkZXJXaWR0aCwgZm9jdXNXaWR0aCwgc2Vw
YXJhdG9yV2lkdGgpOwotICAgIHJldHVybiBib3JkZXJXaWR0aC50b3AgKyBmb2N1c1dpZHRoOwot
fQotCi1pbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRl
clN0eWxlJiBzdHlsZSkgY29uc3QKLXsKLSAgICBHdGtCb3JkZXIgYm9yZGVyV2lkdGggPSB7IDAs
IDAsIDAsIDAgfTsKLSAgICBpbnQgZm9jdXNXaWR0aCA9IDAsIHNlcGFyYXRvcldpZHRoID0gMDsK
LSAgICBnZXRDb21ib0JveE1ldHJpY3Moc3R5bGUsIGJvcmRlcldpZHRoLCBmb2N1c1dpZHRoLCBz
ZXBhcmF0b3JXaWR0aCk7Ci0gICAgcmV0dXJuIGJvcmRlcldpZHRoLmJvdHRvbSArIGZvY3VzV2lk
dGg7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3QoY29uc3QgUmVuZGVy
T2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBG
bG9hdFJlY3QmIHIpCi17Ci0gICAgLy8gRklYTUU6IGFkb3B0IHN1YnBpeGVsIHRoZW1lcy4KLSAg
ICBJbnRSZWN0IHJlY3QgPSBJbnRSZWN0KHIpOwotCi0gICAgY2Fpcm9fdCogY2Fpcm9Db250ZXh0
ID0gcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpOwotICAgIEd0a1Rl
eHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZ3Rr
VGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3Quc3R5bGUoKS5kaXJlY3Rpb24oKSkpOwotCi0gICAg
Ly8gUGFpbnQgdGhlIGJ1dHRvbi4KLSAgICBHdGtTdHlsZUNvbnRleHQqIGJ1dHRvblN0eWxlQ29u
dGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9CVVRUT04pOwotICAgIGd0a19zdHlsZV9j
b250ZXh0X3NhdmUoYnV0dG9uU3R5bGVDb250ZXh0KTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9z
ZXRfZGlyZWN0aW9uKGJ1dHRvblN0eWxlQ29udGV4dCwgZGlyZWN0aW9uKTsKLSAgICBndGtfc3R5
bGVfY29udGV4dF9hZGRfY2xhc3MoYnV0dG9uU3R5bGVDb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1Nf
QlVUVE9OKTsKLSAgICByZW5kZXJCdXR0b24odGhpcywgYnV0dG9uU3R5bGVDb250ZXh0LCByZW5k
ZXJPYmplY3QsIHBhaW50SW5mbywgcmVjdCk7Ci0KLSAgICAvLyBHZXQgdGhlIGlubmVyIHJlY3Rh
bmdsZS4KLSAgICBnaW50IGZvY3VzV2lkdGgsIGZvY3VzUGFkOwotICAgIEd0a0JvcmRlciogaW5u
ZXJCb3JkZXJQdHIgPSAwOwotICAgIEd0a0JvcmRlciBpbm5lckJvcmRlciA9IHsgMSwgMSwgMSwg
MSB9OwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShidXR0b25TdHlsZUNvbnRleHQs
ICJpbm5lci1ib3JkZXIiLCAmaW5uZXJCb3JkZXJQdHIsICJmb2N1cy1saW5lLXdpZHRoIiwgJmZv
Y3VzV2lkdGgsICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkLCBudWxscHRyKTsKLSAgICBpZiAo
aW5uZXJCb3JkZXJQdHIpIHsKLSAgICAgICAgaW5uZXJCb3JkZXIgPSAqaW5uZXJCb3JkZXJQdHI7
Ci0gICAgICAgIGd0a19ib3JkZXJfZnJlZShpbm5lckJvcmRlclB0cik7Ci0gICAgfQotCi0gICAg
R3RrQm9yZGVyIGJvcmRlcldpZHRoOwotICAgIEd0a1N0YXRlRmxhZ3Mgc3RhdGUgPSBndGtfc3R5
bGVfY29udGV4dF9nZXRfc3RhdGUoYnV0dG9uU3R5bGVDb250ZXh0KTsKLSAgICBndGtfc3R5bGVf
Y29udGV4dF9nZXRfYm9yZGVyKGJ1dHRvblN0eWxlQ29udGV4dCwgc3RhdGUsICZib3JkZXJXaWR0
aCk7Ci0KLSAgICBmb2N1c1dpZHRoICs9IGZvY3VzUGFkOwotICAgIEludFJlY3QgaW5uZXJSZWN0
KAotICAgICAgICByZWN0LngoKSArIGlubmVyQm9yZGVyLmxlZnQgKyBib3JkZXJXaWR0aC5sZWZ0
ICsgZm9jdXNXaWR0aCwKLSAgICAgICAgcmVjdC55KCkgKyBpbm5lckJvcmRlci50b3AgKyBib3Jk
ZXJXaWR0aC50b3AgKyBmb2N1c1dpZHRoLAotICAgICAgICByZWN0LndpZHRoKCkgLSBib3JkZXJX
aWR0aC5sZWZ0IC0gYm9yZGVyV2lkdGgucmlnaHQgLSBpbm5lckJvcmRlci5sZWZ0IC0gaW5uZXJC
b3JkZXIucmlnaHQgLSAoMiAqIGZvY3VzV2lkdGgpLAotICAgICAgICByZWN0LmhlaWdodCgpIC0g
Ym9yZGVyV2lkdGgudG9wIC0gYm9yZGVyV2lkdGguYm90dG9tIC0gaW5uZXJCb3JkZXIudG9wIC0g
aW5uZXJCb3JkZXIuYm90dG9tIC0gKDIgKiBmb2N1c1dpZHRoKSk7Ci0KLSAgICBpZiAoaXNQcmVz
c2VkKHJlbmRlck9iamVjdCkpIHsKLSAgICAgICAgZ2ludCBjaGlsZERpc3BsYWNlbWVudFg7Ci0g
ICAgICAgIGdpbnQgY2hpbGREaXNwbGFjZW1lbnRZOwotICAgICAgICBndGtfc3R5bGVfY29udGV4
dF9nZXRfc3R5bGUoYnV0dG9uU3R5bGVDb250ZXh0LCAiY2hpbGQtZGlzcGxhY2VtZW50LXgiLCAm
Y2hpbGREaXNwbGFjZW1lbnRYLCAiY2hpbGQtZGlzcGxhY2VtZW50LXkiLCAmY2hpbGREaXNwbGFj
ZW1lbnRZLCBudWxscHRyKTsKLSAgICAgICAgaW5uZXJSZWN0Lm1vdmUoY2hpbGREaXNwbGFjZW1l
bnRYLCBjaGlsZERpc3BsYWNlbWVudFkpOwotICAgIH0KLSAgICBpbm5lclJlY3Quc2V0V2lkdGgo
c3RkOjptYXgoMSwgaW5uZXJSZWN0LndpZHRoKCkpKTsKLSAgICBpbm5lclJlY3Quc2V0SGVpZ2h0
KHN0ZDo6bWF4KDEsIGlubmVyUmVjdC5oZWlnaHQoKSkpOwotCi0gICAgZ3RrX3N0eWxlX2NvbnRl
eHRfcmVzdG9yZShidXR0b25TdHlsZUNvbnRleHQpOwotCi0gICAgLy8gUGFpbnQgdGhlIGFycm93
LgotICAgIEd0a1N0eWxlQ29udGV4dCogYXJyb3dTdHlsZUNvbnRleHQgPSBnZXRTdHlsZUNvbnRl
eHQoR1RLX1RZUEVfQVJST1cpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoYXJyb3dTdHls
ZUNvbnRleHQpOwotCi0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihhcnJvd1N0
eWxlQ29udGV4dCwgZGlyZWN0aW9uKTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3Mo
YXJyb3dTdHlsZUNvbnRleHQsICJhcnJvdyIpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9j
bGFzcyhhcnJvd1N0eWxlQ29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0JVVFRPTik7Ci0KLSAgICBn
ZmxvYXQgYXJyb3dTY2FsaW5nOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShhcnJv
d1N0eWxlQ29udGV4dCwgImFycm93LXNjYWxpbmciLCAmYXJyb3dTY2FsaW5nLCBudWxscHRyKTsK
LQotICAgIEludFNpemUgYXJyb3dTaXplKG1pbkFycm93U2l6ZSwgaW5uZXJSZWN0LmhlaWdodCgp
KTsKLSAgICBGbG9hdFBvaW50IGFycm93UG9zaXRpb24oaW5uZXJSZWN0LmxvY2F0aW9uKCkpOwot
ICAgIGlmIChkaXJlY3Rpb24gPT0gR1RLX1RFWFRfRElSX0xUUikKLSAgICAgICAgYXJyb3dQb3Np
dGlvbi5tb3ZlKGlubmVyUmVjdC53aWR0aCgpIC0gYXJyb3dTaXplLndpZHRoKCksIDApOwotCi0g
ICAgLy8gR1RLKyBhY3R1YWxseSBmZXRjaGVzIHRoZSB4YWxpZ24gYW5kIHZhbGlnbiB2YWx1ZXMg
ZnJvbSB0aGUgd2lkZ2V0LCBidXQgc2luY2Ugd2UKLSAgICAvLyBkb24ndCBoYXZlIGEgd2lkZ2V0
IGhlcmUsIHdlIGFyZSBqdXN0IHVzaW5nIHRoZSBkZWZhdWx0IHhhbGlnbiBhbmQgdmFsaWduIHZh
bHVlcyBvZiAwLjUuCi0gICAgZ2ludCBleHRlbnQgPSBzdGQ6Om1pbihhcnJvd1NpemUud2lkdGgo
KSwgYXJyb3dTaXplLmhlaWdodCgpKSAqIGFycm93U2NhbGluZzsKLSAgICBhcnJvd1Bvc2l0aW9u
Lm1vdmUoKGFycm93U2l6ZS53aWR0aCgpIC0gZXh0ZW50KSAvIDIsIChhcnJvd1NpemUuaGVpZ2h0
KCkgLSBleHRlbnQpIC8gMik7Ci0KLSAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUoYXJy
b3dTdHlsZUNvbnRleHQsIHN0YXRlKTsKLSAgICBndGtfcmVuZGVyX2Fycm93KGFycm93U3R5bGVD
b250ZXh0LCBjYWlyb0NvbnRleHQsIEdfUEksIGFycm93UG9zaXRpb24ueCgpLCBhcnJvd1Bvc2l0
aW9uLnkoKSwgZXh0ZW50KTsKLQotICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoYXJyb3dT
dHlsZUNvbnRleHQpOwotCi0gICAgLy8gUGFpbnQgdGhlIHNlcGFyYXRvciBpZiBuZWVkZWQuCi0g
ICAgR3RrU3R5bGVDb250ZXh0KiBzZXBhcmF0b3JTdHlsZUNvbnRleHQgPSBnZXRTdHlsZUNvbnRl
eHQoR1RLX1RZUEVfQ09NQk9fQk9YKTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKHNlcGFy
YXRvclN0eWxlQ29udGV4dCk7Ci0KLSAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfZGlyZWN0aW9u
KHNlcGFyYXRvclN0eWxlQ29udGV4dCwgZGlyZWN0aW9uKTsKLSAgICBndGtfc3R5bGVfY29udGV4
dF9hZGRfY2xhc3Moc2VwYXJhdG9yU3R5bGVDb250ZXh0LCAic2VwYXJhdG9yIik7Ci0KLSAgICBn
Ym9vbGVhbiB3aWRlU2VwYXJhdG9yczsKLSAgICBnaW50IHNlcGFyYXRvcldpZHRoOwotICAgIGd0
a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShzZXBhcmF0b3JTdHlsZUNvbnRleHQsICJ3aWRlLXNl
cGFyYXRvcnMiLCAmd2lkZVNlcGFyYXRvcnMsICJzZXBhcmF0b3Itd2lkdGgiLCAmc2VwYXJhdG9y
V2lkdGgsIG51bGxwdHIpOwotICAgIGlmICh3aWRlU2VwYXJhdG9ycyAmJiAhc2VwYXJhdG9yV2lk
dGgpIHsKLSAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShzZXBhcmF0b3JTdHlsZUNv
bnRleHQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZ3RrX3N0eWxlX2Nv
bnRleHRfc2V0X3N0YXRlKHNlcGFyYXRvclN0eWxlQ29udGV4dCwgc3RhdGUpOwotICAgIEludFBv
aW50IHNlcGFyYXRvclBvc2l0aW9uKGFycm93UG9zaXRpb24ueCgpLCBpbm5lclJlY3QueSgpKTsK
LSAgICBpZiAod2lkZVNlcGFyYXRvcnMpIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBHVEtf
VEVYVF9ESVJfTFRSKQotICAgICAgICAgICAgc2VwYXJhdG9yUG9zaXRpb24ubW92ZSgtc2VwYXJh
dG9yV2lkdGgsIDApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZXBhcmF0b3JQb3NpdGlv
bi5tb3ZlKGFycm93U2l6ZS53aWR0aCgpLCAwKTsKLQotICAgICAgICBndGtfcmVuZGVyX2ZyYW1l
KHNlcGFyYXRvclN0eWxlQ29udGV4dCwgY2Fpcm9Db250ZXh0LCBzZXBhcmF0b3JQb3NpdGlvbi54
KCksIHNlcGFyYXRvclBvc2l0aW9uLnkoKSwgc2VwYXJhdG9yV2lkdGgsIGlubmVyUmVjdC5oZWln
aHQoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgR3RrQm9yZGVyIHBhZGRpbmc7Ci0gICAgICAg
IGd0a19zdHlsZV9jb250ZXh0X2dldF9wYWRkaW5nKHNlcGFyYXRvclN0eWxlQ29udGV4dCwgc3Rh
dGUsICZwYWRkaW5nKTsKLSAgICAgICAgR3RrQm9yZGVyIGJvcmRlcjsKLSAgICAgICAgZ3RrX3N0
eWxlX2NvbnRleHRfZ2V0X2JvcmRlcihzZXBhcmF0b3JTdHlsZUNvbnRleHQsIHN0YXRlLCAmYm9y
ZGVyKTsKLQotICAgICAgICBpZiAoZGlyZWN0aW9uID09IEdUS19URVhUX0RJUl9MVFIpCi0gICAg
ICAgICAgICBzZXBhcmF0b3JQb3NpdGlvbi5tb3ZlKC0ocGFkZGluZy5sZWZ0ICsgYm9yZGVyLmxl
ZnQpLCAwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2VwYXJhdG9yUG9zaXRpb24ubW92
ZShhcnJvd1NpemUud2lkdGgoKSwgMCk7Ci0KLSAgICAgICAgY2Fpcm9fc2F2ZShjYWlyb0NvbnRl
eHQpOwotCi0gICAgICAgIC8vIEFuIGV4dHJhIGNsaXAgcHJldmVudHMgdGhlIHNlcGFyYXRvciBi
bGVlZGluZyBvdXRzaWRlIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGJlY2F1c2Ugb2Ygc3Vi
cGl4ZWwgcG9zaXRpb25pbmcuCi0gICAgICAgIGNhaXJvX3JlY3RhbmdsZShjYWlyb0NvbnRleHQs
IHNlcGFyYXRvclBvc2l0aW9uLngoKSwgc2VwYXJhdG9yUG9zaXRpb24ueSgpLCBib3JkZXIubGVm
dCwgaW5uZXJSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgY2Fpcm9fY2xpcChjYWlyb0NvbnRleHQp
OwotICAgICAgICBndGtfcmVuZGVyX2xpbmUoc2VwYXJhdG9yU3R5bGVDb250ZXh0LCBjYWlyb0Nv
bnRleHQsIHNlcGFyYXRvclBvc2l0aW9uLngoKSwgc2VwYXJhdG9yUG9zaXRpb24ueSgpLCBzZXBh
cmF0b3JQb3NpdGlvbi54KCksIGlubmVyUmVjdC5tYXhZKCkpOwotICAgICAgICBjYWlyb19yZXN0
b3JlKGNhaXJvQ29udGV4dCk7Ci0gICAgfQotCi0gICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9y
ZShzZXBhcmF0b3JTdHlsZUNvbnRleHQpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBS
ZW5kZXJUaGVtZUd0azo6cGFpbnRNZW51TGlzdEJ1dHRvbkRlY29yYXRpb25zKGNvbnN0IFJlbmRl
ck9iamVjdCYgb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEZsb2F0UmVjdCYg
cmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRNZW51TGlzdChvYmplY3QsIGluZm8sIHJlY3QpOwot
fQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFRleHRGaWVsZChjb25zdCBSZW5kZXJPYmpl
Y3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCkKLXsKLSAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNv
bnRleHQoR1RLX1RZUEVfRU5UUlkpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4
dCk7Ci0KLSAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRp
Y19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0
eWxlKCkuZGlyZWN0aW9uKCkpKSk7Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNv
bnRleHQsIEdUS19TVFlMRV9DTEFTU19FTlRSWSk7Ci0KLSAgICBndWludCBmbGFncyA9IDA7Ci0g
ICAgaWYgKCFpc0VuYWJsZWQocmVuZGVyT2JqZWN0KSB8fCBpc1JlYWRPbmx5Q29udHJvbChyZW5k
ZXJPYmplY3QpKQotICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19JTlNFTlNJVElWRTsK
LSAgICBlbHNlIGlmIChpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KSkKLSAgICAgICAgZmxhZ3MgfD0g
R1RLX1NUQVRFX0ZMQUdfRk9DVVNFRDsKLSAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUo
Y29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKLQotICAgIGd0a19y
ZW5kZXJfYmFja2dyb3VuZChjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCktPmNyKCksIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdo
dCgpKTsKLSAgICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5w
bGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCks
IHJlY3QuaGVpZ2h0KCkpOwotCi0gICAgaWYgKGlzRm9jdXNlZChyZW5kZXJPYmplY3QpICYmIGlz
RW5hYmxlZChyZW5kZXJPYmplY3QpKSB7Ci0gICAgICAgIGdib29sZWFuIGludGVyaW9yRm9jdXM7
Ci0gICAgICAgIGdpbnQgZm9jdXNXaWR0aCwgZm9jdXNQYWQ7Ci0gICAgICAgIGd0a19zdHlsZV9j
b250ZXh0X2dldF9zdHlsZShjb250ZXh0LCAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JGb2N1
cywgImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0aCwgImZvY3VzLXBhZGRpbmciLCAmZm9j
dXNQYWQsIG51bGxwdHIpOwotICAgICAgICBpZiAoIWludGVyaW9yRm9jdXMpIHsKLSAgICAgICAg
ICAgIEludFJlY3QgZm9jdXNSZWN0KHJlY3QpOwotICAgICAgICAgICAgZm9jdXNSZWN0LmluZmxh
dGUoZm9jdXNXaWR0aCArIGZvY3VzUGFkKTsKLSAgICAgICAgICAgIGd0a19yZW5kZXJfZm9jdXMo
Y29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBmb2N1
c1JlY3QueCgpLCBmb2N1c1JlY3QueSgpLCBmb2N1c1JlY3Qud2lkdGgoKSwgZm9jdXNSZWN0Lmhl
aWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3Rv
cmUoY29udGV4dCk7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50VGV4dEFyZWEoY29uc3QgUmVuZGVyT2JqZWN0JiBvLCBjb25zdCBQYWludEluZm8m
IGksIGNvbnN0IEZsb2F0UmVjdCYgcikKLXsKLSAgICByZXR1cm4gcGFpbnRUZXh0RmllbGQobywg
aSwgcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhaW50R2RrUGl4YnVmKEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgR2RrUGl4YnVmKiBpY29uLCBjb25zdCBJbnRSZWN0JiBpY29uUmVjdCkK
LXsKLSAgICBJbnRTaXplIGljb25TaXplKGdka19waXhidWZfZ2V0X3dpZHRoKGljb24pLCBnZGtf
cGl4YnVmX2dldF9oZWlnaHQoaWNvbikpOwotICAgIEdSZWZQdHI8R2RrUGl4YnVmPiBzY2FsZWRJ
Y29uOwotICAgIGlmIChpY29uUmVjdC5zaXplKCkgIT0gaWNvblNpemUpIHsKLSAgICAgICAgLy8g
V2UgY291bGQgdXNlIGNhaXJvX3NjYWxlKCkgaGVyZSBidXQgY2Fpcm8vcGl4bWFuIGRvd25zY2Fs
ZSBxdWFsaXR5IGlzIHF1aXRlIGJhZC4KLSAgICAgICAgc2NhbGVkSWNvbiA9IGFkb3B0R1JlZihn
ZGtfcGl4YnVmX3NjYWxlX3NpbXBsZShpY29uLCBpY29uUmVjdC53aWR0aCgpLCBpY29uUmVjdC5o
ZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBHREtfSU5URVJQX0JJTElORUFSKSk7Ci0gICAgICAgIGljb24gPSBzY2FsZWRJY29u
LmdldCgpOwotICAgIH0KLQotICAgIGNhaXJvX3QqIGNyID0gY29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCktPmNyKCk7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAgZ2RrX2NhaXJvX3NldF9zb3Vy
Y2VfcGl4YnVmKGNyLCBpY29uLCBpY29uUmVjdC54KCksIGljb25SZWN0LnkoKSk7Ci0gICAgY2Fp
cm9fcGFpbnQoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi0vLyBEZWZpbmVkIGlu
IEdUSysgKGd0ay9ndGtpY29uZmFjdG9yeS5jKQotc3RhdGljIGNvbnN0IGdpbnQgZ3RrSWNvblNp
emVNZW51ID0gMTY7Ci1zdGF0aWMgY29uc3QgZ2ludCBndGtJY29uU2l6ZVNtYWxsVG9vbGJhciA9
IDE4Owotc3RhdGljIGNvbnN0IGdpbnQgZ3RrSWNvblNpemVCdXR0b24gPSAyMDsKLXN0YXRpYyBj
b25zdCBnaW50IGd0a0ljb25TaXplTGFyZ2VUb29sYmFyID0gMjQ7Ci1zdGF0aWMgY29uc3QgZ2lu
dCBndGtJY29uU2l6ZURuZCA9IDMyOwotc3RhdGljIGNvbnN0IGdpbnQgZ3RrSWNvblNpemVEaWFs
b2cgPSA0ODsKLQotc3RhdGljIEd0a0ljb25TaXplIGdldEljb25TaXplRm9yUGl4ZWxTaXplKGdp
bnQgcGl4ZWxTaXplKQotewotICAgIGlmIChwaXhlbFNpemUgPCBndGtJY29uU2l6ZVNtYWxsVG9v
bGJhcikKLSAgICAgICAgcmV0dXJuIEdUS19JQ09OX1NJWkVfTUVOVTsKLSAgICBpZiAocGl4ZWxT
aXplID49IGd0a0ljb25TaXplU21hbGxUb29sYmFyICYmIHBpeGVsU2l6ZSA8IGd0a0ljb25TaXpl
QnV0dG9uKQotICAgICAgICByZXR1cm4gR1RLX0lDT05fU0laRV9TTUFMTF9UT09MQkFSOwotICAg
IGlmIChwaXhlbFNpemUgPj0gZ3RrSWNvblNpemVCdXR0b24gJiYgcGl4ZWxTaXplIDwgZ3RrSWNv
blNpemVMYXJnZVRvb2xiYXIpCi0gICAgICAgIHJldHVybiBHVEtfSUNPTl9TSVpFX0JVVFRPTjsK
LSAgICBpZiAocGl4ZWxTaXplID49IGd0a0ljb25TaXplTGFyZ2VUb29sYmFyICYmIHBpeGVsU2l6
ZSA8IGd0a0ljb25TaXplRG5kKQotICAgICAgICByZXR1cm4gR1RLX0lDT05fU0laRV9MQVJHRV9U
T09MQkFSOwotICAgIGlmIChwaXhlbFNpemUgPj0gZ3RrSWNvblNpemVEbmQgJiYgcGl4ZWxTaXpl
IDwgZ3RrSWNvblNpemVEaWFsb2cpCi0gICAgICAgIHJldHVybiBHVEtfSUNPTl9TSVpFX0RORDsK
LQotICAgIHJldHVybiBHVEtfSUNPTl9TSVpFX0RJQUxPRzsKLX0KLQotdm9pZCBSZW5kZXJUaGVt
ZUd0azo6YWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciYg
c3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVtZW50JiBlKSBjb25zdAotewot
ICAgIGFkanVzdFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5
bGUsIGUpOwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0
c0J1dHRvbihjb25zdCBSZW5kZXJPYmplY3QmIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3Qg
SW50UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNv
cmF0aW9uUGFydChvLCBpLCByZWN0KTsKLX0KLQotc3RhdGljIHZvaWQgYWRqdXN0U2VhcmNoRmll
bGRJY29uU3R5bGUoUmVuZGVyU3R5bGUmIHN0eWxlKQotewotICAgIHN0eWxlLnJlc2V0Qm9yZGVy
KCk7Ci0gICAgc3R5bGUucmVzZXRQYWRkaW5nKCk7Ci0KLSAgICAvLyBHZXQgdGhlIGljb24gc2l6
ZSBiYXNlZCBvbiB0aGUgZm9udCBzaXplLgotICAgIGludCBmb250U2l6ZSA9IHN0eWxlLmZvbnRT
aXplKCk7Ci0gICAgaWYgKGZvbnRTaXplIDwgZ3RrSWNvblNpemVNZW51KSB7Ci0gICAgICAgIHN0
eWxlLnNldFdpZHRoKExlbmd0aChmb250U2l6ZSwgRml4ZWQpKTsKLSAgICAgICAgc3R5bGUuc2V0
SGVpZ2h0KExlbmd0aChmb250U2l6ZSwgRml4ZWQpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICBnaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLSAgICBndGtfaWNvbl9zaXplX2xvb2t1
cChnZXRJY29uU2l6ZUZvclBpeGVsU2l6ZShmb250U2l6ZSksICZ3aWR0aCwgJmhlaWdodCk7Ci0g
ICAgc3R5bGUuc2V0V2lkdGgoTGVuZ3RoKHdpZHRoLCBGaXhlZCkpOwotICAgIHN0eWxlLnNldEhl
aWdodChMZW5ndGgoaGVpZ2h0LCBGaXhlZCkpOwotfQotCi12b2lkIFJlbmRlclRoZW1lR3RrOjph
ZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uUGFydFN0eWxlKFN0eWxlUmVzb2x2ZXIm
LCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQmKSBjb25zdAotewotICAgIGFkanVzdFNlYXJj
aEZpZWxkSWNvblN0eWxlKHN0eWxlKTsKLX0KLQotc3RhdGljIEludFJlY3QgY2VudGVyUmVjdFZl
cnRpY2FsbHlJblBhcmVudElucHV0RWxlbWVudChjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9i
amVjdCwgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICAvLyBHZXQgdGhlIHJlbmRlcmVyIG9m
IDxpbnB1dD4gZWxlbWVudC4KLSAgICBOb2RlKiBpbnB1dCA9IHJlbmRlck9iamVjdC5ub2RlKCkt
PnNoYWRvd0hvc3QoKTsKLSAgICBpZiAoIWlucHV0KQotICAgICAgICBpbnB1dCA9IHJlbmRlck9i
amVjdC5ub2RlKCk7Ci0gICAgaWYgKCFpbnB1dC0+cmVuZGVyZXIoKS0+aXNCb3goKSkKLSAgICAg
ICAgcmV0dXJuIEludFJlY3QoKTsKLQotICAgIC8vIElmIHBvc3NpYmxlIGNlbnRlciB0aGUgeS1j
b29yZGluYXRlIG9mIHRoZSByZWN0IHZlcnRpY2FsbHkgaW4gdGhlIHBhcmVudCBpbnB1dCBlbGVt
ZW50LgotICAgIC8vIFdlIGFsc28gYWRkIG9uZSBwaXhlbCBoZXJlIHRvIGVuc3VyZSB0aGF0IHRo
ZSB5IGNvb3JkaW5hdGUgaXMgcm91bmRlZCB1cCBmb3IgYm94IGhlaWdodHMKLSAgICAvLyB0aGF0
IGFyZSBldmVuLCB3aGljaCBsb29rcyBpbiByZWxhdGlvbiB0byB0aGUgYm94IHRleHQuCi0gICAg
SW50UmVjdCBpbnB1dENvbnRlbnRCb3ggPSB0b1JlbmRlckJveChpbnB1dC0+cmVuZGVyZXIoKSkt
PmFic29sdXRlQ29udGVudEJveCgpOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBzY2FsZWQgZGVj
b3JhdGlvbiBzdGF5cyBzcXVhcmUgYW5kIHdpbGwgZml0IGluIGl0cyBwYXJlbnQncyBib3guCi0g
ICAgaW50IGljb25TaXplID0gc3RkOjptaW4oaW5wdXRDb250ZW50Qm94LndpZHRoKCksIHN0ZDo6
bWluKGlucHV0Q29udGVudEJveC5oZWlnaHQoKSwgcmVjdC5oZWlnaHQoKSkpOwotICAgIEludFJl
Y3Qgc2NhbGVkUmVjdChyZWN0LngoKSwgaW5wdXRDb250ZW50Qm94LnkoKSArIChpbnB1dENvbnRl
bnRCb3guaGVpZ2h0KCkgLSBpY29uU2l6ZSArIDEpIC8gMiwgaWNvblNpemUsIGljb25TaXplKTsK
LSAgICByZXR1cm4gc2NhbGVkUmVjdDsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRT
ZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uUGFydChjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRl
ck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Ci17Ci0gICAgSW50UmVjdCBpY29uUmVjdCA9IGNlbnRlclJlY3RWZXJ0aWNhbGx5SW5QYXJlbnRJ
bnB1dEVsZW1lbnQocmVuZGVyT2JqZWN0LCByZWN0KTsKLSAgICBpZiAoaWNvblJlY3QuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBHUmVmUHRyPEdka1BpeGJ1Zj4gaWNv
biA9IGdldFN0b2NrSWNvbkZvcldpZGdldFR5cGUoR1RLX1RZUEVfRU5UUlksIEdUS19TVE9DS19G
SU5ELAotICAgICAgICBndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC5zdHlsZSgpLmRpcmVj
dGlvbigpKSwKLSAgICAgICAgZ3RrSWNvblN0YXRlKHRoaXMsIHJlbmRlck9iamVjdCksCi0gICAg
ICAgIGdldEljb25TaXplRm9yUGl4ZWxTaXplKHJlY3QuaGVpZ2h0KCkpKTsKLSAgICBwYWludEdk
a1BpeGJ1ZihwYWludEluZm8uY29udGV4dCwgaWNvbi5nZXQoKSwgaWNvblJlY3QpOwotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2VhcmNoRmllbGRD
YW5jZWxCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVt
ZW50JikgY29uc3QKLXsKLSAgICBhZGp1c3RTZWFyY2hGaWVsZEljb25TdHlsZShzdHlsZSk7Ci19
Ci0KLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0b24oY29u
c3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIEludFJlY3QgaWNvblJlY3QgPSBjZW50ZXJS
ZWN0VmVydGljYWxseUluUGFyZW50SW5wdXRFbGVtZW50KHJlbmRlck9iamVjdCwgcmVjdCk7Ci0g
ICAgaWYgKGljb25SZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
R1JlZlB0cjxHZGtQaXhidWY+IGljb24gPSBnZXRTdG9ja0ljb25Gb3JXaWRnZXRUeXBlKEdUS19U
WVBFX0VOVFJZLCBHVEtfU1RPQ0tfQ0xFQVIsCi0gICAgICAgIGd0a1RleHREaXJlY3Rpb24ocmVu
ZGVyT2JqZWN0LnN0eWxlKCkuZGlyZWN0aW9uKCkpLAotICAgICAgICBndGtJY29uU3RhdGUodGhp
cywgcmVuZGVyT2JqZWN0KSwKLSAgICAgICAgZ2V0SWNvblNpemVGb3JQaXhlbFNpemUocmVjdC5o
ZWlnaHQoKSkpOwotICAgIHBhaW50R2RrUGl4YnVmKHBhaW50SW5mby5jb250ZXh0LCBpY29uLmdl
dCgpLCBpY29uUmVjdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFJlbmRlclRoZW1l
R3RrOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYg
c3R5bGUsIEVsZW1lbnQmKSBjb25zdAotewotICAgIC8vIFdlIGNhbm5vdCBnaXZlIGEgcHJvcGVy
IHJlbmRlcmluZyB3aGVuIGJvcmRlciByYWRpdXMgaXMgYWN0aXZlLCB1bmZvcnR1bmF0ZWx5Lgot
ICAgIHN0eWxlLnJlc2V0Qm9yZGVyUmFkaXVzKCk7Ci0gICAgc3R5bGUuc2V0TGluZUhlaWdodChS
ZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50U2VhcmNoRmllbGQoY29uc3QgUmVuZGVyT2JqZWN0JiBvLCBjb25zdCBQYWludElu
Zm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgcmV0dXJuIHBhaW50VGV4dEZpZWxk
KG8sIGksIHJlY3QpOwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludENhcHNMb2NrSW5k
aWNhdG9yKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICAvLyBUaGUgb3RoZXIgcGFp
bnQgbWV0aG9kcyBkb24ndCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgcGFpbnRpbmcgaXMgZGlzYWJs
ZWQgYmVjYXVzZSBSZW5kZXJUaGVtZSBhbHJlYWR5IGNoZWNrcyBpdAotICAgIC8vIGJlZm9yZSBj
YWxsaW5nIHRoZW0sIGJ1dCBwYWludENhcHNMb2NrSW5kaWNhdG9yKCkgaXMgY2FsbGVkIGJ5IFJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZSB3aGljaCBkb2Vzbid0IGNoZWNrIGl0LgotICAgIGlm
IChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLQotICAgIGludCBpY29uU2l6ZSA9IHN0ZDo6bWluKHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSk7Ci0gICAgR1JlZlB0cjxHZGtQaXhidWY+IGljb24gPSBnZXRTdG9ja0ljb25Gb3JX
aWRnZXRUeXBlKEdUS19UWVBFX0VOVFJZLCBHVEtfU1RPQ0tfQ0FQU19MT0NLX1dBUk5JTkcsIGd0
a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0eWxlKCkuZGlyZWN0aW9uKCkpLCAwLCBnZXRJ
Y29uU2l6ZUZvclBpeGVsU2l6ZShpY29uU2l6ZSkpOwotCi0gICAgLy8gT25seSByZS1zY2FsZSB0
aGUgaWNvbiB3aGVuIGl0J3Mgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIGljb24gc2l6ZS4KLSAg
ICBpZiAoaWNvblNpemUgPj0gZ3RrSWNvblNpemVNZW51KQotICAgICAgICBpY29uU2l6ZSA9IGdk
a19waXhidWZfZ2V0X2hlaWdodChpY29uLmdldCgpKTsKLQotICAgIC8vIEdUSysgbG9jYXRlcyB0
aGUgaWNvbiByaWdodCBhbGlnbmVkIGluIHRoZSBlbnRyeS4gVGhlIGdpdmVuIHJlY3RhbmdsZSBp
cyBhbHJlYWR5Ci0gICAgLy8gY2VudGVyZWQgdmVydGljYWxseSBieSBSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmUuCi0gICAgSW50UmVjdCBpY29uUmVjdChyZWN0LngoKSArIHJlY3Qud2lkdGgo
KSAtIGljb25TaXplLAotICAgICAgICAgICAgICAgICAgICAgcmVjdC55KCkgKyAocmVjdC5oZWln
aHQoKSAtIGljb25TaXplKSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICBpY29uU2l6ZSwgaWNv
blNpemUpOwotICAgIHBhaW50R2RrUGl4YnVmKHBhaW50SW5mby5jb250ZXh0LCBpY29uLmdldCgp
LCBpY29uUmVjdCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVHdGs6
OmFkanVzdFNsaWRlclRyYWNrU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiBzdHls
ZSwgRWxlbWVudCYpIGNvbnN0Ci17Ci0gICAgc3R5bGUuc2V0Qm94U2hhZG93KG51bGxwdHIpOwot
fQotCi12b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJUaHVtYlN0eWxlKFN0eWxlUmVz
b2x2ZXImIHN0eWxlUmVzb2x2ZXIsIFJlbmRlclN0eWxlJiBzdHlsZSwgRWxlbWVudCYgZWxlbWVu
dCkgY29uc3QKLXsKLSAgICBSZW5kZXJUaGVtZTo6YWRqdXN0U2xpZGVyVGh1bWJTdHlsZShzdHls
ZVJlc29sdmVyLCBzdHlsZSwgZWxlbWVudCk7Ci0gICAgc3R5bGUuc2V0Qm94U2hhZG93KG51bGxw
dHIpOwotfQotCi1zdGF0aWMgdm9pZCBhcHBseVNsaWRlclN0eWxlQ29udGV4dENsYXNzZXMoR3Rr
U3R5bGVDb250ZXh0KiBjb250ZXh0LCBDb250cm9sUGFydCBwYXJ0KQotewotICAgIGd0a19zdHls
ZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0NBTEUpOwotICAg
IGlmIChwYXJ0ID09IFNsaWRlckhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJI
b3Jpem9udGFsUGFydCkKLSAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRl
eHQsIEdUS19TVFlMRV9DTEFTU19IT1JJWk9OVEFMKTsKLSAgICBlbHNlIGlmIChwYXJ0ID09IFNs
aWRlclZlcnRpY2FsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KQotICAg
ICAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNT
X1ZFUlRJQ0FMKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUcmFjayhj
b25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgQ29udHJvbFBhcnQgcGFydCA9IHJlbmRl
ck9iamVjdC5zdHlsZSgpLmFwcGVhcmFuY2UoKTsKLSAgICBBU1NFUlRfVU5VU0VEKHBhcnQsIHBh
cnQgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQgfHwgcGFydCA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQg
fHwgcGFydCA9PSBNZWRpYVZvbHVtZVNsaWRlclBhcnQpOwotCi0gICAgR3RrU3R5bGVDb250ZXh0
KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX1NDQUxFKTsKLSAgICBndGtfc3R5
bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOwotCi0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2Rp
cmVjdGlvbihjb250ZXh0LCBndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC5zdHlsZSgpLmRp
cmVjdGlvbigpKSk7Ci0gICAgYXBwbHlTbGlkZXJTdHlsZUNvbnRleHRDbGFzc2VzKGNvbnRleHQs
IHBhcnQpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZ
TEVfQ0xBU1NfVFJPVUdIKTsKLQotICAgIGlmICghaXNFbmFibGVkKHJlbmRlck9iamVjdCkgfHwg
aXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkKLSAgICAgICAgZ3RrX3N0eWxlX2NvbnRl
eHRfc2V0X3N0YXRlKGNvbnRleHQsIEdUS19TVEFURV9GTEFHX0lOU0VOU0lUSVZFKTsKLQotICAg
IGd0a19yZW5kZXJfYmFja2dyb3VuZChjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCktPmNyKCksIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0
LmhlaWdodCgpKTsKLSAgICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250
ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0Lndp
ZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotCi0gICAgaWYgKGlzRm9jdXNlZChyZW5kZXJPYmplY3Qp
KSB7Ci0gICAgICAgIGdpbnQgZm9jdXNXaWR0aCwgZm9jdXNQYWQ7Ci0gICAgICAgIGd0a19zdHls
ZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LCAiZm9jdXMtbGluZS13aWR0aCIsICZmb2N1c1dp
ZHRoLCAiZm9jdXMtcGFkZGluZyIsICZmb2N1c1BhZCwgbnVsbHB0cik7Ci0gICAgICAgIEludFJl
Y3QgZm9jdXNSZWN0KHJlY3QpOwotICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZShmb2N1c1dpZHRo
ICsgZm9jdXNQYWQpOwotICAgICAgICBndGtfcmVuZGVyX2ZvY3VzKGNvbnRleHQsIHBhaW50SW5m
by5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgZm9jdXNSZWN0LngoKSwgZm9jdXNS
ZWN0LnkoKSwgZm9jdXNSZWN0LndpZHRoKCksIGZvY3VzUmVjdC5oZWlnaHQoKSk7Ci0gICAgfQot
Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2xpZGVyVGh1bWIoY29uc3QgUmVu
ZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25z
dCBJbnRSZWN0JiByZWN0KQotewotICAgIENvbnRyb2xQYXJ0IHBhcnQgPSByZW5kZXJPYmplY3Qu
c3R5bGUoKS5hcHBlYXJhbmNlKCk7Ci0gICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jp
em9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0IHx8IHBhcnQgPT0g
TWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQpOwotCi0gICAgR3RrU3R5bGVDb250ZXh0KiBjb250
ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX1NDQUxFKTsKLSAgICBndGtfc3R5bGVfY29u
dGV4dF9zYXZlKGNvbnRleHQpOwotCi0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlv
bihjb250ZXh0LCBndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC5zdHlsZSgpLmRpcmVjdGlv
bigpKSk7Ci0gICAgYXBwbHlTbGlkZXJTdHlsZUNvbnRleHRDbGFzc2VzKGNvbnRleHQsIHBhcnQp
OwotICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xB
U1NfU0xJREVSKTsKLQotICAgIGd1aW50IGZsYWdzID0gMDsKLSAgICBpZiAoIWlzRW5hYmxlZChy
ZW5kZXJPYmplY3QpIHx8IGlzUmVhZE9ubHlDb250cm9sKHJlbmRlck9iamVjdCkpCi0gICAgICAg
IGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0lOU0VOU0lUSVZFOwotICAgIGVsc2UgaWYgKGlzSG92
ZXJlZChyZW5kZXJPYmplY3QpKQotICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19QUkVM
SUdIVDsKLSAgICBpZiAoaXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCi0gICAgICAgIGZsYWdzIHw9
IEdUS19TVEFURV9GTEFHX0FDVElWRTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUo
Y29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKLQotICAgIGd0a19y
ZW5kZXJfc2xpZGVyKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQo
KS0+Y3IoKSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCks
Ci0gICAgICAgIHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCA/IEdUS19PUklFTlRB
VElPTl9IT1JJWk9OVEFMIDogR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMKTsKLQotICAgIGd0a19z
dHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LXZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSYg
c3R5bGUsIEVsZW1lbnQmKSBjb25zdAotewotICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBzdHlsZS5h
cHBlYXJhbmNlKCk7Ci0gICAgaWYgKHBhcnQgIT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCAm
JiBwYXJ0ICE9IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBnaW50IHNsaWRlcldpZHRoLCBzbGlkZXJMZW5ndGg7Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRf
Z2V0X3N0eWxlKGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9TQ0FMRSksICJzbGlkZXItd2lkdGgi
LCAmc2xpZGVyV2lkdGgsICJzbGlkZXItbGVuZ3RoIiwgJnNsaWRlckxlbmd0aCwgbnVsbHB0cik7
Ci0gICAgaWYgKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCkgewotICAgICAgICBz
dHlsZS5zZXRXaWR0aChMZW5ndGgoc2xpZGVyTGVuZ3RoLCBGaXhlZCkpOwotICAgICAgICBzdHls
ZS5zZXRIZWlnaHQoTGVuZ3RoKHNsaWRlcldpZHRoLCBGaXhlZCkpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0IHx8IHBh
cnQgPT0gTWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQpOwotICAgIHN0eWxlLnNldFdpZHRoKExl
bmd0aChzbGlkZXJXaWR0aCwgRml4ZWQpKTsKLSAgICBzdHlsZS5zZXRIZWlnaHQoTGVuZ3RoKHNs
aWRlckxlbmd0aCwgRml4ZWQpKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRQcm9n
cmVzc0Jhcihjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKCFyZW5kZXJPYmpl
Y3QuaXNQcm9ncmVzcygpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEd0a1N0eWxlQ29u
dGV4dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9QUk9HUkVTU19CQVIpOwot
ICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7Ci0KLSAgICBndGtfc3R5bGVfY29u
dGV4dF9hZGRfY2xhc3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX1RST1VHSCk7Ci0KLSAgICBn
dGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpLT5jcigpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSk7Ci0gICAgZ3RrX3JlbmRlcl9mcmFtZShjb250ZXh0LCBwYWludEluZm8uY29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCktPmNyKCksIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0
aCgpLCByZWN0LmhlaWdodCgpKTsKLQotICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29u
dGV4dCk7Ci0KLSAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOwotICAgIGd0a19z
dHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfUFJPR1JFU1NC
QVIpOwotCi0KLSAgICBHdGtCb3JkZXIgcGFkZGluZzsKLSAgICBndGtfc3R5bGVfY29udGV4dF9n
ZXRfcGFkZGluZyhjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPigwKSwgJnBhZGRp
bmcpOwotICAgIEludFJlY3QgcHJvZ3Jlc3NSZWN0KAotICAgICAgICByZWN0LngoKSArIHBhZGRp
bmcubGVmdCwKLSAgICAgICAgcmVjdC55KCkgKyBwYWRkaW5nLnRvcCwKLSAgICAgICAgcmVjdC53
aWR0aCgpIC0gKHBhZGRpbmcubGVmdCArIHBhZGRpbmcucmlnaHQpLAotICAgICAgICByZWN0Lmhl
aWdodCgpIC0gKHBhZGRpbmcudG9wICsgcGFkZGluZy5ib3R0b20pKTsKLSAgICBwcm9ncmVzc1Jl
Y3QgPSBSZW5kZXJUaGVtZUd0azo6Y2FsY3VsYXRlUHJvZ3Jlc3NSZWN0KHJlbmRlck9iamVjdCwg
cHJvZ3Jlc3NSZWN0KTsKLQotICAgIGlmICghcHJvZ3Jlc3NSZWN0LmlzRW1wdHkoKSkKLSAgICAg
ICAgZ3RrX3JlbmRlcl9hY3Rpdml0eShjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCktPmNyKCksIHByb2dyZXNzUmVjdC54KCksIHByb2dyZXNzUmVjdC55KCksIHBy
b2dyZXNzUmVjdC53aWR0aCgpLCBwcm9ncmVzc1JlY3QuaGVpZ2h0KCkpOwotCi0gICAgZ3RrX3N0
eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0
YXRpYyBnaW50IHNwaW5CdXR0b25BcnJvd1NpemUoR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0KQot
ewotICAgIFBhbmdvRm9udERlc2NyaXB0aW9uKiBmb250RGVzY3JpcHRpb247Ci0gICAgZ3RrX3N0
eWxlX2NvbnRleHRfZ2V0KGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDApLCAi
Zm9udCIsICZmb250RGVzY3JpcHRpb24sIG51bGxwdHIpOwotICAgIGdpbnQgZm9udFNpemUgPSBw
YW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zaXplKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgZ2lu
dCBhcnJvd1NpemUgPSBzdGQ6Om1heChQQU5HT19QSVhFTFMoZm9udFNpemUpLCBtaW5TcGluQnV0
dG9uQXJyb3dTaXplKTsKLSAgICBwYW5nb19mb250X2Rlc2NyaXB0aW9uX2ZyZWUoZm9udERlc2Ny
aXB0aW9uKTsKLQotICAgIHJldHVybiBhcnJvd1NpemUgLSBhcnJvd1NpemUgJSAyOyAvLyBGb3Jj
ZSBldmVuLgotfQotCi12b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RJbm5lclNwaW5CdXR0b25T
dHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVtZW50JikgY29uc3QK
LXsKLSAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZ
UEVfU1BJTl9CVVRUT04pOwotCi0gICAgR3RrQm9yZGVyIHBhZGRpbmc7Ci0gICAgZ3RrX3N0eWxl
X2NvbnRleHRfZ2V0X3BhZGRpbmcoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4o
MCksICZwYWRkaW5nKTsKLQotICAgIGludCB3aWR0aCA9IHNwaW5CdXR0b25BcnJvd1NpemUoY29u
dGV4dCkgKyBwYWRkaW5nLmxlZnQgKyBwYWRkaW5nLnJpZ2h0OwotICAgIHN0eWxlLnNldFdpZHRo
KExlbmd0aCh3aWR0aCwgRml4ZWQpKTsKLSAgICBzdHlsZS5zZXRNaW5XaWR0aChMZW5ndGgod2lk
dGgsIEZpeGVkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhaW50U3BpbkFycm93QnV0dG9uKFJlbmRl
clRoZW1lKiB0aGVtZSwgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBSZW5kZXJPYmpl
Y3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJl
Y3QmIHJlY3QsIEd0a0Fycm93VHlwZSBhcnJvd1R5cGUpCi17Ci0gICAgQVNTRVJUKGFycm93VHlw
ZSA9PSBHVEtfQVJST1dfVVAgfHwgYXJyb3dUeXBlID09IEdUS19BUlJPV19ET1dOKTsKLQotICAg
IGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRf
YWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19CVVRUT04pOwotCi0gICAgR3RrVGV4
dERpcmVjdGlvbiBkaXJlY3Rpb24gPSBndGtfc3R5bGVfY29udGV4dF9nZXRfZGlyZWN0aW9uKGNv
bnRleHQpOwotICAgIGd1aW50IHN0YXRlID0gc3RhdGljX2Nhc3Q8Z3VpbnQ+KGd0a19zdHlsZV9j
b250ZXh0X2dldF9zdGF0ZShjb250ZXh0KSk7Ci0gICAgaWYgKCEoc3RhdGUgJiBHVEtfU1RBVEVf
RkxBR19JTlNFTlNJVElWRSkpIHsKLSAgICAgICAgaWYgKHRoZW1lLT5pc1ByZXNzZWQocmVuZGVy
T2JqZWN0KSkgewotICAgICAgICAgICAgaWYgKChhcnJvd1R5cGUgPT0gR1RLX0FSUk9XX1VQICYm
IHRoZW1lLT5pc1NwaW5VcEJ1dHRvblBhcnRQcmVzc2VkKHJlbmRlck9iamVjdCkpCi0gICAgICAg
ICAgICAgICAgfHwgKGFycm93VHlwZSA9PSBHVEtfQVJST1dfRE9XTiAmJiAhdGhlbWUtPmlzU3Bp
blVwQnV0dG9uUGFydFByZXNzZWQocmVuZGVyT2JqZWN0KSkpCi0gICAgICAgICAgICAgICAgc3Rh
dGUgfD0gR1RLX1NUQVRFX0ZMQUdfQUNUSVZFOwotICAgICAgICB9IGVsc2UgaWYgKHRoZW1lLT5p
c0hvdmVyZWQocmVuZGVyT2JqZWN0KSkgewotICAgICAgICAgICAgaWYgKChhcnJvd1R5cGUgPT0g
R1RLX0FSUk9XX1VQICYmIHRoZW1lLT5pc1NwaW5VcEJ1dHRvblBhcnRIb3ZlcmVkKHJlbmRlck9i
amVjdCkpCi0gICAgICAgICAgICAgICAgfHwgKGFycm93VHlwZSA9PSBHVEtfQVJST1dfRE9XTiAm
JiAhdGhlbWUtPmlzU3BpblVwQnV0dG9uUGFydEhvdmVyZWQocmVuZGVyT2JqZWN0KSkpCi0gICAg
ICAgICAgICAgICAgc3RhdGUgfD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19j
YXN0PEd0a1N0YXRlRmxhZ3M+KHN0YXRlKSk7Ci0KLSAgICAvLyBQYWludCBidXR0b24uCi0gICAg
SW50UmVjdCBidXR0b25SZWN0KHJlY3QpOwotICAgIGd1aW50IGp1bmN0aW9uID0gZ3RrX3N0eWxl
X2NvbnRleHRfZ2V0X2p1bmN0aW9uX3NpZGVzKGNvbnRleHQpOwotICAgIGlmIChhcnJvd1R5cGUg
PT0gR1RLX0FSUk9XX1VQKQotICAgICAgICBqdW5jdGlvbiB8PSBHVEtfSlVOQ1RJT05fQk9UVE9N
OwotICAgIGVsc2UgewotICAgICAgICBqdW5jdGlvbiB8PSBHVEtfSlVOQ1RJT05fVE9QOwotICAg
ICAgICBidXR0b25SZWN0Lm1vdmUoMCwgcmVjdC5oZWlnaHQoKSAvIDIpOwotICAgIH0KLSAgICBi
dXR0b25SZWN0LnNldEhlaWdodChyZWN0LmhlaWdodCgpIC8gMik7Ci0gICAgZ3RrX3N0eWxlX2Nv
bnRleHRfc2V0X2p1bmN0aW9uX3NpZGVzKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a0p1bmN0aW9u
U2lkZXM+KGp1bmN0aW9uKSk7Ci0KLSAgICBndGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwg
cGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBidXR0b25SZWN0Lngo
KSwgYnV0dG9uUmVjdC55KCksIGJ1dHRvblJlY3Qud2lkdGgoKSwgYnV0dG9uUmVjdC5oZWlnaHQo
KSk7Ci0gICAgZ3RrX3JlbmRlcl9mcmFtZShjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxh
dGZvcm1Db250ZXh0KCktPmNyKCksIGJ1dHRvblJlY3QueCgpLCBidXR0b25SZWN0LnkoKSwgYnV0
dG9uUmVjdC53aWR0aCgpLCBidXR0b25SZWN0LmhlaWdodCgpKTsKLQotICAgIC8vIFBhaW50IGFy
cm93IGNlbnRlcmVkIGluc2lkZSBidXR0b24uCi0gICAgLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9u
IGd0a3NwaW5idXR0b24uYyBjb2RlLgotICAgIEludFJlY3QgYXJyb3dSZWN0OwotICAgIGdkb3Vi
bGUgYW5nbGU7Ci0gICAgaWYgKGFycm93VHlwZSA9PSBHVEtfQVJST1dfVVApIHsKLSAgICAgICAg
YW5nbGUgPSAwOwotICAgICAgICBhcnJvd1JlY3Quc2V0WShyZWN0LnkoKSk7Ci0gICAgICAgIGFy
cm93UmVjdC5zZXRIZWlnaHQocmVjdC5oZWlnaHQoKSAvIDIgLSAyKTsKLSAgICB9IGVsc2Ugewot
ICAgICAgICBhbmdsZSA9IEdfUEk7Ci0gICAgICAgIGFycm93UmVjdC5zZXRZKHJlY3QueSgpICsg
YnV0dG9uUmVjdC55KCkpOwotICAgICAgICBhcnJvd1JlY3Quc2V0SGVpZ2h0KHJlY3QuaGVpZ2h0
KCkgLSBhcnJvd1JlY3QueSgpIC0gMik7Ci0gICAgfQotICAgIGFycm93UmVjdC5zZXRXaWR0aChy
ZWN0LndpZHRoKCkgLSAzKTsKLSAgICBpZiAoZGlyZWN0aW9uID09IEdUS19URVhUX0RJUl9MVFIp
Ci0gICAgICAgIGFycm93UmVjdC5zZXRYKHJlY3QueCgpICsgMSk7Ci0gICAgZWxzZQotICAgICAg
ICBhcnJvd1JlY3Quc2V0WChyZWN0LngoKSArIDIpOwotCi0gICAgZ2ludCB3aWR0aCA9IGFycm93
UmVjdC53aWR0aCgpIC8gMjsKLSAgICB3aWR0aCAtPSB3aWR0aCAlIDIgLSAxOyAvLyBGb3JjZSBv
ZGQuCi0gICAgZ2ludCBoZWlnaHQgPSAod2lkdGggKyAxKSAvIDI7Ci0KLSAgICBhcnJvd1JlY3Qu
bW92ZSgoYXJyb3dSZWN0LndpZHRoKCkgLSB3aWR0aCkgLyAyLCAoYXJyb3dSZWN0LmhlaWdodCgp
IC0gaGVpZ2h0KSAvIDIpOwotICAgIGd0a19yZW5kZXJfYXJyb3coY29udGV4dCwgcGFpbnRJbmZv
LmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBhbmdsZSwgYXJyb3dSZWN0LngoKSwg
YXJyb3dSZWN0LnkoKSwgd2lkdGgpOwotCi0gICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShj
b250ZXh0KTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRJbm5lclNwaW5CdXR0b24o
Y29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIEd0a1N0eWxlQ29udGV4dCogY29udGV4
dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9TUElOX0JVVFRPTik7Ci0gICAgZ3RrX3N0eWxl
X2NvbnRleHRfc2F2ZShjb250ZXh0KTsKLQotICAgIEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9u
ID0gc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJP
YmplY3Quc3R5bGUoKS5kaXJlY3Rpb24oKSkpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9k
aXJlY3Rpb24oY29udGV4dCwgZGlyZWN0aW9uKTsKLQotICAgIGd1aW50IGZsYWdzID0gMDsKLSAg
ICBpZiAoIWlzRW5hYmxlZChyZW5kZXJPYmplY3QpIHx8IGlzUmVhZE9ubHlDb250cm9sKHJlbmRl
ck9iamVjdCkpCi0gICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0lOU0VOU0lUSVZFOwot
ICAgIGVsc2UgaWYgKGlzRm9jdXNlZChyZW5kZXJPYmplY3QpKQotICAgICAgICBmbGFncyB8PSBH
VEtfU1RBVEVfRkxBR19GT0NVU0VEOwotICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShj
b250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOwotICAgIGd0a19zdHls
ZV9jb250ZXh0X3JlbW92ZV9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfRU5UUlkpOwot
Ci0gICAgcGFpbnRTcGluQXJyb3dCdXR0b24odGhpcywgY29udGV4dCwgcmVuZGVyT2JqZWN0LCBw
YWludEluZm8sIHJlY3QsIEdUS19BUlJPV19VUCk7Ci0gICAgcGFpbnRTcGluQXJyb3dCdXR0b24o
dGhpcywgY29udGV4dCwgcmVuZGVyT2JqZWN0LCBwYWludEluZm8sIHJlY3QsIEdUS19BUlJPV19E
T1dOKTsKLQotICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7Ci0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLWRvdWJsZSBSZW5kZXJUaGVtZUd0azo6Y2FyZXRCbGlua0ludGVy
dmFsKCkgY29uc3QKLXsKLSAgICBHdGtTZXR0aW5ncyogc2V0dGluZ3MgPSBndGtfc2V0dGluZ3Nf
Z2V0X2RlZmF1bHQoKTsKLQotICAgIGdib29sZWFuIHNob3VsZEJsaW5rOwotICAgIGdpbnQgdGlt
ZTsKLQotICAgIGdfb2JqZWN0X2dldChzZXR0aW5ncywgImd0ay1jdXJzb3ItYmxpbmsiLCAmc2hv
dWxkQmxpbmssICJndGstY3Vyc29yLWJsaW5rLXRpbWUiLCAmdGltZSwgbnVsbHB0cik7Ci0KLSAg
ICBpZiAoIXNob3VsZEJsaW5rKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiB0aW1l
IC8gMjAwMC47Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVj
dGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgR2RrUkdCQSBnZGtSR0JBQ29sb3I7
Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JhY2tncm91bmRfY29sb3IoZ2V0U3R5bGVDb250
ZXh0KEdUS19UWVBFX0VOVFJZKSwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oR1RLX1NUQVRF
X0ZMQUdfU0VMRUNURUQgfCBHVEtfU1RBVEVfRkxBR19GT0NVU0VEKSwgJmdka1JHQkFDb2xvcik7
Ci0gICAgcmV0dXJuIGdka1JHQkFDb2xvcjsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBs
YXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEdk
a1JHQkEgZ2RrUkdCQUNvbG9yOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9iYWNrZ3JvdW5k
X2NvbG9yKGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9FTlRSWSksIEdUS19TVEFURV9GTEFHX1NF
TEVDVEVELCAmZ2RrUkdCQUNvbG9yKTsKLSAgICByZXR1cm4gZ2RrUkdCQUNvbG9yOwotfQotCi1D
b2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29s
b3IoKSBjb25zdAotewotICAgIEdka1JHQkEgZ2RrUkdCQUNvbG9yOwotICAgIGd0a19zdHlsZV9j
b250ZXh0X2dldF9jb2xvcihnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfRU5UUlkpLCBzdGF0aWNf
Y2FzdDxHdGtTdGF0ZUZsYWdzPihHVEtfU1RBVEVfRkxBR19TRUxFQ1RFRCB8IEdUS19TVEFURV9G
TEFHX0ZPQ1VTRUQpLCAmZ2RrUkdCQUNvbG9yKTsKLSAgICByZXR1cm4gZ2RrUkdCQUNvbG9yOwot
fQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVn
cm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgR2RrUkdCQSBnZGtSR0JBQ29sb3I7Ci0gICAgZ3Rr
X3N0eWxlX2NvbnRleHRfZ2V0X2NvbG9yKGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9FTlRSWSks
IEdUS19TVEFURV9GTEFHX1NFTEVDVEVELCAmZ2RrUkdCQUNvbG9yKTsKLSAgICByZXR1cm4gZ2Rr
UkdCQUNvbG9yOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVMaXN0
Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBHZGtSR0JBIGdka1JH
QkFDb2xvcjsKLSAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYmFja2dyb3VuZF9jb2xvcihnZXRT
dHlsZUNvbnRleHQoR1RLX1RZUEVfVFJFRV9WSUVXKSwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFn
cz4oR1RLX1NUQVRFX0ZMQUdfU0VMRUNURUQgfCBHVEtfU1RBVEVfRkxBR19GT0NVU0VEKSwgJmdk
a1JHQkFDb2xvcik7Ci0gICAgcmV0dXJuIGdka1JHQkFDb2xvcjsKLX0KLQotQ29sb3IgUmVuZGVy
VGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9y
KCkgY29uc3QKLXsKLSAgICBHZGtSR0JBIGdka1JHQkFDb2xvcjsKLSAgICBndGtfc3R5bGVfY29u
dGV4dF9nZXRfYmFja2dyb3VuZF9jb2xvcihnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfVFJFRV9W
SUVXKSwgR1RLX1NUQVRFX0ZMQUdfU0VMRUNURUQsICZnZGtSR0JBQ29sb3IpOwotICAgIHJldHVy
biBnZGtSR0JBQ29sb3I7Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2
ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEdka1JHQkEg
Z2RrUkdCQUNvbG9yOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9jb2xvcihnZXRTdHlsZUNv
bnRleHQoR1RLX1RZUEVfVFJFRV9WSUVXKSwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oR1RL
X1NUQVRFX0ZMQUdfU0VMRUNURUQgfCBHVEtfU1RBVEVfRkxBR19GT0NVU0VEKSwgJmdka1JHQkFD
b2xvcik7Ci0gICAgcmV0dXJuIGdka1JHQkFDb2xvcjsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVH
dGs6OnBsYXRmb3JtSW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29u
c3QKLXsKLSAgICBHZGtSR0JBIGdka1JHQkFDb2xvcjsKLSAgICBndGtfc3R5bGVfY29udGV4dF9n
ZXRfY29sb3IoZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX1RSRUVfVklFVyksIEdUS19TVEFURV9G
TEFHX1NFTEVDVEVELCAmZ2RrUkdCQUNvbG9yKTsKLSAgICByZXR1cm4gZ2RrUkdCQUNvbG9yOwot
fQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6c3lzdGVtQ29sb3IoQ1NTVmFsdWVJRCBjc3NWYWx1
ZUlkKSBjb25zdAotewotICAgIEdka1JHQkEgZ2RrUkdCQUNvbG9yOwotCi0gICAgc3dpdGNoIChj
c3NWYWx1ZUlkKSB7Ci0gICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbnRleHQ6Ci0gICAgICAgIGd0a19z
dHlsZV9jb250ZXh0X2dldF9jb2xvcihnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfQlVUVE9OKSwg
R1RLX1NUQVRFX0ZMQUdfQUNUSVZFLCAmZ2RrUkdCQUNvbG9yKTsKLSAgICAgICAgcmV0dXJuIGdk
a1JHQkFDb2xvcjsKLSAgICBjYXNlIENTU1ZhbHVlQ2FwdGlvbnRleHQ6Ci0gICAgICAgIGd0a19z
dHlsZV9jb250ZXh0X2dldF9jb2xvcihnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfRU5UUlkpLCBz
dGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPigwKSwgJmdka1JHQkFDb2xvcik7Ci0gICAgICAgIHJl
dHVybiBnZGtSR0JBQ29sb3I7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFJlbmRlclRo
ZW1lOjpzeXN0ZW1Db2xvcihjc3NWYWx1ZUlkKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyVGhl
bWVHdGs6OnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCkKLXsKLSNpZiBFTkFCTEUoVklERU8pCi0g
ICAgaW5pdE1lZGlhQ29sb3JzKCk7Ci0jZW5kaWYKLSAgICBSZW5kZXJUaGVtZTo6cGxhdGZvcm1D
b2xvcnNEaWRDaGFuZ2UoKTsKLX0KLQotI2lmIEVOQUJMRShWSURFTykKLVN0cmluZyBSZW5kZXJU
aGVtZUd0azo6ZXh0cmFNZWRpYUNvbnRyb2xzU3R5bGVTaGVldCgpCi17Ci0gICAgcmV0dXJuIFN0
cmluZyhtZWRpYUNvbnRyb2xzR3RrVXNlckFnZW50U3R5bGVTaGVldCwgc2l6ZW9mKG1lZGlhQ29u
dHJvbHNHdGtVc2VyQWdlbnRTdHlsZVNoZWV0KSk7Ci19Ci0KLSNpZiBFTkFCTEUoRlVMTFNDUkVF
Tl9BUEkpCi1TdHJpbmcgUmVuZGVyVGhlbWVHdGs6OmV4dHJhRnVsbFNjcmVlblN0eWxlU2hlZXQo
KQotewotICAgIHJldHVybiBTdHJpbmcoKTsKLX0KLSNlbmRpZgotCi1ib29sIFJlbmRlclRoZW1l
R3RrOjpwYWludE1lZGlhQnV0dG9uKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IGNoYXIq
IHN5bWJvbGljSWNvbk5hbWUsIGNvbnN0IGNoYXIqIGZhbGxiYWNrU3RvY2tJY29uTmFtZSkKLXsK
LSAgICBJbnRSZWN0IGljb25SZWN0KAotICAgICAgICByZWN0LngoKSArIChyZWN0LndpZHRoKCkg
LSBtX21lZGlhSWNvblNpemUpIC8gMiwKLSAgICAgICAgcmVjdC55KCkgKyAocmVjdC5oZWlnaHQo
KSAtIG1fbWVkaWFJY29uU2l6ZSkgLyAyLAotICAgICAgICBtX21lZGlhSWNvblNpemUsIG1fbWVk
aWFJY29uU2l6ZSk7Ci0gICAgR1JlZlB0cjxHZGtQaXhidWY+IGljb24gPSBnZXRTdG9ja1N5bWJv
bGljSWNvbkZvcldpZGdldFR5cGUoR1RLX1RZUEVfQ09OVEFJTkVSLCBzeW1ib2xpY0ljb25OYW1l
LCBmYWxsYmFja1N0b2NrSWNvbk5hbWUsCi0gICAgICAgIGd0a1RleHREaXJlY3Rpb24ocmVuZGVy
T2JqZWN0LnN0eWxlKCkuZGlyZWN0aW9uKCkpLCBndGtJY29uU3RhdGUodGhpcywgcmVuZGVyT2Jq
ZWN0KSwgaWNvblJlY3Qud2lkdGgoKSk7Ci0gICAgcGFpbnRHZGtQaXhidWYoY29udGV4dCwgaWNv
bi5nZXQoKSwgaWNvblJlY3QpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFJlbmRlclRo
ZW1lR3RrOjpoYXNPd25EaXNhYmxlZFN0YXRlSGFuZGxpbmdGb3IoQ29udHJvbFBhcnQgcGFydCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gKHBhcnQgIT0gTWVkaWFNdXRlQnV0dG9uUGFydCk7Ci19Ci0K
LWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVkaWFGdWxsc2NyZWVuQnV0dG9uKGNvbnN0IFJl
bmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRNZWRpYUJ1dHRvbihyZW5kZXJP
YmplY3QsIHBhaW50SW5mby5jb250ZXh0LCByZWN0LCAidmlldy1mdWxsc2NyZWVuLXN5bWJvbGlj
IiwgR1RLX1NUT0NLX0ZVTExTQ1JFRU4pOwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWlu
dE1lZGlhTXV0ZUJ1dHRvbihjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3Qg
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgSFRNTE1l
ZGlhRWxlbWVudCogbWVkaWFFbGVtZW50ID0gZ2V0TWVkaWFFbGVtZW50RnJvbVJlbmRlck9iamVj
dChyZW5kZXJPYmplY3QpOwotICAgIGlmICghbWVkaWFFbGVtZW50KQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBib29sIG11dGVkID0gbWVkaWFFbGVtZW50LT5tdXRlZCgpOwotICAgIHJl
dHVybiBwYWludE1lZGlhQnV0dG9uKHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIHJl
Y3QsCi0gICAgICAgIG11dGVkID8gImF1ZGlvLXZvbHVtZS1tdXRlZC1zeW1ib2xpYyIgOiAiYXVk
aW8tdm9sdW1lLWhpZ2gtc3ltYm9saWMiLAotICAgICAgICBtdXRlZCA/ICJhdWRpby12b2x1bWUt
bXV0ZWQiIDogImF1ZGlvLXZvbHVtZS1oaWdoIik7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVHdGs6
OnBhaW50TWVkaWFQbGF5QnV0dG9uKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBj
b25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBO
b2RlKiBub2RlID0gcmVuZGVyT2JqZWN0Lm5vZGUoKTsKLSAgICBpZiAoIW5vZGUpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmICghbm9kZUhhc1BzZXVkbyhub2RlLCAiLXdlYmtpdC1t
ZWRpYS1jb250cm9scy1wbGF5LWJ1dHRvbiIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
Ym9vbCBzaG93UGxheUJ1dHRvbiA9IG5vZGVIYXNDbGFzcyhub2RlLCAicGF1c2VkIik7Ci0KLSAg
ICByZXR1cm4gcGFpbnRNZWRpYUJ1dHRvbihyZW5kZXJPYmplY3QsIHBhaW50SW5mby5jb250ZXh0
LCByZWN0LAotICAgICAgICBzaG93UGxheUJ1dHRvbiA/ICJtZWRpYS1wbGF5YmFjay1zdGFydC1z
eW1ib2xpYyIgOiAibWVkaWEtcGxheWJhY2stcGF1c2Utc3ltYm9saWMiLAotICAgICAgICBzaG93
UGxheUJ1dHRvbiA/IEdUS19TVE9DS19NRURJQV9QTEFZIDogR1RLX1NUT0NLX01FRElBX1BBVVNF
KTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZWRpYVNlZWtCYWNrQnV0dG9uKGNv
bnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRNZWRpYUJ1dHRvbihy
ZW5kZXJPYmplY3QsIHBhaW50SW5mby5jb250ZXh0LCByZWN0LCAibWVkaWEtc2Vlay1iYWNrd2Fy
ZC1zeW1ib2xpYyIsIEdUS19TVE9DS19NRURJQV9SRVdJTkQpOwotfQotCi1ib29sIFJlbmRlclRo
ZW1lR3RrOjpwYWludE1lZGlhU2Vla0ZvcndhcmRCdXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiBy
ZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQotewotICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHJlbmRlck9iamVjdCwgcGFpbnRJ
bmZvLmNvbnRleHQsIHJlY3QsICJtZWRpYS1zZWVrLWZvcndhcmQtc3ltYm9saWMiLCBHVEtfU1RP
Q0tfTUVESUFfRk9SV0FSRCk7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi1ib29sIFJl
bmRlclRoZW1lR3RrOjpwYWludE1lZGlhVG9nZ2xlQ2xvc2VkQ2FwdGlvbnNCdXR0b24oY29uc3Qg
UmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIEludFJlY3QgaWNvblJlY3QocmVjdC54KCkgKyAo
cmVjdC53aWR0aCgpIC0gbV9tZWRpYUljb25TaXplKSAvIDIsIHJlY3QueSgpICsgKHJlY3QuaGVp
Z2h0KCkgLSBtX21lZGlhSWNvblNpemUpIC8gMiwKLSAgICAgICAgbV9tZWRpYUljb25TaXplLCBt
X21lZGlhSWNvblNpemUpOwotICAgIEdSZWZQdHI8R2RrUGl4YnVmPiBpY29uID0gZ2V0U3RvY2tT
eW1ib2xpY0ljb25Gb3JXaWRnZXRUeXBlKEdUS19UWVBFX0NPTlRBSU5FUiwgIm1lZGlhLXZpZXct
c3VidGl0bGVzLXN5bWJvbGljIiwgbnVsbHB0ciwKLSAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihy
ZW5kZXJPYmplY3Quc3R5bGUoKS5kaXJlY3Rpb24oKSksIGd0a0ljb25TdGF0ZSh0aGlzLCByZW5k
ZXJPYmplY3QpLCBpY29uUmVjdC53aWR0aCgpKTsKLSAgICBpZiAoIWljb24pCi0gICAgICAgIGlj
b24gPSBnZXRTdG9ja1N5bWJvbGljSWNvbkZvcldpZGdldFR5cGUoR1RLX1RZUEVfQ09OVEFJTkVS
LCAidXNlci1pbnZpc2libGUtc3ltYm9saWMiLCBHVEtfU1RPQ0tfSlVTVElGWV9GSUxMLAotICAg
ICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3Quc3R5bGUoKS5kaXJlY3Rpb24o
KSksIGd0a0ljb25TdGF0ZSh0aGlzLCByZW5kZXJPYmplY3QpLCBpY29uUmVjdC53aWR0aCgpKTsK
LSAgICBwYWludEdka1BpeGJ1ZihwYWludEluZm8uY29udGV4dCwgaWNvbi5nZXQoKSwgaWNvblJl
Y3QpOwotICAgIHJldHVybiB0cnVlOwotfQotI2VuZGlmCi0KLXN0YXRpYyBGbG9hdFJvdW5kZWRS
ZWN0OjpSYWRpaSBib3JkZXJSYWRpaUZyb21TdHlsZShSZW5kZXJTdHlsZSYgc3R5bGUpCi17Ci0g
ICAgcmV0dXJuIEZsb2F0Um91bmRlZFJlY3Q6OlJhZGlpKAotICAgICAgICBJbnRTaXplKHN0eWxl
LmJvcmRlclRvcExlZnRSYWRpdXMoKS53aWR0aCgpLmludFZhbHVlKCksIHN0eWxlLmJvcmRlclRv
cExlZnRSYWRpdXMoKS5oZWlnaHQoKS5pbnRWYWx1ZSgpKSwKLSAgICAgICAgSW50U2l6ZShzdHls
ZS5ib3JkZXJUb3BSaWdodFJhZGl1cygpLndpZHRoKCkuaW50VmFsdWUoKSwgc3R5bGUuYm9yZGVy
VG9wUmlnaHRSYWRpdXMoKS5oZWlnaHQoKS5pbnRWYWx1ZSgpKSwKLSAgICAgICAgSW50U2l6ZShz
dHlsZS5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzKCkud2lkdGgoKS5pbnRWYWx1ZSgpLCBzdHlsZS5i
b3JkZXJCb3R0b21MZWZ0UmFkaXVzKCkuaGVpZ2h0KCkuaW50VmFsdWUoKSksCi0gICAgICAgIElu
dFNpemUoc3R5bGUuYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMoKS53aWR0aCgpLmludFZhbHVlKCks
IHN0eWxlLmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKCkuaGVpZ2h0KCkuaW50VmFsdWUoKSkpOwot
fQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lZGlhU2xpZGVyVHJhY2soY29uc3QgUmVu
ZGVyT2JqZWN0JiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYg
cikKLXsKLSAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBwYXJlbnRNZWRpYUVs
ZW1lbnQobyk7Ci0gICAgaWYgKCFtZWRpYUVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCA9IHBhaW50SW5mby5jb250ZXh0OwotICAg
IGNvbnRleHQtPnNhdmUoKTsKLSAgICBjb250ZXh0LT5zZXRTdHJva2VTdHlsZShOb1N0cm9rZSk7
Ci0KLSAgICBmbG9hdCBtZWRpYUR1cmF0aW9uID0gbWVkaWFFbGVtZW50LT5kdXJhdGlvbigpOwot
ICAgIGZsb2F0IHRvdGFsVHJhY2tXaWR0aCA9IHIud2lkdGgoKTsKLSAgICBSZW5kZXJTdHlsZSYg
c3R5bGUgPSBvLnN0eWxlKCk7Ci0gICAgUmVmUHRyPFRpbWVSYW5nZXM+IHRpbWVSYW5nZXMgPSBt
ZWRpYUVsZW1lbnQtPmJ1ZmZlcmVkKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbmRleCA9IDA7IGlu
ZGV4IDwgdGltZVJhbmdlcy0+bGVuZ3RoKCk7ICsraW5kZXgpIHsKLSAgICAgICAgZmxvYXQgc3Rh
cnQgPSB0aW1lUmFuZ2VzLT5zdGFydChpbmRleCwgSUdOT1JFX0VYQ0VQVElPTik7Ci0gICAgICAg
IGZsb2F0IGVuZCA9IHRpbWVSYW5nZXMtPmVuZChpbmRleCwgSUdOT1JFX0VYQ0VQVElPTik7Ci0g
ICAgICAgIGZsb2F0IHN0YXJ0UmF0aW8gPSBzdGFydCAvIG1lZGlhRHVyYXRpb247Ci0gICAgICAg
IGZsb2F0IGxlbmd0aFJhdGlvID0gKGVuZCAtIHN0YXJ0KSAvIG1lZGlhRHVyYXRpb247Ci0gICAg
ICAgIGlmICghbGVuZ3RoUmF0aW8pCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBJ
bnRSZWN0IHJhbmdlUmVjdChyKTsKLSAgICAgICAgcmFuZ2VSZWN0LnNldFdpZHRoKGxlbmd0aFJh
dGlvICogdG90YWxUcmFja1dpZHRoKTsKLSAgICAgICAgaWYgKGluZGV4KQotICAgICAgICAgICAg
cmFuZ2VSZWN0Lm1vdmUoc3RhcnRSYXRpbyAqIHRvdGFsVHJhY2tXaWR0aCwgMCk7Ci0gICAgICAg
IGNvbnRleHQtPmZpbGxSb3VuZGVkUmVjdChGbG9hdFJvdW5kZWRSZWN0KHJhbmdlUmVjdCwgYm9y
ZGVyUmFkaWlGcm9tU3R5bGUoc3R5bGUpKSwgc3R5bGUudmlzaXRlZERlcGVuZGVudENvbG9yKENT
U1Byb3BlcnR5Q29sb3IpLCBzdHlsZS5jb2xvclNwYWNlKCkpOwotICAgIH0KLQotICAgIGNvbnRl
eHQtPnJlc3RvcmUoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50TWVkaWFTbGlkZXJUaHVtYihjb25zdCBSZW5kZXJPYmplY3QmIG8sIGNvbnN0IFBh
aW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIFJlbmRlclN0eWxl
JiBzdHlsZSA9IG8uc3R5bGUoKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+ZmlsbFJvdW5kZWRS
ZWN0KEZsb2F0Um91bmRlZFJlY3QociwgYm9yZGVyUmFkaWlGcm9tU3R5bGUoc3R5bGUpKSwgc3R5
bGUudmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Q29sb3IpLCBzdHlsZS5jb2xvclNw
YWNlKCkpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFp
bnRNZWRpYVZvbHVtZVNsaWRlckNvbnRhaW5lcihjb25zdCBSZW5kZXJPYmplY3QmLCBjb25zdCBQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0JikKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9v
bCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZWRpYVZvbHVtZVNsaWRlclRyYWNrKGNvbnN0IFJlbmRl
ck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcmVjdCkKLXsKLSAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBw
YXJlbnRNZWRpYUVsZW1lbnQocmVuZGVyT2JqZWN0KTsKLSAgICBpZiAoIW1lZGlhRWxlbWVudCkK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBmbG9hdCB2b2x1bWUgPSBtZWRpYUVsZW1lbnQt
Pm11dGVkKCkgPyAwLjBmIDogbWVkaWFFbGVtZW50LT52b2x1bWUoKTsKLSAgICBpZiAoIXZvbHVt
ZSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQg
PSBwYWludEluZm8uY29udGV4dDsKLSAgICBjb250ZXh0LT5zYXZlKCk7Ci0gICAgY29udGV4dC0+
c2V0U3Ryb2tlU3R5bGUoTm9TdHJva2UpOwotCi0gICAgaW50IHJlY3RIZWlnaHQgPSByZWN0Lmhl
aWdodCgpOwotICAgIGZsb2F0IHRyYWNrSGVpZ2h0ID0gcmVjdEhlaWdodCAqIHZvbHVtZTsKLSAg
ICBSZW5kZXJTdHlsZSYgc3R5bGUgPSByZW5kZXJPYmplY3Quc3R5bGUoKTsKLSAgICBJbnRSZWN0
IHZvbHVtZVJlY3QocmVjdCk7Ci0gICAgdm9sdW1lUmVjdC5tb3ZlKDAsIHJlY3RIZWlnaHQgLSB0
cmFja0hlaWdodCk7Ci0gICAgdm9sdW1lUmVjdC5zZXRIZWlnaHQoY2VpbCh0cmFja0hlaWdodCkp
OwotCi0gICAgY29udGV4dC0+ZmlsbFJvdW5kZWRSZWN0KEZsb2F0Um91bmRlZFJlY3Qodm9sdW1l
UmVjdCwgYm9yZGVyUmFkaWlGcm9tU3R5bGUoc3R5bGUpKSwKLSAgICAgICAgc3R5bGUudmlzaXRl
ZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Q29sb3IpLCBzdHlsZS5jb2xvclNwYWNlKCkpOwot
ICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBS
ZW5kZXJUaGVtZUd0azo6cGFpbnRNZWRpYVZvbHVtZVNsaWRlclRodW1iKGNvbnN0IFJlbmRlck9i
amVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50
UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRNZWRpYVNsaWRlclRodW1iKHJlbmRlck9i
amVjdCwgcGFpbnRJbmZvLCByZWN0KTsKLX0KLQotU3RyaW5nIFJlbmRlclRoZW1lR3RrOjpmb3Jt
YXRNZWRpYUNvbnRyb2xzQ3VycmVudFRpbWUoZmxvYXQgY3VycmVudFRpbWUsIGZsb2F0IGR1cmF0
aW9uKSBjb25zdAotewotICAgIHJldHVybiBmb3JtYXRNZWRpYUNvbnRyb2xzVGltZShjdXJyZW50
VGltZSkgKyAiIC8gIiArIGZvcm1hdE1lZGlhQ29udHJvbHNUaW1lKGR1cmF0aW9uKTsKLX0KLQot
Ym9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZWRpYUN1cnJlbnRUaW1lKGNvbnN0IFJlbmRlck9i
amVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKQotewotICAgIHJldHVybiBm
YWxzZTsKLX0KLSNlbmRpZgotCi12b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RQcm9ncmVzc0Jh
clN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQmKSBjb25z
dAotewotICAgIHN0eWxlLnNldEJveFNoYWRvdyhudWxscHRyKTsKLX0KLQotLy8gVGhlc2UgdmFs
dWVzIGhhdmUgYmVlbiBjb3BpZWQgZnJvbSBSZW5kZXJUaGVtZUNocm9taXVtU2tpYS5jcHAKLXN0
YXRpYyBjb25zdCBpbnQgcHJvZ3Jlc3NBY3Rpdml0eUJsb2NrcyA9IDU7Ci1zdGF0aWMgY29uc3Qg
aW50IHByb2dyZXNzQW5pbWF0aW9uRnJhbWVzID0gMTA7Ci1zdGF0aWMgY29uc3QgZG91YmxlIHBy
b2dyZXNzQW5pbWF0aW9uSW50ZXJ2YWwgPSAwLjEyNTsKLWRvdWJsZSBSZW5kZXJUaGVtZUd0azo6
YW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyYpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIHByb2dyZXNzQW5pbWF0aW9uSW50ZXJ2YWw7Ci19Ci0KLWRvdWJs
ZSBSZW5kZXJUaGVtZUd0azo6YW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQ
cm9ncmVzcyYpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHByb2dyZXNzQW5pbWF0aW9uSW50ZXJ2YWwg
KiBwcm9ncmVzc0FuaW1hdGlvbkZyYW1lcyAqIDI7IC8vICIyIiBmb3IgYmFjayBhbmQgZm9ydGg7
Ci19Ci0KLUludFJlY3QgUmVuZGVyVGhlbWVHdGs6OmNhbGN1bGF0ZVByb2dyZXNzUmVjdChjb25z
dCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgSW50UmVjdCYgZnVsbEJhclJlY3Qp
Ci17Ci0gICAgSW50UmVjdCBwcm9ncmVzc1JlY3QoZnVsbEJhclJlY3QpOwotICAgIGNvbnN0IFJl
bmRlclByb2dyZXNzJiByZW5kZXJQcm9ncmVzcyA9IHRvUmVuZGVyUHJvZ3Jlc3MocmVuZGVyT2Jq
ZWN0KTsKLSAgICBpZiAocmVuZGVyUHJvZ3Jlc3MuaXNEZXRlcm1pbmF0ZSgpKSB7Ci0gICAgICAg
IGludCBwcm9ncmVzc1dpZHRoID0gcHJvZ3Jlc3NSZWN0LndpZHRoKCkgKiByZW5kZXJQcm9ncmVz
cy5wb3NpdGlvbigpOwotICAgICAgICBpZiAocmVuZGVyT2JqZWN0LnN0eWxlKCkuZGlyZWN0aW9u
KCkgPT0gUlRMKQotICAgICAgICAgICAgcHJvZ3Jlc3NSZWN0LnNldFgocHJvZ3Jlc3NSZWN0Lngo
KSArIHByb2dyZXNzUmVjdC53aWR0aCgpIC0gcHJvZ3Jlc3NXaWR0aCk7Ci0gICAgICAgIHByb2dy
ZXNzUmVjdC5zZXRXaWR0aChwcm9ncmVzc1dpZHRoKTsKLSAgICAgICAgcmV0dXJuIHByb2dyZXNz
UmVjdDsKLSAgICB9Ci0KLSAgICBkb3VibGUgYW5pbWF0aW9uUHJvZ3Jlc3MgPSByZW5kZXJQcm9n
cmVzcy5hbmltYXRpb25Qcm9ncmVzcygpOwotCi0gICAgLy8gTmV2ZXIgbGV0IHRoZSBwcm9ncmVz
cyByZWN0IHNocmluayBzbWFsbGVyIHRoYW4gMiBwaXhlbHMuCi0gICAgaW50IG5ld1dpZHRoID0g
c3RkOjptYXgoMiwgcHJvZ3Jlc3NSZWN0LndpZHRoKCkgLyBwcm9ncmVzc0FjdGl2aXR5QmxvY2tz
KTsKLSAgICBpbnQgbW92YWJsZVdpZHRoID0gcHJvZ3Jlc3NSZWN0LndpZHRoKCkgLSBuZXdXaWR0
aDsKLSAgICBwcm9ncmVzc1JlY3Quc2V0V2lkdGgobmV3V2lkdGgpOwotCi0gICAgLy8gV2Ugd2Fu
dCB0aGUgZmlyc3QgMC41IHVuaXRzIG9mIHRoZSBhbmltYXRpb24gcHJvZ3Jlc3MgdG8gcmVwcmVz
ZW50IHRoZQotICAgIC8vIGZvcndhcmQgbW90aW9uIGFuZCB0aGUgc2Vjb25kIDAuNSB1bml0cyB0
byByZXByZXNlbnQgdGhlIGJhY2t3YXJkIG1vdGlvbiwKLSAgICAvLyB0aHVzIHdlIG11bHRpcGx5
IGJ5IHR3byBoZXJlIHRvIGdldCB0aGUgZnVsbCBzd2VlcCBvZiB0aGUgcHJvZ3Jlc3MgYmFyIHdp
dGgKLSAgICAvLyBlYWNoIGRpcmVjdGlvbi4KLSAgICBpZiAoYW5pbWF0aW9uUHJvZ3Jlc3MgPCAw
LjUpCi0gICAgICAgIHByb2dyZXNzUmVjdC5zZXRYKHByb2dyZXNzUmVjdC54KCkgKyAoYW5pbWF0
aW9uUHJvZ3Jlc3MgKiAyICogbW92YWJsZVdpZHRoKSk7Ci0gICAgZWxzZQotICAgICAgICBwcm9n
cmVzc1JlY3Quc2V0WChwcm9ncmVzc1JlY3QueCgpICsgKCgxLjAgLSBhbmltYXRpb25Qcm9ncmVz
cykgKiAyICogbW92YWJsZVdpZHRoKSk7Ci0gICAgcmV0dXJuIHByb2dyZXNzUmVjdDsKLX0KLQot
U3RyaW5nIFJlbmRlclRoZW1lR3RrOjpmaWxlTGlzdE5hbWVGb3JXaWR0aChjb25zdCBGaWxlTGlz
dCogZmlsZUxpc3QsIGNvbnN0IEZvbnQmIGZvbnQsIGludCB3aWR0aCwgYm9vbCBtdWx0aXBsZUZp
bGVzQWxsb3dlZCkgY29uc3QKLXsKLSAgICBpZiAod2lkdGggPD0gMCkKLSAgICAgICAgcmV0dXJu
IFN0cmluZygpOwotCi0gICAgaWYgKGZpbGVMaXN0LT5sZW5ndGgoKSA+IDEpCi0gICAgICAgIHJl
dHVybiBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUobXVsdGlwbGVGaWxlVXBsb2FkVGV4
dChmaWxlTGlzdC0+bGVuZ3RoKCkpLCB3aWR0aCwgZm9udCwgU3RyaW5nVHJ1bmNhdG9yOjpFbmFi
bGVSb3VuZGluZ0hhY2tzKTsKLQotICAgIFN0cmluZyBzdHJpbmc7Ci0gICAgaWYgKGZpbGVMaXN0
LT5sZW5ndGgoKSkKLSAgICAgICAgc3RyaW5nID0gcGF0aEdldEZpbGVOYW1lKGZpbGVMaXN0LT5p
dGVtKDApLT5wYXRoKCkpOwotICAgIGVsc2UgaWYgKG11bHRpcGxlRmlsZXNBbGxvd2VkKQotICAg
ICAgICBzdHJpbmcgPSBmaWxlQnV0dG9uTm9GaWxlc1NlbGVjdGVkTGFiZWwoKTsKLSAgICBlbHNl
Ci0gICAgICAgIHN0cmluZyA9IGZpbGVCdXR0b25Ob0ZpbGVTZWxlY3RlZExhYmVsKCk7Ci0KLSAg
ICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShzdHJpbmcsIHdpZHRoLCBm
b250LCBTdHJpbmdUcnVuY2F0b3I6OkVuYWJsZVJvdW5kaW5nSGFja3MpOwotfQotCi1TdHJpbmcg
UmVuZGVyVGhlbWVHdGs6Om1lZGlhQ29udHJvbHNTY3JpcHQoKQotewotICAgIFN0cmluZ0J1aWxk
ZXIgc2NyaXB0QnVpbGRlcjsKLSAgICBzY3JpcHRCdWlsZGVyLmFwcGVuZChtZWRpYUNvbnRyb2xz
TG9jYWxpemVkU3RyaW5nc0phdmFTY3JpcHQsIHNpemVvZihtZWRpYUNvbnRyb2xzTG9jYWxpemVk
U3RyaW5nc0phdmFTY3JpcHQpKTsKLSAgICBzY3JpcHRCdWlsZGVyLmFwcGVuZChtZWRpYUNvbnRy
b2xzQXBwbGVKYXZhU2NyaXB0LCBzaXplb2YobWVkaWFDb250cm9sc0FwcGxlSmF2YVNjcmlwdCkp
OwotICAgIHNjcmlwdEJ1aWxkZXIuYXBwZW5kKG1lZGlhQ29udHJvbHNHdGtKYXZhU2NyaXB0LCBz
aXplb2YobWVkaWFDb250cm9sc0d0a0phdmFTY3JpcHQpKTsKLSAgICByZXR1cm4gc2NyaXB0QnVp
bGRlci50b1N0cmluZygpOwotfQotCi0jZW5kaWYgLy8gR1RLX0FQSV9WRVJTSU9OXzIKLX0KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUd0ay5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVHdGsuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzVjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVHdGsuY3BwCkBAIC0wLDAgKzEsMTY4MCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDcgQWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBDb2xs
YWJvcmEgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEtlbm5ldGggUm9oZGUgQ2hyaXN0aWFu
c2VuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZUd0ay5oIgorCisjaW5jbHVkZSAiQ1NTVmFsdWVL
ZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGVQbGFjZWhvbGRlci5oIgorI2luY2x1
ZGUgIkZpbGVMaXN0LmgiCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIkZvbnRE
ZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIkdyYWRpZW50LmgiCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCisjaW5jbHVkZSAiR3RrVmVyc2lvbmluZy5oIgorI2luY2x1ZGUgIkhUTUxNZWRp
YUVsZW1lbnQuaCIKKyNpbmNsdWRlICJMb2NhbGl6ZWRTdHJpbmdzLmgiCisjaW5jbHVkZSAiTWVk
aWFDb250cm9sRWxlbWVudHMuaCIKKyNpbmNsdWRlICJOYW1lZE5vZGVNYXAuaCIKKyNpbmNsdWRl
ICJQYWdlLmgiCisjaW5jbHVkZSAiUGFpbnRJbmZvLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250
ZXh0Q2Fpcm8uaCIKKyNpbmNsdWRlICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJPYmpl
Y3QuaCIKKyNpbmNsdWRlICJSZW5kZXJQcm9ncmVzcy5oIgorI2luY2x1ZGUgIlNjcm9sbGJhclRo
ZW1lR3RrLmgiCisjaW5jbHVkZSAiU3RyaW5nVHJ1bmNhdG9yLmgiCisjaW5jbHVkZSAiVGltZVJh
bmdlcy5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFNjcmlwdHMuaCIKKyNpbmNsdWRlICJVc2VyQWdl
bnRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGdkay9nZGsuaD4K
KyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPHd0Zi9O
ZXZlckRlc3Ryb3llZC5oPgorI2luY2x1ZGUgPHd0Zi9nb2JqZWN0L0dSZWZQdHIuaD4KKyNpbmNs
dWRlIDx3dGYvZ29iamVjdC9HVW5pcXVlUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmlu
Zy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZUd0azo6Y3JlYXRl
KCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJlbmRlclRoZW1lR3RrKCkpOworfQorCitQ
YXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqKQor
eworICAgIHN0YXRpYyBSZW5kZXJUaGVtZSogcnQgPSBSZW5kZXJUaGVtZUd0azo6Y3JlYXRlKCku
bGVha1JlZigpOworICAgIHJldHVybiBydDsKK30KKworc3RhdGljIGRvdWJsZSBnZXRTY3JlZW5E
UEkoKQoreworICAgIC8vIEZJWE1FOiBSZWFsbHkgdGhpcyBzaG91bGQgYmUgdGhlIHdpZGdldCdz
IHNjcmVlbi4KKyAgICBHZGtTY3JlZW4qIHNjcmVlbiA9IGdka19zY3JlZW5fZ2V0X2RlZmF1bHQo
KTsKKyAgICBpZiAoIXNjcmVlbikKKyAgICAgICAgcmV0dXJuIDk2OyAvLyBEZWZhdWx0IHRvIDk2
IERQSS4KKworICAgIGZsb2F0IGRwaSA9IGdka19zY3JlZW5fZ2V0X3Jlc29sdXRpb24oc2NyZWVu
KTsKKyAgICBpZiAoZHBpIDw9IDApCisgICAgICAgIHJldHVybiA5NjsKKyAgICByZXR1cm4gZHBp
OworfQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjpzeXN0ZW1Gb250KENTU1ZhbHVlSUQsIEZvbnRE
ZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAoreworICAgIEd0a1NldHRpbmdzKiBz
ZXR0aW5ncyA9IGd0a19zZXR0aW5nc19nZXRfZGVmYXVsdCgpOworICAgIGlmICghc2V0dGluZ3Mp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgd2lsbCBiZSBhIGZvbnQgc2VsZWN0aW9u
IHN0cmluZyBsaWtlICJTYW5zIDEwIiBzbyB3ZSBjYW5ub3QgdXNlIGl0IGFzIHRoZSBmYW1pbHkg
bmFtZS4KKyAgICBHVW5pcXVlT3V0UHRyPGdjaGFyPiBmb250TmFtZTsKKyAgICBnX29iamVjdF9n
ZXQoc2V0dGluZ3MsICJndGstZm9udC1uYW1lIiwgJmZvbnROYW1lLm91dFB0cigpLCBudWxscHRy
KTsKKworICAgIFBhbmdvRm9udERlc2NyaXB0aW9uKiBwYW5nb0Rlc2NyaXB0aW9uID0gcGFuZ29f
Zm9udF9kZXNjcmlwdGlvbl9mcm9tX3N0cmluZyhmb250TmFtZS5nZXQoKSk7CisgICAgaWYgKCFw
YW5nb0Rlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBmb250RGVzY3JpcHRpb24u
c2V0T25lRmFtaWx5KHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZ2V0X2ZhbWlseShwYW5nb0Rlc2Ny
aXB0aW9uKSk7CisKKyAgICBpbnQgc2l6ZSA9IHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZ2V0X3Np
emUocGFuZ29EZXNjcmlwdGlvbikgLyBQQU5HT19TQ0FMRTsKKyAgICAvLyBJZiB0aGUgc2l6ZSBv
ZiB0aGUgZm9udCBpcyBpbiBwb2ludHMsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMu
CisgICAgaWYgKCFwYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zaXplX2lzX2Fic29sdXRlKHBh
bmdvRGVzY3JpcHRpb24pKQorICAgICAgICBzaXplID0gc2l6ZSAqIChnZXRTY3JlZW5EUEkoKSAv
IDcyLjApOworCisgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoc2l6ZSk7Cisg
ICAgZm9udERlc2NyaXB0aW9uLnNldElzQWJzb2x1dGVTaXplKHRydWUpOworICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOworICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRXZWlnaHQoRm9udFdlaWdodE5vcm1hbCk7CisgICAgZm9udERl
c2NyaXB0aW9uLnNldEl0YWxpYyhmYWxzZSk7CisgICAgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9m
cmVlKHBhbmdvRGVzY3JpcHRpb24pOworfQorCisjaWYgRU5BQkxFKERBVEFMSVNUX0VMRU1FTlQp
CitJbnRTaXplIFJlbmRlclRoZW1lR3RrOjpzbGlkZXJUaWNrU2l6ZSgpIGNvbnN0Cit7CisgICAg
Ly8gRklYTUU6IFdlIG5lZWQgdG8gc2V0IHRoaXMgdG8gdGhlIHNpemUgb2Ygb25lIHRpY2sgbWFy
ay4KKyAgICByZXR1cm4gSW50U2l6ZSgwLCAwKTsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpz
bGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTog
V2UgbmVlZCB0byBzZXQgdGhpcyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIHRpY2sgbWFya3MuCisg
ICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBHVEtfQVBJX1ZFUlNJT05fMgorCisv
LyBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGRlZmluZWQgYnkgR1RLKywgd2hlcmUgaXQgd2Fz
IGRlZmluZWQgYXMgTUlOX0FSUk9XX1NJWkUgaW4gZ3RrYXJyb3cuYy4KK3N0YXRpYyBjb25zdCBp
bnQgbWluQXJyb3dTaXplID0gMTU7CisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGRlZmlu
ZWQgYnkgR1RLKywgd2hlcmUgaXQgd2FzIGRlZmluZWQgYXMgTUlOX0FSUk9XX1dJRFRIIGluIGd0
a3NwaW5idXR0b24uYy4KK3N0YXRpYyBjb25zdCBpbnQgbWluU3BpbkJ1dHRvbkFycm93U2l6ZSA9
IDY7CisKK3R5cGVkZWYgSGFzaE1hcDxHVHlwZSwgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+PiBT
dHlsZUNvbnRleHRNYXA7CitzdGF0aWMgU3R5bGVDb250ZXh0TWFwJiBzdHlsZUNvbnRleHRNYXAo
KTsKKworc3RhdGljIHZvaWQgZ3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2soR09iamVjdCosIEdQYXJh
bVNwZWMqKQoreworICAgIGZvciAoY29uc3QgYXV0byYgc3R5bGVDb250ZXh0IDogc3R5bGVDb250
ZXh0TWFwKCkpCisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2ludmFsaWRhdGUoc3R5bGVDb250
ZXh0LnZhbHVlLmdldCgpKTsKKyAgICBzdGF0aWNfY2FzdDxTY3JvbGxiYXJUaGVtZUd0ayo+KFNj
cm9sbGJhclRoZW1lOjp0aGVtZSgpKS0+dGhlbWVDaGFuZ2VkKCk7CisgICAgUGFnZTo6dXBkYXRl
U3R5bGVGb3JBbGxQYWdlc0FmdGVyR2xvYmFsQ2hhbmdlSW5FbnZpcm9ubWVudCgpOworfQorCitz
dGF0aWMgU3R5bGVDb250ZXh0TWFwJiBzdHlsZUNvbnRleHRNYXAoKQoreworICAgIHN0YXRpYyBO
ZXZlckRlc3Ryb3llZDxTdHlsZUNvbnRleHRNYXA+IG1hcDsKKyAgICBzdGF0aWMgYm9vbCBpbml0
aWFsaXplZCA9IGZhbHNlOworICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgR3RrU2V0
dGluZ3MqIHNldHRpbmdzID0gZ3RrX3NldHRpbmdzX2dldF9kZWZhdWx0KCk7CisgICAgICAgIGdf
c2lnbmFsX2Nvbm5lY3Qoc2V0dGluZ3MsICJub3RpZnk6Omd0ay10aGVtZS1uYW1lIiwgR19DQUxM
QkFDSyhndGtTdHlsZUNoYW5nZWRDYWxsYmFjayksIG51bGxwdHIpOworICAgICAgICBnX3NpZ25h
bF9jb25uZWN0KHNldHRpbmdzLCAibm90aWZ5OjpndGstY29sb3Itc2NoZW1lIiwgR19DQUxMQkFD
SyhndGtTdHlsZUNoYW5nZWRDYWxsYmFjayksIG51bGxwdHIpOworICAgICAgICBpbml0aWFsaXpl
ZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBtYXA7Cit9CisKK3N0YXRpYyBHdGtTdHlsZUNv
bnRleHQqIGdldFN0eWxlQ29udGV4dChHVHlwZSB3aWRnZXRUeXBlKQoreworICAgIFN0eWxlQ29u
dGV4dE1hcDo6QWRkUmVzdWx0IHJlc3VsdCA9IHN0eWxlQ29udGV4dE1hcCgpLmFkZCh3aWRnZXRU
eXBlLCBudWxscHRyKTsKKyAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5KQorICAgICAgICByZXR1
cm4gcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS5nZXQoKTsKKworICAgIEd0a1dpZGdldFBhdGgqIHBh
dGggPSBndGtfd2lkZ2V0X3BhdGhfbmV3KCk7CisgICAgZ3RrX3dpZGdldF9wYXRoX2FwcGVuZF90
eXBlKHBhdGgsIHdpZGdldFR5cGUpOworCisgICAgaWYgKHdpZGdldFR5cGUgPT0gR1RLX1RZUEVf
RU5UUlkpCisgICAgICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLCAwLCBH
VEtfU1RZTEVfQ0xBU1NfRU5UUlkpOworICAgIGVsc2UgaWYgKHdpZGdldFR5cGUgPT0gR1RLX1RZ
UEVfQVJST1cpCisgICAgICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLCAw
LCAiYXJyb3ciKTsKKyAgICBlbHNlIGlmICh3aWRnZXRUeXBlID09IEdUS19UWVBFX0JVVFRPTikg
eworICAgICAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0aCwgMCwgR1RLX1NU
WUxFX0NMQVNTX0JVVFRPTik7CisgICAgICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFz
cyhwYXRoLCAxLCAidGV4dC1idXR0b24iKTsKKyAgICB9IGVsc2UgaWYgKHdpZGdldFR5cGUgPT0g
R1RLX1RZUEVfU0NBTEUpCisgICAgICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhw
YXRoLCAwLCBHVEtfU1RZTEVfQ0xBU1NfU0NBTEUpOworICAgIGVsc2UgaWYgKHdpZGdldFR5cGUg
PT0gR1RLX1RZUEVfU0VQQVJBVE9SKQorICAgICAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRf
Y2xhc3MocGF0aCwgMCwgR1RLX1NUWUxFX0NMQVNTX1NFUEFSQVRPUik7CisgICAgZWxzZSBpZiAo
d2lkZ2V0VHlwZSA9PSBHVEtfVFlQRV9QUk9HUkVTU19CQVIpCisgICAgICAgIGd0a193aWRnZXRf
cGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLCAwLCBHVEtfU1RZTEVfQ0xBU1NfUFJPR1JFU1NCQVIp
OworICAgIGVsc2UgaWYgKHdpZGdldFR5cGUgPT0gR1RLX1RZUEVfU1BJTl9CVVRUT04pCisgICAg
ICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLCAwLCBHVEtfU1RZTEVfQ0xB
U1NfU1BJTkJVVFRPTik7CisgICAgZWxzZSBpZiAod2lkZ2V0VHlwZSA9PSBHVEtfVFlQRV9UUkVF
X1ZJRVcpCisgICAgICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLCAwLCBH
VEtfU1RZTEVfQ0xBU1NfVklFVyk7CisgICAgZWxzZSBpZiAod2lkZ2V0VHlwZSA9PSBHVEtfVFlQ
RV9DSEVDS19CVVRUT04pCisgICAgICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhw
YXRoLCAwLCBHVEtfU1RZTEVfQ0xBU1NfQ0hFQ0spOworICAgIGVsc2UgaWYgKHdpZGdldFR5cGUg
PT0gR1RLX1RZUEVfUkFESU9fQlVUVE9OKQorICAgICAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9h
ZGRfY2xhc3MocGF0aCwgMCwgR1RLX1NUWUxFX0NMQVNTX1JBRElPKTsKKworICAgIEdSZWZQdHI8
R3RrU3R5bGVDb250ZXh0PiBjb250ZXh0ID0gYWRvcHRHUmVmKGd0a19zdHlsZV9jb250ZXh0X25l
dygpKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfcGF0aChjb250ZXh0LmdldCgpLCBwYXRo
KTsKKyAgICBndGtfd2lkZ2V0X3BhdGhfZnJlZShwYXRoKTsKKworICAgIHJlc3VsdC5pdGVyYXRv
ci0+dmFsdWUgPSBjb250ZXh0OworICAgIHJldHVybiBjb250ZXh0LmdldCgpOworfQorCitzdGF0
aWMgR1JlZlB0cjxHZGtQaXhidWY+IGdldFN0b2NrSWNvbkZvcldpZGdldFR5cGUoR1R5cGUgd2lk
Z2V0VHlwZSwgY29uc3QgY2hhciogaWNvbk5hbWUsIGdpbnQgZGlyZWN0aW9uLCBnaW50IHN0YXRl
LCBnaW50IGljb25TaXplKQoreworICAgIEFTU0VSVChpY29uTmFtZSk7CisKKyAgICBHdGtTdHls
ZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQod2lkZ2V0VHlwZSk7CisgICAgR3Rr
SWNvblNldCogaWNvblNldCA9IGd0a19zdHlsZV9jb250ZXh0X2xvb2t1cF9pY29uX3NldChjb250
ZXh0LCBpY29uTmFtZSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOwor
CisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmIChzdGF0ZSA9PSBHVEtfU1RBVEVfUFJFTElH
SFQpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJR0hUOworICAgIGVsc2Ug
aWYgKHN0YXRlID09IEdUS19TVEFURV9JTlNFTlNJVElWRSkKKyAgICAgICAgZmxhZ3MgfD0gR1RL
X1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3Rh
dGUoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKKyAgICBndGtf
c3R5bGVfY29udGV4dF9zZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1RleHRE
aXJlY3Rpb24+KGRpcmVjdGlvbikpOworICAgIEdka1BpeGJ1ZiogaWNvbiA9IGd0a19pY29uX3Nl
dF9yZW5kZXJfaWNvbl9waXhidWYoaWNvblNldCwgY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrSWNv
blNpemU+KGljb25TaXplKSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRl
eHQpOworCisgICAgcmV0dXJuIGFkb3B0R1JlZihpY29uKTsKK30KKworc3RhdGljIEdSZWZQdHI8
R2RrUGl4YnVmPiBnZXRTdG9ja1N5bWJvbGljSWNvbkZvcldpZGdldFR5cGUoR1R5cGUgd2lkZ2V0
VHlwZSwgY29uc3QgY2hhciogc3ltYm9saWNJY29uTmFtZSwgY29uc3QgY2hhciogZmFsbGJhY2tT
dG9ja0ljb25OYW1lLCBnaW50IGRpcmVjdGlvbiwgZ2ludCBzdGF0ZSwgZ2ludCBpY29uU2l6ZSkK
K3sKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQod2lkZ2V0
VHlwZSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOworCisgICAgZ3Vp
bnQgZmxhZ3MgPSAwOworICAgIGlmIChzdGF0ZSA9PSBHVEtfU1RBVEVfUFJFTElHSFQpCisgICAg
ICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJR0hUOworICAgIGVsc2UgaWYgKHN0YXRl
ID09IEdUS19TVEFURV9JTlNFTlNJVElWRSkKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZM
QUdfSU5TRU5TSVRJVkU7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4
dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKKyAgICBndGtfc3R5bGVfY29u
dGV4dF9zZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+
KGRpcmVjdGlvbikpOworICAgIEd0a0ljb25JbmZvKiBpbmZvID0gZ3RrX2ljb25fdGhlbWVfbG9v
a3VwX2ljb24oZ3RrX2ljb25fdGhlbWVfZ2V0X2RlZmF1bHQoKSwgc3ltYm9saWNJY29uTmFtZSwg
aWNvblNpemUsCisgICAgICAgIHN0YXRpY19jYXN0PEd0a0ljb25Mb29rdXBGbGFncz4oR1RLX0lD
T05fTE9PS1VQX0ZPUkNFX1NWRyB8IEdUS19JQ09OX0xPT0tVUF9GT1JDRV9TSVpFKSk7CisgICAg
R2RrUGl4YnVmKiBpY29uID0gMDsKKyAgICBpZiAoaW5mbykgeworICAgICAgICBpY29uID0gZ3Rr
X2ljb25faW5mb19sb2FkX3N5bWJvbGljX2Zvcl9jb250ZXh0KGluZm8sIGNvbnRleHQsIDAsIDAp
OworICAgICAgICBndGtfaWNvbl9pbmZvX2ZyZWUoaW5mbyk7CisgICAgfQorCisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKworICAgIGlmICghaWNvbikgeworICAgICAg
ICBpZiAoIWZhbGxiYWNrU3RvY2tJY29uTmFtZSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRy
OworICAgICAgICByZXR1cm4gZ2V0U3RvY2tJY29uRm9yV2lkZ2V0VHlwZSh3aWRnZXRUeXBlLCBm
YWxsYmFja1N0b2NrSWNvbk5hbWUsIGRpcmVjdGlvbiwgc3RhdGUsIGljb25TaXplKTsKKyAgICB9
CisKKyAgICByZXR1cm4gYWRvcHRHUmVmKGljb24pOworfQorCisjaWYgRU5BQkxFKFZJREVPKQor
c3RhdGljIEhUTUxNZWRpYUVsZW1lbnQqIGdldE1lZGlhRWxlbWVudEZyb21SZW5kZXJPYmplY3Qo
Y29uc3QgUmVuZGVyT2JqZWN0JiBvKQoreworICAgIE5vZGUqIG5vZGUgPSBvLm5vZGUoKTsKKyAg
ICBOb2RlKiBtZWRpYU5vZGUgPSBub2RlID8gbm9kZS0+c2hhZG93SG9zdCgpIDogMDsKKyAgICBp
ZiAoIW1lZGlhTm9kZSkKKyAgICAgICAgbWVkaWFOb2RlID0gbm9kZTsKKyAgICBpZiAoIW1lZGlh
Tm9kZSB8fCAhbWVkaWFOb2RlLT5pc0VsZW1lbnROb2RlKCkgfHwgIXRvRWxlbWVudChtZWRpYU5v
ZGUpLT5pc01lZGlhRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiB0
b0hUTUxNZWRpYUVsZW1lbnQobWVkaWFOb2RlKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6
aW5pdE1lZGlhQ29sb3JzKCkKK3sKKyAgICBHZGtSR0JBIGNvbG9yOworICAgIEd0a1N0eWxlQ29u
dGV4dCogY29udGFpbmVyQ29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9DT05UQUlO
RVIpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JhY2tncm91bmRfY29sb3IoY29udGFp
bmVyQ29udGV4dCwgR1RLX1NUQVRFX0ZMQUdfTk9STUFMLCAmY29sb3IpOworICAgIG1fcGFuZWxD
b2xvciA9IGNvbG9yOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9iYWNrZ3JvdW5kX2NvbG9y
KGNvbnRhaW5lckNvbnRleHQsIEdUS19TVEFURV9GTEFHX0FDVElWRSwgJmNvbG9yKTsKKyAgICBt
X3NsaWRlckNvbG9yID0gY29sb3I7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JhY2tncm91
bmRfY29sb3IoY29udGFpbmVyQ29udGV4dCwgR1RLX1NUQVRFX0ZMQUdfU0VMRUNURUQsICZjb2xv
cik7CisgICAgbV9zbGlkZXJUaHVtYkNvbG9yID0gY29sb3I7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVHdGs6OmluaXRNZWRpYUJ1dHRvbnMoKQoreworICAgIHN0YXRpYyBib29sIGljb25zSW5pdGlh
bGl6ZWQgPSBmYWxzZTsKKworICAgIGlmIChpY29uc0luaXRpYWxpemVkKQorICAgICAgICByZXR1
cm47CisKKyAgICBHUmVmUHRyPEd0a0ljb25GYWN0b3J5PiBpY29uRmFjdG9yeSA9IGFkb3B0R1Jl
ZihndGtfaWNvbl9mYWN0b3J5X25ldygpKTsKKyAgICBHdGtJY29uU291cmNlKiBpY29uU291cmNl
ID0gZ3RrX2ljb25fc291cmNlX25ldygpOworICAgIGNvbnN0IGNoYXIqIGljb25zW10gPSB7ICJh
dWRpby12b2x1bWUtaGlnaCIsICJhdWRpby12b2x1bWUtbXV0ZWQiIH07CisKKyAgICBndGtfaWNv
bl9mYWN0b3J5X2FkZF9kZWZhdWx0KGljb25GYWN0b3J5LmdldCgpKTsKKworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTKGljb25zKTsgKytpKSB7CisgICAgICAgIGd0a19p
Y29uX3NvdXJjZV9zZXRfaWNvbl9uYW1lKGljb25Tb3VyY2UsIGljb25zW2ldKTsKKyAgICAgICAg
R3RrSWNvblNldCogaWNvblNldCA9IGd0a19pY29uX3NldF9uZXcoKTsKKyAgICAgICAgZ3RrX2lj
b25fc2V0X2FkZF9zb3VyY2UoaWNvblNldCwgaWNvblNvdXJjZSk7CisgICAgICAgIGd0a19pY29u
X2ZhY3RvcnlfYWRkKGljb25GYWN0b3J5LmdldCgpLCBpY29uc1tpXSwgaWNvblNldCk7CisgICAg
ICAgIGd0a19pY29uX3NldF91bnJlZihpY29uU2V0KTsKKyAgICB9CisKKyAgICBndGtfaWNvbl9z
b3VyY2VfZnJlZShpY29uU291cmNlKTsKKworICAgIGljb25zSW5pdGlhbGl6ZWQgPSB0cnVlOwor
fQorI2VuZGlmCisKK3N0YXRpYyBib29sIG5vZGVIYXNQc2V1ZG8oTm9kZSogbm9kZSwgY29uc3Qg
Y2hhciogcHNldWRvKQoreworICAgIFJlZlB0cjxOb2RlPiBhdHRyaWJ1dGVOb2RlID0gbm9kZS0+
YXR0cmlidXRlcygpLT5nZXROYW1lZEl0ZW0oInBzZXVkbyIpOworCisgICAgcmV0dXJuIGF0dHJp
YnV0ZU5vZGUgPyBhdHRyaWJ1dGVOb2RlLT5ub2RlVmFsdWUoKSA9PSBwc2V1ZG8gOiBmYWxzZTsK
K30KKworc3RhdGljIGJvb2wgbm9kZUhhc0NsYXNzKE5vZGUqIG5vZGUsIGNvbnN0IGNoYXIqIGNs
YXNzTmFtZSkKK3sKKyAgICBpZiAoIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgRWxlbWVudCogZWxlbWVudCA9IHRvRWxlbWVudChub2RlKTsKKwor
ICAgIGlmICghZWxlbWVudC0+aGFzQ2xhc3MoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgcmV0dXJuIGVsZW1lbnQtPmNsYXNzTmFtZXMoKS5jb250YWlucyhjbGFzc05hbWUpOworfQor
CitSZW5kZXJUaGVtZUd0azo6UmVuZGVyVGhlbWVHdGsoKQorICAgIDogbV9wYW5lbENvbG9yKENv
bG9yOjp3aGl0ZSkKKyAgICAsIG1fc2xpZGVyQ29sb3IoQ29sb3I6OndoaXRlKQorICAgICwgbV9z
bGlkZXJUaHVtYkNvbG9yKENvbG9yOjp3aGl0ZSkKKyAgICAsIG1fbWVkaWFJY29uU2l6ZSgxNikK
KyAgICAsIG1fbWVkaWFTbGlkZXJIZWlnaHQoMTQpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAg
IGluaXRNZWRpYUNvbG9ycygpOworICAgIGluaXRNZWRpYUJ1dHRvbnMoKTsKKyNlbmRpZgorfQor
CitSZW5kZXJUaGVtZUd0azo6flJlbmRlclRoZW1lR3RrKCkKK3sKK30KKworc3RhdGljIGJvb2wg
c3VwcG9ydHNGb2N1cyhDb250cm9sUGFydCBhcHBlYXJhbmNlKQoreworICAgIHN3aXRjaCAoYXBw
ZWFyYW5jZSkgeworICAgIGNhc2UgUHVzaEJ1dHRvblBhcnQ6CisgICAgY2FzZSBCdXR0b25QYXJ0
OgorICAgIGNhc2UgVGV4dEZpZWxkUGFydDoKKyAgICBjYXNlIFRleHRBcmVhUGFydDoKKyAgICBj
YXNlIFNlYXJjaEZpZWxkUGFydDoKKyAgICBjYXNlIE1lbnVsaXN0UGFydDoKKyAgICBjYXNlIFJh
ZGlvUGFydDoKKyAgICBjYXNlIENoZWNrYm94UGFydDoKKyAgICBjYXNlIFNsaWRlckhvcml6b250
YWxQYXJ0OgorICAgIGNhc2UgU2xpZGVyVmVydGljYWxQYXJ0OgorICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29s
IFJlbmRlclRoZW1lR3RrOjpzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSYgc3R5
bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRzRm9jdXMoc3R5bGUuYXBwZWFyYW5jZSgp
KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6Y29udHJvbFN1cHBvcnRzVGludHMoY29uc3Qg
UmVuZGVyT2JqZWN0JiBvKSBjb25zdAoreworICAgIHJldHVybiBpc0VuYWJsZWQobyk7Cit9CisK
K2ludCBSZW5kZXJUaGVtZUd0azo6YmFzZWxpbmVQb3NpdGlvbihjb25zdCBSZW5kZXJPYmplY3Qm
IG8pIGNvbnN0Cit7CisgICAgaWYgKCFvLmlzQm94KCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgLy8gRklYTUU6IFRoaXMgc3RyYXRlZ3kgaXMgcG9zc2libHkgaW5jb3JyZWN0IGZvciB0aGUg
R1RLKyBwb3J0LgorICAgIGlmIChvLnN0eWxlKCkuYXBwZWFyYW5jZSgpID09IENoZWNrYm94UGFy
dAorICAgICAgICB8fCBvLnN0eWxlKCkuYXBwZWFyYW5jZSgpID09IFJhZGlvUGFydCkgeworICAg
ICAgICBjb25zdCBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KCZvKTsKKyAgICAgICAgcmV0
dXJuIGJveC0+bWFyZ2luVG9wKCkgKyBib3gtPmhlaWdodCgpIC0gMjsKKyAgICB9CisKKyAgICBy
ZXR1cm4gUmVuZGVyVGhlbWU6OmJhc2VsaW5lUG9zaXRpb24obyk7Cit9CisKK3N0YXRpYyBHdGtU
ZXh0RGlyZWN0aW9uIGd0a1RleHREaXJlY3Rpb24oVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCit7
CisgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKKyAgICBjYXNlIFJUTDoKKyAgICAgICAgcmV0dXJu
IEdUS19URVhUX0RJUl9SVEw7CisgICAgY2FzZSBMVFI6CisgICAgICAgIHJldHVybiBHVEtfVEVY
VF9ESVJfTFRSOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBHVEtfVEVYVF9ESVJfTk9O
RTsKKyAgICB9Cit9CisKK3N0YXRpYyBHdGtTdGF0ZVR5cGUgZ3RrSWNvblN0YXRlKFJlbmRlclRo
ZW1lKiB0aGVtZSwgY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QpCit7CisgICAgaWYg
KCF0aGVtZS0+aXNFbmFibGVkKHJlbmRlck9iamVjdCkpCisgICAgICAgIHJldHVybiBHVEtfU1RB
VEVfSU5TRU5TSVRJVkU7CisgICAgaWYgKHRoZW1lLT5pc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkK
KyAgICAgICAgcmV0dXJuIEdUS19TVEFURV9BQ1RJVkU7CisgICAgaWYgKHRoZW1lLT5pc0hvdmVy
ZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIEdUS19TVEFURV9QUkVMSUdIVDsKKwor
ICAgIHJldHVybiBHVEtfU1RBVEVfTk9STUFMOworfQorCitzdGF0aWMgdm9pZCBhZGp1c3RSZWN0
Rm9yRm9jdXMoR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0LCBGbG9hdFJlY3QmIHJlY3QpCit7Cisg
ICAgZ2ludCBmb2N1c1dpZHRoLCBmb2N1c1BhZDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRf
c3R5bGUoY29udGV4dCwgImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0aCwgImZvY3VzLXBh
ZGRpbmciLCAmZm9jdXNQYWQsIG51bGxwdHIpOworICAgIHJlY3QuaW5mbGF0ZShmb2N1c1dpZHRo
ICsgZm9jdXNQYWQpOworfQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RSZXBhaW50UmVj
dChjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgRmxvYXRSZWN0JiByZWN0KQorewor
ICAgIEd0a1N0eWxlQ29udGV4dCogY29udGV4dCA9IDA7CisgICAgYm9vbCBjaGVja0ludGVyaW9y
Rm9jdXMgPSBmYWxzZTsKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gcmVuZGVyT2JqZWN0LnN0eWxl
KCkuYXBwZWFyYW5jZSgpOworICAgIHN3aXRjaCAocGFydCkgeworICAgIGNhc2UgQ2hlY2tib3hQ
YXJ0OgorICAgIGNhc2UgUmFkaW9QYXJ0OgorICAgICAgICBjb250ZXh0ID0gZ2V0U3R5bGVDb250
ZXh0KHBhcnQgPT0gQ2hlY2tib3hQYXJ0ID8gR1RLX1RZUEVfQ0hFQ0tfQlVUVE9OIDogR1RLX1RZ
UEVfUkFESU9fQlVUVE9OKTsKKworICAgICAgICBnaW50IGluZGljYXRvclNwYWNpbmc7CisgICAg
ICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LCAiaW5kaWNhdG9yLXNwYWNp
bmciLCAmaW5kaWNhdG9yU3BhY2luZywgbnVsbHB0cik7CisgICAgICAgIHJlY3QuaW5mbGF0ZShp
bmRpY2F0b3JTcGFjaW5nKTsKKworICAgICAgICByZXR1cm47CisgICAgY2FzZSBTbGlkZXJWZXJ0
aWNhbFBhcnQ6CisgICAgY2FzZSBTbGlkZXJIb3Jpem9udGFsUGFydDoKKyAgICAgICAgY29udGV4
dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9TQ0FMRSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgQnV0dG9uUGFydDoKKyAgICBjYXNlIE1lbnVsaXN0QnV0dG9uUGFydDoKKyAgICBjYXNl
IE1lbnVsaXN0UGFydDoKKyAgICAgICAgY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQ
RV9CVVRUT04pOworICAgICAgICBjaGVja0ludGVyaW9yRm9jdXMgPSB0cnVlOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFRleHRGaWVsZFBhcnQ6CisgICAgY2FzZSBUZXh0QXJlYVBhcnQ6Cisg
ICAgICAgIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfRU5UUlkpOworICAgICAg
ICBjaGVja0ludGVyaW9yRm9jdXMgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0
OgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGlm
IChjaGVja0ludGVyaW9yRm9jdXMpIHsKKyAgICAgICAgZ2Jvb2xlYW4gaW50ZXJpb3JGb2N1czsK
KyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsICJpbnRlcmlvci1m
b2N1cyIsICZpbnRlcmlvckZvY3VzLCBudWxscHRyKTsKKyAgICAgICAgaWYgKGludGVyaW9yRm9j
dXMpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFkanVzdFJlY3RGb3JGb2N1cyhj
b250ZXh0LCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0QnV0dG9uU3R5
bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiBzdHlsZSwgV2ViQ29yZTo6RWxlbWVudCYp
IGNvbnN0Cit7CisgICAgLy8gU29tZSBsYXlvdXQgdGVzdHMgY2hlY2sgZXhwbGljaXRseSB0aGF0
IGJ1dHRvbnMgaWdub3JlIGxpbmUtaGVpZ2h0LgorICAgIGlmIChzdHlsZS5hcHBlYXJhbmNlKCkg
PT0gUHVzaEJ1dHRvblBhcnQpCisgICAgICAgIHN0eWxlLnNldExpbmVIZWlnaHQoUmVuZGVyU3R5
bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOworfQorCitzdGF0aWMgdm9pZCBzZXRUb2dnbGVTaXpl
KEd0a1N0eWxlQ29udGV4dCogY29udGV4dCwgUmVuZGVyU3R5bGUmIHN0eWxlKQoreworICAgIC8v
IFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwgc28gd2Ugc2hvdWxkbid0
IGNoYW5nZSB0aGVtLgorICAgIGlmICghc3R5bGUud2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygp
ICYmICFzdHlsZS5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8g
T3RoZXIgcG9ydHMgaGFyZC1jb2RlIHRoaXMgdG8gMTMgd2hpY2ggaXMgYWxzbyB0aGUgZGVmYXVs
dCB2YWx1ZSBkZWZpbmVkIGJ5IEdUSysuCisgICAgLy8gR1RLKyB1c2VycyB0ZW5kIHRvIGRlbWFu
ZCB0aGUgbmF0aXZlIGxvb2suCisgICAgLy8gSXQgY291bGQgYmUgbWFkZSBhIGNvbmZpZ3VyYXRp
b24gb3B0aW9uIHZhbHVlcyBvdGhlciB0aGFuIDEzIGFjdHVhbGx5IGJyZWFrIHNpdGUgY29tcGF0
aWJpbGl0eS4KKyAgICBnaW50IGluZGljYXRvclNpemU7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRf
Z2V0X3N0eWxlKGNvbnRleHQsICJpbmRpY2F0b3Itc2l6ZSIsICZpbmRpY2F0b3JTaXplLCBudWxs
cHRyKTsKKworICAgIGlmIChzdHlsZS53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAg
ICAgIHN0eWxlLnNldFdpZHRoKExlbmd0aChpbmRpY2F0b3JTaXplLCBGaXhlZCkpOworCisgICAg
aWYgKHN0eWxlLmhlaWdodCgpLmlzQXV0bygpKQorICAgICAgICBzdHlsZS5zZXRIZWlnaHQoTGVu
Z3RoKGluZGljYXRvclNpemUsIEZpeGVkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhaW50VG9nZ2xl
KGNvbnN0IFJlbmRlclRoZW1lR3RrKiB0aGVtZSwgR1R5cGUgd2lkZ2V0VHlwZSwgY29uc3QgUmVu
ZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25z
dCBJbnRSZWN0JiBmdWxsUmVjdCkKK3sKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBn
ZXRTdHlsZUNvbnRleHQod2lkZ2V0VHlwZSk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShj
b250ZXh0KTsKKworICAgIC8vIFNvbWUgdGhlbWVzIGRvIG5vdCByZW5kZXIgbGFyZ2UgdG9nZ2xl
IGJ1dHRvbnMgcHJvcGVybHksIHNvIHdlIHNpbXBseQorICAgIC8vIHNocmluayB0aGUgcmVjdGFu
Z2xlIGJhY2sgZG93biB0byB0aGUgZGVmYXVsdCBzaXplIGFuZCB0aGVuIGNlbnRlciBpdAorICAg
IC8vIGluIHRoZSBmdWxsIHRvZ2dsZSBidXR0b24gcmVnaW9uLiBUaGUgcmVhc29uIGZvciBub3Qg
c2ltcGx5IGZvcmNpbmcgdG9nZ2xlCisgICAgLy8gYnV0dG9ucyB0byBiZSBhIHNtYWxsZXIgc2l6
ZSBpcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYnJlYWsgc2l0ZSBsYXlvdXRzLgorICAgIGdpbnQg
aW5kaWNhdG9yU2l6ZTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwg
ImluZGljYXRvci1zaXplIiwgJmluZGljYXRvclNpemUsIG51bGxwdHIpOworICAgIEludFJlY3Qg
cmVjdChmdWxsUmVjdCk7CisgICAgaWYgKHJlY3Qud2lkdGgoKSA+IGluZGljYXRvclNpemUpIHsK
KyAgICAgICAgcmVjdC5pbmZsYXRlWCgtKHJlY3Qud2lkdGgoKSAtIGluZGljYXRvclNpemUpIC8g
Mik7CisgICAgICAgIHJlY3Quc2V0V2lkdGgoaW5kaWNhdG9yU2l6ZSk7IC8vIEluIGNhc2UgcmVj
dC53aWR0aCgpIHdhcyBlcXVhbCB0byBpbmRpY2F0b3JTaXplICsgMS4KKyAgICB9CisKKyAgICBp
ZiAocmVjdC5oZWlnaHQoKSA+IGluZGljYXRvclNpemUpIHsKKyAgICAgICAgcmVjdC5pbmZsYXRl
WSgtKHJlY3QuaGVpZ2h0KCkgLSBpbmRpY2F0b3JTaXplKSAvIDIpOworICAgICAgICByZWN0LnNl
dEhlaWdodChpbmRpY2F0b3JTaXplKTsgLy8gSW4gY2FzZSByZWN0LmhlaWdodCgpIHdhcyBlcXVh
bCB0byBpbmRpY2F0b3JTaXplICsgMS4KKyAgICB9CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9z
ZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0a1Rl
eHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0eWxlKCkuZGlyZWN0aW9uKCkpKSk7CisgICAgZ3Rr
X3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIHdpZGdldFR5cGUgPT0gR1RLX1RZUEVf
Q0hFQ0tfQlVUVE9OID8gR1RLX1NUWUxFX0NMQVNTX0NIRUNLIDogR1RLX1NUWUxFX0NMQVNTX1JB
RElPKTsKKworICAgIGd1aW50IGZsYWdzID0gMDsKKyAgICBpZiAoIXRoZW1lLT5pc0VuYWJsZWQo
cmVuZGVyT2JqZWN0KSB8fCB0aGVtZS0+aXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkK
KyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZWxzZSBp
ZiAodGhlbWUtPmlzSG92ZXJlZChyZW5kZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtf
U1RBVEVfRkxBR19QUkVMSUdIVDsKKyAgICBpZiAodGhlbWUtPmlzSW5kZXRlcm1pbmF0ZShyZW5k
ZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19JTkNPTlNJU1RFTlQ7
CisgICAgZWxzZSBpZiAodGhlbWUtPmlzQ2hlY2tlZChyZW5kZXJPYmplY3QpKQorI2lmIEdUS19D
SEVDS19WRVJTSU9OKDMsIDEzLCA3KQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19D
SEVDS0VEOworI2Vsc2UKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfQUNUSVZFOwor
I2VuZGlmCisgICAgaWYgKHRoZW1lLT5pc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAg
ZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfU0VMRUNURUQ7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRf
c2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisK
KyAgICBpZiAod2lkZ2V0VHlwZSA9PSBHVEtfVFlQRV9DSEVDS19CVVRUT04pCisgICAgICAgIGd0
a19yZW5kZXJfY2hlY2soY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4
dCgpLT5jcigpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQo
KSk7CisgICAgZWxzZQorICAgICAgICBndGtfcmVuZGVyX29wdGlvbihjb250ZXh0LCBwYWludElu
Zm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmNyKCksIHJlY3QueCgpLCByZWN0LnkoKSwg
cmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKworICAgIGlmICh0aGVtZS0+aXNGb2N1c2Vk
KHJlbmRlck9iamVjdCkpIHsKKyAgICAgICAgSW50UmVjdCBpbmRpY2F0b3JSZWN0KHJlY3QpOwor
ICAgICAgICBnaW50IGluZGljYXRvclNwYWNpbmc7CisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0
X2dldF9zdHlsZShjb250ZXh0LCAiaW5kaWNhdG9yLXNwYWNpbmciLCAmaW5kaWNhdG9yU3BhY2lu
ZywgbnVsbHB0cik7CisgICAgICAgIGluZGljYXRvclJlY3QuaW5mbGF0ZShpbmRpY2F0b3JTcGFj
aW5nKTsKKyAgICAgICAgZ3RrX3JlbmRlcl9mb2N1cyhjb250ZXh0LCBwYWludEluZm8uY29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGluZGljYXRvclJlY3QueCgpLCBpbmRpY2F0b3JS
ZWN0LnkoKSwKKyAgICAgICAgICAgIGluZGljYXRvclJlY3Qud2lkdGgoKSwgaW5kaWNhdG9yUmVj
dC5oZWlnaHQoKSk7CisgICAgfQorCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250
ZXh0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0
eWxlJiBzdHlsZSkgY29uc3QKK3sKKyAgICBzZXRUb2dnbGVTaXplKGdldFN0eWxlQ29udGV4dChH
VEtfVFlQRV9DSEVDS19CVVRUT04pLCBzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6
OnBhaW50Q2hlY2tib3goY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBh
aW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHBhaW50VG9n
Z2xlKHRoaXMsIEdUS19UWVBFX0NIRUNLX0JVVFRPTiwgcmVuZGVyT2JqZWN0LCBwYWludEluZm8s
IHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0
UmFkaW9TaXplKFJlbmRlclN0eWxlJiBzdHlsZSkgY29uc3QKK3sKKyAgICBzZXRUb2dnbGVTaXpl
KGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9SQURJT19CVVRUT04pLCBzdHlsZSk7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UmFkaW8oY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJP
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIHBhaW50VG9nZ2xlKHRoaXMsIEdUS19UWVBFX1JBRElPX0JVVFRPTiwgcmVuZGVyT2Jq
ZWN0LCBwYWludEluZm8sIHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZv
aWQgcmVuZGVyQnV0dG9uKFJlbmRlclRoZW1lKiB0aGVtZSwgR3RrU3R5bGVDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgSW50UmVjdCBidXR0b25SZWN0
KHJlY3QpOworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghdGhlbWUtPmlzRW5hYmxl
ZChyZW5kZXJPYmplY3QpIHx8IHRoZW1lLT5pc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3Qp
KQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19JTlNFTlNJVElWRTsKKyAgICBlbHNl
IGlmICh0aGVtZS0+aXNIb3ZlcmVkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdU
S19TVEFURV9GTEFHX1BSRUxJR0hUOworICAgIGlmICh0aGVtZS0+aXNQcmVzc2VkKHJlbmRlck9i
amVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0FDVElWRTsKKyAgICBndGtf
c3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFn
cz4oZmxhZ3MpKTsKKworICAgIGlmICh0aGVtZS0+aXNEZWZhdWx0KHJlbmRlck9iamVjdCkpIHsK
KyAgICAgICAgR3RrQm9yZGVyKiBib3JkZXJQdHIgPSAwOworICAgICAgICBHdGtCb3JkZXIgYm9y
ZGVyID0geyAxLCAxLCAxLCAxIH07CisKKyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0
eWxlKGNvbnRleHQsICJkZWZhdWx0LWJvcmRlciIsICZib3JkZXJQdHIsIG51bGxwdHIpOworICAg
ICAgICBpZiAoYm9yZGVyUHRyKSB7CisgICAgICAgICAgICBib3JkZXIgPSAqYm9yZGVyUHRyOwor
ICAgICAgICAgICAgZ3RrX2JvcmRlcl9mcmVlKGJvcmRlclB0cik7CisgICAgICAgIH0KKworICAg
ICAgICBidXR0b25SZWN0Lm1vdmUoYm9yZGVyLmxlZnQsIGJvcmRlci50b3ApOworICAgICAgICBi
dXR0b25SZWN0LnNldFdpZHRoKGJ1dHRvblJlY3Qud2lkdGgoKSAtIChib3JkZXIubGVmdCArIGJv
cmRlci5yaWdodCkpOworICAgICAgICBidXR0b25SZWN0LnNldEhlaWdodChidXR0b25SZWN0Lmhl
aWdodCgpIC0gKGJvcmRlci50b3AgKyBib3JkZXIuYm90dG9tKSk7CisKKyAgICAgICAgZ3RrX3N0
eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19ERUZBVUxUKTsK
KyAgICB9CisKKyAgICBndGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZvLmNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBidXR0b25SZWN0LngoKSwgYnV0dG9uUmVj
dC55KCksIGJ1dHRvblJlY3Qud2lkdGgoKSwgYnV0dG9uUmVjdC5oZWlnaHQoKSk7CisgICAgZ3Rr
X3JlbmRlcl9mcmFtZShjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCktPmNyKCksIGJ1dHRvblJlY3QueCgpLCBidXR0b25SZWN0LnkoKSwgYnV0dG9uUmVjdC53aWR0
aCgpLCBidXR0b25SZWN0LmhlaWdodCgpKTsKKworICAgIGlmICh0aGVtZS0+aXNGb2N1c2VkKHJl
bmRlck9iamVjdCkpIHsKKyAgICAgICAgZ2ludCBmb2N1c1dpZHRoLCBmb2N1c1BhZDsKKyAgICAg
ICAgZ2Jvb2xlYW4gZGlzcGxhY2VGb2N1cywgaW50ZXJpb3JGb2N1czsKKyAgICAgICAgZ3RrX3N0
eWxlX2NvbnRleHRfZ2V0X3N0eWxlKAorICAgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAg
ICJmb2N1cy1saW5lLXdpZHRoIiwgJmZvY3VzV2lkdGgsCisgICAgICAgICAgICAiZm9jdXMtcGFk
ZGluZyIsICZmb2N1c1BhZCwKKyAgICAgICAgICAgICJpbnRlcmlvci1mb2N1cyIsICZpbnRlcmlv
ckZvY3VzLAorICAgICAgICAgICAgImRpc3BsYWNlLWZvY3VzIiwgJmRpc3BsYWNlRm9jdXMsCisg
ICAgICAgICAgICBudWxscHRyKTsKKworICAgICAgICBpZiAoaW50ZXJpb3JGb2N1cykgeworICAg
ICAgICAgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoOworICAgICAgICAgICAgZ3RrX3N0eWxlX2Nv
bnRleHRfZ2V0X2JvcmRlcihjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFn
cyksICZib3JkZXJXaWR0aCk7CisKKyAgICAgICAgICAgIGJ1dHRvblJlY3QgPSBJbnRSZWN0KAor
ICAgICAgICAgICAgICAgIGJ1dHRvblJlY3QueCgpICsgYm9yZGVyV2lkdGgubGVmdCArIGZvY3Vz
UGFkLAorICAgICAgICAgICAgICAgIGJ1dHRvblJlY3QueSgpICsgYm9yZGVyV2lkdGgudG9wICsg
Zm9jdXNQYWQsCisgICAgICAgICAgICAgICAgYnV0dG9uUmVjdC53aWR0aCgpIC0gKDIgKiBmb2N1
c1BhZCArIGJvcmRlcldpZHRoLmxlZnQgKyBib3JkZXJXaWR0aC5yaWdodCksCisgICAgICAgICAg
ICAgICAgYnV0dG9uUmVjdC5oZWlnaHQoKSAtICgyICogZm9jdXNQYWQgKyBib3JkZXJXaWR0aC50
b3AgKyBib3JkZXJXaWR0aC5ib3R0b20pKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBi
dXR0b25SZWN0LmluZmxhdGUoZm9jdXNXaWR0aCArIGZvY3VzUGFkKTsKKworICAgICAgICBpZiAo
ZGlzcGxhY2VGb2N1cyAmJiB0aGVtZS0+aXNQcmVzc2VkKHJlbmRlck9iamVjdCkpIHsKKyAgICAg
ICAgICAgIGdpbnQgY2hpbGREaXNwbGFjZW1lbnRYOworICAgICAgICAgICAgZ2ludCBjaGlsZERp
c3BsYWNlbWVudFk7CisgICAgICAgICAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29u
dGV4dCwgImNoaWxkLWRpc3BsYWNlbWVudC14IiwgJmNoaWxkRGlzcGxhY2VtZW50WCwgImNoaWxk
LWRpc3BsYWNlbWVudC15IiwgJmNoaWxkRGlzcGxhY2VtZW50WSwgbnVsbHB0cik7CisgICAgICAg
ICAgICBidXR0b25SZWN0Lm1vdmUoY2hpbGREaXNwbGFjZW1lbnRYLCBjaGlsZERpc3BsYWNlbWVu
dFkpOworICAgICAgICB9CisKKyAgICAgICAgZ3RrX3JlbmRlcl9mb2N1cyhjb250ZXh0LCBwYWlu
dEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGJ1dHRvblJlY3QueCgpLCBi
dXR0b25SZWN0LnkoKSwgYnV0dG9uUmVjdC53aWR0aCgpLCBidXR0b25SZWN0LmhlaWdodCgpKTsK
KyAgICB9Cit9Citib29sIFJlbmRlclRoZW1lR3RrOjpwYWludEJ1dHRvbihjb25zdCBSZW5kZXJP
YmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVD
b250ZXh0KEdUS19UWVBFX0JVVFRPTik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250
ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgc3Rh
dGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3Qu
c3R5bGUoKS5kaXJlY3Rpb24oKSkpKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3Mo
Y29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0JVVFRPTik7CisKKyAgICByZW5kZXJCdXR0b24odGhp
cywgY29udGV4dCwgcmVuZGVyT2JqZWN0LCBwYWludEluZm8sIHJlY3QpOworCisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwor
dm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0TWVudUxpc3RTdHlsZShTdHlsZVJlc29sdmVyJiwg
UmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVtZW50JikgY29uc3QKK3sKKyAgICAvLyBUaGUgdGVzdHMg
Y2hlY2sgZXhwbGljaXRseSB0aGF0IHNlbGVjdCBtZW51IGJ1dHRvbnMgaWdub3JlIGxpbmUgaGVp
Z2h0LgorICAgIHN0eWxlLnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVp
Z2h0KCkpOworCisgICAgLy8gV2UgY2Fubm90IGdpdmUgYSBwcm9wZXIgcmVuZGVyaW5nIHdoZW4g
Ym9yZGVyIHJhZGl1cyBpcyBhY3RpdmUsIHVuZm9ydHVuYXRlbHkuCisgICAgc3R5bGUucmVzZXRC
b3JkZXJSYWRpdXMoKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0TWVudUxpc3RC
dXR0b25TdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5
bGUsIEVsZW1lbnQmIGUpIGNvbnN0Cit7CisgICAgYWRqdXN0TWVudUxpc3RTdHlsZShzdHlsZVJl
c29sdmVyLCBzdHlsZSwgZSk7Cit9CisKK3N0YXRpYyB2b2lkIGdldENvbWJvQm94TWV0cmljcyhS
ZW5kZXJTdHlsZSYgc3R5bGUsIEd0a0JvcmRlciYgYm9yZGVyLCBpbnQmIGZvY3VzLCBpbnQmIHNl
cGFyYXRvcikKK3sKKyAgICAvLyBJZiB0aGlzIG1lbnUgbGlzdCBidXR0b24gaXNuJ3QgZHJhd24g
dXNpbmcgdGhlIG5hdGl2ZSB0aGVtZSwgd2UKKyAgICAvLyBkb24ndCBhZGQgYW55IGV4dHJhIHBh
ZGRpbmcgYmV5b25kIHdoYXQgV2ViQ29yZSBhbHJlYWR5IHVzZXMuCisgICAgaWYgKHN0eWxlLmFw
cGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICBHdGtT
dHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfQ09NQk9fQk9Y
KTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOworCisgICAgZ3RrX3N0eWxl
X2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19CVVRUT04pOworICAg
IGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3Rr
VGV4dERpcmVjdGlvbj4oZ3RrVGV4dERpcmVjdGlvbihzdHlsZS5kaXJlY3Rpb24oKSkpKTsKKwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3JkZXIoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3Rr
U3RhdGVGbGFncz4oMCksICZib3JkZXIpOworCisgICAgZ2Jvb2xlYW4gaW50ZXJpb3JGb2N1czsK
KyAgICBnaW50IGZvY3VzV2lkdGgsIGZvY3VzUGFkOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dl
dF9zdHlsZShjb250ZXh0LCAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JGb2N1cywgImZvY3Vz
LWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0aCwgImZvY3VzLXBhZGRpbmciLCAmZm9jdXNQYWQsIG51
bGxwdHIpOworICAgIGZvY3VzID0gaW50ZXJpb3JGb2N1cyA/IGZvY3VzV2lkdGggKyBmb2N1c1Bh
ZCA6IDA7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQpOworCisgICAg
Y29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9TRVBBUkFUT1IpOworICAgIGd0a19z
dHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBHdGtUZXh0RGlyZWN0aW9uIGRpcmVj
dGlvbiA9IHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0a1RleHREaXJlY3Rpb24oc3R5
bGUuZGlyZWN0aW9uKCkpKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfZGlyZWN0aW9uKGNv
bnRleHQsIGRpcmVjdGlvbik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRl
eHQsICJzZXBhcmF0b3IiKTsKKworICAgIGdib29sZWFuIHdpZGVTZXBhcmF0b3JzOworICAgIGdp
bnQgc2VwYXJhdG9yV2lkdGg7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRl
eHQsICJ3aWRlLXNlcGFyYXRvcnMiLCAmd2lkZVNlcGFyYXRvcnMsICJzZXBhcmF0b3Itd2lkdGgi
LCAmc2VwYXJhdG9yV2lkdGgsIG51bGxwdHIpOworCisgICAgLy8gR1RLKyBhbHdheXMgdXNlcyBi
b3JkZXIubGVmdCwgcmVnYXJkbGVzcyBvZiB0ZXh0IGRpcmVjdGlvbi4gU2VlIGd0a3NlcGVyYXRv
ci5jLgorICAgIGlmICghd2lkZVNlcGFyYXRvcnMpCisgICAgICAgIHNlcGFyYXRvcldpZHRoID0g
Ym9yZGVyLmxlZnQ7CisKKyAgICBzZXBhcmF0b3IgPSBzZXBhcmF0b3JXaWR0aDsKKworICAgIGd0
a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0
azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRlclN0eWxlJiBzdHlsZSkgY29uc3QKK3sK
KyAgICBHdGtCb3JkZXIgYm9yZGVyV2lkdGggPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgZm9j
dXNXaWR0aCA9IDAsIHNlcGFyYXRvcldpZHRoID0gMDsKKyAgICBnZXRDb21ib0JveE1ldHJpY3Mo
c3R5bGUsIGJvcmRlcldpZHRoLCBmb2N1c1dpZHRoLCBzZXBhcmF0b3JXaWR0aCk7CisgICAgaW50
IGxlZnQgPSBib3JkZXJXaWR0aC5sZWZ0ICsgZm9jdXNXaWR0aDsKKyAgICBpZiAoc3R5bGUuZGly
ZWN0aW9uKCkgPT0gUlRMKQorICAgICAgICBsZWZ0ICs9IHNlcGFyYXRvcldpZHRoICsgbWluQXJy
b3dTaXplOworICAgIHJldHVybiBsZWZ0OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVw
SW50ZXJuYWxQYWRkaW5nUmlnaHQoUmVuZGVyU3R5bGUmIHN0eWxlKSBjb25zdAoreworICAgIEd0
a0JvcmRlciBib3JkZXJXaWR0aCA9IHsgMCwgMCwgMCwgMCB9OworICAgIGludCBmb2N1c1dpZHRo
ID0gMCwgc2VwYXJhdG9yV2lkdGggPSAwOworICAgIGdldENvbWJvQm94TWV0cmljcyhzdHlsZSwg
Ym9yZGVyV2lkdGgsIGZvY3VzV2lkdGgsIHNlcGFyYXRvcldpZHRoKTsKKyAgICBpbnQgcmlnaHQg
PSBib3JkZXJXaWR0aC5yaWdodCArIGZvY3VzV2lkdGg7CisgICAgaWYgKHN0eWxlLmRpcmVjdGlv
bigpID09IExUUikKKyAgICAgICAgcmlnaHQgKz0gc2VwYXJhdG9yV2lkdGggKyBtaW5BcnJvd1Np
emU7CisgICAgcmV0dXJuIHJpZ2h0OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50
ZXJuYWxQYWRkaW5nVG9wKFJlbmRlclN0eWxlJiBzdHlsZSkgY29uc3QKK3sKKyAgICBHdGtCb3Jk
ZXIgYm9yZGVyV2lkdGggPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgZm9jdXNXaWR0aCA9IDAs
IHNlcGFyYXRvcldpZHRoID0gMDsKKyAgICBnZXRDb21ib0JveE1ldHJpY3Moc3R5bGUsIGJvcmRl
cldpZHRoLCBmb2N1c1dpZHRoLCBzZXBhcmF0b3JXaWR0aCk7CisgICAgcmV0dXJuIGJvcmRlcldp
ZHRoLnRvcCArIGZvY3VzV2lkdGg7Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRl
cm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5bGUmIHN0eWxlKSBjb25zdAoreworICAgIEd0a0Jv
cmRlciBib3JkZXJXaWR0aCA9IHsgMCwgMCwgMCwgMCB9OworICAgIGludCBmb2N1c1dpZHRoID0g
MCwgc2VwYXJhdG9yV2lkdGggPSAwOworICAgIGdldENvbWJvQm94TWV0cmljcyhzdHlsZSwgYm9y
ZGVyV2lkdGgsIGZvY3VzV2lkdGgsIHNlcGFyYXRvcldpZHRoKTsKKyAgICByZXR1cm4gYm9yZGVy
V2lkdGguYm90dG9tICsgZm9jdXNXaWR0aDsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFp
bnRNZW51TGlzdChjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJ
bmZvJiBwYWludEluZm8sIGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICAvLyBGSVhNRTogYWRv
cHQgc3VicGl4ZWwgdGhlbWVzLgorICAgIEludFJlY3QgcmVjdCA9IEludFJlY3Qocik7CisKKyAg
ICBjYWlyb190KiBjYWlyb0NvbnRleHQgPSBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCktPmNyKCk7CisgICAgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24gPSBzdGF0aWNfY2Fz
dDxHdGtUZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC5zdHlsZSgp
LmRpcmVjdGlvbigpKSk7CisKKyAgICAvLyBQYWludCB0aGUgYnV0dG9uLgorICAgIEd0a1N0eWxl
Q29udGV4dCogYnV0dG9uU3R5bGVDb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0JV
VFRPTik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShidXR0b25TdHlsZUNvbnRleHQpOwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oYnV0dG9uU3R5bGVDb250ZXh0LCBk
aXJlY3Rpb24pOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhidXR0b25TdHlsZUNv
bnRleHQsIEdUS19TVFlMRV9DTEFTU19CVVRUT04pOworICAgIHJlbmRlckJ1dHRvbih0aGlzLCBi
dXR0b25TdHlsZUNvbnRleHQsIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLCByZWN0KTsKKworICAg
IC8vIEdldCB0aGUgaW5uZXIgcmVjdGFuZ2xlLgorICAgIGdpbnQgZm9jdXNXaWR0aCwgZm9jdXNQ
YWQ7CisgICAgR3RrQm9yZGVyKiBpbm5lckJvcmRlclB0ciA9IDA7CisgICAgR3RrQm9yZGVyIGlu
bmVyQm9yZGVyID0geyAxLCAxLCAxLCAxIH07CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0
eWxlKGJ1dHRvblN0eWxlQ29udGV4dCwgImlubmVyLWJvcmRlciIsICZpbm5lckJvcmRlclB0ciwg
ImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0aCwgImZvY3VzLXBhZGRpbmciLCAmZm9jdXNQ
YWQsIG51bGxwdHIpOworICAgIGlmIChpbm5lckJvcmRlclB0cikgeworICAgICAgICBpbm5lckJv
cmRlciA9ICppbm5lckJvcmRlclB0cjsKKyAgICAgICAgZ3RrX2JvcmRlcl9mcmVlKGlubmVyQm9y
ZGVyUHRyKTsKKyAgICB9CisKKyAgICBHdGtCb3JkZXIgYm9yZGVyV2lkdGg7CisgICAgR3RrU3Rh
dGVGbGFncyBzdGF0ZSA9IGd0a19zdHlsZV9jb250ZXh0X2dldF9zdGF0ZShidXR0b25TdHlsZUNv
bnRleHQpOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3JkZXIoYnV0dG9uU3R5bGVDb250
ZXh0LCBzdGF0ZSwgJmJvcmRlcldpZHRoKTsKKworICAgIGZvY3VzV2lkdGggKz0gZm9jdXNQYWQ7
CisgICAgSW50UmVjdCBpbm5lclJlY3QoCisgICAgICAgIHJlY3QueCgpICsgaW5uZXJCb3JkZXIu
bGVmdCArIGJvcmRlcldpZHRoLmxlZnQgKyBmb2N1c1dpZHRoLAorICAgICAgICByZWN0LnkoKSAr
IGlubmVyQm9yZGVyLnRvcCArIGJvcmRlcldpZHRoLnRvcCArIGZvY3VzV2lkdGgsCisgICAgICAg
IHJlY3Qud2lkdGgoKSAtIGJvcmRlcldpZHRoLmxlZnQgLSBib3JkZXJXaWR0aC5yaWdodCAtIGlu
bmVyQm9yZGVyLmxlZnQgLSBpbm5lckJvcmRlci5yaWdodCAtICgyICogZm9jdXNXaWR0aCksCisg
ICAgICAgIHJlY3QuaGVpZ2h0KCkgLSBib3JkZXJXaWR0aC50b3AgLSBib3JkZXJXaWR0aC5ib3R0
b20gLSBpbm5lckJvcmRlci50b3AgLSBpbm5lckJvcmRlci5ib3R0b20gLSAoMiAqIGZvY3VzV2lk
dGgpKTsKKworICAgIGlmIChpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkgeworICAgICAgICBnaW50
IGNoaWxkRGlzcGxhY2VtZW50WDsKKyAgICAgICAgZ2ludCBjaGlsZERpc3BsYWNlbWVudFk7Cisg
ICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShidXR0b25TdHlsZUNvbnRleHQsICJj
aGlsZC1kaXNwbGFjZW1lbnQteCIsICZjaGlsZERpc3BsYWNlbWVudFgsICJjaGlsZC1kaXNwbGFj
ZW1lbnQteSIsICZjaGlsZERpc3BsYWNlbWVudFksIG51bGxwdHIpOworICAgICAgICBpbm5lclJl
Y3QubW92ZShjaGlsZERpc3BsYWNlbWVudFgsIGNoaWxkRGlzcGxhY2VtZW50WSk7CisgICAgfQor
ICAgIGlubmVyUmVjdC5zZXRXaWR0aChzdGQ6Om1heCgxLCBpbm5lclJlY3Qud2lkdGgoKSkpOwor
ICAgIGlubmVyUmVjdC5zZXRIZWlnaHQoc3RkOjptYXgoMSwgaW5uZXJSZWN0LmhlaWdodCgpKSk7
CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGJ1dHRvblN0eWxlQ29udGV4dCk7CisK
KyAgICAvLyBQYWludCB0aGUgYXJyb3cuCisgICAgR3RrU3R5bGVDb250ZXh0KiBhcnJvd1N0eWxl
Q29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9BUlJPVyk7CisgICAgZ3RrX3N0eWxl
X2NvbnRleHRfc2F2ZShhcnJvd1N0eWxlQ29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4
dF9zZXRfZGlyZWN0aW9uKGFycm93U3R5bGVDb250ZXh0LCBkaXJlY3Rpb24pOworICAgIGd0a19z
dHlsZV9jb250ZXh0X2FkZF9jbGFzcyhhcnJvd1N0eWxlQ29udGV4dCwgImFycm93Iik7CisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGFycm93U3R5bGVDb250ZXh0LCBHVEtfU1RZTEVf
Q0xBU1NfQlVUVE9OKTsKKworICAgIGdmbG9hdCBhcnJvd1NjYWxpbmc7CisgICAgZ3RrX3N0eWxl
X2NvbnRleHRfZ2V0X3N0eWxlKGFycm93U3R5bGVDb250ZXh0LCAiYXJyb3ctc2NhbGluZyIsICZh
cnJvd1NjYWxpbmcsIG51bGxwdHIpOworCisgICAgSW50U2l6ZSBhcnJvd1NpemUobWluQXJyb3dT
aXplLCBpbm5lclJlY3QuaGVpZ2h0KCkpOworICAgIEZsb2F0UG9pbnQgYXJyb3dQb3NpdGlvbihp
bm5lclJlY3QubG9jYXRpb24oKSk7CisgICAgaWYgKGRpcmVjdGlvbiA9PSBHVEtfVEVYVF9ESVJf
TFRSKQorICAgICAgICBhcnJvd1Bvc2l0aW9uLm1vdmUoaW5uZXJSZWN0LndpZHRoKCkgLSBhcnJv
d1NpemUud2lkdGgoKSwgMCk7CisKKyAgICAvLyBHVEsrIGFjdHVhbGx5IGZldGNoZXMgdGhlIHhh
bGlnbiBhbmQgdmFsaWduIHZhbHVlcyBmcm9tIHRoZSB3aWRnZXQsIGJ1dCBzaW5jZSB3ZQorICAg
IC8vIGRvbid0IGhhdmUgYSB3aWRnZXQgaGVyZSwgd2UgYXJlIGp1c3QgdXNpbmcgdGhlIGRlZmF1
bHQgeGFsaWduIGFuZCB2YWxpZ24gdmFsdWVzIG9mIDAuNS4KKyAgICBnaW50IGV4dGVudCA9IHN0
ZDo6bWluKGFycm93U2l6ZS53aWR0aCgpLCBhcnJvd1NpemUuaGVpZ2h0KCkpICogYXJyb3dTY2Fs
aW5nOworICAgIGFycm93UG9zaXRpb24ubW92ZSgoYXJyb3dTaXplLndpZHRoKCkgLSBleHRlbnQp
IC8gMiwgKGFycm93U2l6ZS5oZWlnaHQoKSAtIGV4dGVudCkgLyAyKTsKKworICAgIGd0a19zdHls
ZV9jb250ZXh0X3NldF9zdGF0ZShhcnJvd1N0eWxlQ29udGV4dCwgc3RhdGUpOworICAgIGd0a19y
ZW5kZXJfYXJyb3coYXJyb3dTdHlsZUNvbnRleHQsIGNhaXJvQ29udGV4dCwgR19QSSwgYXJyb3dQ
b3NpdGlvbi54KCksIGFycm93UG9zaXRpb24ueSgpLCBleHRlbnQpOworCisgICAgZ3RrX3N0eWxl
X2NvbnRleHRfcmVzdG9yZShhcnJvd1N0eWxlQ29udGV4dCk7CisKKyAgICAvLyBQYWludCB0aGUg
c2VwYXJhdG9yIGlmIG5lZWRlZC4KKyAgICBHdGtTdHlsZUNvbnRleHQqIHNlcGFyYXRvclN0eWxl
Q29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9DT01CT19CT1gpOworICAgIGd0a19z
dHlsZV9jb250ZXh0X3NhdmUoc2VwYXJhdG9yU3R5bGVDb250ZXh0KTsKKworICAgIGd0a19zdHls
ZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oc2VwYXJhdG9yU3R5bGVDb250ZXh0LCBkaXJlY3Rpb24p
OworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhzZXBhcmF0b3JTdHlsZUNvbnRleHQs
ICJzZXBhcmF0b3IiKTsKKworICAgIGdib29sZWFuIHdpZGVTZXBhcmF0b3JzOworICAgIGdpbnQg
c2VwYXJhdG9yV2lkdGg7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKHNlcGFyYXRv
clN0eWxlQ29udGV4dCwgIndpZGUtc2VwYXJhdG9ycyIsICZ3aWRlU2VwYXJhdG9ycywgInNlcGFy
YXRvci13aWR0aCIsICZzZXBhcmF0b3JXaWR0aCwgbnVsbHB0cik7CisgICAgaWYgKHdpZGVTZXBh
cmF0b3JzICYmICFzZXBhcmF0b3JXaWR0aCkgeworICAgICAgICBndGtfc3R5bGVfY29udGV4dF9y
ZXN0b3JlKHNlcGFyYXRvclN0eWxlQ29udGV4dCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUoc2VwYXJhdG9yU3R5bGVDb250
ZXh0LCBzdGF0ZSk7CisgICAgSW50UG9pbnQgc2VwYXJhdG9yUG9zaXRpb24oYXJyb3dQb3NpdGlv
bi54KCksIGlubmVyUmVjdC55KCkpOworICAgIGlmICh3aWRlU2VwYXJhdG9ycykgeworICAgICAg
ICBpZiAoZGlyZWN0aW9uID09IEdUS19URVhUX0RJUl9MVFIpCisgICAgICAgICAgICBzZXBhcmF0
b3JQb3NpdGlvbi5tb3ZlKC1zZXBhcmF0b3JXaWR0aCwgMCk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIHNlcGFyYXRvclBvc2l0aW9uLm1vdmUoYXJyb3dTaXplLndpZHRoKCksIDApOworCisg
ICAgICAgIGd0a19yZW5kZXJfZnJhbWUoc2VwYXJhdG9yU3R5bGVDb250ZXh0LCBjYWlyb0NvbnRl
eHQsIHNlcGFyYXRvclBvc2l0aW9uLngoKSwgc2VwYXJhdG9yUG9zaXRpb24ueSgpLCBzZXBhcmF0
b3JXaWR0aCwgaW5uZXJSZWN0LmhlaWdodCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBHdGtC
b3JkZXIgcGFkZGluZzsKKyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3BhZGRpbmcoc2Vw
YXJhdG9yU3R5bGVDb250ZXh0LCBzdGF0ZSwgJnBhZGRpbmcpOworICAgICAgICBHdGtCb3JkZXIg
Ym9yZGVyOworICAgICAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYm9yZGVyKHNlcGFyYXRvclN0
eWxlQ29udGV4dCwgc3RhdGUsICZib3JkZXIpOworCisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0g
R1RLX1RFWFRfRElSX0xUUikKKyAgICAgICAgICAgIHNlcGFyYXRvclBvc2l0aW9uLm1vdmUoLShw
YWRkaW5nLmxlZnQgKyBib3JkZXIubGVmdCksIDApOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBzZXBhcmF0b3JQb3NpdGlvbi5tb3ZlKGFycm93U2l6ZS53aWR0aCgpLCAwKTsKKworICAgICAg
ICBjYWlyb19zYXZlKGNhaXJvQ29udGV4dCk7CisKKyAgICAgICAgLy8gQW4gZXh0cmEgY2xpcCBw
cmV2ZW50cyB0aGUgc2VwYXJhdG9yIGJsZWVkaW5nIG91dHNpZGUgb2YgdGhlIHNwZWNpZmllZCBy
ZWN0YW5nbGUgYmVjYXVzZSBvZiBzdWJwaXhlbCBwb3NpdGlvbmluZy4KKyAgICAgICAgY2Fpcm9f
cmVjdGFuZ2xlKGNhaXJvQ29udGV4dCwgc2VwYXJhdG9yUG9zaXRpb24ueCgpLCBzZXBhcmF0b3JQ
b3NpdGlvbi55KCksIGJvcmRlci5sZWZ0LCBpbm5lclJlY3QuaGVpZ2h0KCkpOworICAgICAgICBj
YWlyb19jbGlwKGNhaXJvQ29udGV4dCk7CisgICAgICAgIGd0a19yZW5kZXJfbGluZShzZXBhcmF0
b3JTdHlsZUNvbnRleHQsIGNhaXJvQ29udGV4dCwgc2VwYXJhdG9yUG9zaXRpb24ueCgpLCBzZXBh
cmF0b3JQb3NpdGlvbi55KCksIHNlcGFyYXRvclBvc2l0aW9uLngoKSwgaW5uZXJSZWN0Lm1heFko
KSk7CisgICAgICAgIGNhaXJvX3Jlc3RvcmUoY2Fpcm9Db250ZXh0KTsKKyAgICB9CisKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKHNlcGFyYXRvclN0eWxlQ29udGV4dCk7CisgICAgcmV0
dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lbnVMaXN0QnV0dG9u
RGVjb3JhdGlvbnMoY29uc3QgUmVuZGVyT2JqZWN0JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYg
aW5mbywgY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludE1lbnVMaXN0
KG9iamVjdCwgaW5mbywgcmVjdCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50VGV4
dEZpZWxkKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIEd0a1N0eWxlQ29udGV4
dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9FTlRSWSk7CisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9k
aXJlY3Rpb24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZ3RrVGV4dERp
cmVjdGlvbihyZW5kZXJPYmplY3Quc3R5bGUoKS5kaXJlY3Rpb24oKSkpKTsKKyAgICBndGtfc3R5
bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0VOVFJZKTsKKwor
ICAgIGd1aW50IGZsYWdzID0gMDsKKyAgICBpZiAoIWlzRW5hYmxlZChyZW5kZXJPYmplY3QpIHx8
IGlzUmVhZE9ubHlDb250cm9sKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19T
VEFURV9GTEFHX0lOU0VOU0lUSVZFOworICAgIGVsc2UgaWYgKGlzRm9jdXNlZChyZW5kZXJPYmpl
Y3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19GT0NVU0VEOworICAgIGd0a19z
dHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdz
PihmbGFncykpOworCisgICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5kKGNvbnRleHQsIHBhaW50SW5m
by5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgcmVjdC54KCksIHJlY3QueSgpLCBy
ZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIGd0a19yZW5kZXJfZnJhbWUoY29udGV4
dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCByZWN0LngoKSwg
cmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBpZiAoaXNGb2N1
c2VkKHJlbmRlck9iamVjdCkgJiYgaXNFbmFibGVkKHJlbmRlck9iamVjdCkpIHsKKyAgICAgICAg
Z2Jvb2xlYW4gaW50ZXJpb3JGb2N1czsKKyAgICAgICAgZ2ludCBmb2N1c1dpZHRoLCBmb2N1c1Bh
ZDsKKyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsICJpbnRlcmlv
ci1mb2N1cyIsICZpbnRlcmlvckZvY3VzLCAiZm9jdXMtbGluZS13aWR0aCIsICZmb2N1c1dpZHRo
LCAiZm9jdXMtcGFkZGluZyIsICZmb2N1c1BhZCwgbnVsbHB0cik7CisgICAgICAgIGlmICghaW50
ZXJpb3JGb2N1cykgeworICAgICAgICAgICAgSW50UmVjdCBmb2N1c1JlY3QocmVjdCk7CisgICAg
ICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZShmb2N1c1dpZHRoICsgZm9jdXNQYWQpOworICAgICAg
ICAgICAgZ3RrX3JlbmRlcl9mb2N1cyhjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCktPmNyKCksIGZvY3VzUmVjdC54KCksIGZvY3VzUmVjdC55KCksIGZvY3VzUmVj
dC53aWR0aCgpLCBmb2N1c1JlY3QuaGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKworICAgIHJldHVybiBmYWxzZTsK
K30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRUZXh0QXJlYShjb25zdCBSZW5kZXJPYmpl
Y3QmIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIHJl
dHVybiBwYWludFRleHRGaWVsZChvLCBpLCByKTsKK30KKworc3RhdGljIHZvaWQgcGFpbnRHZGtQ
aXhidWYoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBHZGtQaXhidWYqIGljb24sIGNv
bnN0IEludFJlY3QmIGljb25SZWN0KQoreworICAgIEludFNpemUgaWNvblNpemUoZ2RrX3BpeGJ1
Zl9nZXRfd2lkdGgoaWNvbiksIGdka19waXhidWZfZ2V0X2hlaWdodChpY29uKSk7CisgICAgR1Jl
ZlB0cjxHZGtQaXhidWY+IHNjYWxlZEljb247CisgICAgaWYgKGljb25SZWN0LnNpemUoKSAhPSBp
Y29uU2l6ZSkgeworICAgICAgICAvLyBXZSBjb3VsZCB1c2UgY2Fpcm9fc2NhbGUoKSBoZXJlIGJ1
dCBjYWlyby9waXhtYW4gZG93bnNjYWxlIHF1YWxpdHkgaXMgcXVpdGUgYmFkLgorICAgICAgICBz
Y2FsZWRJY29uID0gYWRvcHRHUmVmKGdka19waXhidWZfc2NhbGVfc2ltcGxlKGljb24sIGljb25S
ZWN0LndpZHRoKCksIGljb25SZWN0LmhlaWdodCgpLCBHREtfSU5URVJQX0JJTElORUFSKSk7Cisg
ICAgICAgIGljb24gPSBzY2FsZWRJY29uLmdldCgpOworICAgIH0KKworICAgIGNhaXJvX3QqIGNy
ID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmNyKCk7CisgICAgY2Fpcm9fc2F2ZShjcik7
CisgICAgZ2RrX2NhaXJvX3NldF9zb3VyY2VfcGl4YnVmKGNyLCBpY29uLCBpY29uUmVjdC54KCks
IGljb25SZWN0LnkoKSk7CisgICAgY2Fpcm9fcGFpbnQoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUo
Y3IpOworfQorCisvLyBEZWZpbmVkIGluIEdUSysgKGd0ay9ndGtpY29uZmFjdG9yeS5jKQorc3Rh
dGljIGNvbnN0IGdpbnQgZ3RrSWNvblNpemVNZW51ID0gMTY7CitzdGF0aWMgY29uc3QgZ2ludCBn
dGtJY29uU2l6ZVNtYWxsVG9vbGJhciA9IDE4Oworc3RhdGljIGNvbnN0IGdpbnQgZ3RrSWNvblNp
emVCdXR0b24gPSAyMDsKK3N0YXRpYyBjb25zdCBnaW50IGd0a0ljb25TaXplTGFyZ2VUb29sYmFy
ID0gMjQ7CitzdGF0aWMgY29uc3QgZ2ludCBndGtJY29uU2l6ZURuZCA9IDMyOworc3RhdGljIGNv
bnN0IGdpbnQgZ3RrSWNvblNpemVEaWFsb2cgPSA0ODsKKworc3RhdGljIEd0a0ljb25TaXplIGdl
dEljb25TaXplRm9yUGl4ZWxTaXplKGdpbnQgcGl4ZWxTaXplKQoreworICAgIGlmIChwaXhlbFNp
emUgPCBndGtJY29uU2l6ZVNtYWxsVG9vbGJhcikKKyAgICAgICAgcmV0dXJuIEdUS19JQ09OX1NJ
WkVfTUVOVTsKKyAgICBpZiAocGl4ZWxTaXplID49IGd0a0ljb25TaXplU21hbGxUb29sYmFyICYm
IHBpeGVsU2l6ZSA8IGd0a0ljb25TaXplQnV0dG9uKQorICAgICAgICByZXR1cm4gR1RLX0lDT05f
U0laRV9TTUFMTF9UT09MQkFSOworICAgIGlmIChwaXhlbFNpemUgPj0gZ3RrSWNvblNpemVCdXR0
b24gJiYgcGl4ZWxTaXplIDwgZ3RrSWNvblNpemVMYXJnZVRvb2xiYXIpCisgICAgICAgIHJldHVy
biBHVEtfSUNPTl9TSVpFX0JVVFRPTjsKKyAgICBpZiAocGl4ZWxTaXplID49IGd0a0ljb25TaXpl
TGFyZ2VUb29sYmFyICYmIHBpeGVsU2l6ZSA8IGd0a0ljb25TaXplRG5kKQorICAgICAgICByZXR1
cm4gR1RLX0lDT05fU0laRV9MQVJHRV9UT09MQkFSOworICAgIGlmIChwaXhlbFNpemUgPj0gZ3Rr
SWNvblNpemVEbmQgJiYgcGl4ZWxTaXplIDwgZ3RrSWNvblNpemVEaWFsb2cpCisgICAgICAgIHJl
dHVybiBHVEtfSUNPTl9TSVpFX0RORDsKKworICAgIHJldHVybiBHVEtfSUNPTl9TSVpFX0RJQUxP
RzsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0
dG9uU3R5bGUoU3R5bGVSZXNvbHZlciYgc3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5bGUmIHN0eWxl
LCBFbGVtZW50JiBlKSBjb25zdAoreworICAgIGFkanVzdFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9u
U3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGUpOworfQorCitib29sIFJlbmRlclRoZW1lR3Rr
OjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihjb25zdCBSZW5kZXJPYmplY3QmIG8sIGNv
bnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFp
bnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uUGFydChvLCBpLCByZWN0KTsKK30KKworc3Rh
dGljIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRJY29uU3R5bGUoUmVuZGVyU3R5bGUmIHN0eWxlKQor
eworICAgIHN0eWxlLnJlc2V0Qm9yZGVyKCk7CisgICAgc3R5bGUucmVzZXRQYWRkaW5nKCk7CisK
KyAgICAvLyBHZXQgdGhlIGljb24gc2l6ZSBiYXNlZCBvbiB0aGUgZm9udCBzaXplLgorICAgIGlu
dCBmb250U2l6ZSA9IHN0eWxlLmZvbnRTaXplKCk7CisgICAgaWYgKGZvbnRTaXplIDwgZ3RrSWNv
blNpemVNZW51KSB7CisgICAgICAgIHN0eWxlLnNldFdpZHRoKExlbmd0aChmb250U2l6ZSwgRml4
ZWQpKTsKKyAgICAgICAgc3R5bGUuc2V0SGVpZ2h0KExlbmd0aChmb250U2l6ZSwgRml4ZWQpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBnaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsK
KyAgICBndGtfaWNvbl9zaXplX2xvb2t1cChnZXRJY29uU2l6ZUZvclBpeGVsU2l6ZShmb250U2l6
ZSksICZ3aWR0aCwgJmhlaWdodCk7CisgICAgc3R5bGUuc2V0V2lkdGgoTGVuZ3RoKHdpZHRoLCBG
aXhlZCkpOworICAgIHN0eWxlLnNldEhlaWdodChMZW5ndGgoaGVpZ2h0LCBGaXhlZCkpOworfQor
Cit2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9u
UGFydFN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQmKSBj
b25zdAoreworICAgIGFkanVzdFNlYXJjaEZpZWxkSWNvblN0eWxlKHN0eWxlKTsKK30KKworc3Rh
dGljIEludFJlY3QgY2VudGVyUmVjdFZlcnRpY2FsbHlJblBhcmVudElucHV0RWxlbWVudChjb25z
dCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAg
ICAvLyBHZXQgdGhlIHJlbmRlcmVyIG9mIDxpbnB1dD4gZWxlbWVudC4KKyAgICBOb2RlKiBpbnB1
dCA9IHJlbmRlck9iamVjdC5ub2RlKCktPnNoYWRvd0hvc3QoKTsKKyAgICBpZiAoIWlucHV0KQor
ICAgICAgICBpbnB1dCA9IHJlbmRlck9iamVjdC5ub2RlKCk7CisgICAgaWYgKCFpbnB1dC0+cmVu
ZGVyZXIoKS0+aXNCb3goKSkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKKworICAgIC8vIElm
IHBvc3NpYmxlIGNlbnRlciB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSByZWN0IHZlcnRpY2FsbHkg
aW4gdGhlIHBhcmVudCBpbnB1dCBlbGVtZW50LgorICAgIC8vIFdlIGFsc28gYWRkIG9uZSBwaXhl
bCBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSB5IGNvb3JkaW5hdGUgaXMgcm91bmRlZCB1cCBmb3Ig
Ym94IGhlaWdodHMKKyAgICAvLyB0aGF0IGFyZSBldmVuLCB3aGljaCBsb29rcyBpbiByZWxhdGlv
biB0byB0aGUgYm94IHRleHQuCisgICAgSW50UmVjdCBpbnB1dENvbnRlbnRCb3ggPSB0b1JlbmRl
ckJveChpbnB1dC0+cmVuZGVyZXIoKSktPmFic29sdXRlQ29udGVudEJveCgpOworCisgICAgLy8g
TWFrZSBzdXJlIHRoZSBzY2FsZWQgZGVjb3JhdGlvbiBzdGF5cyBzcXVhcmUgYW5kIHdpbGwgZml0
IGluIGl0cyBwYXJlbnQncyBib3guCisgICAgaW50IGljb25TaXplID0gc3RkOjptaW4oaW5wdXRD
b250ZW50Qm94LndpZHRoKCksIHN0ZDo6bWluKGlucHV0Q29udGVudEJveC5oZWlnaHQoKSwgcmVj
dC5oZWlnaHQoKSkpOworICAgIEludFJlY3Qgc2NhbGVkUmVjdChyZWN0LngoKSwgaW5wdXRDb250
ZW50Qm94LnkoKSArIChpbnB1dENvbnRlbnRCb3guaGVpZ2h0KCkgLSBpY29uU2l6ZSArIDEpIC8g
MiwgaWNvblNpemUsIGljb25TaXplKTsKKyAgICByZXR1cm4gc2NhbGVkUmVjdDsKK30KKworYm9v
bCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uUGFydChj
b25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgSW50UmVjdCBpY29uUmVjdCA9IGNlbnRl
clJlY3RWZXJ0aWNhbGx5SW5QYXJlbnRJbnB1dEVsZW1lbnQocmVuZGVyT2JqZWN0LCByZWN0KTsK
KyAgICBpZiAoaWNvblJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBHUmVmUHRyPEdka1BpeGJ1Zj4gaWNvbiA9IGdldFN0b2NrSWNvbkZvcldpZGdldFR5cGUoR1RL
X1RZUEVfRU5UUlksIEdUS19TVE9DS19GSU5ELAorICAgICAgICBndGtUZXh0RGlyZWN0aW9uKHJl
bmRlck9iamVjdC5zdHlsZSgpLmRpcmVjdGlvbigpKSwKKyAgICAgICAgZ3RrSWNvblN0YXRlKHRo
aXMsIHJlbmRlck9iamVjdCksCisgICAgICAgIGdldEljb25TaXplRm9yUGl4ZWxTaXplKHJlY3Qu
aGVpZ2h0KCkpKTsKKyAgICBwYWludEdka1BpeGJ1ZihwYWludEluZm8uY29udGV4dCwgaWNvbi5n
ZXQoKSwgaWNvblJlY3QpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVt
ZUd0azo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyJiwg
UmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVtZW50JikgY29uc3QKK3sKKyAgICBhZGp1c3RTZWFyY2hG
aWVsZEljb25TdHlsZShzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2Vh
cmNoRmllbGRDYW5jZWxCdXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNv
bnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIElu
dFJlY3QgaWNvblJlY3QgPSBjZW50ZXJSZWN0VmVydGljYWxseUluUGFyZW50SW5wdXRFbGVtZW50
KHJlbmRlck9iamVjdCwgcmVjdCk7CisgICAgaWYgKGljb25SZWN0LmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgR1JlZlB0cjxHZGtQaXhidWY+IGljb24gPSBnZXRTdG9j
a0ljb25Gb3JXaWRnZXRUeXBlKEdUS19UWVBFX0VOVFJZLCBHVEtfU1RPQ0tfQ0xFQVIsCisgICAg
ICAgIGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0eWxlKCkuZGlyZWN0aW9uKCkpLAor
ICAgICAgICBndGtJY29uU3RhdGUodGhpcywgcmVuZGVyT2JqZWN0KSwKKyAgICAgICAgZ2V0SWNv
blNpemVGb3JQaXhlbFNpemUocmVjdC5oZWlnaHQoKSkpOworICAgIHBhaW50R2RrUGl4YnVmKHBh
aW50SW5mby5jb250ZXh0LCBpY29uLmdldCgpLCBpY29uUmVjdCk7CisgICAgcmV0dXJuIGZhbHNl
OworfQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKFN0eWxl
UmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQmKSBjb25zdAoreworICAgIC8v
IFdlIGNhbm5vdCBnaXZlIGEgcHJvcGVyIHJlbmRlcmluZyB3aGVuIGJvcmRlciByYWRpdXMgaXMg
YWN0aXZlLCB1bmZvcnR1bmF0ZWx5LgorICAgIHN0eWxlLnJlc2V0Qm9yZGVyUmFkaXVzKCk7Cisg
ICAgc3R5bGUuc2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2VhcmNoRmllbGQoY29uc3QgUmVuZGVy
T2JqZWN0JiBvLCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCit7Cisg
ICAgcmV0dXJuIHBhaW50VGV4dEZpZWxkKG8sIGksIHJlY3QpOworfQorCitib29sIFJlbmRlclRo
ZW1lR3RrOjpwYWludENhcHNMb2NrSW5kaWNhdG9yKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVy
T2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICAvLyBUaGUgb3RoZXIgcGFpbnQgbWV0aG9kcyBkb24ndCBuZWVkIHRvIGNoZWNrIHdo
ZXRoZXIgcGFpbnRpbmcgaXMgZGlzYWJsZWQgYmVjYXVzZSBSZW5kZXJUaGVtZSBhbHJlYWR5IGNo
ZWNrcyBpdAorICAgIC8vIGJlZm9yZSBjYWxsaW5nIHRoZW0sIGJ1dCBwYWludENhcHNMb2NrSW5k
aWNhdG9yKCkgaXMgY2FsbGVkIGJ5IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZSB3aGljaCBk
b2Vzbid0IGNoZWNrIGl0LgorICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGludCBpY29uU2l6ZSA9IHN0ZDo6
bWluKHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAgR1JlZlB0cjxHZGtQaXhidWY+
IGljb24gPSBnZXRTdG9ja0ljb25Gb3JXaWRnZXRUeXBlKEdUS19UWVBFX0VOVFJZLCBHVEtfU1RP
Q0tfQ0FQU19MT0NLX1dBUk5JTkcsIGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0eWxl
KCkuZGlyZWN0aW9uKCkpLCAwLCBnZXRJY29uU2l6ZUZvclBpeGVsU2l6ZShpY29uU2l6ZSkpOwor
CisgICAgLy8gT25seSByZS1zY2FsZSB0aGUgaWNvbiB3aGVuIGl0J3Mgc21hbGxlciB0aGFuIHRo
ZSBtaW5pbXVtIGljb24gc2l6ZS4KKyAgICBpZiAoaWNvblNpemUgPj0gZ3RrSWNvblNpemVNZW51
KQorICAgICAgICBpY29uU2l6ZSA9IGdka19waXhidWZfZ2V0X2hlaWdodChpY29uLmdldCgpKTsK
KworICAgIC8vIEdUSysgbG9jYXRlcyB0aGUgaWNvbiByaWdodCBhbGlnbmVkIGluIHRoZSBlbnRy
eS4gVGhlIGdpdmVuIHJlY3RhbmdsZSBpcyBhbHJlYWR5CisgICAgLy8gY2VudGVyZWQgdmVydGlj
YWxseSBieSBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuCisgICAgSW50UmVjdCBpY29uUmVj
dCgKKyAgICAgICAgcmVjdC54KCkgKyByZWN0LndpZHRoKCkgLSBpY29uU2l6ZSwKKyAgICAgICAg
cmVjdC55KCkgKyAocmVjdC5oZWlnaHQoKSAtIGljb25TaXplKSAvIDIsCisgICAgICAgIGljb25T
aXplLCBpY29uU2l6ZSk7CisgICAgcGFpbnRHZGtQaXhidWYocGFpbnRJbmZvLmNvbnRleHQsIGlj
b24uZ2V0KCksIGljb25SZWN0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZUd0azo6YWRqdXN0U2xpZGVyVHJhY2tTdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVyU3R5
bGUmIHN0eWxlLCBFbGVtZW50JikgY29uc3QKK3sKKyAgICBzdHlsZS5zZXRCb3hTaGFkb3cobnVs
bHB0cik7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFNsaWRlclRodW1iU3R5bGUo
U3R5bGVSZXNvbHZlciYgc3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVtZW50
JiBlbGVtZW50KSBjb25zdAoreworICAgIFJlbmRlclRoZW1lOjphZGp1c3RTbGlkZXJUaHVtYlN0
eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKKyAgICBzdHlsZS5zZXRCb3hTaGFk
b3cobnVsbHB0cik7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5U2xpZGVyU3R5bGVDb250ZXh0Q2xh
c3NlcyhHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQsIENvbnRyb2xQYXJ0IHBhcnQpCit7CisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19TQ0FM
RSk7CisgICAgaWYgKHBhcnQgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQgfHwgcGFydCA9PSBTbGlk
ZXJUaHVtYkhvcml6b250YWxQYXJ0KQorICAgICAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xh
c3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0hPUklaT05UQUwpOworICAgIGVsc2UgaWYgKHBh
cnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBh
cnQpCisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZ
TEVfQ0xBU1NfVkVSVElDQUwpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRl
clRyYWNrKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBDb250cm9sUGFydCBwYXJ0
ID0gcmVuZGVyT2JqZWN0LnN0eWxlKCkuYXBwZWFyYW5jZSgpOworICAgIEFTU0VSVF9VTlVTRUQo
cGFydCwgcGFydCA9PSBTbGlkZXJIb3Jpem9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclZlcnRp
Y2FsUGFydCB8fCBwYXJ0ID09IE1lZGlhVm9sdW1lU2xpZGVyUGFydCk7CisKKyAgICBHdGtTdHls
ZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfU0NBTEUpOworICAg
IGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4
dF9zZXRfZGlyZWN0aW9uKGNvbnRleHQsIGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0
eWxlKCkuZGlyZWN0aW9uKCkpKTsKKyAgICBhcHBseVNsaWRlclN0eWxlQ29udGV4dENsYXNzZXMo
Y29udGV4dCwgcGFydCk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQs
IEdUS19TVFlMRV9DTEFTU19UUk9VR0gpOworCisgICAgaWYgKCFpc0VuYWJsZWQocmVuZGVyT2Jq
ZWN0KSB8fCBpc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3QpKQorICAgICAgICBndGtfc3R5
bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwgR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkUp
OworCisgICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5kKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0
LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRo
KCksIHJlY3QuaGVpZ2h0KCkpOworICAgIGd0a19yZW5kZXJfZnJhbWUoY29udGV4dCwgcGFpbnRJ
bmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCByZWN0LngoKSwgcmVjdC55KCks
IHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBpZiAoaXNGb2N1c2VkKHJlbmRl
ck9iamVjdCkpIHsKKyAgICAgICAgZ2ludCBmb2N1c1dpZHRoLCBmb2N1c1BhZDsKKyAgICAgICAg
Z3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsICJmb2N1cy1saW5lLXdpZHRoIiwg
JmZvY3VzV2lkdGgsICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkLCBudWxscHRyKTsKKyAgICAg
ICAgSW50UmVjdCBmb2N1c1JlY3QocmVjdCk7CisgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKGZv
Y3VzV2lkdGggKyBmb2N1c1BhZCk7CisgICAgICAgIGd0a19yZW5kZXJfZm9jdXMoY29udGV4dCwg
cGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBmb2N1c1JlY3QueCgp
LCBmb2N1c1JlY3QueSgpLCBmb2N1c1JlY3Qud2lkdGgoKSwgZm9jdXNSZWN0LmhlaWdodCgpKTsK
KyAgICB9CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQpOworICAgIHJl
dHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUaHVtYihj
b25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgQ29udHJvbFBhcnQgcGFydCA9IHJlbmRl
ck9iamVjdC5zdHlsZSgpLmFwcGVhcmFuY2UoKTsKKyAgICBBU1NFUlQocGFydCA9PSBTbGlkZXJU
aHVtYkhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQgfHwg
cGFydCA9PSBNZWRpYVZvbHVtZVNsaWRlclRodW1iUGFydCk7CisKKyAgICBHdGtTdHlsZUNvbnRl
eHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfU0NBTEUpOworICAgIGd0a19z
dHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRf
ZGlyZWN0aW9uKGNvbnRleHQsIGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0eWxlKCku
ZGlyZWN0aW9uKCkpKTsKKyAgICBhcHBseVNsaWRlclN0eWxlQ29udGV4dENsYXNzZXMoY29udGV4
dCwgcGFydCk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19T
VFlMRV9DTEFTU19TTElERVIpOworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghaXNF
bmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkK
KyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZWxzZSBp
ZiAoaXNIb3ZlcmVkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9G
TEFHX1BSRUxJR0hUOworICAgIGlmIChpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAg
ZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfQUNUSVZFOworICAgIGd0a19zdHlsZV9jb250ZXh0X3Nl
dF9zdGF0ZShjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOworCisg
ICAgZ3RrX3JlbmRlcl9zbGlkZXIoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpLT5jcigpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSwKKyAgICAgICAgcGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8gR1RL
X09SSUVOVEFUSU9OX0hPUklaT05UQUwgOiBHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwpOworCisg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKworICAgIHJldHVybiBmYWxz
ZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRl
clN0eWxlJiBzdHlsZSwgRWxlbWVudCYpIGNvbnN0Cit7CisgICAgQ29udHJvbFBhcnQgcGFydCA9
IHN0eWxlLmFwcGVhcmFuY2UoKTsKKyAgICBpZiAocGFydCAhPSBTbGlkZXJUaHVtYkhvcml6b250
YWxQYXJ0ICYmIHBhcnQgIT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpCisgICAgICAgIHJldHVy
bjsKKworICAgIGdpbnQgc2xpZGVyV2lkdGgsIHNsaWRlckxlbmd0aDsKKyAgICBndGtfc3R5bGVf
Y29udGV4dF9nZXRfc3R5bGUoZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX1NDQUxFKSwgInNsaWRl
ci13aWR0aCIsICZzbGlkZXJXaWR0aCwgInNsaWRlci1sZW5ndGgiLCAmc2xpZGVyTGVuZ3RoLCBu
dWxscHRyKTsKKyAgICBpZiAocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0KSB7Cisg
ICAgICAgIHN0eWxlLnNldFdpZHRoKExlbmd0aChzbGlkZXJMZW5ndGgsIEZpeGVkKSk7CisgICAg
ICAgIHN0eWxlLnNldEhlaWdodChMZW5ndGgoc2xpZGVyV2lkdGgsIEZpeGVkKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBh
cnQgfHwgcGFydCA9PSBNZWRpYVZvbHVtZVNsaWRlclRodW1iUGFydCk7CisgICAgc3R5bGUuc2V0
V2lkdGgoTGVuZ3RoKHNsaWRlcldpZHRoLCBGaXhlZCkpOworICAgIHN0eWxlLnNldEhlaWdodChM
ZW5ndGgoc2xpZGVyTGVuZ3RoLCBGaXhlZCkpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpw
YWludFByb2dyZXNzQmFyKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIXJl
bmRlck9iamVjdC5pc1Byb2dyZXNzKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgR3Rr
U3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX1BST0dSRVNT
X0JBUik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19z
dHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfVFJPVUdIKTsK
KworICAgIGd0a19yZW5kZXJfYmFja2dyb3VuZChjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+
cGxhdGZvcm1Db250ZXh0KCktPmNyKCksIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgp
LCByZWN0LmhlaWdodCgpKTsKKyAgICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5m
by5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgcmVjdC54KCksIHJlY3QueSgpLCBy
ZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVz
dG9yZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7Cisg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19Q
Uk9HUkVTU0JBUik7CisKKworICAgIEd0a0JvcmRlciBwYWRkaW5nOworICAgIGd0a19zdHlsZV9j
b250ZXh0X2dldF9wYWRkaW5nKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDAp
LCAmcGFkZGluZyk7CisgICAgSW50UmVjdCBwcm9ncmVzc1JlY3QoCisgICAgICAgIHJlY3QueCgp
ICsgcGFkZGluZy5sZWZ0LAorICAgICAgICByZWN0LnkoKSArIHBhZGRpbmcudG9wLAorICAgICAg
ICByZWN0LndpZHRoKCkgLSAocGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodCksCisgICAgICAg
IHJlY3QuaGVpZ2h0KCkgLSAocGFkZGluZy50b3AgKyBwYWRkaW5nLmJvdHRvbSkpOworICAgIHBy
b2dyZXNzUmVjdCA9IFJlbmRlclRoZW1lR3RrOjpjYWxjdWxhdGVQcm9ncmVzc1JlY3QocmVuZGVy
T2JqZWN0LCBwcm9ncmVzc1JlY3QpOworCisgICAgaWYgKCFwcm9ncmVzc1JlY3QuaXNFbXB0eSgp
KQorICAgICAgICBndGtfcmVuZGVyX2FjdGl2aXR5KGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0
LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgcHJvZ3Jlc3NSZWN0LngoKSwgcHJvZ3Jlc3NSZWN0
LnkoKSwgcHJvZ3Jlc3NSZWN0LndpZHRoKCksIHByb2dyZXNzUmVjdC5oZWlnaHQoKSk7CisKKyAg
ICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQpOworICAgIHJldHVybiBmYWxzZTsK
K30KKworc3RhdGljIGdpbnQgc3BpbkJ1dHRvbkFycm93U2l6ZShHdGtTdHlsZUNvbnRleHQqIGNv
bnRleHQpCit7CisgICAgUGFuZ29Gb250RGVzY3JpcHRpb24qIGZvbnREZXNjcmlwdGlvbjsKKyAg
ICBndGtfc3R5bGVfY29udGV4dF9nZXQoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFn
cz4oMCksICJmb250IiwgJmZvbnREZXNjcmlwdGlvbiwgbnVsbHB0cik7CisgICAgZ2ludCBmb250
U2l6ZSA9IHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZ2V0X3NpemUoZm9udERlc2NyaXB0aW9uKTsK
KyAgICBnaW50IGFycm93U2l6ZSA9IHN0ZDo6bWF4KFBBTkdPX1BJWEVMUyhmb250U2l6ZSksIG1p
blNwaW5CdXR0b25BcnJvd1NpemUpOworICAgIHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJlZShm
b250RGVzY3JpcHRpb24pOworCisgICAgcmV0dXJuIGFycm93U2l6ZSAtIGFycm93U2l6ZSAlIDI7
IC8vIEZvcmNlIGV2ZW4uCit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdElubmVyU3Bp
bkJ1dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQm
KSBjb25zdAoreworICAgIEd0a1N0eWxlQ29udGV4dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4
dChHVEtfVFlQRV9TUElOX0JVVFRPTik7CisKKyAgICBHdGtCb3JkZXIgcGFkZGluZzsKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9nZXRfcGFkZGluZyhjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0
ZUZsYWdzPigwKSwgJnBhZGRpbmcpOworCisgICAgaW50IHdpZHRoID0gc3BpbkJ1dHRvbkFycm93
U2l6ZShjb250ZXh0KSArIHBhZGRpbmcubGVmdCArIHBhZGRpbmcucmlnaHQ7CisgICAgc3R5bGUu
c2V0V2lkdGgoTGVuZ3RoKHdpZHRoLCBGaXhlZCkpOworICAgIHN0eWxlLnNldE1pbldpZHRoKExl
bmd0aCh3aWR0aCwgRml4ZWQpKTsKK30KKworc3RhdGljIHZvaWQgcGFpbnRTcGluQXJyb3dCdXR0
b24oUmVuZGVyVGhlbWUqIHRoZW1lLCBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IFJl
bmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcmVjdCwgR3RrQXJyb3dUeXBlIGFycm93VHlwZSkKK3sKKyAgICBBU1NFUlQo
YXJyb3dUeXBlID09IEdUS19BUlJPV19VUCB8fCBhcnJvd1R5cGUgPT0gR1RLX0FSUk9XX0RPV04p
OworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKyAgICBndGtfc3R5bGVf
Y29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0JVVFRPTik7CisKKyAg
ICBHdGtUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbiA9IGd0a19zdHlsZV9jb250ZXh0X2dldF9kaXJl
Y3Rpb24oY29udGV4dCk7CisgICAgZ3VpbnQgc3RhdGUgPSBzdGF0aWNfY2FzdDxndWludD4oZ3Rr
X3N0eWxlX2NvbnRleHRfZ2V0X3N0YXRlKGNvbnRleHQpKTsKKyAgICBpZiAoIShzdGF0ZSAmIEdU
S19TVEFURV9GTEFHX0lOU0VOU0lUSVZFKSkgeworICAgICAgICBpZiAodGhlbWUtPmlzUHJlc3Nl
ZChyZW5kZXJPYmplY3QpKSB7CisgICAgICAgICAgICBpZiAoKGFycm93VHlwZSA9PSBHVEtfQVJS
T1dfVVAgJiYgdGhlbWUtPmlzU3BpblVwQnV0dG9uUGFydFByZXNzZWQocmVuZGVyT2JqZWN0KSkK
KyAgICAgICAgICAgICAgICB8fCAoYXJyb3dUeXBlID09IEdUS19BUlJPV19ET1dOICYmICF0aGVt
ZS0+aXNTcGluVXBCdXR0b25QYXJ0UHJlc3NlZChyZW5kZXJPYmplY3QpKSkKKyAgICAgICAgICAg
ICAgICBzdGF0ZSB8PSBHVEtfU1RBVEVfRkxBR19BQ1RJVkU7CisgICAgICAgIH0gZWxzZSBpZiAo
dGhlbWUtPmlzSG92ZXJlZChyZW5kZXJPYmplY3QpKSB7CisgICAgICAgICAgICBpZiAoKGFycm93
VHlwZSA9PSBHVEtfQVJST1dfVVAgJiYgdGhlbWUtPmlzU3BpblVwQnV0dG9uUGFydEhvdmVyZWQo
cmVuZGVyT2JqZWN0KSkKKyAgICAgICAgICAgICAgICB8fCAoYXJyb3dUeXBlID09IEdUS19BUlJP
V19ET1dOICYmICF0aGVtZS0+aXNTcGluVXBCdXR0b25QYXJ0SG92ZXJlZChyZW5kZXJPYmplY3Qp
KSkKKyAgICAgICAgICAgICAgICBzdGF0ZSB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdIVDsKKyAg
ICAgICAgfQorICAgIH0KKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwg
c3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oc3RhdGUpKTsKKworICAgIC8vIFBhaW50IGJ1dHRv
bi4KKyAgICBJbnRSZWN0IGJ1dHRvblJlY3QocmVjdCk7CisgICAgZ3VpbnQganVuY3Rpb24gPSBn
dGtfc3R5bGVfY29udGV4dF9nZXRfanVuY3Rpb25fc2lkZXMoY29udGV4dCk7CisgICAgaWYgKGFy
cm93VHlwZSA9PSBHVEtfQVJST1dfVVApCisgICAgICAgIGp1bmN0aW9uIHw9IEdUS19KVU5DVElP
Tl9CT1RUT007CisgICAgZWxzZSB7CisgICAgICAgIGp1bmN0aW9uIHw9IEdUS19KVU5DVElPTl9U
T1A7CisgICAgICAgIGJ1dHRvblJlY3QubW92ZSgwLCByZWN0LmhlaWdodCgpIC8gMik7CisgICAg
fQorICAgIGJ1dHRvblJlY3Quc2V0SGVpZ2h0KHJlY3QuaGVpZ2h0KCkgLyAyKTsKKyAgICBndGtf
c3R5bGVfY29udGV4dF9zZXRfanVuY3Rpb25fc2lkZXMoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3Rr
SnVuY3Rpb25TaWRlcz4oanVuY3Rpb24pKTsKKworICAgIGd0a19yZW5kZXJfYmFja2dyb3VuZChj
b250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGJ1dHRv
blJlY3QueCgpLCBidXR0b25SZWN0LnkoKSwgYnV0dG9uUmVjdC53aWR0aCgpLCBidXR0b25SZWN0
LmhlaWdodCgpKTsKKyAgICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250
ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgYnV0dG9uUmVjdC54KCksIGJ1dHRvblJlY3Qu
eSgpLCBidXR0b25SZWN0LndpZHRoKCksIGJ1dHRvblJlY3QuaGVpZ2h0KCkpOworCisgICAgLy8g
UGFpbnQgYXJyb3cgY2VudGVyZWQgaW5zaWRlIGJ1dHRvbi4KKyAgICAvLyBUaGlzIGNvZGUgaXMg
YmFzZWQgb24gZ3Rrc3BpbmJ1dHRvbi5jIGNvZGUuCisgICAgSW50UmVjdCBhcnJvd1JlY3Q7Cisg
ICAgZ2RvdWJsZSBhbmdsZTsKKyAgICBpZiAoYXJyb3dUeXBlID09IEdUS19BUlJPV19VUCkgewor
ICAgICAgICBhbmdsZSA9IDA7CisgICAgICAgIGFycm93UmVjdC5zZXRZKHJlY3QueSgpKTsKKyAg
ICAgICAgYXJyb3dSZWN0LnNldEhlaWdodChyZWN0LmhlaWdodCgpIC8gMiAtIDIpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIGFuZ2xlID0gR19QSTsKKyAgICAgICAgYXJyb3dSZWN0LnNldFkocmVj
dC55KCkgKyBidXR0b25SZWN0LnkoKSk7CisgICAgICAgIGFycm93UmVjdC5zZXRIZWlnaHQocmVj
dC5oZWlnaHQoKSAtIGFycm93UmVjdC55KCkgLSAyKTsKKyAgICB9CisgICAgYXJyb3dSZWN0LnNl
dFdpZHRoKHJlY3Qud2lkdGgoKSAtIDMpOworICAgIGlmIChkaXJlY3Rpb24gPT0gR1RLX1RFWFRf
RElSX0xUUikKKyAgICAgICAgYXJyb3dSZWN0LnNldFgocmVjdC54KCkgKyAxKTsKKyAgICBlbHNl
CisgICAgICAgIGFycm93UmVjdC5zZXRYKHJlY3QueCgpICsgMik7CisKKyAgICBnaW50IHdpZHRo
ID0gYXJyb3dSZWN0LndpZHRoKCkgLyAyOworICAgIHdpZHRoIC09IHdpZHRoICUgMiAtIDE7IC8v
IEZvcmNlIG9kZC4KKyAgICBnaW50IGhlaWdodCA9ICh3aWR0aCArIDEpIC8gMjsKKworICAgIGFy
cm93UmVjdC5tb3ZlKChhcnJvd1JlY3Qud2lkdGgoKSAtIHdpZHRoKSAvIDIsIChhcnJvd1JlY3Qu
aGVpZ2h0KCkgLSBoZWlnaHQpIC8gMik7CisgICAgZ3RrX3JlbmRlcl9hcnJvdyhjb250ZXh0LCBw
YWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGFuZ2xlLCBhcnJvd1Jl
Y3QueCgpLCBhcnJvd1JlY3QueSgpLCB3aWR0aCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9y
ZXN0b3JlKGNvbnRleHQpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludElubmVyU3Bp
bkJ1dHRvbihjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgR3RrU3R5bGVDb250ZXh0
KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX1NQSU5fQlVUVE9OKTsKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOworCisgICAgR3RrVGV4dERpcmVjdGlvbiBk
aXJlY3Rpb24gPSBzdGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9u
KHJlbmRlck9iamVjdC5zdHlsZSgpLmRpcmVjdGlvbigpKSk7CisgICAgZ3RrX3N0eWxlX2NvbnRl
eHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBkaXJlY3Rpb24pOworCisgICAgZ3VpbnQgZmxhZ3Mg
PSAwOworICAgIGlmICghaXNFbmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRy
b2wocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5T
SVRJVkU7CisgICAgZWxzZSBpZiAoaXNGb2N1c2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZs
YWdzIHw9IEdUS19TVEFURV9GTEFHX0ZPQ1VTRUQ7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0
X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfcmVtb3ZlX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19F
TlRSWSk7CisKKyAgICBwYWludFNwaW5BcnJvd0J1dHRvbih0aGlzLCBjb250ZXh0LCByZW5kZXJP
YmplY3QsIHBhaW50SW5mbywgcmVjdCwgR1RLX0FSUk9XX1VQKTsKKyAgICBwYWludFNwaW5BcnJv
d0J1dHRvbih0aGlzLCBjb250ZXh0LCByZW5kZXJPYmplY3QsIHBhaW50SW5mbywgcmVjdCwgR1RL
X0FSUk9XX0RPV04pOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsK
KworICAgIHJldHVybiBmYWxzZTsKK30KKworZG91YmxlIFJlbmRlclRoZW1lR3RrOjpjYXJldEJs
aW5rSW50ZXJ2YWwoKSBjb25zdAoreworICAgIEd0a1NldHRpbmdzKiBzZXR0aW5ncyA9IGd0a19z
ZXR0aW5nc19nZXRfZGVmYXVsdCgpOworCisgICAgZ2Jvb2xlYW4gc2hvdWxkQmxpbms7CisgICAg
Z2ludCB0aW1lOworCisgICAgZ19vYmplY3RfZ2V0KHNldHRpbmdzLCAiZ3RrLWN1cnNvci1ibGlu
ayIsICZzaG91bGRCbGluaywgImd0ay1jdXJzb3ItYmxpbmstdGltZSIsICZ0aW1lLCBudWxscHRy
KTsKKworICAgIGlmICghc2hvdWxkQmxpbmspCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0
dXJuIHRpbWUgLyAyMDAwLjsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0
aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHZGtSR0JBIGdka1JH
QkFDb2xvcjsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYmFja2dyb3VuZF9jb2xvcihnZXRT
dHlsZUNvbnRleHQoR1RLX1RZUEVfRU5UUlkpLCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihH
VEtfU1RBVEVfRkxBR19TRUxFQ1RFRCB8IEdUS19TVEFURV9GTEFHX0ZPQ1VTRUQpLCAmZ2RrUkdC
QUNvbG9yKTsKKyAgICByZXR1cm4gZ2RrUkdCQUNvbG9yOworfQorCitDb2xvciBSZW5kZXJUaGVt
ZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7
CisgICAgR2RrUkdCQSBnZGtSR0JBQ29sb3I7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2Jh
Y2tncm91bmRfY29sb3IoZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0VOVFJZKSwgR1RLX1NUQVRF
X0ZMQUdfU0VMRUNURUQsICZnZGtSR0JBQ29sb3IpOworICAgIHJldHVybiBnZGtSR0JBQ29sb3I7
Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVn
cm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR2RrUkdCQSBnZGtSR0JBQ29sb3I7CisgICAgZ3Rr
X3N0eWxlX2NvbnRleHRfZ2V0X2NvbG9yKGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9FTlRSWSks
IHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KEdUS19TVEFURV9GTEFHX1NFTEVDVEVEIHwgR1RL
X1NUQVRFX0ZMQUdfRk9DVVNFRCksICZnZGtSR0JBQ29sb3IpOworICAgIHJldHVybiBnZGtSR0JB
Q29sb3I7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0
aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHZGtSR0JBIGdka1JHQkFDb2xvcjsK
KyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfY29sb3IoZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBF
X0VOVFJZKSwgR1RLX1NUQVRFX0ZMQUdfU0VMRUNURUQsICZnZGtSR0JBQ29sb3IpOworICAgIHJl
dHVybiBnZGtSR0JBQ29sb3I7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFj
dGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEdka1JH
QkEgZ2RrUkdCQUNvbG9yOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9iYWNrZ3JvdW5kX2Nv
bG9yKGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9UUkVFX1ZJRVcpLCBzdGF0aWNfY2FzdDxHdGtT
dGF0ZUZsYWdzPihHVEtfU1RBVEVfRkxBR19TRUxFQ1RFRCB8IEdUS19TVEFURV9GTEFHX0ZPQ1VT
RUQpLCAmZ2RrUkdCQUNvbG9yKTsKKyAgICByZXR1cm4gZ2RrUkdCQUNvbG9yOworfQorCitDb2xv
ciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3Jv
dW5kQ29sb3IoKSBjb25zdAoreworICAgIEdka1JHQkEgZ2RrUkdCQUNvbG9yOworICAgIGd0a19z
dHlsZV9jb250ZXh0X2dldF9iYWNrZ3JvdW5kX2NvbG9yKGdldFN0eWxlQ29udGV4dChHVEtfVFlQ
RV9UUkVFX1ZJRVcpLCBHVEtfU1RBVEVfRkxBR19TRUxFQ1RFRCwgJmdka1JHQkFDb2xvcik7Cisg
ICAgcmV0dXJuIGdka1JHQkFDb2xvcjsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRm
b3JtQWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAg
R2RrUkdCQSBnZGtSR0JBQ29sb3I7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2NvbG9yKGdl
dFN0eWxlQ29udGV4dChHVEtfVFlQRV9UUkVFX1ZJRVcpLCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZs
YWdzPihHVEtfU1RBVEVfRkxBR19TRUxFQ1RFRCB8IEdUS19TVEFURV9GTEFHX0ZPQ1VTRUQpLCAm
Z2RrUkdCQUNvbG9yKTsKKyAgICByZXR1cm4gZ2RrUkdCQUNvbG9yOworfQorCitDb2xvciBSZW5k
ZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29s
b3IoKSBjb25zdAoreworICAgIEdka1JHQkEgZ2RrUkdCQUNvbG9yOworICAgIGd0a19zdHlsZV9j
b250ZXh0X2dldF9jb2xvcihnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfVFJFRV9WSUVXKSwgR1RL
X1NUQVRFX0ZMQUdfU0VMRUNURUQsICZnZGtSR0JBQ29sb3IpOworICAgIHJldHVybiBnZGtSR0JB
Q29sb3I7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpzeXN0ZW1Db2xvcihDU1NWYWx1ZUlE
IGNzc1ZhbHVlSWQpIGNvbnN0Cit7CisgICAgR2RrUkdCQSBnZGtSR0JBQ29sb3I7CisKKyAgICBz
d2l0Y2ggKGNzc1ZhbHVlSWQpIHsKKyAgICBjYXNlIENTU1ZhbHVlQnV0dG9udGV4dDoKKyAgICAg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2NvbG9yKGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9C
VVRUT04pLCBHVEtfU1RBVEVfRkxBR19BQ1RJVkUsICZnZGtSR0JBQ29sb3IpOworICAgICAgICBy
ZXR1cm4gZ2RrUkdCQUNvbG9yOworICAgIGNhc2UgQ1NTVmFsdWVDYXB0aW9udGV4dDoKKyAgICAg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2NvbG9yKGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9F
TlRSWSksIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDApLCAmZ2RrUkdCQUNvbG9yKTsKKyAg
ICAgICAgcmV0dXJuIGdka1JHQkFDb2xvcjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4g
UmVuZGVyVGhlbWU6OnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworICAgIH0KK30KKwordm9pZCBS
ZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKQoreworI2lmIEVOQUJMRShW
SURFTykKKyAgICBpbml0TWVkaWFDb2xvcnMoKTsKKyNlbmRpZgorICAgIFJlbmRlclRoZW1lOjpw
bGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOworfQorCisjaWYgRU5BQkxFKFZJREVPKQorU3RyaW5n
IFJlbmRlclRoZW1lR3RrOjpleHRyYU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCkKK3sKKyAgICBy
ZXR1cm4gU3RyaW5nKG1lZGlhQ29udHJvbHNHdGtVc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2Yo
bWVkaWFDb250cm9sc0d0a1VzZXJBZ2VudFN0eWxlU2hlZXQpKTsKK30KKworI2lmIEVOQUJMRShG
VUxMU0NSRUVOX0FQSSkKK1N0cmluZyBSZW5kZXJUaGVtZUd0azo6ZXh0cmFGdWxsU2NyZWVuU3R5
bGVTaGVldCgpCit7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorI2VuZGlmCisKK2Jvb2wgUmVu
ZGVyVGhlbWVHdGs6OnBhaW50TWVkaWFCdXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJP
YmplY3QsIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgY29u
c3QgY2hhciogc3ltYm9saWNJY29uTmFtZSwgY29uc3QgY2hhciogZmFsbGJhY2tTdG9ja0ljb25O
YW1lKQoreworICAgIEludFJlY3QgaWNvblJlY3QoCisgICAgICAgIHJlY3QueCgpICsgKHJlY3Qu
d2lkdGgoKSAtIG1fbWVkaWFJY29uU2l6ZSkgLyAyLAorICAgICAgICByZWN0LnkoKSArIChyZWN0
LmhlaWdodCgpIC0gbV9tZWRpYUljb25TaXplKSAvIDIsCisgICAgICAgIG1fbWVkaWFJY29uU2l6
ZSwgbV9tZWRpYUljb25TaXplKTsKKyAgICBHUmVmUHRyPEdka1BpeGJ1Zj4gaWNvbiA9IGdldFN0
b2NrU3ltYm9saWNJY29uRm9yV2lkZ2V0VHlwZShHVEtfVFlQRV9DT05UQUlORVIsIHN5bWJvbGlj
SWNvbk5hbWUsIGZhbGxiYWNrU3RvY2tJY29uTmFtZSwKKyAgICAgICAgZ3RrVGV4dERpcmVjdGlv
bihyZW5kZXJPYmplY3Quc3R5bGUoKS5kaXJlY3Rpb24oKSksIGd0a0ljb25TdGF0ZSh0aGlzLCBy
ZW5kZXJPYmplY3QpLCBpY29uUmVjdC53aWR0aCgpKTsKKyAgICBwYWludEdka1BpeGJ1Zihjb250
ZXh0LCBpY29uLmdldCgpLCBpY29uUmVjdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wg
UmVuZGVyVGhlbWVHdGs6Omhhc093bkRpc2FibGVkU3RhdGVIYW5kbGluZ0ZvcihDb250cm9sUGFy
dCBwYXJ0KSBjb25zdAoreworICAgIHJldHVybiAocGFydCAhPSBNZWRpYU11dGVCdXR0b25QYXJ0
KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5CdXR0b24o
Y29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9u
KHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsICJ2aWV3LWZ1bGxzY3JlZW4t
c3ltYm9saWMiLCBHVEtfU1RPQ0tfRlVMTFNDUkVFTik7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50TWVkaWFNdXRlQnV0dG9uKGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0
LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAg
ICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBnZXRNZWRpYUVsZW1lbnRGcm9tUmVu
ZGVyT2JqZWN0KHJlbmRlck9iamVjdCk7CisgICAgaWYgKCFtZWRpYUVsZW1lbnQpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgbXV0ZWQgPSBtZWRpYUVsZW1lbnQtPm11dGVkKCk7
CisgICAgcmV0dXJuIHBhaW50TWVkaWFCdXR0b24ocmVuZGVyT2JqZWN0LCBwYWludEluZm8uY29u
dGV4dCwgcmVjdCwKKyAgICAgICAgbXV0ZWQgPyAiYXVkaW8tdm9sdW1lLW11dGVkLXN5bWJvbGlj
IiA6ICJhdWRpby12b2x1bWUtaGlnaC1zeW1ib2xpYyIsCisgICAgICAgIG11dGVkID8gImF1ZGlv
LXZvbHVtZS1tdXRlZCIgOiAiYXVkaW8tdm9sdW1lLWhpZ2giKTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZUd0azo6cGFpbnRNZWRpYVBsYXlCdXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJP
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIE5vZGUqIG5vZGUgPSByZW5kZXJPYmplY3Qubm9kZSgpOworICAgIGlmICghbm9kZSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFub2RlSGFzUHNldWRvKG5vZGUsICIt
d2Via2l0LW1lZGlhLWNvbnRyb2xzLXBsYXktYnV0dG9uIikpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBib29sIHNob3dQbGF5QnV0dG9uID0gbm9kZUhhc0NsYXNzKG5vZGUsICJwYXVzZWQi
KTsKKworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHJlbmRlck9iamVjdCwgcGFpbnRJbmZv
LmNvbnRleHQsIHJlY3QsCisgICAgICAgIHNob3dQbGF5QnV0dG9uID8gIm1lZGlhLXBsYXliYWNr
LXN0YXJ0LXN5bWJvbGljIiA6ICJtZWRpYS1wbGF5YmFjay1wYXVzZS1zeW1ib2xpYyIsCisgICAg
ICAgIHNob3dQbGF5QnV0dG9uID8gR1RLX1NUT0NLX01FRElBX1BMQVkgOiBHVEtfU1RPQ0tfTUVE
SUFfUEFVU0UpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lZGlhU2Vla0JhY2tC
dXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludE1lZGlh
QnV0dG9uKHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsICJtZWRpYS1zZWVr
LWJhY2t3YXJkLXN5bWJvbGljIiwgR1RLX1NUT0NLX01FRElBX1JFV0lORCk7Cit9CisKK2Jvb2wg
UmVuZGVyVGhlbWVHdGs6OnBhaW50TWVkaWFTZWVrRm9yd2FyZEJ1dHRvbihjb25zdCBSZW5kZXJP
YmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50TWVkaWFCdXR0b24ocmVuZGVyT2JqZWN0
LCBwYWludEluZm8uY29udGV4dCwgcmVjdCwgIm1lZGlhLXNlZWstZm9yd2FyZC1zeW1ib2xpYyIs
IEdUS19TVE9DS19NRURJQV9GT1JXQVJEKTsKK30KKworI2lmIEVOQUJMRShWSURFT19UUkFDSykK
K2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVkaWFUb2dnbGVDbG9zZWRDYXB0aW9uc0J1dHRv
bihjb25zdCBSZW5kZXJPYmplY3QmIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWlu
dEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgSW50UmVjdCBpY29uUmVjdChyZWN0
LngoKSArIChyZWN0LndpZHRoKCkgLSBtX21lZGlhSWNvblNpemUpIC8gMiwgcmVjdC55KCkgKyAo
cmVjdC5oZWlnaHQoKSAtIG1fbWVkaWFJY29uU2l6ZSkgLyAyLAorICAgICAgICBtX21lZGlhSWNv
blNpemUsIG1fbWVkaWFJY29uU2l6ZSk7CisgICAgR1JlZlB0cjxHZGtQaXhidWY+IGljb24gPSBn
ZXRTdG9ja1N5bWJvbGljSWNvbkZvcldpZGdldFR5cGUoR1RLX1RZUEVfQ09OVEFJTkVSLCAibWVk
aWEtdmlldy1zdWJ0aXRsZXMtc3ltYm9saWMiLCBudWxscHRyLAorICAgICAgICBndGtUZXh0RGly
ZWN0aW9uKHJlbmRlck9iamVjdC5zdHlsZSgpLmRpcmVjdGlvbigpKSwgZ3RrSWNvblN0YXRlKHRo
aXMsIHJlbmRlck9iamVjdCksIGljb25SZWN0LndpZHRoKCkpOworICAgIGlmICghaWNvbikgewor
ICAgICAgICBpY29uID0gZ2V0U3RvY2tTeW1ib2xpY0ljb25Gb3JXaWRnZXRUeXBlKEdUS19UWVBF
X0NPTlRBSU5FUiwgInVzZXItaW52aXNpYmxlLXN5bWJvbGljIiwgR1RLX1NUT0NLX0pVU1RJRllf
RklMTCwKKyAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LnN0eWxlKCku
ZGlyZWN0aW9uKCkpLCBndGtJY29uU3RhdGUodGhpcywgcmVuZGVyT2JqZWN0KSwgaWNvblJlY3Qu
d2lkdGgoKSk7CisgICAgfQorICAgIHBhaW50R2RrUGl4YnVmKHBhaW50SW5mby5jb250ZXh0LCBp
Y29uLmdldCgpLCBpY29uUmVjdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworc3Rh
dGljIEZsb2F0Um91bmRlZFJlY3Q6OlJhZGlpIGJvcmRlclJhZGlpRnJvbVN0eWxlKFJlbmRlclN0
eWxlJiBzdHlsZSkKK3sKKyAgICByZXR1cm4gRmxvYXRSb3VuZGVkUmVjdDo6UmFkaWkoCisgICAg
ICAgIEludFNpemUoc3R5bGUuYm9yZGVyVG9wTGVmdFJhZGl1cygpLndpZHRoKCkuaW50VmFsdWUo
KSwgc3R5bGUuYm9yZGVyVG9wTGVmdFJhZGl1cygpLmhlaWdodCgpLmludFZhbHVlKCkpLAorICAg
ICAgICBJbnRTaXplKHN0eWxlLmJvcmRlclRvcFJpZ2h0UmFkaXVzKCkud2lkdGgoKS5pbnRWYWx1
ZSgpLCBzdHlsZS5ib3JkZXJUb3BSaWdodFJhZGl1cygpLmhlaWdodCgpLmludFZhbHVlKCkpLAor
ICAgICAgICBJbnRTaXplKHN0eWxlLmJvcmRlckJvdHRvbUxlZnRSYWRpdXMoKS53aWR0aCgpLmlu
dFZhbHVlKCksIHN0eWxlLmJvcmRlckJvdHRvbUxlZnRSYWRpdXMoKS5oZWlnaHQoKS5pbnRWYWx1
ZSgpKSwKKyAgICAgICAgSW50U2l6ZShzdHlsZS5ib3JkZXJCb3R0b21SaWdodFJhZGl1cygpLndp
ZHRoKCkuaW50VmFsdWUoKSwgc3R5bGUuYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMoKS5oZWlnaHQo
KS5pbnRWYWx1ZSgpKSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVkaWFTbGlk
ZXJUcmFjayhjb25zdCBSZW5kZXJPYmplY3QmIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVu
dCA9IHBhcmVudE1lZGlhRWxlbWVudChvKTsKKyAgICBpZiAoIW1lZGlhRWxlbWVudCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0ID0gcGFpbnRJ
bmZvLmNvbnRleHQ7CisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9r
ZVN0eWxlKE5vU3Ryb2tlKTsKKworICAgIGZsb2F0IG1lZGlhRHVyYXRpb24gPSBtZWRpYUVsZW1l
bnQtPmR1cmF0aW9uKCk7CisgICAgZmxvYXQgdG90YWxUcmFja1dpZHRoID0gci53aWR0aCgpOwor
ICAgIFJlbmRlclN0eWxlJiBzdHlsZSA9IG8uc3R5bGUoKTsKKyAgICBSZWZQdHI8VGltZVJhbmdl
cz4gdGltZVJhbmdlcyA9IG1lZGlhRWxlbWVudC0+YnVmZmVyZWQoKTsKKyAgICBmb3IgKHVuc2ln
bmVkIGluZGV4ID0gMDsgaW5kZXggPCB0aW1lUmFuZ2VzLT5sZW5ndGgoKTsgKytpbmRleCkgewor
ICAgICAgICBmbG9hdCBzdGFydCA9IHRpbWVSYW5nZXMtPnN0YXJ0KGluZGV4LCBJR05PUkVfRVhD
RVBUSU9OKTsKKyAgICAgICAgZmxvYXQgZW5kID0gdGltZVJhbmdlcy0+ZW5kKGluZGV4LCBJR05P
UkVfRVhDRVBUSU9OKTsKKyAgICAgICAgZmxvYXQgc3RhcnRSYXRpbyA9IHN0YXJ0IC8gbWVkaWFE
dXJhdGlvbjsKKyAgICAgICAgZmxvYXQgbGVuZ3RoUmF0aW8gPSAoZW5kIC0gc3RhcnQpIC8gbWVk
aWFEdXJhdGlvbjsKKyAgICAgICAgaWYgKCFsZW5ndGhSYXRpbykKKyAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgIEludFJlY3QgcmFuZ2VSZWN0KHIpOworICAgICAgICByYW5nZVJlY3Qu
c2V0V2lkdGgobGVuZ3RoUmF0aW8gKiB0b3RhbFRyYWNrV2lkdGgpOworICAgICAgICBpZiAoaW5k
ZXgpCisgICAgICAgICAgICByYW5nZVJlY3QubW92ZShzdGFydFJhdGlvICogdG90YWxUcmFja1dp
ZHRoLCAwKTsKKyAgICAgICAgY29udGV4dC0+ZmlsbFJvdW5kZWRSZWN0KEZsb2F0Um91bmRlZFJl
Y3QocmFuZ2VSZWN0LCBib3JkZXJSYWRpaUZyb21TdHlsZShzdHlsZSkpLCBzdHlsZS52aXNpdGVk
RGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvciksIHN0eWxlLmNvbG9yU3BhY2UoKSk7Cisg
ICAgfQorCisgICAgY29udGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiBmYWxzZTsKK30KKwor
Ym9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZWRpYVNsaWRlclRodW1iKGNvbnN0IFJlbmRlck9i
amVjdCYgbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7
CisgICAgUmVuZGVyU3R5bGUmIHN0eWxlID0gby5zdHlsZSgpOworICAgIHBhaW50SW5mby5jb250
ZXh0LT5maWxsUm91bmRlZFJlY3QoRmxvYXRSb3VuZGVkUmVjdChyLCBib3JkZXJSYWRpaUZyb21T
dHlsZShzdHlsZSkpLCBzdHlsZS52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xv
ciksIHN0eWxlLmNvbG9yU3BhY2UoKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJl
bmRlclRoZW1lR3RrOjpwYWludE1lZGlhVm9sdW1lU2xpZGVyQ29udGFpbmVyKGNvbnN0IFJlbmRl
ck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKQoreworICAgIHJldHVy
biB0cnVlOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lZGlhVm9sdW1lU2xpZGVy
VHJhY2soY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEhUTUxNZWRpYUVsZW1lbnQq
IG1lZGlhRWxlbWVudCA9IHBhcmVudE1lZGlhRWxlbWVudChyZW5kZXJPYmplY3QpOworICAgIGlm
ICghbWVkaWFFbGVtZW50KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGZsb2F0IHZvbHVt
ZSA9IG1lZGlhRWxlbWVudC0+bXV0ZWQoKSA/IDAuMGYgOiBtZWRpYUVsZW1lbnQtPnZvbHVtZSgp
OworICAgIGlmICghdm9sdW1lKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCA9IHBhaW50SW5mby5jb250ZXh0OworICAgIGNvbnRleHQtPnNhdmUo
KTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VTdHlsZShOb1N0cm9rZSk7CisKKyAgICBpbnQgcmVj
dEhlaWdodCA9IHJlY3QuaGVpZ2h0KCk7CisgICAgZmxvYXQgdHJhY2tIZWlnaHQgPSByZWN0SGVp
Z2h0ICogdm9sdW1lOworICAgIFJlbmRlclN0eWxlJiBzdHlsZSA9IHJlbmRlck9iamVjdC5zdHls
ZSgpOworICAgIEludFJlY3Qgdm9sdW1lUmVjdChyZWN0KTsKKyAgICB2b2x1bWVSZWN0Lm1vdmUo
MCwgcmVjdEhlaWdodCAtIHRyYWNrSGVpZ2h0KTsKKyAgICB2b2x1bWVSZWN0LnNldEhlaWdodChj
ZWlsKHRyYWNrSGVpZ2h0KSk7CisKKyAgICBjb250ZXh0LT5maWxsUm91bmRlZFJlY3QoRmxvYXRS
b3VuZGVkUmVjdCh2b2x1bWVSZWN0LCBib3JkZXJSYWRpaUZyb21TdHlsZShzdHlsZSkpLAorICAg
ICAgICBzdHlsZS52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvciksIHN0eWxl
LmNvbG9yU3BhY2UoKSk7CisgICAgY29udGV4dC0+cmVzdG9yZSgpOworCisgICAgcmV0dXJuIGZh
bHNlOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lZGlhVm9sdW1lU2xpZGVyVGh1
bWIoY29uc3QgUmVuZGVyT2JqZWN0JiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludE1lZGlhU2xp
ZGVyVGh1bWIocmVuZGVyT2JqZWN0LCBwYWludEluZm8sIHJlY3QpOworfQorCitTdHJpbmcgUmVu
ZGVyVGhlbWVHdGs6OmZvcm1hdE1lZGlhQ29udHJvbHNDdXJyZW50VGltZShmbG9hdCBjdXJyZW50
VGltZSwgZmxvYXQgZHVyYXRpb24pIGNvbnN0Cit7CisgICAgcmV0dXJuIGZvcm1hdE1lZGlhQ29u
dHJvbHNUaW1lKGN1cnJlbnRUaW1lKSArICIgLyAiICsgZm9ybWF0TWVkaWFDb250cm9sc1RpbWUo
ZHVyYXRpb24pOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lZGlhQ3VycmVudFRp
bWUoY29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYp
Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6
OmFkanVzdFByb2dyZXNzQmFyU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiBzdHls
ZSwgRWxlbWVudCYpIGNvbnN0Cit7CisgICAgc3R5bGUuc2V0Qm94U2hhZG93KG51bGxwdHIpOwor
fQorCisvLyBUaGVzZSB2YWx1ZXMgaGF2ZSBiZWVuIGNvcGllZCBmcm9tIFJlbmRlclRoZW1lQ2hy
b21pdW1Ta2lhLmNwcAorc3RhdGljIGNvbnN0IGludCBwcm9ncmVzc0FjdGl2aXR5QmxvY2tzID0g
NTsKK3N0YXRpYyBjb25zdCBpbnQgcHJvZ3Jlc3NBbmltYXRpb25GcmFtZXMgPSAxMDsKK3N0YXRp
YyBjb25zdCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25JbnRlcnZhbCA9IDAuMTI1OworZG91Ymxl
IFJlbmRlclRoZW1lR3RrOjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJl
bmRlclByb2dyZXNzJikgY29uc3QKK3sKKyAgICByZXR1cm4gcHJvZ3Jlc3NBbmltYXRpb25JbnRl
cnZhbDsKK30KKworZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmltYXRpb25EdXJhdGlvbkZvclBy
b2dyZXNzQmFyKFJlbmRlclByb2dyZXNzJikgY29uc3QKK3sKKyAgICByZXR1cm4gcHJvZ3Jlc3NB
bmltYXRpb25JbnRlcnZhbCAqIHByb2dyZXNzQW5pbWF0aW9uRnJhbWVzICogMjsgLy8gIjIiIGZv
ciBiYWNrIGFuZCBmb3J0aDsKK30KKworSW50UmVjdCBSZW5kZXJUaGVtZUd0azo6Y2FsY3VsYXRl
UHJvZ3Jlc3NSZWN0KGNvbnN0IFJlbmRlck9iamVjdCYgcmVuZGVyT2JqZWN0LCBjb25zdCBJbnRS
ZWN0JiBmdWxsQmFyUmVjdCkKK3sKKyAgICBJbnRSZWN0IHByb2dyZXNzUmVjdChmdWxsQmFyUmVj
dCk7CisgICAgY29uc3QgUmVuZGVyUHJvZ3Jlc3MmIHJlbmRlclByb2dyZXNzID0gdG9SZW5kZXJQ
cm9ncmVzcyhyZW5kZXJPYmplY3QpOworICAgIGlmIChyZW5kZXJQcm9ncmVzcy5pc0RldGVybWlu
YXRlKCkpIHsKKyAgICAgICAgaW50IHByb2dyZXNzV2lkdGggPSBwcm9ncmVzc1JlY3Qud2lkdGgo
KSAqIHJlbmRlclByb2dyZXNzLnBvc2l0aW9uKCk7CisgICAgICAgIGlmIChyZW5kZXJPYmplY3Qu
c3R5bGUoKS5kaXJlY3Rpb24oKSA9PSBSVEwpCisgICAgICAgICAgICBwcm9ncmVzc1JlY3Quc2V0
WChwcm9ncmVzc1JlY3QueCgpICsgcHJvZ3Jlc3NSZWN0LndpZHRoKCkgLSBwcm9ncmVzc1dpZHRo
KTsKKyAgICAgICAgcHJvZ3Jlc3NSZWN0LnNldFdpZHRoKHByb2dyZXNzV2lkdGgpOworICAgICAg
ICByZXR1cm4gcHJvZ3Jlc3NSZWN0OworICAgIH0KKworICAgIGRvdWJsZSBhbmltYXRpb25Qcm9n
cmVzcyA9IHJlbmRlclByb2dyZXNzLmFuaW1hdGlvblByb2dyZXNzKCk7CisKKyAgICAvLyBOZXZl
ciBsZXQgdGhlIHByb2dyZXNzIHJlY3Qgc2hyaW5rIHNtYWxsZXIgdGhhbiAyIHBpeGVscy4KKyAg
ICBpbnQgbmV3V2lkdGggPSBzdGQ6Om1heCgyLCBwcm9ncmVzc1JlY3Qud2lkdGgoKSAvIHByb2dy
ZXNzQWN0aXZpdHlCbG9ja3MpOworICAgIGludCBtb3ZhYmxlV2lkdGggPSBwcm9ncmVzc1JlY3Qu
d2lkdGgoKSAtIG5ld1dpZHRoOworICAgIHByb2dyZXNzUmVjdC5zZXRXaWR0aChuZXdXaWR0aCk7
CisKKyAgICAvLyBXZSB3YW50IHRoZSBmaXJzdCAwLjUgdW5pdHMgb2YgdGhlIGFuaW1hdGlvbiBw
cm9ncmVzcyB0byByZXByZXNlbnQgdGhlCisgICAgLy8gZm9yd2FyZCBtb3Rpb24gYW5kIHRoZSBz
ZWNvbmQgMC41IHVuaXRzIHRvIHJlcHJlc2VudCB0aGUgYmFja3dhcmQgbW90aW9uLAorICAgIC8v
IHRodXMgd2UgbXVsdGlwbHkgYnkgdHdvIGhlcmUgdG8gZ2V0IHRoZSBmdWxsIHN3ZWVwIG9mIHRo
ZSBwcm9ncmVzcyBiYXIgd2l0aAorICAgIC8vIGVhY2ggZGlyZWN0aW9uLgorICAgIGlmIChhbmlt
YXRpb25Qcm9ncmVzcyA8IDAuNSkKKyAgICAgICAgcHJvZ3Jlc3NSZWN0LnNldFgocHJvZ3Jlc3NS
ZWN0LngoKSArIChhbmltYXRpb25Qcm9ncmVzcyAqIDIgKiBtb3ZhYmxlV2lkdGgpKTsKKyAgICBl
bHNlCisgICAgICAgIHByb2dyZXNzUmVjdC5zZXRYKHByb2dyZXNzUmVjdC54KCkgKyAoKDEuMCAt
IGFuaW1hdGlvblByb2dyZXNzKSAqIDIgKiBtb3ZhYmxlV2lkdGgpKTsKKyAgICByZXR1cm4gcHJv
Z3Jlc3NSZWN0OworfQorCitTdHJpbmcgUmVuZGVyVGhlbWVHdGs6OmZpbGVMaXN0TmFtZUZvcldp
ZHRoKGNvbnN0IEZpbGVMaXN0KiBmaWxlTGlzdCwgY29uc3QgRm9udCYgZm9udCwgaW50IHdpZHRo
LCBib29sIG11bHRpcGxlRmlsZXNBbGxvd2VkKSBjb25zdAoreworICAgIGlmICh3aWR0aCA8PSAw
KQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBpZiAoZmlsZUxpc3QtPmxlbmd0aCgp
ID4gMSkKKyAgICAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVuY2F0ZShtdWx0
aXBsZUZpbGVVcGxvYWRUZXh0KGZpbGVMaXN0LT5sZW5ndGgoKSksIHdpZHRoLCBmb250LCBTdHJp
bmdUcnVuY2F0b3I6OkVuYWJsZVJvdW5kaW5nSGFja3MpOworCisgICAgU3RyaW5nIHN0cmluZzsK
KyAgICBpZiAoZmlsZUxpc3QtPmxlbmd0aCgpKQorICAgICAgICBzdHJpbmcgPSBwYXRoR2V0Rmls
ZU5hbWUoZmlsZUxpc3QtPml0ZW0oMCktPnBhdGgoKSk7CisgICAgZWxzZSBpZiAobXVsdGlwbGVG
aWxlc0FsbG93ZWQpCisgICAgICAgIHN0cmluZyA9IGZpbGVCdXR0b25Ob0ZpbGVzU2VsZWN0ZWRM
YWJlbCgpOworICAgIGVsc2UKKyAgICAgICAgc3RyaW5nID0gZmlsZUJ1dHRvbk5vRmlsZVNlbGVj
dGVkTGFiZWwoKTsKKworICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OmNlbnRlclRydW5jYXRl
KHN0cmluZywgd2lkdGgsIGZvbnQsIFN0cmluZ1RydW5jYXRvcjo6RW5hYmxlUm91bmRpbmdIYWNr
cyk7Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZUd0azo6bWVkaWFDb250cm9sc1NjcmlwdCgpCit7
CisgICAgU3RyaW5nQnVpbGRlciBzY3JpcHRCdWlsZGVyOworICAgIHNjcmlwdEJ1aWxkZXIuYXBw
ZW5kKG1lZGlhQ29udHJvbHNMb2NhbGl6ZWRTdHJpbmdzSmF2YVNjcmlwdCwgc2l6ZW9mKG1lZGlh
Q29udHJvbHNMb2NhbGl6ZWRTdHJpbmdzSmF2YVNjcmlwdCkpOworICAgIHNjcmlwdEJ1aWxkZXIu
YXBwZW5kKG1lZGlhQ29udHJvbHNBcHBsZUphdmFTY3JpcHQsIHNpemVvZihtZWRpYUNvbnRyb2xz
QXBwbGVKYXZhU2NyaXB0KSk7CisgICAgc2NyaXB0QnVpbGRlci5hcHBlbmQobWVkaWFDb250cm9s
c0d0a0phdmFTY3JpcHQsIHNpemVvZihtZWRpYUNvbnRyb2xzR3RrSmF2YVNjcmlwdCkpOworICAg
IHJldHVybiBzY3JpcHRCdWlsZGVyLnRvU3RyaW5nKCk7Cit9CisKKyNlbmRpZiAvLyBHVEtfQVBJ
X1ZFUlNJT05fMgorfQo=
</data>
<flag name="review"
          id="262031"
          type_id="1"
          status="+"
          setter="mrobinson"
    />
          </attachment>
      

    </bug>

</bugzilla>