<?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>47732</bug_id>
          
          <creation_ts>2010-10-15 12:28:11 -0700</creation_ts>
          <short_desc>[chromium]  FontLinux.cpp cleanup (move most methods in TextRunWorker from inlined)</short_desc>
          <delta_ts>2010-10-18 11:06:43 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>47019</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Xiaomei Ji">xji</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>levin</cc>
    
    <cc>skyul</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>294854</commentid>
    <comment_count>0</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-10-15 12:28:11 -0700</bug_when>
    <thetext>All function members in TextRunWorker are defined as inlined.
Most of them should not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294860</commentid>
    <comment_count>1</comment_count>
      <attachid>70888</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-10-15 12:35:45 -0700</bug_when>
    <thetext>Created attachment 70888
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295154</commentid>
    <comment_count>2</comment_count>
      <attachid>70888</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-10-16 12:07:18 -0700</bug_when>
    <thetext>Comment on attachment 70888
patch

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

Please consider addressing my comments on landing.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:164
&gt; +    TextRunWalker(const TextRun&amp; run, unsigned startingX, const Font* font);

Remove param names that add no information: &quot;run&quot;, &quot;font&quot;.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:167
&gt; +    bool isWordBreak(unsigned i, bool isRTL);

What is &quot;i? In its current form, I&apos;d remove it, but I have no idea what that param is. Should it be called index?

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:170
&gt; +    void setPadding(int padding);

No need for &quot;padding&quot;. (Since the method name is setPadding and it only takes one parameter.)

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:172
&gt; +    void setBackwardsIteration(bool isBackwards);

Remove param name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295605</commentid>
    <comment_count>3</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-10-18 10:41:41 -0700</bug_when>
    <thetext>Committed r69972: &lt;http://trac.webkit.org/changeset/69972&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295625</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-10-18 11:06:43 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/69972 might have broken Qt Windows 32-bit Release</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70888</attachid>
            <date>2010-10-15 12:35:45 -0700</date>
            <delta_ts>2010-10-16 12:07:17 -0700</delta_ts>
            <desc>patch</desc>
            <filename>47732.v1</filename>
            <type>text/plain</type>
            <size>34935</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTg3MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDQgQEAKKzIwMTAtMTAtMTUgIFhpYW9tZWkgSmkgIDx4amlAY2hyb21pdW0ub3Jn
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIENvZGUg
Y2xlYW51cDogTW92ZSBtb3N0IGZ1bmN0aW9uIG1lbWJlcnMgaW4gVGV4dFJ1bldvcmtlciBmcm9t
IGlubGluZWQuCisKKyAgICAgICAgTm8gZnVuY3Rpb25hbGl0eSBjaGFuZ2UsIHNvIG5vIHRlc3Rz
IGFkZGVkLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnNldFdvcmRTcGFjaW5nQWRq
dXN0bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpzZXRMZXR0ZXJTcGFj
aW5nQWRqdXN0bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpzZXRYT2Zm
c2V0VG9aZXJvKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnJ0bCk6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpnbHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6
VGV4dFJ1bldhbGtlcjo6bGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6
OnhQb3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6YWR2YW5jZXMp
OgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6d2lkdGgpOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dFJ1bldhbGtlcjo6bG9nQ2x1c3RlcnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dFJ1bldhbGtlcjo6bnVtQ29kZVBvaW50cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fs
a2VyOjpmb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHRSdW5XYWxrZXI6OmlzQ29kZXBvaW50U3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1
bldhbGtlcjo6VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2Vy
Ojp+VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjppc1dv
cmRCcmVhayk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpzZXRQYWRkaW5nKToK
KyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnJlc2V0KToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHRSdW5XYWxrZXI6OnNldEJhY2t3YXJkc0l0ZXJhdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpUZXh0UnVuV2Fsa2VyOjpuZXh0U2NyaXB0UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHRSdW5XYWxrZXI6OndpZHRoT2ZGdWxsUnVuKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5X
YWxrZXI6OmdldFRleHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6Z2V0
Tm9ybWFsaXplZFRleHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6c2V0
dXBGb250Rm9yU2NyaXB0UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OmFs
bG9jSGFyZmJ1enpGb250KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OmRlbGV0
ZUdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OmNyZWF0ZUds
eXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnJlc2V0R2x5cGhB
cnJheXMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6c2hhcGVHbHlwaHMpOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6c2V0R2x5cGhYUG9zaXRpb25zKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6Om1pcnJvckNoYXJhY3RlcnMpOgorCiAyMDEw
LTEwLTE1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgU2FtIFdlaW5pZy4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vRm9udExpbnV4LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHAJKHJldmlzaW9uIDY5ODU1KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xNjEsNjIgKzE2MSwyMyBAQCBzdGF0aWMgaW50IHRydW5jYXRlRml4ZWRQb2ludFRvSW50
ZWdlcihICiAvLyBjYW4gY2FsbCB8cmVzZXR8IHRvIHN0YXJ0IG92ZXIgYWdhaW4uCiBjbGFzcyBU
ZXh0UnVuV2Fsa2VyIHsKIHB1YmxpYzoKLSAgICBUZXh0UnVuV2Fsa2VyKGNvbnN0IFRleHRSdW4m
IHJ1biwgdW5zaWduZWQgc3RhcnRpbmdYLCBjb25zdCBGb250KiBmb250KQotICAgICAgICA6IG1f
Zm9udChmb250KQotICAgICAgICAsIG1fc3RhcnRpbmdYKHN0YXJ0aW5nWCkKLSAgICAgICAgLCBt
X29mZnNldFgobV9zdGFydGluZ1gpCi0gICAgICAgICwgbV9ydW4oZ2V0VGV4dFJ1bihydW4pKQot
ICAgICAgICAsIG1faXRlcmF0ZUJhY2t3YXJkcyhtX3J1bi5ydGwoKSkKLSAgICAgICAgLCBtX3dv
cmRTcGFjaW5nQWRqdXN0bWVudCgwKQotICAgICAgICAsIG1fcGFkZGluZygwKQotICAgICAgICAs
IG1fcGFkRXJyb3IoMCkKLSAgICB7Ci0gICAgICAgIC8vIERvIG5vdCB1c2UgfHJ1bnwgaW5zaWRl
IHRoaXMgY29uc3RydWN0b3IuIFVzZSB8bV9ydW58IGluc3RlYWQuCi0KLSAgICAgICAgbWVtc2V0
KCZtX2l0ZW0sIDAsIHNpemVvZihtX2l0ZW0pKTsKLSAgICAgICAgLy8gV2UgY2Fubm90IGtub3cs
IGFoZWFkIG9mIHRpbWUsIGhvdyBtYW55IGdseXBocyBhIGdpdmVuIHNjcmlwdCBydW4KLSAgICAg
ICAgLy8gd2lsbCBwcm9kdWNlLiBXZSB0YWtlIGEgZ3Vlc3MgdGhhdCBzY3JpcHQgcnVucyB3aWxs
IG5vdCBwcm9kdWNlIG1vcmUKLSAgICAgICAgLy8gdGhhbiB0d2ljZSBhcyBtYW55IGdseXBocyBh
cyB0aGVyZSBhcmUgY29kZSBwb2ludHMgcGx1cyBhIGJpdCBvZgotICAgICAgICAvLyBwYWRkaW5n
IGFuZCBmYWxsYmFjayBpZiB3ZSBmaW5kIHRoYXQgd2UgYXJlIHdyb25nLgotICAgICAgICBjcmVh
dGVHbHlwaEFycmF5cygobV9ydW4ubGVuZ3RoKCkgKyAyKSAqIDIpOwotCi0gICAgICAgIG1faXRl
bS5sb2dfY2x1c3RlcnMgPSBuZXcgdW5zaWduZWQgc2hvcnRbbV9ydW4ubGVuZ3RoKCldOwotCi0g
ICAgICAgIG1faXRlbS5mYWNlID0gMDsKLSAgICAgICAgbV9pdGVtLmZvbnQgPSBhbGxvY0hhcmZi
dXp6Rm9udCgpOwotCi0gICAgICAgIG1faXRlbS5pdGVtLmJpZGlMZXZlbCA9IG1fcnVuLnJ0bCgp
OwotCi0gICAgICAgIGludCBsZW5ndGggPSBtX3J1bi5sZW5ndGgoKTsKLSAgICAgICAgbV9pdGVt
LnN0cmluZ0xlbmd0aCA9IGxlbmd0aDsKLQotICAgICAgICBpZiAoIW1faXRlbS5pdGVtLmJpZGlM
ZXZlbCkKLSAgICAgICAgICAgIG1faXRlbS5zdHJpbmcgPSBtX3J1bi5jaGFyYWN0ZXJzKCk7Ci0g
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gQXNzdW1lIG1pcnJvcmVkIGNoYXJhY3RlciBp
cyBpbiB0aGUgc2FtZSBVbmljb2RlIG11bHRpbGluZ3VhbCBwbGFuZSBhcyB0aGUgb3JpZ2luYWwg
b25lLgotICAgICAgICAgICAgVUNoYXIqIHN0cmluZyA9IG5ldyBVQ2hhcltsZW5ndGhdOwotICAg
ICAgICAgICAgbWlycm9yQ2hhcmFjdGVycyhzdHJpbmcsIG1fcnVuLmNoYXJhY3RlcnMoKSwgbGVu
Z3RoKTsKLSAgICAgICAgICAgIG1faXRlbS5zdHJpbmcgPSBzdHJpbmc7Ci0gICAgICAgIH0KLQot
ICAgICAgICByZXNldCgpOwotICAgIH0KKyAgICBUZXh0UnVuV2Fsa2VyKGNvbnN0IFRleHRSdW4m
IHJ1biwgdW5zaWduZWQgc3RhcnRpbmdYLCBjb25zdCBGb250KiBmb250KTsKKyAgICB+VGV4dFJ1
bldhbGtlcigpOwogCi0gICAgflRleHRSdW5XYWxrZXIoKQotICAgIHsKLSAgICAgICAgZmFzdEZy
ZWUobV9pdGVtLmZvbnQpOwotICAgICAgICBkZWxldGVHbHlwaEFycmF5cygpOwotICAgICAgICBk
ZWxldGVbXSBtX2l0ZW0ubG9nX2NsdXN0ZXJzOwotICAgICAgICBpZiAobV9pdGVtLml0ZW0uYmlk
aUxldmVsKQotICAgICAgICAgICAgZGVsZXRlW10gbV9pdGVtLnN0cmluZzsKLSAgICB9CisgICAg
Ym9vbCBpc1dvcmRCcmVhayh1bnNpZ25lZCBpLCBib29sIGlzUlRMKTsKKyAgICAvLyBzZXRQYWRk
aW5nIHNldHMgYSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUg
VGV4dFJ1bi4KKyAgICAvLyBXZWJLaXQgdXNlcyB0aGlzIHRvIGp1c3RpZnkgdGV4dC4KKyAgICB2
b2lkIHNldFBhZGRpbmcoaW50IHBhZGRpbmcpOworICAgIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lk
IHNldEJhY2t3YXJkc0l0ZXJhdGlvbihib29sIGlzQmFja3dhcmRzKTsKKyAgICAvLyBBZHZhbmNl
IHRvIHRoZSBuZXh0IHNjcmlwdCBydW4sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQgb2Yg
dGhlCisgICAgLy8gVGV4dFJ1biBoYXMgYmVlbiByZWFjaGVkLgorICAgIGJvb2wgbmV4dFNjcmlw
dFJ1bigpOworICAgIGZsb2F0IHdpZHRoT2ZGdWxsUnVuKCk7CiAKICAgICAvLyBzZXRXb3JkU3Bh
Y2luZ0FkanVzdG1lbnQgc2V0cyBhIGRlbHRhIChpbiBwaXhlbHMpIHdoaWNoIGlzIGFwcGxpZWQg
YXQKICAgICAvLyBlYWNoIHdvcmQgYnJlYWsgaW4gdGhlIFRleHRSdW4uCi0gICAgdm9pZCBzZXRX
b3JkU3BhY2luZ0FkanVzdG1lbnQoaW50IHdvcmRTcGFjaW5nQWRqdXN0bWVudCkKLSAgICB7Ci0g
ICAgICAgIG1fd29yZFNwYWNpbmdBZGp1c3RtZW50ID0gd29yZFNwYWNpbmdBZGp1c3RtZW50Owot
ICAgIH0KKyAgICB2b2lkIHNldFdvcmRTcGFjaW5nQWRqdXN0bWVudChpbnQgd29yZFNwYWNpbmdB
ZGp1c3RtZW50KSB7IG1fd29yZFNwYWNpbmdBZGp1c3RtZW50ID0gd29yZFNwYWNpbmdBZGp1c3Rt
ZW50OyB9CiAKICAgICAvLyBzZXRMZXR0ZXJTcGFjaW5nQWRqdXN0bWVudCBzZXRzIGFuIGFkZGl0
aW9uYWwgbnVtYmVyIG9mIHBpeGVscyB0aGF0IGlzCiAgICAgLy8gYWRkZWQgdG8gdGhlIGFkdmFu
Y2UgYWZ0ZXIgZWFjaCBvdXRwdXQgY2x1c3Rlci4gVGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvdXIK
QEAgLTIyNCwzODMgKzE4NSw1NCBAQCBwdWJsaWM6CiAgICAgLy8KICAgICAvLyAoTk9URTogY3Vy
cmVudGx5IGRvZXMgbm90aGluZyBiZWNhdXNlIEkgZG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZQog
ICAgIC8vIGNsdXN0ZXIgaW5mb3JtYXRpb24gZnJvbSBIYXJmYnV6ei4pCi0gICAgdm9pZCBzZXRM
ZXR0ZXJTcGFjaW5nQWRqdXN0bWVudChpbnQgbGV0dGVyU3BhY2luZ0FkanVzdG1lbnQpCi0gICAg
ewotICAgICAgICBtX2xldHRlclNwYWNpbmcgPSBsZXR0ZXJTcGFjaW5nQWRqdXN0bWVudDsKLSAg
ICB9Ci0KLSAgICBib29sIGlzV29yZEJyZWFrKHVuc2lnbmVkIGksIGJvb2wgaXNSVEwpCi0gICAg
ewotICAgICAgICBpZiAoIWlzUlRMKQotICAgICAgICAgICAgcmV0dXJuIGkgJiYgaXNDb2RlcG9p
bnRTcGFjZShtX2l0ZW0uc3RyaW5nW2ldKSAmJiAhaXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3Ry
aW5nW2kgLSAxXSk7Ci0gICAgICAgIHJldHVybiBpICE9IG1faXRlbS5zdHJpbmdMZW5ndGggLSAx
ICYmIGlzQ29kZXBvaW50U3BhY2UobV9pdGVtLnN0cmluZ1tpXSkgJiYgIWlzQ29kZXBvaW50U3Bh
Y2UobV9pdGVtLnN0cmluZ1tpICsgMV0pOwotICAgIH0KLQotICAgIC8vIHNldFBhZGRpbmcgc2V0
cyBhIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZGlzdHJpYnV0ZWQgYWNyb3NzIHRoZSBUZXh0UnVu
LgotICAgIC8vIFdlYktpdCB1c2VzIHRoaXMgdG8ganVzdGlmeSB0ZXh0LgotICAgIHZvaWQgc2V0
UGFkZGluZyhpbnQgcGFkZGluZykKLSAgICB7Ci0gICAgICAgIG1fcGFkZGluZyA9IHBhZGRpbmc7
Ci0gICAgICAgIGlmICghbV9wYWRkaW5nKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAg
IC8vIElmIHdlIGhhdmUgcGFkZGluZyB0byBkaXN0cmlidXRlLCB0aGVuIHdlIHRyeSB0byBnaXZl
IGFuIGVxdWFsCi0gICAgICAgIC8vIGFtb3VudCB0byBlYWNoIHNwYWNlLiBUaGUgbGFzdCBzcGFj
ZSBnZXRzIHRoZSBzbWFsbGVyIGFtb3VudCwgaWYKLSAgICAgICAgLy8gYW55LgotICAgICAgICB1
bnNpZ25lZCBudW1Xb3JkQnJlYWtzID0gMDsKLSAgICAgICAgYm9vbCBpc1JUTCA9IG1faXRlcmF0
ZUJhY2t3YXJkczsKLQotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9pdGVtLnN0
cmluZ0xlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXNXb3JkQnJlYWsoaSwgaXNSVEwp
KQotICAgICAgICAgICAgICAgIG51bVdvcmRCcmVha3MrKzsKLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChudW1Xb3JkQnJlYWtzKQotICAgICAgICAgICAgbV9wYWRQZXJXb3JkQnJlYWsgPSBtX3Bh
ZGRpbmcgLyBudW1Xb3JkQnJlYWtzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX3BhZFBl
cldvcmRCcmVhayA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldCgpCi0gICAgewotICAgICAg
ICBpZiAobV9pdGVyYXRlQmFja3dhcmRzKQotICAgICAgICAgICAgbV9pbmRleE9mTmV4dFNjcmlw
dFJ1biA9IG1fcnVuLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9p
bmRleE9mTmV4dFNjcmlwdFJ1biA9IDA7Ci0gICAgICAgIG1fb2Zmc2V0WCA9IG1fc3RhcnRpbmdY
OwotICAgIH0KKyAgICB2b2lkIHNldExldHRlclNwYWNpbmdBZGp1c3RtZW50KGludCBsZXR0ZXJT
cGFjaW5nQWRqdXN0bWVudCkgeyBtX2xldHRlclNwYWNpbmcgPSBsZXR0ZXJTcGFjaW5nQWRqdXN0
bWVudDsgfQogCiAgICAgLy8gU2V0IHRoZSB4IG9mZnNldCBmb3IgdGhlIG5leHQgc2NyaXB0IHJ1
bi4gVGhpcyBhZmZlY3RzIHRoZSB2YWx1ZXMgaW4KICAgICAvLyB8eFBvc2l0aW9uc3wKLSAgICB2
b2lkIHNldFhPZmZzZXRUb1plcm8oKQotICAgIHsKLSAgICAgICAgbV9vZmZzZXRYID0gMDsKLSAg
ICB9Ci0KLSAgICBib29sIHJ0bCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9ydW4u
cnRsKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRCYWNrd2FyZHNJdGVyYXRpb24oYm9vbCBpc0Jh
Y2t3YXJkcykKLSAgICB7Ci0gICAgICAgIG1faXRlcmF0ZUJhY2t3YXJkcyA9IGlzQmFja3dhcmRz
OwotICAgICAgICByZXNldCgpOwotICAgIH0KLQotICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQg
c2NyaXB0IHJ1biwgcmV0dXJuaW5nIGZhbHNlIHdoZW4gdGhlIGVuZCBvZiB0aGUKLSAgICAvLyBU
ZXh0UnVuIGhhcyBiZWVuIHJlYWNoZWQuCi0gICAgYm9vbCBuZXh0U2NyaXB0UnVuKCkKLSAgICB7
Ci0gICAgICAgIGlmIChtX2l0ZXJhdGVCYWNrd2FyZHMpIHsKLSAgICAgICAgICAgIC8vIEluIHJp
Z2h0LXRvLWxlZnQgbW9kZSB3ZSBuZWVkIHRvIHJlbmRlciB0aGUgc2hhcGVkIGdseXBoIGJhY2t3
YXJkcyBhbmQKLSAgICAgICAgICAgIC8vIGFsc28gcmVuZGVyIHRoZSBzY3JpcHQgcnVucyB0aGVt
c2VsdmVzIGJhY2t3YXJkcy4gU28gZ2l2ZW4gYSBUZXh0UnVuOgotICAgICAgICAgICAgLy8gICAg
QUFBQUFBQUNUVFRUVFRUICAgKEEgPSBBcmFiaWMsIEMgPSBDb21tb24sIFQgPSBUaGFpKQotICAg
ICAgICAgICAgLy8gd2UgcmVuZGVyOgotICAgICAgICAgICAgLy8gICAgVFRUVFRUQ0FBQUFBQUEK
LSAgICAgICAgICAgIC8vIChhbmQgdGhlIGdseXBocyBpbiBlYWNoIEEsIEMgYW5kIFQgc2VjdGlv
biBhcmUgYmFja3dhcmRzIHRvbykKLSAgICAgICAgICAgIGlmICghaGJfdXRmMTZfc2NyaXB0X3J1
bl9wcmV2KCZtX251bUNvZGVQb2ludHMsICZtX2l0ZW0uaXRlbSwgbV9ydW4uY2hhcmFjdGVycygp
LCBtX3J1bi5sZW5ndGgoKSwgJm1faW5kZXhPZk5leHRTY3JpcHRSdW4pKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaGJf
dXRmMTZfc2NyaXB0X3J1bl9uZXh0KCZtX251bUNvZGVQb2ludHMsICZtX2l0ZW0uaXRlbSwgbV9y
dW4uY2hhcmFjdGVycygpLCBtX3J1bi5sZW5ndGgoKSwgJm1faW5kZXhPZk5leHRTY3JpcHRSdW4p
KQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgLy8gSXQgaXMg
YWN0dWFsbHkgd3JvbmcgdG8gY29uc2lkZXIgc2NyaXB0IHJ1bnMgYXQgYWxsIGluIHRoaXMgY29k
ZS4KLSAgICAgICAgICAgIC8vIE90aGVyIFdlYktpdCBjb2RlIChlLmcuIE1hYykgc2VnbWVudHMg
Y29tcGxleCB0ZXh0IGp1c3QgYnkgZmluZGluZwotICAgICAgICAgICAgLy8gdGhlIGxvbmdlc3Qg
c3BhbiBvZiB0ZXh0IGNvdmVyZWQgYnkgYSBzaW5nbGUgZm9udC4KLSAgICAgICAgICAgIC8vIEJ1
dCB3ZSBjdXJyZW50bHkgbmVlZCB0byBjYWxsIGhiX3V0ZjE2X3NjcmlwdF9ydW5fbmV4dCBhbnl3
YXkgdG8gZmlsbAotICAgICAgICAgICAgLy8gaW4gdGhlIGhhcmZidXp6IGRhdGEgc3RydWN0dXJl
cyB0byBlLmcuIHBpY2sgdGhlIGNvcnJlY3Qgc2NyaXB0J3Mgc2hhcGVyLgotICAgICAgICAgICAg
Ly8gU28gd2UgYWxsb3cgdGhhdCB0byBydW4gZmlyc3QsIHRoZW4gZG8gYSBzZWNvbmQgcGFzcyBv
dmVyIHRoZSByYW5nZSBpdAotICAgICAgICAgICAgLy8gZm91bmQgYW5kIHRha2UgdGhlIGxhcmdl
c3Qgc3VicmVnaW9uIHRoYXQgc3RheXMgd2l0aGluIGEgc2luZ2xlIGZvbnQuCi0gICAgICAgICAg
ICBjb25zdCBGb250RGF0YSogZ2x5cGhEYXRhID0gbV9mb250LT5nbHlwaERhdGFGb3JDaGFyYWN0
ZXIobV9pdGVtLnN0cmluZ1ttX2l0ZW0uaXRlbS5wb3NdLCBmYWxzZSwgZmFsc2UpLmZvbnREYXRh
OwotICAgICAgICAgICAgdW5zaWduZWQgZW5kT2ZSdW47Ci0gICAgICAgICAgICBmb3IgKGVuZE9m
UnVuID0gMTsgZW5kT2ZSdW4gPCBtX2l0ZW0uaXRlbS5sZW5ndGg7ICsrZW5kT2ZSdW4pIHsKLSAg
ICAgICAgICAgICAgICBjb25zdCBGb250RGF0YSogbmV4dEdseXBoRGF0YSA9IG1fZm9udC0+Z2x5
cGhEYXRhRm9yQ2hhcmFjdGVyKG1faXRlbS5zdHJpbmdbbV9pdGVtLml0ZW0ucG9zICsgZW5kT2ZS
dW5dLCBmYWxzZSwgZmFsc2UpLmZvbnREYXRhOwotICAgICAgICAgICAgICAgIGlmIChuZXh0R2x5
cGhEYXRhICE9IGdseXBoRGF0YSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBtX2l0ZW0uaXRlbS5sZW5ndGggPSBlbmRPZlJ1bjsKLSAgICAg
ICAgICAgIG1faW5kZXhPZk5leHRTY3JpcHRSdW4gPSBtX2l0ZW0uaXRlbS5wb3MgKyBlbmRPZlJ1
bjsKLSAgICAgICAgfQotCi0gICAgICAgIHNldHVwRm9udEZvclNjcmlwdFJ1bigpOwotICAgICAg
ICBzaGFwZUdseXBocygpOwotICAgICAgICBzZXRHbHlwaFhQb3NpdGlvbnMocnRsKCkpOwotCi0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQxNl90KiBnbHlwaHMo
KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fZ2x5cGhzMTY7Ci0gICAgfQorICAgIHZv
aWQgc2V0WE9mZnNldFRvWmVybygpIHsgbV9vZmZzZXRYID0gMDsgfQorICAgIGJvb2wgcnRsKCkg
Y29uc3QgeyByZXR1cm4gbV9ydW4ucnRsKCk7IH0KKyAgICBjb25zdCB1aW50MTZfdCogZ2x5cGhz
KCkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHMxNjsgfQogCiAgICAgLy8gUmV0dXJuIHRoZSBsZW5n
dGggb2YgdGhlIGFycmF5IHJldHVybmVkIGJ5IHxnbHlwaHN8Ci0gICAgY29uc3QgdW5zaWduZWQg
bGVuZ3RoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2l0ZW0ubnVtX2dseXBoczsK
LSAgICB9CisgICAgY29uc3QgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9pdGVt
Lm51bV9nbHlwaHM7IH0KIAogICAgIC8vIFJldHVybiB0aGUgeCBvZmZzZXQgZm9yIGVhY2ggb2Yg
dGhlIGdseXBocy4gTm90ZSB0aGF0IHRoaXMgaXMgdHJhbnNsYXRlZAogICAgIC8vIGJ5IHRoZSBj
dXJyZW50IHggb2Zmc2V0IGFuZCB0aGF0IHRoZSB4IG9mZnNldCBpcyB1cGRhdGVkIGZvciBlYWNo
IHNjcmlwdAogICAgIC8vIHJ1bi4KLSAgICBjb25zdCBTa1NjYWxhciogeFBvc2l0aW9ucygpIGNv
bnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV94UG9zaXRpb25zOwotICAgIH0KKyAgICBjb25z
dCBTa1NjYWxhciogeFBvc2l0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1feFBvc2l0aW9uczsgfQog
CiAgICAgLy8gR2V0IHRoZSBhZHZhbmNlcyAod2lkdGhzKSBmb3IgZWFjaCBnbHlwaC4KLSAgICBj
b25zdCBIQl9GaXhlZCogYWR2YW5jZXMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1f
aXRlbS5hZHZhbmNlczsKLSAgICB9CisgICAgY29uc3QgSEJfRml4ZWQqIGFkdmFuY2VzKCkgY29u
c3QgeyByZXR1cm4gbV9pdGVtLmFkdmFuY2VzOyB9CiAKICAgICAvLyBSZXR1cm4gdGhlIHdpZHRo
IChpbiBweCkgb2YgdGhlIGN1cnJlbnQgc2NyaXB0IHJ1bi4KLSAgICBjb25zdCB1bnNpZ25lZCB3
aWR0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9waXhlbFdpZHRoOwotICAgIH0K
KyAgICBjb25zdCB1bnNpZ25lZCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcGl4ZWxXaWR0aDsg
fQogCiAgICAgLy8gUmV0dXJuIHRoZSBjbHVzdGVyIGxvZyBmb3IgdGhlIGN1cnJlbnQgc2NyaXB0
IHJ1bi4gRm9yIGV4YW1wbGU6CiAgICAgLy8gICBzY3JpcHQgcnVuOiBmIGkgYSBuIGMgw6kgIChm
aSBnZXRzIGxpZ2F0dXJlZCkKICAgICAvLyAgIGxvZyBjbHV0cnM6IDAgMCAxIDIgMyA0CiAgICAg
Ly8gU28sIGZvciBlYWNoIGlucHV0IGNvZGUgcG9pbnQsIHRoZSBsb2cgdGVsbHMgeW91IHdoaWNo
IG91dHB1dCBnbHlwaCB3YXMKICAgICAvLyBnZW5lcmF0ZWQgZm9yIGl0LgotICAgIGNvbnN0IHVu
c2lnbmVkIHNob3J0KiBsb2dDbHVzdGVycygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4g
bV9pdGVtLmxvZ19jbHVzdGVyczsKLSAgICB9CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIGxv
Z0NsdXN0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9pdGVtLmxvZ19jbHVzdGVyczsgfQogCiAgICAg
Ly8gcmV0dXJuIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gdGhlIGN1cnJlbnQgc2NyaXB0
IHJ1bgotICAgIGNvbnN0IHVuc2lnbmVkIG51bUNvZGVQb2ludHMoKSBjb25zdAotICAgIHsKLSAg
ICAgICAgcmV0dXJuIG1fbnVtQ29kZVBvaW50czsKLSAgICB9Ci0KLSAgICBjb25zdCBGb250UGxh
dGZvcm1EYXRhKiBmb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCkKLSAgICB7Ci0gICAgICAg
IHJldHVybiByZWludGVycHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPihtX2l0ZW0uZm9udC0+
dXNlckRhdGEpOwotICAgIH0KLQotICAgIGZsb2F0IHdpZHRoT2ZGdWxsUnVuKCkKLSAgICB7Ci0g
ICAgICAgIGZsb2F0IHdpZHRoU3VtID0gMDsKLSAgICAgICAgd2hpbGUgKG5leHRTY3JpcHRSdW4o
KSkKLSAgICAgICAgICAgIHdpZHRoU3VtICs9IHdpZHRoKCk7CisgICAgY29uc3QgdW5zaWduZWQg
bnVtQ29kZVBvaW50cygpIGNvbnN0IHsgcmV0dXJuIG1fbnVtQ29kZVBvaW50czsgfQogCi0gICAg
ICAgIHJldHVybiB3aWR0aFN1bTsKLSAgICB9CisgICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSog
Zm9udFBsYXRmb3JtRGF0YUZvclNjcmlwdFJ1bigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8
Rm9udFBsYXRmb3JtRGF0YSo+KG1faXRlbS5mb250LT51c2VyRGF0YSk7IH0KIAogcHJpdmF0ZToK
LSAgICBjb25zdCBUZXh0UnVuJiBnZXRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9yaWdpbmFsUnVu
KQotICAgIHsKLSAgICAgICAgLy8gTm9ybWFsaXplIHRoZSB0ZXh0IHJ1biBpbiB0d28gd2F5czoK
LSAgICAgICAgLy8gMSkgQ29udmVydCB0aGUgfG9yaWdpbmFsUnVufCB0byBORkMgbm9ybWFsaXpl
ZCBmb3JtIGlmIGNvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcwotICAgICAgICAvLyAoVSswMzAw
Li4pIGFyZSB1c2VkIGluIHRoZSBydW4uIFRoaXMgY29udmVyc2lvbiBpcyBuZWNlc3Nhcnkgc2lu
Y2UgbW9zdCBPcGVuVHlwZQotICAgICAgICAvLyBmb250cyAoZS5nLiwgQXJpYWwpIGRvbid0IGhh
dmUgc3Vic3RpdHV0aW9uIHJ1bGVzIGZvciB0aGUgZGlhY3JpdGljYWwgbWFya3MgaW4KLSAgICAg
ICAgLy8gdGhlaXIgR1NVQiB0YWJsZXMuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vdGUgdGhh
dCB3ZSBkb24ndCB1c2UgdGhlIGljdTo6Tm9ybWFsaXplcjo6aXNOb3JtYWxpemVkKFVOT1JNX05G
QykgQVBJIGhlcmUgc2luY2UKLSAgICAgICAgLy8gdGhlIEFQSSByZXR1cm5zIEZBTFNFICg9IG5v
dCBub3JtYWxpemVkKSBmb3IgY29tcGxleCBydW5zIHRoYXQgZG9uJ3QgcmVxdWlyZSBORkMKLSAg
ICAgICAgLy8gbm9ybWFsaXphdGlvbiAoZS5nLiwgQXJhYmljIHRleHQpLiBVbmxlc3MgdGhlIHJ1
biBjb250YWlucyB0aGUgZGlhY3JpdGljYWwgbWFya3MsCi0gICAgICAgIC8vIEhhcmZidXp6IHdp
bGwgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIHVzIHVzaW5nIHRoZSBHU1VCIHRhYmxlLgotICAgICAg
ICAvLyAyKSBDb252ZXJ0IHNwYWNpbmcgY2hhcmFjdGVycyBpbnRvIHBsYWluIHNwYWNlcywgYXMg
c29tZSBmb250cyB3aWxsIHByb3ZpZGUgZ2x5cGhzCi0gICAgICAgIC8vIGZvciBjaGFyYWN0ZXJz
IGxpa2UgJ1xuJyBvdGhlcndpc2UuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2lu
YWxSdW4ubGVuZ3RoKCk7ICsraSkgewotICAgICAgICAgICAgVUNoYXIgY2ggPSBvcmlnaW5hbFJ1
bltpXTsKLSAgICAgICAgICAgIFVCbG9ja0NvZGUgYmxvY2sgPSA6OnVibG9ja19nZXRDb2RlKGNo
KTsKLSAgICAgICAgICAgIGlmIChibG9jayA9PSBVQkxPQ0tfQ09NQklOSU5HX0RJQUNSSVRJQ0FM
X01BUktTIHx8IChGb250Ojp0cmVhdEFzU3BhY2UoY2gpICYmIGNoICE9ICcgJykpIHsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gZ2V0Tm9ybWFsaXplZFRleHRSdW4ob3JpZ2luYWxSdW4pOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcmlnaW5hbFJ1bjsKLSAgICB9
Ci0KLSAgICBjb25zdCBUZXh0UnVuJiBnZXROb3JtYWxpemVkVGV4dFJ1bihjb25zdCBUZXh0UnVu
JiBvcmlnaW5hbFJ1bikKLSAgICB7Ci0gICAgICAgIGljdTo6VW5pY29kZVN0cmluZyBub3JtYWxp
emVkU3RyaW5nOwotICAgICAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9aRVJPX0VSUk9SOwotICAg
ICAgICBpY3U6Ok5vcm1hbGl6ZXI6Om5vcm1hbGl6ZShpY3U6OlVuaWNvZGVTdHJpbmcob3JpZ2lu
YWxSdW4uY2hhcmFjdGVycygpLCBvcmlnaW5hbFJ1bi5sZW5ndGgoKSksIFVOT1JNX05GQywgMCAv
KiBubyBvcHRpb25zICovLCBub3JtYWxpemVkU3RyaW5nLCBlcnJvcik7Ci0gICAgICAgIGlmIChV
X0ZBSUxVUkUoZXJyb3IpKQotICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUnVuOwotCi0gICAg
ICAgIG1fbm9ybWFsaXplZEJ1ZmZlci5zZXQobmV3IFVDaGFyW25vcm1hbGl6ZWRTdHJpbmcubGVu
Z3RoKCkgKyAxXSk7Ci0gICAgICAgIG5vcm1hbGl6ZWRTdHJpbmcuZXh0cmFjdChtX25vcm1hbGl6
ZWRCdWZmZXIuZ2V0KCksIG5vcm1hbGl6ZWRTdHJpbmcubGVuZ3RoKCkgKyAxLCBlcnJvcik7Ci0g
ICAgICAgIEFTU0VSVChVX1NVQ0NFU1MoZXJyb3IpKTsKLQotICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IG5vcm1hbGl6ZWRTdHJpbmcubGVuZ3RoKCk7ICsraSkgewotICAgICAgICAgICAgaWYg
KEZvbnQ6OnRyZWF0QXNTcGFjZShtX25vcm1hbGl6ZWRCdWZmZXJbaV0pKQotICAgICAgICAgICAg
ICAgIG1fbm9ybWFsaXplZEJ1ZmZlcltpXSA9ICcgJzsKLSAgICAgICAgfQotCi0gICAgICAgIG1f
bm9ybWFsaXplZFJ1bi5zZXQobmV3IFRleHRSdW4ob3JpZ2luYWxSdW4pKTsKLSAgICAgICAgbV9u
b3JtYWxpemVkUnVuLT5zZXRUZXh0KG1fbm9ybWFsaXplZEJ1ZmZlci5nZXQoKSwgbm9ybWFsaXpl
ZFN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgIHJldHVybiAqbV9ub3JtYWxpemVkUnVuOwotICAg
IH0KLQotICAgIHZvaWQgc2V0dXBGb250Rm9yU2NyaXB0UnVuKCkKLSAgICB7Ci0gICAgICAgIGNv
bnN0IEZvbnREYXRhKiBmb250RGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKG1f
aXRlbS5zdHJpbmdbbV9pdGVtLml0ZW0ucG9zXSwgZmFsc2UsIGZhbHNlKS5mb250RGF0YTsKLSAg
ICAgICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhID0gZm9udERhdGEtPmZv
bnREYXRhRm9yQ2hhcmFjdGVyKCcgJyktPnBsYXRmb3JtRGF0YSgpOwotICAgICAgICBtX2l0ZW0u
ZmFjZSA9IHBsYXRmb3JtRGF0YS5oYXJmYnV6ekZhY2UoKTsKLSAgICAgICAgdm9pZCogb3BhcXVl
UGxhdGZvcm1EYXRhID0gY29uc3RfY2FzdDxGb250UGxhdGZvcm1EYXRhKj4oJnBsYXRmb3JtRGF0
YSk7Ci0gICAgICAgIG1faXRlbS5mb250LT51c2VyRGF0YSA9IG9wYXF1ZVBsYXRmb3JtRGF0YTsK
LSAgICB9Ci0KLSAgICBIQl9Gb250UmVjKiBhbGxvY0hhcmZidXp6Rm9udCgpCi0gICAgewotICAg
ICAgICBIQl9Gb250UmVjKiBmb250ID0gcmVpbnRlcnByZXRfY2FzdDxIQl9Gb250UmVjKj4oZmFz
dE1hbGxvYyhzaXplb2YoSEJfRm9udFJlYykpKTsKLSAgICAgICAgbWVtc2V0KGZvbnQsIDAsIHNp
emVvZihIQl9Gb250UmVjKSk7Ci0gICAgICAgIGZvbnQtPmtsYXNzID0gJmhhcmZidXp6U2tpYUNs
YXNzOwotICAgICAgICBmb250LT51c2VyRGF0YSA9IDA7Ci0gICAgICAgIC8vIFRoZSB2YWx1ZXMg
d2hpY2ggaGFyZmJ1enpTa2lhQ2xhc3MgcmV0dXJucyBhcmUgYWxyZWFkeSBzY2FsZWQgdG8KLSAg
ICAgICAgLy8gcGl4ZWwgdW5pdHMsIHNvIHdlIGp1c3Qgc2V0IGFsbCB0aGVzZSB0byBvbmUgdG8g
ZGlzYWJsZSBmdXJ0aGVyCi0gICAgICAgIC8vIHNjYWxpbmcuCi0gICAgICAgIGZvbnQtPnhfcHBl
bSA9IDE7Ci0gICAgICAgIGZvbnQtPnlfcHBlbSA9IDE7Ci0gICAgICAgIGZvbnQtPnhfc2NhbGUg
PSAxOwotICAgICAgICBmb250LT55X3NjYWxlID0gMTsKLQotICAgICAgICByZXR1cm4gZm9udDsK
LSAgICB9Ci0KLSAgICB2b2lkIGRlbGV0ZUdseXBoQXJyYXlzKCkKLSAgICB7Ci0gICAgICAgIGRl
bGV0ZVtdIG1faXRlbS5nbHlwaHM7Ci0gICAgICAgIGRlbGV0ZVtdIG1faXRlbS5hdHRyaWJ1dGVz
OwotICAgICAgICBkZWxldGVbXSBtX2l0ZW0uYWR2YW5jZXM7Ci0gICAgICAgIGRlbGV0ZVtdIG1f
aXRlbS5vZmZzZXRzOwotICAgICAgICBkZWxldGVbXSBtX2dseXBoczE2OwotICAgICAgICBkZWxl
dGVbXSBtX3hQb3NpdGlvbnM7Ci0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVHbHlwaEFycmF5cyhp
bnQgc2l6ZSkKLSAgICB7Ci0gICAgICAgIG1faXRlbS5nbHlwaHMgPSBuZXcgSEJfR2x5cGhbc2l6
ZV07Ci0gICAgICAgIG1faXRlbS5hdHRyaWJ1dGVzID0gbmV3IEhCX0dseXBoQXR0cmlidXRlc1tz
aXplXTsKLSAgICAgICAgbV9pdGVtLmFkdmFuY2VzID0gbmV3IEhCX0ZpeGVkW3NpemVdOwotICAg
ICAgICBtX2l0ZW0ub2Zmc2V0cyA9IG5ldyBIQl9GaXhlZFBvaW50W3NpemVdOwotCi0gICAgICAg
IG1fZ2x5cGhzMTYgPSBuZXcgdWludDE2X3Rbc2l6ZV07Ci0gICAgICAgIG1feFBvc2l0aW9ucyA9
IG5ldyBTa1NjYWxhcltzaXplXTsKLQotICAgICAgICBtX2l0ZW0ubnVtX2dseXBocyA9IHNpemU7
Ci0gICAgICAgIG1fZ2x5cGhzQXJyYXlDYXBhY2l0eSA9IHNpemU7IC8vIFNhdmUgdGhlIEdseXBo
QXJyYXlzIHNpemUuCi0gICAgICAgIHJlc2V0R2x5cGhBcnJheXMoKTsKLSAgICB9Ci0KLSAgICB2
b2lkIHJlc2V0R2x5cGhBcnJheXMoKQotICAgIHsKLSAgICAgICAgaW50IHNpemUgPSBtX2l0ZW0u
bnVtX2dseXBoczsKLSAgICAgICAgLy8gQWxsIHRoZSB0eXBlcyBoZXJlIGRvbid0IGhhdmUgcG9p
bnRlcnMuIEl0IGlzIHNhZmUgdG8gcmVzZXQgdG8KLSAgICAgICAgLy8gemVybyB1bmxlc3MgSGFy
ZmJ1enogYnJlYWtzIHRoZSBjb21wYXRpYmlsaXR5IGluIHRoZSBmdXR1cmUuCi0gICAgICAgIG1l
bXNldChtX2l0ZW0uZ2x5cGhzLCAwLCBzaXplICogc2l6ZW9mKEhCX0dseXBoKSk7Ci0gICAgICAg
IG1lbXNldChtX2l0ZW0uYXR0cmlidXRlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9HbHlwaEF0dHJp
YnV0ZXMpKTsKLSAgICAgICAgbWVtc2V0KG1faXRlbS5hZHZhbmNlcywgMCwgc2l6ZSAqIHNpemVv
ZihIQl9GaXhlZCkpOwotICAgICAgICBtZW1zZXQobV9pdGVtLm9mZnNldHMsIDAsIHNpemUgKiBz
aXplb2YoSEJfRml4ZWRQb2ludCkpOwotICAgICAgICBtZW1zZXQobV9nbHlwaHMxNiwgMCwgc2l6
ZSAqIHNpemVvZih1aW50MTZfdCkpOwotICAgICAgICBtZW1zZXQobV94UG9zaXRpb25zLCAwLCBz
aXplICogc2l6ZW9mKFNrU2NhbGFyKSk7Ci0gICAgfQotCi0gICAgdm9pZCBzaGFwZUdseXBocygp
Ci0gICAgewotICAgICAgICAvLyBIQl9TaGFwZUl0ZW0oKSByZXNldHMgbV9pdGVtLm51bV9nbHlw
aHMuIElmIHRoZSBwcmV2aW91cyBjYWxsIHRvCi0gICAgICAgIC8vIEhCX1NoYXBlSXRlbSgpIHVz
ZWQgbGVzcyBzcGFjZSB0aGFuIHdhcyBhdmFpbGFibGUsIHRoZSBjYXBhY2l0eSBvZgotICAgICAg
ICAvLyB0aGUgYXJyYXkgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIG1f
aXRlbS5udW1fZ2x5cGhzLiAKLSAgICAgICAgLy8gU28sIHdlIG5lZWQgdG8gcmVzZXQgdGhlIG51
bV9nbHlwaHMgdG8gdGhlIGNhcGFjaXR5IG9mIHRoZSBhcnJheS4KLSAgICAgICAgbV9pdGVtLm51
bV9nbHlwaHMgPSBtX2dseXBoc0FycmF5Q2FwYWNpdHk7Ci0gICAgICAgIHJlc2V0R2x5cGhBcnJh
eXMoKTsKLSAgICAgICAgd2hpbGUgKCFIQl9TaGFwZUl0ZW0oJm1faXRlbSkpIHsKLSAgICAgICAg
ICAgIC8vIFdlIG92ZXJmbG93ZWQgb3VyIGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4KLSAgICAg
ICAgICAgIC8vIEhCX1NoYXBlSXRlbSBmaWxscyBpbiBtX2l0ZW0ubnVtX2dseXBocyB3aXRoIHRo
ZSBuZWVkZWQgc2l6ZS4KLSAgICAgICAgICAgIGRlbGV0ZUdseXBoQXJyYXlzKCk7Ci0gICAgICAg
ICAgICAvLyBUaGUgfCsgMXwgaGVyZSBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEhhcmZi
dXp6OiB0aGUgS2htZXIKLSAgICAgICAgICAgIC8vIHNoYXBlciAoYXQgbGVhc3QpIGNhbiBmYWls
IGJlY2F1c2Ugb2YgaW5zdWZmaWNpZW50IGdseXBoIGJ1ZmZlcnMKLSAgICAgICAgICAgIC8vIGFu
ZCByZXF1ZXN0IDAgYWRkaXRpb25hbCBnbHlwaHM6IHRocm93aW5nIHVzIGludG8gYW4gaW5maW5p
dGUKLSAgICAgICAgICAgIC8vIGxvb3AuCi0gICAgICAgICAgICBjcmVhdGVHbHlwaEFycmF5cyht
X2l0ZW0ubnVtX2dseXBocyArIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzZXRH
bHlwaFhQb3NpdGlvbnMoYm9vbCBpc1JUTCkKLSAgICB7Ci0gICAgICAgIGRvdWJsZSBwb3NpdGlv
biA9IDA7Ci0gICAgICAgIC8vIGxvZ0NsdXN0ZXJzSW5kZXggaW5kZXhlcyBsb2dDbHVzdGVycyBm
b3IgdGhlIGZpcnN0IChvciBsYXN0IHdoZW4KLSAgICAgICAgLy8gUlRMKSBjb2RlcG9pbnQgb2Yg
dGhlIGN1cnJlbnQgZ2x5cGguICBFYWNoIHRpbWUgd2UgYWR2YW5jZSBhIGdseXBoLAotICAgICAg
ICAvLyB3ZSBza2lwIG92ZXIgYWxsIHRoZSBjb2RlcG9pbnRzIHRoYXQgY29udHJpYnV0ZWQgdG8g
dGhlIGN1cnJlbnQKLSAgICAgICAgLy8gZ2x5cGguCi0gICAgICAgIHVuc2lnbmVkIGxvZ0NsdXN0
ZXJzSW5kZXggPSBpc1JUTCA/IG1faXRlbS5udW1fZ2x5cGhzIC0gMSA6IDA7Ci0KLSAgICAgICAg
Zm9yICh1bnNpZ25lZCBpdGVyID0gMDsgaXRlciA8IG1faXRlbS5udW1fZ2x5cGhzOyArK2l0ZXIp
IHsKLSAgICAgICAgICAgIC8vIEdseXBocyBhcmUgc3RvcmVkIGluIGxvZ2ljYWwgb3JkZXIsIGJ1
dCBmb3IgbGF5b3V0IHB1cnBvc2VzIHdlCi0gICAgICAgICAgICAvLyBhbHdheXMgZ28gbGVmdCB0
byByaWdodC4KLSAgICAgICAgICAgIGludCBpID0gaXNSVEwgPyBtX2l0ZW0ubnVtX2dseXBocyAt
IGl0ZXIgLSAxIDogaXRlcjsKLQotICAgICAgICAgICAgbV9nbHlwaHMxNltpXSA9IG1faXRlbS5n
bHlwaHNbaV07Ci0gICAgICAgICAgICBkb3VibGUgb2Zmc2V0WCA9IHRydW5jYXRlRml4ZWRQb2lu
dFRvSW50ZWdlcihtX2l0ZW0ub2Zmc2V0c1tpXS54KTsKLSAgICAgICAgICAgIG1feFBvc2l0aW9u
c1tpXSA9IG1fb2Zmc2V0WCArIHBvc2l0aW9uICsgb2Zmc2V0WDsKLQotICAgICAgICAgICAgZG91
YmxlIGFkdmFuY2UgPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLmFkdmFuY2Vz
W2ldKTsKLSAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBoYWxmIG9mIHRoZSBjb25qdWN0aW9uIHdv
cmtzIGFyb3VuZCB0aGUgY2FzZSB3aGVyZQotICAgICAgICAgICAgLy8gb3V0cHV0IGdseXBocyBh
cmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGFueSBjb2RlcG9pbnRzIGJ5IHRoZQotICAgICAgICAgICAg
Ly8gY2x1c3RlcnMgbG9nLgotICAgICAgICAgICAgaWYgKGxvZ0NsdXN0ZXJzSW5kZXggPCBtX2l0
ZW0uaXRlbS5sZW5ndGgKLSAgICAgICAgICAgICAgICAmJiBpc1dvcmRCcmVhayhtX2l0ZW0uaXRl
bS5wb3MgKyBsb2dDbHVzdGVyc0luZGV4LCBpc1JUTCkpIHsKLSAgICAgICAgICAgICAgICBhZHZh
bmNlICs9IG1fd29yZFNwYWNpbmdBZGp1c3RtZW50OwotCi0gICAgICAgICAgICAgICAgaWYgKG1f
cGFkZGluZyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdG9QYWQgPSByb3Vu
ZGYobV9wYWRQZXJXb3JkQnJlYWsgKyBtX3BhZEVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAg
bV9wYWRFcnJvciArPSBtX3BhZFBlcldvcmRCcmVhayAtIHRvUGFkOwotCi0gICAgICAgICAgICAg
ICAgICAgIGlmIChtX3BhZGRpbmcgPCB0b1BhZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRv
UGFkID0gbV9wYWRkaW5nOwotICAgICAgICAgICAgICAgICAgICBtX3BhZGRpbmcgLT0gdG9QYWQ7
Ci0gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgKz0gdG9QYWQ7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIGFkZCBt
X2xldHRlclNwYWNpbmcgYWZ0ZXIgZWFjaCBjbHVzdGVyLCBidXQgSQotICAgICAgICAgICAgLy8g
ZG9uJ3Qga25vdyB3aGVyZSB0aGUgY2x1c3RlciBpbmZvcm1hdGlvbiBpcy4gVGhpcyBpcyB0eXBp
Y2FsbHkKLSAgICAgICAgICAgIC8vIGZpbmUgZm9yIFJvbWFuIGxhbmd1YWdlcywgYnV0IGJyZWFr
cyBtb3JlIGNvbXBsZXggbGFuZ3VhZ2VzCi0gICAgICAgICAgICAvLyB0ZXJyaWJseS4KLSAgICAg
ICAgICAgIC8vIGFkdmFuY2UgKz0gbV9sZXR0ZXJTcGFjaW5nOwotCi0gICAgICAgICAgICBpZiAo
aXNSVEwpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAobG9nQ2x1c3RlcnNJbmRleCA+IDAgJiYg
bG9nQ2x1c3RlcnMoKVtsb2dDbHVzdGVyc0luZGV4XSA9PSBpKQotICAgICAgICAgICAgICAgICAg
ICBsb2dDbHVzdGVyc0luZGV4LS07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIHdoaWxlIChsb2dDbHVzdGVyc0luZGV4IDwgbV9pdGVtLml0ZW0ubGVuZ3RoICYmIGxvZ0Ns
dXN0ZXJzKClbbG9nQ2x1c3RlcnNJbmRleF0gPT0gaSkKLSAgICAgICAgICAgICAgICAgICAgbG9n
Q2x1c3RlcnNJbmRleCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3NpdGlvbiAr
PSBhZHZhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9waXhlbFdpZHRoID0gcG9zaXRpb247
Ci0gICAgICAgIG1fb2Zmc2V0WCArPSBtX3BpeGVsV2lkdGg7Ci0gICAgfQorICAgIGNvbnN0IFRl
eHRSdW4mIGdldFRleHRSdW4oY29uc3QgVGV4dFJ1biYgb3JpZ2luYWxSdW4pOworICAgIGNvbnN0
IFRleHRSdW4mIGdldE5vcm1hbGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9yaWdpbmFsUnVu
KTsKKyAgICB2b2lkIHNldHVwRm9udEZvclNjcmlwdFJ1bigpOworICAgIEhCX0ZvbnRSZWMqIGFs
bG9jSGFyZmJ1enpGb250KCk7CisgICAgdm9pZCBkZWxldGVHbHlwaEFycmF5cygpOworICAgIHZv
aWQgY3JlYXRlR2x5cGhBcnJheXMoaW50IHNpemUpOworICAgIHZvaWQgcmVzZXRHbHlwaEFycmF5
cygpOworICAgIHZvaWQgc2hhcGVHbHlwaHMoKTsKKyAgICB2b2lkIHNldEdseXBoWFBvc2l0aW9u
cyhib29sIGlzUlRMKTsKKyAgICB2b2lkIG1pcnJvckNoYXJhY3RlcnMoVUNoYXIqIGRlc3RpbmF0
aW9uLCBjb25zdCBVQ2hhciogc291cmNlLCBpbnQgbGVuZ3RoKSBjb25zdDsKIAotICAgIHN0YXRp
YyBib29sIGlzQ29kZXBvaW50U3BhY2UoSEJfVUNoYXIxNiBjKQotICAgIHsKLSAgICAgICAgLy8g
VGhpcyBtYXRjaGVzIHRoZSBsb2dpYyBpbiBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lQnJlYWsK
LSAgICAgICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JzsKLSAgICB9Ci0KLSAgICB2b2lk
IG1pcnJvckNoYXJhY3RlcnMoVUNoYXIqIGRlc3RpbmF0aW9uLCBjb25zdCBVQ2hhciogc291cmNl
LCBpbnQgbGVuZ3RoKSBjb25zdAotICAgIHsKLSAgICAgICAgaW50IHBvc2l0aW9uID0gMDsKLSAg
ICAgICAgYm9vbCBlcnJvciA9IGZhbHNlOwotICAgICAgICAvLyBJdGVyYXRlIGNoYXJhY3RlcnMg
aW4gc291cmNlIGFuZCBtaXJyb3IgY2hhcmFjdGVyIGlmIG5lZWRlZC4KLSAgICAgICAgd2hpbGUg
KHBvc2l0aW9uIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICBVQ2hhcjMyIGNoYXJhY3RlcjsKLSAg
ICAgICAgICAgIGludCBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgIFUxNl9O
RVhUKHNvdXJjZSwgbmV4dFBvc2l0aW9uLCBsZW5ndGgsIGNoYXJhY3Rlcik7Ci0gICAgICAgICAg
ICBjaGFyYWN0ZXIgPSB1X2NoYXJNaXJyb3IoY2hhcmFjdGVyKTsKLSAgICAgICAgICAgIFUxNl9B
UFBFTkQoZGVzdGluYXRpb24sIHBvc2l0aW9uLCBsZW5ndGgsIGNoYXJhY3RlciwgZXJyb3IpOwot
ICAgICAgICAgICAgQVNTRVJUKCFlcnJvcik7Ci0gICAgICAgICAgICBwb3NpdGlvbiA9IG5leHRQ
b3NpdGlvbjsKLSAgICAgICAgfQotICAgIH0KKyAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIGxvZ2lj
IGluIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmVCcmVhaworICAgIHN0YXRpYyBib29sIGlzQ29k
ZXBvaW50U3BhY2UoSEJfVUNoYXIxNiBjKSB7IHJldHVybiBjID09ICcgJyB8fCBjID09ICdcdCc7
IH0KIAogICAgIGNvbnN0IEZvbnQqIGNvbnN0IG1fZm9udDsKICAgICBIQl9TaGFwZXJJdGVtIG1f
aXRlbTsKQEAgLTYyNyw2ICsyNTksMzU4IEBAIHByaXZhdGU6CiAgICAgdW5zaWduZWQgbV9sZXR0
ZXJTcGFjaW5nOyAvLyBwaXhlbHMgdG8gYmUgYWRkZWQgYWZ0ZXIgZWFjaCBnbHlwaC4KIH07CiAK
KworVGV4dFJ1bldhbGtlcjo6VGV4dFJ1bldhbGtlcihjb25zdCBUZXh0UnVuJiBydW4sIHVuc2ln
bmVkIHN0YXJ0aW5nWCwgY29uc3QgRm9udCogZm9udCkKKyAgICA6IG1fZm9udChmb250KQorICAg
ICwgbV9zdGFydGluZ1goc3RhcnRpbmdYKQorICAgICwgbV9vZmZzZXRYKG1fc3RhcnRpbmdYKQor
ICAgICwgbV9ydW4oZ2V0VGV4dFJ1bihydW4pKQorICAgICwgbV9pdGVyYXRlQmFja3dhcmRzKG1f
cnVuLnJ0bCgpKQorICAgICwgbV93b3JkU3BhY2luZ0FkanVzdG1lbnQoMCkKKyAgICAsIG1fcGFk
ZGluZygwKQorICAgICwgbV9wYWRFcnJvcigwKQoreworICAgIC8vIERvIG5vdCB1c2UgfHJ1bnwg
aW5zaWRlIHRoaXMgY29uc3RydWN0b3IuIFVzZSB8bV9ydW58IGluc3RlYWQuCisKKyAgICBtZW1z
ZXQoJm1faXRlbSwgMCwgc2l6ZW9mKG1faXRlbSkpOworICAgIC8vIFdlIGNhbm5vdCBrbm93LCBh
aGVhZCBvZiB0aW1lLCBob3cgbWFueSBnbHlwaHMgYSBnaXZlbiBzY3JpcHQgcnVuCisgICAgLy8g
d2lsbCBwcm9kdWNlLiBXZSB0YWtlIGEgZ3Vlc3MgdGhhdCBzY3JpcHQgcnVucyB3aWxsIG5vdCBw
cm9kdWNlIG1vcmUKKyAgICAvLyB0aGFuIHR3aWNlIGFzIG1hbnkgZ2x5cGhzIGFzIHRoZXJlIGFy
ZSBjb2RlIHBvaW50cyBwbHVzIGEgYml0IG9mCisgICAgLy8gcGFkZGluZyBhbmQgZmFsbGJhY2sg
aWYgd2UgZmluZCB0aGF0IHdlIGFyZSB3cm9uZy4KKyAgICBjcmVhdGVHbHlwaEFycmF5cygobV9y
dW4ubGVuZ3RoKCkgKyAyKSAqIDIpOworCisgICAgbV9pdGVtLmxvZ19jbHVzdGVycyA9IG5ldyB1
bnNpZ25lZCBzaG9ydFttX3J1bi5sZW5ndGgoKV07CisKKyAgICBtX2l0ZW0uZmFjZSA9IDA7Cisg
ICAgbV9pdGVtLmZvbnQgPSBhbGxvY0hhcmZidXp6Rm9udCgpOworCisgICAgbV9pdGVtLml0ZW0u
YmlkaUxldmVsID0gbV9ydW4ucnRsKCk7CisKKyAgICBpbnQgbGVuZ3RoID0gbV9ydW4ubGVuZ3Ro
KCk7CisgICAgbV9pdGVtLnN0cmluZ0xlbmd0aCA9IGxlbmd0aDsKKworICAgIGlmICghbV9pdGVt
Lml0ZW0uYmlkaUxldmVsKQorICAgICAgICBtX2l0ZW0uc3RyaW5nID0gbV9ydW4uY2hhcmFjdGVy
cygpOworICAgIGVsc2UgeworICAgICAgICAvLyBBc3N1bWUgbWlycm9yZWQgY2hhcmFjdGVyIGlz
IGluIHRoZSBzYW1lIFVuaWNvZGUgbXVsdGlsaW5ndWFsIHBsYW5lIGFzIHRoZSBvcmlnaW5hbCBv
bmUuCisgICAgICAgIFVDaGFyKiBzdHJpbmcgPSBuZXcgVUNoYXJbbGVuZ3RoXTsKKyAgICAgICAg
bWlycm9yQ2hhcmFjdGVycyhzdHJpbmcsIG1fcnVuLmNoYXJhY3RlcnMoKSwgbGVuZ3RoKTsKKyAg
ICAgICAgbV9pdGVtLnN0cmluZyA9IHN0cmluZzsKKyAgICB9CisKKyAgICByZXNldCgpOworfQor
CitUZXh0UnVuV2Fsa2VyOjp+VGV4dFJ1bldhbGtlcigpCit7CisgICAgZmFzdEZyZWUobV9pdGVt
LmZvbnQpOworICAgIGRlbGV0ZUdseXBoQXJyYXlzKCk7CisgICAgZGVsZXRlW10gbV9pdGVtLmxv
Z19jbHVzdGVyczsKKyAgICBpZiAobV9pdGVtLml0ZW0uYmlkaUxldmVsKQorICAgICAgICBkZWxl
dGVbXSBtX2l0ZW0uc3RyaW5nOworfQorCitib29sIFRleHRSdW5XYWxrZXI6OmlzV29yZEJyZWFr
KHVuc2lnbmVkIGksIGJvb2wgaXNSVEwpCit7CisgICAgaWYgKCFpc1JUTCkKKyAgICAgICAgcmV0
dXJuIGkgJiYgaXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3RyaW5nW2ldKSAmJiAhaXNDb2RlcG9p
bnRTcGFjZShtX2l0ZW0uc3RyaW5nW2kgLSAxXSk7CisgICAgcmV0dXJuIGkgIT0gbV9pdGVtLnN0
cmluZ0xlbmd0aCAtIDEgJiYgaXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3RyaW5nW2ldKSAmJiAh
aXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3RyaW5nW2kgKyAxXSk7Cit9CisKKy8vIHNldFBhZGRp
bmcgc2V0cyBhIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZGlzdHJpYnV0ZWQgYWNyb3NzIHRoZSBU
ZXh0UnVuLgorLy8gV2ViS2l0IHVzZXMgdGhpcyB0byBqdXN0aWZ5IHRleHQuCit2b2lkIFRleHRS
dW5XYWxrZXI6OnNldFBhZGRpbmcoaW50IHBhZGRpbmcpCit7CisgICAgbV9wYWRkaW5nID0gcGFk
ZGluZzsKKyAgICBpZiAoIW1fcGFkZGluZykKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYg
d2UgaGF2ZSBwYWRkaW5nIHRvIGRpc3RyaWJ1dGUsIHRoZW4gd2UgdHJ5IHRvIGdpdmUgYW4gZXF1
YWwKKyAgICAvLyBhbW91bnQgdG8gZWFjaCBzcGFjZS4gVGhlIGxhc3Qgc3BhY2UgZ2V0cyB0aGUg
c21hbGxlciBhbW91bnQsIGlmCisgICAgLy8gYW55LgorICAgIHVuc2lnbmVkIG51bVdvcmRCcmVh
a3MgPSAwOworICAgIGJvb2wgaXNSVEwgPSBtX2l0ZXJhdGVCYWNrd2FyZHM7CisKKyAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9pdGVtLnN0cmluZ0xlbmd0aDsgaSsrKSB7CisgICAgICAg
IGlmIChpc1dvcmRCcmVhayhpLCBpc1JUTCkpCisgICAgICAgICAgICBudW1Xb3JkQnJlYWtzKys7
CisgICAgfQorCisgICAgaWYgKG51bVdvcmRCcmVha3MpCisgICAgICAgIG1fcGFkUGVyV29yZEJy
ZWFrID0gbV9wYWRkaW5nIC8gbnVtV29yZEJyZWFrczsKKyAgICBlbHNlCisgICAgICAgIG1fcGFk
UGVyV29yZEJyZWFrID0gMDsKK30KKwordm9pZCBUZXh0UnVuV2Fsa2VyOjpyZXNldCgpCit7Cisg
ICAgaWYgKG1faXRlcmF0ZUJhY2t3YXJkcykKKyAgICAgICAgbV9pbmRleE9mTmV4dFNjcmlwdFJ1
biA9IG1fcnVuLmxlbmd0aCgpIC0gMTsKKyAgICBlbHNlCisgICAgICAgIG1faW5kZXhPZk5leHRT
Y3JpcHRSdW4gPSAwOworICAgIG1fb2Zmc2V0WCA9IG1fc3RhcnRpbmdYOworfQorCit2b2lkIFRl
eHRSdW5XYWxrZXI6OnNldEJhY2t3YXJkc0l0ZXJhdGlvbihib29sIGlzQmFja3dhcmRzKQorewor
ICAgIG1faXRlcmF0ZUJhY2t3YXJkcyA9IGlzQmFja3dhcmRzOworICAgIHJlc2V0KCk7Cit9CisK
Ky8vIEFkdmFuY2UgdG8gdGhlIG5leHQgc2NyaXB0IHJ1biwgcmV0dXJuaW5nIGZhbHNlIHdoZW4g
dGhlIGVuZCBvZiB0aGUKKy8vIFRleHRSdW4gaGFzIGJlZW4gcmVhY2hlZC4KK2Jvb2wgVGV4dFJ1
bldhbGtlcjo6bmV4dFNjcmlwdFJ1bigpCit7CisgICAgaWYgKG1faXRlcmF0ZUJhY2t3YXJkcykg
eworICAgICAgICAvLyBJbiByaWdodC10by1sZWZ0IG1vZGUgd2UgbmVlZCB0byByZW5kZXIgdGhl
IHNoYXBlZCBnbHlwaCBiYWNrd2FyZHMgYW5kCisgICAgICAgIC8vIGFsc28gcmVuZGVyIHRoZSBz
Y3JpcHQgcnVucyB0aGVtc2VsdmVzIGJhY2t3YXJkcy4gU28gZ2l2ZW4gYSBUZXh0UnVuOgorICAg
ICAgICAvLyAgICBBQUFBQUFBQ1RUVFRUVFQgICAoQSA9IEFyYWJpYywgQyA9IENvbW1vbiwgVCA9
IFRoYWkpCisgICAgICAgIC8vIHdlIHJlbmRlcjoKKyAgICAgICAgLy8gICAgVFRUVFRUQ0FBQUFB
QUEKKyAgICAgICAgLy8gKGFuZCB0aGUgZ2x5cGhzIGluIGVhY2ggQSwgQyBhbmQgVCBzZWN0aW9u
IGFyZSBiYWNrd2FyZHMgdG9vKQorICAgICAgICBpZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fcHJl
digmbV9udW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9y
dW4ubGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0U2NyaXB0UnVuKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5f
bmV4dCgmbV9udW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwg
bV9ydW4ubGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0U2NyaXB0UnVuKSkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICAgICAvLyBJdCBpcyBhY3R1YWxseSB3cm9uZyB0byBjb25zaWRl
ciBzY3JpcHQgcnVucyBhdCBhbGwgaW4gdGhpcyBjb2RlLgorICAgICAgICAvLyBPdGhlciBXZWJL
aXQgY29kZSAoZS5nLiBNYWMpIHNlZ21lbnRzIGNvbXBsZXggdGV4dCBqdXN0IGJ5IGZpbmRpbmcK
KyAgICAgICAgLy8gdGhlIGxvbmdlc3Qgc3BhbiBvZiB0ZXh0IGNvdmVyZWQgYnkgYSBzaW5nbGUg
Zm9udC4KKyAgICAgICAgLy8gQnV0IHdlIGN1cnJlbnRseSBuZWVkIHRvIGNhbGwgaGJfdXRmMTZf
c2NyaXB0X3J1bl9uZXh0IGFueXdheSB0byBmaWxsCisgICAgICAgIC8vIGluIHRoZSBoYXJmYnV6
eiBkYXRhIHN0cnVjdHVyZXMgdG8gZS5nLiBwaWNrIHRoZSBjb3JyZWN0IHNjcmlwdCdzIHNoYXBl
ci4KKyAgICAgICAgLy8gU28gd2UgYWxsb3cgdGhhdCB0byBydW4gZmlyc3QsIHRoZW4gZG8gYSBz
ZWNvbmQgcGFzcyBvdmVyIHRoZSByYW5nZSBpdAorICAgICAgICAvLyBmb3VuZCBhbmQgdGFrZSB0
aGUgbGFyZ2VzdCBzdWJyZWdpb24gdGhhdCBzdGF5cyB3aXRoaW4gYSBzaW5nbGUgZm9udC4KKyAg
ICAgICAgY29uc3QgRm9udERhdGEqIGdseXBoRGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hh
cmFjdGVyKG1faXRlbS5zdHJpbmdbbV9pdGVtLml0ZW0ucG9zXSwgZmFsc2UsIGZhbHNlKS5mb250
RGF0YTsKKyAgICAgICAgdW5zaWduZWQgZW5kT2ZSdW47CisgICAgICAgIGZvciAoZW5kT2ZSdW4g
PSAxOyBlbmRPZlJ1biA8IG1faXRlbS5pdGVtLmxlbmd0aDsgKytlbmRPZlJ1bikgeworICAgICAg
ICAgICAgY29uc3QgRm9udERhdGEqIG5leHRHbHlwaERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZv
ckNoYXJhY3RlcihtX2l0ZW0uc3RyaW5nW21faXRlbS5pdGVtLnBvcyArIGVuZE9mUnVuXSwgZmFs
c2UsIGZhbHNlKS5mb250RGF0YTsKKyAgICAgICAgICAgIGlmIChuZXh0R2x5cGhEYXRhICE9IGds
eXBoRGF0YSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtX2l0
ZW0uaXRlbS5sZW5ndGggPSBlbmRPZlJ1bjsKKyAgICAgICAgbV9pbmRleE9mTmV4dFNjcmlwdFJ1
biA9IG1faXRlbS5pdGVtLnBvcyArIGVuZE9mUnVuOworICAgIH0KKworICAgIHNldHVwRm9udEZv
clNjcmlwdFJ1bigpOworICAgIHNoYXBlR2x5cGhzKCk7CisgICAgc2V0R2x5cGhYUG9zaXRpb25z
KHJ0bCgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitmbG9hdCBUZXh0UnVuV2Fsa2VyOjp3
aWR0aE9mRnVsbFJ1bigpCit7CisgICAgZmxvYXQgd2lkdGhTdW0gPSAwOworICAgIHdoaWxlIChu
ZXh0U2NyaXB0UnVuKCkpCisgICAgICAgIHdpZHRoU3VtICs9IHdpZHRoKCk7CisKKyAgICByZXR1
cm4gd2lkdGhTdW07Cit9CisKK2NvbnN0IFRleHRSdW4mIFRleHRSdW5XYWxrZXI6OmdldFRleHRS
dW4oY29uc3QgVGV4dFJ1biYgb3JpZ2luYWxSdW4pCit7CisgICAgLy8gTm9ybWFsaXplIHRoZSB0
ZXh0IHJ1biBpbiB0d28gd2F5czoKKyAgICAvLyAxKSBDb252ZXJ0IHRoZSB8b3JpZ2luYWxSdW58
IHRvIE5GQyBub3JtYWxpemVkIGZvcm0gaWYgY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzCisg
ICAgLy8gKFUrMDMwMC4uKSBhcmUgdXNlZCBpbiB0aGUgcnVuLiBUaGlzIGNvbnZlcnNpb24gaXMg
bmVjZXNzYXJ5IHNpbmNlIG1vc3QgT3BlblR5cGUKKyAgICAvLyBmb250cyAoZS5nLiwgQXJpYWwp
IGRvbid0IGhhdmUgc3Vic3RpdHV0aW9uIHJ1bGVzIGZvciB0aGUgZGlhY3JpdGljYWwgbWFya3Mg
aW4KKyAgICAvLyB0aGVpciBHU1VCIHRhYmxlcy4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCB3
ZSBkb24ndCB1c2UgdGhlIGljdTo6Tm9ybWFsaXplcjo6aXNOb3JtYWxpemVkKFVOT1JNX05GQykg
QVBJIGhlcmUgc2luY2UKKyAgICAvLyB0aGUgQVBJIHJldHVybnMgRkFMU0UgKD0gbm90IG5vcm1h
bGl6ZWQpIGZvciBjb21wbGV4IHJ1bnMgdGhhdCBkb24ndCByZXF1aXJlIE5GQworICAgIC8vIG5v
cm1hbGl6YXRpb24gKGUuZy4sIEFyYWJpYyB0ZXh0KS4gVW5sZXNzIHRoZSBydW4gY29udGFpbnMg
dGhlIGRpYWNyaXRpY2FsIG1hcmtzLAorICAgIC8vIEhhcmZidXp6IHdpbGwgZG8gdGhlIHNhbWUg
dGhpbmcgZm9yIHVzIHVzaW5nIHRoZSBHU1VCIHRhYmxlLgorICAgIC8vIDIpIENvbnZlcnQgc3Bh
Y2luZyBjaGFyYWN0ZXJzIGludG8gcGxhaW4gc3BhY2VzLCBhcyBzb21lIGZvbnRzIHdpbGwgcHJv
dmlkZSBnbHlwaHMKKyAgICAvLyBmb3IgY2hhcmFjdGVycyBsaWtlICdcbicgb3RoZXJ3aXNlLgor
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWxSdW4ubGVuZ3RoKCk7ICsraSkgeworICAg
ICAgICBVQ2hhciBjaCA9IG9yaWdpbmFsUnVuW2ldOworICAgICAgICBVQmxvY2tDb2RlIGJsb2Nr
ID0gOjp1YmxvY2tfZ2V0Q29kZShjaCk7CisgICAgICAgIGlmIChibG9jayA9PSBVQkxPQ0tfQ09N
QklOSU5HX0RJQUNSSVRJQ0FMX01BUktTIHx8IChGb250Ojp0cmVhdEFzU3BhY2UoY2gpICYmIGNo
ICE9ICcgJykpCisgICAgICAgICAgICByZXR1cm4gZ2V0Tm9ybWFsaXplZFRleHRSdW4ob3JpZ2lu
YWxSdW4pOworICAgIH0KKyAgICByZXR1cm4gb3JpZ2luYWxSdW47Cit9CisKK2NvbnN0IFRleHRS
dW4mIFRleHRSdW5XYWxrZXI6OmdldE5vcm1hbGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9y
aWdpbmFsUnVuKQoreworICAgIGljdTo6VW5pY29kZVN0cmluZyBub3JtYWxpemVkU3RyaW5nOwor
ICAgIFVFcnJvckNvZGUgZXJyb3IgPSBVX1pFUk9fRVJST1I7CisgICAgaWN1OjpOb3JtYWxpemVy
Ojpub3JtYWxpemUoaWN1OjpVbmljb2RlU3RyaW5nKG9yaWdpbmFsUnVuLmNoYXJhY3RlcnMoKSwg
b3JpZ2luYWxSdW4ubGVuZ3RoKCkpLCBVTk9STV9ORkMsIDAgLyogbm8gb3B0aW9ucyAqLywgbm9y
bWFsaXplZFN0cmluZywgZXJyb3IpOworICAgIGlmIChVX0ZBSUxVUkUoZXJyb3IpKQorICAgICAg
ICByZXR1cm4gb3JpZ2luYWxSdW47CisKKyAgICBtX25vcm1hbGl6ZWRCdWZmZXIuc2V0KG5ldyBV
Q2hhcltub3JtYWxpemVkU3RyaW5nLmxlbmd0aCgpICsgMV0pOworICAgIG5vcm1hbGl6ZWRTdHJp
bmcuZXh0cmFjdChtX25vcm1hbGl6ZWRCdWZmZXIuZ2V0KCksIG5vcm1hbGl6ZWRTdHJpbmcubGVu
Z3RoKCkgKyAxLCBlcnJvcik7CisgICAgQVNTRVJUKFVfU1VDQ0VTUyhlcnJvcikpOworCisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBub3JtYWxpemVkU3RyaW5nLmxlbmd0aCgpOyArK2kpIHsKKyAg
ICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNTcGFjZShtX25vcm1hbGl6ZWRCdWZmZXJbaV0pKQorICAg
ICAgICAgICAgbV9ub3JtYWxpemVkQnVmZmVyW2ldID0gJyAnOworICAgIH0KKworICAgIG1fbm9y
bWFsaXplZFJ1bi5zZXQobmV3IFRleHRSdW4ob3JpZ2luYWxSdW4pKTsKKyAgICBtX25vcm1hbGl6
ZWRSdW4tPnNldFRleHQobV9ub3JtYWxpemVkQnVmZmVyLmdldCgpLCBub3JtYWxpemVkU3RyaW5n
Lmxlbmd0aCgpKTsKKyAgICByZXR1cm4gKm1fbm9ybWFsaXplZFJ1bjsKK30KKwordm9pZCBUZXh0
UnVuV2Fsa2VyOjpzZXR1cEZvbnRGb3JTY3JpcHRSdW4oKQoreworICAgIGNvbnN0IEZvbnREYXRh
KiBmb250RGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKG1faXRlbS5zdHJpbmdb
bV9pdGVtLml0ZW0ucG9zXSwgZmFsc2UsIGZhbHNlKS5mb250RGF0YTsKKyAgICBjb25zdCBGb250
UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250RGF0YS0+Zm9udERhdGFGb3JDaGFyYWN0
ZXIoJyAnKS0+cGxhdGZvcm1EYXRhKCk7CisgICAgbV9pdGVtLmZhY2UgPSBwbGF0Zm9ybURhdGEu
aGFyZmJ1enpGYWNlKCk7CisgICAgdm9pZCogb3BhcXVlUGxhdGZvcm1EYXRhID0gY29uc3RfY2Fz
dDxGb250UGxhdGZvcm1EYXRhKj4oJnBsYXRmb3JtRGF0YSk7CisgICAgbV9pdGVtLmZvbnQtPnVz
ZXJEYXRhID0gb3BhcXVlUGxhdGZvcm1EYXRhOworfQorCitIQl9Gb250UmVjKiBUZXh0UnVuV2Fs
a2VyOjphbGxvY0hhcmZidXp6Rm9udCgpCit7CisgICAgSEJfRm9udFJlYyogZm9udCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8SEJfRm9udFJlYyo+KGZhc3RNYWxsb2Moc2l6ZW9mKEhCX0ZvbnRSZWMpKSk7
CisgICAgbWVtc2V0KGZvbnQsIDAsIHNpemVvZihIQl9Gb250UmVjKSk7CisgICAgZm9udC0+a2xh
c3MgPSAmaGFyZmJ1enpTa2lhQ2xhc3M7CisgICAgZm9udC0+dXNlckRhdGEgPSAwOworICAgIC8v
IFRoZSB2YWx1ZXMgd2hpY2ggaGFyZmJ1enpTa2lhQ2xhc3MgcmV0dXJucyBhcmUgYWxyZWFkeSBz
Y2FsZWQgdG8KKyAgICAvLyBwaXhlbCB1bml0cywgc28gd2UganVzdCBzZXQgYWxsIHRoZXNlIHRv
IG9uZSB0byBkaXNhYmxlIGZ1cnRoZXIKKyAgICAvLyBzY2FsaW5nLgorICAgIGZvbnQtPnhfcHBl
bSA9IDE7CisgICAgZm9udC0+eV9wcGVtID0gMTsKKyAgICBmb250LT54X3NjYWxlID0gMTsKKyAg
ICBmb250LT55X3NjYWxlID0gMTsKKworICAgIHJldHVybiBmb250OworfQorCit2b2lkIFRleHRS
dW5XYWxrZXI6OmRlbGV0ZUdseXBoQXJyYXlzKCkKK3sKKyAgICBkZWxldGVbXSBtX2l0ZW0uZ2x5
cGhzOworICAgIGRlbGV0ZVtdIG1faXRlbS5hdHRyaWJ1dGVzOworICAgIGRlbGV0ZVtdIG1faXRl
bS5hZHZhbmNlczsKKyAgICBkZWxldGVbXSBtX2l0ZW0ub2Zmc2V0czsKKyAgICBkZWxldGVbXSBt
X2dseXBoczE2OworICAgIGRlbGV0ZVtdIG1feFBvc2l0aW9uczsKK30KKwordm9pZCBUZXh0UnVu
V2Fsa2VyOjpjcmVhdGVHbHlwaEFycmF5cyhpbnQgc2l6ZSkKK3sKKyAgICBtX2l0ZW0uZ2x5cGhz
ID0gbmV3IEhCX0dseXBoW3NpemVdOworICAgIG1faXRlbS5hdHRyaWJ1dGVzID0gbmV3IEhCX0ds
eXBoQXR0cmlidXRlc1tzaXplXTsKKyAgICBtX2l0ZW0uYWR2YW5jZXMgPSBuZXcgSEJfRml4ZWRb
c2l6ZV07CisgICAgbV9pdGVtLm9mZnNldHMgPSBuZXcgSEJfRml4ZWRQb2ludFtzaXplXTsKKwor
ICAgIG1fZ2x5cGhzMTYgPSBuZXcgdWludDE2X3Rbc2l6ZV07CisgICAgbV94UG9zaXRpb25zID0g
bmV3IFNrU2NhbGFyW3NpemVdOworCisgICAgbV9pdGVtLm51bV9nbHlwaHMgPSBzaXplOworICAg
IG1fZ2x5cGhzQXJyYXlDYXBhY2l0eSA9IHNpemU7IC8vIFNhdmUgdGhlIEdseXBoQXJyYXlzIHNp
emUuCisgICAgcmVzZXRHbHlwaEFycmF5cygpOworfQorCit2b2lkIFRleHRSdW5XYWxrZXI6OnJl
c2V0R2x5cGhBcnJheXMoKQoreworICAgIGludCBzaXplID0gbV9pdGVtLm51bV9nbHlwaHM7Cisg
ICAgLy8gQWxsIHRoZSB0eXBlcyBoZXJlIGRvbid0IGhhdmUgcG9pbnRlcnMuIEl0IGlzIHNhZmUg
dG8gcmVzZXQgdG8KKyAgICAvLyB6ZXJvIHVubGVzcyBIYXJmYnV6eiBicmVha3MgdGhlIGNvbXBh
dGliaWxpdHkgaW4gdGhlIGZ1dHVyZS4KKyAgICBtZW1zZXQobV9pdGVtLmdseXBocywgMCwgc2l6
ZSAqIHNpemVvZihIQl9HbHlwaCkpOworICAgIG1lbXNldChtX2l0ZW0uYXR0cmlidXRlcywgMCwg
c2l6ZSAqIHNpemVvZihIQl9HbHlwaEF0dHJpYnV0ZXMpKTsKKyAgICBtZW1zZXQobV9pdGVtLmFk
dmFuY2VzLCAwLCBzaXplICogc2l6ZW9mKEhCX0ZpeGVkKSk7CisgICAgbWVtc2V0KG1faXRlbS5v
ZmZzZXRzLCAwLCBzaXplICogc2l6ZW9mKEhCX0ZpeGVkUG9pbnQpKTsKKyAgICBtZW1zZXQobV9n
bHlwaHMxNiwgMCwgc2l6ZSAqIHNpemVvZih1aW50MTZfdCkpOworICAgIG1lbXNldChtX3hQb3Np
dGlvbnMsIDAsIHNpemUgKiBzaXplb2YoU2tTY2FsYXIpKTsKK30KKwordm9pZCBUZXh0UnVuV2Fs
a2VyOjpzaGFwZUdseXBocygpCit7CisgICAgLy8gSEJfU2hhcGVJdGVtKCkgcmVzZXRzIG1faXRl
bS5udW1fZ2x5cGhzLiBJZiB0aGUgcHJldmlvdXMgY2FsbCB0bworICAgIC8vIEhCX1NoYXBlSXRl
bSgpIHVzZWQgbGVzcyBzcGFjZSB0aGFuIHdhcyBhdmFpbGFibGUsIHRoZSBjYXBhY2l0eSBvZgor
ICAgIC8vIHRoZSBhcnJheSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2Yg
bV9pdGVtLm51bV9nbHlwaHMuIAorICAgIC8vIFNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBudW1f
Z2x5cGhzIHRvIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXkuCisgICAgbV9pdGVtLm51bV9nbHlw
aHMgPSBtX2dseXBoc0FycmF5Q2FwYWNpdHk7CisgICAgcmVzZXRHbHlwaEFycmF5cygpOworICAg
IHdoaWxlICghSEJfU2hhcGVJdGVtKCZtX2l0ZW0pKSB7CisgICAgICAgIC8vIFdlIG92ZXJmbG93
ZWQgb3VyIGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4KKyAgICAgICAgLy8gSEJfU2hhcGVJdGVt
IGZpbGxzIGluIG1faXRlbS5udW1fZ2x5cGhzIHdpdGggdGhlIG5lZWRlZCBzaXplLgorICAgICAg
ICBkZWxldGVHbHlwaEFycmF5cygpOworICAgICAgICAvLyBUaGUgfCsgMXwgaGVyZSBpcyBhIHdv
cmthcm91bmQgZm9yIGEgYnVnIGluIEhhcmZidXp6OiB0aGUgS2htZXIKKyAgICAgICAgLy8gc2hh
cGVyIChhdCBsZWFzdCkgY2FuIGZhaWwgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgZ2x5cGggYnVm
ZmVycworICAgICAgICAvLyBhbmQgcmVxdWVzdCAwIGFkZGl0aW9uYWwgZ2x5cGhzOiB0aHJvd2lu
ZyB1cyBpbnRvIGFuIGluZmluaXRlCisgICAgICAgIC8vIGxvb3AuCisgICAgICAgIGNyZWF0ZUds
eXBoQXJyYXlzKG1faXRlbS5udW1fZ2x5cGhzICsgMSk7CisgICAgfQorfQorCit2b2lkIFRleHRS
dW5XYWxrZXI6OnNldEdseXBoWFBvc2l0aW9ucyhib29sIGlzUlRMKQoreworICAgIGRvdWJsZSBw
b3NpdGlvbiA9IDA7CisgICAgLy8gbG9nQ2x1c3RlcnNJbmRleCBpbmRleGVzIGxvZ0NsdXN0ZXJz
IGZvciB0aGUgZmlyc3QgKG9yIGxhc3Qgd2hlbgorICAgIC8vIFJUTCkgY29kZXBvaW50IG9mIHRo
ZSBjdXJyZW50IGdseXBoLiAgRWFjaCB0aW1lIHdlIGFkdmFuY2UgYSBnbHlwaCwKKyAgICAvLyB3
ZSBza2lwIG92ZXIgYWxsIHRoZSBjb2RlcG9pbnRzIHRoYXQgY29udHJpYnV0ZWQgdG8gdGhlIGN1
cnJlbnQKKyAgICAvLyBnbHlwaC4KKyAgICB1bnNpZ25lZCBsb2dDbHVzdGVyc0luZGV4ID0gaXNS
VEwgPyBtX2l0ZW0ubnVtX2dseXBocyAtIDEgOiAwOworCisgICAgZm9yICh1bnNpZ25lZCBpdGVy
ID0gMDsgaXRlciA8IG1faXRlbS5udW1fZ2x5cGhzOyArK2l0ZXIpIHsKKyAgICAgICAgLy8gR2x5
cGhzIGFyZSBzdG9yZWQgaW4gbG9naWNhbCBvcmRlciwgYnV0IGZvciBsYXlvdXQgcHVycG9zZXMg
d2UKKyAgICAgICAgLy8gYWx3YXlzIGdvIGxlZnQgdG8gcmlnaHQuCisgICAgICAgIGludCBpID0g
aXNSVEwgPyBtX2l0ZW0ubnVtX2dseXBocyAtIGl0ZXIgLSAxIDogaXRlcjsKKworICAgICAgICBt
X2dseXBoczE2W2ldID0gbV9pdGVtLmdseXBoc1tpXTsKKyAgICAgICAgZG91YmxlIG9mZnNldFgg
PSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLm9mZnNldHNbaV0ueCk7CisgICAg
ICAgIG1feFBvc2l0aW9uc1tpXSA9IG1fb2Zmc2V0WCArIHBvc2l0aW9uICsgb2Zmc2V0WDsKKwor
ICAgICAgICBkb3VibGUgYWR2YW5jZSA9IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihtX2l0
ZW0uYWR2YW5jZXNbaV0pOworICAgICAgICAvLyBUaGUgZmlyc3QgaGFsZiBvZiB0aGUgY29uanVj
dGlvbiB3b3JrcyBhcm91bmQgdGhlIGNhc2Ugd2hlcmUKKyAgICAgICAgLy8gb3V0cHV0IGdseXBo
cyBhcmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGFueSBjb2RlcG9pbnRzIGJ5IHRoZQorICAgICAgICAv
LyBjbHVzdGVycyBsb2cuCisgICAgICAgIGlmIChsb2dDbHVzdGVyc0luZGV4IDwgbV9pdGVtLml0
ZW0ubGVuZ3RoCisgICAgICAgICAgICAmJiBpc1dvcmRCcmVhayhtX2l0ZW0uaXRlbS5wb3MgKyBs
b2dDbHVzdGVyc0luZGV4LCBpc1JUTCkpIHsKKyAgICAgICAgICAgIGFkdmFuY2UgKz0gbV93b3Jk
U3BhY2luZ0FkanVzdG1lbnQ7CisKKyAgICAgICAgICAgIGlmIChtX3BhZGRpbmcgPiAwKSB7Cisg
ICAgICAgICAgICAgICAgdW5zaWduZWQgdG9QYWQgPSByb3VuZGYobV9wYWRQZXJXb3JkQnJlYWsg
KyBtX3BhZEVycm9yKTsKKyAgICAgICAgICAgICAgICBtX3BhZEVycm9yICs9IG1fcGFkUGVyV29y
ZEJyZWFrIC0gdG9QYWQ7CisKKyAgICAgICAgICAgICAgICBpZiAobV9wYWRkaW5nIDwgdG9QYWQp
CisgICAgICAgICAgICAgICAgICAgIHRvUGFkID0gbV9wYWRkaW5nOworICAgICAgICAgICAgICAg
IG1fcGFkZGluZyAtPSB0b1BhZDsKKyAgICAgICAgICAgICAgICBhZHZhbmNlICs9IHRvUGFkOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2Ugd291bGQgbGlrZSB0byBh
ZGQgbV9sZXR0ZXJTcGFjaW5nIGFmdGVyIGVhY2ggY2x1c3RlciwgYnV0IEkKKyAgICAgICAgLy8g
ZG9uJ3Qga25vdyB3aGVyZSB0aGUgY2x1c3RlciBpbmZvcm1hdGlvbiBpcy4gVGhpcyBpcyB0eXBp
Y2FsbHkKKyAgICAgICAgLy8gZmluZSBmb3IgUm9tYW4gbGFuZ3VhZ2VzLCBidXQgYnJlYWtzIG1v
cmUgY29tcGxleCBsYW5ndWFnZXMKKyAgICAgICAgLy8gdGVycmlibHkuCisgICAgICAgIC8vIGFk
dmFuY2UgKz0gbV9sZXR0ZXJTcGFjaW5nOworCisgICAgICAgIGlmIChpc1JUTCkgeworICAgICAg
ICAgICAgd2hpbGUgKGxvZ0NsdXN0ZXJzSW5kZXggPiAwICYmIGxvZ0NsdXN0ZXJzKClbbG9nQ2x1
c3RlcnNJbmRleF0gPT0gaSkKKyAgICAgICAgICAgICAgICBsb2dDbHVzdGVyc0luZGV4LS07Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAobG9nQ2x1c3RlcnNJbmRleCA8IG1f
aXRlbS5pdGVtLmxlbmd0aCAmJiBsb2dDbHVzdGVycygpW2xvZ0NsdXN0ZXJzSW5kZXhdID09IGkp
CisgICAgICAgICAgICAgICAgbG9nQ2x1c3RlcnNJbmRleCsrOworICAgICAgICB9CisKKyAgICAg
ICAgcG9zaXRpb24gKz0gYWR2YW5jZTsKKyAgICB9CisKKyAgICBtX3BpeGVsV2lkdGggPSBwb3Np
dGlvbjsKKyAgICBtX29mZnNldFggKz0gbV9waXhlbFdpZHRoOworfQorCit2b2lkIFRleHRSdW5X
YWxrZXI6Om1pcnJvckNoYXJhY3RlcnMoVUNoYXIqIGRlc3RpbmF0aW9uLCBjb25zdCBVQ2hhciog
c291cmNlLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIGludCBwb3NpdGlvbiA9IDA7CisgICAg
Ym9vbCBlcnJvciA9IGZhbHNlOworICAgIC8vIEl0ZXJhdGUgY2hhcmFjdGVycyBpbiBzb3VyY2Ug
YW5kIG1pcnJvciBjaGFyYWN0ZXIgaWYgbmVlZGVkLgorICAgIHdoaWxlIChwb3NpdGlvbiA8IGxl
bmd0aCkgeworICAgICAgICBVQ2hhcjMyIGNoYXJhY3RlcjsKKyAgICAgICAgaW50IG5leHRQb3Np
dGlvbiA9IHBvc2l0aW9uOworICAgICAgICBVMTZfTkVYVChzb3VyY2UsIG5leHRQb3NpdGlvbiwg
bGVuZ3RoLCBjaGFyYWN0ZXIpOworICAgICAgICBjaGFyYWN0ZXIgPSB1X2NoYXJNaXJyb3IoY2hh
cmFjdGVyKTsKKyAgICAgICAgVTE2X0FQUEVORChkZXN0aW5hdGlvbiwgcG9zaXRpb24sIGxlbmd0
aCwgY2hhcmFjdGVyLCBlcnJvcik7CisgICAgICAgIEFTU0VSVCghZXJyb3IpOworICAgICAgICBw
b3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKKyAgICB9Cit9CisKIHN0YXRpYyB2b2lkIHNldHVwRm9y
VGV4dFBhaW50aW5nKFNrUGFpbnQqIHBhaW50LCBTa0NvbG9yIGNvbG9yKQogewogICAgIHBhaW50
LT5zZXRUZXh0RW5jb2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsK
</data>
<flag name="review"
          id="60817"
          type_id="1"
          status="+"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>