<?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>17653</bug_id>
          
          <creation_ts>2008-03-03 14:26:25 -0800</creation_ts>
          <short_desc>CSSRuleSet should be moved out of CSSStyleSelector.cpp into its own files</short_desc>
          <delta_ts>2011-11-25 16:13:28 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>LATER</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>49775</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>jamesr</cc>
    
    <cc>macpherson</cc>
    
    <cc>rniwa</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>72613</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-03-03 14:26:25 -0800</bug_when>
    <thetext>CSSRuleSet should be moved out of CSSStyleSelector.cpp into its own files

I went looking for CSSRuleSet today, and found it wasn&apos;t in its own file(s).  It would be nice to see it moved.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311230</commentid>
    <comment_count>1</comment_count>
      <attachid>74337</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-11-18 18:37:58 -0800</bug_when>
    <thetext>Created attachment 74337
Extracted CSSRuleSet.h and CSSRuleSet.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311262</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-11-18 20:17:43 -0800</bug_when>
    <thetext>Do we have a good way to performance test this?

It would be awesome if we could make a CSSStyleSelector micro-benchmark like we have for the html-parser (in WebCore/benchmarks).

It&apos;s possible this could cause some of these functions to not inline, which could slow down.  I&apos;m not super concerned, but we just need to make sure we know we&apos;re going to catch a problem if this were to regress.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311263</commentid>
    <comment_count>3</comment_count>
      <attachid>74337</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-11-18 20:19:09 -0800</bug_when>
    <thetext>Comment on attachment 74337
Extracted CSSRuleSet.h and CSSRuleSet.cpp

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

LGTM, assuming you&apos;re not changing any logic (just moving) and you have an answer for the perf question.

&gt; WebCore/css/CSSRuleSet.cpp:43
&gt; +: m_ruleCount(0)
&gt; +, m_pageRuleCount(0)

I think we normally indent these.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311279</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-11-18 21:07:08 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Do we have a good way to performance test this?

No.  Maybe we need to make a benchmark.

&gt; It would be awesome if we could make a CSSStyleSelector micro-benchmark like we have for the html-parser (in WebCore/benchmarks).

&gt; It&apos;s possible this could cause some of these functions to not inline, which could slow down.  I&apos;m not super concerned, but we just need to make sure we know we&apos;re going to catch a problem if this were to regress.

Right.  jamesr pointed that out as well.

(In reply to comment #3)
&gt; LGTM, assuming you&apos;re not changing any logic (just moving) and you have an answer for the perf question.

We need to figure out how to perf-test this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311288</commentid>
    <comment_count>5</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-11-18 21:40:17 -0800</bug_when>
    <thetext>It&apos;s possible a sufficient answer to the perf question is that the PLT (which I believe chromium runs automatically on some bots) doesn&apos;t slow down.  But if you were to come up with a micro benchmark that might be even better. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311541</commentid>
    <comment_count>6</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-11-19 10:08:02 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; It&apos;s possible a sufficient answer to the perf question is that the PLT (which I believe chromium runs automatically on some bots) doesn&apos;t slow down.  But if you were to come up with a micro benchmark that might be even better. :)

Why don&apos;t we make the constructor, destructor, and addPageRule inline?  Other functions are too big to be inlined or the cost of not being inline is negligible.  James said inlining might hurt the performance as well but I&apos;m almost certain that the compiler won&apos;t keep it inline if that&apos;s the case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>324818</commentid>
    <comment_count>7</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-20 22:43:57 -0800</bug_when>
    <thetext>ping?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397665</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-05-03 20:23:15 -0700</bug_when>
    <thetext>Looks like this never got landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397671</commentid>
    <comment_count>9</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-03 20:39:09 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; Looks like this never got landed.

Yeah, I never got around to test the performance :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397673</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-05-03 20:46:33 -0700</bug_when>
    <thetext>Don&apos;t we have perf try-bots these days?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509290</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-25 16:13:28 -0800</bug_when>
    <thetext>This patch is completely out of date at this point.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>74337</attachid>
            <date>2010-11-18 18:37:58 -0800</date>
            <delta_ts>2011-11-25 16:13:21 -0800</delta_ts>
            <desc>Extracted CSSRuleSet.h and CSSRuleSet.cpp</desc>
            <filename>bug-17653-20101118183757.patch</filename>
            <type>text/plain</type>
            <size>25295</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MjM1OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzUgQEAKKzIwMTAtMTEtMTggIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ1NT
UnVsZVNldCBzaG91bGQgYmUgbW92ZWQgb3V0IG9mIENTU1N0eWxlU2VsZWN0b3IuY3BwIGludG8g
aXRzIG93biBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTc2NTMKKworICAgICAgICBFeHRyYWN0ZWQgQ1NTUnVsZVNldC5jcHAgZnJvbSBDU1NT
dHlsZVNlbGVjdG9yLmNwcAorCisgICAgICAgICogQW5kcm9pZC5tazogQWRkZWQgQ1NTUnVsZVNl
dC5jcHAuCisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6IERpdHRvLgorICAgICAgICAqIEdOVW1h
a2VmaWxlLmFtOiBBZGRlZCBDU1NSdWxlU2V0LmggYW5kIENTU1J1bGVTZXQuY3BwLgorICAgICAg
ICAqIFdlYkNvcmUuZ3lwaTogRGl0dG8uCisgICAgICAgICogV2ViQ29yZS5wcm86IERpdHRvLgor
ICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qOiBBZGRlZCBDU1NSdWxlU2V0
LmNwcC4KKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6IEFkZGVk
IENTU1J1bGVTZXQuaCBhbmQgQ1NTUnVsZVNldC5jcHAuCisgICAgICAgICogY3NzL0NTU1J1bGVT
ZXQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNTU1J1bGVTZXQ6OkNTU1J1bGVTZXQp
OiBNb3ZlZCBmcm9tIENTU1N0eWxlU2VsZWN0b3IuY3BwLgorICAgICAgICAoV2ViQ29yZTo6Q1NT
UnVsZVNldDo6fkNTU1J1bGVTZXQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkNTU1J1bGVT
ZXQ6OmFkZFRvUnVsZVNldCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Q1NTUnVsZVNldDo6
YWRkUnVsZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Q1NTUnVsZVNldDo6YWRkUGFnZVJ1
bGUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkNTU1J1bGVTZXQ6OmFkZFJ1bGVzRnJvbVNo
ZWV0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDU1NSdWxlU2V0OjphZGRTdHlsZVJ1bGUp
OiBEaXR0by4KKyAgICAgICAgKiBjc3MvQ1NTUnVsZVNldC5oOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OkNTU1J1bGVTZXQ6OmdldElEUnVsZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6
OkNTU1J1bGVTZXQ6OmdldENsYXNzUnVsZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkNT
U1J1bGVTZXQ6OmdldFRhZ1J1bGVzKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDU1NSdWxl
U2V0OjpnZXRVbml2ZXJzYWxSdWxlcyk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Q1NTUnVs
ZVNldDo6Z2V0UGFnZVJ1bGVzKTogRGl0dG8uCisgICAgICAgICogY3NzL0NTU1N0eWxlU2VsZWN0
b3IuY3BwOiBSZW1vdmVkIENTU1J1bGVTZXQuCisKIDIwMTAtMTEtMTggIEppYW4gTGkgIDxqaWFu
bGlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEtlbm5ldGggUnVzc2VsbC4K
SW5kZXg6IFdlYkNvcmUvQW5kcm9pZC5tawo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0FuZHJvaWQu
bWsJKHJldmlzaW9uIDcyMzI4KQorKysgV2ViQ29yZS9BbmRyb2lkLm1rCSh3b3JraW5nIGNvcHkp
CkBAIC01NSw2ICs1NSw3IEBAIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJY3NzL0NTU1JlZmxlY3RW
YWx1ZS5jcHAgXAogCWNzcy9DU1NSdWxlLmNwcCBcCiAJY3NzL0NTU1J1bGVMaXN0LmNwcCBcCisJ
Y3NzL0NTU1J1bGVTZXQuY3BwIFwKIAljc3MvQ1NTU2VnbWVudGVkRm9udEZhY2UuY3BwIFwKIAlj
c3MvQ1NTU2VsZWN0b3IuY3BwIFwKIAljc3MvQ1NTU2VsZWN0b3JMaXN0LmNwcCBcCkluZGV4OiBX
ZWJDb3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ01ha2VMaXN0cy50
eHQJKHJldmlzaW9uIDcyMzI4KQorKysgV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAkod29ya2luZyBj
b3B5KQpAQCAtNzQ2LDYgKzc0Niw3IEBAIFNFVChXZWJDb3JlX1NPVVJDRVMKICAgICBjc3MvQ1NT
UmVmbGVjdFZhbHVlLmNwcAogICAgIGNzcy9DU1NSdWxlLmNwcAogICAgIGNzcy9DU1NSdWxlTGlz
dC5jcHAKKyAgICBjc3MvQ1NTUnVsZVNldC5jcHAKICAgICBjc3MvQ1NTU2VnbWVudGVkRm9udEZh
Y2UuY3BwCiAgICAgY3NzL0NTU1NlbGVjdG9yLmNwcAogICAgIGNzcy9DU1NTZWxlY3Rvckxpc3Qu
Y3BwCkluZGV4OiBXZWJDb3JlL0dOVW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
R05VbWFrZWZpbGUuYW0JKHJldmlzaW9uIDcyMzI4KQorKysgV2ViQ29yZS9HTlVtYWtlZmlsZS5h
bQkod29ya2luZyBjb3B5KQpAQCAtOTYxLDYgKzk2MSw4IEBAIHdlYmNvcmVfc291cmNlcyArPSBc
CiAJV2ViQ29yZS9jc3MvQ1NTUnVsZS5oIFwKIAlXZWJDb3JlL2Nzcy9DU1NSdWxlTGlzdC5jcHAg
XAogCVdlYkNvcmUvY3NzL0NTU1J1bGVMaXN0LmggXAorCVdlYkNvcmUvY3NzL0NTU1J1bGVTZXQu
Y3BwIFwKKwlXZWJDb3JlL2Nzcy9DU1NSdWxlU2V0LmggXAogCVdlYkNvcmUvY3NzL0NTU1NlZ21l
bnRlZEZvbnRGYWNlLmNwcCBcCiAJV2ViQ29yZS9jc3MvQ1NTU2VnbWVudGVkRm9udEZhY2UuaCBc
CiAJV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3IuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5n
eXBpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5neXBpCShyZXZpc2lvbiA3MjMyOCkK
KysrIFdlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0xMDI4LDYgKzEwMjgs
OCBAQAogICAgICAgICAgICAgJ2Nzcy9DU1NSdWxlLmgnLAogICAgICAgICAgICAgJ2Nzcy9DU1NS
dWxlTGlzdC5jcHAnLAogICAgICAgICAgICAgJ2Nzcy9DU1NSdWxlTGlzdC5oJywKKyAgICAgICAg
ICAgICdjc3MvQ1NTUnVsZVNldC5jcHAnLAorICAgICAgICAgICAgJ2Nzcy9DU1NSdWxlU2V0Lmgn
LAogICAgICAgICAgICAgJ2Nzcy9DU1NTZWdtZW50ZWRGb250RmFjZS5jcHAnLAogICAgICAgICAg
ICAgJ2Nzcy9DU1NTZWdtZW50ZWRGb250RmFjZS5oJywKICAgICAgICAgICAgICdjc3MvQ1NTU2Vs
ZWN0b3IuY3BwJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gNzIzMjgpCisrKyBXZWJDb3JlL1dlYkNvcmUucHJv
CSh3b3JraW5nIGNvcHkpCkBAIC02MzQsNiArNjM0LDcgQEAgU09VUkNFUyArPSBcCiAgICAgY3Nz
L0NTU1JlZmxlY3RWYWx1ZS5jcHAgXAogICAgIGNzcy9DU1NSdWxlLmNwcCBcCiAgICAgY3NzL0NT
U1J1bGVMaXN0LmNwcCBcCisgICAgY3NzL0NTU1J1bGVTZXQuY3BwIFwKICAgICBjc3MvQ1NTU2Vs
ZWN0b3IuY3BwIFwKICAgICBjc3MvQ1NTU2VsZWN0b3JMaXN0LmNwcCBcCiAgICAgY3NzL0NTU1Nl
Z21lbnRlZEZvbnRGYWNlLmNwcCBcCkBAIC0xNTUwLDYgKzE1NTEsNyBAQCBIRUFERVJTICs9IFwK
ICAgICBjc3MvQ1NTUmVmbGVjdFZhbHVlLmggXAogICAgIGNzcy9DU1NSdWxlLmggXAogICAgIGNz
cy9DU1NSdWxlTGlzdC5oIFwKKyAgICBjc3MvQ1NTUnVsZVNldC5oIFwKICAgICBjc3MvQ1NTU2Vn
bWVudGVkRm9udEZhY2UuaCBcCiAgICAgY3NzL0NTU1NlbGVjdG9yLmggXAogICAgIGNzcy9DU1NT
ZWxlY3Rvckxpc3QuaCBcCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNw
cm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJ
KHJldmlzaW9uIDcyMzI4KQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJv
agkod29ya2luZyBjb3B5KQpAQCAtMzQxOTQsNiArMzQxOTQsMTQgQEAKIAkJCQk+DQogCQkJPC9G
aWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cY3NzXENTU1J1bGVTZXQuY3Bw
Ig0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5c
Y3NzXENTU1J1bGVTZXQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlS
ZWxhdGl2ZVBhdGg9Ii4uXGNzc1xDU1NTZWdtZW50ZWRGb250RmFjZS5jcHAiDQogCQkJCT4NCiAJ
CQk8L0ZpbGU+DQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oJKHJldmlzaW9uIDcyMzI4KQorKysgV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTMwMDAsNiArMzAwMCw4IEBACiAJCTk3REQ0RDg2
MEZERjRENkUwMEVDRjlBNCAvKiBYU1NBdWRpdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3REQ0RDg0MEZERjRENkQwMEVDRjlBNCAvKiBYU1NB
dWRpdG9yLmNwcCAqLzsgfTsKIAkJOTdERDREODcwRkRGNEQ2RTAwRUNGOUE0IC8qIFhTU0F1ZGl0
b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3REQ0
RDg1MEZERjRENkUwMEVDRjlBNCAvKiBYU1NBdWRpdG9yLmggKi87IH07CiAJCTk3RUY3REZFMTA3
RTU1QjcwMEQ3QzQ5QyAvKiBTY3JpcHRDb250cm9sbGVyQmFzZS5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5N0VGN0RGRDEwN0U1NUI3MDBEN0M0OUMg
LyogU2NyaXB0Q29udHJvbGxlckJhc2UuY3BwICovOyB9OworCQk5QjE0M0JGMzEyOTYxNDQzMDBE
MTNEMUQgLyogQ1NTUnVsZVNldC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA5QjE0M0JGMTEyOTYxNDQzMDBEMTNEMUQgLyogQ1NTUnVsZVNldC5jcHAg
Ki87IH07CisJCTlCMTQzQkY0MTI5NjE0NDMwMEQxM0QxRCAvKiBDU1NSdWxlU2V0LmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5QjE0M0JGMjEyOTYxNDQz
MDBEMTNEMUQgLyogQ1NTUnVsZVNldC5oICovOyB9OwogCQk5QjQxNzA2NDEyNTY2MkIzMDA2QjI4
RkMgLyogQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5QjQxNzA2MjEyNTY2MkIzMDA2QjI4RkMgLyogQXBwbHlC
bG9ja0VsZW1lbnRDb21tYW5kLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKIAkJOUI0MTcwNjUxMjU2NjJCMzAwNkIyOEZDIC8qIEFwcGx5QmxvY2tFbGVt
ZW50Q29tbWFuZC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA5QjQxNzA2MzEyNTY2MkIzMDA2QjI4RkMgLyogQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5k
LmNwcCAqLzsgfTsKIAkJOUJBQjZDNkMxMjU1MDYzMTAwMTYyNkQ0IC8qIEVkaXRpbmdTdHlsZS5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOUJBQjZDNkEx
MjU1MDYzMTAwMTYyNkQ0IC8qIEVkaXRpbmdTdHlsZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC05MTA1LDYgKzkxMDcsOCBAQAogCQk5N0RENEQ4
NDBGREY0RDZEMDBFQ0Y5QTQgLyogWFNTQXVkaXRvci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBYU1NBdWRpdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJOTdERDREODUwRkRGNEQ2RTAwRUNGOUE0IC8qIFhTU0F1ZGl0b3IuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gWFNTQXVkaXRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQk5N0VGN0RGRDEwN0U1NUI3MDBEN0M0OUMgLyogU2NyaXB0Q29udHJvbGxlckJh
c2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU2NyaXB0Q29udHJv
bGxlckJhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk5QjE0M0JGMTEyOTYx
NDQzMDBEMTNEMUQgLyogQ1NTUnVsZVNldC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBDU1NSdWxlU2V0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
OUIxNDNCRjIxMjk2MTQ0MzAwRDEzRDFEIC8qIENTU1J1bGVTZXQuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gQ1NTUnVsZVNldC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk5QjQxNzA2MjEyNTY2MkIzMDA2QjI4RkMgLyogQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5k
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFwcGx5QmxvY2tFbGVtZW50Q29t
bWFuZC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5QjQxNzA2MzEyNTY2MkIzMDA2
QjI4RkMgLyogQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTlCQUI2QzZBMTI1NTA2MzEwMDE2MjZENCAvKiBFZGl0aW5n
U3R5bGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRWRpdGluZ1N0eWxlLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNzc1NSw2ICsxNzc1OSw4IEBACiAJCQkJ
QTgwRTZDREYwQTE5ODlDQTAwN0ZCOEM1IC8qIENTU1J1bGVMaXN0LmNwcCAqLywKIAkJCQlBODBF
NkNDODBBMTk4OUNBMDA3RkI4QzUgLyogQ1NTUnVsZUxpc3QuaCAqLywKIAkJCQlBOEQwNjUxQjBB
MjNDMUZFMDA1RTcyMDMgLyogQ1NTUnVsZUxpc3QuaWRsICovLAorCQkJCTlCMTQzQkYxMTI5NjE0
NDMwMEQxM0QxRCAvKiBDU1NSdWxlU2V0LmNwcCAqLywKKwkJCQk5QjE0M0JGMjEyOTYxNDQzMDBE
MTNEMUQgLyogQ1NTUnVsZVNldC5oICovLAogCQkJCTM3MUY1MUEwMEQyNjJGQTAwMEVDRTBENSAv
KiBDU1NTZWdtZW50ZWRGb250RmFjZS5jcHAgKi8sCiAJCQkJMzcxRjUxOUYwRDI2MkZBMDAwRUNF
MEQ1IC8qIENTU1NlZ21lbnRlZEZvbnRGYWNlLmggKi8sCiAJCQkJQTgwRTczNDgwQTE5OUM3NzAw
N0ZCOEM1IC8qIENTU1NlbGVjdG9yLmNwcCAqLywKQEAgLTE4Njk3LDYgKzE4NzAzLDcgQEAKIAkJ
CQlCQzVBMTJFMDBEQzA0MTQ4MDBDOUFGQUQgLyogQ1NTUmVmbGVjdFZhbHVlLmggaW4gSGVhZGVy
cyAqLywKIAkJCQlBODBFNkQwRDBBMTk4OUNBMDA3RkI4QzUgLyogQ1NTUnVsZS5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJQTgwRTZDRjIwQTE5ODlDQTAwN0ZCOEM1IC8qIENTU1J1bGVMaXN0LmggaW4g
SGVhZGVycyAqLywKKwkJCQk5QjE0M0JGNDEyOTYxNDQzMDBEMTNEMUQgLyogQ1NTUnVsZVNldC5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJMzcxRjUxQTEwRDI2MkZBMDAwRUNFMEQ1IC8qIENTU1NlZ21l
bnRlZEZvbnRGYWNlLmggaW4gSGVhZGVycyAqLywKIAkJCQlBODBFNzM1MjBBMTk5Qzc3MDA3RkI4
QzUgLyogQ1NTU2VsZWN0b3IuaCBpbiBIZWFkZXJzICovLAogCQkJCUU0QzE3ODlCMEVFNjkwMzgw
MDgyNEQ2OSAvKiBDU1NTZWxlY3Rvckxpc3QuaCBpbiBIZWFkZXJzICovLApAQCAtMjE4MzIsNiAr
MjE4MzksNyBAQAogCQkJCUJDNUExMkRGMERDMDQxNDgwMEM5QUZBRCAvKiBDU1NSZWZsZWN0VmFs
dWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTZEMDYwQTE5ODlDQTAwN0ZCOEM1IC8qIENT
U1J1bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTZEMDkwQTE5ODlDQTAwN0ZCOEM1IC8q
IENTU1J1bGVMaXN0LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTlCMTQzQkYzMTI5NjE0NDMwMEQx
M0QxRCAvKiBDU1NSdWxlU2V0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTM3MUY1MUEyMEQyNjJG
QTAwMEVDRTBENSAvKiBDU1NTZWdtZW50ZWRGb250RmFjZS5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQlBODBFNzM0RjBBMTk5Qzc3MDA3RkI4QzUgLyogQ1NTU2VsZWN0b3IuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJRTRDMTc4OUEwRUU2OTAzODAwODI0RDY5IC8qIENTU1NlbGVjdG9yTGlzdC5jcHAg
aW4gU291cmNlcyAqLywKSW5kZXg6IFdlYkNvcmUvY3NzL0NTU1J1bGVTZXQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvY3NzL0NTU1J1bGVTZXQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29y
ZS9jc3MvQ1NTUnVsZVNldC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTYyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAq
ICAgICAgICAgICAgICAgMTk5OSBXYWxkbyBCYXN0aWFuIChiYXN0aWFuQGtkZS5vcmcpCisgKiAg
ICAgICAgICAgICAgIDIwMDEgQW5kcmVhcyBTY2hsYXBiYWNoIChzY2hscGJjaEBpYW0udW5pYmUu
Y2gpCisgKiAgICAgICAgICAgICAgIDIwMDEtMjAwMyBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2Rl
Lm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAx
MCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgg
RGF2aWQgU21pdGggKGNhdGZpc2gubWFuQGdtYWlsLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQ1NTUnVsZVNldC5oIgorCisjaW5jbHVkZSAiQ1NTRm9udEZhY2VSdWxlLmgiCisj
aW5jbHVkZSAiQ1NTSW1wb3J0UnVsZS5oIgorI2luY2x1ZGUgIkNTU01lZGlhUnVsZS5oIgorI2lu
Y2x1ZGUgIkNTU1BhZ2VSdWxlLmgiCisjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKKyNpbmNsdWRl
ICJDU1NTdHlsZVJ1bGUuaCIKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCisjaW5jbHVk
ZSAiV2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hh
c2guaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDU1NSdWxlU2V0OjpDU1NSdWxlU2V0KCkK
KzogbV9ydWxlQ291bnQoMCkKKywgbV9wYWdlUnVsZUNvdW50KDApCit7Cit9CisKK0NTU1J1bGVT
ZXQ6On5DU1NSdWxlU2V0KCkKK3sgCisgICAgZGVsZXRlQWxsVmFsdWVzKG1faWRSdWxlcyk7Cisg
ICAgZGVsZXRlQWxsVmFsdWVzKG1fY2xhc3NSdWxlcyk7CisgICAgZGVsZXRlQWxsVmFsdWVzKG1f
dGFnUnVsZXMpOworfQorCisKK3ZvaWQgQ1NTUnVsZVNldDo6YWRkVG9SdWxlU2V0KEF0b21pY1N0
cmluZ0ltcGwqIGtleSwgQXRvbVJ1bGVNYXAmIG1hcCwgQ1NTU3R5bGVSdWxlKiBydWxlLCBDU1NT
ZWxlY3Rvciogc2VsKQoreworICAgIGlmICgha2V5KQorICAgICAgICByZXR1cm47CisKKyAgICBD
U1NSdWxlRGF0YUxpc3QqIHJ1bGVzID0gbWFwLmdldChrZXkpOworCisgICAgaWYgKCFydWxlcykg
eworICAgICAgICBydWxlcyA9IG5ldyBDU1NSdWxlRGF0YUxpc3QobV9ydWxlQ291bnQrKywgcnVs
ZSwgc2VsKTsKKyAgICAgICAgbWFwLnNldChrZXksIHJ1bGVzKTsKKyAgICB9IGVsc2UKKyAgICAg
ICAgcnVsZXMtPmFwcGVuZChtX3J1bGVDb3VudCsrLCBydWxlLCBzZWwpOworfQorCit2b2lkIENT
U1J1bGVTZXQ6OmFkZFJ1bGUoQ1NTU3R5bGVSdWxlKiBydWxlLCBDU1NTZWxlY3Rvciogc2VsKQor
eworICAgIGlmIChzZWwtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OklkKSB7CisgICAgICAgIGFk
ZFRvUnVsZVNldChzZWwtPm1fdmFsdWUuaW1wbCgpLCBtX2lkUnVsZXMsIHJ1bGUsIHNlbCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNlbC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rv
cjo6Q2xhc3MpIHsKKyAgICAgICAgYWRkVG9SdWxlU2V0KHNlbC0+bV92YWx1ZS5pbXBsKCksIG1f
Y2xhc3NSdWxlcywgcnVsZSwgc2VsKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gc2VsLT5tX3RhZy5sb2NhbE5hbWUoKTsKKyAg
ICBpZiAobG9jYWxOYW1lICE9IHN0YXJBdG9tKSB7CisgICAgICAgIGFkZFRvUnVsZVNldChsb2Nh
bE5hbWUuaW1wbCgpLCBtX3RhZ1J1bGVzLCBydWxlLCBzZWwpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgLy8gSnVzdCBwdXQgaXQgaW4gdGhlIHVuaXZlcnNhbCBydWxlIHNldC4KKyAg
ICBpZiAoIW1fdW5pdmVyc2FsUnVsZXMpCisgICAgICAgIG1fdW5pdmVyc2FsUnVsZXMgPSBhZG9w
dFB0cihuZXcgQ1NTUnVsZURhdGFMaXN0KG1fcnVsZUNvdW50KyssIHJ1bGUsIHNlbCkpOworICAg
IGVsc2UKKyAgICAgICAgbV91bml2ZXJzYWxSdWxlcy0+YXBwZW5kKG1fcnVsZUNvdW50KyssIHJ1
bGUsIHNlbCk7Cit9CisKK3ZvaWQgQ1NTUnVsZVNldDo6YWRkUGFnZVJ1bGUoQ1NTU3R5bGVSdWxl
KiBydWxlLCBDU1NTZWxlY3Rvciogc2VsKQoreworICAgIGlmICghbV9wYWdlUnVsZXMpCisgICAg
ICAgIG1fcGFnZVJ1bGVzID0gYWRvcHRQdHIobmV3IENTU1J1bGVEYXRhTGlzdChtX3BhZ2VSdWxl
Q291bnQrKywgcnVsZSwgc2VsKSk7CisgICAgZWxzZQorICAgICAgICBtX3BhZ2VSdWxlcy0+YXBw
ZW5kKG1fcGFnZVJ1bGVDb3VudCsrLCBydWxlLCBzZWwpOworfQorCit2b2lkIENTU1J1bGVTZXQ6
OmFkZFJ1bGVzRnJvbVNoZWV0KENTU1N0eWxlU2hlZXQqIHNoZWV0LCBjb25zdCBNZWRpYVF1ZXJ5
RXZhbHVhdG9yJiBtZWRpdW0sIENTU1N0eWxlU2VsZWN0b3IqIHN0eWxlU2VsZWN0b3IpCit7Cisg
ICAgaWYgKCFzaGVldCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTm8gbWVkaWEgaW1wbGll
cyAiYWxsIiwgYnV0IGlmIGEgbWVkaWEgbGlzdCBleGlzdHMgaXQgbXVzdAorICAgIC8vIGNvbnRh
aW4gb3VyIGN1cnJlbnQgbWVkaXVtCisgICAgaWYgKHNoZWV0LT5tZWRpYSgpICYmICFtZWRpdW0u
ZXZhbChzaGVldC0+bWVkaWEoKSwgc3R5bGVTZWxlY3RvcikpCisgICAgICAgIHJldHVybjsgLy8g
dGhlIHN0eWxlIHNoZWV0IGRvZXNuJ3QgYXBwbHkKKworICAgIGludCBsZW4gPSBzaGVldC0+bGVu
Z3RoKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFN0
eWxlQmFzZSogaXRlbSA9IHNoZWV0LT5pdGVtKGkpOworICAgICAgICBpZiAoaXRlbS0+aXNTdHls
ZVJ1bGUoKSkKKyAgICAgICAgICAgIGFkZFN0eWxlUnVsZShzdGF0aWNfY2FzdDxDU1NTdHlsZVJ1
bGUqPihpdGVtKSk7CisgICAgICAgIGVsc2UgaWYgKGl0ZW0tPmlzSW1wb3J0UnVsZSgpKSB7Cisg
ICAgICAgICAgICBDU1NJbXBvcnRSdWxlKiBpbXBvcnQgPSBzdGF0aWNfY2FzdDxDU1NJbXBvcnRS
dWxlKj4oaXRlbSk7CisgICAgICAgICAgICBpZiAoIWltcG9ydC0+bWVkaWEoKSB8fCBtZWRpdW0u
ZXZhbChpbXBvcnQtPm1lZGlhKCksIHN0eWxlU2VsZWN0b3IpKQorICAgICAgICAgICAgICAgIGFk
ZFJ1bGVzRnJvbVNoZWV0KGltcG9ydC0+c3R5bGVTaGVldCgpLCBtZWRpdW0sIHN0eWxlU2VsZWN0
b3IpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzTWVkaWFSdWxlKCkpIHsKKyAgICAgICAg
ICAgIENTU01lZGlhUnVsZSogciA9IHN0YXRpY19jYXN0PENTU01lZGlhUnVsZSo+KGl0ZW0pOwor
ICAgICAgICAgICAgQ1NTUnVsZUxpc3QqIHJ1bGVzID0gci0+Y3NzUnVsZXMoKTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgaWYgKCghci0+bWVkaWEoKSB8fCBtZWRpdW0uZXZhbChyLT5tZWRp
YSgpLCBzdHlsZVNlbGVjdG9yKSkgJiYgcnVsZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBUcmF2
ZXJzZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgQG1lZGlhIHJ1bGUuCisgICAgICAgICAgICAgICAg
Zm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHJ1bGVzLT5sZW5ndGgoKTsgaisrKSB7CisgICAgICAg
ICAgICAgICAgICAgIENTU1J1bGUqIGNoaWxkSXRlbSA9IHJ1bGVzLT5pdGVtKGopOworICAgICAg
ICAgICAgICAgICAgICBpZiAoY2hpbGRJdGVtLT5pc1N0eWxlUnVsZSgpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBJdCBpcyBhIFN0eWxlUnVsZSwgc28gYXBwZW5kIGl0IHRvIG91ciBs
aXN0CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdHlsZVJ1bGUoc3RhdGljX2Nhc3Q8Q1NT
U3R5bGVSdWxlKj4oY2hpbGRJdGVtKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAo
Y2hpbGRJdGVtLT5pc0ZvbnRGYWNlUnVsZSgpICYmIHN0eWxlU2VsZWN0b3IpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGZvbnQgZmFjZSB0byBvdXIgc2V0LgorICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgQ1NTRm9udEZhY2VSdWxlKiBmb250RmFjZVJ1bGUgPSBz
dGF0aWNfY2FzdDxDU1NGb250RmFjZVJ1bGUqPihjaGlsZEl0ZW0pOworICAgICAgICAgICAgICAg
ICAgICAgICAgc3R5bGVTZWxlY3Rvci0+Zm9udFNlbGVjdG9yKCktPmFkZEZvbnRGYWNlUnVsZShm
b250RmFjZVJ1bGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkSXRlbS0+
aXNLZXlmcmFtZXNSdWxlKCkgJiYgc3R5bGVTZWxlY3RvcikgeworICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gQWRkIHRoaXMga2V5ZnJhbWUgcnVsZSB0byBvdXIgc2V0LgorICAgICAgICAgICAg
ICAgICAgICAgICAgc3R5bGVTZWxlY3Rvci0+YWRkS2V5ZnJhbWVTdHlsZShzdGF0aWNfY2FzdDxX
ZWJLaXRDU1NLZXlmcmFtZXNSdWxlKj4oY2hpbGRJdGVtKSk7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAo
aXRlbS0+aXNGb250RmFjZVJ1bGUoKSAmJiBzdHlsZVNlbGVjdG9yKSB7CisgICAgICAgICAgICAv
LyBBZGQgdGhpcyBmb250IGZhY2UgdG8gb3VyIHNldC4KKyAgICAgICAgICAgIGNvbnN0IENTU0Zv
bnRGYWNlUnVsZSogZm9udEZhY2VSdWxlID0gc3RhdGljX2Nhc3Q8Q1NTRm9udEZhY2VSdWxlKj4o
aXRlbSk7CisgICAgICAgICAgICBzdHlsZVNlbGVjdG9yLT5mb250U2VsZWN0b3IoKS0+YWRkRm9u
dEZhY2VSdWxlKGZvbnRGYWNlUnVsZSk7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS0+aXNLZXlm
cmFtZXNSdWxlKCkpCisgICAgICAgICAgICBzdHlsZVNlbGVjdG9yLT5hZGRLZXlmcmFtZVN0eWxl
KHN0YXRpY19jYXN0PFdlYktpdENTU0tleWZyYW1lc1J1bGUqPihpdGVtKSk7CisgICAgfQorfQor
Cit2b2lkIENTU1J1bGVTZXQ6OmFkZFN0eWxlUnVsZShDU1NTdHlsZVJ1bGUqIHJ1bGUpCit7Cisg
ICAgaWYgKHJ1bGUtPmlzUGFnZVJ1bGUoKSkgeworICAgICAgICBDU1NQYWdlUnVsZSogcGFnZVJ1
bGUgPSBzdGF0aWNfY2FzdDxDU1NQYWdlUnVsZSo+KHJ1bGUpOworICAgICAgICBhZGRQYWdlUnVs
ZShwYWdlUnVsZSwgcGFnZVJ1bGUtPnNlbGVjdG9yTGlzdCgpLmZpcnN0KCkpOworICAgIH0gZWxz
ZSB7CisgICAgICAgIGZvciAoQ1NTU2VsZWN0b3IqIHMgPSBydWxlLT5zZWxlY3Rvckxpc3QoKS5m
aXJzdCgpOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKQorICAgICAgICAgICAgYWRk
UnVsZShydWxlLCBzKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6
IFdlYkNvcmUvY3NzL0NTU1J1bGVTZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Nzcy9DU1NS
dWxlU2V0LmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2Nzcy9DU1NSdWxlU2V0LmgJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBM
YXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgICAgICAxOTk5IFdhbGRvIEJh
c3RpYW4gKGJhc3RpYW5Aa2RlLm9yZykKKyAqICAgICAgICAgICAgICAgMjAwMSBBbmRyZWFzIFNj
aGxhcGJhY2ggKHNjaGxwYmNoQGlhbS51bmliZS5jaCkKKyAqICAgICAgICAgICAgICAgMjAwMS0y
MDAzIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAy
LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBTbWl0aCAoY2F0ZmlzaC5tYW5AZ21h
aWwuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICovCisKKyNpZm5kZWYgQ1NTUnVsZVNldF9oCisjZGVmaW5lIENTU1J1bGVTZXRfaAorCisjaW5j
bHVkZSAiTGlua0hhc2guaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCisjaW5j
bHVkZSAiUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUg
PHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNl
IFdURiB7CisKK2NsYXNzIEF0b21pY1N0cmluZ0ltcGw7CisKK30gLy8gLy8gbmFtZXNwYWNlIFdU
RgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENTU1N0eWxlUnVsZTsKK2NsYXNzIENT
U1J1bGVEYXRhTGlzdDsKK2NsYXNzIENTU1NlbGVjdG9yOworCitjbGFzcyBDU1NSdWxlU2V0IDog
cHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBDU1NSdWxlU2V0KCk7CisgICAgfkNT
U1J1bGVTZXQoKTsKKworICAgIHR5cGVkZWYgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQ1NT
UnVsZURhdGFMaXN0Kj4gQXRvbVJ1bGVNYXA7CisKKyAgICB2b2lkIGFkZFJ1bGVzRnJvbVNoZWV0
KENTU1N0eWxlU2hlZXQqLCBjb25zdCBNZWRpYVF1ZXJ5RXZhbHVhdG9yJiwgQ1NTU3R5bGVTZWxl
Y3RvciogPSAwKTsKKworICAgIHZvaWQgYWRkU3R5bGVSdWxlKENTU1N0eWxlUnVsZSopOworICAg
IHZvaWQgYWRkUnVsZShDU1NTdHlsZVJ1bGUqLCBDU1NTZWxlY3RvciopOworICAgIHZvaWQgYWRk
UGFnZVJ1bGUoQ1NTU3R5bGVSdWxlKiwgQ1NTU2VsZWN0b3IqKTsKKyAgICB2b2lkIGFkZFRvUnVs
ZVNldChBdG9taWNTdHJpbmdJbXBsKiBrZXksIEF0b21SdWxlTWFwJiwgQ1NTU3R5bGVSdWxlKiwg
Q1NTU2VsZWN0b3IqKTsKKworICAgIENTU1J1bGVEYXRhTGlzdCogZ2V0SURSdWxlcyhBdG9taWNT
dHJpbmdJbXBsKiBrZXkpIHsgcmV0dXJuIG1faWRSdWxlcy5nZXQoa2V5KTsgfQorICAgIENTU1J1
bGVEYXRhTGlzdCogZ2V0Q2xhc3NSdWxlcyhBdG9taWNTdHJpbmdJbXBsKiBrZXkpIHsgcmV0dXJu
IG1fY2xhc3NSdWxlcy5nZXQoa2V5KTsgfQorICAgIENTU1J1bGVEYXRhTGlzdCogZ2V0VGFnUnVs
ZXMoQXRvbWljU3RyaW5nSW1wbCoga2V5KSB7IHJldHVybiBtX3RhZ1J1bGVzLmdldChrZXkpOyB9
CisgICAgQ1NTUnVsZURhdGFMaXN0KiBnZXRVbml2ZXJzYWxSdWxlcygpIHsgcmV0dXJuIG1fdW5p
dmVyc2FsUnVsZXMuZ2V0KCk7IH0KKyAgICBDU1NSdWxlRGF0YUxpc3QqIGdldFBhZ2VSdWxlcygp
IHsgcmV0dXJuIG1fcGFnZVJ1bGVzLmdldCgpOyB9CisKK3B1YmxpYzoKKyAgICBBdG9tUnVsZU1h
cCBtX2lkUnVsZXM7CisgICAgQXRvbVJ1bGVNYXAgbV9jbGFzc1J1bGVzOworICAgIEF0b21SdWxl
TWFwIG1fdGFnUnVsZXM7CisgICAgT3duUHRyPENTU1J1bGVEYXRhTGlzdD4gbV91bml2ZXJzYWxS
dWxlczsKKyAgICBPd25QdHI8Q1NTUnVsZURhdGFMaXN0PiBtX3BhZ2VSdWxlczsKKyAgICB1bnNp
Z25lZCBtX3J1bGVDb3VudDsKKyAgICB1bnNpZ25lZCBtX3BhZ2VSdWxlQ291bnQ7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDU1NSdWxlU2V0X2gKSW5kZXg6IFdl
YkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvY3Nz
L0NTU1N0eWxlU2VsZWN0b3IuY3BwCShyZXZpc2lvbiA3MjMyOCkKKysrIFdlYkNvcmUvY3NzL0NT
U1N0eWxlU2VsZWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCw3IEBACiAjaW5j
bHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgogI2luY2x1ZGUgIkNTU1JlZmxlY3RWYWx1ZS5oIgog
I2luY2x1ZGUgIkNTU1J1bGVMaXN0LmgiCisjaW5jbHVkZSAiQ1NTUnVsZVNldC5oIgogI2luY2x1
ZGUgIkNTU1NlbGVjdG9yLmgiCiAjaW5jbHVkZSAiQ1NTU2VsZWN0b3JMaXN0LmgiCiAjaW5jbHVk
ZSAiQ1NTU3R5bGVSdWxlLmgiCkBAIC0zNDksMzcgKzM1MCw2IEBAIGlmIChpZCA9PSBwcm9wSUQp
IHsgXAogICAgIHJldHVybjsgXAogfQogCi1jbGFzcyBDU1NSdWxlU2V0IDogcHVibGljIE5vbmNv
cHlhYmxlIHsKLXB1YmxpYzoKLSAgICBDU1NSdWxlU2V0KCk7Ci0gICAgfkNTU1J1bGVTZXQoKTsK
LSAgICAKLSAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIENTU1J1bGVEYXRh
TGlzdCo+IEF0b21SdWxlTWFwOwotICAgIAotICAgIHZvaWQgYWRkUnVsZXNGcm9tU2hlZXQoQ1NT
U3R5bGVTaGVldCosIGNvbnN0IE1lZGlhUXVlcnlFdmFsdWF0b3ImLCBDU1NTdHlsZVNlbGVjdG9y
KiA9IDApOwotCi0gICAgdm9pZCBhZGRTdHlsZVJ1bGUoQ1NTU3R5bGVSdWxlKiBpdGVtKTsKLSAg
ICB2b2lkIGFkZFJ1bGUoQ1NTU3R5bGVSdWxlKiBydWxlLCBDU1NTZWxlY3Rvciogc2VsKTsKLSAg
ICB2b2lkIGFkZFBhZ2VSdWxlKENTU1N0eWxlUnVsZSogcnVsZSwgQ1NTU2VsZWN0b3IqIHNlbCk7
Ci0gICAgdm9pZCBhZGRUb1J1bGVTZXQoQXRvbWljU3RyaW5nSW1wbCoga2V5LCBBdG9tUnVsZU1h
cCYgbWFwLAotICAgICAgICAgICAgICAgICAgICAgIENTU1N0eWxlUnVsZSogcnVsZSwgQ1NTU2Vs
ZWN0b3IqIHNlbCk7Ci0gICAgCi0gICAgQ1NTUnVsZURhdGFMaXN0KiBnZXRJRFJ1bGVzKEF0b21p
Y1N0cmluZ0ltcGwqIGtleSkgeyByZXR1cm4gbV9pZFJ1bGVzLmdldChrZXkpOyB9Ci0gICAgQ1NT
UnVsZURhdGFMaXN0KiBnZXRDbGFzc1J1bGVzKEF0b21pY1N0cmluZ0ltcGwqIGtleSkgeyByZXR1
cm4gbV9jbGFzc1J1bGVzLmdldChrZXkpOyB9Ci0gICAgQ1NTUnVsZURhdGFMaXN0KiBnZXRUYWdS
dWxlcyhBdG9taWNTdHJpbmdJbXBsKiBrZXkpIHsgcmV0dXJuIG1fdGFnUnVsZXMuZ2V0KGtleSk7
IH0KLSAgICBDU1NSdWxlRGF0YUxpc3QqIGdldFVuaXZlcnNhbFJ1bGVzKCkgeyByZXR1cm4gbV91
bml2ZXJzYWxSdWxlcy5nZXQoKTsgfQotICAgIENTU1J1bGVEYXRhTGlzdCogZ2V0UGFnZVJ1bGVz
KCkgeyByZXR1cm4gbV9wYWdlUnVsZXMuZ2V0KCk7IH0KLSAgICAKLXB1YmxpYzoKLSAgICBBdG9t
UnVsZU1hcCBtX2lkUnVsZXM7Ci0gICAgQXRvbVJ1bGVNYXAgbV9jbGFzc1J1bGVzOwotICAgIEF0
b21SdWxlTWFwIG1fdGFnUnVsZXM7Ci0gICAgT3duUHRyPENTU1J1bGVEYXRhTGlzdD4gbV91bml2
ZXJzYWxSdWxlczsKLSAgICBPd25QdHI8Q1NTUnVsZURhdGFMaXN0PiBtX3BhZ2VSdWxlczsKLSAg
ICB1bnNpZ25lZCBtX3J1bGVDb3VudDsKLSAgICB1bnNpZ25lZCBtX3BhZ2VSdWxlQ291bnQ7Ci19
OwotCiBzdGF0aWMgQ1NTUnVsZVNldCogZGVmYXVsdFN0eWxlOwogc3RhdGljIENTU1J1bGVTZXQq
IGRlZmF1bHRRdWlya3NTdHlsZTsKIHN0YXRpYyBDU1NSdWxlU2V0KiBkZWZhdWx0UHJpbnRTdHls
ZTsKQEAgLTI3MTgsMTI4ICsyNjg4LDYgQEAgYm9vbCBDU1NTdHlsZVNlbGVjdG9yOjpTZWxlY3Rv
ckNoZWNrZXI6OgogICAgIH0KIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ1NTUnVsZVNldDo6Q1NTUnVs
ZVNldCgpCi0gICAgOiBtX3J1bGVDb3VudCgwKQotICAgICwgbV9wYWdlUnVsZUNvdW50KDApCi17
Ci19Ci0KLUNTU1J1bGVTZXQ6On5DU1NSdWxlU2V0KCkKLXsgCi0gICAgZGVsZXRlQWxsVmFsdWVz
KG1faWRSdWxlcyk7Ci0gICAgZGVsZXRlQWxsVmFsdWVzKG1fY2xhc3NSdWxlcyk7Ci0gICAgZGVs
ZXRlQWxsVmFsdWVzKG1fdGFnUnVsZXMpOwotfQotCi0KLXZvaWQgQ1NTUnVsZVNldDo6YWRkVG9S
dWxlU2V0KEF0b21pY1N0cmluZ0ltcGwqIGtleSwgQXRvbVJ1bGVNYXAmIG1hcCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIENTU1N0eWxlUnVsZSogcnVsZSwgQ1NTU2VsZWN0b3IqIHNl
bCkKLXsKLSAgICBpZiAoIWtleSkgcmV0dXJuOwotICAgIENTU1J1bGVEYXRhTGlzdCogcnVsZXMg
PSBtYXAuZ2V0KGtleSk7Ci0gICAgaWYgKCFydWxlcykgewotICAgICAgICBydWxlcyA9IG5ldyBD
U1NSdWxlRGF0YUxpc3QobV9ydWxlQ291bnQrKywgcnVsZSwgc2VsKTsKLSAgICAgICAgbWFwLnNl
dChrZXksIHJ1bGVzKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcnVsZXMtPmFwcGVuZChtX3J1bGVD
b3VudCsrLCBydWxlLCBzZWwpOwotfQotCi12b2lkIENTU1J1bGVTZXQ6OmFkZFJ1bGUoQ1NTU3R5
bGVSdWxlKiBydWxlLCBDU1NTZWxlY3Rvciogc2VsKQotewotICAgIGlmIChzZWwtPm1fbWF0Y2gg
PT0gQ1NTU2VsZWN0b3I6OklkKSB7Ci0gICAgICAgIGFkZFRvUnVsZVNldChzZWwtPm1fdmFsdWUu
aW1wbCgpLCBtX2lkUnVsZXMsIHJ1bGUsIHNlbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgaWYgKHNlbC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6Q2xhc3MpIHsKLSAgICAgICAgYWRk
VG9SdWxlU2V0KHNlbC0+bV92YWx1ZS5pbXBsKCksIG1fY2xhc3NSdWxlcywgcnVsZSwgc2VsKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBs
b2NhbE5hbWUgPSBzZWwtPm1fdGFnLmxvY2FsTmFtZSgpOwotICAgIGlmIChsb2NhbE5hbWUgIT0g
c3RhckF0b20pIHsKLSAgICAgICAgYWRkVG9SdWxlU2V0KGxvY2FsTmFtZS5pbXBsKCksIG1fdGFn
UnVsZXMsIHJ1bGUsIHNlbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgLy8g
SnVzdCBwdXQgaXQgaW4gdGhlIHVuaXZlcnNhbCBydWxlIHNldC4KLSAgICBpZiAoIW1fdW5pdmVy
c2FsUnVsZXMpCi0gICAgICAgIG1fdW5pdmVyc2FsUnVsZXMgPSBhZG9wdFB0cihuZXcgQ1NTUnVs
ZURhdGFMaXN0KG1fcnVsZUNvdW50KyssIHJ1bGUsIHNlbCkpOwotICAgIGVsc2UKLSAgICAgICAg
bV91bml2ZXJzYWxSdWxlcy0+YXBwZW5kKG1fcnVsZUNvdW50KyssIHJ1bGUsIHNlbCk7Ci19Ci0K
LXZvaWQgQ1NTUnVsZVNldDo6YWRkUGFnZVJ1bGUoQ1NTU3R5bGVSdWxlKiBydWxlLCBDU1NTZWxl
Y3Rvciogc2VsKQotewotICAgIGlmICghbV9wYWdlUnVsZXMpCi0gICAgICAgIG1fcGFnZVJ1bGVz
ID0gYWRvcHRQdHIobmV3IENTU1J1bGVEYXRhTGlzdChtX3BhZ2VSdWxlQ291bnQrKywgcnVsZSwg
c2VsKSk7Ci0gICAgZWxzZQotICAgICAgICBtX3BhZ2VSdWxlcy0+YXBwZW5kKG1fcGFnZVJ1bGVD
b3VudCsrLCBydWxlLCBzZWwpOwotfQotCi12b2lkIENTU1J1bGVTZXQ6OmFkZFJ1bGVzRnJvbVNo
ZWV0KENTU1N0eWxlU2hlZXQqIHNoZWV0LCBjb25zdCBNZWRpYVF1ZXJ5RXZhbHVhdG9yJiBtZWRp
dW0sIENTU1N0eWxlU2VsZWN0b3IqIHN0eWxlU2VsZWN0b3IpCi17Ci0gICAgaWYgKCFzaGVldCkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTm8gbWVkaWEgaW1wbGllcyAiYWxsIiwgYnV0IGlm
IGEgbWVkaWEgbGlzdCBleGlzdHMgaXQgbXVzdAotICAgIC8vIGNvbnRhaW4gb3VyIGN1cnJlbnQg
bWVkaXVtCi0gICAgaWYgKHNoZWV0LT5tZWRpYSgpICYmICFtZWRpdW0uZXZhbChzaGVldC0+bWVk
aWEoKSwgc3R5bGVTZWxlY3RvcikpCi0gICAgICAgIHJldHVybjsgLy8gdGhlIHN0eWxlIHNoZWV0
IGRvZXNuJ3QgYXBwbHkKLQotICAgIGludCBsZW4gPSBzaGVldC0+bGVuZ3RoKCk7Ci0KLSAgICBm
b3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIFN0eWxlQmFzZSogaXRlbSA9
IHNoZWV0LT5pdGVtKGkpOwotICAgICAgICBpZiAoaXRlbS0+aXNTdHlsZVJ1bGUoKSkKLSAgICAg
ICAgICAgIGFkZFN0eWxlUnVsZShzdGF0aWNfY2FzdDxDU1NTdHlsZVJ1bGUqPihpdGVtKSk7Ci0g
ICAgICAgIGVsc2UgaWYgKGl0ZW0tPmlzSW1wb3J0UnVsZSgpKSB7Ci0gICAgICAgICAgICBDU1NJ
bXBvcnRSdWxlKiBpbXBvcnQgPSBzdGF0aWNfY2FzdDxDU1NJbXBvcnRSdWxlKj4oaXRlbSk7Ci0g
ICAgICAgICAgICBpZiAoIWltcG9ydC0+bWVkaWEoKSB8fCBtZWRpdW0uZXZhbChpbXBvcnQtPm1l
ZGlhKCksIHN0eWxlU2VsZWN0b3IpKQotICAgICAgICAgICAgICAgIGFkZFJ1bGVzRnJvbVNoZWV0
KGltcG9ydC0+c3R5bGVTaGVldCgpLCBtZWRpdW0sIHN0eWxlU2VsZWN0b3IpOwotICAgICAgICB9
Ci0gICAgICAgIGVsc2UgaWYgKGl0ZW0tPmlzTWVkaWFSdWxlKCkpIHsKLSAgICAgICAgICAgIENT
U01lZGlhUnVsZSogciA9IHN0YXRpY19jYXN0PENTU01lZGlhUnVsZSo+KGl0ZW0pOwotICAgICAg
ICAgICAgQ1NTUnVsZUxpc3QqIHJ1bGVzID0gci0+Y3NzUnVsZXMoKTsKLQotICAgICAgICAgICAg
aWYgKCghci0+bWVkaWEoKSB8fCBtZWRpdW0uZXZhbChyLT5tZWRpYSgpLCBzdHlsZVNlbGVjdG9y
KSkgJiYgcnVsZXMpIHsKLSAgICAgICAgICAgICAgICAvLyBUcmF2ZXJzZSBjaGlsZCBlbGVtZW50
cyBvZiB0aGUgQG1lZGlhIHJ1bGUuCi0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0g
MDsgaiA8IHJ1bGVzLT5sZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENTU1J1
bGUgKmNoaWxkSXRlbSA9IHJ1bGVzLT5pdGVtKGopOwotICAgICAgICAgICAgICAgICAgICBpZiAo
Y2hpbGRJdGVtLT5pc1N0eWxlUnVsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJ
dCBpcyBhIFN0eWxlUnVsZSwgc28gYXBwZW5kIGl0IHRvIG91ciBsaXN0Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBhZGRTdHlsZVJ1bGUoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVSdWxlKj4oY2hpbGRJ
dGVtKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRJdGVtLT5pc0ZvbnRG
YWNlUnVsZSgpICYmIHN0eWxlU2VsZWN0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8v
IEFkZCB0aGlzIGZvbnQgZmFjZSB0byBvdXIgc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgQ1NTRm9udEZhY2VSdWxlKiBmb250RmFjZVJ1bGUgPSBzdGF0aWNfY2FzdDxDU1NGb250
RmFjZVJ1bGUqPihjaGlsZEl0ZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVTZWxl
Y3Rvci0+Zm9udFNlbGVjdG9yKCktPmFkZEZvbnRGYWNlUnVsZShmb250RmFjZVJ1bGUpOwotICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkSXRlbS0+aXNLZXlmcmFtZXNSdWxlKCkg
JiYgc3R5bGVTZWxlY3RvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMg
a2V5ZnJhbWUgcnVsZSB0byBvdXIgc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVT
ZWxlY3Rvci0+YWRkS2V5ZnJhbWVTdHlsZShzdGF0aWNfY2FzdDxXZWJLaXRDU1NLZXlmcmFtZXNS
dWxlKj4oY2hpbGRJdGVtKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICB9ICAgLy8gZm9yIHJ1bGVzCi0gICAgICAgICAgICB9ICAgLy8gaWYgcnVsZXMKLSAgICAgICAg
fSBlbHNlIGlmIChpdGVtLT5pc0ZvbnRGYWNlUnVsZSgpICYmIHN0eWxlU2VsZWN0b3IpIHsKLSAg
ICAgICAgICAgIC8vIEFkZCB0aGlzIGZvbnQgZmFjZSB0byBvdXIgc2V0LgotICAgICAgICAgICAg
Y29uc3QgQ1NTRm9udEZhY2VSdWxlKiBmb250RmFjZVJ1bGUgPSBzdGF0aWNfY2FzdDxDU1NGb250
RmFjZVJ1bGUqPihpdGVtKTsKLSAgICAgICAgICAgIHN0eWxlU2VsZWN0b3ItPmZvbnRTZWxlY3Rv
cigpLT5hZGRGb250RmFjZVJ1bGUoZm9udEZhY2VSdWxlKTsKLSAgICAgICAgfSBlbHNlIGlmIChp
dGVtLT5pc0tleWZyYW1lc1J1bGUoKSkKLSAgICAgICAgICAgIHN0eWxlU2VsZWN0b3ItPmFkZEtl
eWZyYW1lU3R5bGUoc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZSo+KGl0ZW0pKTsK
LSAgICB9Ci19Ci0KLXZvaWQgQ1NTUnVsZVNldDo6YWRkU3R5bGVSdWxlKENTU1N0eWxlUnVsZSog
cnVsZSkKLXsKLSAgICBpZiAocnVsZS0+aXNQYWdlUnVsZSgpKSB7Ci0gICAgICAgIENTU1BhZ2VS
dWxlKiBwYWdlUnVsZSA9IHN0YXRpY19jYXN0PENTU1BhZ2VSdWxlKj4ocnVsZSk7Ci0gICAgICAg
IGFkZFBhZ2VSdWxlKHBhZ2VSdWxlLCBwYWdlUnVsZS0+c2VsZWN0b3JMaXN0KCkuZmlyc3QoKSk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChDU1NTZWxlY3RvciogcyA9IHJ1bGUtPnNlbGVj
dG9yTGlzdCgpLmZpcnN0KCk7IHM7IHMgPSBDU1NTZWxlY3Rvckxpc3Q6Om5leHQocykpCi0gICAg
ICAgICAgICBhZGRSdWxlKHJ1bGUsIHMpOwotICAgIH0KLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQogLy8gdGhpcyBpcyBtb3N0bHkgYm9yaW5nIHN0dWZmIG9uIGhvdyB0byBh
cHBseSBhIGNlcnRhaW4gcnVsZSB0byB0aGUgcmVuZGVyc3R5bGUuLi4KIAo=
</data>
<flag name="review"
          id="64912"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>