<?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>15981</bug_id>
          
          <creation_ts>2007-11-13 23:03:22 -0800</creation_ts>
          <short_desc>speed up visited-link code a bit</short_desc>
          <delta_ts>2007-12-07 15:17:00 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Darin Adler">darin</reporter>
          <assigned_to name="Darin Adler">darin</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>61183</commentid>
    <comment_count>0</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-11-13 23:03:22 -0800</bug_when>
    <thetext>I have an old patch with some simple speed-ups to the visited-link code. We can speed it up even more with some further design changes, but this is a small step in the right direction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>62376</commentid>
    <comment_count>1</comment_count>
      <attachid>17530</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-11-26 10:22:53 -0800</bug_when>
    <thetext>Created attachment 17530
first cut, not sure it&apos;s ready for review yet</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63544</commentid>
    <comment_count>2</comment_count>
      <attachid>17763</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-12-06 16:18:15 -0800</bug_when>
    <thetext>Created attachment 17763
patch

I really wanted to do the more complete fix that involves a hash table for things in global history, but this alone is a measurable speed-up so getting this in first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63619</commentid>
    <comment_count>3</comment_count>
      <attachid>17763</attachid>
    <who name="">mitz</who>
    <bug_when>2007-12-07 12:36:44 -0800</bug_when>
    <thetext>Comment on attachment 17763
patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63620</commentid>
    <comment_count>4</comment_count>
      <attachid>17763</attachid>
    <who name="">mitz</who>
    <bug_when>2007-12-07 12:39:35 -0800</bug_when>
    <thetext>Comment on attachment 17763
patch

Either there&apos;s a bug in form submission in TOT or I can&apos;t tell the difference between a + sign and nothingness.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63632</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-12-07 15:17:00 -0800</bug_when>
    <thetext>Committed revision 28536.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17530</attachid>
            <date>2007-11-26 10:22:53 -0800</date>
            <delta_ts>2007-12-06 16:18:15 -0800</delta_ts>
            <desc>first cut, not sure it&apos;s ready for review yet</desc>
            <filename>LinkColoringPatch.txt</filename>
            <type>text/plain</type>
            <size>23430</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyODAzOSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzggQEAKKzIwMDctMTEtMTMgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIC0gaHR0
cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU5ODEKKyAgICAgICAgICBzcGVl
ZCB1cCB2aXNpdGVkLWxpbmsgY29kZSBhIGJpdAorCisgICAgICAgICogYnJpZGdlL0dsb2JhbEhp
c3RvcnkuaDogQ2hhbmdlIGhpc3RvcnlDb250YWlucyB0byB0YWtlIGEgY2hhcmFjdGVyIHBvaW50
ZXIgcGx1cyBsZW5ndGgKKyAgICAgICAgaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBEZXByZWNhdGVk
U3RyaW5nLgorCisgICAgICAgICogYnJpZGdlL21hYy9HbG9iYWxIaXN0b3J5TWFjLm1tOiAoV2Vi
Q29yZTo6aGlzdG9yeUNvbnRhaW5zKTogVXBkYXRlZCBmb3IgYWJvdmUgY2hhbmdlLgorICAgICAg
ICBBbHNvIHJlbW92ZWQgcG9pbnRsZXNzICJmYXN0IExhdGluLTEiIGNhc2UgdGhhdCB3aWxsIG5l
dmVyIGJlIHVzZWQuCisgICAgICAgICogYnJpZGdlL3dpbi9HbG9iYWxIaXN0b3J5V2luLmNwcDog
KFdlYkNvcmU6Omhpc3RvcnlDb250YWlucyk6IERpdHRvLgorICAgICAgICAqIHBsYXRmb3JtL2d0
ay9UZW1wb3JhcnlMaW5rU3R1YnMuY3BwOiAoV2ViQ29yZTo6aGlzdG9yeUNvbnRhaW5zKTogRGl0
dG8uCisgICAgICAgICogcGxhdGZvcm0vd3gvVGVtcG9yYXJ5TGlua1N0dWJzLmNwcDogKFdlYkNv
cmU6Omhpc3RvcnlDb250YWlucyk6IERpdHRvLgorCisgICAgICAgICogY3NzL0NTU1N0eWxlU2Vs
ZWN0b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6ZmluZEhhc2gpOiBBZGRlZC4gSGVscGVyIGZv
ciBjbGVhbnBhdGguCisgICAgICAgIChXZWJDb3JlOjpmaW5kU2xhc2hEb3REb3RTbGFzaCk6IERp
dHRvLgorICAgICAgICAoV2ViQ29yZTo6ZmluZFNsYXNoU2xhc2gpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OmZpbmRTbGFzaERvdFNsYXNoKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpj
bGVhbnBhdGgpOiBDaGFuZ2VkIHRvIHVzZSBmYXN0IGhlbHBlciBmdW5jdGlvbnMgaW5zdGVhZCBv
ZiBzbG93ZXIgZ2VuZXJhbC1wdXJwb3NlCisgICAgICAgIERlcHJlY2F0ZWRTdHJpbmcgZmluZCBm
dW5jdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OmNvbnRhaW5zQ29sb25TbGFzaFNsYXNoKTogQWRk
ZWQuIEhlbHBlciBmb3IgY2hlY2tQc2V1ZG9TdGF0ZS4KKyAgICAgICAgKFdlYkNvcmU6OmNoZWNr
UHNldWRvU3RhdGUpOiBHb3QgcmlkIG9mIHJlZmVyZW5jZSBjb3VudCBjaHVybiBieSB1c2luZyBh
biBBdG9taWNTdHJpbmcqCisgICAgICAgIGluc3RlYWQgb2YgYW4gQXRvbWljU3RyaW5nIGZvciB0
aGUgYXR0cmlidXRlIHZhbHVlLiBDaGFuZ2VkIHRvIHVzZSBmYXN0IGhlbHBlciBmdW5jdGlvbgor
ICAgICAgICBpbnN0ZWFkIG9mIHNsb3dlciBEZXByZWNhdGVkU3RyaW5nOjpjb250YWlucyBmdW5j
dGlvbiwgYW5kIGFsc28gbWFkZSB0aGUgZmFzdCBjYXNlIG5vdAorICAgICAgICBib3RoZXIgYWxs
b2NhdGluZyBhIERlcHJlY2F0ZWRDb25zdFN0cmluZy4KKworICAgICAgICAtIHVucmVsYXRlZCB0
aW55IGNsZWFudXAKKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jZy9TVkdQYWlu
dFNlcnZlckdyYWRpZW50Q2cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6cmVsZWFzZUNhY2hlZFN0
b3BzKTogVXNlIHN0YXRpY19jYXN0IGluc3RlYWQgb2YgcmVpbnRlcnByZXRfY2FzdC4KKyAgICAg
ICAgKFdlYkNvcmU6OmNnR3JhZGllbnRDYWxsYmFjayk6IERpdHRvLgorCiAyMDA3LTExLTI2ICBU
aW1vdGh5IEhhdGNoZXIgIDx0aW1vdGh5QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBi
eSBBZGFtIFJvYmVuLgpJbmRleDogV2ViQ29yZS9icmlkZ2UvR2xvYmFsSGlzdG9yeS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL0dsb2JhbEhpc3RvcnkuaAkocmV2aXNpb24gMjgwMzkp
CisrKyBXZWJDb3JlL2JyaWRnZS9HbG9iYWxIaXN0b3J5LmgJKHdvcmtpbmcgY29weSkKQEAgLTEs
NSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMu
ICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwpAQCAtMjYsMTEgKzI2LDExIEBACiAjaWZuZGVmIEdsb2JhbEhpc3RvcnlfaAogI2RlZmluZSBH
bG9iYWxIaXN0b3J5X2gKIAotbmFtZXNwYWNlIFdlYkNvcmUgeworI2luY2x1ZGUgPHd0Zi91bmlj
b2RlL1VuaWNvZGUuaD4KIAotICAgIGNsYXNzIERlcHJlY2F0ZWRTdHJpbmc7CituYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLSAgICBib29sIGhpc3RvcnlDb250YWlucyhjb25zdCBEZXByZWNhdGVkU3Ry
aW5nJik7CisgICAgYm9vbCBoaXN0b3J5Q29udGFpbnMoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMs
IHVuc2lnbmVkIGxlbmd0aCk7CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIApJbmRleDogV2Vi
Q29yZS9icmlkZ2UvbWFjL0dsb2JhbEhpc3RvcnlNYWMubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9icmlkZ2UvbWFjL0dsb2JhbEhpc3RvcnlNYWMubW0JKHJldmlzaW9uIDI4MDM5KQorKysgV2Vi
Q29yZS9icmlkZ2UvbWFjL0dsb2JhbEhpc3RvcnlNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTI2
LDE3ICsyNiwxNCBAQAogI2ltcG9ydCAiY29uZmlnLmgiCiAjaW1wb3J0ICJHbG9iYWxIaXN0b3J5
LmgiCiAKLSNpbXBvcnQgIkRlcHJlY2F0ZWRTdHJpbmcuaCIKICNpbXBvcnQgIldlYkNvcmVIaXN0
b3J5LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotYm9vbCBoaXN0b3J5Q29udGFpbnMoY29u
c3QgRGVwcmVjYXRlZFN0cmluZyYgcykKK2Jvb2wgaGlzdG9yeUNvbnRhaW5zKGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCiB7CiAgICAgLy8gdGhlIG90aGVyIHNpZGUg
b2YgdGhlIGJyaWRnZSBpcyBjYXJlZnVsIG5vdCB0byB0aHJvdyBleGNlcHRpb25zIGhlcmUKLSAg
ICBpZiAocy5oYXNGYXN0TGF0aW4xKCkpCi0gICAgICAgIHJldHVybiBbW1dlYkNvcmVIaXN0b3J5
IGhpc3RvcnlQcm92aWRlcl0gY29udGFpbnNJdGVtRm9yVVJMTGF0aW4xOnMubGF0aW4xKCkgbGVu
Z3RoOnMubGVuZ3RoKCldOwotICAgIHJldHVybiBbW1dlYkNvcmVIaXN0b3J5IGhpc3RvcnlQcm92
aWRlcl0gY29udGFpbnNJdGVtRm9yVVJMVW5pY29kZTooVW5pQ2hhciAqKXMudW5pY29kZSgpIGxl
bmd0aDpzLmxlbmd0aCgpXTsKKyAgICByZXR1cm4gW1tXZWJDb3JlSGlzdG9yeSBoaXN0b3J5UHJv
dmlkZXJdIGNvbnRhaW5zVVJMOmNoYXJhY3RlcnMgbGVuZ3RoOmxlbmd0aF07CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9HbG9iYWxIaXN0b3J5
V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JyaWRnZS93aW4vR2xvYmFsSGlzdG9yeVdp
bi5jcHAJKHJldmlzaW9uIDI4MDM5KQorKysgV2ViQ29yZS9icmlkZ2Uvd2luL0dsb2JhbEhpc3Rv
cnlXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiwyMCArMjYsMTQgQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJHbG9iYWxIaXN0b3J5LmgiCiAKLSNpbmNsdWRlICJEZXByZWNh
dGVkU3RyaW5nLmgiCiAjaW5jbHVkZSAiV2ViQ29yZUhpc3RvcnkuaCIKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogCi1ib29sIGhpc3RvcnlDb250YWlucyhjb25zdCBEZXByZWNhdGVkU3RyaW5nJiBz
KQorYm9vbCBoaXN0b3J5Q29udGFpbnMoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVk
IGxlbmd0aCkKIHsKLSAgICBpZiAoIVdlYkNvcmVIaXN0b3J5OjpoaXN0b3J5UHJvdmlkZXIoKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGJy
aWRnZSBpcyBjYXJlZnVsIG5vdCB0byB0aHJvdyBleGNlcHRpb25zIGhlcmUKLSAgICBpZiAocy5o
YXNGYXN0TGF0aW4xKCkpCi0gICAgICAgIHJldHVybiBXZWJDb3JlSGlzdG9yeTo6aGlzdG9yeVBy
b3ZpZGVyKCktPmNvbnRhaW5zSXRlbUZvclVSTExhdGluMShzLmxhdGluMSgpLCBzLmxlbmd0aCgp
KTsKLSAgICByZXR1cm4gV2ViQ29yZUhpc3Rvcnk6Omhpc3RvcnlQcm92aWRlcigpLT5jb250YWlu
c0l0ZW1Gb3JVUkxVbmljb2RlKChVQ2hhciopcy51bmljb2RlKCksIHMubGVuZ3RoKCkpOworICAg
IFdlYkNvcmVIaXN0b3J5UHJvdmlkZXIqIHByb3ZpZGVyID0gV2ViQ29yZUhpc3Rvcnk6Omhpc3Rv
cnlQcm92aWRlcigpOworICAgIHJldHVybiBwcm92aWRlciAmJiBwcm92aWRlci0+Y29udGFpbnNJ
dGVtRm9yVVJMVW5pY29kZShjaGFyYWN0ZXJzLCBsZW5ndGgpOwogfQogCiB9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcAkocmV2aXNpb24gMjgwMzkp
CisrKyBXZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MSw2ICsxLDQgQEAKLS8qKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENTUyBpbXBsZW1l
bnRhdGlvbiBmb3IgS0RFLgotICoKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9s
bCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMjAwNC0yMDA1IEFsbGFuIFNhbmRm
ZWxkIEplbnNlbiAoa2RlQGNhcmV3b2xmLmNvbSkKICAqICAgICAgICAgICAoQykgMjAwNiBOaWNo
b2xhcyBTaGFua3MgKHdlYmtpdEBuaWNrc2hhbmtzLmNvbSkKQEAgLTU2NCw3OSArNTYyLDE1MCBA
QCB2b2lkIENTU1N0eWxlU2VsZWN0b3I6OmluaXRGb3JTdHlsZVJlc29sCiAgICAgZm9udERpcnR5
ID0gZmFsc2U7CiB9CiAKLS8vIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9uZSBpbiBrdXJsLmNw
cAotc3RhdGljIHZvaWQgY2xlYW5wYXRoKERlcHJlY2F0ZWRTdHJpbmcgJnBhdGgpCitzdGF0aWMg
aW50IGZpbmRIYXNoKGNvbnN0IERlcHJlY2F0ZWRTdHJpbmcmIHN0cmluZykKK3sKKyAgICBjb25z
dCA6OlVDaGFyKiBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IDo6VUNoYXIqPihzdHJpbmcu
dW5pY29kZSgpKTsKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7CisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChwdHJb
aV0gPT0gJyMnKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsK
K30KKworc3RhdGljIGlubGluZSBpbnQgZmluZFNsYXNoRG90RG90U2xhc2goY29uc3QgRGVwcmVj
YXRlZFN0cmluZyYgc3RyaW5nKQoreworICAgIGNvbnN0IDo6VUNoYXIqIHB0ciA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgOjpVQ2hhcio+KHN0cmluZy51bmljb2RlKCkpOworICAgIHVuc2lnbmVk
IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKKyAgICB1bnNpZ25lZCBsb29wTGltaXQgPSBsZW5n
dGggPCA0ID8gMCA6IGxlbmd0aCAtIDM7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxv
b3BMaW1pdDsgKytpKSB7CisgICAgICAgIGlmIChwdHJbaV0gPT0gJy8nICYmIHB0cltpICsgMV0g
PT0gJy4nICYmIHB0cltpICsgMl0gPT0gJy4nICYmIHB0cltpICsgM10gPT0gJy8nKQorICAgICAg
ICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGlubGlu
ZSBpbnQgZmluZFNsYXNoU2xhc2goY29uc3QgRGVwcmVjYXRlZFN0cmluZyYgc3RyaW5nLCBpbnQg
cG9zaXRpb24pCit7CisgICAgY29uc3QgOjpVQ2hhciogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxj
b25zdCA6OlVDaGFyKj4oc3RyaW5nLnVuaWNvZGUoKSk7CisgICAgdW5zaWduZWQgbGVuZ3RoID0g
c3RyaW5nLmxlbmd0aCgpOworICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0aCA8IDIgPyAw
IDogbGVuZ3RoIC0gMTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBwb3NpdGlvbjsgaSA8IGxvb3BM
aW1pdDsgKytpKSB7CisgICAgICAgIGlmIChwdHJbaV0gPT0gJy8nICYmIHB0cltpICsgMV0gPT0g
Jy8nKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKwor
c3RhdGljIGlubGluZSBpbnQgZmluZFNsYXNoRG90U2xhc2goY29uc3QgRGVwcmVjYXRlZFN0cmlu
ZyYgc3RyaW5nKQoreworICAgIGNvbnN0IDo6VUNoYXIqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgOjpVQ2hhcio+KHN0cmluZy51bmljb2RlKCkpOworICAgIHVuc2lnbmVkIGxlbmd0aCA9
IHN0cmluZy5sZW5ndGgoKTsKKyAgICB1bnNpZ25lZCBsb29wTGltaXQgPSBsZW5ndGggPCAzID8g
MCA6IGxlbmd0aCAtIDI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvb3BMaW1pdDsg
KytpKSB7CisgICAgICAgIGlmIChwdHJbaV0gPT0gJy8nICYmIHB0cltpICsgMV0gPT0gJy4nICYm
IHB0cltpICsgMl0gPT0gJy8nKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJl
dHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgY2xlYW5wYXRoKERlcHJlY2F0ZWRTdHJpbmcmIHBh
dGgpCiB7CiAgICAgaW50IHBvczsKLSAgICB3aGlsZSAoKHBvcyA9IHBhdGguZmluZCgiLy4uLyIp
KSAhPSAtMSkgeworCisgICAgd2hpbGUgKChwb3MgPSBmaW5kU2xhc2hEb3REb3RTbGFzaChwYXRo
KSkgIT0gLTEpIHsKICAgICAgICAgaW50IHByZXYgPSAwOwogICAgICAgICBpZiAocG9zID4gMCkK
LSAgICAgICAgICAgIHByZXYgPSBwYXRoLmZpbmRSZXYoIi8iLCBwb3MgLTEpOworICAgICAgICAg
ICAgcHJldiA9IHBhdGguZmluZFJldigiLyIsIHBvcyAtIDEpOwogICAgICAgICAvLyBkb24ndCBy
ZW1vdmUgdGhlIGhvc3QsIGkuZS4gaHR0cDovL2Zvby5vcmcvLi4vZm9vLmh0bWwKLSAgICAgICAg
aWYgKHByZXYgPCAwIHx8IChwcmV2ID4gMyAmJiBwYXRoLmZpbmRSZXYoIjovLyIsIHByZXYtMSkg
PT0gcHJldi0yKSkKKyAgICAgICAgaWYgKHByZXYgPCAwIHx8IChwcmV2ID4gMyAmJiBwYXRoLmZp
bmRSZXYoIjovLyIsIHByZXYgLSAxKSA9PSBwcmV2IC0gMikpCiAgICAgICAgICAgICBwYXRoLnJl
bW92ZShwb3MsIDMpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICAvLyBtYXRjaGluZyBkaXJl
Y3RvcnkgZm91bmQgPwotICAgICAgICAgICAgcGF0aC5yZW1vdmUocHJldiwgcG9zLSBwcmV2ICsg
Myk7CisgICAgICAgICAgICBwYXRoLnJlbW92ZShwcmV2LCBwb3MgLSBwcmV2ICsgMyk7CiAgICAg
fQotICAgIHBvcyA9IDA7Ci0gICAgCisKICAgICAvLyBEb24ndCByZW1vdmUgIi8vIiBmcm9tIGFu
IGFuY2hvciBpZGVudGlmaWVyLiAtcmp3CiAgICAgLy8gU2V0IHJlZlBvcyB0byAtMiB0byBtZWFu
ICJJIGhhdmVuJ3QgbG9va2VkIGZvciB0aGUgYW5jaG9yIHlldCIuCiAgICAgLy8gV2UgZG9uJ3Qg
d2FudCB0byB3YXN0ZSBhIGZ1bmN0aW9uIGNhbGwgb24gdGhlIHNlYXJjaCBmb3IgdGhlIHRoZSBh
bmNob3IKICAgICAvLyBpbiB0aGUgdmFzdCBtYWpvcml0eSBvZiBjYXNlcyB3aGVyZSB0aGVyZSBp
cyBubyAiLy8iIGluIHRoZSBwYXRoLgorICAgIHBvcyA9IDA7CiAgICAgaW50IHJlZlBvcyA9IC0y
OwotICAgIHdoaWxlICgocG9zID0gcGF0aC5maW5kKCIvLyIsIHBvcykpICE9IC0xKSB7CisgICAg
d2hpbGUgKChwb3MgPSBmaW5kU2xhc2hTbGFzaChwYXRoLCBwb3MpKSAhPSAtMSkgewogICAgICAg
ICBpZiAocmVmUG9zID09IC0yKQotICAgICAgICAgICAgcmVmUG9zID0gcGF0aC5maW5kKCIjIik7
CisgICAgICAgICAgICByZWZQb3MgPSBmaW5kSGFzaChwYXRoKTsKICAgICAgICAgaWYgKHJlZlBv
cyA+IDAgJiYgcG9zID49IHJlZlBvcykKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAKLSAg
ICAgICAgaWYgKHBvcyA9PSAwIHx8IHBhdGhbcG9zLTFdICE9ICc6JykKKyAgICAgICAgaWYgKHBv
cyA9PSAwIHx8IHBhdGhbcG9zIC0gMV0gIT0gJzonKQogICAgICAgICAgICAgcGF0aC5yZW1vdmUo
cG9zLCAxKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcG9zICs9IDI7CiAgICAgfQotICAg
IHdoaWxlICgocG9zID0gcGF0aC5maW5kKCIvLi8iKSkgIT0gLTEpCisKKyAgICAvLyBGSVhNRTog
V2UgZG9uJ3Qgd2FudCB0byByZW1vdmUgIi8uLyIgZnJvbSBhbiBhbmNob3IgaWRlbnRpZmllciBl
aXRoZXIuCisgICAgd2hpbGUgKChwb3MgPSBmaW5kU2xhc2hEb3RTbGFzaChwYXRoKSkgIT0gLTEp
CiAgICAgICAgIHBhdGgucmVtb3ZlKHBvcywgMik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBj
b250YWluc0NvbG9uU2xhc2hTbGFzaChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQg
bGVuZ3RoKQoreworICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0aCA8IDMgPyAwIDogbGVu
Z3RoIC0gMjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbG9vcExpbWl0OyArK2kpCisg
ICAgICAgIGlmIChjaGFyYWN0ZXJzW2ldID09ICc6JyAmJiBjaGFyYWN0ZXJzW2kgKyAxXSA9PSAn
LycgJiYgY2hhcmFjdGVyc1tpICsgMl0gPT0gJy8nKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgdm9pZCBjaGVja1BzZXVkb1N0YXRlKEVs
ZW1lbnQgKmUsIGJvb2wgY2hlY2tWaXNpdGVkID0gdHJ1ZSkKIHsKICAgICBpZiAoIWUtPmlzTGlu
aygpKSB7CiAgICAgICAgIHBzZXVkb1N0YXRlID0gUHNldWRvTm9uZTsKICAgICAgICAgcmV0dXJu
OwogICAgIH0KLSAgICAKLSAgICBBdG9taWNTdHJpbmcgYXR0cjsKKworICAgIGNvbnN0IEF0b21p
Y1N0cmluZyogYXR0cjsKICAgICBpZiAoZS0+aXNIVE1MRWxlbWVudCgpKQotICAgICAgICBhdHRy
ID0gZS0+Z2V0QXR0cmlidXRlKGhyZWZBdHRyKTsKKyAgICAgICAgYXR0ciA9ICZlLT5nZXRBdHRy
aWJ1dGUoaHJlZkF0dHIpOwogI2lmIEVOQUJMRShTVkcpCiAgICAgZWxzZSBpZiAoZS0+aXNTVkdF
bGVtZW50KCkpCi0gICAgICAgIGF0dHIgPSBlLT5nZXRBdHRyaWJ1dGUoWExpbmtOYW1lczo6aHJl
ZkF0dHIpOworICAgICAgICBhdHRyID0gJmUtPmdldEF0dHJpYnV0ZShYTGlua05hbWVzOjpocmVm
QXR0cik7CiAjZW5kaWYKLSAgICBpZiAoYXR0ci5pc051bGwoKSkgeworICAgIGVsc2UgewogICAg
ICAgICBwc2V1ZG9TdGF0ZSA9IFBzZXVkb05vbmU7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0g
ICAgCisKKyAgICBpZiAoYXR0ci0+aXNOdWxsKCkpIHsKKyAgICAgICAgcHNldWRvU3RhdGUgPSBQ
c2V1ZG9Ob25lOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgaWYgKCFjaGVja1Zpc2l0
ZWQpIHsKICAgICAgICAgcHNldWRvU3RhdGUgPSBQc2V1ZG9BbnlMaW5rOwogICAgICAgICByZXR1
cm47CiAgICAgfQotICAgIAotICAgIERlcHJlY2F0ZWRDb25zdFN0cmluZyBjdShyZWludGVycHJl
dF9jYXN0PGNvbnN0IERlcHJlY2F0ZWRDaGFyKj4oYXR0ci5jaGFyYWN0ZXJzKCkpLCBhdHRyLmxl
bmd0aCgpKTsKLSAgICBEZXByZWNhdGVkU3RyaW5nIHUgPSBjdS5zdHJpbmcoKTsKLSAgICBpZiAo
IXUuY29udGFpbnMoIjovLyIpKSB7Ci0gICAgICAgIGlmICh1WzBdID09ICcvJykKLSAgICAgICAg
ICAgIHUucHJlcGVuZChjdXJyZW50RW5jb2RlZFVSTC0+aG9zdCk7Ci0gICAgICAgIGVsc2UgaWYg
KHVbMF0gPT0gJyMnKQotICAgICAgICAgICAgdS5wcmVwZW5kKGN1cnJlbnRFbmNvZGVkVVJMLT5m
aWxlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdS5wcmVwZW5kKGN1cnJlbnRFbmNvZGVk
VVJMLT5wYXRoKTsKLSAgICAgICAgY2xlYW5wYXRoKHUpOworCisgICAgY29uc3QgVUNoYXIqIGNo
YXJhY3RlcnMgPSBhdHRyLT5jaGFyYWN0ZXJzKCk7CisgICAgdW5zaWduZWQgbGVuZ3RoID0gYXR0
ci0+bGVuZ3RoKCk7CisKKyAgICBpZiAoY29udGFpbnNDb2xvblNsYXNoU2xhc2goY2hhcmFjdGVy
cywgbGVuZ3RoKSkgeworICAgICAgICAvLyBGSVhNRTogU3RyYW5nZSB0byBub3QgY2xlYW4gdGhl
IHBhdGgganVzdCBiZWFjYXVzZSBpdCBoYXMgIjovLyIgaW4gaXQuCisgICAgICAgIHBzZXVkb1N0
YXRlID0gaGlzdG9yeUNvbnRhaW5zKGNoYXJhY3RlcnMsIGxlbmd0aCkgPyBQc2V1ZG9WaXNpdGVk
IDogUHNldWRvTGluazsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBwc2V1ZG9TdGF0ZSA9
IGhpc3RvcnlDb250YWlucyh1KSA/IFBzZXVkb1Zpc2l0ZWQgOiBQc2V1ZG9MaW5rOworCisgICAg
RGVwcmVjYXRlZENvbnN0U3RyaW5nIGN1KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRGVwcmVjYXRl
ZENoYXIqPihjaGFyYWN0ZXJzKSwgbGVuZ3RoKTsKKyAgICBEZXByZWNhdGVkU3RyaW5nIHUgPSBj
dS5zdHJpbmcoKTsKKyAgICBpZiAobGVuZ3RoICYmIGNoYXJhY3RlcnNbMF0gPT0gJy8nKQorICAg
ICAgICB1LnByZXBlbmQoY3VycmVudEVuY29kZWRVUkwtPmhvc3QpOworICAgIGVsc2UgaWYgKGxl
bmd0aCAmJiBjaGFyYWN0ZXJzWzBdID09ICcjJykKKyAgICAgICAgdS5wcmVwZW5kKGN1cnJlbnRF
bmNvZGVkVVJMLT5maWxlKTsKKyAgICBlbHNlCisgICAgICAgIHUucHJlcGVuZChjdXJyZW50RW5j
b2RlZFVSTC0+cGF0aCk7CisgICAgY2xlYW5wYXRoKHUpOworICAgIHBzZXVkb1N0YXRlID0gaGlz
dG9yeUNvbnRhaW5zKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIqPih1LnVuaWNvZGUoKSks
IHUubGVuZ3RoKCkpCisgICAgICAgID8gUHNldWRvVmlzaXRlZCA6IFBzZXVkb0xpbms7CiB9CiAK
ICNpZmRlZiBTVFlMRV9TSEFSSU5HX1NUQVRTCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3N2Zy9jZy9TVkdQYWludFNlcnZlckdyYWRpZW50Q2cuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NnL1NWR1BhaW50U2VydmVyR3JhZGllbnRDZy5j
cHAJKHJldmlzaW9uIDI4MDM5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2cv
U1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudENnLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsMTIgKzQy
LDEyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogc3RhdGljIHZvaWQgcmVsZWFzZUNhY2hlZFN0
b3BzKHZvaWQqIGluZm8pCiB7Ci0gICAgcmVpbnRlcnByZXRfY2FzdDxTVkdQYWludFNlcnZlckdy
YWRpZW50OjpTaGFyZWRTdG9wQ2FjaGUqPihpbmZvKS0+ZGVyZWYoKTsKKyAgICBzdGF0aWNfY2Fz
dDxTVkdQYWludFNlcnZlckdyYWRpZW50OjpTaGFyZWRTdG9wQ2FjaGUqPihpbmZvKS0+ZGVyZWYo
KTsKIH0KIAogc3RhdGljIHZvaWQgY2dHcmFkaWVudENhbGxiYWNrKHZvaWQqIGluZm8sIGNvbnN0
IENHRmxvYXQqIGluVmFsdWVzLCBDR0Zsb2F0KiBvdXRDb2xvcikKIHsKLSAgICBTVkdQYWludFNl
cnZlckdyYWRpZW50OjpTaGFyZWRTdG9wQ2FjaGUqIHN0b3BzQ2FjaGUgPSByZWludGVycHJldF9j
YXN0PFNWR1BhaW50U2VydmVyR3JhZGllbnQ6OlNoYXJlZFN0b3BDYWNoZSo+KGluZm8pOworICAg
IFNWR1BhaW50U2VydmVyR3JhZGllbnQ6OlNoYXJlZFN0b3BDYWNoZSogc3RvcHNDYWNoZSA9IHN0
YXRpY19jYXN0PFNWR1BhaW50U2VydmVyR3JhZGllbnQ6OlNoYXJlZFN0b3BDYWNoZSo+KGluZm8p
OwogICAgIAogICAgIFNWR1BhaW50U2VydmVyR3JhZGllbnQ6OlF1YXJ0ekdyYWRpZW50U3RvcCog
c3RvcHMgPSBzdG9wc0NhY2hlLT5tX3N0b3BzLmRhdGEoKTsKICAgICAgICAgCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2d0ay9UZW1wb3JhcnlMaW5rU3R1YnMuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3RrL1RlbXBvcmFyeUxpbmtTdHVicy5jcHAJKHJldmlzaW9uIDI4MDM5
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ndGsvVGVtcG9yYXJ5TGlua1N0dWJzLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNTYsNyArNTYsNyBAQCBWZWN0b3I8Y2hhcj4gbG9hZFJlc291cmNlSW50b0Fy
cmF5KGNvbnN0CiAvKiBDb21wbGV0ZWx5IGVtcHR5IHN0dWJzIChtb3N0bHkgdG8gYWxsb3cgRFJU
IHRvIHJ1bik6ICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKiovCiAKLWJvb2wgV2ViQ29yZTo6aGlzdG9yeUNvbnRhaW5zKERlcHJlY2F0
ZWRTdHJpbmcgY29uc3QmKSB7IHJldHVybiBmYWxzZTsgfQorYm9vbCBXZWJDb3JlOjpoaXN0b3J5
Q29udGFpbnMoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCkgeyByZXR1cm4gZmFsc2U7IH0KIAogUGx1
Z2luSW5mbyogUGx1Z0luSW5mb1N0b3JlOjpjcmVhdGVQbHVnaW5JbmZvRm9yUGx1Z2luQXRJbmRl
eCh1bnNpZ25lZCkgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gMDt9CiB1bnNpZ25lZCBQbHVn
SW5JbmZvU3RvcmU6OnBsdWdpbkNvdW50KCkgY29uc3QgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1
cm4gMDsgfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZUhpc3RvcnkuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJDb3JlSGlzdG9yeS5oCShyZXZpc2lv
biAyODAzOSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkNvcmVIaXN0b3J5LmgJKHdvcmtp
bmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAzIEFwcGxl
IENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAy
MDAzLCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwpAQCAtMjQsMTMgKzI0LDEwIEBACiAgKi8KIAogQHByb3RvY29sIFdl
YkNvcmVIaXN0b3J5UHJvdmlkZXIgPE5TT2JqZWN0PgotLSAoQk9PTCljb250YWluc0l0ZW1Gb3JV
UkxMYXRpbjE6KGNvbnN0IGNoYXIgKilsYXRpbjEgbGVuZ3RoOih1bnNpZ25lZClsZW5ndGg7Ci0t
IChCT09MKWNvbnRhaW5zSXRlbUZvclVSTFVuaWNvZGU6KGNvbnN0IFVuaUNoYXIgKil1bmljb2Rl
IGxlbmd0aDoodW5zaWduZWQpbGVuZ3RoOworLSAoQk9PTCljb250YWluc1VSTDooY29uc3QgVW5p
Q2hhciopdW5pY29kZSBsZW5ndGg6KHVuc2lnbmVkKWxlbmd0aDsKIEBlbmQKIAogQGludGVyZmFj
ZSBXZWJDb3JlSGlzdG9yeSA6IE5TT2JqZWN0Ci17Ci19CiAKICsgKHZvaWQpc2V0SGlzdG9yeVBy
b3ZpZGVyOihpZDxXZWJDb3JlSGlzdG9yeVByb3ZpZGVyPiloOwogKyAoaWQ8V2ViQ29yZUhpc3Rv
cnlQcm92aWRlcj4paGlzdG9yeVByb3ZpZGVyOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4v
Rm9udFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRm9udFdpbi5j
cHAJKHJldmlzaW9uIDI4MDM5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vRm9udFdpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTUwLDE5ICs1MCw2IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhH
cmFwaGljc0NvbnRleHQqIGcKICAgICB1aW50MzJfdCBvbGRGb250U21vb3RoaW5nU3R5bGUgPSB3
a1NldEZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQpOwogCiAgICAgY29uc3QgRm9udFBsYXRm
b3JtRGF0YSYgcGxhdGZvcm1EYXRhID0gZm9udC0+cGxhdGZvcm1EYXRhKCk7Ci0gICAgLy9OU0Zv
bnQqIGRyYXdGb250OwotICAgIC8vaWYgKFtnQ29udGV4dCBpc0RyYXdpbmdUb1NjcmVlbl0pIHsK
LSAgICAvLyAgICBkcmF3Rm9udCA9IFtwbGF0Zm9ybURhdGEuZm9udCBzY3JlZW5Gb250XTsKLSAg
ICAvLyAgICBpZiAoZHJhd0ZvbnQgIT0gcGxhdGZvcm1EYXRhLmZvbnQpCi0gICAgLy8gICAgICAg
IC8vIFdlIGFyZSBnZXR0aW5nIHRoaXMgaW4gdG9vIG1hbnkgcGxhY2VzICgzNDA2NDExKTsgdXNl
IEVSUk9SIHNvIGl0IG9ubHkgcHJpbnRzIG9uIGRlYnVnIHZlcnNpb25zIGZvciBub3cuIChXZSBz
aG91bGQgZGVidWcgdGhpcyBhbHNvLCBldmVudHVhbGx5KS4KLSAgICAvLyAgICAgICAgTE9HX0VS
Uk9SKCJBdHRlbXB0aW5nIHRvIHNldCBub24tc2NyZWVuIGZvbnQgKCVAKSB3aGVuIGRyYXdpbmcg
dG8gc2NyZWVuLiAgVXNpbmcgc2NyZWVuIGZvbnQgYW55d2F5LCBtYXkgcmVzdWx0IGluIGluY29y
cmVjdCBtZXRyaWNzLiIsCi0gICAgLy8gICAgICAgICAgICBbW1twbGF0Zm9ybURhdGEuZm9udCBm
b250RGVzY3JpcHRvcl0gZm9udEF0dHJpYnV0ZXNdIG9iamVjdEZvcktleTpOU0ZvbnROYW1lQXR0
cmlidXRlXSk7Ci0gICAgLy99IGVsc2UgewotICAgIC8vICAgIGRyYXdGb250ID0gW3BsYXRmb3Jt
RGF0YS5mb250IHByaW50ZXJGb250XTsKLSAgICAvLyAgICBpZiAoZHJhd0ZvbnQgIT0gcGxhdGZv
cm1EYXRhLmZvbnQpCi0gICAgLy8gICAgICAgIE5TTG9nKEAiQXR0ZW1wdGluZyB0byBzZXQgbm9u
LXByaW50ZXIgZm9udCAoJUApIHdoZW4gcHJpbnRpbmcuICBVc2luZyBwcmludGVyIGZvbnQgYW55
d2F5LCBtYXkgcmVzdWx0IGluIGluY29ycmVjdCBtZXRyaWNzLiIsCi0gICAgLy8gICAgICAgICAg
ICBbW1twbGF0Zm9ybURhdGEuZm9udCBmb250RGVzY3JpcHRvcl0gZm9udEF0dHJpYnV0ZXNdIG9i
amVjdEZvcktleTpOU0ZvbnROYW1lQXR0cmlidXRlXSk7Ci0gICAgLy99CiAKICAgICBDR0NvbnRl
eHRTZXRGb250KGNnQ29udGV4dCwgcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKIApAQCAtODMsNyAr
NzAsNiBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBnCiAgICAgCiAg
ICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChjZ0NvbnRleHQsIG1hdHJpeCk7CiAKLSAgICAvL3dr
U2V0Q0dGb250UmVuZGVyaW5nTW9kZShjZ0NvbnRleHQsIGRyYXdGb250KTsKICAgICBDR0NvbnRl
eHRTZXRGb250U2l6ZShjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5zaXplKCkpOwogICAgIENHQ29u
dGV4dFNldFRleHRQb3NpdGlvbihjZ0NvbnRleHQsIHBvaW50LngoKSwgcG9pbnQueSgpKTsKICAg
ICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIu
Z2x5cGhzKGZyb20pLCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5cGhzKTsKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL1dlYkNvcmVIaXN0b3J5LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vV2ViQ29yZUhpc3RvcnkuaAkocmV2aXNpb24gMjgwMzkpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9XZWJDb3JlSGlzdG9yeS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDUgKzEsNSBAQAogLyoKLSogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAg
LTMyLDEzICszMiwxMiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIFdlYkNvcmVIaXN0
b3J5UHJvdmlkZXIgewogcHVibGljOgotICAgIHZpcnR1YWwgYm9vbCBjb250YWluc0l0ZW1Gb3JV
UkxMYXRpbjEoY29uc3QgY2hhciogbGF0aW4xLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKSA9IDA7Ci0g
ICAgdmlydHVhbCBib29sIGNvbnRhaW5zSXRlbUZvclVSTFVuaWNvZGUoY29uc3QgVUNoYXIqIHVu
aWNvZGUsIHVuc2lnbmVkIGludCBsZW5ndGgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgY29udGFp
bnNVUkwoY29uc3QgVUNoYXIqIHVuaWNvZGUsIHVuc2lnbmVkIGxlbmd0aCkgPSAwOwogfTsKIAog
Y2xhc3MgV2ViQ29yZUhpc3RvcnkgewogcHVibGljOgotICAgIHN0YXRpYyB2b2lkIHNldEhpc3Rv
cnlQcm92aWRlcihXZWJDb3JlSGlzdG9yeVByb3ZpZGVyKiBoKTsKKyAgICBzdGF0aWMgdm9pZCBz
ZXRIaXN0b3J5UHJvdmlkZXIoV2ViQ29yZUhpc3RvcnlQcm92aWRlciopOwogICAgIHN0YXRpYyBX
ZWJDb3JlSGlzdG9yeVByb3ZpZGVyKiBoaXN0b3J5UHJvdmlkZXIoKTsKIH07CiAKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vd3gvVGVtcG9yYXJ5TGlua1N0dWJzLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL3d4L1RlbXBvcmFyeUxpbmtTdHVicy5jcHAJKHJldmlzaW9uIDI4MDM5
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93eC9UZW1wb3JhcnlMaW5rU3R1YnMuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xMTIsNyArMTEyLDcgQEAgc3RhdGljIFdlYkNvcmU6OkN1cnNvciBsb2NhbEN1
cnNvcjsKIGNvbnN0IFdlYkNvcmU6OkN1cnNvciYgV2ViQ29yZTo6bW92ZUN1cnNvcigpIHsgcmV0
dXJuIGxvY2FsQ3Vyc29yOyB9CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKLSAgICBib29sIGhpc3Rv
cnlDb250YWlucyhEZXByZWNhdGVkU3RyaW5nIGNvbnN0JikgeyByZXR1cm4gZmFsc2U7IH0KKyAg
ICBib29sIGhpc3RvcnlDb250YWlucyhjb25zdCBVQ2hhciosIHVuc2lnbmVkKSB7IHJldHVybiBm
YWxzZTsgfQogfQogCiB2b2lkIFdlYkNvcmU6OmZpbmRXb3JkQm91bmRhcnkoVUNoYXIgY29uc3Qq
IHN0cixpbnQgbGVuLGludCBwb3NpdGlvbixpbnQqIHN0YXJ0LCBpbnQqIGVuZCkgeyBub3RJbXBs
ZW1lbnRlZCgpOyAqc3RhcnQ9cG9zaXRpb247ICplbmQ9cG9zaXRpb247IH0KSW5kZXg6IFdlYktp
dC9tYWMvSGlzdG9yeS9XZWJIaXN0b3J5Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9tYWMvSGlz
dG9yeS9XZWJIaXN0b3J5Lm1tCShyZXZpc2lvbiAyODAzOSkKKysrIFdlYktpdC9tYWMvSGlzdG9y
eS9XZWJIaXN0b3J5Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw2IEBACiAjaW1wb3J0
IDxXZWJDb3JlL1dlYkNvcmVIaXN0b3J5Lmg+CiAjaW1wb3J0IDx3dGYvVmVjdG9yLmg+CiAKLQog
TlNTdHJpbmcgKldlYkhpc3RvcnlJdGVtc0FkZGVkTm90aWZpY2F0aW9uID0gQCJXZWJIaXN0b3J5
SXRlbXNBZGRlZE5vdGlmaWNhdGlvbiI7CiBOU1N0cmluZyAqV2ViSGlzdG9yeUl0ZW1zUmVtb3Zl
ZE5vdGlmaWNhdGlvbiA9IEAiV2ViSGlzdG9yeUl0ZW1zUmVtb3ZlZE5vdGlmaWNhdGlvbiI7CiBO
U1N0cmluZyAqV2ViSGlzdG9yeUFsbEl0ZW1zUmVtb3ZlZE5vdGlmaWNhdGlvbiA9IEAiV2ViSGlz
dG9yeUFsbEl0ZW1zUmVtb3ZlZE5vdGlmaWNhdGlvbiI7CkBAIC01MCw4ICs0OSw2IEBAIE5TU3Ry
aW5nICpXZWJIaXN0b3J5SXRlbXNLZXkgPSBAIldlYkhpc3QKIAogc3RhdGljIFdlYkhpc3Rvcnkg
Kl9zaGFyZWRIaXN0b3J5ID0gbmlsOwogCi0KLQogTlNTdHJpbmcgKkZpbGVWZXJzaW9uS2V5ID0g
QCJXZWJIaXN0b3J5RmlsZVZlcnNpb24iOwogTlNTdHJpbmcgKkRhdGVzQXJyYXlLZXkgPSBAIldl
Ykhpc3RvcnlEYXRlcyI7CiAKQEAgLTYxNiw2MiArNjEzLDkgQEAgc3RhdGljIGlubGluZSBib29s
IG1hdGNoVW5pY29kZUxldHRlcihVbgogICAgIHJldHVybiAoYyB8IDB4MjApID09IGxvd2VyY2Fz
ZUxldHRlcjsKIH0KIAotI2RlZmluZSBCVUZGRVJfU0laRSAyMDQ4Ci0KLS0gKEJPT0wpY29udGFp
bnNJdGVtRm9yVVJMTGF0aW4xOihjb25zdCBjaGFyICopbGF0aW4xIGxlbmd0aDoodW5zaWduZWQp
bGVuZ3RoCi17Ci0gICAgY29uc3QgY2hhciAqbGF0aW4xU3RyID0gbGF0aW4xOwotICAgIGNoYXIg
c3RhdGljU3RyQnVmZmVyW0JVRkZFUl9TSVpFXTsKLSAgICBjaGFyICpzdHJCdWZmZXIgPSBOVUxM
OwotICAgIEJPT0wgbmVlZFRvQWRkU2xhc2ggPSBGQUxTRTsKLQotICAgIGlmIChsZW5ndGggPj0g
NiAmJgotICAgICAgICBtYXRjaExldHRlcihsYXRpbjFbMF0sICdoJykgJiYKLSAgICAgICAgbWF0
Y2hMZXR0ZXIobGF0aW4xWzFdLCAndCcpICYmCi0gICAgICAgIG1hdGNoTGV0dGVyKGxhdGluMVsy
XSwgJ3QnKSAmJgotICAgICAgICBtYXRjaExldHRlcihsYXRpbjFbM10sICdwJykgJiYKLSAgICAg
ICAgKGxhdGluMVs0XSA9PSAnOicgCi0gICAgICAgICB8fCAobWF0Y2hMZXR0ZXIobGF0aW4xWzRd
LCAncycpICYmIGxhdGluMVs1XSA9PSAnOicpKSkgewotICAgICAgICBpbnQgcG9zID0gbGF0aW4x
WzRdID09ICc6JyA/IDUgOiA2OwotICAgICAgICAvLyBza2lwIHBvc3NpYmxlIGluaXRpYWwgdHdv
IHNsYXNoZXMKLSAgICAgICAgaWYgKGxhdGluMVtwb3NdID09ICcvJyAmJiBsYXRpbjFbcG9zICsg
MV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICBwb3MgKz0gMjsKLSAgICAgICAgfQotCi0gICAgICAg
IGNoYXIgKm5leHRTbGFzaCA9IHN0cmNocihsYXRpbjEgKyBwb3MsICcvJyk7Ci0gICAgICAgIGlm
IChuZXh0U2xhc2ggPT0gTlVMTCkgewotICAgICAgICAgICAgbmVlZFRvQWRkU2xhc2ggPSBUUlVF
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZWRUb0FkZFNsYXNoKSB7Ci0gICAgICAg
IGlmIChsZW5ndGggKyAxIDw9IEJVRkZFUl9TSVpFKSB7Ci0gICAgICAgICAgICBzdHJCdWZmZXIg
PSBzdGF0aWNTdHJCdWZmZXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdHJCdWZm
ZXIgPSAoY2hhciopbWFsbG9jKGxlbmd0aCArIDIpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNw
eShzdHJCdWZmZXIsIGxhdGluMSwgbGVuZ3RoICsgMSk7Ci0gICAgICAgIHN0ckJ1ZmZlcltsZW5n
dGhdID0gJy8nOwotICAgICAgICBzdHJCdWZmZXJbbGVuZ3RoKzFdID0gJ1wwJzsKLSAgICAgICAg
bGVuZ3RoKys7Ci0KLSAgICAgICAgbGF0aW4xU3RyID0gc3RyQnVmZmVyOwotICAgIH0KLQotICAg
IENGU3RyaW5nUmVmIHN0ciA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoTlVMTCwg
bGF0aW4xU3RyLCBrQ0ZTdHJpbmdFbmNvZGluZ1dpbmRvd3NMYXRpbjEsIGtDRkFsbG9jYXRvck51
bGwpOwotICAgIEJPT0wgcmVzdWx0ID0gW2hpc3RvcnkgY29udGFpbnNJdGVtRm9yVVJMU3RyaW5n
OihpZClzdHJdOwotICAgIENGUmVsZWFzZShzdHIpOwotCi0gICAgaWYgKHN0ckJ1ZmZlciAhPSBz
dGF0aWNTdHJCdWZmZXIpIHsKLSAgICAgICAgZnJlZShzdHJCdWZmZXIpOwotICAgIH0KLQotICAg
IHJldHVybiByZXN1bHQ7Ci19Ci0KICNkZWZpbmUgVU5JQ09ERV9CVUZGRVJfU0laRSAxMDI0CiAK
LS0gKEJPT0wpY29udGFpbnNJdGVtRm9yVVJMVW5pY29kZTooY29uc3QgVW5pQ2hhciAqKXVuaWNv
ZGUgbGVuZ3RoOih1bnNpZ25lZClsZW5ndGgKKy0gKEJPT0wpY29udGFpbnNVUkw6KGNvbnN0IFVu
aUNoYXIgKil1bmljb2RlIGxlbmd0aDoodW5zaWduZWQpbGVuZ3RoCiB7CiAgICAgY29uc3QgVW5p
Q2hhciAqdW5pY29kZVN0ciA9IHVuaWNvZGU7CiAgICAgVW5pQ2hhciBzdGF0aWNTdHJCdWZmZXJb
VU5JQ09ERV9CVUZGRVJfU0laRV07CkluZGV4OiBXZWJLaXQvd2luL1dlYkhpc3RvcnkuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViSGlzdG9yeS5jcHAJKHJldmlzaW9uIDI4MDM5KQor
KysgV2ViS2l0L3dpbi9XZWJIaXN0b3J5LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIsOCArNTIs
NyBAQCBwdWJsaWM6CiAgICAgX1dlYkNvcmVIaXN0b3J5UHJvdmlkZXIoSVdlYkhpc3RvcnkqIGhp
c3RvcnkpOwogICAgIH5fV2ViQ29yZUhpc3RvcnlQcm92aWRlcigpOwogCi0gICAgdmlydHVhbCBi
b29sIGNvbnRhaW5zSXRlbUZvclVSTExhdGluMShjb25zdCBjaGFyKiBsYXRpbjEsIHVuc2lnbmVk
IGludCBsZW5ndGgpOwotICAgIHZpcnR1YWwgYm9vbCBjb250YWluc0l0ZW1Gb3JVUkxVbmljb2Rl
KGNvbnN0IFVDaGFyKiB1bmljb2RlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKKyAgICB2aXJ0dWFs
IGJvb2wgY29udGFpbnNJdGVtKGNvbnN0IFVDaGFyKiB1bmljb2RlLCB1bnNpZ25lZCBpbnQgbGVu
Z3RoKTsKIAogcHJpdmF0ZToKICAgICBJV2ViSGlzdG9yeSogbV9oaXN0b3J5OwpAQCAtODkyLDY5
ICs4OTEsNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgbWF0Y2hVbmljb2RlTGV0dGVyKFVuCiAgICAg
cmV0dXJuIChjIHwgMHgyMCkgPT0gbG93ZXJjYXNlTGV0dGVyOwogfQogCi1ib29sIF9XZWJDb3Jl
SGlzdG9yeVByb3ZpZGVyOjpjb250YWluc0l0ZW1Gb3JVUkxMYXRpbjEoY29uc3QgY2hhciogbGF0
aW4xLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQotewotICAgIGNvbnN0IGludCBidWZmZXJTaXplID0g
MjA0ODsKLSAgICBjb25zdCBjaGFyICpsYXRpbjFTdHIgPSBsYXRpbjE7Ci0gICAgY2hhciBzdGF0
aWNTdHJCdWZmZXJbYnVmZmVyU2l6ZV07Ci0gICAgY2hhciAqc3RyQnVmZmVyID0gMDsKLSAgICBi
b29sIG5lZWRUb0FkZFNsYXNoID0gZmFsc2U7Ci0KLSAgICBpZiAobGVuZ3RoID49IDYgJiYKLSAg
ICAgICAgbWF0Y2hMZXR0ZXIobGF0aW4xWzBdLCAnaCcpICYmCi0gICAgICAgIG1hdGNoTGV0dGVy
KGxhdGluMVsxXSwgJ3QnKSAmJgotICAgICAgICBtYXRjaExldHRlcihsYXRpbjFbMl0sICd0Jykg
JiYKLSAgICAgICAgbWF0Y2hMZXR0ZXIobGF0aW4xWzNdLCAncCcpICYmCi0gICAgICAgIChsYXRp
bjFbNF0gPT0gJzonIAotICAgICAgICB8fCAobWF0Y2hMZXR0ZXIobGF0aW4xWzRdLCAncycpICYm
IGxhdGluMVs1XSA9PSAnOicpKSkgewotICAgICAgICAgICAgaW50IHBvcyA9IGxhdGluMVs0XSA9
PSAnOicgPyA1IDogNjsKLSAgICAgICAgICAgIC8vIHNraXAgcG9zc2libGUgaW5pdGlhbCB0d28g
c2xhc2hlcwotICAgICAgICAgICAgaWYgKGxhdGluMVtwb3NdID09ICcvJyAmJiBsYXRpbjFbcG9z
ICsgMV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgcG9zICs9IDI7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5leHRTbGFzaCA9IHN0cmNocihsYXRpbjEgKyBw
b3MsICcvJyk7Ci0gICAgICAgICAgICBpZiAoIW5leHRTbGFzaCkKLSAgICAgICAgICAgICAgICBu
ZWVkVG9BZGRTbGFzaCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG5lZWRUb0FkZFNsYXNoKSB7
Ci0gICAgICAgIGlmIChsZW5ndGggKyAxIDw9IGJ1ZmZlclNpemUpCi0gICAgICAgICAgICBzdHJC
dWZmZXIgPSBzdGF0aWNTdHJCdWZmZXI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0ckJ1
ZmZlciA9IChjaGFyKiltYWxsb2MobGVuZ3RoICsgMik7Ci0gICAgICAgIG1lbWNweShzdHJCdWZm
ZXIsIGxhdGluMSwgbGVuZ3RoICsgMSk7Ci0gICAgICAgIHN0ckJ1ZmZlcltsZW5ndGhdID0gJy8n
OwotICAgICAgICBzdHJCdWZmZXJbbGVuZ3RoKzFdID0gJ1wwJzsKLSAgICAgICAgbGVuZ3RoKys7
Ci0KLSAgICAgICAgbGF0aW4xU3RyID0gc3RyQnVmZmVyOwotICAgIH0KLQotICAgIGlmICghbV9o
aXN0b3J5UHJpdmF0ZSkgewotICAgICAgICBpZiAoU1VDQ0VFREVEKG1faGlzdG9yeS0+UXVlcnlJ
bnRlcmZhY2UoSUlEX0lXZWJIaXN0b3J5UHJpdmF0ZSwgKHZvaWQqKikmbV9oaXN0b3J5UHJpdmF0
ZSkpKSB7Ci0gICAgICAgICAgICAvLyBkb24ndCBob2xkIGEgcmVmIC0gd2UncmUgb3duZWQgYnkg
SVdlYkhpc3RvcnkvSVdlYkhpc3RvcnlQcml2YXRlCi0gICAgICAgICAgICBtX2hpc3RvcnlQcml2
YXRlLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc3RyQnVm
ZmVyICE9IHN0YXRpY1N0ckJ1ZmZlcikKLSAgICAgICAgICAgICAgICBmcmVlKHN0ckJ1ZmZlcik7
Ci0gICAgICAgICAgICBtX2hpc3RvcnlQcml2YXRlID0gMDsKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBDRlN0cmluZ1JlZiBzdHIgPSBDRlN0
cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KE5VTEwsIGxhdGluMVN0ciwga0NGU3RyaW5nRW5j
b2RpbmdXaW5kb3dzTGF0aW4xLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKLSAgICBCT09MIHJlc3VsdCA9
IEZBTFNFOwotICAgIG1faGlzdG9yeVByaXZhdGUtPmNvbnRhaW5zSXRlbUZvclVSTFN0cmluZygo
dm9pZCopc3RyLCAmcmVzdWx0KTsKLSAgICBDRlJlbGVhc2Uoc3RyKTsKLQotICAgIGlmIChzdHJC
dWZmZXIgIT0gc3RhdGljU3RyQnVmZmVyKQotICAgICAgICBmcmVlKHN0ckJ1ZmZlcik7Ci0KLSAg
ICByZXR1cm4gISFyZXN1bHQ7Ci19Ci0KLWJvb2wgX1dlYkNvcmVIaXN0b3J5UHJvdmlkZXI6OmNv
bnRhaW5zSXRlbUZvclVSTFVuaWNvZGUoY29uc3QgVUNoYXIqIHVuaWNvZGUsIHVuc2lnbmVkIGlu
dCBsZW5ndGgpCitib29sIF9XZWJDb3JlSGlzdG9yeVByb3ZpZGVyOjpjb250YWluc0l0ZW0oY29u
c3QgVUNoYXIqIHVuaWNvZGUsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAgICAgY29uc3QgaW50
IGJ1ZmZlclNpemUgPSAxMDI0OwogICAgIGNvbnN0IFVDaGFyICp1bmljb2RlU3RyID0gdW5pY29k
ZTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17763</attachid>
            <date>2007-12-06 16:18:15 -0800</date>
            <delta_ts>2007-12-07 12:39:35 -0800</delta_ts>
            <desc>patch</desc>
            <filename>LinkColoringPatch.txt</filename>
            <type>text/plain</type>
            <size>24822</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyODUwMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzggQEAKKzIwMDctMTItMDYgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIC0gaHR0
cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU5ODEKKyAgICAgICAgICBzcGVl
ZCB1cCB2aXNpdGVkLWxpbmsgY29kZSBhIGJpdAorCisgICAgICAgICogYnJpZGdlL0dsb2JhbEhp
c3RvcnkuaDogQ2hhbmdlIGhpc3RvcnlDb250YWlucyB0byB0YWtlIGEgY2hhcmFjdGVyIHBvaW50
ZXIgcGx1cyBsZW5ndGgKKyAgICAgICAgaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBEZXByZWNhdGVk
U3RyaW5nLgorCisgICAgICAgICogYnJpZGdlL21hYy9HbG9iYWxIaXN0b3J5TWFjLm1tOiAoV2Vi
Q29yZTo6aGlzdG9yeUNvbnRhaW5zKTogVXBkYXRlZCBmb3IgYWJvdmUgY2hhbmdlLgorICAgICAg
ICBBbHNvIHJlbW92ZXMgcG9pbnRsZXNzICJmYXN0IExhdGluLTEiIGNhc2UgdGhhdCB3YXMgbmV2
ZXIgdXNlZC4KKyAgICAgICAgKiBicmlkZ2Uvd2luL0dsb2JhbEhpc3RvcnlXaW4uY3BwOiAoV2Vi
Q29yZTo6aGlzdG9yeUNvbnRhaW5zKTogRGl0dG8uCisgICAgICAgICogcGxhdGZvcm0vZ3RrL1Rl
bXBvcmFyeUxpbmtTdHVicy5jcHA6IChXZWJDb3JlOjpoaXN0b3J5Q29udGFpbnMpOiBEaXR0by4K
KyAgICAgICAgKiBwbGF0Zm9ybS93eC9UZW1wb3JhcnlMaW5rU3R1YnMuY3BwOiAoV2ViQ29yZTo6
aGlzdG9yeUNvbnRhaW5zKTogRGl0dG8uCisKKyAgICAgICAgKiBjc3MvQ1NTU3R5bGVTZWxlY3Rv
ci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpmaW5kSGFzaCk6IEFkZGVkLiBIZWxwZXIgZm9yIGNs
ZWFucGF0aC4KKyAgICAgICAgKFdlYkNvcmU6OmZpbmRTbGFzaERvdERvdFNsYXNoKTogRGl0dG8u
CisgICAgICAgIChXZWJDb3JlOjpmaW5kU2xhc2hTbGFzaCk6IERpdHRvLgorICAgICAgICAoV2Vi
Q29yZTo6ZmluZFNsYXNoRG90U2xhc2gpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OmNsZWFu
cGF0aCk6IENoYW5nZWQgdG8gdXNlIGZhc3QgaGVscGVyIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIHNs
b3dlciBnZW5lcmFsLXB1cnBvc2UKKyAgICAgICAgRGVwcmVjYXRlZFN0cmluZyBmaW5kIGZ1bmN0
aW9uLgorICAgICAgICAoV2ViQ29yZTo6Y29udGFpbnNDb2xvblNsYXNoU2xhc2gpOiBBZGRlZC4g
SGVscGVyIGZvciBjaGVja1BzZXVkb1N0YXRlLgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQc2V1
ZG9TdGF0ZSk6IEdvdCByaWQgb2YgcmVmZXJlbmNlIGNvdW50IGNodXJuIGJ5IHVzaW5nIGFuIEF0
b21pY1N0cmluZyoKKyAgICAgICAgaW5zdGVhZCBvZiBhbiBBdG9taWNTdHJpbmcgZm9yIHRoZSBh
dHRyaWJ1dGUgdmFsdWUuIENoYW5nZWQgdG8gdXNlIGZhc3QgaGVscGVyIGZ1bmN0aW9uCisgICAg
ICAgIGluc3RlYWQgb2Ygc2xvd2VyIERlcHJlY2F0ZWRTdHJpbmc6OmNvbnRhaW5zIGZ1bmN0aW9u
LCBhbmQgYWxzbyBtYWRlIHRoZSBmYXN0IGNhc2Ugbm90CisgICAgICAgIGJvdGhlciBhbGxvY2F0
aW5nIGEgRGVwcmVjYXRlZENvbnN0U3RyaW5nLgorCisgICAgICAgIC0gdW5yZWxhdGVkIHRpbnkg
Y2xlYW51cAorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NnL1NWR1BhaW50U2Vy
dmVyR3JhZGllbnRDZy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpyZWxlYXNlQ2FjaGVkU3RvcHMp
OiBVc2Ugc3RhdGljX2Nhc3QgaW5zdGVhZCBvZiByZWludGVycHJldF9jYXN0LgorICAgICAgICAo
V2ViQ29yZTo6Y2dHcmFkaWVudENhbGxiYWNrKTogRGl0dG8uCisKIDIwMDctMTItMDYgIFN0ZXZl
IEZhbGtlbmJ1cmcgIDxzZmFsa2VuQGFwcGxlLmNvbT4KIAogICAgICAgICA8cmRhcjovL3Byb2Js
ZW0vNTYxNDI1Nz4gQ3Jhc2ggaW4gdGltZXIgLyBoYXNodGFibGUgY29kZSBkdWUgdG8gdW5jYXVn
aHQgZXhjZXB0aW9uCkluZGV4OiBXZWJDb3JlL2JyaWRnZS9HbG9iYWxIaXN0b3J5LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9icmlkZ2UvR2xvYmFsSGlzdG9yeS5oCShyZXZpc2lvbiAyODUwMSkK
KysrIFdlYkNvcmUvYnJpZGdlL0dsb2JhbEhpc3RvcnkuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC0yNiwxMSArMjYsMTEgQEAKICNpZm5kZWYgR2xvYmFsSGlzdG9yeV9oCiAjZGVmaW5lIEds
b2JhbEhpc3RvcnlfaAogCi1uYW1lc3BhY2UgV2ViQ29yZSB7CisjaW5jbHVkZSA8d3RmL3VuaWNv
ZGUvVW5pY29kZS5oPgogCi0gICAgY2xhc3MgRGVwcmVjYXRlZFN0cmluZzsKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotICAgIGJvb2wgaGlzdG9yeUNvbnRhaW5zKGNvbnN0IERlcHJlY2F0ZWRTdHJp
bmcmKTsKKyAgICBib29sIGhpc3RvcnlDb250YWlucyhjb25zdCBVQ2hhciogY2hhcmFjdGVycywg
dW5zaWduZWQgbGVuZ3RoKTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCkluZGV4OiBXZWJD
b3JlL2JyaWRnZS9tYWMvR2xvYmFsSGlzdG9yeU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2JyaWRnZS9tYWMvR2xvYmFsSGlzdG9yeU1hYy5tbQkocmV2aXNpb24gMjg1MDEpCisrKyBXZWJD
b3JlL2JyaWRnZS9tYWMvR2xvYmFsSGlzdG9yeU1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMjYs
MTcgKzI2LDE0IEBACiAjaW1wb3J0ICJjb25maWcuaCIKICNpbXBvcnQgIkdsb2JhbEhpc3Rvcnku
aCIKIAotI2ltcG9ydCAiRGVwcmVjYXRlZFN0cmluZy5oIgogI2ltcG9ydCAiV2ViQ29yZUhpc3Rv
cnkuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1ib29sIGhpc3RvcnlDb250YWlucyhjb25z
dCBEZXByZWNhdGVkU3RyaW5nJiBzKQorYm9vbCBoaXN0b3J5Q29udGFpbnMoY29uc3QgVUNoYXIq
IGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKIHsKICAgICAvLyB0aGUgb3RoZXIgc2lkZSBv
ZiB0aGUgYnJpZGdlIGlzIGNhcmVmdWwgbm90IHRvIHRocm93IGV4Y2VwdGlvbnMgaGVyZQotICAg
IGlmIChzLmhhc0Zhc3RMYXRpbjEoKSkKLSAgICAgICAgcmV0dXJuIFtbV2ViQ29yZUhpc3Rvcnkg
aGlzdG9yeVByb3ZpZGVyXSBjb250YWluc0l0ZW1Gb3JVUkxMYXRpbjE6cy5sYXRpbjEoKSBsZW5n
dGg6cy5sZW5ndGgoKV07Ci0gICAgcmV0dXJuIFtbV2ViQ29yZUhpc3RvcnkgaGlzdG9yeVByb3Zp
ZGVyXSBjb250YWluc0l0ZW1Gb3JVUkxVbmljb2RlOihVbmlDaGFyICopcy51bmljb2RlKCkgbGVu
Z3RoOnMubGVuZ3RoKCldOworICAgIHJldHVybiBbW1dlYkNvcmVIaXN0b3J5IGhpc3RvcnlQcm92
aWRlcl0gY29udGFpbnNVUkw6Y2hhcmFjdGVycyBsZW5ndGg6bGVuZ3RoXTsKIH0KIAogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0dsb2JhbEhpc3RvcnlX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9HbG9iYWxIaXN0b3J5V2lu
LmNwcAkocmV2aXNpb24gMjg1MDEpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vR2xvYmFsSGlzdG9y
eVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDIwICsyNiwxNCBAQAogI2luY2x1ZGUgImNv
bmZpZy5oIgogI2luY2x1ZGUgIkdsb2JhbEhpc3RvcnkuaCIKIAotI2luY2x1ZGUgIkRlcHJlY2F0
ZWRTdHJpbmcuaCIKICNpbmNsdWRlICJXZWJDb3JlSGlzdG9yeS5oIgogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKLWJvb2wgaGlzdG9yeUNvbnRhaW5zKGNvbnN0IERlcHJlY2F0ZWRTdHJpbmcmIHMp
Citib29sIGhpc3RvcnlDb250YWlucyhjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQg
bGVuZ3RoKQogewotICAgIGlmICghV2ViQ29yZUhpc3Rvcnk6Omhpc3RvcnlQcm92aWRlcigpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgYnJp
ZGdlIGlzIGNhcmVmdWwgbm90IHRvIHRocm93IGV4Y2VwdGlvbnMgaGVyZQotICAgIGlmIChzLmhh
c0Zhc3RMYXRpbjEoKSkKLSAgICAgICAgcmV0dXJuIFdlYkNvcmVIaXN0b3J5OjpoaXN0b3J5UHJv
dmlkZXIoKS0+Y29udGFpbnNJdGVtRm9yVVJMTGF0aW4xKHMubGF0aW4xKCksIHMubGVuZ3RoKCkp
OwotICAgIHJldHVybiBXZWJDb3JlSGlzdG9yeTo6aGlzdG9yeVByb3ZpZGVyKCktPmNvbnRhaW5z
SXRlbUZvclVSTFVuaWNvZGUoKFVDaGFyKilzLnVuaWNvZGUoKSwgcy5sZW5ndGgoKSk7CisgICAg
V2ViQ29yZUhpc3RvcnlQcm92aWRlciogcHJvdmlkZXIgPSBXZWJDb3JlSGlzdG9yeTo6aGlzdG9y
eVByb3ZpZGVyKCk7CisgICAgcmV0dXJuIHByb3ZpZGVyICYmIHByb3ZpZGVyLT5jb250YWluc0l0
ZW1Gb3JVUkxVbmljb2RlKGNoYXJhY3RlcnMsIGxlbmd0aCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwCShyZXZpc2lvbiAyODUwMSkK
KysrIFdlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDYgKzEsNCBAQAotLyoqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ1NTIGltcGxlbWVu
dGF0aW9uIGZvciBLREUuCi0gKgorLyoKICAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xs
IChrbm9sbEBrZGUub3JnKQogICogICAgICAgICAgIChDKSAyMDA0LTIwMDUgQWxsYW4gU2FuZGZl
bGQgSmVuc2VuIChrZGVAY2FyZXdvbGYuY29tKQogICogICAgICAgICAgIChDKSAyMDA2IE5pY2hv
bGFzIFNoYW5rcyAod2Via2l0QG5pY2tzaGFua3MuY29tKQpAQCAtNTY5LDc5ICs1NjcsMTUwIEBA
IHZvaWQgQ1NTU3R5bGVTZWxlY3Rvcjo6aW5pdEZvclN0eWxlUmVzb2wKICAgICBmb250RGlydHkg
PSBmYWxzZTsKIH0KIAotLy8gbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgb25lIGluIGt1cmwuY3Bw
Ci1zdGF0aWMgdm9pZCBjbGVhbnBhdGgoRGVwcmVjYXRlZFN0cmluZyAmcGF0aCkKK3N0YXRpYyBp
bnQgZmluZEhhc2goY29uc3QgRGVwcmVjYXRlZFN0cmluZyYgc3RyaW5nKQoreworICAgIGNvbnN0
IDo6VUNoYXIqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgOjpVQ2hhcio+KHN0cmluZy51
bmljb2RlKCkpOworICAgIHVuc2lnbmVkIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaWYgKHB0cltp
XSA9PSAnIycpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOwor
fQorCitzdGF0aWMgaW5saW5lIGludCBmaW5kU2xhc2hEb3REb3RTbGFzaChjb25zdCBEZXByZWNh
dGVkU3RyaW5nJiBzdHJpbmcpCit7CisgICAgY29uc3QgOjpVQ2hhciogcHRyID0gcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCA6OlVDaGFyKj4oc3RyaW5nLnVuaWNvZGUoKSk7CisgICAgdW5zaWduZWQg
bGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOworICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0
aCA8IDQgPyAwIDogbGVuZ3RoIC0gMzsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbG9v
cExpbWl0OyArK2kpIHsKKyAgICAgICAgaWYgKHB0cltpXSA9PSAnLycgJiYgcHRyW2kgKyAxXSA9
PSAnLicgJiYgcHRyW2kgKyAyXSA9PSAnLicgJiYgcHRyW2kgKyAzXSA9PSAnLycpCisgICAgICAg
ICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5l
IGludCBmaW5kU2xhc2hTbGFzaChjb25zdCBEZXByZWNhdGVkU3RyaW5nJiBzdHJpbmcsIGludCBw
b3NpdGlvbikKK3sKKyAgICBjb25zdCA6OlVDaGFyKiBwdHIgPSByZWludGVycHJldF9jYXN0PGNv
bnN0IDo6VUNoYXIqPihzdHJpbmcudW5pY29kZSgpKTsKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBz
dHJpbmcubGVuZ3RoKCk7CisgICAgdW5zaWduZWQgbG9vcExpbWl0ID0gbGVuZ3RoIDwgMiA/IDAg
OiBsZW5ndGggLSAxOworICAgIGZvciAodW5zaWduZWQgaSA9IHBvc2l0aW9uOyBpIDwgbG9vcExp
bWl0OyArK2kpIHsKKyAgICAgICAgaWYgKHB0cltpXSA9PSAnLycgJiYgcHRyW2kgKyAxXSA9PSAn
LycpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitz
dGF0aWMgaW5saW5lIGludCBmaW5kU2xhc2hEb3RTbGFzaChjb25zdCBEZXByZWNhdGVkU3RyaW5n
JiBzdHJpbmcpCit7CisgICAgY29uc3QgOjpVQ2hhciogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxj
b25zdCA6OlVDaGFyKj4oc3RyaW5nLnVuaWNvZGUoKSk7CisgICAgdW5zaWduZWQgbGVuZ3RoID0g
c3RyaW5nLmxlbmd0aCgpOworICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0aCA8IDMgPyAw
IDogbGVuZ3RoIC0gMjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbG9vcExpbWl0OyAr
K2kpIHsKKyAgICAgICAgaWYgKHB0cltpXSA9PSAnLycgJiYgcHRyW2kgKyAxXSA9PSAnLicgJiYg
cHRyW2kgKyAyXSA9PSAnLycpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0
dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnBhdGgoRGVwcmVjYXRlZFN0cmluZyYgcGF0
aCkKIHsKICAgICBpbnQgcG9zOwotICAgIHdoaWxlICgocG9zID0gcGF0aC5maW5kKCIvLi4vIikp
ICE9IC0xKSB7CisKKyAgICB3aGlsZSAoKHBvcyA9IGZpbmRTbGFzaERvdERvdFNsYXNoKHBhdGgp
KSAhPSAtMSkgewogICAgICAgICBpbnQgcHJldiA9IDA7CiAgICAgICAgIGlmIChwb3MgPiAwKQot
ICAgICAgICAgICAgcHJldiA9IHBhdGguZmluZFJldigiLyIsIHBvcyAtMSk7CisgICAgICAgICAg
ICBwcmV2ID0gcGF0aC5maW5kUmV2KCIvIiwgcG9zIC0gMSk7CiAgICAgICAgIC8vIGRvbid0IHJl
bW92ZSB0aGUgaG9zdCwgaS5lLiBodHRwOi8vZm9vLm9yZy8uLi9mb28uaHRtbAotICAgICAgICBp
ZiAocHJldiA8IDAgfHwgKHByZXYgPiAzICYmIHBhdGguZmluZFJldigiOi8vIiwgcHJldi0xKSA9
PSBwcmV2LTIpKQorICAgICAgICBpZiAocHJldiA8IDAgfHwgKHByZXYgPiAzICYmIHBhdGguZmlu
ZFJldigiOi8vIiwgcHJldiAtIDEpID09IHByZXYgLSAyKSkKICAgICAgICAgICAgIHBhdGgucmVt
b3ZlKHBvcywgMyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIC8vIG1hdGNoaW5nIGRpcmVj
dG9yeSBmb3VuZCA/Ci0gICAgICAgICAgICBwYXRoLnJlbW92ZShwcmV2LCBwb3MtIHByZXYgKyAz
KTsKKyAgICAgICAgICAgIHBhdGgucmVtb3ZlKHByZXYsIHBvcyAtIHByZXYgKyAzKTsKICAgICB9
Ci0gICAgcG9zID0gMDsKLSAgICAKKwogICAgIC8vIERvbid0IHJlbW92ZSAiLy8iIGZyb20gYW4g
YW5jaG9yIGlkZW50aWZpZXIuIC1yancKICAgICAvLyBTZXQgcmVmUG9zIHRvIC0yIHRvIG1lYW4g
IkkgaGF2ZW4ndCBsb29rZWQgZm9yIHRoZSBhbmNob3IgeWV0Ii4KICAgICAvLyBXZSBkb24ndCB3
YW50IHRvIHdhc3RlIGEgZnVuY3Rpb24gY2FsbCBvbiB0aGUgc2VhcmNoIGZvciB0aGUgdGhlIGFu
Y2hvcgogICAgIC8vIGluIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhc2VzIHdoZXJlIHRoZXJlIGlz
IG5vICIvLyIgaW4gdGhlIHBhdGguCisgICAgcG9zID0gMDsKICAgICBpbnQgcmVmUG9zID0gLTI7
Ci0gICAgd2hpbGUgKChwb3MgPSBwYXRoLmZpbmQoIi8vIiwgcG9zKSkgIT0gLTEpIHsKKyAgICB3
aGlsZSAoKHBvcyA9IGZpbmRTbGFzaFNsYXNoKHBhdGgsIHBvcykpICE9IC0xKSB7CiAgICAgICAg
IGlmIChyZWZQb3MgPT0gLTIpCi0gICAgICAgICAgICByZWZQb3MgPSBwYXRoLmZpbmQoIiMiKTsK
KyAgICAgICAgICAgIHJlZlBvcyA9IGZpbmRIYXNoKHBhdGgpOwogICAgICAgICBpZiAocmVmUG9z
ID4gMCAmJiBwb3MgPj0gcmVmUG9zKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIAotICAg
ICAgICBpZiAocG9zID09IDAgfHwgcGF0aFtwb3MtMV0gIT0gJzonKQorICAgICAgICBpZiAocG9z
ID09IDAgfHwgcGF0aFtwb3MgLSAxXSAhPSAnOicpCiAgICAgICAgICAgICBwYXRoLnJlbW92ZShw
b3MsIDEpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBwb3MgKz0gMjsKICAgICB9Ci0gICAg
d2hpbGUgKChwb3MgPSBwYXRoLmZpbmQoIi8uLyIpKSAhPSAtMSkKKworICAgIC8vIEZJWE1FOiBX
ZSBkb24ndCB3YW50IHRvIHJlbW92ZSAiLy4vIiBmcm9tIGFuIGFuY2hvciBpZGVudGlmaWVyIGVp
dGhlci4KKyAgICB3aGlsZSAoKHBvcyA9IGZpbmRTbGFzaERvdFNsYXNoKHBhdGgpKSAhPSAtMSkK
ICAgICAgICAgcGF0aC5yZW1vdmUocG9zLCAyKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGNv
bnRhaW5zQ29sb25TbGFzaFNsYXNoKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBs
ZW5ndGgpCit7CisgICAgdW5zaWduZWQgbG9vcExpbWl0ID0gbGVuZ3RoIDwgMyA/IDAgOiBsZW5n
dGggLSAyOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsb29wTGltaXQ7ICsraSkKKyAg
ICAgICAgaWYgKGNoYXJhY3RlcnNbaV0gPT0gJzonICYmIGNoYXJhY3RlcnNbaSArIDFdID09ICcv
JyAmJiBjaGFyYWN0ZXJzW2kgKyAyXSA9PSAnLycpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyB2b2lkIGNoZWNrUHNldWRvU3RhdGUoRWxl
bWVudCAqZSwgYm9vbCBjaGVja1Zpc2l0ZWQgPSB0cnVlKQogewogICAgIGlmICghZS0+aXNMaW5r
KCkpIHsKICAgICAgICAgcHNldWRvU3RhdGUgPSBQc2V1ZG9Ob25lOwogICAgICAgICByZXR1cm47
CiAgICAgfQotICAgIAotICAgIEF0b21pY1N0cmluZyBhdHRyOworCisgICAgY29uc3QgQXRvbWlj
U3RyaW5nKiBhdHRyOwogICAgIGlmIChlLT5pc0hUTUxFbGVtZW50KCkpCi0gICAgICAgIGF0dHIg
PSBlLT5nZXRBdHRyaWJ1dGUoaHJlZkF0dHIpOworICAgICAgICBhdHRyID0gJmUtPmdldEF0dHJp
YnV0ZShocmVmQXR0cik7CiAjaWYgRU5BQkxFKFNWRykKICAgICBlbHNlIGlmIChlLT5pc1NWR0Vs
ZW1lbnQoKSkKLSAgICAgICAgYXR0ciA9IGUtPmdldEF0dHJpYnV0ZShYTGlua05hbWVzOjpocmVm
QXR0cik7CisgICAgICAgIGF0dHIgPSAmZS0+Z2V0QXR0cmlidXRlKFhMaW5rTmFtZXM6OmhyZWZB
dHRyKTsKICNlbmRpZgotICAgIGlmIChhdHRyLmlzTnVsbCgpKSB7CisgICAgZWxzZSB7CiAgICAg
ICAgIHBzZXVkb1N0YXRlID0gUHNldWRvTm9uZTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAg
ICAKKworICAgIGlmIChhdHRyLT5pc051bGwoKSkgeworICAgICAgICBwc2V1ZG9TdGF0ZSA9IFBz
ZXVkb05vbmU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAoIWNoZWNrVmlzaXRl
ZCkgewogICAgICAgICBwc2V1ZG9TdGF0ZSA9IFBzZXVkb0FueUxpbms7CiAgICAgICAgIHJldHVy
bjsKICAgICB9Ci0gICAgCi0gICAgRGVwcmVjYXRlZENvbnN0U3RyaW5nIGN1KHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgRGVwcmVjYXRlZENoYXIqPihhdHRyLmNoYXJhY3RlcnMoKSksIGF0dHIubGVu
Z3RoKCkpOwotICAgIERlcHJlY2F0ZWRTdHJpbmcgdSA9IGN1LnN0cmluZygpOwotICAgIGlmICgh
dS5jb250YWlucygiOi8vIikpIHsKLSAgICAgICAgaWYgKHVbMF0gPT0gJy8nKQotICAgICAgICAg
ICAgdS5wcmVwZW5kKGN1cnJlbnRFbmNvZGVkVVJMLT5ob3N0KTsKLSAgICAgICAgZWxzZSBpZiAo
dVswXSA9PSAnIycpCi0gICAgICAgICAgICB1LnByZXBlbmQoY3VycmVudEVuY29kZWRVUkwtPmZp
bGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1LnByZXBlbmQoY3VycmVudEVuY29kZWRV
UkwtPnBhdGgpOwotICAgICAgICBjbGVhbnBhdGgodSk7CisKKyAgICBjb25zdCBVQ2hhciogY2hh
cmFjdGVycyA9IGF0dHItPmNoYXJhY3RlcnMoKTsKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBhdHRy
LT5sZW5ndGgoKTsKKworICAgIGlmIChjb250YWluc0NvbG9uU2xhc2hTbGFzaChjaGFyYWN0ZXJz
LCBsZW5ndGgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBTdHJhbmdlIHRvIG5vdCBjbGVhbiB0aGUg
cGF0aCBqdXN0IGJlYWNhdXNlIGl0IGhhcyAiOi8vIiBpbiBpdC4KKyAgICAgICAgcHNldWRvU3Rh
dGUgPSBoaXN0b3J5Q29udGFpbnMoY2hhcmFjdGVycywgbGVuZ3RoKSA/IFBzZXVkb1Zpc2l0ZWQg
OiBQc2V1ZG9MaW5rOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHBzZXVkb1N0YXRlID0g
aGlzdG9yeUNvbnRhaW5zKHUpID8gUHNldWRvVmlzaXRlZCA6IFBzZXVkb0xpbms7CisKKyAgICBE
ZXByZWNhdGVkQ29uc3RTdHJpbmcgY3UocmVpbnRlcnByZXRfY2FzdDxjb25zdCBEZXByZWNhdGVk
Q2hhcio+KGNoYXJhY3RlcnMpLCBsZW5ndGgpOworICAgIERlcHJlY2F0ZWRTdHJpbmcgdSA9IGN1
LnN0cmluZygpOworICAgIGlmIChsZW5ndGggJiYgY2hhcmFjdGVyc1swXSA9PSAnLycpCisgICAg
ICAgIHUucHJlcGVuZChjdXJyZW50RW5jb2RlZFVSTC0+aG9zdCk7CisgICAgZWxzZSBpZiAobGVu
Z3RoICYmIGNoYXJhY3RlcnNbMF0gPT0gJyMnKQorICAgICAgICB1LnByZXBlbmQoY3VycmVudEVu
Y29kZWRVUkwtPmZpbGUpOworICAgIGVsc2UKKyAgICAgICAgdS5wcmVwZW5kKGN1cnJlbnRFbmNv
ZGVkVVJMLT5wYXRoKTsKKyAgICBjbGVhbnBhdGgodSk7CisgICAgcHNldWRvU3RhdGUgPSBoaXN0
b3J5Q29udGFpbnMocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KHUudW5pY29kZSgpKSwg
dS5sZW5ndGgoKSkKKyAgICAgICAgPyBQc2V1ZG9WaXNpdGVkIDogUHNldWRvTGluazsKIH0KIAog
I2lmZGVmIFNUWUxFX1NIQVJJTkdfU1RBVFMKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRXaW4uY3BwCShyZXZpc2lvbiAyODUwMSkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OSwxOSArNDksNiBA
QCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBnCiAgICAgdWludDMyX3Qg
b2xkRm9udFNtb290aGluZ1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0
KTsKIAogICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBs
YXRmb3JtRGF0YSgpOwotICAgIC8vTlNGb250KiBkcmF3Rm9udDsKLSAgICAvL2lmIChbZ0NvbnRl
eHQgaXNEcmF3aW5nVG9TY3JlZW5dKSB7Ci0gICAgLy8gICAgZHJhd0ZvbnQgPSBbcGxhdGZvcm1E
YXRhLmZvbnQgc2NyZWVuRm9udF07Ci0gICAgLy8gICAgaWYgKGRyYXdGb250ICE9IHBsYXRmb3Jt
RGF0YS5mb250KQotICAgIC8vICAgICAgICAvLyBXZSBhcmUgZ2V0dGluZyB0aGlzIGluIHRvbyBt
YW55IHBsYWNlcyAoMzQwNjQxMSk7IHVzZSBFUlJPUiBzbyBpdCBvbmx5IHByaW50cyBvbiBkZWJ1
ZyB2ZXJzaW9ucyBmb3Igbm93LiAoV2Ugc2hvdWxkIGRlYnVnIHRoaXMgYWxzbywgZXZlbnR1YWxs
eSkuCi0gICAgLy8gICAgICAgIExPR19FUlJPUigiQXR0ZW1wdGluZyB0byBzZXQgbm9uLXNjcmVl
biBmb250ICglQCkgd2hlbiBkcmF3aW5nIHRvIHNjcmVlbi4gIFVzaW5nIHNjcmVlbiBmb250IGFu
eXdheSwgbWF5IHJlc3VsdCBpbiBpbmNvcnJlY3QgbWV0cmljcy4iLAotICAgIC8vICAgICAgICAg
ICAgW1tbcGxhdGZvcm1EYXRhLmZvbnQgZm9udERlc2NyaXB0b3JdIGZvbnRBdHRyaWJ1dGVzXSBv
YmplY3RGb3JLZXk6TlNGb250TmFtZUF0dHJpYnV0ZV0pOwotICAgIC8vfSBlbHNlIHsKLSAgICAv
LyAgICBkcmF3Rm9udCA9IFtwbGF0Zm9ybURhdGEuZm9udCBwcmludGVyRm9udF07Ci0gICAgLy8g
ICAgaWYgKGRyYXdGb250ICE9IHBsYXRmb3JtRGF0YS5mb250KQotICAgIC8vICAgICAgICBOU0xv
ZyhAIkF0dGVtcHRpbmcgdG8gc2V0IG5vbi1wcmludGVyIGZvbnQgKCVAKSB3aGVuIHByaW50aW5n
LiAgVXNpbmcgcHJpbnRlciBmb250IGFueXdheSwgbWF5IHJlc3VsdCBpbiBpbmNvcnJlY3QgbWV0
cmljcy4iLAotICAgIC8vICAgICAgICAgICAgW1tbcGxhdGZvcm1EYXRhLmZvbnQgZm9udERlc2Ny
aXB0b3JdIGZvbnRBdHRyaWJ1dGVzXSBvYmplY3RGb3JLZXk6TlNGb250TmFtZUF0dHJpYnV0ZV0p
OwotICAgIC8vfQogCiAgICAgQ0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0
YS5jZ0ZvbnQoKSk7CiAKQEAgLTgyLDcgKzY5LDYgQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdy
YXBoaWNzQ29udGV4dCogZwogICAgIAogICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250
ZXh0LCBtYXRyaXgpOwogCi0gICAgLy93a1NldENHRm9udFJlbmRlcmluZ01vZGUoY2dDb250ZXh0
LCBkcmF3Rm9udCk7CiAgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0Zm9y
bURhdGEuc2l6ZSgpKTsKICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBw
b2ludC54KCksIHBvaW50LnkoKSk7CiAgICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNl
cyhjZ0NvbnRleHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5j
ZXMoZnJvbSksIG51bUdseXBocyk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2d0ay9UZW1wb3Jh
cnlMaW5rU3R1YnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3RrL1RlbXBv
cmFyeUxpbmtTdHVicy5jcHAJKHJldmlzaW9uIDI4NTAxKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
dGsvVGVtcG9yYXJ5TGlua1N0dWJzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTYsNyArNTYsNyBA
QCBWZWN0b3I8Y2hhcj4gbG9hZFJlc291cmNlSW50b0FycmF5KGNvbnN0CiAvKiBDb21wbGV0ZWx5
IGVtcHR5IHN0dWJzIChtb3N0bHkgdG8gYWxsb3cgRFJUIHRvIHJ1bik6ICovCiAvKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWJvb2wg
V2ViQ29yZTo6aGlzdG9yeUNvbnRhaW5zKERlcHJlY2F0ZWRTdHJpbmcgY29uc3QmKSB7IHJldHVy
biBmYWxzZTsgfQorYm9vbCBXZWJDb3JlOjpoaXN0b3J5Q29udGFpbnMoY29uc3QgVUNoYXIqLCB1
bnNpZ25lZCkgeyByZXR1cm4gZmFsc2U7IH0KIAogUGx1Z2luSW5mbyogUGx1Z0luSW5mb1N0b3Jl
OjpjcmVhdGVQbHVnaW5JbmZvRm9yUGx1Z2luQXRJbmRleCh1bnNpZ25lZCkgeyBub3RJbXBsZW1l
bnRlZCgpOyByZXR1cm4gMDt9CiB1bnNpZ25lZCBQbHVnSW5JbmZvU3RvcmU6OnBsdWdpbkNvdW50
KCkgY29uc3QgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gMDsgfQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9tYWMvV2ViQ29yZUhpc3RvcnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL21hYy9XZWJDb3JlSGlzdG9yeS5oCShyZXZpc2lvbiAyODUwMSkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vbWFjL1dlYkNvcmVIaXN0b3J5LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBA
CiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAzIEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjQs
MTMgKzI0LDEwIEBACiAgKi8KIAogQHByb3RvY29sIFdlYkNvcmVIaXN0b3J5UHJvdmlkZXIgPE5T
T2JqZWN0PgotLSAoQk9PTCljb250YWluc0l0ZW1Gb3JVUkxMYXRpbjE6KGNvbnN0IGNoYXIgKils
YXRpbjEgbGVuZ3RoOih1bnNpZ25lZClsZW5ndGg7Ci0tIChCT09MKWNvbnRhaW5zSXRlbUZvclVS
TFVuaWNvZGU6KGNvbnN0IFVuaUNoYXIgKil1bmljb2RlIGxlbmd0aDoodW5zaWduZWQpbGVuZ3Ro
OworLSAoQk9PTCljb250YWluc1VSTDooY29uc3QgVW5pQ2hhciopdW5pY29kZSBsZW5ndGg6KHVu
c2lnbmVkKWxlbmd0aDsKIEBlbmQKIAogQGludGVyZmFjZSBXZWJDb3JlSGlzdG9yeSA6IE5TT2Jq
ZWN0Ci17Ci19CiAKICsgKHZvaWQpc2V0SGlzdG9yeVByb3ZpZGVyOihpZDxXZWJDb3JlSGlzdG9y
eVByb3ZpZGVyPiloOwogKyAoaWQ8V2ViQ29yZUhpc3RvcnlQcm92aWRlcj4paGlzdG9yeVByb3Zp
ZGVyOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vV2ViQ29yZUhpc3RvcnkuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9XZWJDb3JlSGlzdG9yeS5oCShyZXZpc2lvbiAy
ODUwMSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1dlYkNvcmVIaXN0b3J5LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwpAQCAtMzIsMTMgKzMyLDEyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgV2Vi
Q29yZUhpc3RvcnlQcm92aWRlciB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBib29sIGNvbnRhaW5z
SXRlbUZvclVSTExhdGluMShjb25zdCBjaGFyKiBsYXRpbjEsIHVuc2lnbmVkIGludCBsZW5ndGgp
ID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgY29udGFpbnNJdGVtRm9yVVJMVW5pY29kZShjb25zdCBV
Q2hhciogdW5pY29kZSwgdW5zaWduZWQgaW50IGxlbmd0aCkgPSAwOworICAgIHZpcnR1YWwgYm9v
bCBjb250YWluc1VSTChjb25zdCBVQ2hhciogdW5pY29kZSwgdW5zaWduZWQgbGVuZ3RoKSA9IDA7
CiB9OwogCiBjbGFzcyBXZWJDb3JlSGlzdG9yeSB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQg
c2V0SGlzdG9yeVByb3ZpZGVyKFdlYkNvcmVIaXN0b3J5UHJvdmlkZXIqIGgpOworICAgIHN0YXRp
YyB2b2lkIHNldEhpc3RvcnlQcm92aWRlcihXZWJDb3JlSGlzdG9yeVByb3ZpZGVyKik7CiAgICAg
c3RhdGljIFdlYkNvcmVIaXN0b3J5UHJvdmlkZXIqIGhpc3RvcnlQcm92aWRlcigpOwogfTsKIApJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS93eC9UZW1wb3JhcnlMaW5rU3R1YnMuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd3gvVGVtcG9yYXJ5TGlua1N0dWJzLmNwcAkocmV2aXNp
b24gMjg1MDEpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3d4L1RlbXBvcmFyeUxpbmtTdHVicy5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTExMiw3ICsxMTIsNyBAQCBzdGF0aWMgV2ViQ29yZTo6Q3Vyc29y
IGxvY2FsQ3Vyc29yOwogY29uc3QgV2ViQ29yZTo6Q3Vyc29yJiBXZWJDb3JlOjptb3ZlQ3Vyc29y
KCkgeyByZXR1cm4gbG9jYWxDdXJzb3I7IH0KIAogbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGJv
b2wgaGlzdG9yeUNvbnRhaW5zKERlcHJlY2F0ZWRTdHJpbmcgY29uc3QmKSB7IHJldHVybiBmYWxz
ZTsgfQorICAgIGJvb2wgaGlzdG9yeUNvbnRhaW5zKGNvbnN0IFVDaGFyKiwgdW5zaWduZWQpIHsg
cmV0dXJuIGZhbHNlOyB9CiB9CiAKIHZvaWQgV2ViQ29yZTo6ZmluZFdvcmRCb3VuZGFyeShVQ2hh
ciBjb25zdCogc3RyLGludCBsZW4saW50IHBvc2l0aW9uLGludCogc3RhcnQsIGludCogZW5kKSB7
IG5vdEltcGxlbWVudGVkKCk7ICpzdGFydD1wb3NpdGlvbjsgKmVuZD1wb3NpdGlvbjsgfQpJbmRl
eDogV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2cvU1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudENnLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9ncmFwaGljcy9jZy9TVkdQYWludFNlcnZlckdyYWRp
ZW50Q2cuY3BwCShyZXZpc2lvbiAyODUwMSkKKysrIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL2NnL1NW
R1BhaW50U2VydmVyR3JhZGllbnRDZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDEyICs0Miwx
MiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHN0YXRpYyB2b2lkIHJlbGVhc2VDYWNoZWRTdG9w
cyh2b2lkKiBpbmZvKQogewotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U1ZHUGFpbnRTZXJ2ZXJHcmFk
aWVudDo6U2hhcmVkU3RvcENhY2hlKj4oaW5mbyktPmRlcmVmKCk7CisgICAgc3RhdGljX2Nhc3Q8
U1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudDo6U2hhcmVkU3RvcENhY2hlKj4oaW5mbyktPmRlcmVmKCk7
CiB9CiAKIHN0YXRpYyB2b2lkIGNnR3JhZGllbnRDYWxsYmFjayh2b2lkKiBpbmZvLCBjb25zdCBD
R0Zsb2F0KiBpblZhbHVlcywgQ0dGbG9hdCogb3V0Q29sb3IpCiB7Ci0gICAgU1ZHUGFpbnRTZXJ2
ZXJHcmFkaWVudDo6U2hhcmVkU3RvcENhY2hlKiBzdG9wc0NhY2hlID0gcmVpbnRlcnByZXRfY2Fz
dDxTVkdQYWludFNlcnZlckdyYWRpZW50OjpTaGFyZWRTdG9wQ2FjaGUqPihpbmZvKTsKKyAgICBT
VkdQYWludFNlcnZlckdyYWRpZW50OjpTaGFyZWRTdG9wQ2FjaGUqIHN0b3BzQ2FjaGUgPSBzdGF0
aWNfY2FzdDxTVkdQYWludFNlcnZlckdyYWRpZW50OjpTaGFyZWRTdG9wQ2FjaGUqPihpbmZvKTsK
ICAgICAKICAgICBTVkdQYWludFNlcnZlckdyYWRpZW50OjpRdWFydHpHcmFkaWVudFN0b3AqIHN0
b3BzID0gc3RvcHNDYWNoZS0+bV9zdG9wcy5kYXRhKCk7CiAgICAgICAgIApJbmRleDogV2ViS2l0
L21hYy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L21hYy9DaGFuZ2VMb2cJKHJldmlz
aW9uIDI4NTAxKQorKysgV2ViS2l0L21hYy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwxMyBAQAorMjAwNy0xMi0wNiAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBsZS5jb20+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgLSBodHRwOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTk4MQorICAgICAgICAgIHNwZWVkIHVw
IHZpc2l0ZWQtbGluayBjb2RlIGEgYml0CisKKyAgICAgICAgKiBIaXN0b3J5L1dlYkhpc3Rvcnku
bW06IFJlbW92ZWQgdW51c2VkIExhdGluLTEgY29kZSBwYXRoLgorICAgICAgICAoLVtfV2ViQ29y
ZUhpc3RvcnlQcm92aWRlciBjb250YWluc1VSTDpsZW5ndGg6XSk6IFVwZGF0ZWQgZm9yIG1ldGhv
ZCBuYW1lIGNoYW5nZS4KKwogMjAwNy0xMi0wNiAgVGltb3RoeSBIYXRjaGVyICA8dGltb3RoeUBh
cHBsZS5jb20+CiAKICAgICAgICAgQ2hhbmdlIHRoZSBBU1NFUlQgYWRkZWQgZm9yIHRoZSBwcmV2
aW91cyBmaXguIFRoZSBBU1NFUlQgd2FzIGZpcmluZyBmb3IgMTAuNS4wLgpJbmRleDogV2ViS2l0
L21hYy9IaXN0b3J5L1dlYkhpc3RvcnkubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L21hYy9IaXN0
b3J5L1dlYkhpc3RvcnkubW0JKHJldmlzaW9uIDI4NTAxKQorKysgV2ViS2l0L21hYy9IaXN0b3J5
L1dlYkhpc3RvcnkubW0JKHdvcmtpbmcgY29weSkKQEAgLTM5LDcgKzM5LDYgQEAKICNpbXBvcnQg
PFdlYkNvcmUvV2ViQ29yZUhpc3RvcnkuaD4KICNpbXBvcnQgPHd0Zi9WZWN0b3IuaD4KIAotCiBO
U1N0cmluZyAqV2ViSGlzdG9yeUl0ZW1zQWRkZWROb3RpZmljYXRpb24gPSBAIldlYkhpc3RvcnlJ
dGVtc0FkZGVkTm90aWZpY2F0aW9uIjsKIE5TU3RyaW5nICpXZWJIaXN0b3J5SXRlbXNSZW1vdmVk
Tm90aWZpY2F0aW9uID0gQCJXZWJIaXN0b3J5SXRlbXNSZW1vdmVkTm90aWZpY2F0aW9uIjsKIE5T
U3RyaW5nICpXZWJIaXN0b3J5QWxsSXRlbXNSZW1vdmVkTm90aWZpY2F0aW9uID0gQCJXZWJIaXN0
b3J5QWxsSXRlbXNSZW1vdmVkTm90aWZpY2F0aW9uIjsKQEAgLTUwLDggKzQ5LDYgQEAgTlNTdHJp
bmcgKldlYkhpc3RvcnlJdGVtc0tleSA9IEAiV2ViSGlzdAogCiBzdGF0aWMgV2ViSGlzdG9yeSAq
X3NoYXJlZEhpc3RvcnkgPSBuaWw7CiAKLQotCiBOU1N0cmluZyAqRmlsZVZlcnNpb25LZXkgPSBA
IldlYkhpc3RvcnlGaWxlVmVyc2lvbiI7CiBOU1N0cmluZyAqRGF0ZXNBcnJheUtleSA9IEAiV2Vi
SGlzdG9yeURhdGVzIjsKIApAQCAtNjE2LDYyICs2MTMsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wg
bWF0Y2hVbmljb2RlTGV0dGVyKFVuCiAgICAgcmV0dXJuIChjIHwgMHgyMCkgPT0gbG93ZXJjYXNl
TGV0dGVyOwogfQogCi0jZGVmaW5lIEJVRkZFUl9TSVpFIDIwNDgKLQotLSAoQk9PTCljb250YWlu
c0l0ZW1Gb3JVUkxMYXRpbjE6KGNvbnN0IGNoYXIgKilsYXRpbjEgbGVuZ3RoOih1bnNpZ25lZCls
ZW5ndGgKLXsKLSAgICBjb25zdCBjaGFyICpsYXRpbjFTdHIgPSBsYXRpbjE7Ci0gICAgY2hhciBz
dGF0aWNTdHJCdWZmZXJbQlVGRkVSX1NJWkVdOwotICAgIGNoYXIgKnN0ckJ1ZmZlciA9IE5VTEw7
Ci0gICAgQk9PTCBuZWVkVG9BZGRTbGFzaCA9IEZBTFNFOwotCi0gICAgaWYgKGxlbmd0aCA+PSA2
ICYmCi0gICAgICAgIG1hdGNoTGV0dGVyKGxhdGluMVswXSwgJ2gnKSAmJgotICAgICAgICBtYXRj
aExldHRlcihsYXRpbjFbMV0sICd0JykgJiYKLSAgICAgICAgbWF0Y2hMZXR0ZXIobGF0aW4xWzJd
LCAndCcpICYmCi0gICAgICAgIG1hdGNoTGV0dGVyKGxhdGluMVszXSwgJ3AnKSAmJgotICAgICAg
ICAobGF0aW4xWzRdID09ICc6JyAKLSAgICAgICAgIHx8IChtYXRjaExldHRlcihsYXRpbjFbNF0s
ICdzJykgJiYgbGF0aW4xWzVdID09ICc6JykpKSB7Ci0gICAgICAgIGludCBwb3MgPSBsYXRpbjFb
NF0gPT0gJzonID8gNSA6IDY7Ci0gICAgICAgIC8vIHNraXAgcG9zc2libGUgaW5pdGlhbCB0d28g
c2xhc2hlcwotICAgICAgICBpZiAobGF0aW4xW3Bvc10gPT0gJy8nICYmIGxhdGluMVtwb3MgKyAx
XSA9PSAnLycpIHsKLSAgICAgICAgICAgIHBvcyArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAg
Y2hhciAqbmV4dFNsYXNoID0gc3RyY2hyKGxhdGluMSArIHBvcywgJy8nKTsKLSAgICAgICAgaWYg
KG5leHRTbGFzaCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuZWVkVG9BZGRTbGFzaCA9IFRSVUU7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZFRvQWRkU2xhc2gpIHsKLSAgICAgICAg
aWYgKGxlbmd0aCArIDEgPD0gQlVGRkVSX1NJWkUpIHsKLSAgICAgICAgICAgIHN0ckJ1ZmZlciA9
IHN0YXRpY1N0ckJ1ZmZlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0ckJ1ZmZl
ciA9IChjaGFyKiltYWxsb2MobGVuZ3RoICsgMik7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5
KHN0ckJ1ZmZlciwgbGF0aW4xLCBsZW5ndGggKyAxKTsKLSAgICAgICAgc3RyQnVmZmVyW2xlbmd0
aF0gPSAnLyc7Ci0gICAgICAgIHN0ckJ1ZmZlcltsZW5ndGgrMV0gPSAnXDAnOwotICAgICAgICBs
ZW5ndGgrKzsKLQotICAgICAgICBsYXRpbjFTdHIgPSBzdHJCdWZmZXI7Ci0gICAgfQotCi0gICAg
Q0ZTdHJpbmdSZWYgc3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weShOVUxMLCBs
YXRpbjFTdHIsIGtDRlN0cmluZ0VuY29kaW5nV2luZG93c0xhdGluMSwga0NGQWxsb2NhdG9yTnVs
bCk7Ci0gICAgQk9PTCByZXN1bHQgPSBbaGlzdG9yeSBjb250YWluc0l0ZW1Gb3JVUkxTdHJpbmc6
KGlkKXN0cl07Ci0gICAgQ0ZSZWxlYXNlKHN0cik7Ci0KLSAgICBpZiAoc3RyQnVmZmVyICE9IHN0
YXRpY1N0ckJ1ZmZlcikgewotICAgICAgICBmcmVlKHN0ckJ1ZmZlcik7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHJlc3VsdDsKLX0KLQogI2RlZmluZSBVTklDT0RFX0JVRkZFUl9TSVpFIDEwMjQKIAot
LSAoQk9PTCljb250YWluc0l0ZW1Gb3JVUkxVbmljb2RlOihjb25zdCBVbmlDaGFyICopdW5pY29k
ZSBsZW5ndGg6KHVuc2lnbmVkKWxlbmd0aAorLSAoQk9PTCljb250YWluc1VSTDooY29uc3QgVW5p
Q2hhciAqKXVuaWNvZGUgbGVuZ3RoOih1bnNpZ25lZClsZW5ndGgKIHsKICAgICBjb25zdCBVbmlD
aGFyICp1bmljb2RlU3RyID0gdW5pY29kZTsKICAgICBVbmlDaGFyIHN0YXRpY1N0ckJ1ZmZlcltV
TklDT0RFX0JVRkZFUl9TSVpFXTsKSW5kZXg6IFdlYktpdC93aW4vQ2hhbmdlTG9nCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC93aW4vQ2hhbmdlTG9nCShyZXZpc2lvbiAyODUwMSkKKysrIFdlYktpdC93
aW4vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMDctMTItMDYg
IERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIC0gaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MTU5ODEKKyAgICAgICAgICBzcGVlZCB1cCB2aXNpdGVkLWxpbmsgY29kZSBhIGJp
dAorCisgICAgICAgICogV2ViSGlzdG9yeS5jcHA6IFJlbW92ZWQgdW51c2VkIExhdGluLTEgY29k
ZSBwYXRoLgorICAgICAgICAoX1dlYkNvcmVIaXN0b3J5UHJvdmlkZXI6OmNvbnRhaW5zSXRlbSk6
IFVwZGF0ZWQgZm9yIGZ1bmN0aW9uIG5hbWUgY2hhbmdlLgorCiAyMDA3LTEyLTA2ICBBZGFtIFJv
YmVuICA8YXJvYmVuQGFwcGxlLmNvbT4KIAogICAgICAgICBBZGQgU1BJIHNvIHRoYXQgRHVtcFJl
bmRlclRyZWUgY2FuIHR1cm4gb24gdGhlIE1hYyBmb250IGFzY2VudCBoYWNrCkluZGV4OiBXZWJL
aXQvd2luL1dlYkhpc3RvcnkuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViSGlzdG9y
eS5jcHAJKHJldmlzaW9uIDI4NTAxKQorKysgV2ViS2l0L3dpbi9XZWJIaXN0b3J5LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNTIsOCArNTIsNyBAQCBwdWJsaWM6CiAgICAgX1dlYkNvcmVIaXN0b3J5
UHJvdmlkZXIoSVdlYkhpc3RvcnkqIGhpc3RvcnkpOwogICAgIH5fV2ViQ29yZUhpc3RvcnlQcm92
aWRlcigpOwogCi0gICAgdmlydHVhbCBib29sIGNvbnRhaW5zSXRlbUZvclVSTExhdGluMShjb25z
dCBjaGFyKiBsYXRpbjEsIHVuc2lnbmVkIGludCBsZW5ndGgpOwotICAgIHZpcnR1YWwgYm9vbCBj
b250YWluc0l0ZW1Gb3JVUkxVbmljb2RlKGNvbnN0IFVDaGFyKiB1bmljb2RlLCB1bnNpZ25lZCBp
bnQgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsIGJvb2wgY29udGFpbnNJdGVtKGNvbnN0IFVDaGFyKiB1
bmljb2RlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKIAogcHJpdmF0ZToKICAgICBJV2ViSGlzdG9y
eSogbV9oaXN0b3J5OwpAQCAtODkyLDY5ICs4OTEsNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgbWF0
Y2hVbmljb2RlTGV0dGVyKFVuCiAgICAgcmV0dXJuIChjIHwgMHgyMCkgPT0gbG93ZXJjYXNlTGV0
dGVyOwogfQogCi1ib29sIF9XZWJDb3JlSGlzdG9yeVByb3ZpZGVyOjpjb250YWluc0l0ZW1Gb3JV
UkxMYXRpbjEoY29uc3QgY2hhciogbGF0aW4xLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQotewotICAg
IGNvbnN0IGludCBidWZmZXJTaXplID0gMjA0ODsKLSAgICBjb25zdCBjaGFyICpsYXRpbjFTdHIg
PSBsYXRpbjE7Ci0gICAgY2hhciBzdGF0aWNTdHJCdWZmZXJbYnVmZmVyU2l6ZV07Ci0gICAgY2hh
ciAqc3RyQnVmZmVyID0gMDsKLSAgICBib29sIG5lZWRUb0FkZFNsYXNoID0gZmFsc2U7Ci0KLSAg
ICBpZiAobGVuZ3RoID49IDYgJiYKLSAgICAgICAgbWF0Y2hMZXR0ZXIobGF0aW4xWzBdLCAnaCcp
ICYmCi0gICAgICAgIG1hdGNoTGV0dGVyKGxhdGluMVsxXSwgJ3QnKSAmJgotICAgICAgICBtYXRj
aExldHRlcihsYXRpbjFbMl0sICd0JykgJiYKLSAgICAgICAgbWF0Y2hMZXR0ZXIobGF0aW4xWzNd
LCAncCcpICYmCi0gICAgICAgIChsYXRpbjFbNF0gPT0gJzonIAotICAgICAgICB8fCAobWF0Y2hM
ZXR0ZXIobGF0aW4xWzRdLCAncycpICYmIGxhdGluMVs1XSA9PSAnOicpKSkgewotICAgICAgICAg
ICAgaW50IHBvcyA9IGxhdGluMVs0XSA9PSAnOicgPyA1IDogNjsKLSAgICAgICAgICAgIC8vIHNr
aXAgcG9zc2libGUgaW5pdGlhbCB0d28gc2xhc2hlcwotICAgICAgICAgICAgaWYgKGxhdGluMVtw
b3NdID09ICcvJyAmJiBsYXRpbjFbcG9zICsgMV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAg
cG9zICs9IDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5leHRT
bGFzaCA9IHN0cmNocihsYXRpbjEgKyBwb3MsICcvJyk7Ci0gICAgICAgICAgICBpZiAoIW5leHRT
bGFzaCkKLSAgICAgICAgICAgICAgICBuZWVkVG9BZGRTbGFzaCA9IHRydWU7Ci0gICAgfQotCi0g
ICAgaWYgKG5lZWRUb0FkZFNsYXNoKSB7Ci0gICAgICAgIGlmIChsZW5ndGggKyAxIDw9IGJ1ZmZl
clNpemUpCi0gICAgICAgICAgICBzdHJCdWZmZXIgPSBzdGF0aWNTdHJCdWZmZXI7Ci0gICAgICAg
IGVsc2UKLSAgICAgICAgICAgIHN0ckJ1ZmZlciA9IChjaGFyKiltYWxsb2MobGVuZ3RoICsgMik7
Ci0gICAgICAgIG1lbWNweShzdHJCdWZmZXIsIGxhdGluMSwgbGVuZ3RoICsgMSk7Ci0gICAgICAg
IHN0ckJ1ZmZlcltsZW5ndGhdID0gJy8nOwotICAgICAgICBzdHJCdWZmZXJbbGVuZ3RoKzFdID0g
J1wwJzsKLSAgICAgICAgbGVuZ3RoKys7Ci0KLSAgICAgICAgbGF0aW4xU3RyID0gc3RyQnVmZmVy
OwotICAgIH0KLQotICAgIGlmICghbV9oaXN0b3J5UHJpdmF0ZSkgewotICAgICAgICBpZiAoU1VD
Q0VFREVEKG1faGlzdG9yeS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lXZWJIaXN0b3J5UHJpdmF0ZSwg
KHZvaWQqKikmbV9oaXN0b3J5UHJpdmF0ZSkpKSB7Ci0gICAgICAgICAgICAvLyBkb24ndCBob2xk
IGEgcmVmIC0gd2UncmUgb3duZWQgYnkgSVdlYkhpc3RvcnkvSVdlYkhpc3RvcnlQcml2YXRlCi0g
ICAgICAgICAgICBtX2hpc3RvcnlQcml2YXRlLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICBpZiAoc3RyQnVmZmVyICE9IHN0YXRpY1N0ckJ1ZmZlcikKLSAgICAgICAg
ICAgICAgICBmcmVlKHN0ckJ1ZmZlcik7Ci0gICAgICAgICAgICBtX2hpc3RvcnlQcml2YXRlID0g
MDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAg
ICBDRlN0cmluZ1JlZiBzdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KE5VTEws
IGxhdGluMVN0ciwga0NGU3RyaW5nRW5jb2RpbmdXaW5kb3dzTGF0aW4xLCBrQ0ZBbGxvY2F0b3JO
dWxsKTsKLSAgICBCT09MIHJlc3VsdCA9IEZBTFNFOwotICAgIG1faGlzdG9yeVByaXZhdGUtPmNv
bnRhaW5zSXRlbUZvclVSTFN0cmluZygodm9pZCopc3RyLCAmcmVzdWx0KTsKLSAgICBDRlJlbGVh
c2Uoc3RyKTsKLQotICAgIGlmIChzdHJCdWZmZXIgIT0gc3RhdGljU3RyQnVmZmVyKQotICAgICAg
ICBmcmVlKHN0ckJ1ZmZlcik7Ci0KLSAgICByZXR1cm4gISFyZXN1bHQ7Ci19Ci0KLWJvb2wgX1dl
YkNvcmVIaXN0b3J5UHJvdmlkZXI6OmNvbnRhaW5zSXRlbUZvclVSTFVuaWNvZGUoY29uc3QgVUNo
YXIqIHVuaWNvZGUsIHVuc2lnbmVkIGludCBsZW5ndGgpCitib29sIF9XZWJDb3JlSGlzdG9yeVBy
b3ZpZGVyOjpjb250YWluc0l0ZW0oY29uc3QgVUNoYXIqIHVuaWNvZGUsIHVuc2lnbmVkIGludCBs
ZW5ndGgpCiB7CiAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSAxMDI0OwogICAgIGNvbnN0IFVD
aGFyICp1bmljb2RlU3RyID0gdW5pY29kZTsK
</data>
<flag name="review"
          id="7660"
          type_id="1"
          status="+"
          setter="mitz"
    />
          </attachment>
      

    </bug>

</bugzilla>